Author: rony
Date: Sat Sep 22 12:18:16 2007
New Revision: 578478

URL: http://svn.apache.org/viewvc?rev=578478&view=rev
Log:
20070922 2017GMT Preliminary fix for issue 'BSF-7'.

Modified:
    jakarta/bsf/trunk/src/org/apache/bsf/BSFManager.java
    jakarta/bsf/trunk/src/org/apache/bsf/BSF_Log.java
    jakarta/bsf/trunk/src/org/apache/bsf/util/EngineUtils.java
    jakarta/bsf/trunk/src/org/apache/bsf/util/ReflectionUtils.java
    
jakarta/bsf/trunk/src/org/apache/bsf/util/event/generator/EventAdapterGenerator.java

Modified: jakarta/bsf/trunk/src/org/apache/bsf/BSFManager.java
URL: 
http://svn.apache.org/viewvc/jakarta/bsf/trunk/src/org/apache/bsf/BSFManager.java?rev=578478&r1=578477&r2=578478&view=diff
==============================================================================
--- jakarta/bsf/trunk/src/org/apache/bsf/BSFManager.java (original)
+++ jakarta/bsf/trunk/src/org/apache/bsf/BSFManager.java Sat Sep 22 12:18:16 
2007
@@ -59,15 +59,23 @@
  * @author   Rony G. Flatscher (added BSF_Log[Factory] to allow BSF to run 
without org.apache.commons.logging present)
  */
 
-// changed 2007-01-28: fixed Class.forName() to use the context class loader 
instead; oversaw this the last time
+// changed 2007-01-28: ---rgf, fixed Class.forName() to use the context class 
loader instead; oversaw this the last time
+/* changed 2007-09-17: ---rgf, some Java hosts do not set the Thread's context 
class loader and
+                               load BSF with a customized ClassLoader!
+                               Resolution:
+                               - use Thread context ClassLoader, if resource 
or class to
+                                 load not found, then
+                               - use the BSFManager's defining ClassLoader 
instead, if it is
+                                 different to the context ClassLoader
+*/
 
 public class BSFManager {
     // version string is in the form "abc.yyyymmdd" where
     // "abc" represents a dewey decimal number (three levels, each between 0 
and 9),
     // and "yyyy" a four digit year, "mm" a two digit month, "dd" a two digit 
day.
     //
-    // Example: "242.20070128" stands for: BSF version "2.4.2" as of 
"2007-01-28"
-    protected static String version="242.20070128";
+    // Example: "242.20070921" stands for: BSF version "2.4.3" as of 
"2007-09-21"
+    protected static String version="243.20070921";
 
     // table of registered scripting engines
     protected static Hashtable registeredEngines = new Hashtable();
@@ -75,6 +83,23 @@
     // mapping of file extensions to languages
     protected static Hashtable extn2Lang = new Hashtable();
 
+    // get the defined CL (ClassLoader which got used to define this class 
object) // rgf, 20070917
+    protected static ClassLoader definedClassLoader;
+/*
+    protected static ClassLoader appClassLoader;        // application/system 
class loader
+    protected static ClassLoader extClassLoader;        // extension (option) 
class loader
+*/
+
+    /** Returns the defined ClassLoader (the ClassLoader that got used to 
define the
+     *  org.apache.bsf.BSFManager class object).
+     *  @return the defined ClassLoader instance
+     */
+    public static ClassLoader getDefinedClassLoader()  // rgf, 20070917
+    {
+        return definedClassLoader;
+    }
+
+
     // table of scripting engine instances created by this manager.
     // only one instance of a given language engine is created by a single
     // manager instance.
@@ -87,10 +112,15 @@
     // of my interesting properties change
     protected PropertyChangeSupport pcs;
 
+/* rgf (20070917): wrong assumption; context ClassLoader needs to be explicitly
+                   requested before usage as BSF could be deployed with 
different
+                   context ClassLoaders on different threads!
+*/
+
     // 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 = 
