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;