garyp       00/12/03 13:44:08

  Modified:    src/org/apache/xalan/xpath XSLTJavaClassEngine.java
  Log:
  Load extension using thread's ContextClassLoader, if available.
  Patch in XalanJ1 from Martin Klang <[EMAIL PROTECTED]>.
  
  Revision  Changes    Path
  1.11      +56 -4     
xml-xalan/src/org/apache/xalan/xpath/XSLTJavaClassEngine.java
  
  Index: XSLTJavaClassEngine.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/src/org/apache/xalan/xpath/XSLTJavaClassEngine.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- XSLTJavaClassEngine.java  2000/10/18 18:54:46     1.10
  +++ XSLTJavaClassEngine.java  2000/12/03 21:44:08     1.11
  @@ -78,7 +78,9 @@
   /**
    * <meta name="usage" content="internal"/>
    * This is a custom scripting engine for the XSLT processor's needs of 
calling
  - * into Java objects. 
  + * into Java objects.  Thanks to <a href="mailto:[EMAIL PROTECTED]">Martin 
Klang</a>
  + * for a patch to allow loading a Java extension using the threads's 
ContextClassLoader,
  + * where available.
    *
    * @author   Sanjiva Weerawarana ([EMAIL PROTECTED])
    */
  @@ -86,6 +88,56 @@
   public class XSLTJavaClassEngine extends BSFEngineImpl
        implements ExtensionFunctionHandler.ExtensionLiaison
   {
  +
  +  private static final Object NO_OBJS[] = new Object[0];
  +  private static Method getCCL;
  +
  +  static
  +  {
  +    try
  +    {
  +      getCCL = Thread.class.getMethod("getContextClassLoader", new Class[0]);
  +    }
  +    catch (Exception e)
  +    {
  +      getCCL = null;
  +    }
  +  }
  +
  +  /**
  +   * Replacement for Class.forName.  This method loads a class using the 
context class loader
  +   * if we're running under Java2 or higher.  If we're running under Java1, 
this
  +   * method just uses Class.forName to load the class.
  +   */
  +  protected Class getClassForName(String className)
  +        throws ClassNotFoundException
  +  {
  +    Class result = null;
  +    if (getCCL != null)
  +    {
  +      try
  +      {
  +        ClassLoader contextClassLoader = 
  +                      (ClassLoader) getCCL.invoke(Thread.currentThread(), 
NO_OBJS);
  +        result = contextClassLoader.loadClass(className);
  +      }
  +      catch (ClassNotFoundException cnfe)
  +      {
  +        throw cnfe;
  +      }
  +      catch (Exception e)
  +      {
  +        getCCL = null;
  +        result = Class.forName(className);
  +      }
  +    }
  +
  +    else
  +      result = Class.forName(className);
  +
  +    return result;
  +  }
  +
     /**
      * This is used by an application to evaluate an object containing
      * some expression - clearly not possible for compiled code ..
  @@ -131,7 +183,7 @@
         isNew = method.equals ("new");
         try 
         {
  -        object = Class.forName (className);
  +        object = getClassForName (className);
         }
         catch (ClassNotFoundException e) 
         {
  @@ -392,7 +444,7 @@
         try 
         {
           if(null == object)
  -          object = Class.forName (className);
  +          object = getClassForName (className);
         }
         catch (ClassNotFoundException e) 
         {
  @@ -762,7 +814,7 @@
               cname = scriptSrcURL.substring (6);
               isClass = true;
             }
  -          classObject = Class.forName (cname);
  +          classObject = getClassForName (cname);
             if (isClass) 
             {
               javaObject = classObject;
  
  
  

Reply via email to