Thread.currentThread().getContextClassLoader(); // rgf, 2006-01-05
+    protected ClassLoader classLoader = getClass().getClassLoader();
+    // rgf, 20070917, reset to original// 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
@@ -115,10 +145,27 @@
     //////////////////////////////////////////////////////////////////////
 
     static {
+        String strInfo="org.apache.bsf.BSFManager.dumpEnvironment() [from 
static{}]";
         try {
+            definedClassLoader=BSFManager.class.getClassLoader();   // get 
defining ClassLoader
+
+/*
+            RGFInfo.newSection(strInfo);
+            RGFInfo.dumpClassLoaderInfos(BSFManager.class, 
"org.apache.bsf.BSFManager");
+            RGFInfo.append("BSFManager.staticBlock, registering BSF scripting 
engines:\n");
+*/
+
             // Enumeration e = 
BSFManager.class.getClassLoader().getResources("org/apache/bsf/Languages.properties");
             // use the Thread's context class loader to locate the resources
-            Enumeration e = 
Thread.currentThread().getContextClassLoader().getResources("org/apache/bsf/Languages.properties");
+            String resourceName="org/apache/bsf/Languages.properties";
+            Enumeration e = 
Thread.currentThread().getContextClassLoader().getResources(resourceName);
+
+            if (!e.hasMoreElements()) // 20070917: if no resources (BSF 
engines!), then use defCL
+            {
+//                RGFInfo.append("==> no BSF engines found from context 
ClassLoader, now using defCL !\n");
+                e=definedClassLoader.getResources(resourceName);
+            }
+
             while (e.hasMoreElements()) {
                 URL url = (URL)e.nextElement();
                 InputStream is = url.openStream();
@@ -133,14 +180,15 @@
                     String className = value.substring(0, value.indexOf(","));
 
 
-
-
                     // get the extensions for this language
                     String exts = value.substring(value.indexOf(",")+1, 
value.length());
                     StringTokenizer st = new StringTokenizer(exts, "|");
                     String[] extensions = new String[st.countTokens()];
+
+//                    RGFInfo.append("\tregistering BSF engine: 
key=["+key+"]\tclassName=["+className+"] nr. of 
extensions=["+extensions.length+"\n");
                     for (int i = 0; st.hasMoreTokens(); i++) {
                         extensions[i] = ((String) st.nextToken()).trim();
+//                        
RGFInfo.append("\t\t--->extension=["+extensions[i]+"]\n");
                     }
 
                     registerScriptingEngine(key, className, extensions);
@@ -150,14 +198,22 @@
 
             ex.printStackTrace();
             System.err.println("Error reading Languages file " + ex);
+//            RGFInfo.append("\t*ERROR* reading Language file ["+ex+"]\n");
         } catch (NoSuchElementException nsee) {
 
             nsee.printStackTrace();
             System.err.println("Syntax error in Languages resource bundle");
+//            RGFInfo.append("\t*ERROR* Syntax error in Languages 
resourcebundle ["+nsee+"]\n");
         } catch (MissingResourceException mre) {
 
             mre.printStackTrace();
             System.err.println("Initialization error: " + mre.toString());
+//            RGFInfo.append("\t*ERROR* initializing ["+mre+"]\n");
+        }
+        finally
+        {
+//            RGFInfo.dumpEnvironment();
+//            RGFInfo.endSection(strInfo);
         }
     }
 
@@ -231,7 +287,7 @@
             result = resultf;
         } catch (PrivilegedActionException prive) {
 
-               logger.error("Exception: ", prive);
+               logger.error("[BSFManager] Exception: ", prive);
             throw (BSFException) prive.getException();
         }
 
@@ -284,7 +340,7 @@
                 });
         } catch (PrivilegedActionException prive) {
 
-               logger.error("Exception :", prive);
+               logger.error("[BSFManager] Exception :", prive);
             throw (BSFException) prive.getException();
         }
     }
@@ -327,7 +383,7 @@
                 });
         } catch (PrivilegedActionException prive) {
 
-               logger.error("Exception :", prive);
+               logger.error("[BSFManager] Exception :", prive);
             throw (BSFException) prive.getException();
         }
     }
@@ -371,7 +427,7 @@
                 });
         } catch (PrivilegedActionException prive) {
 
-               logger.error("Exception :", prive);
+               logger.error("[BSFManager] Exception :", prive);
             throw (BSFException) prive.getException();
         }
     }
