garyp 00/10/10 12:14:28
Modified: java/src/org/apache/xalan/extensions ExtensionHandler.java
ExtensionHandlerGeneral.java
ExtensionHandlerJavaClass.java
ExtensionHandlerJavaPackage.java
MethodResolver.java
Log:
Rework BSF reflection;
change element call to check for ElemExtensionCall as second arg,
not Element.
Revision Changes Path
1.3 +3 -65
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.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ExtensionHandler.java 2000/10/10 03:38:39 1.2
+++ ExtensionHandler.java 2000/10/10 19:14:12 1.3
@@ -67,7 +67,6 @@
import org.w3c.dom.Node;
import org.apache.xalan.templates.Stylesheet;
import org.apache.xalan.utils.QName;
-import org.apache.xalan.utils.StringVector;
// Temp??
import org.apache.xalan.transformer.TransformerImpl;
@@ -88,57 +87,7 @@
protected String m_namespaceUri; // uri of the extension namespace
protected String m_scriptLang; // scripting language of implementation
- public static final String BSF_HANDLER=
- "org.apache.xalan.extensions.ExtensionHandlerGeneral";
- /** Use dynamic loading to load the BSF ( or other ) extension handler.
- */
- public static ExtensionHandler createGeneralHandler(String namespaceUri,
- StringVector elemNames,
- StringVector funcNames,
- String scriptLang,
- String scriptSrcURL,
- String scriptSrc)
- throws SAXException
- {
- try {
- Class ehClass=Class.forName( BSF_HANDLER );
- ExtensionHandler eh= (ExtensionHandler)ehClass.newInstance();
- eh.init( namespaceUri, elemNames, funcNames, scriptLang,
- scriptSrcURL, scriptSrc );
- return eh;
- } catch ( Exception ex ) {
- return null;
- }
- }
-
- /** Initalize an extension handler with all the information needed.
- * @param namespaceUri the extension namespace URI that I'm implementing
- * @param funcNames string containing list of functions of extension NS
- * @param lang language of code implementing the extension
- * @param srcURL value of src attribute (if any) - treated as a URL
- * or a classname depending on the value of lang. If
- * srcURL is not null, then scriptSrc is ignored.
- * @param scriptSrc the actual script code (if any)
- */
- protected void init( String namespaceUri,
- StringVector elemNames,
- StringVector funcNames,
- String scriptLang,
- String scriptSrcURL,
- String scriptSrc)
- throws SAXException
- {
-
- }
-
- /**
- * Construct a new extension handler. It must be initialized
- * with init()
- */
- protected ExtensionHandler() {
- }
-
/**
* Construct a new extension namespace handler given all the information
* needed.
@@ -148,25 +97,13 @@
*/
protected ExtensionHandler (String namespaceUri,
- String scriptLang)
- {
- this.init( namespaceUri, scriptLang);
- }
-
- /**
- * Initialize a new extension namespace handler given all the information
- * needed.
- *
- * @param namespaceUri the extension namespace URI that I'm implementing
- * @param scriptLang language of code implementing the extension
- */
- protected void init(String namespaceUri,
- String scriptLang)
+ String scriptLang)
{
m_namespaceUri = namespaceUri;
m_scriptLang = scriptLang;
}
+
/**
* Tests whether a certain function name is known within this namespace.
* @param function name of the function being tested
@@ -235,3 +172,4 @@
throws SAXException, IOException;
}
+
1.3 +52 -28
xml-xalan/java/src/org/apache/xalan/extensions/ExtensionHandlerGeneral.java
Index: ExtensionHandlerGeneral.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/extensions/ExtensionHandlerGeneral.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ExtensionHandlerGeneral.java 2000/10/10 03:38:39 1.2
+++ ExtensionHandlerGeneral.java 2000/10/10 19:14:14 1.3
@@ -54,6 +54,7 @@
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
+
package org.apache.xalan.extensions;
import java.util.Hashtable;
@@ -70,10 +71,6 @@
import org.xml.sax.SAXException;
-import com.ibm.bsf.BSFManager;
-import com.ibm.bsf.BSFEngine;
-import com.ibm.bsf.BSFException;
-
// Temp??
import org.apache.xalan.transformer.TransformerImpl;
@@ -82,6 +79,8 @@
import org.apache.xalan.utils.StringVector;
+import java.lang.reflect.Method;
+
/**
* <meta name="usage" content="internal"/>
@@ -97,14 +96,47 @@
private String m_scriptSrcURL; // URL of source of script (if any)
private Hashtable m_functions = new Hashtable (); // functions of
namespace
private Hashtable m_elements = new Hashtable (); // elements of
namespace
- private BSFManager m_mgr = new BSFManager(); // mgr used to run scripts
- private BSFEngine m_engine = null; // engine used
- public ExtensionHandlerGeneral()
- {
- super();
+ // BSF objects used to invoke BSF by reflection. Do not import the BSF
classes
+ // since we don't want a compile dependency on BSF.
+
+ private Object m_mgr; // BSF manager used to run
scripts
+ private Object m_engine; // BSF engine used to run
scripts
+
+ // static fields
+
+ private static final String BSF_MANAGER = "com.ibm.bsf.BSFManager";
+ private static final Class managerClass;
+ private static final Method mgrLoadScriptingEngine;
+ private static final String BSF_ENGINE = "com.ibm.bsf.BSFEngine";
+ private static final Method engineExec; // Engine call to
"compile" scripts
+ private static final Method engineCall; // Engine call to
invoke scripts
+ private static final Integer NEG1INT = new Integer(-1);
+
+ static {
+ try
+ {
+ managerClass = Class.forName(BSF_MANAGER);
+ mgrLoadScriptingEngine = managerClass.getMethod("loadScriptingEngine",
+ new Class[]
{String.class});
+ Class engineClass = Class.forName(BSF_ENGINE);
+ engineExec = engineClass.getMethod("exec",
+ new Class[] {String.class, Integer.TYPE,
Integer.TYPE, Object.class});
+ engineCall = engineClass.getMethod("call",
+ new Class[] {Object.class, String.class,
+
Class.forName("[Ljava.lang.Object;")});
+ }
+ catch (Exception e)
+ {
+ managerClass = null;
+ mgrLoadScriptingEngine = null;
+ engineExec = null;
+ engineCall = null;
+ e.printStackTrace();
+ }
}
+
/**
* Construct a new extension namespace handler given all the information
* needed.
@@ -125,21 +157,8 @@
String scriptSrc)
throws SAXException
{
- super();
- init( namespaceUri, elemNames, funcNames, scriptLang,
- scriptSrcURL, scriptSrc);
- }
+ super(namespaceUri, scriptLang);
- public void init(String namespaceUri,
- StringVector elemNames,
- StringVector funcNames,
- String scriptLang,
- String scriptSrcURL,
- String scriptSrc)
- throws SAXException
- {
- super.init(namespaceUri, scriptLang);
-
if (elemNames != null)
{
Object junk = new Object();
@@ -170,15 +189,20 @@
throw new SAXException("src attribute not yet supported for " +
scriptLang);
}
+ if (null == managerClass)
+ throw new SAXException("Could not initialize BSF manager");
+
try
{
- m_engine = m_mgr.loadScriptingEngine(scriptLang);
- m_engine.exec("XalanScript", -1, -1, m_scriptSrc); // "Compile"
the program
+ m_mgr = managerClass.newInstance();
+ m_engine = mgrLoadScriptingEngine.invoke(m_mgr, new Object[]
{scriptLang});
+ // "Compile" the program
+ engineExec.invoke(m_engine, new Object[] {"XalanScript", NEG1INT,
NEG1INT, m_scriptSrc});
}
- catch (BSFException e)
+ catch (Exception e)
{
e.printStackTrace();
- throw new SAXException(e);
+ throw new SAXException("Could not compile extension", e);
}
}
@@ -241,7 +265,7 @@
Object o = args.elementAt(i);
argArray[i] = (o instanceof XObject) ? ((XObject)o).object() : o;
}
- return m_engine.call (null, funcName, argArray);
+ return engineCall.invoke(m_engine, new Object[] {null, funcName,
argArray});
}
catch (Exception e)
{
1.3 +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.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ExtensionHandlerJavaClass.java 2000/10/08 18:38:17 1.2
+++ ExtensionHandlerJavaClass.java 2000/10/10 19:14:15 1.3
@@ -170,7 +170,7 @@
if ( (paramTypes.length == 2)
&& paramTypes[0].isAssignableFrom(
org.apache.xalan.extensions.XSLProcessorContext.class)
- && paramTypes[1].isAssignableFrom(org.w3c.dom.Element.class) )
+ &&
paramTypes[1].isAssignableFrom(org.apache.xalan.templates.ElemExtensionCall.class)
)
{
return true;
}
1.3 +2 -1
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.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ExtensionHandlerJavaPackage.java 2000/10/08 23:50:23 1.2
+++ ExtensionHandlerJavaPackage.java 2000/10/10 19:14:16 1.3
@@ -181,7 +181,8 @@
if ( (paramTypes.length == 2)
&& paramTypes[0].isAssignableFrom(
org.apache.xalan.extensions.XSLProcessorContext.class)
- && paramTypes[1].isAssignableFrom(org.w3c.dom.Element.class) )
+ && paramTypes[1].isAssignableFrom(
+
org.apache.xalan.templates.ElemExtensionCall.class) )
{
return true;
}
1.12 +1 -1
xml-xalan/java/src/org/apache/xalan/extensions/MethodResolver.java
Index: MethodResolver.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/extensions/MethodResolver.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- MethodResolver.java 2000/10/08 18:37:12 1.11
+++ MethodResolver.java 2000/10/10 19:14:19 1.12
@@ -285,7 +285,7 @@
{
Class[] paramTypes = method.getParameterTypes();
if ( (paramTypes.length == 2)
- && paramTypes[1].isAssignableFrom(org.w3c.dom.Element.class) )
+ &&
paramTypes[1].isAssignableFrom(org.apache.xalan.templates.ElemExtensionCall.class)
)
{
int score = -1;
if (paramTypes[0].isAssignableFrom(