blob: 23b516f886caf49c8237dbef8f3c96eae7e54e22 [file] [log] [blame]
//------------------------------------------------------------------------------
// 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);
}
}
}
}
}
}