//------------------------------------------------------------------------------
// 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 org.eclipse.epf.uma.DescribableElement;
import org.eclipse.epf.uma.MethodElement;


/**
 * This class is a helper class for unique name and presentation name handling
 * 
 * @author Weiping Lu
 * @since 1.2
 */
public class UniqueNamePNameHandler {
	private UniqueNameHandler nameHandler = new UniqueNameHandler();
	private UniqueNameHandler pnameHandler = new UniqueNameHandler();
	
	/**
	 * Empty constructor
	 */
	public UniqueNamePNameHandler(Collection<MethodElement> nameElements, Collection<DescribableElement> pnameElements) {
		nameHandler.registerNames(nameElements);
		pnameHandler.registerPresentationNames(pnameElements);		
	}
	
	/**
	 * @param element
	 */
	public void ensureUnique(DescribableElement element) {
		String name = nameHandler.getUniqueName(element.getName());
		if (! name.equals(element.getName())) {
			element.setName(name);
			nameHandler.register(name);
		}
		
		String pname = pnameHandler.getUniqueName(element.getPresentationName());
		if (! pname.equals(element.getPresentationName())) {
			element.setPresentationName(pname);
			pnameHandler.register(name);
		}
	}
	
}
