Hi there,

while finalizing a little project in which BSF is used to allow ooRexx to be used as a scripting language for OpenOffice.org (will announce it, once it is out of beta), I wanted to use BSF as an optional Java extension. This way installation gets eased and it becomes an infrastructure any program on a system can use.

In order to do so, it was necessary to change Class.forName(...) to Thread.currentThread().getContextClassLoader().loadClass(...).

The attached diff will show you the differences which I would like to commit in two weeks, such that everyone has enough feedback time. This patch would also contain the renaming to "public static double byteArrayToDouble(byte value[])" (util/event/generator/ByteUtility.java).

Regards,

---rony
P.S.: Please express your thoughts about the suggest time-frames for getting BSF Golden and about the persons who could/should tackle different parts of it.




Index: BSFManager.java
===================================================================
--- BSFManager.java     (Revision 344174)
+++ BSFManager.java     (Arbeitskopie)
@@ -68,16 +68,16 @@
 
 /**
  * This class is the entry point to the bean scripting framework. An
- * application wishing to integrate scripting to a Java app would 
+ * application wishing to integrate scripting to a Java app would
  * place an instance of a BSFManager in their code and use its services
  * to register the beans they want to make available for scripting,
- * load scripting engines, and run scripts. 
+ * load scripting engines, and run scripts.
  * <p>
  * BSFManager serves as the registry of available scripting engines
  * as well. Loading and unloading of scripting engines is
  * supported as well. Each BSFManager loads one engine per language.
  * Several BSFManagers can be created per JVM.
- * 
+ *
  * @author   Sanjiva Weerawarana
  * @author   Matthew J. Duftler
  * @author   Sam Ruby
@@ -91,7 +91,7 @@
     // mapping of file extensions to languages
     protected static Hashtable extn2Lang = new Hashtable();
 
-    // table of scripting engine instances created by this manager. 
+    // table of scripting engine instances created by this manager.
     // only one instance of a given language engine is created by a single
     // manager instance.
     protected Hashtable loadedEngines = new Hashtable();
@@ -105,10 +105,11 @@
 
     // the class loader to use if a class loader is needed. Default is
     // he who loaded me (which may be null in which case its Class.forName).
-    protected ClassLoader classLoader = getClass().getClassLoader();
+    // protected ClassLoader classLoader = getClass().getClassLoader();
+    protected ClassLoader classLoader = 
Thread.currentThread().getContextClassLoader(); // rgf, 2006-01-05
 
     // temporary directory to use to dump temporary files into. Note that
-    // if class files are dropped here then unless this dir is in the 
+    // if class files are dropped here then unless this dir is in the
     // classpath or unless the classloader knows to look here, the classes
     // will not be found.
     protected String tempDir = ".";
@@ -116,7 +117,7 @@
     // classpath used by those that need a classpath
     protected String classPath;
 
-    // stores BSFDeclaredBeans representing objects 
+    // stores BSFDeclaredBeans representing objects
     // introduced by a client of BSFManager
     protected Vector declaredBeans = new Vector();
 
@@ -140,10 +141,10 @@
                 while (keys.hasMoreElements()) {
                     String key = (String) keys.nextElement();
                     String value = p.getProperty(key);
-                
+
                     StringTokenizer tokens = new StringTokenizer(value, ",");
                     String className = (String) tokens.nextToken();
-                
+
                     // get the extensions for this language
                     String exts = (String) tokens.nextToken();
                     StringTokenizer st = new StringTokenizer(exts, "|");
@@ -159,11 +160,11 @@
         catch (IOException ex) {
             ex.printStackTrace();
             System.err.println("Error reading Languages file " + ex);
-        } 
+        }
         catch (NoSuchElementException nsee) {
             nsee.printStackTrace();
             System.err.println("Syntax error in Languages resource bundle");
-        } 
+        }
         catch (MissingResourceException mre) {
             mre.printStackTrace();
             System.err.println("Initialization error: " + mre.toString());
@@ -206,10 +207,10 @@
         Object result = null;
 
         try {
-            final Object resultf = 
+            final Object resultf =
                 AccessController.doPrivileged(new PrivilegedExceptionAction() {
                         public Object run() throws Exception {
-                            return e.apply(sourcef, lineNof, columnNof, 
+                            return e.apply(sourcef, lineNof, columnNof,
                                            funcBodyf, paramNamesf, argumentsf);
                         }
                     });
@@ -254,12 +255,12 @@
         final Vector paramNamesf = paramNames;
         final Vector argumentsf = arguments;
         final CodeBuffer cbf = cb;
-        
+
         try {
             AccessController.doPrivileged(new PrivilegedExceptionAction() {
                     public Object run() throws Exception {
-                        e.compileApply(sourcef, lineNof, columnNof, 
-                                       funcBodyf, paramNamesf, 
+                        e.compileApply(sourcef, lineNof, columnNof,
+                                       funcBodyf, paramNamesf,
                                        argumentsf, cbf);
                         return null;
                     }
@@ -271,7 +272,7 @@
     }
 
     /**
-     * Compile the given expression of the given language into the given 
+     * Compile the given expression of the given language into the given
      * <tt>CodeBuffer</tt>.
      *
      * @param lang     language identifier
@@ -311,7 +312,7 @@
     }
 
     /**
-     * Compile the given script of the given language into the given 
+     * Compile the given script of the given language into the given
      * <tt>CodeBuffer</tt>.
      *
      * @param lang     language identifier
@@ -340,7 +341,7 @@
         try {
             AccessController.doPrivileged(new PrivilegedExceptionAction() {
                     public Object run() throws Exception {
-                        e.compileScript(sourcef, lineNof, columnNof, 
+                        e.compileScript(sourcef, lineNof, columnNof,
                                         scriptf, cbf);
                         return null;
                     }
@@ -352,7 +353,7 @@
     }
 
     /**
-     * Declare a bean. The difference between declaring and registering 
+     * Declare a bean. The difference between declaring and registering
      * is that engines are spsed to make declared beans "pre-available"
      * in the scripts as far as possible. That is, if a script author
      * needs a registered bean, he needs to look it up in some way. However
@@ -366,7 +367,7 @@
      * says they don't like this (by throwing an exception) then this
      * method will simply quit with that exception. That is, any engines
      * that come after than in the engine enumeration will not even be
-     * told about this new bean. 
+     * told about this new bean.
      * <p>
      * So, in general its best to declare beans before the manager has
      * been asked to load any engines because then the user can be informed
@@ -420,7 +421,7 @@
         final int lineNof = lineNo, columnNof = columnNo;
         final Object exprf = expr;
         Object result = null;
-        
+
         try {
             final Object resultf =
                 AccessController.doPrivileged(new PrivilegedExceptionAction() {
@@ -485,7 +486,7 @@
      * emulate an interactive session w/ the language.
      *
      * @param lang     language identifier
-     * @param source   (context info) the source of this expression 
+     * @param source   (context info) the source of this expression
      *                 (e.g., filename)
      * @param lineNo   (context info) the line number in source for expr
      * @param columnNo (context info) the column number in source for expr
@@ -531,7 +532,7 @@
         if (classPath == null) {
             try {
                 classPath = System.getProperty("java.class.path");
-            } 
+            }
             catch (Throwable t) {
                 // prolly a security exception .. so no can do
             }
@@ -541,17 +542,17 @@
 
     /**
      * Determine the language of a script file by looking at the file
-     * extension. 
+     * extension.
      *
      * @param fileName the name of the file
      *
      * @return the scripting language the file is in if the file extension
-     *         is known to me (must have been registered via 
+     *         is known to me (must have been registered via
      *         registerScriptingEngine).
      *
      * @exception BSFException if file's extension is unknown.
      */
