You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by fr...@apache.org on 2007/04/11 15:56:25 UTC

svn commit: r527494 - /incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/XSDHelperImpl.java

Author: frankb
Date: Wed Apr 11 06:56:19 2007
New Revision: 527494

URL: http://svn.apache.org/viewvc?view=rev&rev=527494
Log:
Fix for TUSCANY-1207

Modified:
    incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/XSDHelperImpl.java

Modified: incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/XSDHelperImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/XSDHelperImpl.java?view=diff&rev=527494&r1=527493&r2=527494
==============================================================================
--- incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/XSDHelperImpl.java (original)
+++ incubator/tuscany/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/XSDHelperImpl.java Wed Apr 11 06:56:19 2007
@@ -26,6 +26,7 @@
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Iterator;
@@ -46,6 +47,7 @@
 import org.eclipse.emf.ecore.EModelElement;
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.impl.EPackageRegistryImpl;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.util.EcoreUtil;
@@ -70,19 +72,24 @@
 public class XSDHelperImpl implements XSDHelper
 {
   protected boolean extensibleNamespaces = false;
-  protected XSDEcoreBuilder ecoreBuilder;
   protected ExtendedMetaData extendedMetaData;
+  protected XSDEcoreBuilder nondelegatingEcoreBuilder = null;
+  protected HashMap tcclToEcoreBuilderMap = null;
   
   public XSDHelperImpl(ExtendedMetaData extendedMetaData, String redefineBuiltIn, boolean extensibleNamespaces)
   {
     this.extendedMetaData = extendedMetaData;
     this.extensibleNamespaces = extensibleNamespaces;
-    ecoreBuilder = new SDOXSDEcoreBuilder(extendedMetaData, extensibleNamespaces);
     
-    // Add the built-in models to the targetNamespaceToEPackageMap so they can't be (re)defined/overridden
-    for (Iterator iter = TypeHelperImpl.getBuiltInModels().iterator(); iter.hasNext(); ) {
-      EPackage ePackage = (EPackage)iter.next();
-      ecoreBuilder.getTargetNamespaceToEPackageMap().put(ePackage.getNsURI(), ePackage);
+    XSDEcoreBuilder ecoreBuilder = createEcoreBuilder();
+    
+    if (extendedMetaData instanceof SDOExtendedMetaDataImpl &&
+        ((SDOExtendedMetaDataImpl)extendedMetaData).getRegistry() instanceof EPackageRegistryImpl.Delegator) {
+      tcclToEcoreBuilderMap = new HashMap();
+      putTCCLEcoreBuilder(ecoreBuilder);
+    }
+    else {
+      nondelegatingEcoreBuilder = ecoreBuilder;
     }
     
     if (redefineBuiltIn != null) { // Redefining/regenerating this built-in model
@@ -100,6 +107,47 @@
     this(((TypeHelperImpl)typeHelper).extendedMetaData, null, extensibleNamespaces);
   }
   
+  protected XSDEcoreBuilder createEcoreBuilder() {
+    XSDEcoreBuilder ecoreBuilder = new SDOXSDEcoreBuilder(extendedMetaData, extensibleNamespaces);
+    
+    // Add the built-in models to the targetNamespaceToEPackageMap so they can't be (re)defined/overridden
+    for (Iterator iter = TypeHelperImpl.getBuiltInModels().iterator(); iter.hasNext(); ) {
+      EPackage ePackage = (EPackage)iter.next();
+      ecoreBuilder.getTargetNamespaceToEPackageMap().put(ePackage.getNsURI(), ePackage);
+    }
+    
+    return ecoreBuilder;
+  }
+  
+  protected void putTCCLEcoreBuilder(XSDEcoreBuilder ecoreBuilder) {
+    ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+    if (tcclToEcoreBuilderMap.get(tccl) == null) {
+        tcclToEcoreBuilderMap.put(tccl, ecoreBuilder);
+    }
+  }
+  
+  protected XSDEcoreBuilder getEcoreBuilder() {
+    if (nondelegatingEcoreBuilder != null) 
+      return nondelegatingEcoreBuilder;
+    
+    XSDEcoreBuilder result = null;
+    try {
+      for (ClassLoader tccl = Thread.currentThread().getContextClassLoader(); tccl != null; tccl = tccl.getParent()) {
+        result = (XSDEcoreBuilder)tcclToEcoreBuilderMap.get(tccl);
+        if (result != null)
+          return result;
+      } // for
+    }
+    catch (SecurityException exception) {
+      //exception.printStackTrace();
+    }
+
+    result = createEcoreBuilder();
+    putTCCLEcoreBuilder(result);
+    
+    return result;
+  }
+  
   public String getLocalName(Type type)
   {
     return extendedMetaData.getName((EClassifier)type);
@@ -196,6 +244,7 @@
       Resource model = resourceSet.createResource(URI.createURI(schemaLocation != null ? schemaLocation : "null.xsd"));
       ((XSDResourceImpl)model).load(inputSource, null);
       
+      XSDEcoreBuilder ecoreBuilder = getEcoreBuilder();
       List newTypes = new ArrayList();
       for (Iterator schemaIter = model.getContents().iterator(); schemaIter.hasNext(); )
       {



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org