Hi Rony,
On 1/7/06, Rony G. Flatscher <[EMAIL PROTECTED]> wrote: > 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). +1 for the suggested changes Sanka > > 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] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]