-    public static String getLangFromFilename(String fileName) 
+    public static String getLangFromFilename(String fileName)
         throws BSFException {
         int dotIndex = fileName.lastIndexOf(".");
 
@@ -571,7 +572,7 @@
 
                     // Test to see if in classpath
                     try {
-                        String engineName = 
+                        String engineName =
                             (String) registeredEngines.get(lang);
                         Class.forName(engineName);
                     }
@@ -586,7 +587,7 @@
                 }
                 if (loops == 0) lang = langval;
             }
-            
+
             if (lang != null && lang != "") {
                 return lang;
             }
@@ -636,7 +637,7 @@
      *
      * @param lang string identifying language
      * @exception BSFException if the language is unknown (i.e., if it
-     *            has not been registered) with a reason of 
+     *            has not been registered) with a reason of
      *            REASON_UNKNOWN_LANGUAGE. If the language is known but
      *            if the interface can't be created for some reason, then
      *            the reason is set to REASON_OTHER_ERROR and the actual
@@ -677,7 +678,7 @@
             loadedEngines.put(lang, eng);
             pcs.addPropertyChangeListener(eng);
             return eng;
-        } 
+        }
         catch (PrivilegedActionException prive) {
                 throw (BSFException) prive.getException();
         }
@@ -690,7 +691,7 @@
 
     /**
      * return a handle to a bean registered in the bean registry by the
-     * application or a scripting engine. Returns null if bean is not found. 
+     * application or a scripting engine. Returns null if bean is not found.
      *
      * @param beanName name of bean to look up
      *
@@ -699,14 +700,14 @@
     public Object lookupBean(String beanName) {
         try {
             return ((BSFDeclaredBean)objectRegistry.lookup(beanName)).bean;
-        } 
+        }
         catch (IllegalArgumentException e) {
             return null;
         }
     }
 
-    /** 
-     * Registering a bean allows a scripting engine or the application to 
+    /**
+     * Registering a bean allows a scripting engine or the application to
      * access that bean by name and to manipulate it.
      *
      * @param beanName name to register under
@@ -725,7 +726,7 @@
     }
 
     /**
-     * Register a scripting engine in the static registry of the 
+     * Register a scripting engine in the static registry of the
      * BSFManager.
      *
      * @param lang string identifying language
@@ -771,7 +772,7 @@
 
     /**
      * Set the object registry used by this manager. By default a new
-     * one is created when the manager is new'ed and this overwrites 
+     * one is created when the manager is new'ed and this overwrites
      * that one.
      *
      * @param objectRegistry the registry to use
@@ -782,13 +783,13 @@
 
     /**
      * Temporary directory to put stuff into (for those who need to). Note
-     * that unless this directory is in the classpath or unless the 
-     * classloader knows to look in here, any classes here will not 
-     * be found! BSFManager provides a service method to load a class 
-     * which uses either the classLoader provided by the class loader 
-     * property or, if that fails, a class loader which knows to load from 
-     * the tempdir to try to load the class. Default value of tempDir 
-     * is "." (current working dir). 
+     * that unless this directory is in the classpath or unless the
+     * classloader knows to look in here, any classes here will not
+     * be found! BSFManager provides a service method to load a class
+     * which uses either the classLoader provided by the class loader
+     * property or, if that fails, a class loader which knows to load from
+     * the tempdir to try to load the class. Default value of tempDir
+     * is "." (current working dir).
      *
      * @param tempDir the temporary directory
      */
