blob: a7e54869a7a30023bfbbc7563c90780f29b03d19 [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.migration.diagram.ad.services;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.transaction.Transaction;
import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
import org.eclipse.epf.diagram.core.services.DiagramManager;
import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
import org.eclipse.epf.diagram.model.ActivityDiagram;
import org.eclipse.epf.diagram.model.ModelFactory;
import org.eclipse.epf.diagram.model.Node;
import org.eclipse.epf.diagram.model.TypedNode;
import org.eclipse.epf.diagram.model.WorkProductDependencyDiagram;
import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
import org.eclipse.epf.diagram.model.util.GraphicalDataManager;
import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin;
import org.eclipse.epf.library.configuration.ProcessAuthoringConfigurator;
import org.eclipse.epf.library.edit.util.DiagramOptions;
import org.eclipse.epf.library.edit.util.IDiagramManager;
import org.eclipse.epf.library.edit.util.Suppression;
import org.eclipse.epf.library.services.SafeUpdateController;
import org.eclipse.epf.migration.diagram.DiagramMigrationPlugin;
import org.eclipse.epf.migration.diagram.MigrationExportException;
import org.eclipse.epf.migration.diagram.ad.map.IMapConstants;
import org.eclipse.epf.migration.diagram.ad.map.MapFactory;
import org.eclipse.epf.migration.diagram.ad.map.MapNode;
import org.eclipse.epf.migration.diagram.ad.map.MapUtil;
import org.eclipse.epf.migration.diagram.addwpd.map.ConnectionFactory;
import org.eclipse.epf.migration.diagram.util.MigrationUtil;
import org.eclipse.epf.uma.Activity;
import org.eclipse.epf.uma.Process;
import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
import org.eclipse.gmf.runtime.notation.Bounds;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.NotationFactory;
import org.eclipse.uml2.uml.UMLFactory;
import org.eclipse.uml2.uml.UMLPackage;
/**
* @author Shashidhar Kannoori
* @author Shilpa Toraskar
* @author Weiping Lu
* @since 1.2
*/
public class WorkflowExportService {
public static final String DEFAULT_XMI_EXTENSION = ".xmi"; //$NON-NLS-1$
protected boolean debug;
public static WorkflowExportService singleton = null;
public static WorkflowExportService getInstance() {
if (singleton == null) {
singleton = new WorkflowExportService();
}
return singleton;
}
/**
* Export activity diagram data
* @param proc
* @param activity
* @param fileName
* @param targetDir
* @return
* @throws MigrationExportException
*/
public boolean export(Process proc, Activity activity, String fileName,
File targetDir) throws MigrationExportException {
debug = DiagramMigrationPlugin.getDefault().isDebugging();
// construct the export target xml file path
Path exportPath = new Path(targetDir.getAbsolutePath());
boolean endWithXmiExt = fileName.toLowerCase().endsWith(
DEFAULT_XMI_EXTENSION);
String exportXMIPath = (exportPath.append(endWithXmiExt ? fileName
: (fileName + DEFAULT_XMI_EXTENSION))).toOSString();
URI uri = URI.createFileURI(exportXMIPath);
/* // Create resource set
ResourceSet resourceSet = new ResourceSetImpl();
//XMLResourceImpl xmires = new Workflow2XMIResourceImpl(uri);
//Resource xmires = new GMFResourceFactory().createResource(uri);
Resource xmires = DiagramManager.getInstance(proc)
.getEditingDomain().getResourceSet().createResource(uri);
resourceSet.getResources().add(xmires);*/
DiagramManager mgr = DiagramManager.getInstance(proc, this);
try {
Transaction tx = mgr.getEditingDomain().startTransaction(false,
Collections.EMPTY_MAP);
Resource xmires = mgr.getResource();
tx.commit();
// Create temp map
IMapConstants.graphUMLNodeMap.clear();
if (proc == activity) {
Map activities = MigrationUtil.getActivities(proc, true);
for (Iterator it = activities.values().iterator(); it.hasNext();) {
Activity act = (Activity) it.next();
addAD(xmires, proc, act, mgr);
addADD(xmires, proc, act, mgr);
addWPD(xmires, proc, act, mgr);
}
} else {
addAD(xmires, proc, activity, mgr);
addADD(xmires, proc, activity, mgr);
addWPD(xmires, proc, activity, mgr);
}
/* tx.commit();*/
List contents = xmires.getContents();
if (contents != null && ! contents.isEmpty()) {
xmires.save(null);
}
} catch (Exception e) {
e.printStackTrace();
throw new MigrationExportException(e);
} finally {
if(mgr != null) {
mgr.removeConsumer(this);
}
}
return true;
}
private void addDataToResource_WPD(Resource xmiResource, Process proc,
Activity umaActivity) {
org.eclipse.epf.uma.Diagram d = GraphicalDataManager.getInstance().getUMADiagram(umaActivity, IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM, false);
if (d != null) {
if (debug) {
System.out.println("WPDD->"+proc.getName()+"::"+umaActivity.getName()); //$NON-NLS-1$ //$NON-NLS-2$
}
WorkProductDependencyDiagram wpdDiagram = ModelFactory.eINSTANCE
.createWorkProductDependencyDiagram();
addDataToResource_ADDorWPD(proc, umaActivity, xmiResource,
wpdDiagram);
}
}
private void addDataToResource_ADD(Resource xmiResource,
Process proc, Activity umaActivity) {
org.eclipse.epf.uma.Diagram d = GraphicalDataManager.getInstance()
.getUMADiagram(umaActivity,
IDiagramManager.ACTIVITY_DETAIL_DIAGRAM, false);
if (d != null) {
if (debug) {
System.out.println("ADD->"+proc.getName()+":"+umaActivity.getName()); //$NON-NLS-1$ //$NON-NLS-2$
}
ActivityDetailDiagram addDiagram = ModelFactory.eINSTANCE
.createActivityDetailDiagram();
addDataToResource_ADDorWPD(proc, umaActivity, xmiResource,
addDiagram);
}
}
private void addDataToResource_ADDorWPD(Process proc, Activity umaActivity,
Resource xmiResource, org.eclipse.epf.diagram.model.Diagram addOrWpdDiagram) {
Suppression sup = new Suppression(proc);
addOrWpdDiagram.setSuppression(sup);
String kind = null;
PreferencesHint prefHint = null;
if (addOrWpdDiagram instanceof ActivityDetailDiagram) {
addOrWpdDiagram.setFilter(ProcessAuthoringConfigurator.INSTANCE);
kind = DiagramManager.ADD_kind;
prefHint = ActivityDetailDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;
} else if (addOrWpdDiagram instanceof WorkProductDependencyDiagram) {
kind = DiagramManager.WPD_kind;
prefHint = WPDDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;
} else {
throw new UnsupportedOperationException();
}
addOrWpdDiagram.setObject(umaActivity);
addOrWpdDiagram.setLinkedElement(umaActivity);
// set suppression/published info for ADD/ WPDD
org.eclipse.epf.uma.Diagram umaDiagram = addOrWpdDiagram.getUMADiagram();
if (umaDiagram != null) {
if (umaDiagram.getSuppressed().booleanValue()) {
if (addOrWpdDiagram instanceof ActivityDetailDiagram){
DiagramOptions.setPublishADD(umaActivity, false);
}
else if (addOrWpdDiagram instanceof WorkProductDependencyDiagram) {
DiagramOptions.setPublishWPDD(umaActivity, false);
}
}
}
// get autoLayout flag if diagram is ADD
if (addOrWpdDiagram instanceof ActivityDetailDiagram) {
boolean value = GraphicalDataHelper
.isAutoLayout((ActivityDetailDiagram) addOrWpdDiagram);
((ActivityDetailDiagram) addOrWpdDiagram).setAutoLayout(value);
}
// Create diagram
Diagram diagram = ViewService.createDiagram(addOrWpdDiagram, kind,
prefHint);
diagram.setElement(addOrWpdDiagram);
diagram.setName(umaActivity.getName());
xmiResource.getContents().add(addOrWpdDiagram);
xmiResource.getContents().add(diagram);
List nodes = new ArrayList();
HashMap map = new HashMap();
List diagramNodes = addOrWpdDiagram.getNodes();
for (Iterator iterator = diagramNodes.iterator(); iterator.hasNext();) {
Object obj = iterator.next();
if (obj instanceof Node ) {
Node node = (Node) obj;
if ((obj instanceof TypedNode) &&
(((TypedNode)obj).getType() == TypedNode.FREE_TEXT)) {
// do special handing for free text node
org.eclipse.gmf.runtime.notation.Node text = MapUtil.createText(diagram, (Node) obj);
diagram.insertChild(text);
}
else {
// Create Notation nnode
org.eclipse.gmf.runtime.notation.Node notationNode = MapUtil.createNotationNode_ADDorWPD(diagram, node);
if (notationNode == null) {
continue;
}
diagram.insertChild(notationNode);
Bounds bounds = NotationFactory.eINSTANCE.createBounds();
bounds.setHeight(node.getHeight());
bounds.setWidth(node.getWidth());
bounds.setX(node.getLocation().x);
bounds.setY(node.getLocation().y);
notationNode.setLayoutConstraint(bounds);
notationNode.setElement(node);
nodes.add(node);
map.put(node, notationNode);
}
}
}
ConnectionFactory factory = new ConnectionFactory(diagram, map, kind);
// Create Outgoing connections
for (Iterator iterator = nodes.iterator(); iterator.hasNext();) {
Object obj = iterator.next();
if (obj instanceof Node) {
factory.outgoingConnections((Node) obj);
}
}
// Create Outgoing connections
for (Iterator iterator = nodes.iterator(); iterator.hasNext();) {
Object obj = iterator.next();
if (obj instanceof Node) {
factory.incomingConnections((Node) obj);
}
}
}
/**
*
* @param resource
* @param list
* @param process
*/
private void addDataToResource_AD( Resource xmiResource, Process proc,
Activity umaActivity) {
org.eclipse.epf.uma.Diagram d = GraphicalDataManager.getInstance()
.getUMADiagram(umaActivity, IDiagramManager.ACTIVITY_DIAGRAM,
false);
if (d == null) {
return;
}
if (debug) {
System.out.println("AD->"+proc.getName()+":"+umaActivity.getName()); //$NON-NLS-1$ //$NON-NLS-2$
}
// Create top level UML activity
EObject activity = UMLFactory.eINSTANCE.create(UMLPackage.eINSTANCE
.getActivity());
if (activity instanceof org.eclipse.uml2.uml.Activity) {
((org.eclipse.uml2.uml.Activity)activity).setName(umaActivity.getName());
}
if (activity instanceof EModelElement) {
//BridgeHelper.addEAnnotation((EModelElement) activity, ((MethodElement) umaActivity));
// UmaUmlUtil.createEAnnotationForUml((NamedElement) activity,
// umaActivity.getGuid());
BridgeHelper.associate((EModelElement) activity, umaActivity);
}
// Create diagram
Diagram diagram = ViewService.createDiagram(activity, DiagramManager.AD_kind,
ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
diagram.setElement(activity);
if (activity instanceof org.eclipse.uml2.uml.Activity) {
diagram.setName(umaActivity.getName());
}
Suppression suppression = new Suppression(proc);
ActivityDiagram ad = ModelFactory.eINSTANCE.createActivityDiagram();
ad.setSuppression(suppression);
ad.setObject(umaActivity);
if (ad.isNew()) {
return;
}
// set suppression/published info for AD
org.eclipse.epf.uma.Diagram umaDiagram = ad.getUMADiagram();
if (umaDiagram != null) {
if (umaDiagram.getSuppressed().booleanValue()) {
DiagramOptions.setPublishAD(umaActivity, false);
}
}
// return (List) ad.getNodes();
// List diagramNodes = getActivityDiagramData(suppression, umaActivity);
List diagramNodes = ad.getNodes();
if (diagramNodes == null) {
return;
}
xmiResource.getContents().add(activity);
xmiResource.getContents().add(diagram);
List mapNodes = new ArrayList();
HashMap mapNodesMap = new HashMap();
// Create UML and notation nodes
for (Iterator iterator = diagramNodes.iterator(); iterator.hasNext();) {
Object obj = iterator.next();
if (obj instanceof Node ) {
if ((obj instanceof TypedNode) &&
(((TypedNode)obj).getType() == TypedNode.FREE_TEXT)) {
// do special handing for free text node
org.eclipse.gmf.runtime.notation.Node text = MapUtil.createText(diagram, (Node) obj);
}
else {
MapNode mapNode = MapFactory.getInstance().create((Node) obj);
mapNode.setActivity((org.eclipse.uml2.uml.Activity)activity);
mapNode.setDiagram(diagram);
mapNode.updateResource();
mapNodes.add(mapNode);
mapNodesMap.put(mapNode, (Node) obj);
}
}
}
// Create Outgoing connections
for (Iterator iterator = mapNodes.iterator(); iterator.hasNext();) {
Object obj = iterator.next();
if (obj instanceof MapNode) {
((MapNode) obj).outgoingConnections((Node) mapNodesMap.get((MapNode) obj));
}
}
// Create incoming connections
for (Iterator iterator = mapNodes.iterator(); iterator.hasNext();) {
Object obj = iterator.next();
if (obj instanceof MapNode) {
((MapNode) obj).incomingConnections((Node) mapNodesMap.get((MapNode) obj));
}
}
}
/**
* Return activity diagram data
* @param sup
* @param activity
* @return
*/
private List getActivityDiagramData(Suppression sup, Activity activity) {
ActivityDiagram ad = ModelFactory.eINSTANCE.createActivityDiagram();
ad.setSuppression(sup);
ad.setObject(activity);
if (ad.isNew()) {
return null;
}
return (List) ad.getNodes();
}
private void addAD(final Resource resource, final Process proc,
final Activity umaActivity, final DiagramManager mgr) {
addToResource(resource, proc, umaActivity, mgr, 0);
}
private void addADD(final Resource resource, final Process proc,
final Activity umaActivity, final DiagramManager mgr) {
addToResource(resource, proc, umaActivity, mgr, 1);
}
private void addWPD(final Resource resource, final Process proc,
final Activity umaActivity, final DiagramManager mgr) {
addToResource(resource, proc, umaActivity, mgr, 2);
}
//type: 0=AD, 1=ADD, 2=WPD
private void addToResource(final Resource resource,
final Process proc, final Activity umaActivity,
final DiagramManager mgr, final int type) {
SafeUpdateController.syncExec(new Runnable() {
public void run() {
try {
Transaction tx = mgr.getEditingDomain().startTransaction(
false, Collections.EMPTY_MAP);
if (type == 0) {
addDataToResource_AD(resource, proc, umaActivity);
} else if (type == 1) {
addDataToResource_ADD(resource, proc, umaActivity);
} else if (type == 2) {
addDataToResource_WPD(resource, proc, umaActivity);
} else {
assert (false);
}
tx.commit();
} catch (Exception e) {
}
}
});
}
}