Small fixes
-Make DiagramElement (from DI) non-abstract, as we have a resolving proxy
reference from BPMNEdge
-Make extensibility stuff usable from older Eclipse version (using reflection
loading of XSD2Ecore
-Little fix in QNameURIHandler to handle schema includes.
diff --git a/org.eclipse.bpmn2/model/DI.ecore b/org.eclipse.bpmn2/model/DI.ecore
index a3bfe00..c00630c 100644
--- a/org.eclipse.bpmn2/model/DI.ecore
+++ b/org.eclipse.bpmn2/model/DI.ecore
@@ -158,10 +158,11 @@
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
- <eClassifiers xsi:type="ecore:EClass" name="DiagramElement" abstract="true">
+ <eClassifiers xsi:type="ecore:EClass" name="DiagramElement">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="name" value="DiagramElement"/>
<details key="kind" value="elementOnly"/>
+ <details key="abstract" value="true"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="owningDiagram" ordered="false"
eType="#//Diagram" changeable="false" transient="true" derived="true" resolveProxies="false"
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/util/Bpmn2ResourceImpl.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/util/Bpmn2ResourceImpl.java
index 9f2c1b2..1b5d079 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/util/Bpmn2ResourceImpl.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/util/Bpmn2ResourceImpl.java
@@ -14,6 +14,8 @@
*/
package org.eclipse.bpmn2.util;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@@ -26,6 +28,7 @@
import org.eclipse.bpmn2.Definitions;
import org.eclipse.bpmn2.Extension;
import org.eclipse.bpmn2.Import;
+import org.eclipse.emf.common.CommonPlugin;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
@@ -35,6 +38,7 @@
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.ExtendedMetaData;
import org.eclipse.emf.ecore.xmi.XMLHelper;
import org.eclipse.emf.ecore.xmi.XMLLoad;
import org.eclipse.emf.ecore.xmi.XMLResource;
@@ -226,15 +230,28 @@
private EObject loadExtensionSchema(QName xsdQname) {
EPackage extensionPackage = extendedMetaData.getPackage(xsdQname.getNamespaceURI());
if (extensionPackage == null) {
- URI location = urisToLocations.get(xsdQname.getNamespaceURI());
- Map<Object, Object> options = new HashMap<Object, Object>();
- options.put(XSDEcoreBuilder.OPTION_REUSE_REGISTERED_PACKAGES, Boolean.TRUE);
+
try {
- XSDEcoreBuilder builder = new XSDEcoreBuilder(extendedMetaData, options);
+ @SuppressWarnings("unchecked")
+ Class<XSDEcoreBuilder> theXSDEcoreBuilderClass = (Class<XSDEcoreBuilder>) CommonPlugin
+ .loadClass("org.eclipse.xsd", "org.eclipse.xsd.ecore.XSDEcoreBuilder");
+
+ Constructor<XSDEcoreBuilder> theXSDEcoreBuilderConstructor = theXSDEcoreBuilderClass
+ .getConstructor(new Class[] { ExtendedMetaData.class, Map.class });
+ Field theOptionField = theXSDEcoreBuilderClass
+ .getField("OPTION_REUSE_REGISTERED_PACKAGES");
+ Object theXsdOption = theOptionField.get(null);
+
+ URI location = urisToLocations.get(xsdQname.getNamespaceURI());
+ Map<Object, Object> options = new HashMap<Object, Object>();
+ options.put(theXsdOption, Boolean.TRUE);
+ XSDEcoreBuilder builder = theXSDEcoreBuilderConstructor.newInstance(
+ extendedMetaData, options);
builder.generate(location);
} catch (Exception e) {
}
}
+
return extendedMetaData.getElement(xsdQname.getNamespaceURI(), xsdQname.getLocalPart());
}
diff --git a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/util/QNameURIHandler.java b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/util/QNameURIHandler.java
index 11782b2..a4cd5be 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/bpmn2/util/QNameURIHandler.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/bpmn2/util/QNameURIHandler.java
@@ -62,6 +62,12 @@
} else
throw new IllegalArgumentException("Illegal QName: " + qName);
+ if (fragment.contains(".")) {
+ // HACK: officially IDs can contain ".", but unfortunately XmlHandler calls resolve also for xsi:schemaLocation stuff and similar, that are
+ // NO URIs. We must not process them.
+ return qName;
+ }
+
if (!xmlHelper.isTargetNamespace(prefix))
return xmlHelper.getPathForPrefix(prefix).appendFragment(fragment).toString();
else
diff --git a/org.eclipse.bpmn2/src/org/eclipse/dd/di/DiagramElement.java b/org.eclipse.bpmn2/src/org/eclipse/dd/di/DiagramElement.java
index fab6a7e..5d37f17 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/dd/di/DiagramElement.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/dd/di/DiagramElement.java
@@ -36,8 +36,7 @@
* </p>
*
* @see org.eclipse.dd.di.DiPackage#getDiagramElement()
- * @model abstract="true"
- * extendedMetaData="name='DiagramElement' kind='elementOnly'"
+ * @model extendedMetaData="name='DiagramElement' kind='elementOnly' abstract='true'"
* @generated
*/
public interface DiagramElement extends EObject {
diff --git a/org.eclipse.bpmn2/src/org/eclipse/dd/di/impl/DiFactoryImpl.java b/org.eclipse.bpmn2/src/org/eclipse/dd/di/impl/DiFactoryImpl.java
index 312811a..8ba2d5f 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/dd/di/impl/DiFactoryImpl.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/dd/di/impl/DiFactoryImpl.java
@@ -70,6 +70,8 @@
switch (eClass.getClassifierID()) {
case DiPackage.DOCUMENT_ROOT:
return createDocumentRoot();
+ case DiPackage.DIAGRAM_ELEMENT:
+ return createDiagramElement();
default:
throw new IllegalArgumentException("The class '" + eClass.getName()
+ "' is not a valid classifier");
@@ -91,6 +93,16 @@
* <!-- end-user-doc -->
* @generated
*/
+ protected DiagramElement createDiagramElement() {
+ DiagramElementImpl diagramElement = new DiagramElementImpl();
+ return diagramElement;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
public DiPackage getDiPackage() {
return (DiPackage) getEPackage();
}
diff --git a/org.eclipse.bpmn2/src/org/eclipse/dd/di/impl/DiPackageImpl.java b/org.eclipse.bpmn2/src/org/eclipse/dd/di/impl/DiPackageImpl.java
index a678a79..ce456bb 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/dd/di/impl/DiPackageImpl.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/dd/di/impl/DiPackageImpl.java
@@ -835,7 +835,7 @@
Diagram.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID,
IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
- initEClass(diagramElementEClass, DiagramElement.class, "DiagramElement", IS_ABSTRACT,
+ initEClass(diagramElementEClass, DiagramElement.class, "DiagramElement", !IS_ABSTRACT,
!IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
initEReference(getDiagramElement_OwningDiagram(), this.getDiagram(),
this.getDiagram_RootElement(), "owningDiagram", null, 0, 1, DiagramElement.class,
@@ -974,7 +974,7 @@
addAnnotation(getDiagram_Resolution(), source, new String[] { "kind", "attribute", "name",
"resolution" });
addAnnotation(diagramElementEClass, source, new String[] { "name", "DiagramElement",
- "kind", "elementOnly" });
+ "kind", "elementOnly", "abstract", "true" });
addAnnotation(getDiagramElement_Id(), source, new String[] { "kind", "attribute", "name",
"id" });
addAnnotation(edgeEClass, source, new String[] { "name", "Edge", "kind", "elementOnly" });
diff --git a/org.eclipse.bpmn2/src/org/eclipse/dd/di/impl/DiagramElementImpl.java b/org.eclipse.bpmn2/src/org/eclipse/dd/di/impl/DiagramElementImpl.java
index 6ba086d..4c4ca02 100644
--- a/org.eclipse.bpmn2/src/org/eclipse/dd/di/impl/DiagramElementImpl.java
+++ b/org.eclipse.bpmn2/src/org/eclipse/dd/di/impl/DiagramElementImpl.java
@@ -49,7 +49,7 @@
*
* @generated
*/
-public abstract class DiagramElementImpl extends EObjectImpl implements DiagramElement {
+public class DiagramElementImpl extends EObjectImpl implements DiagramElement {
/**
* The cached value of the '{@link #getOwningDiagram() <em>Owning Diagram</em>}' reference.
* <!-- begin-user-doc -->