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(
  
  
  

Reply via email to