@@ -460,7 +516,7 @@
             result = resultf;
         } catch (PrivilegedActionException prive) {
 
-               logger.error("Exception: ", prive);
+               logger.error("[BSFManager] Exception: ", prive);
             throw (BSFException) prive.getException();
         }
 
@@ -508,7 +564,7 @@
                 });
         } catch (PrivilegedActionException prive) {
 
-               logger.error("Exception :", prive);
+               logger.error("[BSFManager] Exception :", prive);
             throw (BSFException) prive.getException();
         }
     }
@@ -548,7 +604,7 @@
                 });
         } catch (PrivilegedActionException prive) {
 
-               logger.error("Exception :", prive);
+               logger.error("[BSFManager] Exception :", prive);
             throw (BSFException) prive.getException();
         }
     }
@@ -571,7 +627,7 @@
                 classPath = System.getProperty("java.class.path");
             } catch (Throwable t) {
 
-               logger.debug("Exception :", t);
+               logger.debug("[BSFManager] Exception :", t);
                 // prolly a security exception .. so no can do
             }
         }
@@ -610,16 +666,22 @@
                     loops++;
 
                     // Test to see if in classpath
+                    String engineName=null;
                     try {
-                        String engineName =
+                        engineName =
                             (String) registeredEngines.get(lang);
                         // Class.forName(engineName);
                         
Thread.currentThread().getContextClassLoader().loadClass (engineName); // rgf, 
2007-01-28
-                    } catch (ClassNotFoundException cnfe) {
+                    } catch (ClassNotFoundException cnfe) { // 20070917: hmm, 
maybe defCL can load it ?
+                        try {
+                            definedClassLoader.loadClass(engineName);
+                        }
+                        catch (ClassNotFoundException cnfe2) {
+                            // Bummer.
+                            lang = langval;
+                            continue;
+                        }
 
-                        // Bummer.
-                        lang = langval;
-                        continue;
                     }
 
                     // Got past that? Good.
@@ -633,7 +695,7 @@
             }
         }
         throw new BSFException(BSFException.REASON_OTHER_ERROR,
-                               "file extension missing or unknown: "
+                               "[BSFManager.getLangFromFilename] file 
extension missing or unknown: "
                                + "unable to determine language for '"
                                + fileName
                                + "'");
@@ -695,15 +757,23 @@
         // is it a registered language?
         String engineClassName = (String) registeredEngines.get(lang);
         if (engineClassName == null) {
-               logger.error("unsupported language: " + lang);
+               logger.error("[BSFManager] unsupported language: " + lang);
             throw new BSFException(BSFException.REASON_UNKNOWN_LANGUAGE,
-                                   "unsupported language: " + lang);
+                                   "[BSFManager.loadScriptingEngine()] 
unsupported language: " + lang);
         }
 
         // create the engine and initialize it. if anything goes wrong
         // except.
         try {
-            Class engineClass = 
Thread.currentThread().getContextClassLoader().loadClass (engineClassName);
+
+            Class engineClass;
+            try {  // 20070917
+                engineClass = 
Thread.currentThread().getContextClassLoader().loadClass (engineClassName);
+            }
+            catch (ClassNotFoundException cnfe) {
+                engineClass = definedClassLoader.loadClass (engineClassName);
+            }
+
                // (classLoader == null)
                //  ? // Class.forName(engineClassName)
                //    Thread.currentThread().getContextClassLoader().loadClass 
(engineClassName) // rgf, 2007-01-28
@@ -725,13 +795,13 @@
             return eng;
         } catch (PrivilegedActionException prive) {
 
-                   logger.error("Exception :", prive);
+                   logger.error("[BSFManager] Exception :", prive);
                 throw (BSFException) prive.getException();
         } catch (Throwable t) {
 
-               logger.error("Exception :", t);
+               logger.error("[BSFManager] Exception :", t);
             throw new BSFException(BSFException.REASON_OTHER_ERROR,
-                                   "unable to load language: " + lang,
+                                   "[BSFManager.loadScriptingEngine()] unable 
to load language: " + lang,
                                    t);
         }
     }
