//------------------------------------------------------------------------------
// 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.diagramming.base.util;

import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.epf.diagramming.base.Constants;
import org.eclipse.epf.library.ILibraryManager;
import org.eclipse.epf.library.LibraryService;
import org.eclipse.epf.uma.Activity;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.UmaFactory;
import org.eclipse.epf.uma.util.UmaUtil;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.uml2.uml.NamedElement;

/**
 * @author Shashidhar kannoori
 *
 */
public final class UmaUmlUtil {

	/**
	 * 
	 */
	public UmaUmlUtil() {
		// TODO Auto-generated constructor stub
	}
	public static String getUmaGuidFromUmlElement(NamedElement ne){
		EAnnotation eAnnotation = ne.getEAnnotation(Constants.UMA_SOURCE);
		if(eAnnotation != null){
			String guid = (String) eAnnotation.getDetails().get(
					Constants.UMA_ELEMENT_GUID);
			return guid;
		}
		return null;
	}
	
	public static void createEAnnotationForUml(NamedElement element, String guid){
		if(element.getEAnnotation(Constants.UMA_SOURCE) == null){
			EAnnotation eAnnotation = EcoreFactory.eINSTANCE.createEAnnotation();
			eAnnotation.setSource(Constants.UMA_SOURCE);
			eAnnotation.getDetails().put(Constants.UMA_ELEMENT_GUID, guid);
			element.getEAnnotations().add(eAnnotation);
		}
	}
	
	public static void updateEAnnotationForUml(NamedElement element, String guid){
		EAnnotation eAnnotation = element.getEAnnotation(Constants.UMA_SOURCE);
		if(eAnnotation == null){
			createEAnnotationForUml(element, guid);
		}else{
			eAnnotation.getDetails().put(Constants.UMA_ELEMENT_GUID, guid);
		}
	}
	
	public static MethodElement getUmaElement(NamedElement umlElement){

		String umaGuid = getUmaGuidFromUmlElement(umlElement);
		if(umaGuid != null && umaGuid != ""){
			ILibraryManager manager = LibraryService.getInstance().getCurrentLibraryManager();
			if(manager != null){
				MethodElement element = manager.getMethodElement(umaGuid);
				return element;
			}
		}
		return null;
	}
	
	public static MethodElement getUmaElement(View view){
		
		NamedElement umlElement = (NamedElement)view.getElement();
		String umaGuid = getUmaGuidFromUmlElement(umlElement);
		if(umaGuid != null && umaGuid != ""){
			ILibraryManager manager = LibraryService.getInstance().getCurrentLibraryManager();
			if(manager != null){
				MethodElement element = manager.getMethodElement(umaGuid);
				return element;
			}
		}
		return null;
	}
	
	public static void createUmaObject(View containerView, View view) {
		// TODO Auto-generated method stub
		EAnnotation eAnnotation = containerView
				.getEAnnotation(Constants.UMA_SOURCE);
		String guid = (String) eAnnotation.getDetails().get(
				Constants.UMA_ELEMENT_GUID);
		ILibraryManager manager = LibraryService.getInstance().getCurrentLibraryManager();
		if (manager != null) {
			MethodElement element = manager.getMethodElement(guid);
			if(element instanceof Activity){
				Activity subactivity = UmaFactory.eINSTANCE.createActivity();
				((Activity)element).getBreakdownElements().add(subactivity);
				String subId = UmaUtil.generateGUID();
				subactivity.setGuid(subId);
				EAnnotation eAnnotation2 = EcoreFactory.eINSTANCE
				.createEAnnotation();
				eAnnotation2.setSource(Constants.UMA_SOURCE);
				eAnnotation2.getDetails().put(Constants.UMA_ELEMENT_GUID, subId);
				view.getEAnnotations().add(eAnnotation2);
			}
		}
	}
}
