You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2011/09/19 20:12:21 UTC

svn commit: r1172735 - /servicemix/smx4/specs/trunk/jaxb-api-2.2/src/main/java/javax/xml/bind/ContextFinder.java

Author: gnodet
Date: Mon Sep 19 18:12:20 2011
New Revision: 1172735

URL: http://svn.apache.org/viewvc?rev=1172735&view=rev
Log:
[SMX4-921] Jaxb api throws jaxb exception when using the jre implementation

Modified:
    servicemix/smx4/specs/trunk/jaxb-api-2.2/src/main/java/javax/xml/bind/ContextFinder.java

Modified: servicemix/smx4/specs/trunk/jaxb-api-2.2/src/main/java/javax/xml/bind/ContextFinder.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jaxb-api-2.2/src/main/java/javax/xml/bind/ContextFinder.java?rev=1172735&r1=1172734&r2=1172735&view=diff
==============================================================================
--- servicemix/smx4/specs/trunk/jaxb-api-2.2/src/main/java/javax/xml/bind/ContextFinder.java (original)
+++ servicemix/smx4/specs/trunk/jaxb-api-2.2/src/main/java/javax/xml/bind/ContextFinder.java Mon Sep 19 18:12:20 2011
@@ -103,10 +103,11 @@ class ContextFinder {
     private static JAXBException handleClassCastException(Class originalType, Class targetType) {
         final URL targetTypeURL = which(targetType);
 
+        ClassLoader cl = originalType.getClassLoader() != null ? originalType.getClassLoader() : ClassLoader.getSystemClassLoader();
         return new JAXBException(Messages.format(Messages.ILLEGAL_CAST,
                 // we don't care where the impl class is, we want to know where JAXBContext lives in the impl
                 // class' ClassLoader
-                originalType.getClassLoader().getResource("javax/xml/bind/JAXBContext.class"),
+                cl.getResource("javax/xml/bind/JAXBContext.class"),
                 targetTypeURL));
     }
 
@@ -134,6 +135,10 @@ class ContextFinder {
             // this is added in 2.0.
             try {
                 Method m = spiClass.getMethod("createContext",String.class,ClassLoader.class,Map.class);
+                // Throw an early exception instead of having an exception thrown in the createContext method
+                if (m.getReturnType() != JAXBContext.class) {
+                    throw handleClassCastException(m.getReturnType(), JAXBContext.class);
+                }
                 // any failure in invoking this method would be considered fatal
                 context = m.invoke(null,contextPath,classLoader,properties);
             } catch (NoSuchMethodException e) {
@@ -144,6 +149,10 @@ class ContextFinder {
                 // try the old method that doesn't take properties. compatible with 1.0.
                 // it is an error for an implementation not to have both forms of the createContext method.
                 Method m = spiClass.getMethod("createContext",String.class,ClassLoader.class);
+                // Throw an early exception instead of having an exception thrown in the createContext method
+                if (m.getReturnType() != JAXBContext.class) {
+                    throw handleClassCastException(m.getReturnType(), JAXBContext.class);
+                }
                 // any failure in invoking this method would be considered fatal
                 context = m.invoke(null,contextPath,classLoader);
             }