You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2009/08/05 20:31:43 UTC

svn commit: r801350 - in /tuscany/java/sca/modules/databinding-jaxb: META-INF/MANIFEST.MF src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextCache.java src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextHelper.java

Author: rfeng
Date: Wed Aug  5 18:31:43 2009
New Revision: 801350

URL: http://svn.apache.org/viewvc?rev=801350&view=rev
Log:
Set the thread context classloader so that JAXBContext.newInstance can find the correct factory

Modified:
    tuscany/java/sca/modules/databinding-jaxb/META-INF/MANIFEST.MF
    tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextCache.java
    tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextHelper.java

Modified: tuscany/java/sca/modules/databinding-jaxb/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/databinding-jaxb/META-INF/MANIFEST.MF?rev=801350&r1=801349&r2=801350&view=diff
==============================================================================
--- tuscany/java/sca/modules/databinding-jaxb/META-INF/MANIFEST.MF (original)
+++ tuscany/java/sca/modules/databinding-jaxb/META-INF/MANIFEST.MF Wed Aug  5 18:31:43 2009
@@ -38,6 +38,7 @@
  org.apache.tuscany.sca.databinding.jaxb;version="2.0.0",
  org.apache.tuscany.sca.databinding.util;version="2.0.0",
  org.apache.tuscany.sca.databinding.xml;version="2.0.0",
+ org.apache.tuscany.sca.extensibility;version="2.0.0",
  org.apache.tuscany.sca.interfacedef;version="2.0.0",
  org.apache.tuscany.sca.interfacedef.impl;version="2.0.0",
  org.apache.tuscany.sca.interfacedef.util;version="2.0.0",

Modified: tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextCache.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextCache.java?rev=801350&r1=801349&r2=801350&view=diff
==============================================================================
--- tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextCache.java (original)
+++ tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextCache.java Wed Aug  5 18:31:43 2009
@@ -55,6 +55,8 @@
 import javax.xml.transform.Source;
 
 import org.apache.tuscany.sca.databinding.util.LRUCache;
+import org.apache.tuscany.sca.extensibility.ServiceDeclaration;
+import org.apache.tuscany.sca.extensibility.ServiceDiscovery;
 
 /**
  * @version $Rev$ $Date$
@@ -116,12 +118,34 @@
         upool = new Pool<JAXBContext, Unmarshaller>();
         defaultContext = getDefaultJAXBContext();
     }
-
+    
     private static JAXBContext newJAXBContext(final Class<?>... classesToBeBound) throws JAXBException {
         try {
             return AccessController.doPrivileged(new PrivilegedExceptionAction<JAXBContext>() {
                 public JAXBContext run() throws JAXBException {
-                    return JAXBContext.newInstance(classesToBeBound);
+                    // Try to set up TCCL so that JAXBContext service discovery works in OSGi
+                    ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+                    ClassLoader newTccl = tccl;
+                    try {
+                        ServiceDeclaration sd =
+                            ServiceDiscovery.getInstance().getServiceDeclaration(JAXBContext.class.getName());
+                        if (sd != null) {
+                            newTccl = sd.loadClass().getClassLoader();
+                        }
+                    } catch (Exception e) {
+                        // Ignore
+                    }
+                    if (newTccl != tccl) {
+                        Thread.currentThread().setContextClassLoader(newTccl);
+                    }
+                    try {
+                        JAXBContext context = JAXBContext.newInstance(classesToBeBound);
+                        return context;
+                    } finally {
+                        if (newTccl != tccl) {
+                            Thread.currentThread().setContextClassLoader(newTccl);
+                        }
+                    }
                 }
             });
         } catch (PrivilegedActionException e) {
@@ -129,18 +153,6 @@
         }
     }
 
-    private static JAXBContext newJAXBContext(final String contextPath, final ClassLoader classLoader)
-        throws JAXBException {
-        try {
-            return AccessController.doPrivileged(new PrivilegedExceptionAction<JAXBContext>() {
-                public JAXBContext run() throws JAXBException {
-                    return JAXBContext.newInstance(contextPath, classLoader);
-                }
-            });
-        } catch (PrivilegedActionException e) {
-            throw (JAXBException)e.getException();
-        }
-    }
 
     public static JAXBContext getDefaultJAXBContext() {
         try {

Modified: tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextHelper.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextHelper.java?rev=801350&r1=801349&r2=801350&view=diff
==============================================================================
--- tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextHelper.java (original)
+++ tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextHelper.java Wed Aug  5 18:31:43 2009
@@ -37,6 +37,7 @@
 import javax.xml.bind.annotation.XmlEnum;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlSchema;
+import javax.xml.bind.annotation.XmlSeeAlso;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.namespace.QName;
 
@@ -100,6 +101,15 @@
         return createJAXBContext(dataType);
 
     }
+    
+    private Class<?>[] getSeeAlso(Class<?> interfaze) {
+        XmlSeeAlso seeAlso = interfaze.getAnnotation(XmlSeeAlso.class);
+        if (seeAlso == null) {
+            return null;
+        } else {
+            return seeAlso.value();
+        }
+    }
 
     public static JAXBContext createJAXBContext(DataType dataType) throws JAXBException {
         return createJAXBContext(findClasses(dataType));