Author: rony Date: Sun Jan 15 14:08:31 2012 New Revision: 1231670 URL: http://svn.apache.org/viewvc?rev=1231670&view=rev Log: [BSF-18] plus some slight formatting and tidying up
Modified: commons/proper/bsf/trunk/src/main/java/org/apache/bsf/util/EngineUtils.java Modified: commons/proper/bsf/trunk/src/main/java/org/apache/bsf/util/EngineUtils.java URL: http://svn.apache.org/viewvc/commons/proper/bsf/trunk/src/main/java/org/apache/bsf/util/EngineUtils.java?rev=1231670&r1=1231669&r2=1231670&view=diff ============================================================================== --- commons/proper/bsf/trunk/src/main/java/org/apache/bsf/util/EngineUtils.java (original) +++ commons/proper/bsf/trunk/src/main/java/org/apache/bsf/util/EngineUtils.java Sun Jan 15 14:08:31 2012 @@ -34,7 +34,13 @@ import org.apache.bsf.BSFManager; * @author Rony G. Flatscher (added addEventListenerReturningEventInfos) */ - /* 2007-09-21: Rony G. Flatscher, new class loading sequence: + /* + 2012-01-15: Rony G. Flatscher + - take into account that the context thread class loader is not set, hence + raise an exception in loadClass(mgr,name) instead of returning null + - corrected some indentations + + 2007-09-21: Rony G. Flatscher, new class loading sequence: - Thread's context class loader - settable class loader stored with BSF manager @@ -196,18 +202,18 @@ public class EngineUtils { bean.getClass (); // now try to call method with the right signature - try { - Method m; - try { - m = MethodUtils.getMethod (beanClass, methodName, argTypes, - isStaticOnly); - } catch (NoSuchMethodException e) { - // ok, so that didn't work - now try converting any primitive - // wrapper types to their primitive counterparts - try { - // if args is null the NullPointerException will get caught - // below and the right thing'll happen .. ugly but works - for (int i = 0; i < args.length; i++) { + try { + Method m; + try { + m = MethodUtils.getMethod (beanClass, methodName, argTypes, + isStaticOnly); + } catch (NoSuchMethodException e) { + // ok, so that didn't work - now try converting any primitive + // wrapper types to their primitive counterparts + try { + // if args is null the NullPointerException will get caught + // below and the right thing'll happen .. ugly but works + for (int i = 0; i < args.length; i++) { if (args[i] instanceof Number) { if (args[i] instanceof Byte) argTypes[i] = byte.class; @@ -219,17 +225,17 @@ public class EngineUtils { } else if (args[i] instanceof Boolean) argTypes[i] = boolean.class; else if (args[i] instanceof Character) argTypes[i] = char.class; - } + } - m = MethodUtils.getMethod (beanClass, methodName, argTypes, - isStaticOnly); - } catch (Exception e2) { - // throw the original - throw e; - } - } + m = MethodUtils.getMethod (beanClass, methodName, argTypes, + isStaticOnly); + } catch (Exception e2) { + // throw the original + throw e; + } + } - // call it, and return the result + // call it, and return the result try { return m.invoke (bean, args); } @@ -240,10 +246,10 @@ public class EngineUtils { Modifier.isPublic(m.getModifiers()) ) // if a public method allow access to it { m.setAccessible(true); // allow unconditional access to method - return m.invoke (bean, args); + return m.invoke (bean, args); } - // re-throw the exception - throw e; + // re-throw the exception + throw e; } } catch (Exception e) { @@ -356,9 +362,11 @@ public class EngineUtils { /** * 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). + * <ul> + * <li> Thread's context class loader, + * <li> settable class loader stored with BSFManager, + * <li> BSFManager's defining class loader, + * <li> BSF customized class loader (from the BSFManager's temporary directory). * * @param mgr BSFManager who's classLoader and tempDir props are * consulted @@ -374,18 +382,15 @@ public class EngineUtils { 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) { + // TCCL may not be set, adapt logic! + ClassLoader cl=Thread.currentThread().getContextClassLoader(); + if (cl!=null) + { + 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") @@ -403,12 +408,6 @@ public class EngineUtils { 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 { @@ -421,6 +420,8 @@ public class EngineUtils { "[EngineUtils.loadClass()] unable to load class '" + name + "':" + e, e); } } - return null; + + throw new BSFException (BSFException.REASON_OTHER_ERROR, + "[EngineUtils.loadClass()] unable to load class '" + name + "'"); } }