You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by di...@apache.org on 2003/06/29 03:55:20 UTC

cvs commit: xml-axis/java/src/javax/xml/soap FactoryFinder.java

dims        2003/06/28 18:55:20

  Modified:    java/src/javax/xml/soap FactoryFinder.java
  Log:
  Fix for Bug 17279 - Axis does not work when installed in WEB-INF/lib
  
  Notes:
  - Added fallback mechanism that uses the class loader that loaded FactoryFinder class.
  
  Revision  Changes    Path
  1.7       +62 -72    xml-axis/java/src/javax/xml/soap/FactoryFinder.java
  
  Index: FactoryFinder.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/javax/xml/soap/FactoryFinder.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- FactoryFinder.java	22 Apr 2003 19:33:55 -0000	1.6
  +++ FactoryFinder.java	29 Jun 2003 01:55:20 -0000	1.7
  @@ -57,7 +57,9 @@
   import java.io.BufferedReader;
   import java.io.File;
   import java.io.FileInputStream;
  +import java.io.InputStream;
   import java.io.InputStreamReader;
  +
   import java.util.Properties;
   
   /**
  @@ -66,127 +68,115 @@
    * be accessed from other packages.
    */
   class FactoryFinder {
  -
       /**
  -     * Constructor FactoryFinder
  -     */
  -    FactoryFinder() {}
  -
  -    /**
  -     * Method newInstance
  +     * instantiates an object go the given classname.
        *
        * @param factoryClassName
  -     * @param classloader
  -     *
  -     * @return
  -     *
  +     * @return a factory object
        * @throws SOAPException
        */
  -    private static Object newInstance(
  -            String factoryClassName, ClassLoader classloader)
  -                throws SOAPException {
  -
  +    private static Object newInstance(String factoryClassName) throws SOAPException {
  +        ClassLoader classloader = null;
           try {
  -            Class factory;
  +            classloader = Thread.currentThread().getContextClassLoader();
  +        } catch (Exception exception) {
  +            throw new SOAPException(exception.toString(), exception);
  +        }
   
  +        try {
  +            Class factory = null;
               if (classloader == null) {
                   factory = Class.forName(factoryClassName);
               } else {
  +                try {
  +                    factory = classloader.loadClass(factoryClassName);
  +                } catch (ClassNotFoundException cnfe) {}
  +            }
  +            if (factory == null) {
  +                classloader = FactoryFinder.class.getClassLoader();
                   factory = classloader.loadClass(factoryClassName);
               }
  -
               return factory.newInstance();
           } catch (ClassNotFoundException classnotfoundexception) {
  -            throw new SOAPException("Provider " + factoryClassName
  -                                    + " not found", classnotfoundexception);
  +            throw new SOAPException("Provider " + factoryClassName + " not found", classnotfoundexception);
           } catch (Exception exception) {
  -            throw new SOAPException("Provider " + factoryClassName
  -                                    + " could not be instantiated: "
  -                                    + exception, exception);
  +            throw new SOAPException("Provider " + factoryClassName + " could not be instantiated: " + exception, exception);
           }
       }
   
       /**
  -     * Method find
  +     * instantiates a factory object given the factory's property name and the default class name
        *
        * @param factoryPropertyName
        * @param defaultFactoryClassName
  -     *
  -     * @return
  -     *
  +     * @return a factory object
        * @throws SOAPException
        */
  -    static Object find(
  -            String factoryPropertyName, String defaultFactoryClassName)
  -                throws SOAPException {
  -
  -        ClassLoader classloader;
  -
  -        try {
  -            classloader = Thread.currentThread().getContextClassLoader();
  -        } catch (Exception exception) {
  -            throw new SOAPException(exception.toString(), exception);
  -        }
  -
  +    static Object find(String factoryPropertyName, String defaultFactoryClassName) throws SOAPException {
           try {
               String factoryClassName = System.getProperty(factoryPropertyName);
  -
               if (factoryClassName != null) {
  -                return newInstance(factoryClassName, classloader);
  +                return newInstance(factoryClassName);
               }
           } catch (SecurityException securityexception) {}
   
           try {
  -            String propertiesFileName = System.getProperty("java.home")
  -                                        + File.separator + "lib"
  +            String propertiesFileName = System.getProperty("java.home") 
  +                                        + File.separator + "lib" 
                                           + File.separator + "jaxm.properties";
  -            File   file               = new File(propertiesFileName);
  -
  +            File file = new File(propertiesFileName);
               if (file.exists()) {
  -                FileInputStream fileInput  = new FileInputStream(file);
  -                Properties      properties = new Properties();
  -
  +                FileInputStream fileInput = new FileInputStream(file);
  +                Properties properties = new Properties();
                   properties.load(fileInput);
                   fileInput.close();
  -
  -                String factoryClassName =
  -                    properties.getProperty(factoryPropertyName);
  -
  -                return newInstance(factoryClassName, classloader);
  +                String factoryClassName = properties.getProperty(factoryPropertyName);
  +                return newInstance(factoryClassName);
               }
           } catch (Exception exception1) {}
   
           String factoryResource = "META-INF/services/" + factoryPropertyName;
   
           try {
  -            java.io.InputStream inputstream = null;
  -
  -            if (classloader == null) {
  -                inputstream =
  -                    ClassLoader.getSystemResourceAsStream(factoryResource);
  -            } else {
  -                inputstream = classloader.getResourceAsStream(factoryResource);
  -            }
  -
  +            InputStream inputstream = getResource(factoryResource);
               if (inputstream != null) {
  -                BufferedReader bufferedreader   =
  -                    new BufferedReader(new InputStreamReader(inputstream,
  -                        "UTF-8"));
  -                String         factoryClassName = bufferedreader.readLine();
  -
  +                BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(inputstream, "UTF-8"));
  +                String factoryClassName = bufferedreader.readLine();
                   bufferedreader.close();
  -
  -                if ((factoryClassName != null) &&!"".equals(factoryClassName)) {
  -                    return newInstance(factoryClassName, classloader);
  +                if ((factoryClassName != null) && !"".equals(factoryClassName)) {
  +                    return newInstance(factoryClassName);
                   }
               }
           } catch (Exception exception2) {}
   
           if (defaultFactoryClassName == null) {
  -            throw new SOAPException("Provider for " + factoryPropertyName
  -                                    + " cannot be found", null);
  +            throw new SOAPException("Provider for " + factoryPropertyName + " cannot be found", null);
           } else {
  -            return newInstance(defaultFactoryClassName, classloader);
  +            return newInstance(defaultFactoryClassName);
  +        }
  +    }
  +
  +    /**
  +     * returns an input stream for the specified resource.
  +     * @param factoryResource
  +     * @return
  +     */
  +    private static InputStream getResource(String factoryResource) {
  +        ClassLoader classloader = null;
  +        try {
  +            classloader = Thread.currentThread().getContextClassLoader();
  +        } catch (SecurityException securityexception) {}
  +        
  +        InputStream inputstream;
  +        if (classloader == null) {
  +            inputstream = ClassLoader.getSystemResourceAsStream(factoryResource);
  +        } else {
  +            inputstream = classloader.getResourceAsStream(factoryResource);
  +        }
  +
  +        if (inputstream == null) {
  +            inputstream = FactoryFinder.class.getClassLoader().getResourceAsStream(factoryResource);
           }
  +        return inputstream;
       }
   }