//------------------------------------------------------------------------------ // 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) { } } }); } }