the EclipseCON 2014 BPMN2 generation plugin
diff --git a/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/.classpath b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/.classpath
new file mode 100755
index 0000000..8a8f166
--- /dev/null
+++ b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/.project b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/.project
new file mode 100755
index 0000000..34c92a1
--- /dev/null
+++ b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.soa.mangrove.out.bpmn2</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/.settings/.gitignore b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/.settings/.gitignore
new file mode 100644
index 0000000..93f5714
--- /dev/null
+++ b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/.settings/.gitignore
@@ -0,0 +1 @@
+/.svn/
diff --git a/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/.settings/org.eclipse.jdt.core.prefs
new file mode 100755
index 0000000..f287d53
--- /dev/null
+++ b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/META-INF/MANIFEST.MF b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/META-INF/MANIFEST.MF
new file mode 100755
index 0000000..8463e1a
--- /dev/null
+++ b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Mangrove to BPMN2 Transformation
+Bundle-SymbolicName: org.eclipse.soa.mangrove.out.bpmn2; singleton:=true
+Bundle-Version: 0.0.1.qualifier
+Bundle-Activator: org.eclipse.soa.mangrove.out.bpmn2.Activator
+Bundle-Vendor: Xerox Research
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.soa.mangrove;bundle-version="1.0.0",
+ org.eclipse.soa.mangrove.branches.common;bundle-version="0.5.0",
+ org.eclipse.bpmn2;bundle-version="0.7.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.core.resources
diff --git a/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/build.properties b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/build.properties
new file mode 100755
index 0000000..6f20375
--- /dev/null
+++ b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml
diff --git a/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/plugin.xml b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/plugin.xml
new file mode 100755
index 0000000..a5cc408
--- /dev/null
+++ b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/plugin.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.ui.popupMenus">
+ <objectContribution
+ id="org.eclipse.soa.mangrove.out.bpmn2.contribution"
+ nameFilter="*.mangrove"
+ objectClass="org.eclipse.core.resources.IFile">
+ <action
+ label="Generate BPMN2"
+ class="org.eclipse.soa.mangrove.out.bpmn2.popup.actions.GenerateBPMN2Action"
+ menubarPath="org.eclipse.soa.mangrove.branches.common.mainMenu/mainGroup"
+ enablesFor="1"
+ id="org.eclipse.soa.mangrove.out.bpmn2.generateAction">
+ </action>
+ </objectContribution>
+ </extension>
+</plugin>
diff --git a/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/src/org/eclipse/soa/mangrove/out/bpmn2/Activator.java b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/src/org/eclipse/soa/mangrove/out/bpmn2/Activator.java
new file mode 100755
index 0000000..5f5767a
--- /dev/null
+++ b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/src/org/eclipse/soa/mangrove/out/bpmn2/Activator.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) {2013} Xerox Corp.
+ * 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: Adrian Mos (Xerox Corp.) - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.soa.mangrove.out.bpmn2;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.soa.mangrove.out.bpmn2"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/src/org/eclipse/soa/mangrove/out/bpmn2/popup/actions/GenerateBPMN2Action.java b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/src/org/eclipse/soa/mangrove/out/bpmn2/popup/actions/GenerateBPMN2Action.java
new file mode 100755
index 0000000..63b2e96
--- /dev/null
+++ b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/src/org/eclipse/soa/mangrove/out/bpmn2/popup/actions/GenerateBPMN2Action.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) {2013} Xerox Corp.
+ * 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: Adrian Mos (Xerox Corp.) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.soa.mangrove.out.bpmn2.popup.actions;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.soa.mangrove.out.bpmn2.transform.Mangrove2BPMN2Transformer;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IActionDelegate;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+public class GenerateBPMN2Action implements IObjectActionDelegate {
+
+ private IFile selectedIMFile = null;
+ private Mangrove2BPMN2Transformer bpmn2Transformer;
+ private Shell shell;
+
+ public GenerateBPMN2Action() {
+ super();
+ shell = new Shell();
+ }
+
+ /**
+ * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
+ */
+ public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+ }
+
+ /**
+ * @see IActionDelegate#run(IAction)
+ */
+ public void run(IAction action) {
+ if (null != this.selectedIMFile) {
+ //load the IM from the selected file (full path includes the workspace location)
+ IPath location = Platform.getLocation();
+ //System.out.println("Workspace Location: " + location.toFile().getAbsolutePath());
+ URI uri = URI.createFileURI(location.toString() + this.selectedIMFile.getFullPath().toString());
+ IContainer container = this.selectedIMFile.getParent();
+ this.bpmn2Transformer = new Mangrove2BPMN2Transformer(shell, uri);
+ this.bpmn2Transformer.createBPMN2fromCore(container);
+ }
+ }
+
+ /**
+ * @see IActionDelegate#selectionChanged(IAction, ISelection)
+ */
+ public void selectionChanged(IAction action, ISelection selection) {
+ this.selectedIMFile = ((IFile) ((StructuredSelection) selection).getFirstElement());
+ }
+
+}
diff --git a/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/src/org/eclipse/soa/mangrove/out/bpmn2/transform/BPMN2Handler.java b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/src/org/eclipse/soa/mangrove/out/bpmn2/transform/BPMN2Handler.java
new file mode 100755
index 0000000..f5f08fe
--- /dev/null
+++ b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/src/org/eclipse/soa/mangrove/out/bpmn2/transform/BPMN2Handler.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) {2013} Xerox Corp.
+ * 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: Adrian Mos (Xerox Corp.) - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.soa.mangrove.out.bpmn2.transform;
+
+import java.io.IOException;
+import java.util.Collections;
+
+import org.eclipse.bpmn2.*;
+import org.eclipse.bpmn2.Process;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+
+/**
+ * Creates handler methods for dealing with the BPMN2 Metamodel
+ * @author Adrian Mos
+ * */
+public class BPMN2Handler {
+
+ private DocumentRoot bpmn2Root;
+ private Definitions definitions;
+ private Bpmn2Factory bpmn2Factory;
+
+ public BPMN2Handler() {
+ bpmn2Factory = Bpmn2Factory.eINSTANCE;
+ bpmn2Root = bpmn2Factory.createDocumentRoot();
+ definitions = bpmn2Factory.createDefinitions();
+ bpmn2Root.setDefinitions(definitions);
+ }
+
+ public Process createProcess(String name){
+ Process p = bpmn2Factory.createProcess();
+ p.setName(name);
+ p.setId(name.replaceAll("\\s", "") + "_ID"); //sets a generated ID
+ bpmn2Root.getDefinitions().getRootElements().add(p);
+ return p;
+ }
+
+ public StartEvent createStartEvent(Process p){
+ StartEvent se = bpmn2Factory.createStartEvent();
+ se.setName("Generated Start Event");
+ p.getFlowElements().add(se);
+ return se;
+ }
+
+ public EndEvent createEndEvent(Process p){
+ EndEvent ee = bpmn2Factory.createEndEvent();
+ ee.setName("Generated End Event");
+ p.getFlowElements().add(ee);
+ return ee;
+ }
+
+ public SequenceFlow connectElements (Process p, FlowNode source, FlowNode target){
+ SequenceFlow flow = bpmn2Factory.createSequenceFlow();
+ p.getFlowElements().add(flow);
+ flow.setSourceRef(source);
+ flow.setTargetRef(target);
+ return flow;
+ }
+
+ public Task createTask(Process p, String name){
+ Task task = bpmn2Factory.createTask();
+ task.setName(name);
+ task.setId(name.replaceAll("\\s", ""));
+ p.getFlowElements().add(task);
+ return task;
+ }
+
+ public ServiceTask createServiceTask(Process p, String name, String serviceName){
+ ServiceTask task = bpmn2Factory.createServiceTask();
+ task.setName(name);
+ task.setId(name.replaceAll("\\s", "") + "_" + EcoreUtil.generateUUID());
+ task.setImplementation(serviceName);
+ p.getFlowElements().add(task);
+ return task;
+ }
+
+ public ManualTask createManualTask(Process p, String name){
+ ManualTask task = bpmn2Factory.createManualTask();
+ task.setName(name);
+ task.setId(name.replaceAll("\\s", "") + "_" + EcoreUtil.generateUUID());
+ p.getFlowElements().add(task);
+ return task;
+ }
+
+ public ExclusiveGateway createExGateway(Process p, String name){
+ ExclusiveGateway task = bpmn2Factory.createExclusiveGateway();
+ task.setName(name);
+ task.setId(name.replaceAll("\\s", "") + "_" + EcoreUtil.generateUUID());
+ p.getFlowElements().add(task);
+ return task;
+ }
+
+ public LaneSet createLaneSet(Process p, String name){
+ LaneSet set = bpmn2Factory.createLaneSet();
+ set.setId(name.replaceAll("\\s", ""));
+ set.setName(name);
+ p.getLaneSets().add(set);
+ return set;
+ }
+
+ public Lane createLane(LaneSet set, String name){
+ Lane lane = bpmn2Factory.createLane();
+ lane.setId(name.replaceAll("\\s", name));
+ lane.setName(name);
+ set.getLanes().add(lane);
+
+ return lane;
+ }
+
+
+ public void persistBPMN2File(URI uri) throws IOException{
+ ResourceSet rs = new ResourceSetImpl();
+
+ Resource resource = rs.createResource(uri, "org.eclipse.bpmn2.content-type.xml");
+ resource.getContents().add(this.definitions);
+
+ resource.save(Collections.EMPTY_MAP);
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/src/org/eclipse/soa/mangrove/out/bpmn2/transform/Mangrove2BPMN2Transformer.java b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/src/org/eclipse/soa/mangrove/out/bpmn2/transform/Mangrove2BPMN2Transformer.java
new file mode 100755
index 0000000..04da83f
--- /dev/null
+++ b/org.eclipse.soa.mangrove.branches/trunk/org.eclipse.soa.mangrove.out.bpmn2/src/org/eclipse/soa/mangrove/out/bpmn2/transform/Mangrove2BPMN2Transformer.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) {2013} Xerox Corp.
+ * 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: Adrian Mos (Xerox Corp.) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.soa.mangrove.out.bpmn2.transform;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.soa.mangrove.Process;
+import org.eclipse.soa.mangrove.Step;
+import org.eclipse.soa.mangrove.Transition;
+import org.eclipse.soa.mangrove.branches.common.Core2AnyTransformer;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.bpmn2.*;
+
+public class Mangrove2BPMN2Transformer extends Core2AnyTransformer {
+
+ private BPMN2Handler bpmn2Handler;
+ private HashMap<Step, FlowNode> stepsToBPMN;
+
+ public Mangrove2BPMN2Transformer(Shell shell, URI uri) {
+ super(shell, uri);
+ this.bpmn2Handler = new BPMN2Handler();
+ stepsToBPMN = new HashMap<Step, FlowNode>();
+ }
+
+ public void createBPMN2fromCore(IContainer container) {
+
+ //this version creates a single BPMN2 Process with multiple lanes
+ org.eclipse.bpmn2.Process p = bpmn2Handler.createProcess("Generated from Mangrove");
+ StartEvent start = bpmn2Handler.createStartEvent(p);
+ //one Lane Set to contain the several lanes
+ LaneSet laneSet = bpmn2Handler.createLaneSet(p, "Mangrove-Generated LaneSet");
+
+ //for each Mangrove process, create a new lane in BPMN2 and add it to the lane set
+ for(Process imProc : im.getProcessCollection().getProcesses()){
+ Lane lane = bpmn2Handler.createLane(laneSet, imProc.getName());
+
+ //now add all the steps in the Mangrove process as elements of the lane
+ for(Step step : imProc.getSteps()){
+
+ //first create the element as part of the BPMN2 process
+ FlowNode node = null;
+ if(step.getName().startsWith("IF ")) node = bpmn2Handler.createExGateway(p, step.getName());
+ else if(imProc.getName().equals("SYSTEM")) {
+ String serviceName = null;
+ if(null!=step.getServiceModel()) serviceName = step.getServiceModel().getServiceName();
+ //System.out.println("ServiceName = " + serviceName);
+ node = bpmn2Handler.createServiceTask(p, step.getName(), serviceName);
+ }
+ else node = bpmn2Handler.createManualTask(p, step.getName());
+ //now add the element to the lane
+ //System.out.println("Added node " + node.getName() + " to lane: " + lane.getName());
+ lane.getFlowNodeRefs().add(node);
+ //now save the mapping for later on when creating the sequence flows
+ stepsToBPMN.put(step, node);
+ //System.out.println("Adding mapping " + step + " - " + node);
+ }
+
+ if(lane.getFlowNodeRefs().isEmpty()) laneSet.getLanes().remove(lane);
+ }
+ //bpmn2Handler.connectElements(p, start, end);
+
+ //create all the BPMN sequence flows
+ Iterator<Step> stepsIter = stepsToBPMN.keySet().iterator();
+ while(stepsIter.hasNext()){
+ Step s = stepsIter.next();
+ System.out.println("Processing step " + s.getName());
+
+ EList<Transition> transitions = s.getSourceTransitions();
+ Iterator<Transition> transIter = transitions.iterator();
+ while (transIter.hasNext()){
+ Transition t = transIter.next();
+ System.out.println("Processing Transition " + t + "with source step: " + t.getSource() + " - target = " + t.getTarget());
+ FlowNode bStart = stepsToBPMN.get(s);
+ FlowNode bEnd = stepsToBPMN.get(t.getTarget());
+ bpmn2Handler.connectElements(p, bStart, bEnd);
+ }
+ }
+
+ //to finish up, the BPMN2 file must be persisted in the workspace
+ try {
+ URI bpmn2URI = uri.trimFileExtension().appendFileExtension("bpmn");
+ bpmn2Handler.persistBPMN2File(bpmn2URI);
+ container.refreshLocal(2, null); //refreshes the workspace so that the saved file is visible
+ } catch (IOException e) {
+ displayIMError("Could not save the BPMN2 Composite file", e);
+ } catch (CoreException e) {
+ displayIMError("Could not refresh the workspace", e);
+ }
+
+ }
+
+}