@@ -848,7 +849,7 @@
         }
     }
 
-    /** 
+    /**
      * Unregister a previously registered bean. Silent if name is not found.
      *
      * @param beanName name of bean to unregister
Index: util/event/generator/ByteUtility.java
===================================================================
--- util/event/generator/ByteUtility.java       (Revision 344174)
+++ util/event/generator/ByteUtility.java       (Arbeitskopie)
@@ -190,7 +190,7 @@
        temp += (((long)low[3]) & 0xFF);
        return temp;
   }
-  public static double byteArrayToDounle(byte value[])
+  public static double byteArrayToDouble(byte value[])
   {
        byte high[] = new byte[4];
        byte low[] = new byte[4];
Index: util/event/generator/EventAdapterGenerator.java
===================================================================
--- util/event/generator/EventAdapterGenerator.java     (Revision 344174)
+++ util/event/generator/EventAdapterGenerator.java     (Arbeitskopie)
@@ -105,11 +105,12 @@
          { WRITEDIRECTORY = WRITEDIRECTORY+"/"; }
        }
        try
-       { EVENTLISTENER = Class.forName("java.util.EventListener"); }
+       // { EVENTLISTENER = Class.forName("java.util.EventListener"); }
+       { EVENTLISTENER = 
Thread.currentThread().getContextClassLoader().loadClass 
("java.util.EventListener"); } // rgf, 2006-01-05
        catch(ClassNotFoundException ex)
-       { 
+       {
             System.err.println(ex.getMessage());
-            ex.printStackTrace(); 
+            ex.printStackTrace();
         }
 
        // start of the Java Class File
@@ -243,7 +244,7 @@
                          return cached;
                  }
                  catch(VerifyError ex)
-                 { 
+                 {
                       System.err.println(ex.getMessage());
                       ex.printStackTrace();
                       return cached;
@@ -559,9 +560,9 @@
                  fos.close();
                }
                catch(IOException ex)
-               { 
+               {
                     System.err.println(ex.getMessage());
-                    ex.printStackTrace(); 
+                    ex.printStackTrace();
                 }
 
                try
@@ -573,9 +574,9 @@
                  return ret;
                }
                catch (ClassNotFoundException ex)
-               { 
-                    System.err.println(ex.getMessage()); 
-                    ex.printStackTrace(); 
+               {
+                    System.err.println(ex.getMessage());
+                    ex.printStackTrace();
                 }
          }
 
@@ -589,9 +590,9 @@
                return ret;
          }
          catch(Exception ex)
-         { 
-              System.err.println(ex.getMessage()); 
-              ex.printStackTrace(); 
+         {
+              System.err.println(ex.getMessage());
+              ex.printStackTrace();
           }
        }
        else
Index: util/event/EventAdapterRegistry.java
===================================================================
--- util/event/EventAdapterRegistry.java        (Revision 344174)
+++ util/event/EventAdapterRegistry.java        (Arbeitskopie)
@@ -68,13 +68,13 @@
  * and if it doesn't find one looks for a standard implementation of
  * that adapter in the org.apache.bsf.util.event.adapters package with a
  * standard naming convention. The naming convention it assumes is the
- * following: for event listener type <tt>a.b.c.FooListener</tt>, 
- * it loads an adapter of type 
+ * following: for event listener type <tt>a.b.c.FooListener</tt>,
+ * it loads an adapter of type
  * <tt>org.apache.bsf.util.event.adapters.a_b_c_FooAdapter</tt>.
  * If both the loading and the dynamic generation fail, then a
  * <code>null</code> is returned.
  * <p>
- * 
+ *
  * @author   Sanjiva Weerawarana
  * @author   Matthew J. Duftler
  * @see      EventAdapter
@@ -89,14 +89,17 @@
   public static Class lookup (Class listenerType) {
        String key = listenerType.getName().replace ('.', '_');
        Class adapterClass = (Class) reg.get (key);
-       
+
        if (adapterClass == null) {
          String en = key.substring (0, key.lastIndexOf ("Listener"));
          String cn = adapterPackage + "." + en + adapterSuffix;
 
          try {
                // Try to resolve one.
-               adapterClass = (cl != null) ? cl.loadClass (cn) : Class.forName 
(cn);
+               // adapterClass = (cl != null) ? cl.loadClass (cn) : 
Class.forName (cn);
+               adapterClass = (cl != null) ? cl.loadClass (cn)
+                                            : 
Thread.currentThread().getContextClassLoader().loadClass (cn); // rgf, 
2006-01-05
+
          } catch (ClassNotFoundException e) {
                if (dynamic) {
                  // Unable to resolve one, try to generate one.
@@ -129,7 +132,7 @@
    * If the <code>dynamic</code> property is set to true, and the
    * <code>ClassLoader</code> is unable to resolve an adapter, one will be
    * dynamically generated.
-   * 
+   *
    * @param dynamic whether or not to dynamically generate adapters.
    */
   public static void setDynamic (boolean dynamic) {
Index: util/ReflectionUtils.java
===================================================================
--- util/ReflectionUtils.java   (Revision 344174)
+++ util/ReflectionUtils.java   (Arbeitskopie)
@@ -67,7 +67,7 @@
  * This file is a collection of reflection utilities. There are utilities
  * for creating beans, getting bean infos, setting/getting properties,
  * and binding events.
- * 
+ *
  * @author   Sanjiva Weerawarana
  * @author   Joseph Kesselman
  */
@@ -76,19 +76,19 @@
   //////////////////////////////////////////////////////////////////////////
 
   /**
-   * Add an event processor as a listener to some event coming out of an 
+   * Add an event processor as a listener to some event coming out of an
    * object.
-   * 
+   *
    * @param source       event source
    * @param eventSetName name of event set from event src to bind to
    * @param processor    event processor the event should be delegated to
    *                     when it occurs; either via processEvent or
-   *                     processExceptionableEvent. 
+   *                     processExceptionableEvent.
    *
    * @exception IntrospectionException if unable to introspect
    * @exception IllegalArgumentException if event set is unknown
-   * @exception IllegalAccessException if the event adapter class or 
-   *            initializer is not accessible. 
+   * @exception IllegalAccessException if the event adapter class or
+   *            initializer is not accessible.
    * @exception InstantiationException if event adapter instantiation fails
    * @exception InvocationTargetException if something goes wrong while
    *            running add event listener method
@@ -103,7 +103,7 @@
        EventSetDescriptor esd = (EventSetDescriptor)
          findFeatureByName ("event", eventSetName, bi.getEventSetDescriptors 
());
        if (esd == null) {
-         throw new IllegalArgumentException ("event set '" + eventSetName + 
+         throw new IllegalArgumentException ("event set '" + eventSetName +
                                                                                
  "' unknown for source type '" +
                                                                                
  source.getClass () + "'");
        }
@@ -128,10 +128,10 @@
        Object[] args;
        if (eventSetName.equals ("propertyChange") ||
                eventSetName.equals ("vetoableChange")) {
-         // In Java 1.2, beans may have direct listener adding methods 
+         // In Java 1.2, beans may have direct listener adding methods
          // for property and vetoable change events which take the
          // property name as a filter to be applied at the event source.
-         // The filter property of the event processor should be used 
+         // The filter property of the event processor should be used
          // in this case to support the source-side filtering.
          //
          // ** TBD **: the following two lines need to change appropriately
@@ -164,16 +164,18 @@
    * @exception InvocationTargetException if constructor excepted
    * @exception IOException               if I/O error in beans.instantiate
    */
-  public static Bean createBean (ClassLoader cld, String className, 
-                                                                Class[] 
argTypes, Object[] args) 
+  public static Bean createBean (ClassLoader cld, String className,
+                                                                Class[] 
argTypes, Object[] args)
           throws ClassNotFoundException, NoSuchMethodException,
-                         InstantiationException, IllegalAccessException, 
+                         InstantiationException, IllegalAccessException,
                          IllegalArgumentException, InvocationTargetException,
                          IOException {
        if (argTypes != null) {
          // find the right constructor and use that to create bean
          Class cl = (cld != null) ? cld.loadClass (className)
-                                                          : Class.forName 
(className);
+                                  : 
Thread.currentThread().getContextClassLoader().loadClass (className); // rgf, 
2006-01-05
+                                   // : Class.forName (className);
+
          Constructor c = MethodUtils.getConstructor (cl, argTypes);
          return new Bean (cl, c.newInstance (args));
        } else {
@@ -203,10 +205,10 @@
    * @exception InvocationTargetException if constructor excepted
    * @exception IOException               if I/O error in beans.instantiate
    */
-  public static Bean createBean (ClassLoader cld, String className, 
-                                                                Object[] args) 
+  public static Bean createBean (ClassLoader cld, String className,
+                                                                Object[] args)
           throws ClassNotFoundException, NoSuchMethodException,
-                         InstantiationException, IllegalAccessException, 
+                         InstantiationException, IllegalAccessException,
                          IllegalArgumentException, InvocationTargetException,
                          IOException {
        Class[] argTypes = null;
@@ -221,10 +223,10 @@
   //////////////////////////////////////////////////////////////////////////
 
   /**
-   * locate the item in the fds array whose name is as given. returns 
+   * locate the item in the fds array whose name is as given. returns
    * null if not found.
    */
-  private static 
+  private static
   FeatureDescriptor findFeatureByName (String featureType, String name,
                                                                           
FeatureDescriptor[] fds) {
        for (int i = 0; i < fds.length; i++) {
@@ -244,7 +246,7 @@
        try {
          Field f = targetClass.getField (fieldName);
          Class fieldType = f.getType ();
-  
+
          // Get the value and return it.
          Object value = f.get (target);
          return new Bean (fieldType, value);
@@ -276,7 +278,7 @@
                          IllegalAccessException, InvocationTargetException {
        // find the property descriptor
        BeanInfo bi = Introspector.getBeanInfo (target.getClass ());
-       PropertyDescriptor pd = (PropertyDescriptor) 
+       PropertyDescriptor pd = (PropertyDescriptor)
          findFeatureByName ("property", propName, bi.getPropertyDescriptors 
());
        if (pd == null) {
          throw new IllegalArgumentException ("property '" + propName + "' is " 
+
@@ -290,7 +292,7 @@
          // if index != null, then property is indexed - pd better be so too
          if (!(pd instanceof IndexedPropertyDescriptor)) {
                throw new IllegalArgumentException ("attempt to get non-indexed 
" +
-                                                                               
        "property '" + propName + 
+                                                                               
        "property '" + propName +
                                                                                
        "' as being indexed");
          }
          IndexedPropertyDescriptor ipd = (IndexedPropertyDescriptor) pd;
@@ -302,7 +304,7 @@
        }
 
        if (rm == null) {
-         throw new IllegalArgumentException ("property '" + propName + 
+         throw new IllegalArgumentException ("property '" + propName +
                                                                                
  "' is not readable");
        }
 
@@ -377,12 +379,12 @@
    */
   public static void setProperty (Object target, String propName,
                                                                  Integer 
index, Object value,
-                                                                 Class 
valueType, TypeConvertorRegistry tcr) 
+                                                                 Class 
valueType, TypeConvertorRegistry tcr)
           throws IntrospectionException, IllegalArgumentException,
                          IllegalAccessException, InvocationTargetException {
        // find the property descriptor
        BeanInfo bi = Introspector.getBeanInfo (target.getClass ());
-       PropertyDescriptor pd = (PropertyDescriptor) 
+       PropertyDescriptor pd = (PropertyDescriptor)
          findFeatureByName ("property", propName, bi.getPropertyDescriptors 
());
        if (pd == null) {
          throw new IllegalArgumentException ("property '" + propName + "' is " 
+
@@ -397,7 +399,7 @@
          // if index != null, then property is indexed - pd better be so too
          if (!(pd instanceof IndexedPropertyDescriptor)) {
                throw new IllegalArgumentException ("attempt to set non-indexed 
" +
-                                                                               
        "property '" + propName + 
+                                                                               
        "property '" + propName +
                                                                                
        "' as being indexed");
          }
          IndexedPropertyDescriptor ipd = (IndexedPropertyDescriptor) pd;
@@ -409,7 +411,7 @@
        }
 
        if (wm == null) {
-         throw new IllegalArgumentException ("property '" + propName + 
+         throw new IllegalArgumentException ("property '" + propName +
                                                                                
  "' is not writeable");
        }
 
Index: util/EngineUtils.java
===================================================================
--- util/EngineUtils.java       (Revision 344174)
+++ util/EngineUtils.java       (Arbeitskopie)
@@ -339,7 +339,9 @@
         ClassLoader classLoader = mgr.getClassLoader ();
 
         try {
-            return (classLoader == null) ? Class.forName (name)
+            return (classLoader == null) ?
+                       // Class.forName (name)
+                       
Thread.currentThread().getContextClassLoader().loadClass (name)
                 : classLoader.loadClass (name);
         } catch (ClassNotFoundException e) {
             // try to load it from the temp dir using my own class loader

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to