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