//------------------------------------------------------------------------------ // 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.diagram.core.services; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.ecore.EModelElement; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.edit.command.CopyCommand; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.transaction.Transaction; import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain; import org.eclipse.epf.common.CommonPlugin; import org.eclipse.epf.diagram.core.DiagramCorePlugin; import org.eclipse.epf.diagram.core.DiagramCoreResources; import org.eclipse.epf.diagram.core.bridge.BridgeHelper; import org.eclipse.epf.diagram.core.bridge.DiagramAdapter; import org.eclipse.epf.diagram.model.util.TxUtil; import org.eclipse.epf.library.edit.util.IDiagramManager; import org.eclipse.epf.library.edit.util.TngUtil; import org.eclipse.epf.persistence.FileManager; import org.eclipse.epf.services.Services; import org.eclipse.epf.services.ILibraryPersister.FailSafeMethodLibraryPersister; import org.eclipse.epf.uma.Activity; import org.eclipse.epf.uma.MethodElement; import org.eclipse.epf.uma.Process; import org.eclipse.epf.uma.VariabilityElement; import org.eclipse.epf.uma.util.UmaUtil; import org.eclipse.gmf.runtime.diagram.core.DiagramEditingDomainFactory; import org.eclipse.gmf.runtime.notation.Diagram; import org.eclipse.gmf.runtime.notation.Node; import org.eclipse.gmf.runtime.notation.View; /** * @author Shashidhar Kannoori * @author Phong Nguyen Le * @since 1.2 */ public class DiagramHelper { public static final int[] DIAGRAM_TYPES = { IDiagramManager.ACTIVITY_DIAGRAM, IDiagramManager.ACTIVITY_DETAIL_DIAGRAM, IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM }; public static int getDiagramType(Diagram diagram){ String typeStr = diagram.getType(); if(typeStr.equals(DiagramManager.AD_kind)){ return IDiagramManager.ACTIVITY_DIAGRAM; } if(typeStr.equals(DiagramManager.ADD_kind)){ return IDiagramManager.ACTIVITY_DETAIL_DIAGRAM; } if(typeStr.equals(DiagramManager.WPD_kind)){ return IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM; } return -1; } public static Node findNode(Diagram diagram, Object object) { if (object == null) return null; for (Iterator iter = diagram.getChildren().iterator(); iter.hasNext();) { View view = (View) iter.next(); if (view instanceof Node && view.getElement() != null) { Object e = null; if (object instanceof MethodElement && view.getElement() instanceof EModelElement) { EModelElement modelElement = (EModelElement) view.getElement(); e = BridgeHelper.getMethodElement(modelElement); if(e == null) { // diagram is not open yet, try to resolve the element from URI stored in the node's annotation // Resource resource = ((MethodElement)object).eResource(); if(resource.getResourceSet() != null) { e = BridgeHelper.getMethodElementFromAnnotation(modelElement, resource.getResourceSet()); } } } else { e = view.getElement(); } if (object.equals(e)) { return (Node) view; } } } return null; } public static Node findNodeInModelDiagram(Diagram diagram, MethodElement e){ for (Iterator iter = diagram.getChildren().iterator(); iter.hasNext();) { View view = (View) iter.next(); if(view instanceof Node){ Object ex = null; EObject model = view.getElement(); if(model instanceof org.eclipse.epf.diagram.model.Node){ ex = ((org.eclipse.epf.diagram.model.Node)model).getLinkedElement(); if(ex != null && ex == e){ return (Node)view; } } } } return null; } /** * Deletes the diagram and saves immediately. * @param diagram * @throws Exception */ public static void deleteDiagram(final Diagram diagram, boolean save) throws Exception { if (diagram == null) return; boolean fileExist = true; File file = null; Object linkedObject = null; Process process = null; if (diagram.getElement() instanceof org.eclipse.uml2.uml.Activity) { DiagramAdapter adapter = BridgeHelper.getDiagramAdapter(diagram .getElement()); if (adapter != null) { linkedObject = adapter.getWrapper(); if (linkedObject == null) { linkedObject = adapter.getElement(); } } } else { org.eclipse.epf.diagram.model.Diagram diagramModel = (org.eclipse.epf.diagram.model.Diagram) diagram .getElement(); linkedObject = diagramModel.getLinkedElement(); } if (linkedObject != null) { process = TngUtil.getOwningProcess(linkedObject); String filePath = DiagramManager.getDiagramFilePath(process); file = new File(filePath); if (!file.exists()) fileExist = false; } final Resource resource = diagram.eResource(); if (file == null && resource != null) { file = new File(FileManager.toFileString(resource .getURI())); if (!file.exists()) fileExist = false; } if (resource != null) { TxUtil.runInTransaction(diagram, new Runnable() { public void run() { resource.getContents().remove(diagram.getElement()); resource.getContents().remove(diagram); UmaUtil.removeAllAdapters(diagram.getElement()); UmaUtil.removeAllAdapters(diagram); } }); if (!fileExist) return; if (save) { // if (resource.getContents().isEmpty()) { // if (file != null) { // if (process != null // && DiagramManager.hasDiagramManager(process)) { // Object consumer = new Object(); // DiagramManager mgr = DiagramManager.getInstance( // process, consumer); // mgr.dispose(); // } // Services.getFileManager() // .delete(file.getAbsolutePath()); // } // } // else { FailSafeMethodLibraryPersister persister = Services .getLibraryPersister(Services.XMI_PERSISTENCE_TYPE) .getFailSafePersister(); try { persister.save(resource); persister.commit(); } catch (Exception e) { CommonPlugin.getDefault().getLogger().logError(e); persister.rollback(); throw new CoreException(new Status(IStatus.ERROR, DiagramCorePlugin.PLUGIN_ID, 1, e .getLocalizedMessage(), null)); } // } } } } /** * Convenient method to get editing domain * @return */ public static InternalTransactionalEditingDomain getEditingDomain(){ return (InternalTransactionalEditingDomain) DiagramEditingDomainFactory.getInstance() .createEditingDomain(); } public static InternalTransactionalEditingDomain getEditingDomain(Diagram diagram){ if(diagram == null) return getEditingDomain(); Resource resource = diagram.eResource(); if(resource == null) return getEditingDomain(); return (InternalTransactionalEditingDomain)DiagramEditingDomainFactory.getInstance().getEditingDomain(resource.getResourceSet()); } /** * Gets all available diagrams of the specified activity. * * @param act * @return */ public static Collection<Diagram> getDiagrams(Activity act, DiagramManager mgr) { try { ArrayList<Diagram> diagrams = new ArrayList<Diagram>(); for (int i = 0; i < DIAGRAM_TYPES.length; i++) { List<Diagram> list = mgr.getDiagrams(act, DIAGRAM_TYPES[i]); if (!list.isEmpty()) { diagrams.addAll(list); } } return diagrams; } catch (Exception e) { DiagramCorePlugin.getDefault().getLogger().logError(e); return Collections.emptyList(); } } public static String getDiagramTypeString(Diagram diagram){ String typeStr = diagram.getType(); if(typeStr.equals(DiagramManager.AD_kind)){ return DiagramCoreResources.ActivityDiagram_kind; } if(typeStr.equals(DiagramManager.ADD_kind)){ return DiagramCoreResources.ActivityDetail_Diagram_kind; } if(typeStr.equals(DiagramManager.WPD_kind)){ return DiagramCoreResources.WorkProductDependency_Diagram_kind; } return ""; //$NON-NLS-1$ } public static Diagram copyDiagram(EditingDomain domain, Diagram diagram) { ArrayList<Object> list = new ArrayList<Object>(); list.add(diagram.getElement()); list.add(diagram); Command cmd = CopyCommand.create(domain, list); cmd.execute(); for (Iterator<?> iter = cmd.getResult().iterator(); iter.hasNext();) { Object element = (Object) iter.next(); if(element instanceof Diagram) { Diagram copy = (Diagram) element; return copy; } } return null; } /** * Reassociates activity nodes in the base diagram copy with corresponding * locally contributors or replacers if there is any. * * @param activity * @param copyOfBaseDiagram */ public static void reassociate(Activity activity, Diagram copyOfBaseDiagram) { for (Iterator iter = activity.getBreakdownElements().iterator(); iter .hasNext();) { Object element = iter.next(); if (element instanceof Activity) { VariabilityElement baseElement = ((Activity) element) .getVariabilityBasedOnElement(); if (baseElement != null) { Node node = DiagramHelper.findNode(copyOfBaseDiagram, baseElement); if (node != null) { EObject umlObj = node.getElement(); BridgeHelper.addEAnnotation((EModelElement) umlObj, (MethodElement) element); } } } } } }