@@ -751,7 +821,7 @@
             return ((BSFDeclaredBean)objectRegistry.lookup(beanName)).bean;
         } catch (IllegalArgumentException e) {
 
-               logger.debug("Exception :", e);
+               logger.debug("[BSFManager] Exception :", e);
             return null;
         }
     }
@@ -800,6 +870,7 @@
         }
     }
 
+
     /**
      * Set the class loader for those that need to use it. Default is he
      * who loaded me or null (i.e., its Class.forName).
@@ -923,4 +994,6 @@
 
         objectRegistry.unregister(beanName);
     }
+
+
 }

Modified: jakarta/bsf/trunk/src/org/apache/bsf/BSF_Log.java
URL: 
http://svn.apache.org/viewvc/jakarta/bsf/trunk/src/org/apache/bsf/BSF_Log.java?rev=578478&r1=578477&r2=578478&view=diff
==============================================================================
--- jakarta/bsf/trunk/src/org/apache/bsf/BSF_Log.java (original)
+++ jakarta/bsf/trunk/src/org/apache/bsf/BSF_Log.java Sat Sep 22 12:18:16 2007
@@ -34,6 +34,7 @@
 */
 
 /* ---rgf, 2007-01-29, loading and invoking all methods via reflection
+   ---rgf, 2007-09-17, adjusted for using default class loader, if system 
class loader fails
 */
 
 public class BSF_Log // implements org.apache.commons.logging.Log
@@ -66,11 +67,21 @@
     final private static int isWarnEnabled  = 17 ;
 
     {           // try to demand load the apache commons logging LogFactory
-        try
+        try     // rgf, 20070917: o.k., if not found, try definedClassLoader 
instead
         {
             ClassLoader cl= Thread.currentThread().getContextClassLoader();
 
-            oac_Log        = cl.loadClass("org.apache.commons.logging.Log"     
  );
+            String str4Log="org.apache.commons.logging.Log";
+
+            try {
+                oac_Log        = cl.loadClass(str4Log);
+            }
+            catch (ClassNotFoundException e1) // not found by 
contextClassLoader
+            {                                 // try defined class loader 
instead
+                ClassLoader defCL=BSFManager.getDefinedClassLoader();
+                oac_Log = defCL.loadClass(str4Log);
+                cl=defCL;       // class found, hence we use the 
definedClassLoader here
+            }
 
             oac_LogFactory = 
cl.loadClass("org.apache.commons.logging.LogFactory");
 

Modified: jakarta/bsf/trunk/src/org/apache/bsf/util/EngineUtils.java
URL: 
http://svn.apache.org/viewvc/jakarta/bsf/trunk/src/org/apache/bsf/util/EngineUtils.java?rev=578478&r1=578477&r2=578478&view=diff
==============================================================================
--- jakarta/bsf/trunk/src/org/apache/bsf/util/EngineUtils.java (original)
+++ jakarta/bsf/trunk/src/org/apache/bsf/util/EngineUtils.java Sat Sep 22 
12:18:16 2007
@@ -1,12 +1,12 @@
 /*
- * Copyright 2004,2004 The Apache Software Foundation.
- * 
+ * Copyright 2004,2007 The Apache Software Foundation.
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -32,11 +32,22 @@
  * @author   Sam Ruby
  * @author   Rony G. Flatscher (added addEventListenerReturningEventInfos)
  */
+
+ /*  2007-09-21: Rony G. Flatscher, new class loading sequence:
+
+        - Thread's context class loader
+        - settable class loader stored with BSF manager
+        - BSFManager's defining class loader
+        - BSF-custom class loader (loads from temp dir)
+ */
 public class EngineUtils {
     // the BSF class loader that knows how to load from the a specific
     // temp directory
     static BSFClassLoader bsfCL;
 
+    // rgf, 20070917: class loaders that we might need to load classes
+    static ClassLoader bsfManagerDefinedCL=BSFManager.getDefinedClassLoader();
+
     // ---rgf, 2003-02-13, determine whether changing accessibility of Methods 
is possible
     static boolean bMethodHasSetAccessible=false;
     static {
@@ -86,7 +97,7 @@
         } catch (Exception e) {
             e.printStackTrace ();
             throw new BSFException (BSFException.REASON_OTHER_ERROR,
-                                    "ouch while adding event listener: "
+                                    "[EngineUtils.addEventListener()] ouch 
while adding event listener: "
                                     + e, e);
         }
     }
@@ -144,7 +155,7 @@
         } catch (Exception e) {
             e.printStackTrace ();
             throw new BSFException (BSFException.REASON_OTHER_ERROR,
-                                    "ouch while adding event listener: "
+                                    
"[EngineUtils.addEventListenerReturningEventInfos()] ouch while adding event 
listener: "
                                     + e, e);
         }
     }
