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 2002/06/20 01:14:42 UTC

cvs commit: xml-axis/java/test/utils PackageTests.java TestAxisClassLoader.java

dims        2002/06/19 16:14:42

  Modified:    java/src/javax/xml/rpc ServiceFactory.java
               java/src/org/apache/axis/utils JWSClassLoader.java
               java/test/utils PackageTests.java
  Added:       java/src/javax/xml/rpc FactoryFinder.java
  Removed:     java/src/org/apache/axis/utils AxisClassLoader.java
               java/test/utils TestAxisClassLoader.java
  Log:
  - Cleanup as part of 8423 (AxisClassLoader cannot load service class)
  - Improve pluggability of ServiceFactory.
  
  Revision  Changes    Path
  1.6       +7 -14     xml-axis/java/src/javax/xml/rpc/ServiceFactory.java
  
  Index: ServiceFactory.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/javax/xml/rpc/ServiceFactory.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- ServiceFactory.java	16 Jun 2002 19:36:55 -0000	1.5
  +++ ServiceFactory.java	19 Jun 2002 23:14:41 -0000	1.6
  @@ -55,7 +55,6 @@
   package javax.xml.rpc;
   
   import javax.xml.namespace.QName;
  -
   import java.net.URL;
   
   /**
  @@ -99,20 +98,14 @@
        */
       public static ServiceFactory newInstance() throws ServiceException {
   
  -        String factoryImplName =
  -            System.getProperty("javax.xml.rpc.ServiceFactory",
  -                               "org.apache.axis.client.ServiceFactory");
  -
           try {
  -            Class clazz = Class.forName(factoryImplName);
  -
  -            return (ServiceFactory) clazz.newInstance();
  -        } catch (ClassNotFoundException e) {
  -            throw new ServiceException(e);
  -        } catch (IllegalAccessException e) {
  -            throw new ServiceException(e);
  -        } catch (InstantiationException e) {
  -            throw new ServiceException(e);
  +            return (ServiceFactory) FactoryFinder.find(
  +                /* The default property name according to the JAXRPC spec */
  +                SERVICEFACTORY_PROPERTY,
  +                /* The fallback implementation class name */
  +                "org.apache.axis.client.ServiceFactory");
  +        } catch (FactoryFinder.ConfigurationError e) {
  +            throw new ServiceException(e.getException());
           }
       }
   
  
  
  
  1.1                  xml-axis/java/src/javax/xml/rpc/FactoryFinder.java
  
  Index: FactoryFinder.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2001 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:  
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The name "Apache Software Foundation" must not be used to endorse or
   *    promote products derived from this software without prior written
   *    permission. For written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999-2001, Sun Microsystems,
   * Inc., http://www.sun.com.  For more information on the Apache Software
   * Foundation, please see <http://www.apache.org/>.
   */
  
  package javax.xml.rpc;
  
  import java.io.BufferedReader;
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.lang.reflect.InvocationTargetException;
  import java.lang.reflect.Method;
  import java.util.Properties;
  
  /**
   * This class is duplicated for each subpackage so keep it in sync.
   * It is package private and therefore is not exposed as part of the JAXRPC
   * API.
   *
   * This code is designed to implement the pluggability
   * feature and is designed to both compile and run on JDK version 1.1 and
   * later.  The code also runs both as part of an unbundled jar file and
   * when bundled as part of the JDK.
   */
  class FactoryFinder {
      /** Set to true for debugging */
      private static final boolean debug = false;
  
      private static void debugPrintln(String msg) {
          if (debug) {
              System.err.println("JAXRPC: " + msg);
          }
      }
  
      /**
       * Figure out which ClassLoader to use.  For JDK 1.2 and later use
       * the context ClassLoader.
       */           
      private static ClassLoader findClassLoader()
          throws ConfigurationError
      {
          Method m = null;
  
          try {
              m = Thread.class.getMethod("getContextClassLoader", null);
          } catch (NoSuchMethodException e) {
              // Assume that we are running JDK 1.1, use the current ClassLoader
              debugPrintln("assuming JDK 1.1");
              return FactoryFinder.class.getClassLoader();
          }
  
          try {
              return (ClassLoader) m.invoke(Thread.currentThread(), null);
          } catch (IllegalAccessException e) {
              // assert(false)
              throw new ConfigurationError("Unexpected IllegalAccessException",
                                           e);
          } catch (InvocationTargetException e) {
              // assert(e.getTargetException() instanceof SecurityException)
              throw new ConfigurationError("Unexpected InvocationTargetException",
                                           e);
          }
      }
  
      /**
       * Create an instance of a class using the specified ClassLoader
       */
      private static Object newInstance(String className,
                                        ClassLoader classLoader)
          throws ConfigurationError
      {
          try {
              if (classLoader != null) {
                  try {
                      return classLoader.loadClass(className).newInstance ();
                  } catch (ClassNotFoundException x) {
                        // try again
                  }
              }
              return Class.forName(className).newInstance(); 
          } catch (ClassNotFoundException x) {
              throw new ConfigurationError(
                  "Provider " + className + " not found", x);
          } catch (Exception x) {
              throw new ConfigurationError(
                  "Provider " + className + " could not be instantiated: " + x,
                  x);
          }
      }
  
      /**
       * Finds the implementation Class object in the specified order.  Main
       * entry point.
       * @return Class object of factory, never null
       *
       * @param factoryId             Name of the factory to find, same as
       *                              a property name
       * @param fallbackClassName     Implementation class name, if nothing else
       *                              is found.  Use null to mean no fallback.
       *
       * @exception FactoryFinder.ConfigurationError
       *
       * Package private so this code can be shared.
       */
      static Object find(String factoryId, String fallbackClassName)
          throws ConfigurationError
      {
          debugPrintln("debug is on");
  
          ClassLoader classLoader = findClassLoader();
  
          // Use the system property first
          try {
              String systemProp =
                  System.getProperty( factoryId );
              if( systemProp!=null) {
                  debugPrintln("found system property " + systemProp);
                  return newInstance(systemProp, classLoader);
              }
          } catch (SecurityException se) {
          }
  
          // try to read from $java.home/lib/xml.properties
          try {
              String javah=System.getProperty( "java.home" );
              String configFile = javah + File.separator +
                  "lib" + File.separator + "jaxrpc.properties";
              File f=new File( configFile );
              if( f.exists()) {
                  Properties props=new Properties();
                  props.load( new FileInputStream(f));
                  String factoryClassName = props.getProperty(factoryId);
                  debugPrintln("found java.home property " + factoryClassName);
                  return newInstance(factoryClassName, classLoader);
              }
          } catch(Exception ex ) {
              if( debug ) ex.printStackTrace();
          }
  
          String serviceId = "META-INF/services/" + factoryId;
          // try to find services in CLASSPATH
          try {
              InputStream is=null;
              if (classLoader == null) {
                  is=ClassLoader.getSystemResourceAsStream( serviceId );
              } else {
                  is=classLoader.getResourceAsStream( serviceId );
              }
          
              if( is!=null ) {
                  debugPrintln("found " + serviceId);
  
                  // Read the service provider name in UTF-8 as specified in
                  // the jar spec.  Unfortunately this fails in Microsoft
                  // VJ++, which does not implement the UTF-8
                  // encoding. Theoretically, we should simply let it fail in
                  // that case, since the JVM is obviously broken if it
                  // doesn't support such a basic standard.  But since there
                  // are still some users attempting to use VJ++ for
                  // development, we have dropped in a fallback which makes a
                  // second attempt using the platform's default encoding. In
                  // VJ++ this is apparently ASCII, which is a subset of
                  // UTF-8... and since the strings we'll be reading here are
                  // also primarily limited to the 7-bit ASCII range (at
                  // least, in English versions), this should work well
                  // enough to keep us on the air until we're ready to
                  // officially decommit from VJ++. [Edited comment from
                  // jkesselm]
                  BufferedReader rd;
                  try {
                      rd = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                  } catch (java.io.UnsupportedEncodingException e) {
                      rd = new BufferedReader(new InputStreamReader(is));
                  }
          
                  String factoryClassName = rd.readLine();
                  rd.close();
  
                  if (factoryClassName != null &&
                      ! "".equals(factoryClassName)) {
                      debugPrintln("loaded from services: " + factoryClassName);
                      return newInstance(factoryClassName, classLoader);
                  }
              }
          } catch( Exception ex ) {
              if( debug ) ex.printStackTrace();
          }
  
          if (fallbackClassName == null) {
              throw new ConfigurationError(
                  "Provider for " + factoryId + " cannot be found", null);
          }
  
          debugPrintln("loaded from fallback value: " + fallbackClassName);
          return newInstance(fallbackClassName, classLoader);
      }
  
      static class ConfigurationError extends Error {
          private Exception exception;
  
          /**
           * Construct a new instance with the specified detail string and
           * exception.
           */
          ConfigurationError(String msg, Exception x) {
              super(msg);
              this.exception = x;
          }
  
          Exception getException() {
              return exception;
          }
      }
  }
  
  
  
  1.4       +0 -2      xml-axis/java/src/org/apache/axis/utils/JWSClassLoader.java
  
  Index: JWSClassLoader.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/utils/JWSClassLoader.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- JWSClassLoader.java	17 May 2002 19:09:34 -0000	1.3
  +++ JWSClassLoader.java	19 Jun 2002 23:14:41 -0000	1.4
  @@ -63,8 +63,6 @@
    * to reload a JWS, we replace the ClassLoader for that class and let the
    * old one get GC'ed.
    *
  - * This is a simplified version of the former AxisClassLoader.
  - *
    * @author Glen Daniels (gdaniels@apache.org)
    * @author Doug Davis (dug@us.ibm.com)
    */
  
  
  
  1.9       +0 -1      xml-axis/java/test/utils/PackageTests.java
  
  Index: PackageTests.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/utils/PackageTests.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- PackageTests.java	2 Apr 2002 22:05:19 -0000	1.8
  +++ PackageTests.java	19 Jun 2002 23:14:42 -0000	1.9
  @@ -15,7 +15,6 @@
       {
           TestSuite suite = new TestSuite("All axis.utils tests");
   
  -        suite.addTest(TestAxisClassLoader.suite());
           // suite.addTest(TestOptions.suite()); //comment out for now - this
           // class is a mess
           suite.addTest(TestQName.suite());