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]