@@ -240,7 +251,7 @@
                           ((InvocationTargetException)e).getTargetException () 
:
                           null;
             throw new BSFException (BSFException.REASON_OTHER_ERROR,
-                                    "method invocation failed: " + e +
+                                    "[EngineUtils.callBeanMethod()] method 
invocation failed: " + e +
                                     ((t==null) ? "" :
                                      (" target exception: " + t)), t);
         }
@@ -302,7 +313,7 @@
             }
         } catch (Exception e) {
             throw new BSFException (BSFException.REASON_OTHER_ERROR,
-                                    e.getMessage (), e);
+                                    "[EngineUtils.createBean()]" + 
e.getMessage (), e);
         }
     }
 
@@ -343,8 +354,10 @@
     }
 
     /**
-     * Load a class using the class loader of given manager. If that fails
-     * try using a class loader that loads from the tempdir of the manager.
+     * Loads a class using the following sequence of class loaders:
+     * Thread's context class loader, settable class loader stored with 
BSFManager,
+     * BSFManager's defining class loader, BSF customized class loader (from 
the
+     * BSFManager's temporary directory).
      *
      * @param mgr  BSFManager who's classLoader and tempDir props are
      *        consulted
@@ -356,13 +369,45 @@
      */
     public static Class loadClass (BSFManager mgr, String name)
         throws BSFException {
-        ClassLoader classLoader = mgr.getClassLoader ();
+
+        ClassLoader mgrCL = null;
 
         try {
+            // -------------------
+            // TODO: final decision about the sequence of class loaders !
+            //
+            // rgf, 20070917: class loader sequence:
+            //                - Thread's context class loader
+            //                - settable class loader stored with BSF manager
+            //                - BSFManager's defining class loader
+            //                - BSF-custom class loader (loads from temp dir)
+            try {   // try the Thread's context loader first
+                    return 
Thread.currentThread().getContextClassLoader().loadClass(name);
+            }
+            catch (ClassNotFoundException e01) {
+            }
+
+            try {   // try the class loader of the supplied BSFManager ("mgr")
+                mgrCL = mgr.getClassLoader ();
+                if (mgrCL != null) {
+                    return mgrCL.loadClass(name);
+                }
+            }
+            catch (ClassNotFoundException e02) {
+                    // o.k., now try the defined class loader
+            }
+
+                // try the class loader stored with the BSF manager
+            if (mgrCL != bsfManagerDefinedCL) {
+                return bsfManagerDefinedCL.loadClass(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
             try {
@@ -372,8 +417,9 @@
                 return bsfCL.loadClass (name);
             } catch (ClassNotFoundException e2) {
                 throw new BSFException (BSFException.REASON_OTHER_ERROR,
-                        "unable to load class '" + name + "':" + e, e);
+                        "[EngineUtils.loadClass()] unable to load class '" + 
name + "':" + e, e);
             }
         }
+        return null;
     }
 }

Modified: jakarta/bsf/trunk/src/org/apache/bsf/util/ReflectionUtils.java
URL: 
http://svn.apache.org/viewvc/jakarta/bsf/trunk/src/org/apache/bsf/util/ReflectionUtils.java?rev=578478&r1=578477&r2=578478&view=diff
==============================================================================
--- jakarta/bsf/trunk/src/org/apache/bsf/util/ReflectionUtils.java (original)
+++ jakarta/bsf/trunk/src/org/apache/bsf/util/ReflectionUtils.java Sat Sep 22 
12:18:16 2007
@@ -1,12 +1,12 @@
 /*
- * Copyright 2004,2004 The Apache Software Foundation.
- * 
+ * Copyright 2004,2007 The Apache Software Foundation.
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -16,6 +16,8 @@
 
 package org.apache.bsf.util;
 
+import org.apache.bsf.BSFManager;   // rgf, 20070917
+
 import java.beans.BeanInfo;
 import java.beans.Beans;
 import java.beans.EventSetDescriptor;
@@ -44,7 +46,16 @@
  * @author   Sanjiva Weerawarana
  * @author   Joseph Kesselman
  */
