/*******************************************************************************
 * 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
 *******************************************************************************/

package org.eclipse.wst.dtd.core.internal.emf.util;

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

import org.eclipse.wst.dtd.core.internal.emf.DTDAttribute;
import org.eclipse.wst.dtd.core.internal.emf.DTDElement;
import org.eclipse.wst.dtd.core.internal.emf.DTDEntity;
import org.eclipse.wst.dtd.core.internal.emf.DTDFile;
import org.eclipse.wst.dtd.core.internal.emf.DTDNotation;



public class DTDUniqueNameHelper {
	public DTDUniqueNameHelper() {

	}

	static public String getUniqueElementName(DTDFile dtdFile) {
		List elements = dtdFile.listDTDElement();
		return getUniqueName(elements, "NewElement");
	}

	static public String getUniqueEntityName(DTDFile dtdFile) {
		List entities = dtdFile.listDTDEntity();
		return getUniqueName(entities, "NewEntity");
	}

	static public String getUniqueNotationName(DTDFile dtdFile) {
		List notations = dtdFile.listDTDNotation();
		return getUniqueName(notations, "NewNotation");
	}

	static public String getUniqueAttributeName(DTDElement element) {
		List attrs = element.getDTDAttribute();
		return getUniqueName(attrs, "NewAttribute");
	}

	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";
	}

	static public String getName(Object obj) {
		if (obj instanceof DTDElement) {
			return ((DTDElement) obj).getName();
		}
		else if (obj instanceof DTDEntity) {
			return ((DTDEntity) obj).getName();
		}
		else if (obj instanceof DTDNotation) {
			return ((DTDNotation) obj).getName();
		}
		else if (obj instanceof DTDAttribute) {
			return ((DTDAttribute) obj).getName();
		}
		return "";
	}


	/**
	 * @generated
	 */
	protected static String getUniqueElementNameGen(DTDFile dtdFile) {

		List elements = dtdFile.listDTDElement();
		return getUniqueName(elements, "NewElement");
	}

	/**
	 * @generated
	 */
	protected static String getUniqueEntityNameGen(DTDFile dtdFile) {

		List entities = dtdFile.listDTDEntity();
		return getUniqueName(entities, "NewEntity");
	}

	/**
	 * @generated
	 */
	protected static String getUniqueNotationNameGen(DTDFile dtdFile) {

		List notations = dtdFile.listDTDNotation();
		return getUniqueName(notations, "NewNotation");
	}

	/**
	 * @generated
	 */
	protected static String getUniqueAttributeNameGen(DTDElement element) {

		List attrs = element.getDTDAttribute();
		return getUniqueName(attrs, "NewAttribute");
	}

	/**
	 * @generated
	 */
	protected static String getUniqueNameGen(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";
	}

	/**
	 * @generated
	 */
	protected static String getNameGen(Object obj) {

		if (obj instanceof DTDElement) {
			return ((DTDElement) obj).getName();
		}
		else if (obj instanceof DTDEntity) {
			return ((DTDEntity) obj).getName();
		}
		else if (obj instanceof DTDNotation) {
			return ((DTDNotation) obj).getName();
		}
		else if (obj instanceof DTDAttribute) {
			return ((DTDAttribute) obj).getName();
		}
		return "";
	}
}// DTDUniqueNameHelper
