garyp 00/12/03 13:12:35
Modified: java/src/org/apache/xalan/extensions ExtensionHandler.java
ExtensionHandlerJavaClass.java
ExtensionHandlerJavaPackage.java
ExtensionsTable.java
Log:
Load extension using thread's ContextClassLoader, if available.
Patch in XalanJ1 from Martin Klang <[EMAIL PROTECTED]>.
Revision Changes Path
1.8 +53 -0
xml-xalan/java/src/org/apache/xalan/extensions/ExtensionHandler.java
Index: ExtensionHandler.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/extensions/ExtensionHandler.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- ExtensionHandler.java 2000/11/23 04:57:17 1.7
+++ ExtensionHandler.java 2000/12/03 21:12:35 1.8
@@ -57,6 +57,7 @@
package org.apache.xalan.extensions;
import java.util.Vector;
+import java.lang.reflect.Method;
import java.io.IOException;
@@ -88,6 +89,58 @@
/** scripting language of implementation */
protected String m_scriptLang;
+
+ /** a zero length Object array used in getClassForName() */
+ private static final Object NO_OBJS[] = new Object[0];
+
+ /** the Method object for getContextClassLoader */
+ 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.
+ */
+ static 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;
+ }
+
/**
* Construct a new extension namespace handler given all the information
1.8 +1 -1
xml-xalan/java/src/org/apache/xalan/extensions/ExtensionHandlerJavaClass.java
Index: ExtensionHandlerJavaClass.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/extensions/ExtensionHandlerJavaClass.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- ExtensionHandlerJavaClass.java 2000/11/23 04:57:17 1.7
+++ ExtensionHandlerJavaClass.java 2000/12/03 21:12:35 1.8
@@ -117,7 +117,7 @@
super(namespaceUri, scriptLang, className);
try
{
- m_classObj = Class.forName(className);
+ m_classObj = getClassForName(className);
}
catch (ClassNotFoundException e)
{
1.8 +5 -5
xml-xalan/java/src/org/apache/xalan/extensions/ExtensionHandlerJavaPackage.java
Index: ExtensionHandlerJavaPackage.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/extensions/ExtensionHandlerJavaPackage.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- ExtensionHandlerJavaPackage.java 2000/11/23 04:57:18 1.7
+++ ExtensionHandlerJavaPackage.java 2000/12/03 21:12:35 1.8
@@ -135,7 +135,7 @@
int lastDot = fullName.lastIndexOf(".");
if (lastDot >= 0)
{
- Class myClass = Class.forName(fullName.substring(0, lastDot));
+ Class myClass = getClassForName(fullName.substring(0, lastDot));
Method[] methods = myClass.getMethods();
int nMethods = methods.length;
function = fullName.substring(lastDot + 1);
@@ -168,7 +168,7 @@
int lastDot = fullName.lastIndexOf(".");
if (lastDot >= 0)
{
- Class myClass = Class.forName(fullName.substring(0, lastDot));
+ Class myClass = getClassForName(fullName.substring(0, lastDot));
Method[] methods = myClass.getMethods();
int nMethods = methods.length;
element = fullName.substring(lastDot + 1);
@@ -283,7 +283,7 @@
className = m_className + funcName.substring(0, lastDot);
try
{
- classObj = Class.forName(className);
+ classObj = getClassForName(className);
}
catch (ClassNotFoundException e)
{
@@ -323,7 +323,7 @@
methodName = funcName.substring(lastDot + 1);
try
{
- classObj = Class.forName(className);
+ classObj = getClassForName(className);
}
catch (ClassNotFoundException e)
{
@@ -439,7 +439,7 @@
throw new TransformerException("Invalid element name specified " +
fullName);
try
{
- classObj = Class.forName(fullName.substring(0, lastDot));
+ classObj = getClassForName(fullName.substring(0, lastDot));
}
catch (ClassNotFoundException e)
{
1.11 +1 -1
xml-xalan/java/src/org/apache/xalan/extensions/ExtensionsTable.java
Index: ExtensionsTable.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/extensions/ExtensionsTable.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- ExtensionsTable.java 2000/11/13 16:26:36 1.10
+++ ExtensionsTable.java 2000/12/03 21:12:35 1.11
@@ -317,7 +317,7 @@
try
{
- Class.forName(className);
+ ExtensionHandler.getClassForName(className);
return new ExtensionHandlerJavaClass(ns, "javaclass", className);
}