Author: rony Date: Mon Mar 27 10:27:31 2006 New Revision: 389218 URL: http://svn.apache.org/viewcvs?rev=389218&view=rev Log: 2006-03-27 Fix for dynamic event adapter creation bug, added EngineUtils.addEventListenerReturningEventInfos() allowing access to supplied event-object, contains special transient OpenOffice.org (OOo) support code for event adapter creations (applicable for OOo version <= 2.0.3).
Added: jakarta/bsf/trunk/src/org/apache/bsf/util/BSFEventProcessorReturningEventInfos.java (with props) Modified: jakarta/bsf/trunk/src/org/apache/bsf/BSFManager.java jakarta/bsf/trunk/src/org/apache/bsf/util/BSFEventProcessor.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/EventAdapterRegistry.java jakarta/bsf/trunk/src/org/apache/bsf/util/event/generator/AdapterClassLoader.java jakarta/bsf/trunk/src/org/apache/bsf/util/event/generator/EventAdapterGenerator.java jakarta/bsf/trunk/xdocs/projects.xml Modified: jakarta/bsf/trunk/src/org/apache/bsf/BSFManager.java URL: http://svn.apache.org/viewcvs/jakarta/bsf/trunk/src/org/apache/bsf/BSFManager.java?rev=389218&r1=389217&r2=389218&view=diff ============================================================================== --- jakarta/bsf/trunk/src/org/apache/bsf/BSFManager.java (original) +++ jakarta/bsf/trunk/src/org/apache/bsf/BSFManager.java Mon Mar 27 10:27:31 2006 @@ -90,7 +90,7 @@ // version string in the form of: "abb.yyyymmdd", // where "a" is the major version number, "bb" the minor version number, // and "yyyymmdd" represents the date in sorted order (four digit year, two digit month, two digit day) - protected static String version="204.20060117"; + protected static String version="205.20060327"; // table of registered scripting engines protected static Hashtable registeredEngines = new Hashtable(); @@ -127,7 +127,7 @@ // stores BSFDeclaredBeans representing objects // introduced by a client of BSFManager protected Vector declaredBeans = new Vector(); - + private Log logger = LogFactory.getLog(this.getClass().getName()); ////////////////////////////////////////////////////////////////////// @@ -224,7 +224,7 @@ Vector arguments) throws BSFException { logger.debug("BSFManager:apply"); - + final BSFEngine e = loadScriptingEngine(lang); final String sourcef = source; final int lineNof = lineNo, columnNof = columnNo; @@ -277,7 +277,7 @@ CodeBuffer cb) throws BSFException { logger.debug("BSFManager:compileApply"); - + final BSFEngine e = loadScriptingEngine(lang); final String sourcef = source; final int lineNof = lineNo, columnNof = columnNo; @@ -324,7 +324,7 @@ CodeBuffer cb) throws BSFException { logger.debug("BSFManager:compileExpr"); - + final BSFEngine e = loadScriptingEngine(lang); final String sourcef = source; final int lineNof = lineNo, columnNof = columnNo; @@ -367,7 +367,7 @@ CodeBuffer cb) throws BSFException { logger.debug("BSFManager:compileScript"); - + final BSFEngine e = loadScriptingEngine(lang); final String sourcef = source; final int lineNof = lineNo, columnNof = columnNo; @@ -422,7 +422,7 @@ public void declareBean(String beanName, Object bean, Class type) throws BSFException { logger.debug("BSFManager:declareBean"); - + registerBean(beanName, bean); BSFDeclaredBean tempBean = new BSFDeclaredBean(beanName, bean, type); @@ -456,7 +456,7 @@ Object expr) throws BSFException { logger.debug("BSFManager:eval"); - + final BSFEngine e = loadScriptingEngine(lang); final String sourcef = source; final int lineNof = lineNo, columnNof = columnNo; @@ -506,7 +506,7 @@ Object script) throws BSFException { logger.debug("BSFManager:exec"); - + final BSFEngine e = loadScriptingEngine(lang); final String sourcef = source; final int lineNof = lineNo, columnNof = columnNo; @@ -546,7 +546,7 @@ Object script) throws BSFException { logger.debug("BSFManager:iexec"); - + final BSFEngine e = loadScriptingEngine(lang); final String sourcef = source; final int lineNof = lineNo, columnNof = columnNo; @@ -696,7 +696,7 @@ */ public BSFEngine loadScriptingEngine(String lang) throws BSFException { logger.debug("BSFManager:loadScriptingEngine"); - + // if its already loaded return that BSFEngine eng = (BSFEngine) loadedEngines.get(lang); if (eng != null) { @@ -755,7 +755,7 @@ */ public Object lookupBean(String beanName) { logger.debug("BSFManager:lookupBean"); - + try { return ((BSFDeclaredBean)objectRegistry.lookup(beanName)).bean; } @@ -774,7 +774,7 @@ */ public void registerBean(String beanName, Object bean) { logger.debug("BSFManager:registerBean"); - + BSFDeclaredBean tempBean; if(bean == null) { @@ -817,7 +817,7 @@ */ public void setClassLoader(ClassLoader classLoader) { logger.debug("BSFManager:setClassLoader"); - + pcs.firePropertyChange("classLoader", this.classLoader, classLoader); this.classLoader = classLoader; } @@ -830,7 +830,7 @@ */ public void setClassPath(String classPath) { logger.debug("BSFManager:setClassPath"); - + pcs.firePropertyChange("classPath", this.classPath, classPath); this.classPath = classPath; } @@ -844,7 +844,7 @@ */ public void setObjectRegistry(ObjectRegistry objectRegistry) { logger.debug("BSFManager:setObjectRegistry"); - + this.objectRegistry = objectRegistry; } @@ -862,7 +862,7 @@ */ public void setTempDir(String tempDir) { logger.debug("BSFManager:setTempDir"); - + pcs.firePropertyChange("tempDir", this.tempDir, tempDir); this.tempDir = tempDir; } @@ -872,7 +872,7 @@ */ public void terminate() { logger.debug("BSFManager:terminate"); - + Enumeration enginesEnum = loadedEngines.elements(); BSFEngine engine; while (enginesEnum.hasMoreElements()) { @@ -898,7 +898,7 @@ */ public void undeclareBean(String beanName) throws BSFException { logger.debug("BSFManager:undeclareBean"); - + unregisterBean(beanName); BSFDeclaredBean tempBean = null; @@ -929,7 +929,7 @@ */ public void unregisterBean(String beanName) { logger.debug("BSFManager:unregisterBean"); - + objectRegistry.unregister(beanName); } } Modified: jakarta/bsf/trunk/src/org/apache/bsf/util/BSFEventProcessor.java URL: http://svn.apache.org/viewcvs/jakarta/bsf/trunk/src/org/apache/bsf/util/BSFEventProcessor.java?rev=389218&r1=389217&r2=389218&view=diff ============================================================================== --- jakarta/bsf/trunk/src/org/apache/bsf/util/BSFEventProcessor.java (original) +++ jakarta/bsf/trunk/src/org/apache/bsf/util/BSFEventProcessor.java Mon Mar 27 10:27:31 2006 @@ -61,7 +61,7 @@ /** * This is used to support binding scripts to be run when an event - * occurs. + * occurs. * * @author Sanjiva Weerawarana */ @@ -101,7 +101,7 @@ try { processExceptionableEvent (inFilter, evtInfo); } catch (RuntimeException re) { - // rethrow this .. I don't want to intercept run-time stuff + // rethrow this .. I don't want to intercept run-time stuff // that can in fact occur legit throw re; } catch (Exception e) { @@ -117,8 +117,8 @@ // an exception which must go all the way back to the source (as in // the vetoableChange case) - public void processExceptionableEvent (String inFilter, Object[] evtInfo) - throws Exception { + public void processExceptionableEvent (String inFilter, Object[] evtInfo) throws Exception + { if ((filter != null) && !filter.equals (inFilter)) { // ignore this event return; Added: jakarta/bsf/trunk/src/org/apache/bsf/util/BSFEventProcessorReturningEventInfos.java URL: http://svn.apache.org/viewcvs/jakarta/bsf/trunk/src/org/apache/bsf/util/BSFEventProcessorReturningEventInfos.java?rev=389218&view=auto ============================================================================== --- jakarta/bsf/trunk/src/org/apache/bsf/util/BSFEventProcessorReturningEventInfos.java (added) +++ jakarta/bsf/trunk/src/org/apache/bsf/util/BSFEventProcessorReturningEventInfos.java Mon Mar 27 10:27:31 2006 @@ -0,0 +1,146 @@ +/* + * This software consists of voluntary contributions made by many individuals + * on behalf of the Apache Software Foundation and was originally created by + * Sanjiva Weerawarana and others at International Business Machines + * Corporation. For more information on the Apache Software Foundation, + * please see <http://www.apache.org/>. + */ + +package org.apache.bsf.util; + +import org.apache.bsf.util.event.*; +import org.apache.bsf.*; +import java.io.PrintStream; +import java.util.Vector; + +/** + * This is used to support binding scripts to be run when an event + * occurs, forwarding the arguments supplied to the event listener. It is an adapted version of + * [EMAIL PROTECTED] org.apache.bsf.util.BSFEventProcessor}. + * + * <pre>------------------------ Apache Version 2.0 license ------------------------- + * Copyright (C) 2001-2006 Rony G. Flatscher + * + * 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 + * + * <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a> + * + * 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. + * See the License for the specific language governing permissions and + * limitations under the License. + * ----------------------------------------------------------------------------- </pre> + * + * @author Rony G. Flatscher, but most of the code copied from org.apache.bsf.util.BSFEventProcessor by Sanjiva Weerawarana + * + * + * @see [EMAIL PROTECTED] org.apache.bsf.util.BSFEventProcessor} + * + */ +public class BSFEventProcessorReturningEventInfos implements EventProcessor { + BSFEngine engine; + BSFManager manager; + String filter; + String source; + int lineNo; + int columnNo; + Object script; + Object dataFromScriptingEngine; // ---rgf, 2006-02-24: data coming from the script engine, could be + // e.g. an object reference to forward event with received arguments to + + /** + * Package-protected constructor makes this class unavailable for + * public use. + * + * @param dataFromScriptingEngine this contains any object supplied by the scripting engine and gets + * sent back with the supplied script. This could be used e.g. for indicating which scripting + * engine object should be ultimately informed of the event occurrence. + */ + BSFEventProcessorReturningEventInfos (BSFEngine engine, BSFManager manager, String filter, + String source, int lineNo, int columnNo, Object script, Object dataFromScriptingEngine) + throws BSFException { + this.engine = engine; + this.manager = manager; + this.filter = filter; + this.source = source; + this.lineNo = lineNo; + this.columnNo = columnNo; + this.script = script; + this.dataFromScriptingEngine = dataFromScriptingEngine; + } + ////////////////////////////////////////////////////////////////////////// + // + // event is delegated to me by the adapters using this. inFilter is + // in general the name of the method via which the event was received + // at the adapter. For prop/veto change events, inFilter is the name + // of the property. In any case, in the event processor, I only forward + // those events if for which the filters match (if one is specified). + + + public void processEvent (String inFilter, Object[] evtInfo) { + try { + processExceptionableEvent (inFilter, evtInfo); + } catch (RuntimeException re) { + // rethrow this .. I don't want to intercept run-time stuff + // that can in fact occur legit + throw re; + } catch (Exception e) { + // should not occur + System.err.println ("BSFError: non-exceptionable event delivery " + + "threw exception (that's not nice): " + e); + e.printStackTrace (); + } + } + + ////////////////////////////////////////////////////////////////////////// + // + // same as above, but used when the method event method may generate + // an exception which must go all the way back to the source (as in + // the vetoableChange case) + + public void processExceptionableEvent (String inFilter, Object[] evtInfo) throws Exception { + +// System.err.println(this+": inFilter=["+inFilter+"], filter=["+filter+"]"); + if ((filter != null) && !filter.equals (inFilter)) { + // ignore this event + return; + } + + // run the script + // engine.exec (source, lineNo, columnNo, script); + + // create the parameter vectors for engine.apply() + Vector paramNames = new Vector(), paramValues = new Vector(); + + // parameter # 1 + // supply the parameters as an array object as sent to the event object listener + // (usually the first entry is the sent event object) + paramNames. add( "eventParameters" ); + paramValues.add( evtInfo ); + + // parameter # 2 + // supply the data object received from the scripting engine to be sent with the event + paramNames. add( "dataFromScriptingEngine" ); + paramValues.add( this.dataFromScriptingEngine ); // can be null as well + + // parameter # 3 + // event filter in place + paramNames. add( "inFilter" ); + paramValues.add( inFilter ); // event name that has occurred + + // parameter # 4 + // event filter in place + paramNames. add( "eventFilter" ); + paramValues.add( this.filter ); // can be null as well + + // parameter # 5 + // BSF manager instance (e.g. allows access to its registry) + paramNames. add( "BSFManager" ); + paramValues.add( this.manager ); + + engine.apply(source, lineNo, columnNo, this.script, paramNames, paramValues); + } +} Propchange: jakarta/bsf/trunk/src/org/apache/bsf/util/BSFEventProcessorReturningEventInfos.java ------------------------------------------------------------------------------ svn:executable = * Propchange: jakarta/bsf/trunk/src/org/apache/bsf/util/BSFEventProcessorReturningEventInfos.java ------------------------------------------------------------------------------ svn:keywords = Author Date Rev Id URL Modified: jakarta/bsf/trunk/src/org/apache/bsf/util/EngineUtils.java URL: http://svn.apache.org/viewcvs/jakarta/bsf/trunk/src/org/apache/bsf/util/EngineUtils.java?rev=389218&r1=389217&r2=389218&view=diff ============================================================================== --- jakarta/bsf/trunk/src/org/apache/bsf/util/EngineUtils.java (original) +++ jakarta/bsf/trunk/src/org/apache/bsf/util/EngineUtils.java Mon Mar 27 10:27:31 2006 @@ -69,6 +69,7 @@ * * @author Sanjiva Weerawarana * @author Sam Ruby + * @author Rony G. Flatscher (added addEventListenerReturningEventInfos) */ public class EngineUtils { // the BSF class loader that knows how to load from the a specific @@ -118,6 +119,64 @@ BSFEventProcessor ep = new BSFEventProcessor (engine, manager, filter, source, lineNo, columnNo, script); + + try { + ReflectionUtils.addEventListener (bean, eventSetName, ep); + } catch (Exception e) { + e.printStackTrace (); + throw new BSFException (BSFException.REASON_OTHER_ERROR, + "ouch while adding event listener: " + + e, e); + } + } + + + /** + * Add a script as a listener to some event coming out of an object. The + * first two args identify the src of the event and the event set + * and the rest identify the script which should be run when the event + * fires. The processing will use the engine's apply() method. + * + * @param bean event source + * @param eventSetName name of event set from event src to bind to + * @param filter filter for events + * @param engine BSFEngine which can run this script + * @param manager BSFManager of the above engine + * @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 + * @param script the script to execute when the event occurs + * @param dataFromScriptingEngine + * this contains any object supplied by the scripting engine and gets sent + * back with the supplied script, if the event occurs. + * This could be used e.g. for indicating to the scripting engine which + * scripting engine object/routine/function/procedure + * should be ultimately informed of the event occurrence. + * + * @exception BSFException if anything goes wrong while running the script + */ + public static void addEventListenerReturningEventInfos ( Object bean, + String eventSetName, + String filter, + BSFEngine engine, + BSFManager manager, + String source, + int lineNo, + int columnNo, + Object script, + Object dataFromScriptingEngine + ) throws BSFException + { + BSFEventProcessorReturningEventInfos ep = + new BSFEventProcessorReturningEventInfos (engine, + manager, + filter, + source, + lineNo, + columnNo, + script, + dataFromScriptingEngine + ); try { ReflectionUtils.addEventListener (bean, eventSetName, ep); Modified: jakarta/bsf/trunk/src/org/apache/bsf/util/ReflectionUtils.java URL: http://svn.apache.org/viewcvs/jakarta/bsf/trunk/src/org/apache/bsf/util/ReflectionUtils.java?rev=389218&r1=389217&r2=389218&view=diff ============================================================================== --- jakarta/bsf/trunk/src/org/apache/bsf/util/ReflectionUtils.java (original) +++ jakarta/bsf/trunk/src/org/apache/bsf/util/ReflectionUtils.java Mon Mar 27 10:27:31 2006 @@ -70,6 +70,7 @@ * * @author Sanjiva Weerawarana * @author Joseph Kesselman + * @author Rony G. Flatscher (added Proxy-handling needed for OpenOffice.org 1.1.x and 2.0.x as of 2006-02-03) */ public class ReflectionUtils { @@ -102,21 +103,63 @@ BeanInfo bi = Introspector.getBeanInfo (source.getClass ()); EventSetDescriptor esd = (EventSetDescriptor) findFeatureByName ("event", eventSetName, bi.getEventSetDescriptors ()); - if (esd == null) { - throw new IllegalArgumentException ("event set '" + eventSetName + - "' unknown for source type '" + - source.getClass () + "'"); - } + // get the class object for the event - Class listenerType = esd.getListenerType (); + Class listenerType = null; + int idx2mmm=0; + java.lang.reflect.Method mmm[]=null; // array object to store methods from Proxy-class reflected methods + + if (esd == null) // no events found, maybe a proxy from OpenOffice.org? + { + if (java.lang.reflect.Proxy.class.isInstance(source)==true) // a Proxy class, hence reflect "manually" + { + mmm=source.getClass().getMethods(); // get all methods + for (idx2mmm=0; idx2mmm<mmm.length; idx2mmm++) + { + String methName=mmm[idx2mmm].getName(); + // looking for a method "add_XYZ_Listener(someEventClass) + if (methName.endsWith("Listener")==true) + { + String un=getUnqualifiedName(methName); + + if (un.startsWith("add")) // get first argument, which must be an Event class + { + String tmpName=un.substring(3, un.length()-8); // -lengthOf(("add"=3)+("Listener"=8)) + if (eventSetName.equalsIgnoreCase(tmpName)) + { + java.lang.Class params[]=mmm[idx2mmm].getParameterTypes(); + if (params.length>0) + { + listenerType=params[0]; // o.k. found ListenerClass + break; + } + } + } + } + } + } + + if (listenerType==null) // o.k. no listenerType found, throw up ... + { + throw new IllegalArgumentException ("event set '" + eventSetName + + "' unknown for source type '" + source.getClass () + "'"); + } + + } + else // ListenerType from EventSetDescriptor + { + listenerType=esd.getListenerType(); // get ListenerType class object from EventSetDescriptor + } + + // find an event adapter class of the right type Class adapterClass = EventAdapterRegistry.lookup (listenerType); if (adapterClass == null) { - throw new IllegalArgumentException ("event adapter for listner type " + - "'" + listenerType + "' (eventset " + - "'" + eventSetName + "') unknown"); + throw new IllegalArgumentException ("event adapter for listener type " + + "'" + listenerType + "' (eventset " + + "'" + eventSetName + "') unknown"); } // create the event adapter and give it the event processor @@ -135,15 +178,76 @@ // in this case to support the source-side filtering. // // ** TBD **: the following two lines need to change appropriately - addListenerMethod = esd.getAddListenerMethod (); + if (mmm==null) + { + addListenerMethod = esd.getAddListenerMethod (); + } + else + { + addListenerMethod = mmm[idx2mmm]; + } args = new Object[] {adapter}; - } else { - addListenerMethod = esd.getAddListenerMethod (); + } + else + { + if (mmm==null) { + addListenerMethod = esd.getAddListenerMethod (); + } + else + { + addListenerMethod = mmm[idx2mmm]; + } args = new Object[] {adapter}; } addListenerMethod.invoke (source, args); } ////////////////////////////////////////////////////////////////////////// + + + /** Compares two strings in a "relaxed" manner, i.e. + * tests case-insensitively, whether the second argument + * <code>haystack</code> ends with the first argument <code>endName</code> + * string. + * + * @param endName the string which should end <code>haystack</code> + * @param haystack the string to test <code>endName</code> against + * + * @return <code>true</code>, if <code>haystack</code> ends with the + * string <code>endName</code> (comparison carried out case-insensitively), + * <code>false</code> else + */ + static boolean compareRelaxed(String endName, String haystack) + { + int endNameLength=endName.length(), + tmpLength =haystack.length(); + + if (endNameLength>tmpLength) // interface endName is shorter than the sought of one + { + return false; + } + else if (endNameLength!=tmpLength) // cut off haystack from the right to match length of received endName + { + // 012345678 + // abc=3 x.y.z.abc=9 9-3=6 + haystack=haystack.substring(tmpLength-endNameLength); // cut off from the right + } + + return endName.equalsIgnoreCase(haystack); + } + ////////////////////////////////////////////////////////////////////////// + + /** Returns unqualified name (string after the last dot) from dotted string or string itself, if no dot in string. + * + * @param s String to extract unqualified name + * @return returns unqualified name or s, if no dot in string + */ + static String getUnqualifiedName(String s) + { + int lastPos=s.lastIndexOf('.'); // get position of last dot + return lastPos==-1 ? s : s.substring(lastPos+1) ; + } + ////////////////////////////////////////////////////////////////////////// + /** * Create a bean using given class loader and using the appropriate Modified: jakarta/bsf/trunk/src/org/apache/bsf/util/event/EventAdapterRegistry.java URL: http://svn.apache.org/viewcvs/jakarta/bsf/trunk/src/org/apache/bsf/util/event/EventAdapterRegistry.java?rev=389218&r1=389217&r2=389218&view=diff ============================================================================== --- jakarta/bsf/trunk/src/org/apache/bsf/util/event/EventAdapterRegistry.java (original) +++ jakarta/bsf/trunk/src/org/apache/bsf/util/event/EventAdapterRegistry.java Mon Mar 27 10:27:31 2006 @@ -103,7 +103,7 @@ } catch (ClassNotFoundException e) { if (dynamic) { // Unable to resolve one, try to generate one. - adapterClass = + adapterClass = // if second argument is set to 'true', then the class file will be stored in the filesystem EventAdapterGenerator.makeEventAdapterClass (listenerType, false); } } Modified: jakarta/bsf/trunk/src/org/apache/bsf/util/event/generator/AdapterClassLoader.java URL: http://svn.apache.org/viewcvs/jakarta/bsf/trunk/src/org/apache/bsf/util/event/generator/AdapterClassLoader.java?rev=389218&r1=389217&r2=389218&view=diff ============================================================================== --- jakarta/bsf/trunk/src/org/apache/bsf/util/event/generator/AdapterClassLoader.java (original) +++ jakarta/bsf/trunk/src/org/apache/bsf/util/event/generator/AdapterClassLoader.java Mon Mar 27 10:27:31 2006 @@ -63,8 +63,8 @@ { private static Hashtable classCache = new Hashtable(); private Class c; - - private Log logger = LogFactory.getLog(this.getClass().getName()); + + private Log logger = LogFactory.getLog(this.getClass().getName()); public AdapterClassLoader() { @@ -74,7 +74,7 @@ { if ((c = getLoadedClass(name)) == null) { - c = defineClass(name, b, 0, b.length); + c = defineClass(name.replace('/','.'), b, 0, b.length); // rgf, 2006-02-03 put(name, c); } else Modified: jakarta/bsf/trunk/src/org/apache/bsf/util/event/generator/EventAdapterGenerator.java URL: http://svn.apache.org/viewcvs/jakarta/bsf/trunk/src/org/apache/bsf/util/event/generator/EventAdapterGenerator.java?rev=389218&r1=389217&r2=389218&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 Mon Mar 27 10:27:31 2006 @@ -53,6 +53,14 @@ * please see <http://www.apache.org/>. */ + /* changes: + 2006-02-03, Rony G. Flatscher: added OpenOffice.org support (versions 1.1.x and 2.0.1) + which need special handling due to their omission to tagt heir event + listeners as implementing "java.util.EventListener" inhibiting standard + introspection to identify events; therefore a "manual" branch got introduced + to identify OpenOffice.org event listeners + */ + package org.apache.bsf.util.event.generator; import java.io.*; @@ -69,6 +77,7 @@ { public static AdapterClassLoader ldr = new AdapterClassLoader(); static Class EVENTLISTENER = null; + static Class OPENOFFICE_XEVENTLISTENER = null; static String CLASSPACKAGE = "org/apache/bsf/util/event/adapters/"; static String WRITEDIRECTORY = null; @@ -83,13 +92,13 @@ static byte INITMETHOD[]; private static Log logger; - + /* The static initializer */ static { logger = LogFactory.getLog( (org.apache.bsf.util.event.generator.EventAdapterGenerator.class).getName()); - + String USERCLASSPACKAGE = System.getProperty("DynamicEventClassPackage", ""); @@ -120,6 +129,18 @@ ex.printStackTrace(); } + + // try to load the OpenOffice.org (OOo) counterpart of EventListener; unfortunately as of 2006 + // OOo's XEventListener does not report to have 'java.util.EventListener' implemented, hence + // Introspector cannot identify events ! + try + { + OPENOFFICE_XEVENTLISTENER = Thread.currentThread().getContextClassLoader().loadClass ("com.sun.star.lang.XEventListener"); + } + catch (Exception e) + { + } + // start of the Java Class File CLASSHEADER = ByteUtility.addBytes(CLASSHEADER,(byte)0xCA); // magic CLASSHEADER = ByteUtility.addBytes(CLASSHEADER,(byte)0xFE); // magic @@ -213,7 +234,11 @@ { logger.info("EventAdapterGenerator"); - if( EVENTLISTENER.isAssignableFrom(listenerType) ) + if( EVENTLISTENER.isAssignableFrom(listenerType) || + // test explicitly OpenOffice.org listener types; as of 2006-02-03 neither 1.1.5 nor + // OOo 2.0.1 do indicate that they implement 'java.lang.EventListener' + ( OPENOFFICE_XEVENTLISTENER!=null && OPENOFFICE_XEVENTLISTENER.isAssignableFrom(listenerType) ) + ) { boolean exceptionable = false; boolean nonExceptionable = false; @@ -560,7 +585,8 @@ { try { - FileOutputStream fos = new FileOutputStream(WRITEDIRECTORY+finalAdapterClassName+".class"); + // removed "WRITEDIRECTORY+", as this path is already part of 'finalAdapterClassName' + FileOutputStream fos = new FileOutputStream(finalAdapterClassName+".class"); fos.write(newClass); fos.close(); } @@ -598,10 +624,6 @@ System.err.println(ex.getMessage()); ex.printStackTrace(); } - } - else - { - System.err.println("EventAdapterGenerator ListenerType invalid: listenerType = " + listenerType); } return null; } Modified: jakarta/bsf/trunk/xdocs/projects.xml URL: http://svn.apache.org/viewcvs/jakarta/bsf/trunk/xdocs/projects.xml?rev=389218&r1=389217&r2=389218&view=diff ============================================================================== --- jakarta/bsf/trunk/xdocs/projects.xml (original) +++ jakarta/bsf/trunk/xdocs/projects.xml Mon Mar 27 10:27:31 2006 @@ -8,7 +8,7 @@ </properties> <body> - + <section name="Related Projects"> <p>Nothing listed here is directly supported by the BSF @@ -165,7 +165,7 @@ </tr> </table> </subsection> - + <subsection name="NetRexx"> <p> @@ -310,10 +310,10 @@ <subsection name="ObjectScript"> <p> - "ObjectScript is a general purpose object-oriented programming language. It is designed to - be simple to learn, easy to use, yet still powerful, combining the convenience of an + "ObjectScript is a general purpose object-oriented programming language. It is designed to + be simple to learn, easy to use, yet still powerful, combining the convenience of an interactive interpreter with many of the features of Java, plus operator overloading, - regular expressions, closures, XML-RPC support, etc. And a behind the scenes compiler + regular expressions, closures, XML-RPC support, etc. And a behind the scenes compiler compiles script code to JVM bytecode for faster execution." </p> <table> @@ -361,6 +361,57 @@ <tr> <th>License:</th> <td>GPL (same as JLog itself)</td> + </tr> + </table> + </subsection> + + <subsection name="ooRexx"> + <p> + "Open Object Rexx (ooRexx, http://www.ooRexx.org) is a free + and opensource language, which was originally developed by IBM. + The non-profit SIG Rexx Language Association (http://www.RexxLA.org) + received the source code from IBM and released an opensource version + to the community in 2005. + + <br></br>The BSF engine for Rexx (BSF4Rexx) comes with an ooRexx wrapper + program (BSF.CLS) which camouflages Java as ooRexx, easying programming + considerably (e.g. no need for type information/casting). + </p> + + <table> + <tr> + <th>Compatibility:</th> + <td>BSF 2.3 and above</td> + </tr> + <tr> + <th>URL (ooRexx):</th> + <td><a href="http://www.ooRexx.org/">http://www.ooRexx.org/</a></td> + </tr> + <tr> + <th>URL (BSF4Rexx, temporary):</th> + <td><a href="http://wi.wu-wien.ac.at/rgf/rexx/bsf4rexx/current/">http://wi.wu-wien.ac.at/rgf/rexx/bsf4rexx/current/ (temporary)</a></td> + </tr> + <tr> + <th>URL (BSF4Rexx, planned home):</th> + <td><a href="http://bsf4rexx.sourceforge.net/">http://bsf4rexx.sourceforge.net (starting at the end of April 2006)</a></td> + </tr> + <tr> + <th>Contact (ooRexx):</th> + <td><a href="mailto:[EMAIL PROTECTED]">Ulf Dittmer</a></td> + </tr> + <tr> + <th>Contact (BSF4Rexx):</th> + <td><a href="mailto:[EMAIL PROTECTED]">Ulf Dittmer</a></td> + </tr> + <tr> + <th>License:</th> + <td>ooRexx: IBM's opensource license CPL v 1.0 + </td> + </tr> + <tr> + <th>License:</th> + <td>BSF4Rexx: Apache v2.0 + </td> </tr> </table> </subsection> --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]