/*******************************************************************************
 * Copyright (c) 2001, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/
package org.eclipse.wst.dtd.core.util;

import java.util.Iterator;
import java.util.List;

import org.eclipse.wst.dtd.core.Attribute;
import org.eclipse.wst.dtd.core.CMBasicNode;
import org.eclipse.wst.dtd.core.DTDFile;
import org.eclipse.wst.dtd.core.Element;
import org.eclipse.wst.dtd.core.Entity;
import org.eclipse.wst.dtd.core.Notation;


public class DTDUniqueNameHelper {

	static public String getName(Object obj) {
		if (obj instanceof Element) {
			return ((Element) obj).getName();
		} else if (obj instanceof Entity) {
			return ((Entity) obj).getName();
		} else if (obj instanceof Notation) {
			return ((Notation) obj).getName();
		} else if (obj instanceof Attribute) {
			return ((Attribute) obj).getName();
		} else if (obj instanceof CMBasicNode) // Model Group Content
		{
			return ((CMBasicNode) obj).getName();
		}
		return ""; //$NON-NLS-1$
	}

	static public String getUniqueAttributeName(Element element) {
		List attrs = element.getElementAttributes();
		return getUniqueName(attrs, "NewAttribute"); //$NON-NLS-1$
	}

	static public String getUniqueElementName(DTDFile dtdFile) {
		List elements = dtdFile.getElementsAndParameterEntityReferences().getNodes();
		return getUniqueName(elements, "NewElement"); //$NON-NLS-1$
	}

	static public String getUniqueEntityName(DTDFile dtdFile) {
		List entities = dtdFile.getEntities().getNodes();
		return getUniqueName(entities, "NewEntity"); //$NON-NLS-1$
	}

	static public String getUniqueName(List objs, String token) {
		int counter = 1;

		boolean uniqueName = false;
		while (!uniqueName) {
			String newName = token + new Integer(counter++);
			uniqueName = true;
			Iterator iter = objs.iterator();
			while (iter.hasNext()) {
				Object obj = iter.next();
				String objName = getName(obj);
				if (objName.equals(newName)) {
					uniqueName = false;
					break;
				}
			}
			if (uniqueName) {
				return newName;
			}
		}
		// we shouldn't get here
		return "No Name found"; //$NON-NLS-1$
	}

	static public String getUniqueNotationName(DTDFile dtdFile) {
		List notations = dtdFile.getNotations().getNodes();
		return getUniqueName(notations, "NewNotation"); //$NON-NLS-1$
	}

	public DTDUniqueNameHelper() {
	}

} // DTDUniqueNameHelper
