I've attached it .. sanka.
> Something wrong with the attachment .. I can sort of see it there > but its not there. Maybe its my mail client .. but can you > re-send it just in case? > > Sanjiva. > > ----- Original Message ----- > From: "Sanka Samaranayake" <[EMAIL PROTECTED]> > To: <[EMAIL PROTECTED]> > Sent: Wednesday, September 29, 2004 9:25 AM > Subject: [PATCH]Exceptions happens when calling declareBean() in > JavaScriptEngine > > >> Hello everyone, >> >> When declareBean() is called in JavaScriptEngine (after initialization), >> an exception is thrown because there is no reference to the current >> thread >> .. >> >> this patch will fix the that problem. >> >> Can anyone commit it >> >> best of regards !! >> >> Sanka >> > > > ---------------------------------------------------------------------------- > ---- > > >> --------------------------------------------------------------------- >> 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] > > >
--- JavaScriptEngine.java 2004-09-29 08:25:30.000000000 +0600 +++ JavaScriptEngineModified.java 2004-09-29 08:40:12.000000000 +0600 @@ -1,275 +1,282 @@ -/* - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2004 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, if - * any, must include the following acknowlegement: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowlegement may appear in the software itself, - * if and wherever such third-party acknowlegements normally appear. - * - * 4. The names "Apache BSF", "Apache", and "Apache Software Foundation" - * must not be used to endorse or promote products derived from - * this software without prior written permission. For written - * permission, please contact [EMAIL PROTECTED] - * - * 5. Products derived from this software may not be called "Apache" - * nor may "Apache" appear in their names without prior written - * permission of the Apache Group. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * 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.engines.javascript; - -import java.io.InputStream; -import java.io.IOException; -import java.util.Vector; - -import org.mozilla.javascript.Script; -import org.mozilla.javascript.ClassDefinitionException; -import org.mozilla.javascript.Context; -import org.mozilla.javascript.EvaluatorException; -import org.mozilla.javascript.JavaScriptException; -import org.mozilla.javascript.PropertyException; -import org.mozilla.javascript.NativeJavaObject; -import org.mozilla.javascript.Scriptable; -import org.mozilla.javascript.ScriptRuntime; -import org.mozilla.javascript.ScriptableObject; -import org.mozilla.javascript.WrappedException; -import org.mozilla.javascript.Wrapper; -import org.mozilla.javascript.ImporterTopLevel; - -import org.apache.bsf.*; -import org.apache.bsf.util.*; - -/** - * This is the interface to Netscape's Rhino (JavaScript) from the - * Bean Scripting Framework. - * <p> - * The original version of this code was first written by Adam Peller - * for use in LotusXSL. Sanjiva took his code and adapted it for BSF. - * - * @author Adam Peller <[EMAIL PROTECTED]> - * @author Sanjiva Weerawarana - * @author Matthew J. Duftler - * @author Norris Boyd - */ -public class JavaScriptEngine extends BSFEngineImpl { - /** - * The global script object, where all embedded functions are defined, - * as well as the standard ECMA "core" objects. - */ - private Scriptable global; - - /** - * Return an object from an extension. - * @param object Object on which to make the call (ignored). - * @param method The name of the method to call. - * @param args an array of arguments to be - * passed to the extension, which may be either - * Vectors of Nodes, or Strings. - */ - public Object call(Object object, String method, Object[] args) - throws BSFException { - - Object retval = null; - Context cx; - - try { - cx = Context.enter(); - - // REMIND: convert arg list Vectors here? - - Object fun = global.get(method, global); - // NOTE: Source and line arguments are nonsense in a call(). - // Any way to make these arguments *sensible? - if (fun == Scriptable.NOT_FOUND) - throw new EvaluatorException("function " + method + - " not found.", "none", 0); - - cx.setOptimizationLevel(-1); - cx.setGeneratingDebug(false); - cx.setGeneratingSource(false); - cx.setOptimizationLevel(0); - cx.setDebugger(null, null); - - retval = - ScriptRuntime.call(cx, fun, global, args, global); - - if (retval instanceof Wrapper) - retval = ((Wrapper) retval).unwrap(); - } - catch (Throwable t) { - handleError(t); - } - finally { - Context.exit(); - } - return retval; - } - - public void declareBean(BSFDeclaredBean bean) throws BSFException { - if ((bean.bean instanceof Number) || - (bean.bean instanceof String) || - (bean.bean instanceof Boolean)) { - global.put(bean.name, global, bean.bean); - } - else { - // Must wrap non-scriptable objects before presenting to Rhino - Scriptable wrapped = Context.toObject(bean.bean, global); - global.put(bean.name, global, wrapped); - } - } - - /** - * This is used by an application to evaluate a string containing - * some expression. - */ - public Object eval(String source, int lineNo, int columnNo, Object oscript) - throws BSFException { - - String scriptText = oscript.toString(); - Object retval = null; - Script script; - Context cx; - - try { - cx = Context.enter(); - - cx.setOptimizationLevel(-1); - cx.setGeneratingDebug(false); - cx.setGeneratingSource(false); - cx.setOptimizationLevel(0); - cx.setDebugger(null, null); - - retval = cx.evaluateString(global, scriptText, - source, lineNo, - null); - - if (retval instanceof NativeJavaObject) - retval = ((NativeJavaObject) retval).unwrap(); - - } - catch (Throwable t) { // includes JavaScriptException, rethrows Errors - handleError(t); - } - finally { - Context.exit(); - } - return retval; - } - - private void handleError(Throwable t) throws BSFException { - if (t instanceof WrappedException) - t = ((WrappedException) t).getWrappedException(); - - String message = null; - Throwable target = t; - - if (t instanceof JavaScriptException) { - message = t.getLocalizedMessage(); - - // Is it an exception wrapped in a JavaScriptException? - Object value = ((JavaScriptException) t).getValue(); - if (value instanceof Throwable) { - // likely a wrapped exception from a LiveConnect call. - // Display its stack trace as a diagnostic - target = (Throwable) value; - } - } - else if (t instanceof EvaluatorException || - t instanceof SecurityException) { - message = t.getLocalizedMessage(); - } - else if (t instanceof RuntimeException) { - message = "Internal Error: " + t.toString(); - } - else if (t instanceof StackOverflowError) { - message = "Stack Overflow"; - } - - if (message == null) - message = t.toString(); - - if (t instanceof Error && !(t instanceof StackOverflowError)) { - // Re-throw Errors because we're supposed to let the JVM see it - // Don't re-throw StackOverflows, because we know we've - // corrected the situation by aborting the loop and - // a long stacktrace would end up on the user's console - throw (Error) t; - } - else { - throw new BSFException(BSFException.REASON_OTHER_ERROR, - "JavaScript Error: " + message, - target); - } - } - - /** - * Initialize the engine. - * Put the manager into the context-manager - * map hashtable too. - */ - public void initialize(BSFManager mgr, String lang, Vector declaredBeans) - throws BSFException { - - super.initialize(mgr, lang, declaredBeans); - - // Initialize context and global scope object - try { - Context cx = Context.enter(); - global = new ImporterTopLevel(cx); - Scriptable bsf = cx.toObject(new BSFFunctions(mgr, this), global); - global.put("bsf", global, bsf); - - int size = declaredBeans.size(); - for (int i = 0; i < size; i++) { - declareBean((BSFDeclaredBean) declaredBeans.elementAt(i)); - } - } - catch (Throwable t) { - - } - finally { - Context.exit(); - } - } - - public void undeclareBean(BSFDeclaredBean bean) throws BSFException { - global.delete(bean.name); - } -} +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2004 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "Apache BSF", "Apache", and "Apache Software Foundation" + * must not be used to endorse or promote products derived from + * this software without prior written permission. For written + * permission, please contact [EMAIL PROTECTED] + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * 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.engines.javascript; + +import java.io.InputStream; +import java.io.IOException; +import java.util.Vector; + +import org.mozilla.javascript.Script; +import org.mozilla.javascript.ClassDefinitionException; +import org.mozilla.javascript.Context; +import org.mozilla.javascript.EvaluatorException; +import org.mozilla.javascript.JavaScriptException; +import org.mozilla.javascript.PropertyException; +import org.mozilla.javascript.NativeJavaObject; +import org.mozilla.javascript.Scriptable; +import org.mozilla.javascript.ScriptRuntime; +import org.mozilla.javascript.ScriptableObject; +import org.mozilla.javascript.WrappedException; +import org.mozilla.javascript.Wrapper; +import org.mozilla.javascript.ImporterTopLevel; + +import org.apache.bsf.*; +import org.apache.bsf.util.*; + +/** + * This is the interface to Netscape's Rhino (JavaScript) from the + * Bean Scripting Framework. + * <p> + * The original version of this code was first written by Adam Peller + * for use in LotusXSL. Sanjiva took his code and adapted it for BSF. + * + * @author Adam Peller <[EMAIL PROTECTED]> + * @author Sanjiva Weerawarana + * @author Matthew J. Duftler + * @author Norris Boyd + */ +public class JavaScriptEngine extends BSFEngineImpl { + /** + * The global script object, where all embedded functions are defined, + * as well as the standard ECMA "core" objects. + */ + private Scriptable global; + + /** + * Return an object from an extension. + * @param object Object on which to make the call (ignored). + * @param method The name of the method to call. + * @param args an array of arguments to be + * passed to the extension, which may be either + * Vectors of Nodes, or Strings. + */ + public Object call(Object object, String method, Object[] args) + throws BSFException { + + Object retval = null; + Context cx; + + try { + cx = Context.enter(); + + // REMIND: convert arg list Vectors here? + + Object fun = global.get(method, global); + // NOTE: Source and line arguments are nonsense in a call(). + // Any way to make these arguments *sensible? + if (fun == Scriptable.NOT_FOUND) + throw new EvaluatorException("function " + method + + " not found.", "none", 0); + + cx.setOptimizationLevel(-1); + cx.setGeneratingDebug(false); + cx.setGeneratingSource(false); + cx.setOptimizationLevel(0); + cx.setDebugger(null, null); + + retval = + ScriptRuntime.call(cx, fun, global, args, global); + + if (retval instanceof Wrapper) + retval = ((Wrapper) retval).unwrap(); + } + catch (Throwable t) { + handleError(t); + } + finally { + Context.exit(); + } + return retval; + } + + public void declareBean(BSFDeclaredBean bean) throws BSFException { + try{ + Context.enter(); + if ((bean.bean instanceof Number) || + (bean.bean instanceof String) || + (bean.bean instanceof Boolean)) { + global.put(bean.name, global, bean.bean); + } + else { + // Must wrap non-scriptable objects before presenting to Rhino + Scriptable wrapped = Context.toObject(bean.bean, global); + global.put(bean.name, global, wrapped); + } + }catch(Throwable t){ + handleError(t); + }finally{ + Context.exit(); + } + } + + /** + * This is used by an application to evaluate a string containing + * some expression. + */ + public Object eval(String source, int lineNo, int columnNo, Object oscript) + throws BSFException { + + String scriptText = oscript.toString(); + Object retval = null; + Script script; + Context cx; + + try { + cx = Context.enter(); + + cx.setOptimizationLevel(-1); + cx.setGeneratingDebug(false); + cx.setGeneratingSource(false); + cx.setOptimizationLevel(0); + cx.setDebugger(null, null); + + retval = cx.evaluateString(global, scriptText, + source, lineNo, + null); + + if (retval instanceof NativeJavaObject) + retval = ((NativeJavaObject) retval).unwrap(); + + } + catch (Throwable t) { // includes JavaScriptException, rethrows Errors + handleError(t); + } + finally { + Context.exit(); + } + return retval; + } + + private void handleError(Throwable t) throws BSFException { + if (t instanceof WrappedException) + t = ((WrappedException) t).getWrappedException(); + + String message = null; + Throwable target = t; + + if (t instanceof JavaScriptException) { + message = t.getLocalizedMessage(); + + // Is it an exception wrapped in a JavaScriptException? + Object value = ((JavaScriptException) t).getValue(); + if (value instanceof Throwable) { + // likely a wrapped exception from a LiveConnect call. + // Display its stack trace as a diagnostic + target = (Throwable) value; + } + } + else if (t instanceof EvaluatorException || + t instanceof SecurityException) { + message = t.getLocalizedMessage(); + } + else if (t instanceof RuntimeException) { + message = "Internal Error: " + t.toString(); + } + else if (t instanceof StackOverflowError) { + message = "Stack Overflow"; + } + + if (message == null) + message = t.toString(); + + if (t instanceof Error && !(t instanceof StackOverflowError)) { + // Re-throw Errors because we're supposed to let the JVM see it + // Don't re-throw StackOverflows, because we know we've + // corrected the situation by aborting the loop and + // a long stacktrace would end up on the user's console + throw (Error) t; + } + else { + throw new BSFException(BSFException.REASON_OTHER_ERROR, + "JavaScript Error: " + message, + target); + } + } + + /** + * Initialize the engine. + * Put the manager into the context-manager + * map hashtable too. + */ + public void initialize(BSFManager mgr, String lang, Vector declaredBeans) + throws BSFException { + + super.initialize(mgr, lang, declaredBeans); + + // Initialize context and global scope object + try { + Context cx = Context.enter(); + global = new ImporterTopLevel(cx); + Scriptable bsf = cx.toObject(new BSFFunctions(mgr, this), global); + global.put("bsf", global, bsf); + + int size = declaredBeans.size(); + for (int i = 0; i < size; i++) { + declareBean((BSFDeclaredBean) declaredBeans.elementAt(i)); + } + } + catch (Throwable t) { + + } + finally { + Context.exit(); + } + } + + public void undeclareBean(BSFDeclaredBean bean) throws BSFException { + global.delete(bean.name); + } +}
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]