+ /*  2007-09-21: Rony G. Flatscher, new class loading sequence:
+
+        - supplied class loader (given as an argument)
+        - Thread's context class loader
+        - BSFManager's defining class loader
+ */
 public class ReflectionUtils {
+    // rgf, 20070921: class loaders that we might need to load classes
+    static ClassLoader bsfManagerDefinedCL=BSFManager.getDefinedClassLoader();
+
 
   //////////////////////////////////////////////////////////////////////////
 
@@ -67,7 +78,7 @@
    *            running add event listener method
    */
   public static void addEventListener (Object source, String eventSetName,
-                                                                          
EventProcessor processor)
+                                      EventProcessor processor)
           throws IntrospectionException, IllegalArgumentException,
                          IllegalAccessException, InstantiationException,
                          InvocationTargetException {
@@ -142,16 +153,77 @@
    * @exception IOException               if I/O error in beans.instantiate
    */
   public static Bean createBean (ClassLoader cld, String className,
-                                                                Class[] 
argTypes, Object[] args)
+                                Class[] argTypes, Object[] args)
           throws ClassNotFoundException, NoSuchMethodException,
                          InstantiationException, IllegalAccessException,
                          IllegalArgumentException, InvocationTargetException,
                          IOException {
        if (argTypes != null) {
+
+/* original (remarked 20070917, rgf)
          // find the right constructor and use that to create bean
          Class cl = (cld != null) ? cld.loadClass (className)
                                   : 
Thread.currentThread().getContextClassLoader().loadClass (className); // rgf, 
2006-01-05
                                    // : Class.forName (className);
+*/
+            // TODO: final decision about class loading strategy
+            // rgf, 20070917: if class loader given, use that one, else try
+            //                the Thread's context class loader and then
+            //                the BSFMananger defining class loader
+          Class cl=null;
+          ClassNotFoundException exCTX=null;
+
+// -----------------------------
+          if (cld != null) {    // class loader supplied as argument
+              try {     // CL passed as argument
+                  cl=cld.loadClass(className);
+              }
+              catch (ClassNotFoundException e02) {
+                  exCTX=e02;
+              }
+          }
+
+          if (cl==null) {
+              try {         // CTXCL
+                  
cl=Thread.currentThread().getContextClassLoader().loadClass(className);
+              }
+              catch (ClassNotFoundException e01)  {
+              }
+          }
+
+
+          if (cl==null) {   // class not loaded yet
+                    // defined CL
+              if (cld != bsfManagerDefinedCL) {   // if not used already, 
attempt to load
+                  cl=bsfManagerDefinedCL.loadClass(className);
+              }
+              else {    // already , throw exception
+                  throw exCTX;        // re-throw very first exception
+              }
+          }
+// -----------------------------
+
+/*
+          try {     // try supplied class loader
+              if (cld !=null)
+                  cl=cld.loadClass(className);
+          }
+          catch (ClassNotFoundException e01) {
+              try {
+                  
cl=Thread.currentThread().getContextClassLoader().loadClass(className);
+              }
+              catch (ClassNotFoundException e02)  {
+                  ClassLoader defCL=BSFManager.getDefinedClassLoader();
+                  if (cld != defCL) {
+                      cl=defCL.loadClass(className);
+                  }
+                  else
+                  {
+                      throw e01;        // re-throw original class not found 
exception
+                  }
+              }
+          }
+*/
 
          Constructor c = MethodUtils.getConstructor (cl, argTypes);
          return new Bean (cl, c.newInstance (args));
@@ -182,8 +254,7 @@
    * @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,
                          IllegalArgumentException, InvocationTargetException,
@@ -205,7 +276,7 @@
    */
   private static
   FeatureDescriptor findFeatureByName (String featureType, String name,
-                                                                          
FeatureDescriptor[] fds) {
+                                      FeatureDescriptor[] fds) {
        for (int i = 0; i < fds.length; i++) {
          if (name.equals (fds[i].getName())) {
                return fds[i];
@@ -229,7 +300,7 @@
          return new Bean (fieldType, value);
        } catch (NoSuchFieldException e) {
          throw new IllegalArgumentException ("field '" + fieldName + "' is " +
-                                                                               
  "unknown for '" + target + "'");
+                                             "unknown for '" + target + "'");
        }
   }
   //////////////////////////////////////////////////////////////////////////
@@ -250,7 +321,7 @@
    * @exception InvocationTargetException if read method excepts
    */
   public static Bean getProperty (Object target, String propName,
-                                                                 Integer index)
+                                 Integer index)
           throws IntrospectionException, IllegalArgumentException,
                          IllegalAccessException, InvocationTargetException {
        // find the property descriptor
@@ -259,7 +330,7 @@
          findFeatureByName ("property", propName, bi.getPropertyDescriptors 
());
        if (pd == null) {
          throw new IllegalArgumentException ("property '" + propName + "' is " 
+
-                                                                               
  "unknown for '" + target + "'");
+                                             "unknown for '" + target + "'");
        }
 
        // get read method and type of property
@@ -269,8 +340,8 @@
          // 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 +
-                                                                               
        "' as being indexed");
