/***************************************************************************************************
 * Copyright (c) 2003, 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.common.emf.utilities;

import java.util.Map;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.xmi.XMLResource;

public class IDUtil {

	/**
	 * This method is invoked to assign a unique ID to the object. The object must be contained in a
	 * resource.
	 */
	public static void assignID(EObject object) {
		Resource aResource = object.eResource();
		if (aResource instanceof XMLResource)
			assignID(object, (XMLResource) aResource);

	}

	public static String getOrAssignID(EObject object) {
		Resource aResource = object.eResource();
		if (aResource instanceof XMLResource)
			return getOrAssignID(object, (XMLResource) aResource);
		return null;
	}

	public static String getOrAssignID(EObject object, XMLResource aResource) {
		String id = aResource.getID(object);
		if (id == null)
			return assignID(object, aResource);
		return id;
	}

	public static String assignID(EObject object, XMLResource aResource) {
		String name = getBaseIDForAssignment(object);
		if (name == null)
			return null;
		String id = ensureUniqueID(aResource, name);
		aResource.setID(object, id);
		return id;
	}

	protected static String ensureUniqueID(XMLResource aResource, String baseIDName) {
		baseIDName += "_"; //$NON-NLS-1$
		//Change to use the current time instead of incremental numbers to help
		//support team development.
		long currentTime = System.currentTimeMillis();
		String id = baseIDName + currentTime;
		Map idMap = aResource.getIDToEObjectMap();
		while (idMap.get(id) != null) {
			++currentTime;
			id = baseIDName + currentTime;
		}
		return id;
	}

	protected static String getBaseIDForAssignment(EObject object) {
		EClass metaO = object.eClass();
		return metaO.getName();
	}

}