Merge branch 'develop' into helios
diff --git a/org.eclipse.bpmn2.modeler.core/META-INF/MANIFEST.MF b/org.eclipse.bpmn2.modeler.core/META-INF/MANIFEST.MF
index d8fcd7c..ca25bff 100644
--- a/org.eclipse.bpmn2.modeler.core/META-INF/MANIFEST.MF
+++ b/org.eclipse.bpmn2.modeler.core/META-INF/MANIFEST.MF
@@ -1,74 +1,74 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: BPMN2 Editor Core
-Bundle-SymbolicName: org.eclipse.bpmn2.modeler.core;singleton:=true
-Bundle-Version: 0.0.1.qualifier
-Bundle-Activator: org.eclipse.bpmn2.modeler.core.Activator
-Bundle-Vendor: Eclipse.org
-Require-Bundle: org.eclipse.emf.transaction,
- org.eclipse.emf.edit.ui,
- org.eclipse.emf.validation.ocl,
- org.eclipse.osgi,
- org.eclipse.graphiti;bundle-version="0.9.0",
- org.eclipse.graphiti.ui;bundle-version="0.9.0",
- org.eclipse.gef,
- org.eclipse.bpmn2.edit,
- org.eclipse.bpmn2.editor,
- org.eclipse.xsd,
- org.eclipse.wst.wsdl;bundle-version="[1.1.200,2.0.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.300,2.0.0)",
- org.eclipse.xsd;bundle-version="[2.4.0,3.0.0)",
- org.eclipse.wst.sse.ui;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.300,2.0.0)",
- javax.wsdl;bundle-version="[1.5.0,1.6.0)";visibility:=reexport,
- org.eclipse.wst.xsd.ui;bundle-version="[1.2.101,2.0.0)",
- org.eclipse.wst.xml.ui;bundle-version="[1.0.400,2.0.0)",
- org.eclipse.jst.j2ee,
- org.eclipse.ui.ide,
- org.eclipse.core.commands,
- org.eclipse.jdt,
- org.eclipse.jdt.core,
- org.eclipse.jdt.launching,
- org.eclipse.ui.views.properties.tabbed,
- org.eclipse.jface.databinding,
- org.eclipse.core.databinding,
- org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.ui
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.bpmn2.modeler.core,
- org.eclipse.bpmn2.modeler.core.adapters,
- org.eclipse.bpmn2.modeler.core.di,
- org.eclipse.bpmn2.modeler.core.features,
- org.eclipse.bpmn2.modeler.core.features.activity,
- org.eclipse.bpmn2.modeler.core.features.activity.task,
- org.eclipse.bpmn2.modeler.core.features.artifact,
- org.eclipse.bpmn2.modeler.core.features.bendpoint,
- org.eclipse.bpmn2.modeler.core.features.choreography,
- org.eclipse.bpmn2.modeler.core.features.conversation,
- org.eclipse.bpmn2.modeler.core.features.data,
- org.eclipse.bpmn2.modeler.core.features.event,
- org.eclipse.bpmn2.modeler.core.features.event.definitions,
- org.eclipse.bpmn2.modeler.core.features.flow,
- org.eclipse.bpmn2.modeler.core.features.gateway,
- org.eclipse.bpmn2.modeler.core.features.lane,
- org.eclipse.bpmn2.modeler.core.features.participant,
- org.eclipse.bpmn2.modeler.core.merrimac.clad,
- org.eclipse.bpmn2.modeler.core.merrimac.dialogs,
- org.eclipse.bpmn2.modeler.core.merrimac.providers,
- org.eclipse.bpmn2.modeler.core.model,
- org.eclipse.bpmn2.modeler.core.preferences,
- org.eclipse.bpmn2.modeler.core.runtime,
- org.eclipse.bpmn2.modeler.core.utils,
- org.eclipse.bpmn2.modeler.core.validation
-Import-Package: org.eclipse.bpel.wsil.model.inspection,
- org.eclipse.graphiti.ui.features,
- org.eclipse.jface.preference,
- org.eclipse.jface.util,
- org.eclipse.jface.viewers,
- org.eclipse.swt.graphics,
- org.eclipse.ui,
- org.eclipse.ui.plugin,
- org.eclipse.ui.views.properties.tabbed,
- org.eclipse.wst.validation
+Manifest-Version: 1.0

+Bundle-ManifestVersion: 2

+Bundle-Name: BPMN2 Editor Core

+Bundle-SymbolicName: org.eclipse.bpmn2.modeler.core;singleton:=true

+Bundle-Version: 0.0.1.qualifier

+Bundle-Activator: org.eclipse.bpmn2.modeler.core.Activator

+Bundle-Vendor: Eclipse.org

+Require-Bundle: org.eclipse.emf.transaction,

+ org.eclipse.emf.edit.ui,

+ org.eclipse.emf.validation.ocl,

+ org.eclipse.osgi,

+ org.eclipse.graphiti;bundle-version="0.8.2",

+ org.eclipse.graphiti.ui;bundle-version="0.8.2",

+ org.eclipse.gef,

+ org.eclipse.bpmn2.edit,

+ org.eclipse.bpmn2.editor,

+ org.eclipse.xsd,

+ org.eclipse.wst.wsdl;bundle-version="[1.1.200,2.0.0)",

+ org.eclipse.wst.xml.core;bundle-version="[1.1.300,2.0.0)",

+ org.eclipse.xsd;bundle-version="[2.4.0,3.0.0)",

+ org.eclipse.wst.sse.ui;bundle-version="[1.1.0,2.0.0)",

+ org.eclipse.wst.sse.core;bundle-version="[1.1.300,2.0.0)",

+ javax.wsdl;bundle-version="[1.5.0,1.6.0)";visibility:=reexport,

+ org.eclipse.wst.xsd.ui;bundle-version="[1.2.101,2.0.0)",

+ org.eclipse.wst.xml.ui;bundle-version="[1.0.400,2.0.0)",

+ org.eclipse.jst.j2ee,

+ org.eclipse.ui.ide,

+ org.eclipse.core.commands,

+ org.eclipse.jdt,

+ org.eclipse.jdt.core,

+ org.eclipse.jdt.launching,

+ org.eclipse.ui.views.properties.tabbed,

+ org.eclipse.jface.databinding,

+ org.eclipse.core.databinding,

+ org.eclipse.core.resources,

+ org.eclipse.core.runtime,

+ org.eclipse.ui

+Bundle-RequiredExecutionEnvironment: JavaSE-1.6

+Bundle-ActivationPolicy: lazy

+Export-Package: org.eclipse.bpmn2.modeler.core,

+ org.eclipse.bpmn2.modeler.core.adapters,

+ org.eclipse.bpmn2.modeler.core.di,

+ org.eclipse.bpmn2.modeler.core.features,

+ org.eclipse.bpmn2.modeler.core.features.activity,

+ org.eclipse.bpmn2.modeler.core.features.activity.task,

+ org.eclipse.bpmn2.modeler.core.features.artifact,

+ org.eclipse.bpmn2.modeler.core.features.bendpoint,

+ org.eclipse.bpmn2.modeler.core.features.choreography,

+ org.eclipse.bpmn2.modeler.core.features.conversation,

+ org.eclipse.bpmn2.modeler.core.features.data,

+ org.eclipse.bpmn2.modeler.core.features.event,

+ org.eclipse.bpmn2.modeler.core.features.event.definitions,

+ org.eclipse.bpmn2.modeler.core.features.flow,

+ org.eclipse.bpmn2.modeler.core.features.gateway,

+ org.eclipse.bpmn2.modeler.core.features.lane,

+ org.eclipse.bpmn2.modeler.core.features.participant,

+ org.eclipse.bpmn2.modeler.core.merrimac.clad,

+ org.eclipse.bpmn2.modeler.core.merrimac.dialogs,

+ org.eclipse.bpmn2.modeler.core.merrimac.providers,

+ org.eclipse.bpmn2.modeler.core.model,

+ org.eclipse.bpmn2.modeler.core.preferences,

+ org.eclipse.bpmn2.modeler.core.runtime,

+ org.eclipse.bpmn2.modeler.core.utils,

+ org.eclipse.bpmn2.modeler.core.validation

+Import-Package: org.eclipse.bpel.wsil.model.inspection,

+ org.eclipse.graphiti.ui.features,

+ org.eclipse.jface.preference,

+ org.eclipse.jface.util,

+ org.eclipse.jface.viewers,

+ org.eclipse.swt.graphics,

+ org.eclipse.ui,

+ org.eclipse.ui.plugin,

+ org.eclipse.ui.views.properties.tabbed,

+ org.eclipse.wst.validation

diff --git a/org.eclipse.bpmn2.modeler.runtime.example/src/org/eclipse/bpmn2/modeler/runtime/example/SampleModel/util/SampleModelSwitch.java b/org.eclipse.bpmn2.modeler.runtime.example/src/org/eclipse/bpmn2/modeler/runtime/example/SampleModel/util/SampleModelSwitch.java
index 88f336b..7853f2f 100644
--- a/org.eclipse.bpmn2.modeler.runtime.example/src/org/eclipse/bpmn2/modeler/runtime/example/SampleModel/util/SampleModelSwitch.java
+++ b/org.eclipse.bpmn2.modeler.runtime.example/src/org/eclipse/bpmn2/modeler/runtime/example/SampleModel/util/SampleModelSwitch.java
@@ -6,12 +6,12 @@
  */
 package org.eclipse.bpmn2.modeler.runtime.example.SampleModel.util;
 
+import java.util.List;
+
 import org.eclipse.bpmn2.modeler.runtime.example.SampleModel.*;
 
+import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.util.Switch;
 
 /**
  * <!-- begin-user-doc -->
@@ -26,7 +26,7 @@
  * @see org.eclipse.bpmn2.modeler.runtime.example.SampleModel.SampleModelPackage
  * @generated
  */