+                                                   "property '" + propName +
+                                                   "' as being indexed");
          }
          IndexedPropertyDescriptor ipd = (IndexedPropertyDescriptor) pd;
          rm = ipd.getIndexedReadMethod ();
@@ -282,7 +353,7 @@
 
        if (rm == null) {
          throw new IllegalArgumentException ("property '" + propName +
-                                                                               
  "' is not readable");
+                                             "' is not readable");
        }
 
        // now get the value
@@ -295,7 +366,7 @@
        return new Bean (propType, propVal);
   }
   public static void setField (Object target, String fieldName, Bean value,
-                                                          
TypeConvertorRegistry tcr)
+                              TypeConvertorRegistry tcr)
          throws IllegalArgumentException, IllegalAccessException {
        // This is to handle how we do static fields.
        Class targetClass = (target instanceof Class)
@@ -323,14 +394,14 @@
          }
          if (!okeydokey) {
                throw new IllegalArgumentException ("unable to assign '" + 
value.value +
-                                                                               
        "' to field '" + fieldName + "'");
+                                                   "' to field '" + fieldName 
+ "'");
          }
 
          // now set the value
          f.set (target, fieldVal);
        } catch (NoSuchFieldException e) {
          throw new IllegalArgumentException ("field '" + fieldName + "' is " +
-                                                                               
  "unknown for '" + target + "'");
+                                             "unknown for '" + target + "'");
        }
   }
   //////////////////////////////////////////////////////////////////////////
@@ -355,8 +426,8 @@
    * @exception InvocationTargetException if write method excepts
    */
   public static void setProperty (Object target, String propName,
-                                                                 Integer 
index, Object value,
-                                                                 Class 
valueType, TypeConvertorRegistry tcr)
+                                 Integer index, Object value,
+                                 Class valueType, TypeConvertorRegistry tcr)
           throws IntrospectionException, IllegalArgumentException,
                          IllegalAccessException, InvocationTargetException {
        // find the property descriptor
@@ -365,7 +436,7 @@
          findFeatureByName ("property", propName, bi.getPropertyDescriptors 
());
        if (pd == null) {
          throw new IllegalArgumentException ("property '" + propName + "' is " 
+
-                                                                               
  "unknown for '" + target + "'");
+                                             "unknown for '" + target + "'");
        }
 
        // get write method and type of property
@@ -375,7 +446,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;
@@ -388,7 +459,7 @@
 
        if (wm == null) {
          throw new IllegalArgumentException ("property '" + propName +
-                                                                               
  "' is not writeable");
+                                             "' is not writeable");
        }
 
        // type convert the value if necessary
