//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.edit.validation;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.eclipse.epf.uma.ContentElement;
import org.eclipse.epf.uma.DescribableElement;
import org.eclipse.epf.uma.MethodElement;


/**
 * This class is a helper class for method element unique name handling
 * 
 * @author Weiping Lu
 * @since 1.2
 */
public class UniqueNameHandler {
	private Set<String> names = new HashSet<String>();
	
	/**
	 * Empty constructor
	 */
	public UniqueNameHandler() {
	}
	
	/**
	 * @param elements
	 */
	public void registerNames(Collection<MethodElement> elements) {
		if (elements == null) {
			return;
		}
		for (Iterator<MethodElement> it = elements.iterator(); it.hasNext();) {
			MethodElement element = it.next();
			register(element.getName());
		}
	}
	
	/**
	 * @param elements
	 */
	public void registerPresentationNames(Collection<DescribableElement> elements) {
		if (elements == null) {
			return;
		}
		for (Iterator<DescribableElement> it = elements.iterator(); it.hasNext();) {
			DescribableElement element = it.next();
			register(element.getPresentationName());
		}
	}
	
	/**
	 * @param element
	 */
	public void register(String name) {
		names.add(name);		
	}
	
	/**
	 * @param element
	 */
	public String getUniqueName(String oldName) {		
		String name = oldName;
		int i = 0;
		while(names.contains(name)) {
			i++;
			name = oldName + "_" + i;		//$NON-NLS-1$ 
		}			
		return name;
	}
	
	
	
	
}