-public class SampleModelSwitch<T> extends Switch<T> {
+public class SampleModelSwitch<T> {
 	/**
 	 * The cached model package
 	 * <!-- begin-user-doc -->
@@ -48,16 +48,14 @@
 	}
 
 	/**
-	 * Checks whether this is a switch for the given package.
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @parameter ePackage the package in question.
-	 * @return whether this is a switch for the given package.
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
 	 * @generated
 	 */
-	@Override
-	protected boolean isSwitchFor(EPackage ePackage) {
-		return ePackage == modelPackage;
+	public T doSwitch(EObject theEObject) {
+		return doSwitch(theEObject.eClass(), theEObject);
 	}
 
 	/**
@@ -67,7 +65,26 @@
 	 * @return the first non-null result returned by a <code>caseXXX</code> call.
 	 * @generated
 	 */
-	@Override
+	protected T doSwitch(EClass theEClass, EObject theEObject) {
+		if (theEClass.eContainer() == modelPackage) {
+			return doSwitch(theEClass.getClassifierID(), theEObject);
+		}
+		else {
+			List<EClass> eSuperTypes = theEClass.getESuperTypes();
+			return
+				eSuperTypes.isEmpty() ?
+					defaultCase(theEObject) :
+					doSwitch(eSuperTypes.get(0), theEObject);
+		}
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
 	protected T doSwitch(int classifierID, EObject theEObject) {
 		switch (classifierID) {
 			case SampleModelPackage.DOCUMENT_ROOT: {
@@ -122,7 +139,6 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
 	 * @generated
 	 */
-	@Override
 	public T defaultCase(EObject object) {
 		return null;
 	}
diff --git a/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/META-INF/MANIFEST.MF b/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/META-INF/MANIFEST.MF
index 1b81d2d..b476dca 100644
--- a/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/META-INF/MANIFEST.MF
+++ b/org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5/META-INF/MANIFEST.MF
@@ -1,37 +1,37 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: BPMN2 Editor Runtime extensions for JBoss jBPM5
-Bundle-SymbolicName: org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5;singleton:=true
-Bundle-Version: 0.0.1.qualifier
-Bundle-Activator: org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.Activator
-Bundle-Vendor: Eclipse.org
-Require-Bundle: org.eclipse.ui.ide,
- org.eclipse.graphiti;bundle-version="0.9.0",
- org.eclipse.graphiti.ui;bundle-version="0.9.0",
- org.eclipse.bpmn2.modeler.core,
- org.eclipse.emf.transaction;bundle-version="1.4.0",
- org.eclipse.ui.views.properties.tabbed;bundle-version="3.5.100",
- org.eclipse.gef,
- org.eclipse.bpmn2.edit,
- org.eclipse.bpmn2.editor,
- org.eclipse.jface.databinding,
- org.eclipse.emf.databinding,
- org.eclipse.emf.edit.ui,
- org.apache.xerces,
- org.eclipse.bpmn2.modeler.ui
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.features,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.impl,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.util,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.adapters,
- org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.wid
-Import-Package: org.eclipse.bpmn2.modeler.ui,
- org.eclipse.bpmn2.modeler.ui.editor,
- org.eclipse.bpmn2.modeler.ui.features.activity.task,
- org.eclipse.bpmn2.modeler.ui.property,
- org.eclipse.bpmn2.modeler.ui.property.providers
- 
+Manifest-Version: 1.0

+Bundle-ManifestVersion: 2

+Bundle-Name: BPMN2 Editor Runtime extensions for JBoss jBPM5

+Bundle-SymbolicName: org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5;singleton:=true

+Bundle-Version: 0.0.1.qualifier

+Bundle-Activator: org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.Activator

+Bundle-Vendor: Eclipse.org

+Require-Bundle: org.eclipse.ui.ide,

+ org.eclipse.graphiti;bundle-version="0.8.2",

+ org.eclipse.graphiti.ui;bundle-version="0.8.2",

+ org.eclipse.bpmn2.modeler.core,

+ org.eclipse.emf.transaction;bundle-version="1.4.0",

+ org.eclipse.ui.views.properties.tabbed;bundle-version="3.5.100",

+ org.eclipse.gef,

+ org.eclipse.bpmn2.edit,

+ org.eclipse.bpmn2.editor,

+ org.eclipse.jface.databinding,

+ org.eclipse.emf.databinding,

+ org.eclipse.emf.edit.ui,

+ org.apache.xerces,

+ org.eclipse.bpmn2.modeler.ui

+Bundle-RequiredExecutionEnvironment: JavaSE-1.6

+Bundle-ActivationPolicy: lazy

+Export-Package: org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5,

+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.features,

+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model,

+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.impl,

+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.util,

+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property,

+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property.adapters,

+ org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.wid

+Import-Package: org.eclipse.bpmn2.modeler.ui,

+ org.eclipse.bpmn2.modeler.ui.editor,

+ org.eclipse.bpmn2.modeler.ui.features.activity.task,

+ org.eclipse.bpmn2.modeler.ui.property,

+ org.eclipse.bpmn2.modeler.ui.property.providers

+ 

diff --git a/org.eclipse.bpmn2.modeler.ui/META-INF/MANIFEST.MF b/org.eclipse.bpmn2.modeler.ui/META-INF/MANIFEST.MF
index 3669055..bad36ac 100644
--- a/org.eclipse.bpmn2.modeler.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.bpmn2.modeler.ui/META-INF/MANIFEST.MF
@@ -1,73 +1,73 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: BPMN2 Editor UI
-Bundle-SymbolicName: org.eclipse.bpmn2.modeler.ui;singleton:=true
-Bundle-Version: 0.0.1.qualifier
-Bundle-Activator: org.eclipse.bpmn2.modeler.ui.Activator
-Bundle-Vendor: Eclipse.org
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui.ide,
- org.eclipse.osgi,
- org.eclipse.graphiti;bundle-version="0.9.0",
- org.eclipse.graphiti.ui;bundle-version="0.9.0",
- org.eclipse.bpmn2.modeler.core,
- org.eclipse.emf.transaction;bundle-version="1.4.0",
- org.eclipse.ui.views.properties.tabbed,
- org.eclipse.gef,
- org.eclipse.bpmn2.edit,
- org.eclipse.bpmn2.editor,
- org.eclipse.jface.databinding,
- org.eclipse.emf.databinding,
- org.eclipse.emf.edit.ui,
- org.eclipse.bpel.wsil.model,
- org.apache.xerces,
- org.eclipse.wst.wsdl;bundle-version="[1.1.200,2.0.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.300,2.0.0)",
- org.eclipse.xsd;bundle-version="[2.4.0,3.0.0)",
- org.eclipse.wst.sse.ui;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.300,2.0.0)",
- javax.wsdl;bundle-version="[1.5.0,1.6.0)";visibility:=reexport,
- org.eclipse.wst.xsd.ui;bundle-version="[1.2.101,2.0.0)",
- org.eclipse.wst.xml.ui;bundle-version="[1.0.400,2.0.0)",
- org.eclipse.jface.text,
- org.eclipse.jdt,
- org.eclipse.jdt.core,
- org.eclipse.emf.workspace
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.bpmn2.modeler.ui,
- org.eclipse.bpmn2.modeler.ui.adapters,
- org.eclipse.bpmn2.modeler.ui.adapters.properties,
- org.eclipse.bpmn2.modeler.ui.diagram,
- org.eclipse.bpmn2.modeler.ui.editor,
- org.eclipse.bpmn2.modeler.ui.features.activity.subprocess,
- org.eclipse.bpmn2.modeler.ui.features.activity.task,
- org.eclipse.bpmn2.modeler.ui.features.artifact,
- org.eclipse.bpmn2.modeler.ui.features.choreography,
- org.eclipse.bpmn2.modeler.ui.features.conversation,
- org.eclipse.bpmn2.modeler.ui.features.data,
- org.eclipse.bpmn2.modeler.ui.features.event,
- org.eclipse.bpmn2.modeler.ui.features.event.definitions,
- org.eclipse.bpmn2.modeler.ui.features.flow,
- org.eclipse.bpmn2.modeler.ui.features.gateway,
- org.eclipse.bpmn2.modeler.ui.features.lane,
- org.eclipse.bpmn2.modeler.ui.features.participant,
- org.eclipse.bpmn2.modeler.ui.preferences,
- org.eclipse.bpmn2.modeler.ui.property,
- org.eclipse.bpmn2.modeler.ui.property.artifact,
- org.eclipse.bpmn2.modeler.ui.property.connectors,
- org.eclipse.bpmn2.modeler.ui.property.data,
- org.eclipse.bpmn2.modeler.ui.property.diagrams,
- org.eclipse.bpmn2.modeler.ui.property.dialogs,
- org.eclipse.bpmn2.modeler.ui.property.editors,
- org.eclipse.bpmn2.modeler.ui.property.events,
- org.eclipse.bpmn2.modeler.ui.property.gateways,
- org.eclipse.bpmn2.modeler.ui.property.providers,
- org.eclipse.bpmn2.modeler.ui.property.tasks,
- org.eclipse.bpmn2.modeler.ui.util,
- org.eclipse.bpmn2.modeler.ui.views,
- org.eclipse.bpmn2.modeler.ui.wizards
-Import-Package: org.eclipse.emf.workspace,
- org.eclipse.emf.workspace.util,
- org.eclipse.wst.validation
-
+Manifest-Version: 1.0

+Bundle-ManifestVersion: 2

+Bundle-Name: BPMN2 Editor UI

+Bundle-SymbolicName: org.eclipse.bpmn2.modeler.ui;singleton:=true

+Bundle-Version: 0.0.1.qualifier

+Bundle-Activator: org.eclipse.bpmn2.modeler.ui.Activator

+Bundle-Vendor: Eclipse.org

+Bundle-Localization: plugin

+Require-Bundle: org.eclipse.ui.ide,

+ org.eclipse.osgi,

+ org.eclipse.graphiti;bundle-version="0.8.2",

+ org.eclipse.graphiti.ui;bundle-version="0.8.2",

+ org.eclipse.bpmn2.modeler.core,

+ org.eclipse.emf.transaction;bundle-version="1.4.0",

+ org.eclipse.ui.views.properties.tabbed,

+ org.eclipse.gef,

+ org.eclipse.bpmn2.edit,

+ org.eclipse.bpmn2.editor,

+ org.eclipse.jface.databinding,

+ org.eclipse.emf.databinding,

+ org.eclipse.emf.edit.ui,

+ org.eclipse.bpel.wsil.model,

+ org.apache.xerces,

+ org.eclipse.wst.wsdl;bundle-version="[1.1.200,2.0.0)",

+ org.eclipse.wst.xml.core;bundle-version="[1.1.300,2.0.0)",

+ org.eclipse.xsd;bundle-version="[2.4.0,3.0.0)",

+ org.eclipse.wst.sse.ui;bundle-version="[1.1.0,2.0.0)",

+ org.eclipse.wst.sse.core;bundle-version="[1.1.300,2.0.0)",

+ javax.wsdl;bundle-version="[1.5.0,1.6.0)";visibility:=reexport,

+ org.eclipse.wst.xsd.ui;bundle-version="[1.2.101,2.0.0)",

+ org.eclipse.wst.xml.ui;bundle-version="[1.0.400,2.0.0)",

+ org.eclipse.jface.text,

+ org.eclipse.jdt,

+ org.eclipse.jdt.core,

+ org.eclipse.emf.workspace

+Bundle-RequiredExecutionEnvironment: JavaSE-1.6

+Bundle-ActivationPolicy: lazy

+Export-Package: org.eclipse.bpmn2.modeler.ui,

+ org.eclipse.bpmn2.modeler.ui.adapters,

+ org.eclipse.bpmn2.modeler.ui.adapters.properties,

+ org.eclipse.bpmn2.modeler.ui.diagram,

+ org.eclipse.bpmn2.modeler.ui.editor,

+ org.eclipse.bpmn2.modeler.ui.features.activity.subprocess,

+ org.eclipse.bpmn2.modeler.ui.features.activity.task,

+ org.eclipse.bpmn2.modeler.ui.features.artifact,

+ org.eclipse.bpmn2.modeler.ui.features.choreography,

+ org.eclipse.bpmn2.modeler.ui.features.conversation,

+ org.eclipse.bpmn2.modeler.ui.features.data,

+ org.eclipse.bpmn2.modeler.ui.features.event,

+ org.eclipse.bpmn2.modeler.ui.features.event.definitions,

+ org.eclipse.bpmn2.modeler.ui.features.flow,

+ org.eclipse.bpmn2.modeler.ui.features.gateway,

+ org.eclipse.bpmn2.modeler.ui.features.lane,

+ org.eclipse.bpmn2.modeler.ui.features.participant,

+ org.eclipse.bpmn2.modeler.ui.preferences,

+ org.eclipse.bpmn2.modeler.ui.property,

+ org.eclipse.bpmn2.modeler.ui.property.artifact,

+ org.eclipse.bpmn2.modeler.ui.property.connectors,

+ org.eclipse.bpmn2.modeler.ui.property.data,

+ org.eclipse.bpmn2.modeler.ui.property.diagrams,

+ org.eclipse.bpmn2.modeler.ui.property.dialogs,

+ org.eclipse.bpmn2.modeler.ui.property.editors,

+ org.eclipse.bpmn2.modeler.ui.property.events,

+ org.eclipse.bpmn2.modeler.ui.property.gateways,

+ org.eclipse.bpmn2.modeler.ui.property.providers,

+ org.eclipse.bpmn2.modeler.ui.property.tasks,

+ org.eclipse.bpmn2.modeler.ui.util,

+ org.eclipse.bpmn2.modeler.ui.views,

+ org.eclipse.bpmn2.modeler.ui.wizards

+Import-Package: org.eclipse.emf.workspace,

+ org.eclipse.emf.workspace.util,

+ org.eclipse.wst.validation

+

diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/Activator.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/Activator.java
index c6b3adb..e05922d 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/Activator.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/Activator.java
@@ -161,6 +161,14 @@
 	// The shared instance
 	private static Activator plugin;
 	
+	// handles changes to the bpmn file
+	private BPMN2ResourceChangeListener resourceChangeListener;
+	private ISaveParticipant saveParticipant;
+    
+	static {
+		TargetRuntime.getAllRuntimes();
+	}
+	
 	// Adapter Factory registration
 	static {
 		AdapterRegistry.INSTANCE.registerAdapterFactory(
@@ -193,6 +201,8 @@
 	public void start(BundleContext context) throws Exception {
 		super.start(context);
 		plugin = this;
+
+		initializeResourceChangeListener();
 	}
 
 	/*
@@ -203,6 +213,11 @@
 	public void stop(BundleContext context) throws Exception {
 		plugin = null;
 		super.stop(context);
+		
+		IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		if (workspace != null) {
+			workspace.removeResourceChangeListener(this.resourceChangeListener);
+		}
 	}
 
 	/**
@@ -314,4 +329,66 @@
     public ImageDescriptor getImageDescriptor(String id) {
 		return getImageRegistry().getDescriptor(id);
     }
+
+	/**
+	 * Installs the IResourceChangeListener for this Plugin. Also
+	 * checks if there were any changes to bpmn files while the plug-in
+	 * was not active.
+	 */
+	private void initializeResourceChangeListener() throws CoreException {
+		this.resourceChangeListener = new BPMN2ResourceChangeListener();
+		// Add the save participant in a separate thread
+		// to make sure that it doesn't block the UI thread and potentially cause
+		// deadlocks with the code that caused our plugin to be started.
+		Thread initSaveParticipantThread = new Thread(new Runnable() {
+			@Override
+			public void run() {
+				try {
+					IWorkspace workspace = ResourcesPlugin.getWorkspace();
+					workspace.addResourceChangeListener(Activator.this.resourceChangeListener, IResourceChangeEvent.POST_BUILD);
+					ISavedState savedState = workspace.addSaveParticipant("BPMN2 Modeler", getSaveParticipant());
+					if (savedState != null) {
+						savedState.processResourceChangeEvents(Activator.this.resourceChangeListener);
+					}
+				} catch (CoreException e) {
+					throw new RuntimeException(e);
+				}
+			}
+		});
+		initSaveParticipantThread.setName("BPMN2 Modeler plugin init"); //$NON-NLS-1$
+		initSaveParticipantThread.start();
+	}
+
+	/**
+	 * We are only interested in the resource delta while the plugin was
+	 * not active and don't really care about the plug-in save lifecycle.
+	 */
+	private ISaveParticipant getSaveParticipant() {
+		if (this.saveParticipant == null) {
+			this.saveParticipant = new ISaveParticipant() {
+				@Override
+				public void doneSaving(ISaveContext context) {
+				}
+				@Override
+				public void prepareToSave(ISaveContext context) throws CoreException {
+				}
+				@Override
+				public void rollback(ISaveContext context) {
+				}
+				@Override
+				public void saving(ISaveContext context) throws CoreException {
+					context.needDelta();
+				}
+			};
+		}
+		return this.saveParticipant;
+	}
+
+	/**
+	 * Returns the resource change listener.
+	 */
+	public BPMN2ResourceChangeListener getResourceChangeListener() {
+		return this.resourceChangeListener;
+	}
+
 }
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/BPMN2ResourceChangeListener.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/BPMN2ResourceChangeListener.java
new file mode 100644
index 0000000..1cca90a
--- /dev/null
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/BPMN2ResourceChangeListener.java
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat, Inc.
+ *  All rights reserved.
+ * This program is 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:
+ * Red Hat, Inc. - initial API and implementation
+ *
+ * @author Bob Brodt
+ ******************************************************************************/
+
+package org.eclipse.bpmn2.modeler.ui;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * @author Bob Brodt
+ *
+ */
+public class BPMN2ResourceChangeListener implements IResourceChangeListener {
+
+	class ResourceDeltaVisitor implements IResourceDeltaVisitor {
+
+		public boolean visit(final IResourceDelta delta) throws CoreException {
+			IResource target = delta.getResource();
+//			switch (delta.getKind()) {
+//			case IResourceDelta.ADDED:
+//				System.out.println(target.getFullPath()+" ADDED");
+//				break;
+//			case IResourceDelta.CHANGED:
+//				System.out.println(target.getFullPath()+" CHANGED");
+//				break;
+//			case IResourceDelta.REMOVED:
+//				System.out.println(target.getFullPath()+" REMOVED");
+//				break;
+//			case IResourceDelta.ADDED_PHANTOM:
+//				System.out.println(target.getFullPath()+" ADDED_PHANTOM");
+//				break;
+//			}
+			if (target.getType() == IResource.FILE) {
+				handleFile(delta);
+			}
+			return true;
+		}
+
+		private void handleFile(final IResourceDelta delta)
+			throws CoreException {
+			IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
+				public void run(IProgressMonitor monitor)
+					throws CoreException {
+					IFile target = (IFile) delta.getResource();
+					int flags = delta.getFlags();
+					
+					switch (delta.getKind()) {
+					case IResourceDelta.ADDED:
+						if ((flags & IResourceDelta.MOVED_FROM) != 0) {
+							if (target.exists())
+								fileMoved(delta.getMovedFromPath(), target.getFullPath());
+						}
+						break;
+					case IResourceDelta.REMOVED:
+						if ((flags & IResourceDelta.MOVED_TO) != 0) {
+							if (target.exists())
+								fileMoved(target.getFullPath(), delta.getMovedToPath());
+						} else {
+							fileDeleted(target.getFullPath(), monitor);
+						}
+						break;
+					}
+				}
+			};
+			ResourcesPlugin.getWorkspace().run(runnable, null);
+		}
+	}
+
+	protected IResourceDeltaVisitor visitor;
+	protected List<IFileChangeListener> listeners;
+
+	public BPMN2ResourceChangeListener() {
+		listeners = new ArrayList<IFileChangeListener>();
+	}
+
+	/**
+	 * Objects like the BPELEditor can add listeners so they can be
+	 * notified and react when BPEL files change.
+	 */
+	public void addListener(IFileChangeListener listener) {
+		listeners.add(listener);
+	}
+	
+	/**
+	 * Removed the listener.
+	 */
+	public void removeListener(IFileChangeListener listener) {
+		listeners.remove(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
+	 */
+	@Override
+	public void resourceChanged(IResourceChangeEvent event) {
+		try {
+			event.getDelta().accept(getResourceDeltaVisitor());
+		} catch (CoreException e) {
+			Activator.logError(e);
+		}
+	}
+
+	protected IResourceDeltaVisitor getResourceDeltaVisitor() {
+		if (visitor == null) {
+			visitor = new ResourceDeltaVisitor();
+		}
+		return visitor;
+	}
+
+	protected void fileMoved(IPath oldFilePath, IPath newFilePath) throws CoreException {
+		// notify listeners
+		// make a copy of listener list to avoid concurrent list modification
+		List<IFileChangeListener> l = new ArrayList<IFileChangeListener>();
+		l.addAll(listeners);
+		for (IFileChangeListener listener : l) {
+			listener.moved(oldFilePath, newFilePath);
+		}
+	}
+	
+	protected void fileDeleted(IPath filePath, IProgressMonitor monitor) throws CoreException {
+		// notify listeners
+		// make a copy of listener list to avoid concurrent list modification
+		List<IFileChangeListener> l = new ArrayList<IFileChangeListener>();
+		l.addAll(listeners);
+		for (IFileChangeListener listener : l) {
+			listener.deleted(filePath);
+		}
+	}
+}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java
index 74e3f96..f204ef8 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2Editor.java
@@ -1,1048 +1,1058 @@
-/******************************************************************************* 
- * Copyright (c) 2011 Red Hat, Inc. 
- *  All rights reserved. 
- * This program is 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: 
- * Red Hat, Inc. - initial API and implementation 
- *
- * @author Innar Made
- ******************************************************************************/
-package org.eclipse.bpmn2.modeler.ui.editor;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import org.eclipse.bpmn2.Activity;
-import org.eclipse.bpmn2.Assignment;
-import org.eclipse.bpmn2.BaseElement;
-import org.eclipse.bpmn2.BoundaryEvent;
-import org.eclipse.bpmn2.CallActivity;
-import org.eclipse.bpmn2.CallChoreography;
-import org.eclipse.bpmn2.CatchEvent;
-import org.eclipse.bpmn2.Category;
-import org.eclipse.bpmn2.CompensateEventDefinition;
-import org.eclipse.bpmn2.ConditionalEventDefinition;
-import org.eclipse.bpmn2.DataInput;
-import org.eclipse.bpmn2.DataObject;
-import org.eclipse.bpmn2.DataObjectReference;
-import org.eclipse.bpmn2.DataOutput;
-import org.eclipse.bpmn2.DataStore;
-import org.eclipse.bpmn2.DataStoreReference;
-import org.eclipse.bpmn2.EndEvent;
-import org.eclipse.bpmn2.ErrorEventDefinition;
-import org.eclipse.bpmn2.EscalationEventDefinition;
-import org.eclipse.bpmn2.Event;
-import org.eclipse.bpmn2.Expression;
-import org.eclipse.bpmn2.FormalExpression;
-import org.eclipse.bpmn2.Gateway;
-import org.eclipse.bpmn2.GlobalBusinessRuleTask;
-import org.eclipse.bpmn2.GlobalManualTask;
-import org.eclipse.bpmn2.GlobalScriptTask;
-import org.eclipse.bpmn2.GlobalTask;
-import org.eclipse.bpmn2.GlobalUserTask;
-import org.eclipse.bpmn2.HumanPerformer;
-import org.eclipse.bpmn2.Import;
-import org.eclipse.bpmn2.InputOutputSpecification;
-import org.eclipse.bpmn2.Interface;
-import org.eclipse.bpmn2.ItemDefinition;
-import org.eclipse.bpmn2.LinkEventDefinition;
-import org.eclipse.bpmn2.ManualTask;
-import org.eclipse.bpmn2.Message;
-import org.eclipse.bpmn2.MessageEventDefinition;
-import org.eclipse.bpmn2.MessageFlow;
-import org.eclipse.bpmn2.MultiInstanceLoopCharacteristics;
-import org.eclipse.bpmn2.Performer;
-import org.eclipse.bpmn2.PotentialOwner;
-import org.eclipse.bpmn2.Process;
-import org.eclipse.bpmn2.Property;
-import org.eclipse.bpmn2.ResourceAssignmentExpression;
-import org.eclipse.bpmn2.ResourceParameterBinding;
-import org.eclipse.bpmn2.ResourceRole;
-import org.eclipse.bpmn2.ScriptTask;
-import org.eclipse.bpmn2.SequenceFlow;
-import org.eclipse.bpmn2.SignalEventDefinition;
-import org.eclipse.bpmn2.StandardLoopCharacteristics;
-import org.eclipse.bpmn2.StartEvent;
-import org.eclipse.bpmn2.SubProcess;
-import org.eclipse.bpmn2.Task;
-import org.eclipse.bpmn2.TextAnnotation;
-import org.eclipse.bpmn2.ThrowEvent;
-import org.eclipse.bpmn2.TimerEventDefinition;
-import org.eclipse.bpmn2.di.BPMNDiagram;
-import org.eclipse.bpmn2.modeler.core.Bpmn2TabbedPropertySheetPage;
-import org.eclipse.bpmn2.modeler.core.ModelHandler;
-import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
-import org.eclipse.bpmn2.modeler.core.ProxyURIConverterImplExtension;
-import org.eclipse.bpmn2.modeler.core.di.DIImport;
-import org.eclipse.bpmn2.modeler.core.di.DIUtils;
-import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDetailComposite;
-import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDialogComposite;
-import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultListComposite;
-import org.eclipse.bpmn2.modeler.core.merrimac.clad.PropertiesCompositeFactory;
-import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerResourceImpl;
-import org.eclipse.bpmn2.modeler.core.preferences.Bpmn2Preferences;
-import org.eclipse.bpmn2.modeler.core.runtime.TargetRuntime;
-import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
-import org.eclipse.bpmn2.modeler.core.utils.DiagramEditorAdapter;
-import org.eclipse.bpmn2.modeler.core.utils.ErrorUtils;
-import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
-import org.eclipse.bpmn2.modeler.core.utils.ModelUtil.Bpmn2DiagramType;
-import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
-import org.eclipse.bpmn2.modeler.core.validation.BPMN2ProjectValidator;
-import org.eclipse.bpmn2.modeler.core.validation.BPMN2ValidationStatusLoader;
-import org.eclipse.bpmn2.modeler.ui.Activator;
-import org.eclipse.bpmn2.modeler.ui.property.artifact.CategoryDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.artifact.TextAnnotationDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.connectors.MessageFlowDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.connectors.SequenceFlowDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.ConditionalEventDefinitionDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.DataAssignmentDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.DataObjectPropertySection.DataObjectDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.DataObjectReferencePropertySection.DataObjectReferenceDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.DataStorePropertySection.DataStoreDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.DataStoreReferencePropertySection.DataStoreReferenceDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.ExpressionDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.InterfaceDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.ItemAwareElementDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.MessageDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.MessageListComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.ResourceAssignmentExpressionDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.ResourceParameterBindingDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.data.ResourceRoleDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.diagrams.DefinitionsPropertyComposite.ImportDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.diagrams.ItemDefinitionDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.diagrams.ItemDefinitionListComposite;
-import org.eclipse.bpmn2.modeler.ui.property.diagrams.ProcessDiagramPropertyComposite;
-import org.eclipse.bpmn2.modeler.ui.property.diagrams.PropertyListComposite;
-import org.eclipse.bpmn2.modeler.ui.property.diagrams.ResourceRoleListComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.BoundaryEventDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.CatchEventDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.CommonEventDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.CommonEventPropertySection.EventDefinitionDialogComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.EndEventDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.StartEventDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.ThrowEventDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.events.TimerEventDefinitionDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.gateways.GatewayDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityInputDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityOutputDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.DataAssociationDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.IoParametersDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.ManualTaskDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.MultiInstanceLoopCharacteristicsDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.ScriptTaskDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.StandardLoopCharacteristicsDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.property.tasks.TaskDetailComposite;
-import org.eclipse.bpmn2.modeler.ui.views.outline.BPMN2EditorOutlinePage;
-import org.eclipse.bpmn2.modeler.ui.wizards.BPMN2DiagramCreator;
-import org.eclipse.bpmn2.modeler.ui.wizards.Bpmn2DiagramEditorInput;
-import org.eclipse.bpmn2.modeler.ui.wizards.FileService;
-import org.eclipse.bpmn2.util.Bpmn2ResourceImpl;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.util.BasicDiagnostic;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EValidator;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.transaction.RecordingCommand;
-import org.eclipse.emf.transaction.TransactionalEditingDomain.Lifecycle;
-import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;
-import org.eclipse.gef.ui.parts.SelectionSynchronizer;
-import org.eclipse.graphiti.features.IFeatureProvider;
-import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
-import org.eclipse.graphiti.mm.pictograms.Diagram;
-import org.eclipse.graphiti.mm.pictograms.PictogramElement;
-import org.eclipse.graphiti.services.Graphiti;
-import org.eclipse.graphiti.services.IPeService;
-import org.eclipse.graphiti.ui.editor.DefaultPersistencyBehavior;
-import org.eclipse.graphiti.ui.editor.DefaultUpdateBehavior;
-import org.eclipse.graphiti.ui.editor.DiagramEditor;
-import org.eclipse.graphiti.ui.editor.DiagramEditorInput;
-import org.eclipse.graphiti.ui.internal.editor.GFPaletteRoot;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IStorageEditorInput;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchListener;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.SaveAsDialog;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.ide.ResourceUtil;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptorProvider;
-
-/**
- * 
- */
-@SuppressWarnings("restriction")
-public class BPMN2Editor extends DiagramEditor implements IPropertyChangeListener, IGotoMarker {
-	
-	static {
-		TargetRuntime.getAllRuntimes();
-		PropertiesCompositeFactory.register(EObject.class, DefaultDetailComposite.class);
-		PropertiesCompositeFactory.register(EObject.class, DefaultListComposite.class);
-		PropertiesCompositeFactory.register(EObject.class, DefaultDialogComposite.class);
-		PropertiesCompositeFactory.register(Message.class, MessageDetailComposite.class);
-		PropertiesCompositeFactory.register(Message.class, MessageListComposite.class);
-		PropertiesCompositeFactory.register(MessageFlow.class, MessageFlowDetailComposite.class);
-		PropertiesCompositeFactory.register(Property.class, ItemAwareElementDetailComposite.class);
-		PropertiesCompositeFactory.register(CallActivity.class, ActivityDetailComposite.class);
-		PropertiesCompositeFactory.register(GlobalTask.class, ActivityDetailComposite.class);
-		PropertiesCompositeFactory.register(GlobalBusinessRuleTask.class, ActivityDetailComposite.class);
-		PropertiesCompositeFactory.register(GlobalManualTask.class, ActivityDetailComposite.class);
-		PropertiesCompositeFactory.register(GlobalScriptTask.class, ActivityDetailComposite.class);
-		PropertiesCompositeFactory.register(GlobalUserTask.class, ActivityDetailComposite.class);
-		PropertiesCompositeFactory.register(Import.class, ImportDetailComposite.class);
-		PropertiesCompositeFactory.register(Category.class, CategoryDetailComposite.class);
-		PropertiesCompositeFactory.register(TextAnnotation.class, TextAnnotationDetailComposite.class);
-		PropertiesCompositeFactory.register(SequenceFlow.class, SequenceFlowDetailComposite.class);
-		PropertiesCompositeFactory.register(DataObject.class, DataObjectDetailComposite.class);
-		PropertiesCompositeFactory.register(DataObjectReference.class, DataObjectDetailComposite.class);
-		PropertiesCompositeFactory.register(Assignment.class, DataAssignmentDetailComposite.class);
-		PropertiesCompositeFactory.register(Expression.class, ExpressionDetailComposite.class);
-		PropertiesCompositeFactory.register(FormalExpression.class, ExpressionDetailComposite.class);
-		PropertiesCompositeFactory.register(ResourceAssignmentExpression.class, ResourceAssignmentExpressionDetailComposite.class);
-		PropertiesCompositeFactory.register(ResourceParameterBinding.class, ResourceParameterBindingDetailComposite.class);
-		PropertiesCompositeFactory.register(PotentialOwner.class, ResourceRoleDetailComposite.class);
-		PropertiesCompositeFactory.register(HumanPerformer.class, ResourceRoleDetailComposite.class);
-		PropertiesCompositeFactory.register(Performer.class, ResourceRoleDetailComposite.class);
-		PropertiesCompositeFactory.register(DataObjectReference.class, DataObjectReferenceDetailComposite.class);
-		PropertiesCompositeFactory.register(DataStore.class, DataStoreDetailComposite.class);
-		PropertiesCompositeFactory.register(DataStoreReference.class, DataStoreReferenceDetailComposite.class);
-		PropertiesCompositeFactory.register(Interface.class, InterfaceDetailComposite.class);
-		PropertiesCompositeFactory.register(ItemDefinition.class, ItemDefinitionDetailComposite.class);
-		PropertiesCompositeFactory.register(ItemDefinition.class, ItemDefinitionListComposite.class);
-		PropertiesCompositeFactory.register(Property.class, PropertyListComposite.class);
-		PropertiesCompositeFactory.register(ResourceRole.class, ResourceRoleListComposite.class);
-		PropertiesCompositeFactory.register(Event.class, CommonEventDetailComposite.class);
-		PropertiesCompositeFactory.register(StartEvent.class, StartEventDetailComposite.class);
-		PropertiesCompositeFactory.register(EndEvent.class, EndEventDetailComposite.class);
-		PropertiesCompositeFactory.register(CatchEvent.class, CatchEventDetailComposite.class);
-		PropertiesCompositeFactory.register(ThrowEvent.class, ThrowEventDetailComposite.class);
-		PropertiesCompositeFactory.register(BoundaryEvent.class, BoundaryEventDetailComposite.class);
-		PropertiesCompositeFactory.register(TimerEventDefinition.class, TimerEventDefinitionDetailComposite.class);
-		PropertiesCompositeFactory.register(ConditionalEventDefinition.class, ConditionalEventDefinitionDetailComposite.class);
-		PropertiesCompositeFactory.register(CompensateEventDefinition.class, EventDefinitionDialogComposite.class);
-		PropertiesCompositeFactory.register(ConditionalEventDefinition.class, EventDefinitionDialogComposite.class);
-		PropertiesCompositeFactory.register(ErrorEventDefinition.class, EventDefinitionDialogComposite.class);
-		PropertiesCompositeFactory.register(EscalationEventDefinition.class, EventDefinitionDialogComposite.class);
-		PropertiesCompositeFactory.register(LinkEventDefinition.class, EventDefinitionDialogComposite.class);
-		PropertiesCompositeFactory.register(MessageEventDefinition.class, EventDefinitionDialogComposite.class);
-		PropertiesCompositeFactory.register(SignalEventDefinition.class, EventDefinitionDialogComposite.class);
-		PropertiesCompositeFactory.register(TimerEventDefinition.class, EventDefinitionDialogComposite.class);
-		PropertiesCompositeFactory.register(Process.class, ProcessDiagramPropertyComposite.class);
-		PropertiesCompositeFactory.register(EndEvent.class, EndEventDetailComposite.class);
-		PropertiesCompositeFactory.register(StartEvent.class, StartEventDetailComposite.class);
-		PropertiesCompositeFactory.register(ThrowEvent.class, ThrowEventDetailComposite.class);
-		PropertiesCompositeFactory.register(StandardLoopCharacteristics.class, StandardLoopCharacteristicsDetailComposite.class);
-		PropertiesCompositeFactory.register(MultiInstanceLoopCharacteristics.class, MultiInstanceLoopCharacteristicsDetailComposite.class);
-		PropertiesCompositeFactory.register(Gateway.class, GatewayDetailComposite.class);
-		PropertiesCompositeFactory.register(Activity.class, ActivityInputDetailComposite.class);
-		PropertiesCompositeFactory.register(InputOutputSpecification.class, ActivityInputDetailComposite.class);
-		PropertiesCompositeFactory.register(Activity.class, ActivityOutputDetailComposite.class);
-		PropertiesCompositeFactory.register(CallChoreography.class, ActivityDetailComposite.class);
-		PropertiesCompositeFactory.register(InputOutputSpecification.class, IoParametersDetailComposite.class);
-		PropertiesCompositeFactory.register(DataInput.class, DataAssociationDetailComposite.class);
-		PropertiesCompositeFactory.register(DataOutput.class, DataAssociationDetailComposite.class);
-		PropertiesCompositeFactory.register(ManualTask.class, ManualTaskDetailComposite.class);
-		PropertiesCompositeFactory.register(ScriptTask.class, ScriptTaskDetailComposite.class);
-		PropertiesCompositeFactory.register(SubProcess.class, ActivityDetailComposite.class);
-		PropertiesCompositeFactory.register(Task.class, TaskDetailComposite.class);
-	}
-
-	public static final String EDITOR_ID = "org.eclipse.bpmn2.modeler.ui.bpmn2editor";
-	public static final String CONTRIBUTOR_ID = "org.eclipse.bpmn2.modeler.ui.PropertyContributor";
-
-	private ModelHandler modelHandler;
-	private URI modelUri;
-	private URI diagramUri;
-	private boolean editable = true;
-
-	protected BPMNDiagram bpmnDiagram;
-	protected Bpmn2ResourceImpl bpmnResource;
-	
-	private IWorkbenchListener workbenchListener;
-	private IPartListener2 selectionListener;
-    private IResourceChangeListener markerChangeListener;
-	private boolean workbenchShutdown = false;
-	private static BPMN2Editor activeEditor;
-	private static ITabDescriptorProvider tabDescriptorProvider;
-
-	private BPMN2EditingDomainListener editingDomainListener;
-	
-	private Bpmn2Preferences preferences;
-	private TargetRuntime targetRuntime;
-//	private Hashtable<BPMNDiagram, GraphicalViewer> mapDiagramToViewer = new Hashtable<BPMNDiagram, GraphicalViewer>();
-
-	protected DiagramEditorAdapter editorAdapter;
-	protected BPMN2MultiPageEditor multipageEditor;
-	
-	public BPMN2Editor(BPMN2MultiPageEditor mpe) {
-		multipageEditor = mpe;
-	}
-	
-	public static BPMN2Editor getActiveEditor() {
-		return activeEditor;
-	}
-	
-	private void setActiveEditor(BPMN2Editor editor) {
-		activeEditor = editor;
-		if (activeEditor!=null) {
-			Bpmn2Preferences.setActiveProject(activeEditor.getProject());
-			TargetRuntime.setCurrentRuntime( activeEditor.getTargetRuntime() );
-		}
-	}
-
-	public BPMN2MultiPageEditor getMultipageEditor() {
-		return multipageEditor;
-	}
-	
-	protected DiagramEditorAdapter getEditorAdapter() {
-		return editorAdapter;
-	}
-
-	@Override
-	public void init(IEditorSite site, IEditorInput input) throws PartInitException {
-		try {
-			Bpmn2DiagramType diagramType = Bpmn2DiagramType.NONE;
-			String targetNamespace = null;
-			bpmnDiagram = null;
-
-			if (input instanceof IStorageEditorInput) {
-				input = createNewDiagramEditorInput(site, input, diagramType, targetNamespace);
-			}
-			else if (input instanceof DiagramEditorInput) {
-				if (input instanceof Bpmn2DiagramEditorInput) {
-					diagramType = ((Bpmn2DiagramEditorInput)input).getInitialDiagramType();
-					targetNamespace = ((Bpmn2DiagramEditorInput)input).getTargetNamespace();
-					bpmnDiagram = ((Bpmn2DiagramEditorInput)input).getBpmnDiagram();
-				}
-				if (bpmnDiagram==null) {
-					// This was incorrectly constructed input, we ditch the old one and make a new and clean one instead
-					// This code path comes in from the New File Wizard
-					input = createNewDiagramEditorInput(site, input, diagramType, targetNamespace);
-				}
-				else {
-					BPMNDiagram d = bpmnDiagram;
-					bpmnDiagram = null;
-					setBpmnDiagram(d);
-					return;
-				}
-			}
-			else {
-				throw new PartInitException("Invalid Editor Input: "
-						+input.getClass().getSimpleName()+" "
-						+input.getName());
-			}
-		} catch (Exception e) {
-			Activator.showErrorWithLogging(e);
-			throw new PartInitException(e.getMessage());
-		}
-		
-		// add a listener so we get notified if the workbench is shutting down.
-		// in this case we don't want to delete the temp file!
-		addWorkbenchListener();
-		getTargetRuntime(input);
-		setActiveEditor(this);
-		
-		super.init(site, input);
-		
-		addSelectionListener();
-		addMarkerChangeListener();
-	}
-	
-	public void setEditable(boolean editable) {
-		this.editable = editable;
-	}
-
-	public boolean isEditable() {
-	    return editable;
-	}
-
-	@Override
-	public boolean isDirty() {
-		if (!editable)
-			return false;
-		return super.isDirty();
-	}
-	
-	@Override
-	protected DefaultUpdateBehavior createUpdateBehavior() {
-		return new BPMN2EditorUpdateBehavior(this);
-	}
-	
-    @Override
-    protected DefaultPersistencyBehavior createPersistencyBehavior() {
-    	return new BPMN2PersistencyBehavior(this);
-    }
-    
-	public Bpmn2Preferences getPreferences() {
-		if (preferences==null) {
-			loadPreferences(getProject());
-		}
-		return preferences;
-	}
-	
-	private void loadPreferences(IProject project) {
-		preferences = Bpmn2Preferences.getInstance(project);
-		preferences.load();
-		preferences.getGlobalPreferences().addPropertyChangeListener(this);
-	}
-
-	/**
-	 * ID for tabbed property sheets.
-	 * 
-	 * @return the contributor id
-	 */
-	@Override
-	public String getContributorId() {
-		return CONTRIBUTOR_ID;
-	}
-
-	public TargetRuntime getTargetRuntime(ITabDescriptorProvider tdp) {
-		tabDescriptorProvider = tdp;
-		return getTargetRuntime();
-	}
-	
-	public TargetRuntime getTargetRuntime() {
-		if (targetRuntime==null) {
-			targetRuntime = getTargetRuntime(getEditorInput());
-		}
-		return targetRuntime;
-	}
-	
-	protected TargetRuntime getTargetRuntime(IEditorInput input) {
-		if (targetRuntime==null) {
-			 // If the project has not been configured for a specific runtime through the "BPMN2"
-			 // project properties page (i.e. the target is "None") then allow the runtime extension
-			 // plug-ins an opportunity to identify the given process file contents as their own.
-			 // If none of the plug-ins respond with "yes, this file is targeted for my runtime",
-			 // then use the "None" as the extension. This will configure the BPMN2 Modeler with
-			 // generic property sheets and other default behavior.
-			targetRuntime = getPreferences().getRuntime();
-			if (targetRuntime == TargetRuntime.getDefaultRuntime()) {
-				for (TargetRuntime rt : TargetRuntime.getAllRuntimes()) {
-					if (rt.getRuntimeExtension().isContentForRuntime(input)) {
-						targetRuntime = rt;
-						break;
-					}
-				}
-			}
-			if (targetRuntime==null)
-				targetRuntime = TargetRuntime.getDefaultRuntime();
-		}
-		return targetRuntime;
-	}
-	
-	/**
-	 * Beware, creates a new input and changes this editor!
-	 */
-	private Bpmn2DiagramEditorInput createNewDiagramEditorInput(IEditorSite site, IEditorInput input, Bpmn2DiagramType diagramType, String targetNamespace)
-			throws CoreException {
-		
-		modelUri = FileService.getInputUri(input);
-		input = BPMN2DiagramCreator.createDiagram(modelUri, diagramType,targetNamespace,this);
-		diagramUri = ((Bpmn2DiagramEditorInput)input).getUri();
-
-		return (Bpmn2DiagramEditorInput)input;
-	}
-
-	private void saveModelFile() {
-		modelHandler.save();
-		((BasicCommandStack) getEditingDomain().getCommandStack()).saveIsDone();
-		updateDirtyState();
-	}
-
-	@Override
-	protected void setInput(IEditorInput input) {
-		super.setInput(input);
-		
-		// Hook a transaction exception handler so we can get diagnostics about EMF validation errors.
-		getEditingDomainListener();
-		
-		BasicCommandStack basicCommandStack = (BasicCommandStack) getEditingDomain().getCommandStack();
-
-		if (input instanceof DiagramEditorInput) {
-			ResourceSet resourceSet = getEditingDomain().getResourceSet();
-			getTargetRuntime().setResourceSet(resourceSet);
-			
-			bpmnResource = (Bpmn2ResourceImpl) resourceSet.createResource(modelUri,
-					Bpmn2ModelerResourceImpl.BPMN2_CONTENT_TYPE_ID);
-
-			resourceSet.setURIConverter(new ProxyURIConverterImplExtension());
-			resourceSet.eAdapters().add(editorAdapter = new DiagramEditorAdapter(this));
-
-			modelHandler = ModelHandlerLocator.createModelHandler(modelUri, bpmnResource);
-			ModelHandlerLocator.put(diagramUri, modelHandler);
-
-			getTargetRuntime(input);
-			setActiveEditor(this);
-
-			// allow the runtime extension to construct custom tasks and whatever else it needs
-			// custom tasks should be added to the current target runtime's custom tasks list
-			// where they will be picked up by the toolpalette refresh.
-			getTargetRuntime().getRuntimeExtension().initialize(this);
-
-			try {
-				if (getModelFile()==null || getModelFile().exists()) {
-					bpmnResource.load(null);
-				} else {
-					saveModelFile();
-				}
-			} catch (IOException e) {
-				Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);
-				ErrorUtils.showErrorWithLogging(status);
-			}
-			basicCommandStack.execute(new RecordingCommand(getEditingDomain()) {
-
-				@Override
-				protected void doExecute() {
-					importDiagram();
-				}
-			});
-		}
-		basicCommandStack.saveIsDone();
-		basicCommandStack.flush();
-		loadMarkers();
-	}
-	
-	private void importDiagram() {
-		// make sure this guy is active, otherwise it's not selectable
-		Diagram diagram = getDiagramTypeProvider().getDiagram();
-		IFeatureProvider featureProvider = getDiagramTypeProvider().getFeatureProvider();
-		diagram.setActive(true);
-		Bpmn2DiagramEditorInput input = (Bpmn2DiagramEditorInput) getEditorInput();
-		Bpmn2DiagramType diagramType = input.getInitialDiagramType();
-		String targetNamespace = input.getTargetNamespace();
-
-		if (diagramType != Bpmn2DiagramType.NONE) {
-			bpmnDiagram = modelHandler.createDiagramType(diagramType, targetNamespace);
-			featureProvider.link(diagram, bpmnDiagram);
-			saveModelFile();
-		}
-		
-		DIImport di = new DIImport(this);
-		di.setModelHandler(modelHandler);
-
-		di.generateFromDI();
-	}
-
-	protected void updatePalette() {
-		GFPaletteRoot pr = (GFPaletteRoot)getPaletteRoot();
-		if (pr!=null)
-			pr.updatePaletteEntries();
-	}
-	
-	@Override
-	protected PictogramElement[] getPictogramElementsForSelection() {
-		// filter out invisible elements when setting selection
-		PictogramElement[] pictogramElements = super.getPictogramElementsForSelection();
-		if (pictogramElements==null)
-			return null;
-		ArrayList<PictogramElement> visibleList = new ArrayList<PictogramElement>();
-		for (PictogramElement pe : pictogramElements) {
-			if (pe.isVisible())
-				visibleList.add(pe);
-		}
-		return visibleList.toArray(new PictogramElement[visibleList.size()]);
-	}
-	
-	private void addWorkbenchListener() {
-		if (workbenchListener==null) {
-			workbenchListener = new IWorkbenchListener() {
-				@Override
-				public boolean preShutdown(IWorkbench workbench, boolean forced) {
-					workbenchShutdown = true;
-					return true;
-				}
-
-				@Override
-				public void postShutdown(IWorkbench workbench) {
-				}
-
-			};
-			PlatformUI.getWorkbench().addWorkbenchListener(workbenchListener);
-		}
-	}
-	
-    @Override
-    public void gotoMarker(IMarker marker) {
-        final EObject target = getTargetObject(marker);
-        if (target == null) {
-            return;
-        }
-        final PictogramElement pe = getDiagramTypeProvider().getFeatureProvider().getPictogramElementForBusinessObject(
-                target);
-        if (pe == null) {
-            return;
-        }
-        selectPictogramElements(new PictogramElement[] {pe });
-    }
-
-    private void loadMarkers() {
-    	if (getModelFile()!=null) {
-	        // read in the markers
-	        BPMN2ValidationStatusLoader vsl = new BPMN2ValidationStatusLoader(this);
-	
-	        try {
-	            vsl.load(Arrays.asList(getModelFile().findMarkers(
-	            		BPMN2ProjectValidator.BPMN2_MARKER_ID, true, IResource.DEPTH_ZERO)));
-	        } catch (CoreException e) {
-	            Activator.logStatus(e.getStatus());
-	        }
-    	}
-    }
-    
-    private EObject getTargetObject(IMarker marker) {
-        final String uriString = marker.getAttribute(EValidator.URI_ATTRIBUTE, null);
-        final URI uri = uriString == null ? null : URI.createURI(uriString);
-        if (uri == null) {
-            return null;
-        }
-        return getEditingDomain().getResourceSet().getEObject(uri, false);
-    }
-
-	private void removeWorkbenchListener()
-	{
-		if (workbenchListener!=null) {
-			PlatformUI.getWorkbench().removeWorkbenchListener(workbenchListener);
-			workbenchListener = null;
-		}
-	}
-	
-	private void addSelectionListener() {
-		if (selectionListener == null) {
-			IWorkbenchPage page = getSite().getPage();
-			selectionListener = new IPartListener2() {
-				public void partActivated(IWorkbenchPartReference partRef) {
-				}
-
-				@Override
-				public void partBroughtToTop(IWorkbenchPartReference partRef) {
-					IWorkbenchPart part = partRef.getPart(false);
-					if (part instanceof BPMN2MultiPageEditor) {
-						BPMN2MultiPageEditor mpe = (BPMN2MultiPageEditor)part;
-						setActiveEditor(mpe.getDesignEditor());
-					}
-				}
-
-				@Override
-				public void partClosed(IWorkbenchPartReference partRef) {
-				}
-
-				@Override
-				public void partDeactivated(IWorkbenchPartReference partRef) {
-				}
-
-				@Override
-				public void partOpened(IWorkbenchPartReference partRef) {
-				}
-
-				@Override
-				public void partHidden(IWorkbenchPartReference partRef) {
-				}
-
-				@Override
-				public void partVisible(IWorkbenchPartReference partRef) {
-				}
-
-				@Override
-				public void partInputChanged(IWorkbenchPartReference partRef) {
-				}
-			};
-			page.addPartListener(selectionListener);
-		}
-	}
-
-	private void removeSelectionListener()
-	{
-		if (selectionListener!=null) {
-			getSite().getPage().removePartListener(selectionListener);
-			selectionListener = null;
-		}
-	}
-
-	private void addMarkerChangeListener() {
-		if (getModelFile()!=null) {
-			if (markerChangeListener==null) {
-				markerChangeListener = new BPMN2MarkerChangeListener(this);
-		        getModelFile().getWorkspace().addResourceChangeListener(markerChangeListener, IResourceChangeEvent.POST_BUILD);
-			}
-		}
-	}
-	
-	private void removeMarkerChangeListener() {
-		if (markerChangeListener!=null) {
-			getModelFile().getWorkspace().removeResourceChangeListener(markerChangeListener);
-			markerChangeListener = null;
-		}
-	}
-	
-	public void refreshTitle() {
-		String name = getEditorInput().getName();
-		setPartName(URI.decode(name));
-	}
-
-	public BPMN2EditingDomainListener getEditingDomainListener() {
-		if (editingDomainListener==null) {
-			TransactionalEditingDomainImpl editingDomain = (TransactionalEditingDomainImpl)getEditingDomain();
-			if (editingDomain==null) {
-				return null;
-			}
-			editingDomainListener = new BPMN2EditingDomainListener(this);
-
-			Lifecycle domainLifeCycle = (Lifecycle) editingDomain.getAdapter(Lifecycle.class);
-			domainLifeCycle.addTransactionalEditingDomainListener(editingDomainListener);
-		}
-		return editingDomainListener;
-	}
-	
-	public BasicDiagnostic getDiagnostics() {
-		return getEditingDomainListener().getDiagnostics();
-	}
-	
-	@Override
-	public Object getAdapter(Class required) {
-		if (required==ITabDescriptorProvider.class) {
-			if (tabDescriptorProvider==null) {
-				IWorkbenchPage page = getEditorSite().getPage();
-				String viewID = "org.eclipse.ui.views.PropertySheet";
-				try {
-					page.showView(viewID, null, IWorkbenchPage.VIEW_CREATE);
-					page.showView(viewID, null,  IWorkbenchPage.VIEW_ACTIVATE);
-				}
-				catch (Exception e) {}
-			}
-			return tabDescriptorProvider;
-		}
-		if (required==TargetRuntime.class)
-			return getTargetRuntime();
-		if (required==Bpmn2Preferences.class)
-			return getPreferences();
-		if (required == IPropertySheetPage.class) {
-			return new Bpmn2TabbedPropertySheetPage(this);
-		}
-		if (required == SelectionSynchronizer.class) {
-			return getSelectionSynchronizer();
-		}
-		if (required == IContentOutlinePage.class) {
-			if (getDiagramTypeProvider() != null) {
-				BPMN2EditorOutlinePage outlinePage = new BPMN2EditorOutlinePage(this);
-				return outlinePage;
-			}
-		}
-		
-		return super.getAdapter(required);
-	}
-
-	@Override
-	public void dispose() {
-		// clear ID mapping tables if no more instances of editor are active
-		int instances = 0;
-		IWorkbenchPage[] pages = getEditorSite().getWorkbenchWindow().getPages();
-		for (IWorkbenchPage p : pages) {
-			IEditorReference[] refs = p.getEditorReferences();
-			instances += refs.length;
-		}
-		File diagramFile = new File(diagramUri.toFileString());
-		if (diagramFile.exists()) {
-			try {
-				diagramFile.delete();
-			}
-			catch (Exception e) {
-			}
-		}
-		ModelUtil.clearIDs(modelHandler.getResource(), instances==0);
-		getPreferences().getGlobalPreferences().removePropertyChangeListener(this);
-		
-		getResourceSet().eAdapters().remove(getEditorAdapter());
-		removeSelectionListener();
-		if (instances==0)
-			setActiveEditor(null);
-		
-		super.dispose();
-		ModelHandlerLocator.remove(modelUri);
-		// get rid of temp files and folders, but NOT if the workbench is being shut down.
-		// when the workbench is restarted, we need to have those temp files around!
-		if (!workbenchShutdown) {
-			if (FileService.isTempFile(modelUri)) {
-				FileService.deleteTempFile(modelUri);
-			}
-		}
-
-		removeWorkbenchListener();
-		removeMarkerChangeListener();
-		getPreferences().dispose();
-	}
-
-	public IPath getModelPath() {
-		if (getModelFile()!=null)
-			return getModelFile().getFullPath();
-		return null;
-	}
-	
-	public IProject getProject() {
-		if (getModelFile()!=null)
-			return getModelFile().getProject();
-		return null;
-	}
-	
-	public IFile getModelFile() {
-		if (modelUri!=null) {
-			String uriString = modelUri.trimFragment().toPlatformString(true);
-			if (uriString!=null) {
-				IPath fullPath = new Path(uriString);
-				return ResourcesPlugin.getWorkspace().getRoot().getFile(fullPath);
-			}
-		}
-		return null;
-	}
-	
-	public ModelHandler getModelHandler() {
-		return modelHandler;
-	}
-	
-	public void createPartControl(Composite parent) {
-		if (getGraphicalViewer()==null) {
-			super.createPartControl(parent);
-		}
-	}
-	
-	public BPMNDiagram getBpmnDiagram() {
-		if (bpmnDiagram==null)
-			bpmnDiagram = getModelHandler().getDefinitions().getDiagrams().get(0);
-
-//		if (bpmnDiagram!=null) {
-//			GraphicalViewer viewer = getGraphicalViewer();
-//			mapDiagramToViewer.put(bpmnDiagram, viewer);
-//		}
-		return bpmnDiagram;
-	}
-	
-	public void setBpmnDiagram(final BPMNDiagram bpmnDiagram) {
-		// create a new Graphiti Diagram if needed
-		Diagram diagram = DIUtils.getOrCreateDiagram(this, bpmnDiagram);
-		
-		// Tell the DTP about the new Diagram
-		getDiagramTypeProvider().resourceReloaded(diagram);
-		getRefreshBehavior().initRefresh();
-		setPictogramElementsForSelection(null);
-		// set Diagram as contents for the graphical viewer and refresh
-		getGraphicalViewer().setContents(diagram);
-		
-		refreshContent();
-		
-		// remember this for later
-		this.bpmnDiagram = bpmnDiagram;
-	}
-
-	@Override
-	public void doSave(IProgressMonitor monitor) {
-		super.doSave(monitor);
-
-		Resource resource = getResourceSet().getResource(modelUri, false);
-		BPMN2ProjectValidator.validateOnSave(resource, monitor);
-	}
-
-	@Override
-	public boolean isSaveAsAllowed() {
-		return getModelFile()!=null;
-	}
-	
-	@Override
-	public void doSaveAs() {
-		IFile oldFile = getModelFile();
-		SaveAsDialog saveAsDialog = new SaveAsDialog(getSite().getShell());
-		saveAsDialog.setOriginalFile(oldFile);
-		saveAsDialog.create();
-		if (saveAsDialog.open() == SaveAsDialog.CANCEL) {
-			return;
-		}
-		IPath newFilePath = saveAsDialog.getResult();
-		if (newFilePath == null){
-			return;
-		}
-		
-        IFile newFile = ResourcesPlugin.getWorkspace().getRoot().getFile(newFilePath);
-        IWorkbenchPage page = getSite().getPage();
-        
-        try {
-        	// Save the current(old) file
-        	doSave(null);
-        	// if new file exists, close its editor (if open) and delete the existing file
-            if (newFile.exists()) {
-    			IEditorPart editorPart = ResourceUtil.findEditor(page, newFile);
-    			if (editorPart!=null)
-	    			page.closeEditor(editorPart, false);
-        		newFile.delete(true, null);
-            }
-            // make a copy
-			oldFile.copy(newFilePath, true, null);
-		} catch (CoreException e) {
-			showErrorDialogWithLogging(e);
-			return;
-		}
-
-        // open new editor
-    	try {
-			page.openEditor(new FileEditorInput(newFile), BPMN2Editor.EDITOR_ID);
-		} catch (PartInitException e1) {
-			showErrorDialogWithLogging(e1);
-			return;
-		}
-    	
-    	// and close the old editor
-		IEditorPart editorPart = ResourceUtil.findEditor(page, oldFile);
-		if (editorPart!=null)
-			page.closeEditor(editorPart, false);
-		
-    	try {
-			newFile.refreshLocal(IResource.DEPTH_ZERO,null);
-		} catch (CoreException e) {
-			showErrorDialogWithLogging(e);
-			return;
-		}
-	}
-
-	public void closeEditor() {
-		Display.getDefault().asyncExec(new Runnable() {
-			public void run() {
-				boolean closed = getSite().getPage().closeEditor(BPMN2Editor.this, false);
-				if (!closed){
-					// If close editor fails, try again with explicit editorpart 
-					// of the old file
-					IFile oldFile = ResourcesPlugin.getWorkspace().getRoot().getFile(getModelPath());
-					IEditorPart editorPart = ResourceUtil.findEditor(getSite().getPage(), oldFile);
-					closed = getSite().getPage().closeEditor(editorPart, false);
-				}
-			}
-		});
-	}
-
-	// Show error dialog and log the error
-	private void showErrorDialogWithLogging(Exception e) {
-		Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);
-		ErrorUtils.showErrorWithLogging(status);
-	}
-
-	////////////////////////////////////////////////////////////////////////////////
-	// WorkspaceSynchronizer handlers called from delegate
-	////////////////////////////////////////////////////////////////////////////////
-	
-	public boolean handleResourceChanged(Resource resource) {
-		return true;
-	}
-
-	public boolean handleResourceDeleted(Resource resource) {
-		closeEditor();
-		return true;
-	}
-
-	public boolean handleResourceMoved(Resource resource, URI newURI) {
-		URI oldURI = resource.getURI();
-		resource.setURI(newURI);
-		
-		if (modelUri.equals(oldURI)) {
-			ModelHandlerLocator.remove(modelUri);
-			modelUri = newURI;
-			if (preferences!=null) {
-				preferences.getGlobalPreferences().removePropertyChangeListener(this);
-				preferences.dispose();
-				preferences = null;
-			}
-			targetRuntime = null;
-			modelHandler = ModelHandlerLocator.createModelHandler(modelUri, (Bpmn2ResourceImpl)resource);
-			ModelHandlerLocator.put(diagramUri, modelHandler);
-		}
-		else if (diagramUri.equals(oldURI)) {
-			ModelHandlerLocator.remove(diagramUri);
-			diagramUri = newURI;
-			ModelHandlerLocator.put(diagramUri, modelHandler);
-		}
-
-		return true;
-	}
-	
-	////////////////////////////////////////////////////////////////////////////////
-	// Other handlers
-	////////////////////////////////////////////////////////////////////////////////
-
-	@Override
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		// Graphiti understands multipage editors
-		super.selectionChanged(part,selection); // Graphiti's DiagramEditorInternal
-		// but apparently GEF doesn't
-		updateActions(getSelectionActions()); // usually done in GEF's GraphicalEditor
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	@Override
-	public void propertyChange(PropertyChangeEvent event) {
-		if (event.getProperty().endsWith(Bpmn2Preferences.PREF_SHAPE_STYLE)) {
-			getEditingDomain().getCommandStack().execute(new RecordingCommand(getEditingDomain()) {
-				@Override
-				protected void doExecute() {
-					IPeService peService = Graphiti.getPeService();
-					TreeIterator<EObject> iter = getDiagramTypeProvider().getDiagram().eAllContents();
-					while (iter.hasNext()) {
-						EObject o = iter.next();
-						if (o instanceof PictogramElement) {
-							PictogramElement pe = (PictogramElement)o;
-							BaseElement be = BusinessObjectUtil.getFirstElementOfType(pe, BaseElement.class);
-							if (be!=null) {
-								TreeIterator<EObject> childIter = pe.eAllContents();
-								while (childIter.hasNext()) {
-									o = childIter.next();
-									if (o instanceof GraphicsAlgorithm) {
-										GraphicsAlgorithm ga = (GraphicsAlgorithm)o;
-										if (peService.getPropertyValue(ga, Bpmn2Preferences.PREF_SHAPE_STYLE)!=null) {
-											StyleUtil.applyStyle(ga, be);
-										}
-									}
-			
-								}
-							}
-						}
-					}
-				}
-			});
-		}
-	}
-}
+/******************************************************************************* 

+ * Copyright (c) 2011 Red Hat, Inc. 

+ *  All rights reserved. 

+ * This program is 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: 

+ * Red Hat, Inc. - initial API and implementation 

+ *

+ * @author Innar Made

+ ******************************************************************************/

+package org.eclipse.bpmn2.modeler.ui.editor;

+

+import java.io.File;

+import java.io.IOException;

+import java.util.ArrayList;

+import java.util.Arrays;

+

+import org.eclipse.bpmn2.Activity;

+import org.eclipse.bpmn2.Assignment;

+import org.eclipse.bpmn2.BaseElement;

+import org.eclipse.bpmn2.BoundaryEvent;

+import org.eclipse.bpmn2.CallActivity;

+import org.eclipse.bpmn2.CallChoreography;

+import org.eclipse.bpmn2.CatchEvent;

+import org.eclipse.bpmn2.Category;

+import org.eclipse.bpmn2.CompensateEventDefinition;

+import org.eclipse.bpmn2.ConditionalEventDefinition;

+import org.eclipse.bpmn2.DataInput;

+import org.eclipse.bpmn2.DataObject;

+import org.eclipse.bpmn2.DataObjectReference;

+import org.eclipse.bpmn2.DataOutput;

+import org.eclipse.bpmn2.DataStore;

+import org.eclipse.bpmn2.DataStoreReference;

+import org.eclipse.bpmn2.EndEvent;

+import org.eclipse.bpmn2.ErrorEventDefinition;

+import org.eclipse.bpmn2.EscalationEventDefinition;

+import org.eclipse.bpmn2.Event;

+import org.eclipse.bpmn2.Expression;

+import org.eclipse.bpmn2.FormalExpression;

+import org.eclipse.bpmn2.Gateway;

+import org.eclipse.bpmn2.GlobalBusinessRuleTask;

+import org.eclipse.bpmn2.GlobalManualTask;

+import org.eclipse.bpmn2.GlobalScriptTask;

+import org.eclipse.bpmn2.GlobalTask;

+import org.eclipse.bpmn2.GlobalUserTask;

+import org.eclipse.bpmn2.HumanPerformer;

+import org.eclipse.bpmn2.Import;

+import org.eclipse.bpmn2.InputOutputSpecification;

+import org.eclipse.bpmn2.Interface;

+import org.eclipse.bpmn2.ItemDefinition;

+import org.eclipse.bpmn2.LinkEventDefinition;

+import org.eclipse.bpmn2.ManualTask;

+import org.eclipse.bpmn2.Message;

+import org.eclipse.bpmn2.MessageEventDefinition;

+import org.eclipse.bpmn2.MessageFlow;

+import org.eclipse.bpmn2.MultiInstanceLoopCharacteristics;

+import org.eclipse.bpmn2.Performer;

+import org.eclipse.bpmn2.PotentialOwner;

+import org.eclipse.bpmn2.Process;

+import org.eclipse.bpmn2.Property;

+import org.eclipse.bpmn2.ResourceAssignmentExpression;

+import org.eclipse.bpmn2.ResourceParameterBinding;

+import org.eclipse.bpmn2.ResourceRole;

+import org.eclipse.bpmn2.ScriptTask;

+import org.eclipse.bpmn2.SequenceFlow;

+import org.eclipse.bpmn2.SignalEventDefinition;

+import org.eclipse.bpmn2.StandardLoopCharacteristics;

+import org.eclipse.bpmn2.StartEvent;

+import org.eclipse.bpmn2.SubProcess;

+import org.eclipse.bpmn2.Task;

+import org.eclipse.bpmn2.TextAnnotation;

+import org.eclipse.bpmn2.ThrowEvent;

+import org.eclipse.bpmn2.TimerEventDefinition;

+import org.eclipse.bpmn2.di.BPMNDiagram;

+import org.eclipse.bpmn2.modeler.core.Bpmn2TabbedPropertySheetPage;

+import org.eclipse.bpmn2.modeler.core.ModelHandler;

+import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;

+import org.eclipse.bpmn2.modeler.core.ProxyURIConverterImplExtension;

+import org.eclipse.bpmn2.modeler.core.di.DIImport;

+import org.eclipse.bpmn2.modeler.core.di.DIUtils;

+import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDetailComposite;

+import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDialogComposite;

+import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultListComposite;

+import org.eclipse.bpmn2.modeler.core.merrimac.clad.PropertiesCompositeFactory;

+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerResourceImpl;

+import org.eclipse.bpmn2.modeler.core.preferences.Bpmn2Preferences;

+import org.eclipse.bpmn2.modeler.core.runtime.TargetRuntime;

+import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;

+import org.eclipse.bpmn2.modeler.core.utils.DiagramEditorAdapter;

+import org.eclipse.bpmn2.modeler.core.utils.ErrorUtils;

+import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;

+import org.eclipse.bpmn2.modeler.core.utils.ModelUtil.Bpmn2DiagramType;

+import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;

+import org.eclipse.bpmn2.modeler.core.validation.BPMN2ProjectValidator;

+import org.eclipse.bpmn2.modeler.core.validation.BPMN2ValidationStatusLoader;

+import org.eclipse.bpmn2.modeler.ui.Activator;

+import org.eclipse.bpmn2.modeler.ui.IFileChangeListener;

+import org.eclipse.bpmn2.modeler.ui.property.artifact.CategoryDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.artifact.TextAnnotationDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.connectors.MessageFlowDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.connectors.SequenceFlowDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.data.ConditionalEventDefinitionDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.data.DataAssignmentDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.data.DataObjectPropertySection.DataObjectDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.data.DataObjectReferencePropertySection.DataObjectReferenceDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.data.DataStorePropertySection.DataStoreDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.data.DataStoreReferencePropertySection.DataStoreReferenceDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.data.ExpressionDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.data.InterfaceDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.data.ItemAwareElementDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.data.MessageDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.data.MessageListComposite;

+import org.eclipse.bpmn2.modeler.ui.property.data.ResourceAssignmentExpressionDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.data.ResourceParameterBindingDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.data.ResourceRoleDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.diagrams.DefinitionsPropertyComposite.ImportDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.diagrams.ItemDefinitionDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.diagrams.ItemDefinitionListComposite;

+import org.eclipse.bpmn2.modeler.ui.property.diagrams.ProcessDiagramPropertyComposite;

+import org.eclipse.bpmn2.modeler.ui.property.diagrams.PropertyListComposite;

+import org.eclipse.bpmn2.modeler.ui.property.diagrams.ResourceRoleListComposite;

+import org.eclipse.bpmn2.modeler.ui.property.events.BoundaryEventDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.events.CatchEventDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.events.CommonEventDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.events.CommonEventPropertySection.EventDefinitionDialogComposite;

+import org.eclipse.bpmn2.modeler.ui.property.events.EndEventDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.events.StartEventDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.events.ThrowEventDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.events.TimerEventDefinitionDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.gateways.GatewayDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityInputDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityOutputDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.tasks.DataAssociationDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.tasks.IoParametersDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.tasks.ManualTaskDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.tasks.MultiInstanceLoopCharacteristicsDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.tasks.ScriptTaskDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.tasks.StandardLoopCharacteristicsDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.property.tasks.TaskDetailComposite;

+import org.eclipse.bpmn2.modeler.ui.views.outline.BPMN2EditorOutlinePage;

+import org.eclipse.bpmn2.modeler.ui.wizards.BPMN2DiagramCreator;

+import org.eclipse.bpmn2.modeler.ui.wizards.Bpmn2DiagramEditorInput;

+import org.eclipse.bpmn2.modeler.ui.wizards.FileService;

+import org.eclipse.bpmn2.util.Bpmn2ResourceImpl;

+import org.eclipse.core.resources.IFile;

+import org.eclipse.core.resources.IFolder;

+import org.eclipse.core.resources.IMarker;

+import org.eclipse.core.resources.IProject;

+import org.eclipse.core.resources.IResource;

+import org.eclipse.core.resources.IResourceChangeEvent;

+import org.eclipse.core.resources.IResourceChangeListener;

+import org.eclipse.core.resources.ResourcesPlugin;

+import org.eclipse.core.runtime.CoreException;

+import org.eclipse.core.runtime.IPath;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.core.runtime.IStatus;

+import org.eclipse.core.runtime.Path;

+import org.eclipse.core.runtime.Status;

+import org.eclipse.emf.common.command.BasicCommandStack;

+import org.eclipse.emf.common.util.BasicDiagnostic;

+import org.eclipse.emf.common.util.TreeIterator;

+import org.eclipse.emf.common.util.URI;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.ecore.EValidator;

+import org.eclipse.emf.ecore.resource.Resource;

+import org.eclipse.emf.ecore.resource.ResourceSet;

+import org.eclipse.emf.transaction.RecordingCommand;

+import org.eclipse.emf.transaction.TransactionalEditingDomain.Lifecycle;

+import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;

+import org.eclipse.gef.ui.parts.SelectionSynchronizer;

+import org.eclipse.graphiti.features.IFeatureProvider;

+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;

+import org.eclipse.graphiti.mm.pictograms.Diagram;

+import org.eclipse.graphiti.mm.pictograms.PictogramElement;

+import org.eclipse.graphiti.services.Graphiti;

+import org.eclipse.graphiti.services.IPeService;

+import org.eclipse.graphiti.ui.editor.DiagramEditor;

+import org.eclipse.graphiti.ui.editor.DiagramEditorInput;

+import org.eclipse.graphiti.ui.internal.editor.GFPaletteRoot;

+import org.eclipse.jface.util.IPropertyChangeListener;

+import org.eclipse.jface.util.PropertyChangeEvent;

+import org.eclipse.jface.viewers.ISelection;

+import org.eclipse.swt.widgets.Composite;

+import org.eclipse.swt.widgets.Display;

+import org.eclipse.ui.IEditorInput;

+import org.eclipse.ui.IEditorPart;

+import org.eclipse.ui.IEditorReference;

+import org.eclipse.ui.IEditorSite;

+import org.eclipse.ui.IFileEditorInput;

+import org.eclipse.ui.IPartListener2;

+import org.eclipse.ui.IStorageEditorInput;

+import org.eclipse.ui.IWorkbench;

+import org.eclipse.ui.IWorkbenchListener;

+import org.eclipse.ui.IWorkbenchPage;

+import org.eclipse.ui.IWorkbenchPart;

+import org.eclipse.ui.IWorkbenchPartReference;

+import org.eclipse.ui.PartInitException;

+import org.eclipse.ui.PlatformUI;

+import org.eclipse.ui.dialogs.SaveAsDialog;

+import org.eclipse.ui.ide.IGotoMarker;

+import org.eclipse.ui.ide.ResourceUtil;

+import org.eclipse.ui.part.FileEditorInput;

+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;

+import org.eclipse.ui.views.properties.IPropertySheetPage;

+import org.eclipse.ui.views.properties.tabbed.ITabDescriptorProvider;

+

+/**

+ * 

+ */

+@SuppressWarnings("restriction")

+public class BPMN2Editor extends DiagramEditor implements IPropertyChangeListener, IGotoMarker {

+	

+	static {

+		TargetRuntime.getAllRuntimes();

+		PropertiesCompositeFactory.register(EObject.class, DefaultDetailComposite.class);

+		PropertiesCompositeFactory.register(EObject.class, DefaultListComposite.class);

+		PropertiesCompositeFactory.register(EObject.class, DefaultDialogComposite.class);

+		PropertiesCompositeFactory.register(Message.class, MessageDetailComposite.class);

+		PropertiesCompositeFactory.register(Message.class, MessageListComposite.class);

+		PropertiesCompositeFactory.register(MessageFlow.class, MessageFlowDetailComposite.class);

+		PropertiesCompositeFactory.register(Property.class, ItemAwareElementDetailComposite.class);

+		PropertiesCompositeFactory.register(CallActivity.class, ActivityDetailComposite.class);

+		PropertiesCompositeFactory.register(GlobalTask.class, ActivityDetailComposite.class);

+		PropertiesCompositeFactory.register(GlobalBusinessRuleTask.class, ActivityDetailComposite.class);

+		PropertiesCompositeFactory.register(GlobalManualTask.class, ActivityDetailComposite.class);

+		PropertiesCompositeFactory.register(GlobalScriptTask.class, ActivityDetailComposite.class);

+		PropertiesCompositeFactory.register(GlobalUserTask.class, ActivityDetailComposite.class);

+		PropertiesCompositeFactory.register(Import.class, ImportDetailComposite.class);

+		PropertiesCompositeFactory.register(Category.class, CategoryDetailComposite.class);

+		PropertiesCompositeFactory.register(TextAnnotation.class, TextAnnotationDetailComposite.class);

+		PropertiesCompositeFactory.register(SequenceFlow.class, SequenceFlowDetailComposite.class);

+		PropertiesCompositeFactory.register(DataObject.class, DataObjectDetailComposite.class);

+		PropertiesCompositeFactory.register(DataObjectReference.class, DataObjectDetailComposite.class);

+		PropertiesCompositeFactory.register(Assignment.class, DataAssignmentDetailComposite.class);

+		PropertiesCompositeFactory.register(Expression.class, ExpressionDetailComposite.class);

+		PropertiesCompositeFactory.register(FormalExpression.class, ExpressionDetailComposite.class);

+		PropertiesCompositeFactory.register(ResourceAssignmentExpression.class, ResourceAssignmentExpressionDetailComposite.class);

+		PropertiesCompositeFactory.register(ResourceParameterBinding.class, ResourceParameterBindingDetailComposite.class);

+		PropertiesCompositeFactory.register(PotentialOwner.class, ResourceRoleDetailComposite.class);

+		PropertiesCompositeFactory.register(HumanPerformer.class, ResourceRoleDetailComposite.class);

+		PropertiesCompositeFactory.register(Performer.class, ResourceRoleDetailComposite.class);

+		PropertiesCompositeFactory.register(DataObjectReference.class, DataObjectReferenceDetailComposite.class);

+		PropertiesCompositeFactory.register(DataStore.class, DataStoreDetailComposite.class);

+		PropertiesCompositeFactory.register(DataStoreReference.class, DataStoreReferenceDetailComposite.class);

+		PropertiesCompositeFactory.register(Interface.class, InterfaceDetailComposite.class);

+		PropertiesCompositeFactory.register(ItemDefinition.class, ItemDefinitionDetailComposite.class);

+		PropertiesCompositeFactory.register(ItemDefinition.class, ItemDefinitionListComposite.class);

+		PropertiesCompositeFactory.register(Property.class, PropertyListComposite.class);

+		PropertiesCompositeFactory.register(ResourceRole.class, ResourceRoleListComposite.class);

+		PropertiesCompositeFactory.register(Event.class, CommonEventDetailComposite.class);

+		PropertiesCompositeFactory.register(StartEvent.class, StartEventDetailComposite.class);

+		PropertiesCompositeFactory.register(EndEvent.class, EndEventDetailComposite.class);

+		PropertiesCompositeFactory.register(CatchEvent.class, CatchEventDetailComposite.class);

+		PropertiesCompositeFactory.register(ThrowEvent.class, ThrowEventDetailComposite.class);

+		PropertiesCompositeFactory.register(BoundaryEvent.class, BoundaryEventDetailComposite.class);

+		PropertiesCompositeFactory.register(TimerEventDefinition.class, TimerEventDefinitionDetailComposite.class);

+		PropertiesCompositeFactory.register(ConditionalEventDefinition.class, ConditionalEventDefinitionDetailComposite.class);

+		PropertiesCompositeFactory.register(CompensateEventDefinition.class, EventDefinitionDialogComposite.class);

+		PropertiesCompositeFactory.register(ConditionalEventDefinition.class, EventDefinitionDialogComposite.class);

+		PropertiesCompositeFactory.register(ErrorEventDefinition.class, EventDefinitionDialogComposite.class);

+		PropertiesCompositeFactory.register(EscalationEventDefinition.class, EventDefinitionDialogComposite.class);

+		PropertiesCompositeFactory.register(LinkEventDefinition.class, EventDefinitionDialogComposite.class);

+		PropertiesCompositeFactory.register(MessageEventDefinition.class, EventDefinitionDialogComposite.class);

+		PropertiesCompositeFactory.register(SignalEventDefinition.class, EventDefinitionDialogComposite.class);

+		PropertiesCompositeFactory.register(TimerEventDefinition.class, EventDefinitionDialogComposite.class);

+		PropertiesCompositeFactory.register(Process.class, ProcessDiagramPropertyComposite.class);

+		PropertiesCompositeFactory.register(EndEvent.class, EndEventDetailComposite.class);

+		PropertiesCompositeFactory.register(StartEvent.class, StartEventDetailComposite.class);

+		PropertiesCompositeFactory.register(ThrowEvent.class, ThrowEventDetailComposite.class);

+		PropertiesCompositeFactory.register(StandardLoopCharacteristics.class, StandardLoopCharacteristicsDetailComposite.class);

+		PropertiesCompositeFactory.register(MultiInstanceLoopCharacteristics.class, MultiInstanceLoopCharacteristicsDetailComposite.class);

+		PropertiesCompositeFactory.register(Gateway.class, GatewayDetailComposite.class);

+		PropertiesCompositeFactory.register(Activity.class, ActivityInputDetailComposite.class);

+		PropertiesCompositeFactory.register(InputOutputSpecification.class, ActivityInputDetailComposite.class);

+		PropertiesCompositeFactory.register(Activity.class, ActivityOutputDetailComposite.class);

+		PropertiesCompositeFactory.register(CallChoreography.class, ActivityDetailComposite.class);

+		PropertiesCompositeFactory.register(InputOutputSpecification.class, IoParametersDetailComposite.class);

+		PropertiesCompositeFactory.register(DataInput.class, DataAssociationDetailComposite.class);

+		PropertiesCompositeFactory.register(DataOutput.class, DataAssociationDetailComposite.class);

+		PropertiesCompositeFactory.register(ManualTask.class, ManualTaskDetailComposite.class);

+		PropertiesCompositeFactory.register(ScriptTask.class, ScriptTaskDetailComposite.class);

+		PropertiesCompositeFactory.register(SubProcess.class, ActivityDetailComposite.class);

+		PropertiesCompositeFactory.register(Task.class, TaskDetailComposite.class);

+	}

+

+	public static final String EDITOR_ID = "org.eclipse.bpmn2.modeler.ui.bpmn2editor";

+	public static final String CONTRIBUTOR_ID = "org.eclipse.bpmn2.modeler.ui.PropertyContributor";

+

+	private ModelHandler modelHandler;

+	private URI modelUri;

+	private URI diagramUri;

+	private boolean editable = true;

+

+	protected BPMNDiagram bpmnDiagram;

+	protected Bpmn2ResourceImpl bpmnResource;

+	

+	private IFileChangeListener fileChangeListener;

+	private IWorkbenchListener workbenchListener;

+	private IPartListener2 selectionListener;

+    private IResourceChangeListener markerChangeListener;

+	private boolean workbenchShutdown = false;

+	private static BPMN2Editor activeEditor;

+	private static ITabDescriptorProvider tabDescriptorProvider;

+

+	private BPMN2EditingDomainListener editingDomainListener;

+	

+	private Bpmn2Preferences preferences;

+	private TargetRuntime targetRuntime;

+//	private Hashtable<BPMNDiagram, GraphicalViewer> mapDiagramToViewer = new Hashtable<BPMNDiagram, GraphicalViewer>();

+

+	protected DiagramEditorAdapter editorAdapter;

+	protected BPMN2MultiPageEditor multipageEditor;

+	

+	public BPMN2Editor(BPMN2MultiPageEditor mpe) {

+		multipageEditor = mpe;

+	}

+	

+	public static BPMN2Editor getActiveEditor() {

+		return activeEditor;

+	}

+	

+	private void setActiveEditor(BPMN2Editor editor) {

+		activeEditor = editor;

+		if (activeEditor!=null) {

+			Bpmn2Preferences.setActiveProject(activeEditor.getProject());

+			TargetRuntime.setCurrentRuntime( activeEditor.getTargetRuntime() );

+		}

+	}

+

+	public BPMN2MultiPageEditor getMultipageEditor() {

+		return multipageEditor;

+	}

+	

+	protected DiagramEditorAdapter getEditorAdapter() {

+		return editorAdapter;

+	}

+

+	@Override

+	public void init(IEditorSite site, IEditorInput input) throws PartInitException {

+		try {

+			Bpmn2DiagramType diagramType = Bpmn2DiagramType.NONE;

+			String targetNamespace = null;

+			bpmnDiagram = null;

+

+			if (input instanceof IStorageEditorInput) {

+				input = createNewDiagramEditorInput(site, input, diagramType, targetNamespace);

+			}

+			else if (input instanceof DiagramEditorInput) {

+				if (input instanceof Bpmn2DiagramEditorInput) {

+					diagramType = ((Bpmn2DiagramEditorInput)input).getInitialDiagramType();

+					targetNamespace = ((Bpmn2DiagramEditorInput)input).getTargetNamespace();

+					bpmnDiagram = ((Bpmn2DiagramEditorInput)input).getBpmnDiagram();

+				}

+				if (bpmnDiagram==null) {

+					// This was incorrectly constructed input, we ditch the old one and make a new and clean one instead

+					// This code path comes in from the New File Wizard

+					input = createNewDiagramEditorInput(site, input, diagramType, targetNamespace);

+				}

+				else {

+					BPMNDiagram d = bpmnDiagram;

+					bpmnDiagram = null;

+					setBpmnDiagram(d);

+					return;

+				}

+			}

+			else {

+				throw new PartInitException("Invalid Editor Input: "

+						+input.getClass().getSimpleName()+" "

+						+input.getName());

+			}

+		} catch (Exception e) {

+			Activator.showErrorWithLogging(e);

+			throw new PartInitException(e.getMessage());

+		}

+		

+		// add a listener so we get notified if the workbench is shutting down.

+		// in this case we don't want to delete the temp file!

+		addWorkbenchListener();

+		getTargetRuntime(input);

+		setActiveEditor(this);

+		

+		super.init(site, input);

+		

+		addSelectionListener();

+		addFileChangeListener();

+		addMarkerChangeListener();

+	}

+	

+	public void setEditable(boolean editable) {

+		this.editable = editable;

+	}

+

+	public boolean isEditable() {

+	    return editable;

+	}

+

+	@Override

+	public boolean isDirty() {

+		if (!editable)

+			return false;

+		return super.isDirty();

+	}

+    

+	public Bpmn2Preferences getPreferences() {

+		if (preferences==null) {

+			loadPreferences(getProject());

+		}

+		return preferences;

+	}

+	

+	private void loadPreferences(IProject project) {

+		preferences = Bpmn2Preferences.getInstance(project);

+		preferences.load();

+		preferences.getGlobalPreferences().addPropertyChangeListener(this);

+	}

+

+	/**

+	 * ID for tabbed property sheets.

+	 * 

+	 * @return the contributor id

+	 */

+	@Override

+	public String getContributorId() {

+		return CONTRIBUTOR_ID;

+	}

+

+	public TargetRuntime getTargetRuntime(ITabDescriptorProvider tdp) {

+		tabDescriptorProvider = tdp;

+		return getTargetRuntime();

+	}

+	

+	public TargetRuntime getTargetRuntime() {

+		if (targetRuntime==null) {

+			targetRuntime = getTargetRuntime(getEditorInput());

+		}

+		return targetRuntime;

+	}

+	

+	protected TargetRuntime getTargetRuntime(IEditorInput input) {

+		if (targetRuntime==null) {

+			 // If the project has not been configured for a specific runtime through the "BPMN2"

+			 // project properties page (i.e. the target is "None") then allow the runtime extension

+			 // plug-ins an opportunity to identify the given process file contents as their own.

+			 // If none of the plug-ins respond with "yes, this file is targeted for my runtime",

+			 // then use the "None" as the extension. This will configure the BPMN2 Modeler with

+			 // generic property sheets and other default behavior.

+			targetRuntime = getPreferences().getRuntime();

+			if (targetRuntime == TargetRuntime.getDefaultRuntime()) {

+				for (TargetRuntime rt : TargetRuntime.getAllRuntimes()) {

+					if (rt.getRuntimeExtension().isContentForRuntime(input)) {

+						targetRuntime = rt;

+						break;

+					}

+				}

+			}

+			if (targetRuntime==null)

+				targetRuntime = TargetRuntime.getDefaultRuntime();

+		}

+		return targetRuntime;

+	}

+	

+	/**

+	 * Beware, creates a new input and changes this editor!

+	 */

+	private Bpmn2DiagramEditorInput createNewDiagramEditorInput(IEditorSite site, IEditorInput input, Bpmn2DiagramType diagramType, String targetNamespace)

+			throws CoreException {

+		

+		modelUri = FileService.getInputUri(input);

+		input = BPMN2DiagramCreator.createDiagram(modelUri, diagramType,targetNamespace,this);

+		diagramUri = ((Bpmn2DiagramEditorInput)input).getUri();

+

+		return (Bpmn2DiagramEditorInput)input;

+	}

+

+	private void saveModelFile() {

+		modelHandler.save();

+		((BasicCommandStack) getEditingDomain().getCommandStack()).saveIsDone();

+		firePropertyChange(IEditorPart.PROP_DIRTY);

+	}

+

+	@Override

+	protected void setInput(IEditorInput input) {

+		super.setInput(input);

+		

+		// Hook a transaction exception handler so we can get diagnostics about EMF validation errors.

+		getEditingDomainListener();

+		

+		BasicCommandStack basicCommandStack = (BasicCommandStack) getEditingDomain().getCommandStack();

+

+		if (input instanceof DiagramEditorInput) {

+			ResourceSet resourceSet = getEditingDomain().getResourceSet();

+			getTargetRuntime().setResourceSet(resourceSet);

+			

+			bpmnResource = (Bpmn2ResourceImpl) resourceSet.createResource(modelUri,

+					Bpmn2ModelerResourceImpl.BPMN2_CONTENT_TYPE_ID);

+

+			resourceSet.setURIConverter(new ProxyURIConverterImplExtension());

+			resourceSet.eAdapters().add(editorAdapter = new DiagramEditorAdapter(this));

+

+			modelHandler = ModelHandlerLocator.createModelHandler(modelUri, bpmnResource);

+			ModelHandlerLocator.put(diagramUri, modelHandler);

+

+			getTargetRuntime(input);

+			setActiveEditor(this);

+

+			// allow the runtime extension to construct custom tasks and whatever else it needs

+			// custom tasks should be added to the current target runtime's custom tasks list

+			// where they will be picked up by the toolpalette refresh.

+			getTargetRuntime().getRuntimeExtension().initialize(this);

+

+			try {

+				if (getModelFile()==null || getModelFile().exists()) {

+					bpmnResource.load(null);

+				} else {

+					saveModelFile();

+				}

+			} catch (IOException e) {

+				Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);

+				ErrorUtils.showErrorWithLogging(status);

+			}

+			basicCommandStack.execute(new RecordingCommand(getEditingDomain()) {

+

+				@Override

+				protected void doExecute() {

+					importDiagram();

+				}

+			});

+		}

+		basicCommandStack.saveIsDone();

+		basicCommandStack.flush();

+		loadMarkers();

+	}

+	

+	private void importDiagram() {

+		// make sure this guy is active, otherwise it's not selectable

+		Diagram diagram = getDiagramTypeProvider().getDiagram();

+		IFeatureProvider featureProvider = getDiagramTypeProvider().getFeatureProvider();

+		diagram.setActive(true);

+		Bpmn2DiagramEditorInput input = (Bpmn2DiagramEditorInput) getEditorInput();

+		Bpmn2DiagramType diagramType = input.getInitialDiagramType();

+		String targetNamespace = input.getTargetNamespace();

+

+		if (diagramType != Bpmn2DiagramType.NONE) {

+			bpmnDiagram = modelHandler.createDiagramType(diagramType, targetNamespace);

+			featureProvider.link(diagram, bpmnDiagram);

+			saveModelFile();

+		}

+		

+		DIImport di = new DIImport(this);

+		di.setModelHandler(modelHandler);

+

+		di.generateFromDI();

+	}

+

+	protected void updatePalette() {

+		GFPaletteRoot pr = (GFPaletteRoot)getPaletteRoot();

+		if (pr!=null)

+			pr.updatePaletteEntries();

+	}

+	

+	@Override

+	protected PictogramElement[] getPictogramElementsForSelection() {

+		// filter out invisible elements when setting selection

+		PictogramElement[] pictogramElements = super.getPictogramElementsForSelection();

+		if (pictogramElements==null)

+			return null;

+		ArrayList<PictogramElement> visibleList = new ArrayList<PictogramElement>();

+		for (PictogramElement pe : pictogramElements) {

+			if (pe.isVisible())

+				visibleList.add(pe);

+		}

+		return visibleList.toArray(new PictogramElement[visibleList.size()]);

+	}

+	

+	private void addWorkbenchListener() {

+		if (workbenchListener==null) {

+			workbenchListener = new IWorkbenchListener() {

+				@Override

+				public boolean preShutdown(IWorkbench workbench, boolean forced) {

+					workbenchShutdown = true;

+					return true;

+				}

+

+				@Override

+				public void postShutdown(IWorkbench workbench) {

+				}

+

+			};

+			PlatformUI.getWorkbench().addWorkbenchListener(workbenchListener);

+		}

+	}

+	

+    @Override

+    public void gotoMarker(IMarker marker) {

+        final EObject target = getTargetObject(marker);

+        if (target == null) {

+            return;

+        }

+        final PictogramElement pe = getDiagramTypeProvider().getFeatureProvider().getPictogramElementForBusinessObject(

+                target);

+        if (pe == null) {

+            return;

+        }

+        selectPictogramElements(new PictogramElement[] {pe });

+    }

+

+    private void loadMarkers() {

+    	if (getModelFile()!=null) {

+	        // read in the markers

+	        BPMN2ValidationStatusLoader vsl = new BPMN2ValidationStatusLoader(this);

+	

+	        try {

+	            vsl.load(Arrays.asList(getModelFile().findMarkers(

+	            		BPMN2ProjectValidator.BPMN2_MARKER_ID, true, IResource.DEPTH_ZERO)));

+	        } catch (CoreException e) {

+	            Activator.logStatus(e.getStatus());

+	        }

+    	}

+    }

+    

+    private EObject getTargetObject(IMarker marker) {

+        final String uriString = marker.getAttribute(EValidator.URI_ATTRIBUTE, null);

+        final URI uri = uriString == null ? null : URI.createURI(uriString);

+        if (uri == null) {

+            return null;

+        }

+        return getEditingDomain().getResourceSet().getEObject(uri, false);

+    }

+

+	private void removeWorkbenchListener()

+	{

+		if (workbenchListener!=null) {

+			PlatformUI.getWorkbench().removeWorkbenchListener(workbenchListener);

+			workbenchListener = null;

+		}

+	}

+	

+	private void addSelectionListener() {

+		if (selectionListener == null) {

+			IWorkbenchPage page = getSite().getPage();

+			selectionListener = new IPartListener2() {

+				public void partActivated(IWorkbenchPartReference partRef) {

+				}

+

+				@Override

+				public void partBroughtToTop(IWorkbenchPartReference partRef) {

+					IWorkbenchPart part = partRef.getPart(false);

+					if (part instanceof BPMN2MultiPageEditor) {

+						BPMN2MultiPageEditor mpe = (BPMN2MultiPageEditor)part;

+						setActiveEditor(mpe.getDesignEditor());

+					}

+				}

+

+				@Override

+				public void partClosed(IWorkbenchPartReference partRef) {

+				}

+

+				@Override

+				public void partDeactivated(IWorkbenchPartReference partRef) {

+				}

+

+				@Override

+				public void partOpened(IWorkbenchPartReference partRef) {

+				}

+

+				@Override

+				public void partHidden(IWorkbenchPartReference partRef) {

+				}

+

+				@Override

+				public void partVisible(IWorkbenchPartReference partRef) {

+				}

+

+				@Override

+				public void partInputChanged(IWorkbenchPartReference partRef) {

+				}

+			};

+			page.addPartListener(selectionListener);

+		}

+	}

+

+	private void removeSelectionListener()

+	{

+		if (selectionListener!=null) {

+			getSite().getPage().removePartListener(selectionListener);

+			selectionListener = null;

+		}

+	}

+

+	private void addMarkerChangeListener() {

+		if (getModelFile()!=null) {

+			if (markerChangeListener==null) {

+				markerChangeListener = new BPMN2MarkerChangeListener(this);

+		        getModelFile().getWorkspace().addResourceChangeListener(markerChangeListener, IResourceChangeEvent.POST_BUILD);

+			}

+		}

+	}

+	

+	private void removeMarkerChangeListener() {

+		if (markerChangeListener!=null) {

+			getModelFile().getWorkspace().removeResourceChangeListener(markerChangeListener);

+			markerChangeListener = null;

+		}

+	}

+	

+	public void refreshTitle() {

+		String name = getEditorInput().getName();

+		setPartName(URI.decode(name));

+	}

+	

+	private void addFileChangeListener() {

+		if (fileChangeListener==null) {

+			fileChangeListener = new IFileChangeListener() {

+				public void deleted(IPath filePath) {

+					// close the editor if either the dummy diagramfile (in the .bpmn2 folder)

+					// or the model file is deleted

+					if (filePath.equals(getModelPath())) {

+						// Close the editor.

+						closeEditor();

+					}

+				}

+				public void moved(IPath oldFilePath, IPath newFilePath) {

+					// handle file move/rename after the fact (i.e. newFile now exists, old file does not)

+					if (oldFilePath.equals(getModelPath())) {

+						reopenEditor(newFilePath);

+					}

+				}

+			};

+			Activator.getDefault().getResourceChangeListener().addListener(fileChangeListener);

+		}

+	}

+

+	private void removeFileChangeListener() {

+		if (fileChangeListener!=null) {

+			Activator.getDefault().getResourceChangeListener().removeListener(fileChangeListener);

+			fileChangeListener = null;

+		}

+	}

+	

+	public BPMN2EditingDomainListener getEditingDomainListener() {

+		if (editingDomainListener==null) {

+			TransactionalEditingDomainImpl editingDomain = (TransactionalEditingDomainImpl)getEditingDomain();

+			if (editingDomain==null) {

+				return null;

+			}

+			editingDomainListener = new BPMN2EditingDomainListener(this);

+

+			Lifecycle domainLifeCycle = (Lifecycle) editingDomain.getAdapter(Lifecycle.class);

+			domainLifeCycle.addTransactionalEditingDomainListener(editingDomainListener);

+		}

+		return editingDomainListener;

+	}

+	

+	public BasicDiagnostic getDiagnostics() {

+		return getEditingDomainListener().getDiagnostics();

+	}

+	

+	@Override

+	public Object getAdapter(Class required) {

+		if (required==ITabDescriptorProvider.class) {

+			if (tabDescriptorProvider==null) {

+				IWorkbenchPage page = getEditorSite().getPage();

+				String viewID = "org.eclipse.ui.views.PropertySheet";

+				try {

+					page.showView(viewID, null, IWorkbenchPage.VIEW_CREATE);

+					page.showView(viewID, null,  IWorkbenchPage.VIEW_ACTIVATE);

+				}

+				catch (Exception e) {}

+			}

+			return tabDescriptorProvider;

+		}

+		if (required==TargetRuntime.class)

+			return getTargetRuntime();

+		if (required==Bpmn2Preferences.class)

+			return getPreferences();

+		if (required == IPropertySheetPage.class) {

+			return new Bpmn2TabbedPropertySheetPage(this);

+		}

+		if (required == SelectionSynchronizer.class) {

+			return getSelectionSynchronizer();

+		}

+		if (required == IContentOutlinePage.class) {

+			if (getDiagramTypeProvider() != null) {

+				BPMN2EditorOutlinePage outlinePage = new BPMN2EditorOutlinePage(this);

+				return outlinePage;

+			}

+		}

+		

+		return super.getAdapter(required);

+	}

+

+	@Override

+	public void dispose() {

+		// clear ID mapping tables if no more instances of editor are active

+		int instances = 0;

+		IWorkbenchPage[] pages = getEditorSite().getWorkbenchWindow().getPages();

+		for (IWorkbenchPage p : pages) {

+			IEditorReference[] refs = p.getEditorReferences();

+			instances += refs.length;

+		}

+		File diagramFile = new File(diagramUri.toFileString());

+		if (diagramFile.exists()) {

+			try {

+				diagramFile.delete();

+			}

+			catch (Exception e) {

+			}

+		}

+		ModelUtil.clearIDs(modelHandler.getResource(), instances==0);

+		getPreferences().getGlobalPreferences().removePropertyChangeListener(this);

+		

+		getResourceSet().eAdapters().remove(getEditorAdapter());

+		removeSelectionListener();

+		removeFileChangeListener();

+		if (instances==0)

+			setActiveEditor(null);

+		

+		super.dispose();

+		ModelHandlerLocator.remove(modelUri);

+		// get rid of temp files and folders, but NOT if the workbench is being shut down.

+		// when the workbench is restarted, we need to have those temp files around!

+		if (!workbenchShutdown) {

+			if (FileService.isTempFile(modelUri)) {

+				FileService.deleteTempFile(modelUri);

+			}

+		}

+

+		removeWorkbenchListener();

+		removeMarkerChangeListener();

+		getPreferences().dispose();

+	}

+

+	public IPath getModelPath() {

+		if (getModelFile()!=null)

+			return getModelFile().getFullPath();

+		return null;

+	}

+	

+	public IProject getProject() {

+		if (getModelFile()!=null)

+			return getModelFile().getProject();

+		return null;

+	}

+	

+	public IFile getModelFile() {

+		if (modelUri!=null) {

+			String uriString = modelUri.trimFragment().toPlatformString(true);

+			if (uriString!=null) {

+				IPath fullPath = new Path(uriString);

+				return ResourcesPlugin.getWorkspace().getRoot().getFile(fullPath);

+			}

+		}

+		return null;

+	}

+	

+	public ModelHandler getModelHandler() {

+		return modelHandler;

+	}

+	

+	public void createPartControl(Composite parent) {

+		if (getGraphicalViewer()==null) {

+			super.createPartControl(parent);

+		}

+	}

+	

+	public BPMNDiagram getBpmnDiagram() {

+		if (bpmnDiagram==null)

+			bpmnDiagram = getModelHandler().getDefinitions().getDiagrams().get(0);

+

+//		if (bpmnDiagram!=null) {

+//			GraphicalViewer viewer = getGraphicalViewer();

+//			mapDiagramToViewer.put(bpmnDiagram, viewer);

+//		}

+		return bpmnDiagram;

+	}

+	

+	public void setBpmnDiagram(final BPMNDiagram bpmnDiagram) {

+		// create a new Graphiti Diagram if needed

+		Diagram diagram = DIUtils.getOrCreateDiagram(this, bpmnDiagram);

+		

+		// Tell the DTP about the new Diagram

+		getDiagramTypeProvider().resourceReloaded(diagram);

+//		getRefreshBehavior().initRefresh();

+		setPictogramElementsForSelection(null);

+		// set Diagram as contents for the graphical viewer and refresh

+		getGraphicalViewer().setContents(diagram);

+		

+		refreshContent();

+		

+		// remember this for later

+		this.bpmnDiagram = bpmnDiagram;

+	}

+

+	@Override

+	public void doSave(IProgressMonitor monitor) {

+		super.doSave(monitor);

+

+		Resource resource = getResourceSet().getResource(modelUri, false);

+		BPMN2ProjectValidator.validateOnSave(resource, monitor);

+	}

+

+	@Override

+	public boolean isSaveAsAllowed() {

+		return getModelFile()!=null;

+	}

+	

+	@Override

+	public void doSaveAs() {

+		IFile oldFile = getModelFile();

+		SaveAsDialog saveAsDialog = new SaveAsDialog(getSite().getShell());

+		saveAsDialog.setOriginalFile(oldFile);

+		saveAsDialog.create();

+		if (saveAsDialog.open() == SaveAsDialog.CANCEL) {

+			return;

+		}

+		IPath newFilePath = saveAsDialog.getResult();

+		if (newFilePath == null){

+			return;

+		}

+		

+        IFile newFile = ResourcesPlugin.getWorkspace().getRoot().getFile(newFilePath);

+        IWorkbenchPage page = getSite().getPage();

+        

+        try {

+        	// Save the current(old) file

+        	doSave(null);

+        	// if new file exists, close its editor (if open) and delete the existing file

+            if (newFile.exists()) {

+    			IEditorPart editorPart = ResourceUtil.findEditor(page, newFile);

+    			if (editorPart!=null)

+	    			page.closeEditor(editorPart, false);

+        		newFile.delete(true, null);

+            }

+            // make a copy

+			oldFile.copy(newFilePath, true, null);

+		} catch (CoreException e) {

+			showErrorDialogWithLogging(e);

+			return;

+		}

+

+        // open new editor

+    	try {

+			page.openEditor(new FileEditorInput(newFile), BPMN2Editor.EDITOR_ID);

+		} catch (PartInitException e1) {

+			showErrorDialogWithLogging(e1);

+			return;

+		}

+    	

+    	// and close the old editor

+		IEditorPart editorPart = ResourceUtil.findEditor(page, oldFile);

+		if (editorPart!=null)

+			page.closeEditor(editorPart, false);

+		

+    	try {

+			newFile.refreshLocal(IResource.DEPTH_ZERO,null);

+		} catch (CoreException e) {

+			showErrorDialogWithLogging(e);

+			return;

+		}

+	}

+

+	public void closeEditor() {

+		Display.getDefault().asyncExec(new Runnable() {

+			public void run() {

+				boolean closed = getSite().getPage().closeEditor(BPMN2Editor.this, false);

+				if (!closed){

+					// If close editor fails, try again with explicit editorpart 

+					// of the old file

+					IFile oldFile = ResourcesPlugin.getWorkspace().getRoot().getFile(getModelPath());

+					IEditorPart editorPart = ResourceUtil.findEditor(getSite().getPage(), oldFile);

+					closed = getSite().getPage().closeEditor(editorPart, false);

+				}

+			}

+		});

+	}

+	

+	protected void reopenEditor(final IPath newFilePath) {

+		Display display = getSite().getShell().getDisplay();

+		display.syncExec(new Runnable() {

+			public void run() {

+				boolean closed = getSite().getPage().closeEditor(BPMN2Editor.this, false);

+				if (!closed){

+					// If close editor fails, try again with explicit editorpart 

+					// of the old file

+					IFile oldFile = ResourcesPlugin.getWorkspace().getRoot().getFile(getModelPath());

+					IEditorPart editorPart = ResourceUtil.findEditor(getSite().getPage(), oldFile);

+					closed = getSite().getPage().closeEditor(editorPart, false);

+				}

+				if (closed) {

+					IFile renamedFile = ResourcesPlugin.getWorkspace().getRoot().getFile(newFilePath);

+					try {

+						getSite().getPage().openEditor(new FileEditorInput(renamedFile), EDITOR_ID);

+					} catch (PartInitException e) {

+						Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);

+						ErrorUtils.showErrorWithLogging(status);

+					}

+				}

+			}

+		});

+	}

+

+	// Show error dialog and log the error

+	private void showErrorDialogWithLogging(Exception e) {

+		Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e);

+		ErrorUtils.showErrorWithLogging(status);

+	}

+

+	////////////////////////////////////////////////////////////////////////////////

+	// Other handlers

+	////////////////////////////////////////////////////////////////////////////////

+

+	@Override

+	public void selectionChanged(IWorkbenchPart part, ISelection selection) {

+		// Graphiti understands multipage editors

+		super.selectionChanged(part,selection); // Graphiti's DiagramEditorInternal

+		// but apparently GEF doesn't

+		updateActions(getSelectionActions()); // usually done in GEF's GraphicalEditor

+	}

+

+	/* (non-Javadoc)

+	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)

+	 */

+	@Override

+	public void propertyChange(PropertyChangeEvent event) {

+		if (event.getProperty().endsWith(Bpmn2Preferences.PREF_SHAPE_STYLE)) {

+			getEditingDomain().getCommandStack().execute(new RecordingCommand(getEditingDomain()) {

+				@Override

+				protected void doExecute() {

+					IPeService peService = Graphiti.getPeService();

+					TreeIterator<EObject> iter = getDiagramTypeProvider().getDiagram().eAllContents();

+					while (iter.hasNext()) {

+						EObject o = iter.next();

+						if (o instanceof PictogramElement) {

+							PictogramElement pe = (PictogramElement)o;

+							BaseElement be = BusinessObjectUtil.getFirstElementOfType(pe, BaseElement.class);

+							if (be!=null) {

+								TreeIterator<EObject> childIter = pe.eAllContents();

+								while (childIter.hasNext()) {

+									o = childIter.next();

+									if (o instanceof GraphicsAlgorithm) {

+										GraphicsAlgorithm ga = (GraphicsAlgorithm)o;

+										if (peService.getPropertyValue(ga, Bpmn2Preferences.PREF_SHAPE_STYLE)!=null) {

+											StyleUtil.applyStyle(ga, be);

+										}

+									}

+			

+								}

+							}

+						}

+					}

+				}

+			});

+		}

+	}

+}

diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2EditorUpdateBehavior.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2EditorUpdateBehavior.java
deleted file mode 100644
index fa0bb47..0000000
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2EditorUpdateBehavior.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 Red Hat, Inc.
- *  All rights reserved.
- * This program is 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:
- * Red Hat, Inc. - initial API and implementation
- *
- * @author Bob Brodt
- ******************************************************************************/
-
-package org.eclipse.bpmn2.modeler.ui.editor;
-
-import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerResourceSetImpl;
-import org.eclipse.bpmn2.modeler.core.validation.ValidationStatusAdapterFactory;
-import org.eclipse.core.commands.operations.DefaultOperationHistory;
-import org.eclipse.core.resources.IFile;
-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.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;
-import org.eclipse.emf.workspace.IWorkspaceCommandStack;
-import org.eclipse.emf.workspace.WorkspaceEditingDomainFactory;
-import org.eclipse.graphiti.ui.editor.DefaultUpdateBehavior;
-import org.eclipse.graphiti.ui.editor.DiagramEditor;
-import org.eclipse.graphiti.ui.editor.IDiagramEditorInput;
-import org.eclipse.graphiti.ui.internal.editor.GFWorkspaceCommandStackImpl;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
-
-/**
- * This overrides the DefaultUpdateBehavior provider class from Graphiti. This
- * is necessary because we want to provide our own ResourceSet implementation
- * instead of being forced to deal with the default ResourceSetImpl. See
- * createResourceSetAndEditingDomain() for details.
- * 
- * @author Bob Brodt
- * 
- */
-public class BPMN2EditorUpdateBehavior extends DefaultUpdateBehavior {
-
-	private TransactionalEditingDomain editingDomain;
-	private WorkspaceSynchronizer workspaceSynchronizer;
-
-	/**
-	 * @param diagramEditor
-	 */
-	public BPMN2EditorUpdateBehavior(DiagramEditor diagramEditor) {
-		super(diagramEditor);
-	}
-
-	public TransactionalEditingDomain getEditingDomain() {
-		if (editingDomain == null)
-			createEditingDomain();
-		return editingDomain;
-	}
-
-	@Override
-	public void createEditingDomain() {
-		if (editingDomain == null) {
-			editingDomain = createResourceSetAndEditingDomain();
-			initializeEditingDomain(editingDomain);
-		}
-	}
-
-	public TransactionalEditingDomain createResourceSetAndEditingDomain() {
-		// Argh!! This is the ONLY line of code that actually differs
-		// (significantly) from
-		// the Graphiti EMF Service. Here we want to substitute our own
-		// Bpmn2ModelerResourceSetImpl instead of using a ResourceSetImpl.
-		final ResourceSet resourceSet = new Bpmn2ModelerResourceSetImpl();
-		final IWorkspaceCommandStack workspaceCommandStack = new GFWorkspaceCommandStackImpl(
-				new DefaultOperationHistory());
-
-		final TransactionalEditingDomainImpl editingDomain = new TransactionalEditingDomainImpl(
-				new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE),
-				workspaceCommandStack, resourceSet);
-		WorkspaceEditingDomainFactory.INSTANCE.mapResourceSet(editingDomain);
-		return editingDomain;
-	}
-	
-	protected void initializeEditingDomain(TransactionalEditingDomain domain) {
-		// we want first crack at these notifications!
-		workspaceSynchronizer = new WorkspaceSynchronizer(getEditingDomain(),
-				new BPMN2EditorWorkspaceSynchronizerDelegate(diagramEditor));
-		super.initializeEditingDomain(domain);
-	}
-	
-	public void dispose() {
-		super.dispose();
-		workspaceSynchronizer.dispose();
-	}
-	
-	public class BPMN2EditorWorkspaceSynchronizerDelegate implements WorkspaceSynchronizer.Delegate {
-
-		private BPMN2Editor bpmnEditor;
-
-		/**
-		 * The DiagramEditorBehavior reacts on a setResourceChanged(true) if he gets
-		 * activated.
-		 */
-		public BPMN2EditorWorkspaceSynchronizerDelegate(DiagramEditor diagramEditor) {
-			this.bpmnEditor = (BPMN2Editor)diagramEditor;
-		}
-
-		public void dispose() { 
-			bpmnEditor = null;
-		}
-
-		public boolean handleResourceChanged(Resource resource) {
-			return bpmnEditor.handleResourceChanged(resource);
-		}
-
-		public boolean handleResourceDeleted(Resource resource) {
-			return bpmnEditor.handleResourceDeleted(resource);
-		}
-
-		public boolean handleResourceMoved(Resource resource, URI newURI) {
-			return bpmnEditor.handleResourceMoved(resource, newURI);
-		}
-
-	}}
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2MultiPageEditor.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2MultiPageEditor.java
index 205970d..28159ea 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2MultiPageEditor.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2MultiPageEditor.java
@@ -1,409 +1,409 @@
-/*******************************************************************************
- * Copyright (c) 2011 Red Hat, Inc.
- *  All rights reserved.
- * This program is 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:
- * Red Hat, Inc. - initial API and implementation
- *
- * @author Bob Brodt
- ******************************************************************************/
-
-package org.eclipse.bpmn2.modeler.ui.editor;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.bpmn2.di.BPMNDiagram;
-import org.eclipse.bpmn2.modeler.core.di.DIUtils;
-import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
-import org.eclipse.bpmn2.modeler.ui.wizards.Bpmn2DiagramEditorInput;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.graphiti.mm.pictograms.Diagram;
-import org.eclipse.graphiti.mm.pictograms.PictogramElement;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabFolder2Listener;
-import org.eclipse.swt.custom.CTabFolderEvent;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.part.MultiPageEditorSite;
-import org.eclipse.ui.part.MultiPageSelectionProvider;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * This class implements a multi-page version of the BPMN2 Modeler (BPMN2Editor class).
- * To revert back to the original, single-page version simply change the editor extension
- * point in plugin.xml (see comments there).
- * 
- * This is still in the experimental phase and currently only supports a single diagram
- * per .bpmn file. An optional second page, which displays the XML source, can be created
- * from the context menu. The source view is not yet synchronized to the design view and
- * can only show the XML as of the last "Save" i.e. the current state of the file on disk,
- * not the in-memory model. Design/Source view synchronization will be implemented in a
- * future version, but direct editing of the XML will not be supported - it will remain
- * "view only".
- * 
- * Future versions will support multiple diagrams per .bpmn file with the ability to add
- * and remove pages containing different diagram types. It should be possible for the user
- * to create a single file that contains a mix of Process, Collaboration and Choreography
- * diagrams. Whether or not these types of files are actually deployable and/or executable
- * is another story ;)
- */
-public class BPMN2MultiPageEditor extends MultiPageEditorPart implements IGotoMarker {
-
-	DesignEditor designEditor;
-	SourceViewer sourceViewer;
-	private CTabFolder tabFolder;
-	private int defaultTabHeight;
-	private List<BPMNDiagram> bpmnDiagrams = new ArrayList<BPMNDiagram>();
-	
-	public BPMN2MultiPageEditor() {
-		super();
-	}
-
-	@Override
-	protected IEditorSite createSite(IEditorPart editor) {
-		if (editor instanceof DesignEditor)
-			return new DesignEditorSite(this, editor);
-		return new MultiPageEditorSite(this, editor);
-	}
-
-	@Override
-	public String getTitle() {
-		if (designEditor!=null)
-			return designEditor.getTitle();
-		return super.getTitle();
-	}
-
-	@Override
-	public String getPartName() {
-		if (designEditor!=null)
-			return designEditor.getPartName();
-		return super.getPartName();
-	}
-
-    /**
-     * Method declared on IEditorPart.
-     * 
-     * @param marker Marker to look for
-     */
-    @Override
-    public void gotoMarker(IMarker marker) {
-        if (getActivePage() < 0) {
-            setActivePage(0);
-        }
-        IDE.gotoMarker(getEditor(getActivePage()), marker);
-    }
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.MultiPageEditorPart#createPages()
-	 */
-	@Override
-	protected void createPages() {
-		tabFolder = (CTabFolder)getContainer();
-		tabFolder.addCTabFolder2Listener( new CTabFolder2Listener() {
-
-			@Override
-			public void close(CTabFolderEvent event) {
-				if (event.item.getData() == sourceViewer)
-					removeSourceViewer();
-			}
-
-			@Override
-			public void minimize(CTabFolderEvent event) {
-			}
-
-			@Override
-			public void maximize(CTabFolderEvent event) {
-			}
-
-			@Override
-			public void restore(CTabFolderEvent event) {
-			}
-
-			@Override
-			public void showList(CTabFolderEvent event) {
-			}
-			
-		});
-		tabFolder.addSelectionListener( new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				int pageIndex = tabFolder.getSelectionIndex();
-				if (pageIndex>=0 && pageIndex<bpmnDiagrams.size() && designEditor!=null) {
-					BPMNDiagram bpmnDiagram = bpmnDiagrams.get(pageIndex);
-					designEditor.selectBpmnDiagram(bpmnDiagram);
-				}
-			}
-		});
-		
-		// defer editor layout until all pages have been created
-		tabFolder.setLayoutDeferred(true);
-		
-		createDesignEditor();
-		
-		Display.getDefault().asyncExec(new Runnable() {
-			public void run() {
-				setActivePage(0);
-				designEditor.selectBpmnDiagram(bpmnDiagrams.get(0));
-				tabFolder.setLayoutDeferred(false);
-				tabFolder.setTabPosition(SWT.TOP);
-				updateTabs();
-			}
-		});
-	}
-
-	protected void createDesignEditor() {
-		if (designEditor==null) {
-			designEditor = new DesignEditor(this, this);
-			
-			try {
-				int pageIndex = tabFolder.getItemCount();
-				if (sourceViewer!=null)
-					--pageIndex;
-				addPage(pageIndex, designEditor, BPMN2MultiPageEditor.this.getEditorInput());
-				defaultTabHeight = tabFolder.getTabHeight();
-				setPageText(pageIndex,ModelUtil.getDiagramTypeName( designEditor.getBpmnDiagram() ));
-
-				defaultTabHeight = tabFolder.getTabHeight();
-
-				updateTabs();
-			}
-			catch (Exception e) {
-				e.printStackTrace();
-			}
-		}
-	}
-
-	public DesignEditor getDesignEditor() {
-		return designEditor;
-	}
-	
-	protected void addDesignPage(final BPMNDiagram bpmnDiagram) {
-		createDesignEditor();
-			Display.getDefault().asyncExec(new Runnable() {
-				public void run() {
-					try {
-			
-						int pageIndex = tabFolder.getItemCount();
-						if (sourceViewer!=null)
-							--pageIndex;
-						Bpmn2DiagramEditorInput input = (Bpmn2DiagramEditorInput)designEditor.getEditorInput();
-						input.setBpmnDiagram(bpmnDiagram);
-						addPage(pageIndex, designEditor, input);
-						CTabItem oldItem = tabFolder.getItem(pageIndex-1);
-						CTabItem newItem = tabFolder.getItem(pageIndex);
-						newItem.setControl( oldItem.getControl() );
-						setPageText(pageIndex,bpmnDiagram.getName());
-			
-						setActivePage(pageIndex);
-						updateTabs();
-					}
-					catch (Exception e) {
-						e.printStackTrace();
-					}
-				}
-			});
-	}
-	
-	public void showDesignPage(final BPMNDiagram bpmnDiagram) {
-		final int pageIndex = bpmnDiagrams.indexOf(bpmnDiagram);
-		if (pageIndex>=0) {
-			if (getDesignEditor().getBpmnDiagram()!=bpmnDiagram) {
-				setActivePage(pageIndex);
-			}
-		}
-		else {
-			designEditor.showDesignPage(bpmnDiagram);
-		}
-	}
-	
-	protected void removeDesignPage(final BPMNDiagram bpmnDiagram) {
-		final int pageIndex = bpmnDiagrams.indexOf(bpmnDiagram);
-		if (pageIndex>0) {
-			// go back to "Design" page - the only page that can't be removed
-			Display.getCurrent().asyncExec( new Runnable() {
-				@Override
-				public void run() {
-					setActivePage(0);
-					
-					IEditorPart editor = getEditor(pageIndex);
-					if (editor instanceof DesignEditor) {
-						((DesignEditor)editor).deleteBpmnDiagram(bpmnDiagram);
-					}
-					
-					// need to manage this ourselves so that the CTabFolder doesn't
-					// dispose our editor site (a child of the CTabItem.control)
-					tabFolder.getItem(pageIndex).setControl(null);
-					
-					removePage(pageIndex);
-					
-					tabFolder.getSelection().getControl().setVisible(true);
-				}
-			});
-		}
-	}
-
-	public int getDesignPageCount() {
-		int count = getPageCount();
-		if (sourceViewer!=null)
-			--count;
-		return count;
-	}
-
-	protected void createSourceViewer() {
-		if (sourceViewer==null) {
-			sourceViewer = new SourceViewer(this);
-
-			try {
-				int pageIndex = tabFolder.getItemCount();
-				FileEditorInput input = new FileEditorInput(designEditor.getModelFile());
-				addPage(pageIndex, sourceViewer, input);
-				tabFolder.getItem(pageIndex).setShowClose(true);
-				
-				setPageText(pageIndex,"Source");
-				setActivePage(pageIndex);
-
-				updateTabs();
-			}
-			catch (Exception e) {
-				e.printStackTrace();
-				if (sourceViewer!=null)
-					sourceViewer.dispose();
-			}
-		}
-	}
-	
-	public SourceViewer getSourceViewer() {
-		return sourceViewer;
-	}
-
-	public void removeSourceViewer() {
-		// there will only be one source page and it will always be the last page in the tab folder
-		if (sourceViewer!=null) {
-			int pageIndex = tabFolder.getItemCount() - 1;
-			if (pageIndex>0) {
-				removePage(pageIndex);
-				sourceViewer = null;
-			}
-		}
-	}
-
-	public void addPage(int pageIndex, IEditorPart editor, IEditorInput input)
-			throws PartInitException {
-		super.addPage(pageIndex,editor,input);
-		if (editor instanceof DesignEditor) {
-			bpmnDiagrams.add(pageIndex,((DesignEditor)editor).getBpmnDiagram());
-		}
-	}
-	
-	@Override
-	public void removePage(int pageIndex) {
-		Object page = tabFolder.getItem(pageIndex).getData();
-		super.removePage(pageIndex);
-		updateTabs();
-		if (page instanceof DesignEditor) {
-			bpmnDiagrams.remove(pageIndex);
-		}
-	}
-
-	@Override
-	protected void pageChange(int newPageIndex) {
-		super.pageChange(newPageIndex);
-
-		IEditorPart editor = getEditor(newPageIndex);
-		if (editor instanceof DesignEditor) {
-			BPMNDiagram bpmnDiagram = bpmnDiagrams.get(newPageIndex);
-			((DesignEditor)editor).pageChange(bpmnDiagram);
-//			Diagram diagram = DIUtils.findDiagram(designEditor, bpmnDiagram);
-//			if (diagram != null)
-//				designEditor.selectPictogramElements(new PictogramElement[] {(PictogramElement)diagram});
-		}
-	}
-
-	public int getPageCount() {
-		return tabFolder.getItemCount();
-	}
-	
-	public CTabItem getTabItem(int pageIndex) {
-		return tabFolder.getItem(pageIndex);
-	}
-	
-	public BPMNDiagram getBpmnDiagram(int i) {
-		if (i>=0 && i<bpmnDiagrams.size()) {
-			return bpmnDiagrams.get(i);
-		}
-		return null;
-	}
-	
-	private void updateTabs() {
-		if (!tabFolder.getLayoutDeferred()) {
-			if (tabFolder.getItemCount()==1) {
-				tabFolder.setTabHeight(0);
-			}
-			else
-				tabFolder.setTabHeight(defaultTabHeight);
-		}
-		tabFolder.layout();
-	}
-	
-	public CTabFolder getTabFolder() {
-		return tabFolder;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	@Override
-	public void doSave(IProgressMonitor monitor) {
-		designEditor.doSave(monitor);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.EditorPart#doSaveAs()
-	 */
-	@Override
-	public void doSaveAs() {
-		IEditorPart activeEditor = getActiveEditor();
-		activeEditor.doSaveAs();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
-	 */
-	@Override
-	public boolean isSaveAsAllowed() {
-		
-		/* 
-		 * Depending upon the active page in multipage editor, call the saveAsAllowed. 
-		 * It helps to see whether a particular editor allows 'save as' feature 
-		 */
-		IEditorPart activeEditor = getActiveEditor();
-		return activeEditor.isSaveAsAllowed();
-	}
-
-	@Override
-	public void dispose() {
-		designEditor.dispose();
-		if (sourceViewer!=null)
-			sourceViewer.dispose();
-	}
-}
+/*******************************************************************************

+ * Copyright (c) 2011 Red Hat, Inc.

+ *  All rights reserved.

+ * This program is 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:

+ * Red Hat, Inc. - initial API and implementation

+ *

+ * @author Bob Brodt

+ ******************************************************************************/

+

+package org.eclipse.bpmn2.modeler.ui.editor;

+

+import java.util.ArrayList;

+import java.util.List;

+

+import org.eclipse.bpmn2.di.BPMNDiagram;

+import org.eclipse.bpmn2.modeler.core.di.DIUtils;

+import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;

+import org.eclipse.bpmn2.modeler.ui.wizards.Bpmn2DiagramEditorInput;

+import org.eclipse.core.resources.IMarker;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.graphiti.mm.pictograms.Diagram;

+import org.eclipse.graphiti.mm.pictograms.PictogramElement;

+import org.eclipse.swt.SWT;

+import org.eclipse.swt.custom.CTabFolder;

+import org.eclipse.swt.custom.CTabFolder2Listener;

+import org.eclipse.swt.custom.CTabFolderEvent;

+import org.eclipse.swt.custom.CTabItem;

+import org.eclipse.swt.events.SelectionAdapter;

+import org.eclipse.swt.events.SelectionEvent;

+import org.eclipse.swt.events.SelectionListener;

+import org.eclipse.swt.widgets.Display;

+import org.eclipse.ui.IEditorInput;

+import org.eclipse.ui.IEditorPart;

+import org.eclipse.ui.IEditorSite;

+import org.eclipse.ui.PartInitException;

+import org.eclipse.ui.ide.IDE;

+import org.eclipse.ui.ide.IGotoMarker;

+import org.eclipse.ui.part.EditorPart;

+import org.eclipse.ui.part.FileEditorInput;

+import org.eclipse.ui.part.MultiPageEditorPart;

+import org.eclipse.ui.part.MultiPageEditorSite;

+import org.eclipse.ui.part.MultiPageSelectionProvider;

+import org.eclipse.wst.sse.ui.StructuredTextEditor;

+import org.w3c.dom.Attr;

+import org.w3c.dom.Element;

+import org.w3c.dom.Node;

+

+/**

+ * This class implements a multi-page version of the BPMN2 Modeler (BPMN2Editor class).

+ * To revert back to the original, single-page version simply change the editor extension

+ * point in plugin.xml (see comments there).

+ * 

+ * This is still in the experimental phase and currently only supports a single diagram

+ * per .bpmn file. An optional second page, which displays the XML source, can be created

+ * from the context menu. The source view is not yet synchronized to the design view and

+ * can only show the XML as of the last "Save" i.e. the current state of the file on disk,

+ * not the in-memory model. Design/Source view synchronization will be implemented in a

+ * future version, but direct editing of the XML will not be supported - it will remain

+ * "view only".

+ * 

+ * Future versions will support multiple diagrams per .bpmn file with the ability to add

+ * and remove pages containing different diagram types. It should be possible for the user

+ * to create a single file that contains a mix of Process, Collaboration and Choreography

+ * diagrams. Whether or not these types of files are actually deployable and/or executable

+ * is another story ;)

+ */

+public class BPMN2MultiPageEditor extends MultiPageEditorPart implements IGotoMarker {

+

+	DesignEditor designEditor;

+	SourceViewer sourceViewer;

+	private CTabFolder tabFolder;

+	private int defaultTabHeight;

+	private List<BPMNDiagram> bpmnDiagrams = new ArrayList<BPMNDiagram>();

+	

+	public BPMN2MultiPageEditor() {

+		super();

+	}

+

+	@Override

+	protected IEditorSite createSite(IEditorPart editor) {

+		if (editor instanceof DesignEditor)

+			return new DesignEditorSite(this, editor);

+		return new MultiPageEditorSite(this, editor);

+	}

+

+	@Override

+	public String getTitle() {

+		if (designEditor!=null)

+			return designEditor.getTitle();

+		return super.getTitle();

+	}

+

+	@Override

+	public String getPartName() {

+		if (designEditor!=null)

+			return designEditor.getPartName();

+		return super.getPartName();

+	}

+

+    /**

+     * Method declared on IEditorPart.

+     * 

+     * @param marker Marker to look for

+     */

+    @Override

+    public void gotoMarker(IMarker marker) {

+        if (getActivePage() < 0) {

+            setActivePage(0);

+        }

+        IDE.gotoMarker(getEditor(getActivePage()), marker);

+    }

+	/* (non-Javadoc)

+	 * @see org.eclipse.ui.part.MultiPageEditorPart#createPages()

+	 */

+	@Override

+	protected void createPages() {

+		tabFolder = (CTabFolder)getContainer();

+		tabFolder.addCTabFolder2Listener( new CTabFolder2Listener() {

+

+			@Override

+			public void close(CTabFolderEvent event) {

+				if (event.item.getData() == sourceViewer)

+					removeSourceViewer();

+			}

+

+			@Override

+			public void minimize(CTabFolderEvent event) {

+			}

+

+			@Override

+			public void maximize(CTabFolderEvent event) {

+			}

+

+			@Override

+			public void restore(CTabFolderEvent event) {

+			}

+

+			@Override

+			public void showList(CTabFolderEvent event) {

+			}

+			

+		});

+		tabFolder.addSelectionListener( new SelectionAdapter() {

+			@Override

+			public void widgetSelected(SelectionEvent e) {

+				int pageIndex = tabFolder.getSelectionIndex();

+				if (pageIndex>=0 && pageIndex<bpmnDiagrams.size() && designEditor!=null) {

+					BPMNDiagram bpmnDiagram = bpmnDiagrams.get(pageIndex);

+					designEditor.selectBpmnDiagram(bpmnDiagram);

+				}

+			}

+		});

+		

+		// defer editor layout until all pages have been created

+		tabFolder.setLayoutDeferred(true);

+		

+		createDesignEditor();

+		

+		Display.getDefault().asyncExec(new Runnable() {

+			public void run() {

+				setActivePage(0);

+				designEditor.selectBpmnDiagram(bpmnDiagrams.get(0));

+				tabFolder.setLayoutDeferred(false);

+				tabFolder.setTabPosition(SWT.TOP);

+				updateTabs();

+			}

+		});

+	}

+

+	protected void createDesignEditor() {

+		if (designEditor==null) {

+			designEditor = new DesignEditor(this, this);

+			

+			try {

+				int pageIndex = tabFolder.getItemCount();

+				if (sourceViewer!=null)

+					--pageIndex;

+				addPage(pageIndex, designEditor, BPMN2MultiPageEditor.this.getEditorInput());

+				defaultTabHeight = tabFolder.getTabHeight();

+				setPageText(pageIndex,ModelUtil.getDiagramTypeName( designEditor.getBpmnDiagram() ));

+

+				defaultTabHeight = tabFolder.getTabHeight();

+

+				updateTabs();

+			}

+			catch (Exception e) {

+				e.printStackTrace();

+			}

+		}

+	}

+

+	public DesignEditor getDesignEditor() {

+		return designEditor;

+	}

+	

+	protected void addDesignPage(final BPMNDiagram bpmnDiagram) {

+		createDesignEditor();

+			Display.getDefault().asyncExec(new Runnable() {

+				public void run() {

+					try {

+			

+						int pageIndex = tabFolder.getItemCount();

+						if (sourceViewer!=null)

+							--pageIndex;

+						Bpmn2DiagramEditorInput input = (Bpmn2DiagramEditorInput)designEditor.getEditorInput();

+						input.setBpmnDiagram(bpmnDiagram);

+						addPage(pageIndex, designEditor, input);

+						CTabItem oldItem = tabFolder.getItem(pageIndex-1);

+						CTabItem newItem = tabFolder.getItem(pageIndex);

+						newItem.setControl( oldItem.getControl() );

+						setPageText(pageIndex,bpmnDiagram.getName());

+			

+						setActivePage(pageIndex);

+						updateTabs();

+					}

+					catch (Exception e) {

+						e.printStackTrace();

+					}

+				}

+			});

+	}

+	

+	public void showDesignPage(final BPMNDiagram bpmnDiagram) {

+		final int pageIndex = bpmnDiagrams.indexOf(bpmnDiagram);

+		if (pageIndex>=0) {

+			if (getDesignEditor().getBpmnDiagram()!=bpmnDiagram) {

+				setActivePage(pageIndex);

+			}

+		}

+		else {

+			designEditor.showDesignPage(bpmnDiagram);

+		}

+	}

+	

+	protected void removeDesignPage(final BPMNDiagram bpmnDiagram) {

+		final int pageIndex = bpmnDiagrams.indexOf(bpmnDiagram);

+		if (pageIndex>0) {

+			// go back to "Design" page - the only page that can't be removed

+			Display.getCurrent().asyncExec( new Runnable() {

+				@Override

+				public void run() {

+					setActivePage(0);

+					

+					IEditorPart editor = getEditor(pageIndex);

+					if (editor instanceof DesignEditor) {

+						((DesignEditor)editor).deleteBpmnDiagram(bpmnDiagram);

+					}

+					

+					// need to manage this ourselves so that the CTabFolder doesn't

+					// dispose our editor site (a child of the CTabItem.control)

+					tabFolder.getItem(pageIndex).setControl(null);

+					

+					removePage(pageIndex);

+					

+					tabFolder.getSelection().getControl().setVisible(true);

+				}

+			});

+		}

+	}

+

+	public int getDesignPageCount() {

+		int count = getPageCount();

+		if (sourceViewer!=null)

+			--count;

+		return count;

+	}

+

+	protected void createSourceViewer() {

+		if (sourceViewer==null) {

+			sourceViewer = new SourceViewer(this);

+

+			try {

+				int pageIndex = tabFolder.getItemCount();

+				FileEditorInput input = new FileEditorInput(designEditor.getModelFile());

+				addPage(pageIndex, sourceViewer, input);

+				tabFolder.getItem(pageIndex).setShowClose(true);

+				

+				setPageText(pageIndex,"Source");

+				setActivePage(pageIndex);

+

+				updateTabs();

+			}

+			catch (Exception e) {

+				e.printStackTrace();

+				if (sourceViewer!=null)

+					sourceViewer.dispose();

+			}

+		}

+	}

+	

+	public SourceViewer getSourceViewer() {

+		return sourceViewer;

+	}

+

+	public void removeSourceViewer() {

+		// there will only be one source page and it will always be the last page in the tab folder

+		if (sourceViewer!=null) {

+			int pageIndex = tabFolder.getItemCount() - 1;

+			if (pageIndex>0) {

+				removePage(pageIndex);

+				sourceViewer = null;

+			}

+		}

+	}

+

+	public void addPage(int pageIndex, IEditorPart editor, IEditorInput input)

+			throws PartInitException {

+		super.addPage(pageIndex,editor,input);

+		if (editor instanceof DesignEditor) {

+			bpmnDiagrams.add(pageIndex,((DesignEditor)editor).getBpmnDiagram());

+		}

+	}

+	

+	@Override

+	public void removePage(int pageIndex) {

+		Object page = tabFolder.getItem(pageIndex).getData();

+		super.removePage(pageIndex);

+		updateTabs();

+		if (page instanceof DesignEditor) {

+			bpmnDiagrams.remove(pageIndex);

+		}

+	}

+

+	@Override

+	protected void pageChange(int newPageIndex) {

+		super.pageChange(newPageIndex);

+

+		IEditorPart editor = getEditor(newPageIndex);

+		if (editor instanceof DesignEditor) {

+			BPMNDiagram bpmnDiagram = bpmnDiagrams.get(newPageIndex);

+			((DesignEditor)editor).pageChange(bpmnDiagram);

+//			Diagram diagram = DIUtils.findDiagram(designEditor, bpmnDiagram);

+//			if (diagram != null)

+//				designEditor.selectPictogramElements(new PictogramElement[] {(PictogramElement)diagram});

+		}

+	}

+

+	public int getPageCount() {

+		return tabFolder.getItemCount();

+	}

+	

+	public CTabItem getTabItem(int pageIndex) {

+		return tabFolder.getItem(pageIndex);

+	}

+	

+	public BPMNDiagram getBpmnDiagram(int i) {

+		if (i>=0 && i<bpmnDiagrams.size()) {

+			return bpmnDiagrams.get(i);

+		}

+		return null;

+	}

+	

+	private void updateTabs() {

+		if (!tabFolder.getLayoutDeferred()) {

+			if (tabFolder.getItemCount()==1) {

+				tabFolder.setTabHeight(0);

+			}

+			else

+				tabFolder.setTabHeight(defaultTabHeight);

+		}

+		tabFolder.layout();

+	}

+	

+	public CTabFolder getTabFolder() {

+		return tabFolder;

+	}

+	

+	/* (non-Javadoc)

+	 * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)

+	 */

+	@Override

+	public void doSave(IProgressMonitor monitor) {

+		designEditor.doSave(monitor);

+	}

+

+	/* (non-Javadoc)

+	 * @see org.eclipse.ui.part.EditorPart#doSaveAs()

+	 */

+	@Override

+	public void doSaveAs() {

+		IEditorPart activeEditor = getActiveEditor();

+		activeEditor.doSaveAs();

+	}

+

+	/* (non-Javadoc)

+	 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()

+	 */

+	@Override

+	public boolean isSaveAsAllowed() {

+		

+		/* 

+		 * Depending upon the active page in multipage editor, call the saveAsAllowed. 

+		 * It helps to see whether a particular editor allows 'save as' feature 

+		 */

+		IEditorPart activeEditor = getActiveEditor();

+		return activeEditor.isSaveAsAllowed();

+	}

+

+	@Override

+	public void dispose() {

+		designEditor.dispose();

+		if (sourceViewer!=null)

+			sourceViewer.dispose();

+	}

+}

diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2PersistencyBehavior.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2PersistencyBehavior.java
deleted file mode 100644
index 5aa95e9..0000000
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2PersistencyBehavior.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.eclipse.bpmn2.modeler.ui.editor;
-
-import java.util.Arrays;
-
-import org.eclipse.bpmn2.modeler.core.validation.BPMN2ProjectValidator;
-import org.eclipse.bpmn2.modeler.core.validation.BPMN2ValidationStatusLoader;
-import org.eclipse.bpmn2.modeler.ui.Activator;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.graphiti.mm.pictograms.Diagram;
-import org.eclipse.graphiti.ui.editor.DefaultPersistencyBehavior;
-import org.eclipse.graphiti.ui.editor.DiagramEditor;
-
-public class BPMN2PersistencyBehavior extends DefaultPersistencyBehavior {
-
-	BPMN2Editor editor;
-	
-	public BPMN2PersistencyBehavior(DiagramEditor diagramEditor) {
-		super(diagramEditor);
-		editor = (BPMN2Editor)diagramEditor;
-	}
-    @Override
-    public Diagram loadDiagram(URI modelUri) {
-    	Diagram diagram = super.loadDiagram(modelUri);
-
-    	return diagram;
-    }
-
-}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java
index c4df3e5..fde041b 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java
@@ -420,7 +420,7 @@
 
 	@Override
 	protected ContextMenuProvider createContextMenuProvider() {
-		return new DiagramEditorContextMenuProvider(getGraphicalViewer(), getActionRegistry(), getDiagramTypeProvider()) {
+		return new DiagramEditorContextMenuProvider(getGraphicalViewer(), getActionRegistry(), getConfigurationProvider()) {
 			@Override
 			public void buildContextMenu(IMenuManager manager) {
 				super.buildContextMenu(manager);
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/Bpmn2DiagramEditorInput.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/Bpmn2DiagramEditorInput.java
index d47155b..229630b 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/Bpmn2DiagramEditorInput.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/Bpmn2DiagramEditorInput.java
@@ -1,104 +1,110 @@
-/******************************************************************************* 
- * Copyright (c) 2011 Red Hat, Inc. 
- *  All rights reserved. 
- * This program is 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: 
- * Red Hat, Inc. - initial API and implementation 
- *
- * @author Innar Made
- ******************************************************************************/
-package org.eclipse.bpmn2.modeler.ui.wizards;
-
-import org.eclipse.bpmn2.di.BPMNDiagram;
-import org.eclipse.bpmn2.modeler.core.utils.ModelUtil.Bpmn2DiagramType;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.graphiti.ui.editor.DiagramEditorInput;
-import org.eclipse.ui.part.FileEditorInput;
-
-public final class Bpmn2DiagramEditorInput extends DiagramEditorInput {
-
-	private final TransactionalEditingDomain domain;
-	private Bpmn2DiagramType initialDiagramType = Bpmn2DiagramType.NONE;
-	private String targetNamespace;
-	private BPMNDiagram bpmnDiagram;
-	private URI modelUri;
-	
-	Bpmn2DiagramEditorInput(URI modelUri, URI diagramUri, TransactionalEditingDomain domain, String providerId) {
-		super(diagramUri, providerId);
-		this.domain = domain;
-		this.modelUri = modelUri;
-	}
-	
-	public Bpmn2DiagramType getInitialDiagramType() {
-		return initialDiagramType;
-	}
-
-	public void setInitialDiagramType(Bpmn2DiagramType initialDiagramType) {
-		this.initialDiagramType = initialDiagramType;
-	}
-
-	public String getTargetNamespace() {
-		return targetNamespace;
-	}
-
-	public void setTargetNamespace(String targetNamespace) {
-		this.targetNamespace = targetNamespace;
-	}
-
-	public URI  getModelUri() {
-		return modelUri;
-	}
-	
-	public String getToolTipText() {
-		return modelUri.toPlatformString(true);
-	}
-	
-	public String getName() {
-		return URI.decode(modelUri.trimFileExtension().lastSegment());
-	}
-	
-	public void updateUri(URI diagramFileUri) {
-		if (diagramFileUri.isPlatformResource()) {
-			modelUri = diagramFileUri;
-		}
-		else
-			super.updateUri(diagramFileUri);
-	}
-	
-	@Override
-	public boolean equals(Object obj) {
-		boolean superEquals = super.equals(obj);
-		if (superEquals) {
-			return true;
-		}
-
-		// Eclipse makes FileEditorInputs for files to be opened. Here we check if the file is actually the same
-		// as the DiagramEditorInput uses. This is for preventing opening new editors for the same file.
-		if (obj instanceof FileEditorInput) {
-
-			String path = ((FileEditorInput) obj).getFile().getFullPath().toString();
-			URI platformUri = URI.createPlatformResourceURI(path, true);
-
-			for (Resource resource : domain.getResourceSet().getResources()) {
-				if (resource.getURI().equals(platformUri)) {
-					return true;
-				}
-			}
-
-		}
-		return false;
-	}
-
-	public BPMNDiagram getBpmnDiagram() {
-		return bpmnDiagram;
-	}
-
-	public void setBpmnDiagram(BPMNDiagram bpmnDiagram) {
-		this.bpmnDiagram = bpmnDiagram;
-	}
+/******************************************************************************* 

+ * Copyright (c) 2011 Red Hat, Inc. 

+ *  All rights reserved. 

+ * This program is 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: 

+ * Red Hat, Inc. - initial API and implementation 

+ *

+ * @author Innar Made

+ ******************************************************************************/

+package org.eclipse.bpmn2.modeler.ui.wizards;

+

+import org.eclipse.bpmn2.di.BPMNDiagram;

+import org.eclipse.bpmn2.modeler.core.utils.ModelUtil.Bpmn2DiagramType;

+import org.eclipse.emf.common.util.URI;

+import org.eclipse.emf.ecore.resource.Resource;

+import org.eclipse.emf.transaction.TransactionalEditingDomain;

+import org.eclipse.graphiti.ui.editor.DiagramEditorInput;

+import org.eclipse.ui.part.FileEditorInput;

+

+public final class Bpmn2DiagramEditorInput extends DiagramEditorInput {

+

+	private final TransactionalEditingDomain domain;

+	private Bpmn2DiagramType initialDiagramType = Bpmn2DiagramType.NONE;

+	private String targetNamespace;

+	private BPMNDiagram bpmnDiagram;

+	private URI modelUri;

+	private URI diagramUri;

+	

+	Bpmn2DiagramEditorInput(URI modelUri, URI diagramUri, TransactionalEditingDomain domain, String providerId) {

+		super(diagramUri.appendFragment("/0"), domain, providerId);

+		this.domain = domain;

+		this.modelUri = modelUri;

+		this.diagramUri = diagramUri;

+	}

+	

+	public Bpmn2DiagramType getInitialDiagramType() {

+		return initialDiagramType;

+	}

+

+	public void setInitialDiagramType(Bpmn2DiagramType initialDiagramType) {

+		this.initialDiagramType = initialDiagramType;

+	}

+

+	public String getTargetNamespace() {

+		return targetNamespace;

+	}

+

+	public void setTargetNamespace(String targetNamespace) {

+		this.targetNamespace = targetNamespace;

+	}

+

+	public URI  getModelUri() {

+		return modelUri;

+	}

+	

+	public URI getUri() {

+		return diagramUri;

+	}

+	

+	public String getToolTipText() {

+		return modelUri.toPlatformString(true);

+	}

+	

+	public String getName() {

+		return URI.decode(modelUri.trimFileExtension().lastSegment());

+	}

+	

+	public void updateUri(URI diagramFileUri) {

+		if (diagramFileUri.isPlatformResource()) {

+			modelUri = diagramFileUri;

+		}

+//		else

+//			super.updateUri(diagramFileUri);

+	}

+	

+	@Override

+	public boolean equals(Object obj) {

+		boolean superEquals = super.equals(obj);

+		if (superEquals) {

+			return true;

+		}

+

+		// Eclipse makes FileEditorInputs for files to be opened. Here we check if the file is actually the same

+		// as the DiagramEditorInput uses. This is for preventing opening new editors for the same file.

+		if (obj instanceof FileEditorInput) {

+

+			String path = ((FileEditorInput) obj).getFile().getFullPath().toString();

+			URI platformUri = URI.createPlatformResourceURI(path, true);

+

+			for (Resource resource : domain.getResourceSet().getResources()) {

+				if (resource.getURI().equals(platformUri)) {

+					return true;

+				}

+			}

+

+		}

+		return false;

+	}

+

+	public BPMNDiagram getBpmnDiagram() {

+		return bpmnDiagram;

+	}

+

+	public void setBpmnDiagram(BPMNDiagram bpmnDiagram) {

+		this.bpmnDiagram = bpmnDiagram;

+	}

 }
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/FileService.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/FileService.java
index 1fb2a39..7596213 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/FileService.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/wizards/FileService.java
@@ -1,374 +1,378 @@
-/******************************************************************************* 
- * Copyright (c) 2011 Red Hat, Inc. 
- *  All rights reserved. 
- * This program is 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: 
- * Red Hat, Inc. - initial API and implementation 
- *
- * @author Innar Made
- ******************************************************************************/
-package org.eclipse.bpmn2.modeler.ui.wizards;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerResourceSetImpl;
-import org.eclipse.bpmn2.modeler.ui.Activator;
-import org.eclipse.bpmn2.modeler.ui.editor.BPMN2Editor;
-import org.eclipse.core.commands.operations.DefaultOperationHistory;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.command.CommandStack;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
-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;
-import org.eclipse.emf.transaction.RecordingCommand;
-import org.eclipse.emf.transaction.Transaction;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;
-import org.eclipse.emf.transaction.util.TransactionUtil;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.workspace.WorkspaceEditingDomainFactory;
-import org.eclipse.graphiti.mm.pictograms.Diagram;
-import org.eclipse.emf.workspace.IWorkspaceCommandStack;
-import org.eclipse.graphiti.ui.editor.DiagramEditorInput;
-import org.eclipse.graphiti.ui.internal.editor.GFWorkspaceCommandStackImpl;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IStorageEditorInput;
-import org.eclipse.ui.part.FileEditorInput;
-
-public class FileService {
-
-	public static TransactionalEditingDomain createEmfFileForDiagram(URI diagramResourceUri, final Diagram diagram, BPMN2Editor diagramEditor) {
-
-		ResourceSet resourceSet = null;
-		TransactionalEditingDomain editingDomain = null;
-		if (diagramEditor==null) {
-			// Create a resource set and EditingDomain
-			resourceSet = new Bpmn2ModelerResourceSetImpl();
-			editingDomain = TransactionUtil.getEditingDomain(resourceSet);
-			if (editingDomain == null) {
-				// Not yet existing, create one
-				editingDomain = TransactionalEditingDomain.Factory.INSTANCE.createEditingDomain(resourceSet);
-			}
-		}
-		else {
-			editingDomain = diagramEditor.getEditingDomain();
-			resourceSet = diagramEditor.getResourceSet();
-		}
-		
-		// Create a resource for this file.
-		final Resource resource = resourceSet.createResource(diagramResourceUri);
-		CommandStack commandStack = editingDomain.getCommandStack();
-		commandStack.execute(new RecordingCommand(editingDomain) {
-
-			@Override
-			protected void doExecute() {
-				resource.setTrackingModification(true);
-				resource.getContents().add(diagram);
-
-			}
-		});
-
-		save(editingDomain, Collections.<Resource, Map<?, ?>> emptyMap());
-		return editingDomain;
-	}
-
-	private static void save(TransactionalEditingDomain editingDomain, Map<Resource, Map<?, ?>> options) {
-		saveInWorkspaceRunnable(editingDomain, options);
-	}
-
-	private static void saveInWorkspaceRunnable(final TransactionalEditingDomain editingDomain,
-			final Map<Resource, Map<?, ?>> options) {
-
-		final Map<URI, Throwable> failedSaves = new HashMap<URI, Throwable>();
-		final IWorkspaceRunnable wsRunnable = new IWorkspaceRunnable() {
-			@Override
-			public void run(final IProgressMonitor monitor) throws CoreException {
-
-				final Runnable runnable = new Runnable() {
-
-					@Override
-					public void run() {
-						Transaction parentTx;
-						if (editingDomain != null
-								&& (parentTx = ((TransactionalEditingDomainImpl) editingDomain).getActiveTransaction()) != null) {
-							do {
-								if (!parentTx.isReadOnly()) {
-									throw new IllegalStateException(
-											"FileService.save() called from within a command (likely produces a deadlock)"); //$NON-NLS-1$
-								}
-							} while ((parentTx = ((TransactionalEditingDomainImpl) editingDomain)
-									.getActiveTransaction().getParent()) != null);
-						}
-
-						final EList<Resource> resources = editingDomain.getResourceSet().getResources();
-						// Copy list to an array to prevent
-						// ConcurrentModificationExceptions
-						// during the saving of the dirty resources
-						Resource[] resourcesArray = new Resource[resources.size()];
-						resourcesArray = resources.toArray(resourcesArray);
-						final Set<Resource> savedResources = new HashSet<Resource>();
-						for (int i = 0; i < resourcesArray.length; i++) {
-							// In case resource modification tracking is
-							// switched on, we can check if a resource
-							// has been modified, so that we only need to same
-							// really changed resources; otherwise
-							// we need to save all resources in the set
-							final Resource resource = resourcesArray[i];
-							if (resource.isModified()) {
-								try {
-									resource.save(options.get(resource));
-									savedResources.add(resource);
-								} catch (final Throwable t) {
-									failedSaves.put(resource.getURI(), t);
-								}
-							}
-						}
-					}
-				};
-
-				try {
-					editingDomain.runExclusive(runnable);
-				} catch (final InterruptedException e) {
-					throw new RuntimeException(e);
-				}
-				editingDomain.getCommandStack().flush();
-			}
-		};
-		try {
-			ResourcesPlugin.getWorkspace().run(wsRunnable, null);
-			if (!failedSaves.isEmpty()) {
-				throw new WrappedException(createMessage(failedSaves), new RuntimeException());
-			}
-		} catch (final CoreException e) {
-			final Throwable cause = e.getStatus().getException();
-			if (cause instanceof RuntimeException) {
-				throw (RuntimeException) cause;
-			}
-			throw new RuntimeException(e);
-		}
-	}
-
-	private static String createMessage(Map<URI, Throwable> failedSaves) {
-		final StringBuilder buf = new StringBuilder("The following resources could not be saved:");
-		for (final Entry<URI, Throwable> entry : failedSaves.entrySet()) {
-			buf.append("\nURI: ").append(entry.getKey().toString()).append(", cause: \n")
-					.append(getExceptionAsString(entry.getValue()));
-		}
-		return buf.toString();
-	}
-
-	private static String getExceptionAsString(Throwable t) {
-		final StringWriter stringWriter = new StringWriter();
-		final PrintWriter printWriter = new PrintWriter(stringWriter);
-		t.printStackTrace(printWriter);
-		final String result = stringWriter.toString();
-		try {
-			stringWriter.close();
-		} catch (final IOException e) {
-			// $JL-EXC$ ignore
-		}
-		printWriter.close();
-		return result;
-	}
-
-	public static InputStream getInputContents(IEditorInput input) {
-		try {
-			if (input instanceof Bpmn2DiagramEditorInput) {
-				URI uri = getInputUri(input);
-				String fileName = null;
-				if (uri.isFile())
-					fileName = uri.toFileString();
-				else if (uri.isPlatformResource())
-					fileName = uri.toPlatformString(false);
-				
-				File file = new File(fileName);
-				if (file.exists()) {
-					InputStream is = new FileInputStream(file);
-					return is;
-				}
-			} else if (input instanceof FileEditorInput) {
-				return ((FileEditorInput) input).getFile().getContents();
-			} else if (input instanceof IStorageEditorInput) {
-				return ((IStorageEditorInput) input).getStorage().getContents();
-			}
-		} catch (Exception e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		
-		return null;
-	}
-	
-	public static URI getInputUri(IEditorInput input) {
-		if (input instanceof Bpmn2DiagramEditorInput) {
-			URI uri = ((Bpmn2DiagramEditorInput) input).getModelUri();
-			return uri.trimFragment();
-		} else if (input instanceof FileEditorInput) {
-			IPath path =  ((FileEditorInput) input).getFile().getFullPath();
-			return URI.createPlatformResourceURI(path.toString(), true);
-		} else if (input instanceof IStorageEditorInput) {
-			IStorageEditorInput sei = (IStorageEditorInput) input;
-
-			try {
-				IPath path = sei.getStorage().getFullPath();
-				if (path!=null)
-					return URI.createPlatformResourceURI(path.toString(), true);
-
-				// the input is not a local file. Create a temp file and copy its contents
-				String name = sei.getStorage().getName();
-				InputStream istream = sei.getStorage().getContents();
-				File file = createTempFile(name, istream);
-				return URI.createFileURI(file.getPath());
-			}
-			catch (Exception e) {
-			}
-		}
-		return null;
-	}
-	
-	public static String createTempName(String name) {
-		String tempDir = System.getProperty("java.io.tmpdir");
-		if (!tempDir.endsWith(File.separator))
-			tempDir += File.separator;
-		String tempName = tempDir + name + "." + EcoreUtil.generateUUID();
-		return tempName;
-	}
-	
-	public static File createTempFile(String name) {
-		return createTempFile(name,null);
-	}
-	
-	public static File createTempFile(String name, InputStream istream) {
-		File tempFile = null;
-		try {
-			tempFile = File.createTempFile(name, ".bpmn");
-			if (istream!=null) {
-				OutputStream ostream = new FileOutputStream(tempFile);
-	
-				int read = 0;
-				byte[] bytes = new byte[1024];
-	
-				while ((read = istream.read(bytes)) != -1) {
-					ostream.write(bytes, 0, read);
-				}
-	
-				istream.close();
-
-				ostream.flush();
-				ostream.close();
-			}
-		} catch (Exception e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		return tempFile;
-	}
-	
-	public static boolean isTempFile(URI uri) {
-		String tempDir = System.getProperty("java.io.tmpdir");
-		String uriDir = uri.trimFragment().trimSegments(1).devicePath();
-		return tempDir!=null && tempDir.compareToIgnoreCase(uriDir)==0;
-	}
-	
-	public static void deleteTempFile(URI uri) {
-		File file = new File(uri.toFileString());
-		if (file.exists())
-			file.delete();
-	}
-	
-//	public static IFile getFileFromInput(IEditorSite site, IEditorInput input) {
-//		if (input instanceof DiagramEditorInput) {
-//			URI uri = ((DiagramEditorInput) input).getUri();
-//			String uriString = uri.trimFragment().toPlatformString(true);
-//			return BPMN2DiagramCreator.getModelFile(new Path(uriString));
-//		} else if (input instanceof FileEditorInput) {
-//			return ((FileEditorInput) input).getFile();
-//		} else if (input instanceof IStorageEditorInput) {
-//			IStorageEditorInput sei = (IStorageEditorInput) input;
-//
-//			try {
-//				String name = sei.getStorage().getName();
-//				InputStream istream = sei.getStorage().getContents();
-//
-//				// Object sel = site.getPage().getSelection();
-//				File tempFile = File.createTempFile(name, ".bpmn");
-//				OutputStream ostream = new FileOutputStream(tempFile);
-//
-//				int read = 0;
-//				byte[] bytes = new byte[1024];
-//
-//				while ((read = istream.read(bytes)) != -1) {
-//					ostream.write(bytes, 0, read);
-//				}
-//
-//				istream.close();
-//				ostream.flush();
-//				ostream.close();
-//
-//				IProject project = createTempProject();
-//				IPath location = new Path(tempFile.getAbsolutePath());
-//				IFile workspaceFile = project.getFile(location.lastSegment());
-//				workspaceFile.createLink(location, IResource.NONE, null);
-//				return workspaceFile;
-//				// return new FileEditorInput(workspaceFile);
-//			} catch (Exception e) {
-//				// TODO Auto-generated catch block
-//				e.printStackTrace();
-//			}
-//		}
-//
-//		return null;
-//	}
-//	
-//	public static IProject getTempProject() {
-//		IWorkspace ws = ResourcesPlugin.getWorkspace();
-//		IProject project = ws.getRoot().getProject(".bpmn2.modeler.temp");
-//		return project;
-//	}
-//	
-//	public static IProject createTempProject() {
-//		try {
-//			IProject project = getTempProject();
-//			if (!project.exists())
-//				project.create(null);
-//			if (!project.isOpen())
-//				project.open(null);
-//			return project;
-//		}
-//		catch (Exception e) {
-//			Activator.logError(e);
-//		}
-//		return null;
-//	}
-}
+/******************************************************************************* 

+ * Copyright (c) 2011 Red Hat, Inc. 

+ *  All rights reserved. 

+ * This program is 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: 

+ * Red Hat, Inc. - initial API and implementation 

+ *

+ * @author Innar Made

+ ******************************************************************************/

+package org.eclipse.bpmn2.modeler.ui.wizards;

+

+import java.io.File;

+import java.io.FileInputStream;

+import java.io.FileNotFoundException;

+import java.io.FileOutputStream;

+import java.io.IOException;

+import java.io.InputStream;

+import java.io.OutputStream;

+import java.io.PrintWriter;

+import java.io.StringWriter;

+import java.util.Collections;

+import java.util.HashMap;

+import java.util.HashSet;

+import java.util.Map;

+import java.util.Map.Entry;

+import java.util.Set;

+

+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerResourceSetImpl;

+import org.eclipse.bpmn2.modeler.ui.Activator;

+import org.eclipse.bpmn2.modeler.ui.editor.BPMN2Editor;

+import org.eclipse.core.commands.operations.DefaultOperationHistory;

+import org.eclipse.core.resources.IFile;

+import org.eclipse.core.resources.IProject;

+import org.eclipse.core.resources.IResource;

+import org.eclipse.core.resources.IWorkspace;

+import org.eclipse.core.resources.IWorkspaceRunnable;

+import org.eclipse.core.resources.ResourcesPlugin;

+import org.eclipse.core.runtime.CoreException;

+import org.eclipse.core.runtime.IPath;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.core.runtime.Path;

+import org.eclipse.emf.common.command.CommandStack;

+import org.eclipse.emf.common.util.EList;

+import org.eclipse.emf.common.util.URI;

+import org.eclipse.emf.common.util.WrappedException;

+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;

+import org.eclipse.emf.transaction.RecordingCommand;

+import org.eclipse.emf.transaction.Transaction;

+import org.eclipse.emf.transaction.TransactionalEditingDomain;

+import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;

+import org.eclipse.emf.transaction.util.TransactionUtil;

+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;

+import org.eclipse.emf.workspace.WorkspaceEditingDomainFactory;

+import org.eclipse.graphiti.mm.pictograms.Diagram;

+import org.eclipse.graphiti.ui.editor.DiagramEditorFactory;

+import org.eclipse.emf.workspace.IWorkspaceCommandStack;

+import org.eclipse.graphiti.ui.editor.DiagramEditorInput;

+import org.eclipse.graphiti.ui.internal.editor.GFWorkspaceCommandStackImpl;

+import org.eclipse.ui.IEditorInput;

+import org.eclipse.ui.IEditorSite;

+import org.eclipse.ui.IStorageEditorInput;

+import org.eclipse.ui.part.FileEditorInput;

+

+public class FileService {

+

+	public static class MyDiagramEditorFactory extends DiagramEditorFactory {

+		public static TransactionalEditingDomain createResourceSetAndEditingDomain() {

+			final ResourceSet resourceSet = new Bpmn2ModelerResourceSetImpl();

+			final IWorkspaceCommandStack workspaceCommandStack = new GFWorkspaceCommandStackImpl(new DefaultOperationHistory());

+

+			final TransactionalEditingDomainImpl editingDomain = new TransactionalEditingDomainImpl(new ComposedAdapterFactory(

+					ComposedAdapterFactory.Descriptor.Registry.INSTANCE), workspaceCommandStack, resourceSet);

+			WorkspaceEditingDomainFactory.INSTANCE.mapResourceSet(editingDomain);

+			return editingDomain;

+		}

+	}

+	

+	public static TransactionalEditingDomain createEmfFileForDiagram(URI diagramResourceUri, final Diagram diagram, BPMN2Editor diagramEditor) {

+

+		ResourceSet resourceSet = null;

+		TransactionalEditingDomain editingDomain = null;

+		

+		// Create a resource set and EditingDomain

+		editingDomain = MyDiagramEditorFactory.createResourceSetAndEditingDomain();

+		resourceSet = editingDomain.getResourceSet();

+		

+		// Create a resource for this file.

+		final Resource resource = resourceSet.createResource(diagramResourceUri);

+		CommandStack commandStack = editingDomain.getCommandStack();

+		commandStack.execute(new RecordingCommand(editingDomain) {

+

+			@Override

+			protected void doExecute() {

+				resource.setTrackingModification(true);

+				resource.getContents().add(diagram);

+

+			}

+		});

+

+		save(editingDomain, Collections.<Resource, Map<?, ?>> emptyMap());

+		return editingDomain;

+	}

+

+	private static void save(TransactionalEditingDomain editingDomain, Map<Resource, Map<?, ?>> options) {

+		saveInWorkspaceRunnable(editingDomain, options);

+	}

+

+	private static void saveInWorkspaceRunnable(final TransactionalEditingDomain editingDomain,

+			final Map<Resource, Map<?, ?>> options) {

+

+		final Map<URI, Throwable> failedSaves = new HashMap<URI, Throwable>();

+		final IWorkspaceRunnable wsRunnable = new IWorkspaceRunnable() {

+			@Override

+			public void run(final IProgressMonitor monitor) throws CoreException {

+

+				final Runnable runnable = new Runnable() {

+

+					@Override

+					public void run() {

+						Transaction parentTx;

+						if (editingDomain != null

+								&& (parentTx = ((TransactionalEditingDomainImpl) editingDomain).getActiveTransaction()) != null) {

+							do {

+								if (!parentTx.isReadOnly()) {

+									throw new IllegalStateException(

+											"FileService.save() called from within a command (likely produces a deadlock)"); //$NON-NLS-1$

+								}

+							} while ((parentTx = ((TransactionalEditingDomainImpl) editingDomain)

+									.getActiveTransaction().getParent()) != null);

+						}

+

+						final EList<Resource> resources = editingDomain.getResourceSet().getResources();

+						// Copy list to an array to prevent

+						// ConcurrentModificationExceptions

+						// during the saving of the dirty resources

+						Resource[] resourcesArray = new Resource[resources.size()];

+						resourcesArray = resources.toArray(resourcesArray);

+						final Set<Resource> savedResources = new HashSet<Resource>();

+						for (int i = 0; i < resourcesArray.length; i++) {

+							// In case resource modification tracking is

+							// switched on, we can check if a resource

+							// has been modified, so that we only need to same

+							// really changed resources; otherwise

+							// we need to save all resources in the set

+							final Resource resource = resourcesArray[i];

+							if (resource.isModified()) {

+								try {

+									resource.save(options.get(resource));

+									savedResources.add(resource);

+								} catch (final Throwable t) {

+									failedSaves.put(resource.getURI(), t);

+								}

+							}

+						}

+					}

+				};

+

+				try {

+					editingDomain.runExclusive(runnable);

+				} catch (final InterruptedException e) {

+					throw new RuntimeException(e);

+				}

+				editingDomain.getCommandStack().flush();

+			}

+		};

+		try {

+			ResourcesPlugin.getWorkspace().run(wsRunnable, null);

+			if (!failedSaves.isEmpty()) {

+				throw new WrappedException(createMessage(failedSaves), new RuntimeException());

+			}

+		} catch (final CoreException e) {

+			final Throwable cause = e.getStatus().getException();

+			if (cause instanceof RuntimeException) {

+				throw (RuntimeException) cause;

+			}

+			throw new RuntimeException(e);

+		}

+	}

+

+	private static String createMessage(Map<URI, Throwable> failedSaves) {

+		final StringBuilder buf = new StringBuilder("The following resources could not be saved:");

+		for (final Entry<URI, Throwable> entry : failedSaves.entrySet()) {

+			buf.append("\nURI: ").append(entry.getKey().toString()).append(", cause: \n")

+					.append(getExceptionAsString(entry.getValue()));

+		}

+		return buf.toString();

+	}

+

+	private static String getExceptionAsString(Throwable t) {

+		final StringWriter stringWriter = new StringWriter();

+		final PrintWriter printWriter = new PrintWriter(stringWriter);

+		t.printStackTrace(printWriter);

+		final String result = stringWriter.toString();

+		try {

+			stringWriter.close();

+		} catch (final IOException e) {

+			// $JL-EXC$ ignore

+		}

+		printWriter.close();

+		return result;

+	}

+

+	public static InputStream getInputContents(IEditorInput input) {

+		try {

+			if (input instanceof Bpmn2DiagramEditorInput) {

+				URI uri = getInputUri(input);

+				String fileName = null;

+				if (uri.isFile())

+					fileName = uri.toFileString();

+				else if (uri.isPlatformResource())

+					fileName = uri.toPlatformString(false);

+				

+				File file = new File(fileName);

+				if (file.exists()) {

+					InputStream is = new FileInputStream(file);

+					return is;

+				}

+			} else if (input instanceof FileEditorInput) {

+				return ((FileEditorInput) input).getFile().getContents();

+			} else if (input instanceof IStorageEditorInput) {

+				return ((IStorageEditorInput) input).getStorage().getContents();

+			}

+		} catch (Exception e) {

+			// TODO Auto-generated catch block

+			e.printStackTrace();

+		}

+		

+		return null;

+	}

+	

+	public static URI getInputUri(IEditorInput input) {

+		if (input instanceof Bpmn2DiagramEditorInput) {

+			URI uri = ((Bpmn2DiagramEditorInput) input).getModelUri();

+			return uri.trimFragment();

+		} else if (input instanceof FileEditorInput) {

+			IPath path =  ((FileEditorInput) input).getFile().getFullPath();

+			return URI.createPlatformResourceURI(path.toString(), true);

+		} else if (input instanceof IStorageEditorInput) {

+			IStorageEditorInput sei = (IStorageEditorInput) input;

+

+			try {

+				IPath path = sei.getStorage().getFullPath();

+				if (path!=null)

+					return URI.createPlatformResourceURI(path.toString(), true);

+

+				// the input is not a local file. Create a temp file and copy its contents

+				String name = sei.getStorage().getName();

+				InputStream istream = sei.getStorage().getContents();

+				File file = createTempFile(name, istream);

+				return URI.createFileURI(file.getPath());

+			}

+			catch (Exception e) {

+			}

+		}

+		return null;

+	}

+	

+	public static String createTempName(String name) {

+		String tempDir = System.getProperty("java.io.tmpdir");

+		if (!tempDir.endsWith(File.separator))

+			tempDir += File.separator;

+		String tempName = tempDir + name + "." + EcoreUtil.generateUUID();

+		return tempName;

+	}

+	

+	public static File createTempFile(String name) {

+		return createTempFile(name,null);

+	}

+	

+	public static File createTempFile(String name, InputStream istream) {

+		File tempFile = null;

+		try {

+			tempFile = File.createTempFile(name, ".bpmn");

+			if (istream!=null) {

+				OutputStream ostream = new FileOutputStream(tempFile);

+	

+				int read = 0;

+				byte[] bytes = new byte[1024];

+	

+				while ((read = istream.read(bytes)) != -1) {

+					ostream.write(bytes, 0, read);

+				}

+	

+				istream.close();

+

+				ostream.flush();

+				ostream.close();

+			}

+		} catch (Exception e) {

+			// TODO Auto-generated catch block

+			e.printStackTrace();

+		}

+		return tempFile;

+	}

+	

+	public static boolean isTempFile(URI uri) {

+		String tempDir = System.getProperty("java.io.tmpdir");

+		String uriDir = uri.trimFragment().trimSegments(1).devicePath();

+		return tempDir!=null && tempDir.compareToIgnoreCase(uriDir)==0;

+	}

+	

+	public static void deleteTempFile(URI uri) {

+		File file = new File(uri.toFileString());

+		if (file.exists())

+			file.delete();

+	}

+	

+//	public static IFile getFileFromInput(IEditorSite site, IEditorInput input) {

+//		if (input instanceof DiagramEditorInput) {

+//			URI uri = ((DiagramEditorInput) input).getUri();

+//			String uriString = uri.trimFragment().toPlatformString(true);

+//			return BPMN2DiagramCreator.getModelFile(new Path(uriString));

+//		} else if (input instanceof FileEditorInput) {

+//			return ((FileEditorInput) input).getFile();

+//		} else if (input instanceof IStorageEditorInput) {

+//			IStorageEditorInput sei = (IStorageEditorInput) input;

+//

+//			try {

+//				String name = sei.getStorage().getName();

+//				InputStream istream = sei.getStorage().getContents();

+//

+//				// Object sel = site.getPage().getSelection();

+//				File tempFile = File.createTempFile(name, ".bpmn");

+//				OutputStream ostream = new FileOutputStream(tempFile);

+//

+//				int read = 0;

+//				byte[] bytes = new byte[1024];

+//

+//				while ((read = istream.read(bytes)) != -1) {

+//					ostream.write(bytes, 0, read);

+//				}

+//

+//				istream.close();

+//				ostream.flush();

+//				ostream.close();

+//

+//				IProject project = createTempProject();

+//				IPath location = new Path(tempFile.getAbsolutePath());

+//				IFile workspaceFile = project.getFile(location.lastSegment());

+//				workspaceFile.createLink(location, IResource.NONE, null);

+//				return workspaceFile;

+//				// return new FileEditorInput(workspaceFile);

+//			} catch (Exception e) {

+//				// TODO Auto-generated catch block

+//				e.printStackTrace();

+//			}

+//		}

+//

+//		return null;

+//	}

+//	

+//	public static IProject getTempProject() {

+//		IWorkspace ws = ResourcesPlugin.getWorkspace();

+//		IProject project = ws.getRoot().getProject(".bpmn2.modeler.temp");

+//		return project;

+//	}

+//	

+//	public static IProject createTempProject() {

+//		try {

+//			IProject project = getTempProject();

+//			if (!project.exists())

+//				project.create(null);

+//			if (!project.isOpen())

+//				project.open(null);

+//			return project;

+//		}

+//		catch (Exception e) {

+//			Activator.logError(e);

+//		}

+//		return null;

+//	}

+}

diff --git a/org.eclipse.bpmn2.modeler.updatesite.feature/associate.properties b/org.eclipse.bpmn2.modeler.updatesite.feature/associate.properties
index 1a94f7d..c9784fe 100644
--- a/org.eclipse.bpmn2.modeler.updatesite.feature/associate.properties
+++ b/org.eclipse.bpmn2.modeler.updatesite.feature/associate.properties
@@ -1,4 +1,4 @@
-# associate site(s) - use comma to separate list - to add to the resulting repo 
-# TODO: change bpmn2 metamodel download location as soon as an official update site is available
-# https://hudson.eclipse.org/hudson/job/bpmn2-nightly/ws/org.eclipse.bpmn2.site/target/site/ should point to an download.eclipse.org update site 
-associate.sites=http://download.eclipse.org/graphiti/updates/0.9.0/,https://hudson.eclipse.org/hudson/job/bpmn2-nightly/lastSuccessfulBuild/artifact/org.eclipse.bpmn2.site/target/site/,http://download.eclipse.org/bpmn2-modeler/site/,http://download.eclipse.org/bpel/site/,http://download.eclipse.org/releases/indigo,http://download.eclipse.org/eclipse/updates/3.7
+# associate site(s) - use comma to separate list - to add to the resulting repo 

+# TODO: change bpmn2 metamodel download location as soon as an official update site is available

+# https://hudson.eclipse.org/hudson/job/bpmn2-nightly/ws/org.eclipse.bpmn2.site/target/site/ should point to an download.eclipse.org update site 

+associate.sites=http://download.eclipse.org/graphiti/updates/0.8.2/,https://hudson.eclipse.org/hudson/job/bpmn2-nightly/lastSuccessfulBuild/artifact/org.eclipse.bpmn2.site/target/site/,http://download.eclipse.org/bpmn2-modeler/site/,http://download.eclipse.org/bpel/site/,http://download.eclipse.org/releases/helios,http://download.eclipse.org/eclipse/updates/3.6

diff --git a/pom.xml b/pom.xml
index d2872bf..8d412fb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,247 +1,247 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-
-	<prerequisites>
-		<maven>3.0</maven>
-	</prerequisites>
-
-	<groupId>org.eclipse.bpmn2.modeler</groupId>
-	<artifactId>org.eclipse.bpmn2.modeler.parent</artifactId>
-	<version>0.0.1-SNAPSHOT</version>
-	<packaging>pom</packaging>
-
-	<name>BPMN2 Modeler Parent</name>
-	<description>Parent POM for the Eclipse BPMN2 Modeler Project</description>
-
-	<licenses>
-		<license>
-			<name>Eclipse Public License v1.0</name>
-			<comments>
-       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.htm
-      </comments>
-		</license>
-	</licenses>
-
-	<properties>
-		<tycho-version>0.13.0</tycho-version>
-	</properties>
-
-	<profiles>
-		<profile>
-			<id>platform-helios</id>
-			<activation>
-				<property>
-					<name>platform-version-name</name>
-					<value>helios</value>
-				</property>
-			</activation>
-			<properties>
-				<eclipse-site>http://download.eclipse.org/releases/helios</eclipse-site>
-				<platform-version>[3.6,3.7)</platform-version>
-			</properties>
-		</profile>
-		<profile>
-			<id>platform-indigo</id>
-			<activation>
-				<property>
-					<name>platform-version-name</name>
-					<value>indigo</value>
-				</property>
-			</activation>
-			<properties>
-				<eclipse-site>http://download.eclipse.org/releases/indigo</eclipse-site>
-				<platform-version>[3.7,3.8)</platform-version>
-			</properties>
-		</profile>
-	</profiles>
-
-	<modules>
-		<module>org.eclipse.bpmn2.modeler.core</module>
-		<module>org.eclipse.bpmn2.modeler.ui</module>
-		<module>org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5</module>
-		<module>org.eclipse.bpmn2.modeler.feature</module>
-		<module>org.eclipse.bpmn2.modeler.updatesite.feature</module>
-	</modules>
-
-	<repositories>
-		<repository>
-			<id>eclipse-platform</id>
-			<layout>p2</layout>
-			<url>${eclipse-site}</url>
-		</repository>
-
-		<repository>
-			<id>eclipse-bpmn2</id>
-			<!--  TODO: change this when BPMN2 metamodel finds a permanent home -->
-			<url>https://hudson.eclipse.org/hudson/job/bpmn2-nightly/lastSuccessfulBuild/artifact/org.eclipse.bpmn2.site/target/site/</url>
-			<layout>p2</layout>
-			<snapshots>
-				<enabled>true</enabled>
-			</snapshots>
-			<releases>
-				<enabled>true</enabled>
-			</releases>
-		</repository>
-
-		<repository>
-			<id>eclipse-bpel</id>
-			<url>http://download.eclipse.org/bpel/update-site</url>
-			<layout>p2</layout>
-			<snapshots>
-				<enabled>true</enabled>
-			</snapshots>
-			<releases>
-				<enabled>true</enabled>
-			</releases>
-		</repository>
-
-		<repository>
-			<id>eclipse-graphiti</id>
-			<url>http://download.eclipse.org/graphiti/updates/0.9.0</url>
-			<layout>p2</layout>
-			<snapshots>
-				<enabled>true</enabled>
-			</snapshots>
-			<releases>
-				<enabled>true</enabled>
-			</releases>
-		</repository>
-
-		<repository>
-			<id>eclipse-emf</id>
-			<url>http://download.eclipse.org/modeling/emf/updates/releases/</url>
-			<layout>p2</layout>
-			<snapshots>
-				<enabled>true</enabled>
-			</snapshots>
-			<releases>
-				<enabled>true</enabled>
-			</releases>
-		</repository>
-
-		<repository>
-			<id>eclipse-gef</id>
-			<url>http://download.eclipse.org/tools/gef/updates/releases/</url>
-			<layout>p2</layout>
-			<snapshots>
-				<enabled>true</enabled>
-			</snapshots>
-			<releases>
-				<enabled>true</enabled>
-			</releases>
-		</repository>
-
-	</repositories>
-
-	<pluginRepositories>
-		<pluginRepository>
-			<!-- need maven-findbugs-2.3.2-SNAPSHOT, see http://jira.codehaus.org/browse/MFINDBUGS-122 
-				remove this when this version is released -->
-			<id>codehaus.snapshots</id>
-			<url>http://snapshots.repository.codehaus.org/</url>
-		</pluginRepository>
-	</pluginRepositories>
-
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.eclipse.tycho</groupId>
-				<artifactId>tycho-maven-plugin</artifactId>
-				<version>${tycho-version}</version>
-				<extensions>true</extensions>
-			</plugin>
-			<plugin>
-				<groupId>org.eclipse.tycho</groupId>
-				<artifactId>target-platform-configuration</artifactId>
-				<version>${tycho-version}</version>
-				<configuration>
-					<resolver>p2</resolver>
-				</configuration>
-			</plugin>
-		</plugins>
-		<pluginManagement>
-			<plugins>
-				<plugin>
-					<groupId>org.eclipse.tycho</groupId>
-					<artifactId>maven-osgi-compiler-plugin</artifactId>
-					<version>${tycho-version}</version>
-					<configuration>
-						<encoding>UTF-8</encoding>
-					</configuration>
-				</plugin>
-				<plugin>
-					<!-- TODO remove workaround when https://issues.sonatype.org/browse/TYCHO-473 
-						is fixed -->
-					<groupId>org.eclipse.tycho</groupId>
-					<artifactId>maven-osgi-source-plugin</artifactId>
-					<version>${tycho-version}</version>
-					<executions>
-						<execution>
-							<id>attach-source</id>
-							<phase>process-classes</phase>
-							<goals>
-								<goal>plugin-source</goal>
-							</goals>
-						</execution>
-					</executions>
-				</plugin>
-				<plugin>
-					<groupId>org.apache.maven.plugins</groupId>
-					<artifactId>maven-resources-plugin</artifactId>
-					<version>2.4.1</version>
-					<configuration>
-						<encoding>ISO-8859-1</encoding>
-					</configuration>
-				</plugin>
-				<plugin>
-					<groupId>org.apache.maven.plugins</groupId>
-					<artifactId>maven-antrun-plugin</artifactId>
-					<version>1.3</version>
-				</plugin>
-				<plugin>
-					<groupId>org.codehaus.mojo</groupId>
-					<artifactId>findbugs-maven-plugin</artifactId>
-					<version>2.3.2-SNAPSHOT</version>
-					<configuration>
-						<findbugsXmlOutput>true</findbugsXmlOutput>
-						<failOnError>false</failOnError>
-					</configuration>
-					<executions>
-						<execution>
-							<goals>
-								<goal>check</goal>
-							</goals>
-						</execution>
-					</executions>
-				</plugin>
-				<plugin>
-					<groupId>org.apache.maven.plugins</groupId>
-					<artifactId>maven-pmd-plugin</artifactId>
-					<version>2.5</version>
-					<configuration>
-						<sourceEncoding>utf-8</sourceEncoding>
-						<minimumTokens>100</minimumTokens>
-						<targetJdk>1.5</targetJdk>
-						<format>xml</format>
-						<failOnViolation>false</failOnViolation>
-					</configuration>
-					<executions>
-						<execution>
-							<goals>
-								<goal>cpd-check</goal>
-							</goals>
-						</execution>
-					</executions>
-				</plugin>
-			</plugins>
-		</pluginManagement>
-	</build>
-
-
-</project>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

+	<modelVersion>4.0.0</modelVersion>

+

+	<prerequisites>

+		<maven>3.0</maven>

+	</prerequisites>

+

+	<groupId>org.eclipse.bpmn2.modeler</groupId>

+	<artifactId>org.eclipse.bpmn2.modeler.parent</artifactId>

+	<version>0.0.1-SNAPSHOT</version>

+	<packaging>pom</packaging>

+

+	<name>BPMN2 Modeler Parent</name>

+	<description>Parent POM for the Eclipse BPMN2 Modeler Project</description>

+

+	<licenses>

+		<license>

+			<name>Eclipse Public License v1.0</name>

+			<comments>

+       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.htm

+      </comments>

+		</license>

+	</licenses>

+

+	<properties>

+		<tycho-version>0.13.0</tycho-version>

+	</properties>

+

+	<profiles>

+		<profile>

+			<id>platform-helios</id>

+			<activation>

+				<property>

+					<name>platform-version-name</name>

+					<value>helios</value>

+				</property>

+			</activation>

+			<properties>

+				<eclipse-site>http://download.eclipse.org/releases/helios</eclipse-site>

+				<platform-version>[3.6,3.7)</platform-version>

+			</properties>

+		</profile>

+		<profile>

+			<id>platform-indigo</id>

+			<activation>

+				<property>

+					<name>platform-version-name</name>

+					<value>indigo</value>

+				</property>

+			</activation>

+			<properties>

+				<eclipse-site>http://download.eclipse.org/releases/indigo</eclipse-site>

+				<platform-version>[3.7,3.8)</platform-version>

+			</properties>

+		</profile>

+	</profiles>

+

+	<modules>

+		<module>org.eclipse.bpmn2.modeler.core</module>

+		<module>org.eclipse.bpmn2.modeler.ui</module>

+		<module>org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5</module>

+		<module>org.eclipse.bpmn2.modeler.feature</module>

+		<module>org.eclipse.bpmn2.modeler.updatesite.feature</module>

+	</modules>

+

+	<repositories>

+		<repository>

+			<id>eclipse-platform</id>

+			<layout>p2</layout>

+			<url>${eclipse-site}</url>

+		</repository>

+

+		<repository>

+			<id>eclipse-bpmn2</id>

+			<!--  TODO: change this when BPMN2 metamodel finds a permanent home -->

+			<url>https://hudson.eclipse.org/hudson/job/bpmn2-nightly/lastSuccessfulBuild/artifact/org.eclipse.bpmn2.site/target/site/</url>

+			<layout>p2</layout>

+			<snapshots>

+				<enabled>true</enabled>

+			</snapshots>

+			<releases>

+				<enabled>true</enabled>

+			</releases>

+		</repository>

+

+		<repository>

+			<id>eclipse-bpel</id>

+			<url>http://download.eclipse.org/bpel/update-site</url>

+			<layout>p2</layout>

+			<snapshots>

+				<enabled>true</enabled>

+			</snapshots>

+			<releases>

+				<enabled>true</enabled>

+			</releases>

+		</repository>

+

+		<repository>

+			<id>eclipse-graphiti</id>

+			<url>http://download.eclipse.org/graphiti/updates/0.8.2</url>

+			<layout>p2</layout>

+			<snapshots>

+				<enabled>true</enabled>

+			</snapshots>

+			<releases>

+				<enabled>true</enabled>

+			</releases>

+		</repository>

+

+		<repository>

+			<id>eclipse-emf</id>

+			<url>http://download.eclipse.org/modeling/emf/updates/releases/</url>

+			<layout>p2</layout>

+			<snapshots>

+				<enabled>true</enabled>

+			</snapshots>

+			<releases>

+				<enabled>true</enabled>

+			</releases>

+		</repository>

+

+		<repository>

+			<id>eclipse-gef</id>

+			<url>http://download.eclipse.org/tools/gef/updates/releases/</url>

+			<layout>p2</layout>

+			<snapshots>

+				<enabled>true</enabled>

+			</snapshots>

+			<releases>

+				<enabled>true</enabled>

+			</releases>

+		</repository>

+

+	</repositories>

+

+	<pluginRepositories>

+		<pluginRepository>

+			<!-- need maven-findbugs-2.3.2-SNAPSHOT, see http://jira.codehaus.org/browse/MFINDBUGS-122 

+				remove this when this version is released -->

+			<id>codehaus.snapshots</id>

+			<url>http://snapshots.repository.codehaus.org/</url>

+		</pluginRepository>

+	</pluginRepositories>

+

+	<build>

+		<plugins>

+			<plugin>

+				<groupId>org.eclipse.tycho</groupId>

+				<artifactId>tycho-maven-plugin</artifactId>

+				<version>${tycho-version}</version>

+				<extensions>true</extensions>

+			</plugin>

+			<plugin>

+				<groupId>org.eclipse.tycho</groupId>

+				<artifactId>target-platform-configuration</artifactId>

+				<version>${tycho-version}</version>

+				<configuration>

+					<resolver>p2</resolver>

+				</configuration>

+			</plugin>

+		</plugins>

+		<pluginManagement>

+			<plugins>

+				<plugin>

+					<groupId>org.eclipse.tycho</groupId>

+					<artifactId>maven-osgi-compiler-plugin</artifactId>

+					<version>${tycho-version}</version>

+					<configuration>

+						<encoding>UTF-8</encoding>

+					</configuration>

+				</plugin>

+				<plugin>

+					<!-- TODO remove workaround when https://issues.sonatype.org/browse/TYCHO-473 

+						is fixed -->

+					<groupId>org.eclipse.tycho</groupId>

+					<artifactId>maven-osgi-source-plugin</artifactId>

+					<version>${tycho-version}</version>

+					<executions>

+						<execution>

+							<id>attach-source</id>

+							<phase>process-classes</phase>

+							<goals>

+								<goal>plugin-source</goal>

+							</goals>

+						</execution>

+					</executions>

+				</plugin>

+				<plugin>

+					<groupId>org.apache.maven.plugins</groupId>

+					<artifactId>maven-resources-plugin</artifactId>

+					<version>2.4.1</version>

+					<configuration>

+						<encoding>ISO-8859-1</encoding>

+					</configuration>

+				</plugin>

+				<plugin>

+					<groupId>org.apache.maven.plugins</groupId>

+					<artifactId>maven-antrun-plugin</artifactId>

+					<version>1.3</version>

+				</plugin>

+				<plugin>

+					<groupId>org.codehaus.mojo</groupId>

+					<artifactId>findbugs-maven-plugin</artifactId>

+					<version>2.3.2-SNAPSHOT</version>

+					<configuration>

+						<findbugsXmlOutput>true</findbugsXmlOutput>

+						<failOnError>false</failOnError>

+					</configuration>

+					<executions>

+						<execution>

+							<goals>

+								<goal>check</goal>

+							</goals>

+						</execution>

+					</executions>

+				</plugin>

+				<plugin>

+					<groupId>org.apache.maven.plugins</groupId>

+					<artifactId>maven-pmd-plugin</artifactId>

+					<version>2.5</version>

+					<configuration>

+						<sourceEncoding>utf-8</sourceEncoding>

+						<minimumTokens>100</minimumTokens>

+						<targetJdk>1.5</targetJdk>

+						<format>xml</format>

+						<failOnViolation>false</failOnViolation>

+					</configuration>

+					<executions>

+						<execution>

+							<goals>

+								<goal>cpd-check</goal>

+							</goals>

+						</execution>

+					</executions>

+				</plugin>

+			</plugins>

+		</pluginManagement>

+	</build>

+

+

+</project>