@@ -408,7 +479,7 @@
        }
        if (!okeydokey) {
          throw new IllegalArgumentException ("unable to assign '" + value +
-                                                                               
  "' to property '" + propName + "'");
+                                             "' to property '" + propName + 
"'");
        }
 
        // now set the value

Modified: 
jakarta/bsf/trunk/src/org/apache/bsf/util/event/generator/EventAdapterGenerator.java
URL: 
http://svn.apache.org/viewvc/jakarta/bsf/trunk/src/org/apache/bsf/util/event/generator/EventAdapterGenerator.java?rev=578478&r1=578477&r2=578478&view=diff
==============================================================================
--- 
jakarta/bsf/trunk/src/org/apache/bsf/util/event/generator/EventAdapterGenerator.java
 (original)
+++ 
jakarta/bsf/trunk/src/org/apache/bsf/util/event/generator/EventAdapterGenerator.java
 Sat Sep 22 12:18:16 2007
@@ -1,5 +1,5 @@
 /*
- * Copyright 2004,2004 The Apache Software Foundation.
+ * Copyright 2004,2007 The Apache Software Foundation.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,11 +14,23 @@
  * limitations under the License.
  */
 
+
+ /*
+ 2007-01-29: Rony G. Flatscher: added BSF_Log[Factory] to allow BSF to run 
without org.apache.commons.logging present
+
+ 2007-09-21: Rony G. Flatscher, new class loading sequence:
+
+        - Thread's context class loader
+        - BSFManager's defining class loader
+ */
+
 package org.apache.bsf.util.event.generator;
 
 import org.apache.bsf.BSF_Log;
 import org.apache.bsf.BSF_LogFactory;
 
+import org.apache.bsf.BSFManager;
+
 import java.io.FileOutputStream;
 import java.io.IOException;
 
@@ -27,7 +39,6 @@
   *
   * Generate an "Event Adapter" dynamically during program execution
   *
- * @author   Rony G. Flatscher (added BSF_Log[Factory] to allow BSF to run 
without org.apache.commons.logging present)
   **/
 public class EventAdapterGenerator
 {
@@ -77,7 +88,19 @@
        }
        try
        // { EVENTLISTENER = Class.forName("java.util.EventListener"); }
-       { EVENTLISTENER = 
Thread.currentThread().getContextClassLoader().loadClass 
("java.util.EventListener"); } // rgf, 2006-01-05
+       {
+            // EVENTLISTENER = 
Thread.currentThread().getContextClassLoader().loadClass 
("java.util.EventListener"); // rgf, 2006-01-05
+
+            // rgf, 20070917: first try context class loader, then 
BSFManager's defining class loader
+            try {
+                 EVENTLISTENER = 
Thread.currentThread().getContextClassLoader().loadClass 
("java.util.EventListener");
+            }
+            catch(ClassNotFoundException ex01)
+            {
+                EVENTLISTENER = BSFManager.getDefinedClassLoader().loadClass 
("java.util.EventListener");
+            }
+
+        }
        catch(ClassNotFoundException ex)
        {
             System.err.println(ex.getMessage());
@@ -176,7 +199,7 @@
   /* methods that take an EventListener Class Type to create an 
EventAdapterClass */
   public static Class makeEventAdapterClass(Class listenerType,boolean 
writeClassFile)
   {
-      logger.info("EventAdapterGenerator");
+      logger.debug("EventAdapterGenerator");
 
         if( EVENTLISTENER.isAssignableFrom(listenerType) )
        {
@@ -191,7 +214,7 @@
 
          /* Derive Names */
          String listenerTypeName      = listenerType.getName();
-          logger.info("ListenerTypeName: "+listenerTypeName);
+          logger.debug("ListenerTypeName: "+listenerTypeName);
          String adapterClassName      =
                CLASSPACKAGE+
                (listenerTypeName.endsWith("Listener")
@@ -206,7 +229,7 @@
          {
                if (null != (cached = 
ldr.getLoadedClass(finalAdapterClassName)))
                {
-                    logger.info("cached:  "+cached);
+                    logger.debug("cached:  "+cached);
                  try
                  {
                        if (!listenerType.isAssignableFrom(cached))



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

Reply via email to