Classloadering strategy for javax.xml.datatype.FactoryFinder is not consistent 
with javax.xml.parsers.DocumentBuilderFactory
----------------------------------------------------------------------------------------------------------------------------

                 Key: XERCESJ-1419
                 URL: https://issues.apache.org/jira/browse/XERCESJ-1419
             Project: Xerces2-J
          Issue Type: Bug
          Components: JAXP (javax.xml.datatype)
    Affects Versions: 2.9.1
            Reporter: Andy Piper
            Priority: Minor
             Fix For: 2.9.1


javax.xml.parsers.DocumentBuilderFactory looks first at the ContextClassLoader 
then Class.forName, but FactoryFinder does not. This causes problems on OSGi 
systems and it seems that the two strategies should be consistent. Here is the 
patch I used.


Eagle Andy> diff -rc tmp/javax xml-commons-external-1.4.01/javax
diff -rc tmp/javax/xml/datatype/FactoryFinder.java xml-commons-external-1.4.01/j
avax/xml/datatype/FactoryFinder.java
*** tmp/javax/xml/datatype/FactoryFinder.java   2009-02-16 00:09:32.000000000 +0
000
--- xml-commons-external-1.4.01/javax/xml/datatype/FactoryFinder.java   2010-01-
19 11:03:01.070864200 +0000
***************
*** 143,164 ****
       */
      static Object newInstance(
        String className,
!         ClassLoader classLoader)
          throws ConfigurationError {
!
          try {
!             Class spiClass;
!             if (classLoader == null) {
!                 spiClass = Class.forName(className);
              } else {
!                 spiClass = classLoader.loadClass(className);
!             }
!
!             if (debug) {
!               debugPrintln("Loaded " + className + " from " + which(spiClass))
;
              }
!
!             return spiClass.newInstance();
          } catch (ClassNotFoundException x) {
              throw new ConfigurationError(
                  "Provider " + className + " not found", x);
--- 145,179 ----
       */
      static Object newInstance(
        String className,
!         ClassLoader cl)
          throws ConfigurationError {
!
          try {
!             Class providerClass;
!             if (cl == null) {
!                 // If classloader is null Use the bootstrap ClassLoader.
!                 // Thus Class.forName(String) will use the current
!                 // ClassLoader which will be the bootstrap ClassLoader.
!                 providerClass = Class.forName(className);
              } else {
!                 try {
!                     providerClass = cl.loadClass(className);
!                 } catch (ClassNotFoundException x) {
!                         // Fall back to current classloader
!                         cl = FactoryFinder.class.getClassLoader();
!                         if (cl != null) {
!                             providerClass = cl.loadClass(className);
!                         }
!                         else {
!                             providerClass = Class.forName(className);
!                         }
!                 }
              }
!
!             Object instance = providerClass.newInstance();
!             if (debug) debugPrintln("created new instance of " + providerClass
 +
!                    " using ClassLoader: " + cl);
!             return instance;
          } catch (ClassNotFoundException x) {
              throw new ConfigurationError(
                  "Provider " + className + " not found", x);

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to