Fixed, thanks On Sun, Oct 4, 2015 at 12:32 PM, sebb <seb...@gmail.com> wrote:
> On 3 October 2015 at 21:29, <pmoua...@apache.org> wrote: > > Author: pmouawad > > Date: Sat Oct 3 20:29:27 2015 > > New Revision: 1706624 > > > > URL: http://svn.apache.org/viewvc?rev=1706624&view=rev > > Log: > > Bug 58477 - __javaScript function : Allow use of Nashorn engine for > Java8 and upper versions > > Bugzilla Id: 58477 > > > > Modified: > > > jmeter/trunk/src/functions/org/apache/jmeter/functions/JavaScript.java > > jmeter/trunk/xdocs/changes.xml > > > > Modified: > jmeter/trunk/src/functions/org/apache/jmeter/functions/JavaScript.java > > URL: > http://svn.apache.org/viewvc/jmeter/trunk/src/functions/org/apache/jmeter/functions/JavaScript.java?rev=1706624&r1=1706623&r2=1706624&view=diff > > > ============================================================================== > > --- > jmeter/trunk/src/functions/org/apache/jmeter/functions/JavaScript.java > (original) > > +++ > jmeter/trunk/src/functions/org/apache/jmeter/functions/JavaScript.java Sat > Oct 3 20:29:27 2015 > > @@ -22,6 +22,12 @@ import java.util.Collection; > > import java.util.LinkedList; > > import java.util.List; > > > > +import javax.script.Bindings; > > +import javax.script.ScriptContext; > > +import javax.script.ScriptEngine; > > +import javax.script.ScriptEngineManager; > > +import javax.script.SimpleScriptContext; > > + > > import org.apache.jmeter.engine.util.CompoundVariable; > > import org.apache.jmeter.samplers.SampleResult; > > import org.apache.jmeter.samplers.Sampler; > > @@ -40,7 +46,27 @@ import org.mozilla.javascript.Scriptable > > * @since 1.9 > > */ > > public class JavaScript extends AbstractFunction { > > + private static final String NASHORN_ENGINE_NAME = "nashorn"; > //$NON-NLS-1$ > > + > > + private static final String USE_RHINO_ENGINE_PROPERTY = > "javascript.use_rhino"; //$NON-NLS-1$ > > > > + /** > > + * Initialization On Demand Holder pattern > > + */ > > + private static class LazyHolder { > > + public static final ScriptEngineManager INSTANCE = new > ScriptEngineManager(); > > + } > > + > > + private static final boolean USE_RHINO_ENGINE = > > + > getInstance().getEngineByName(JavaScript.NASHORN_ENGINE_NAME) == null || > //$NON-NLS-1$ > > + JMeterUtils.getPropDefault(USE_RHINO_ENGINE_PROPERTY, true) > ; > > I think the property should be checked first. > As it stands, the ScriptEngineManager will always be loaded, and > Nashorn will always be instantiated on Java8+ even if the property is > true. > > > + > > + /** > > + * @return ScriptEngineManager singleton > > + */ > > + public static ScriptEngineManager getInstance() { > > Why is this public? > > > + return LazyHolder.INSTANCE; > > + } > > private static final List<String> desc = new LinkedList<>(); > > > > private static final String KEY = "__javaScript"; //$NON-NLS-1$ > > @@ -70,7 +96,77 @@ public class JavaScript extends Abstract > > String varName = values.length < 2 ? null : ((CompoundVariable) > values[1]).execute().trim(); > > String resultStr = ""; > > > > + if(USE_RHINO_ENGINE) { > > + resultStr = executeWithRhino(previousResult, > currentSampler, jmctx, > > + vars, script, varName); > > + } else { > > + resultStr = executeWithNashorn(previousResult, > currentSampler, jmctx, > > + vars, script, varName); > > + } > > + > > + return resultStr; > > + > > + } > > + > > + /** > > + * > > + * @param previousResult {@link SampleResult} > > + * @param currentSampler {@link Sampler} > > + * @param jmctx {@link JMeterContext} > > + * @param vars {@link JMeterVariables} > > + * @param script Javascript code > > + * @param varName variable name > > + * @return result as String > > + * @throws InvalidVariableException > > + */ > > + private String executeWithNashorn(SampleResult previousResult, > > + Sampler currentSampler, JMeterContext jmctx, > JMeterVariables vars, > > + String script, String varName) > > + throws InvalidVariableException { > > + String resultStr = null; > > + try { > > + ScriptContext newContext = new SimpleScriptContext(); > > + ScriptEngine engine = > getInstance().getEngineByName(JavaScript.NASHORN_ENGINE_NAME); > > + Bindings bindings = engine.createBindings(); > > + > > + // Set up some objects for the script to play with > > + bindings.put("log", log); //$NON-NLS-1$ > > + bindings.put("ctx", jmctx); //$NON-NLS-1$ > > + bindings.put("vars", vars); //$NON-NLS-1$ > > + bindings.put("props", JMeterUtils.getJMeterProperties()); > //$NON-NLS-1$ > > + > > + bindings.put("threadName", > Thread.currentThread().getName()); //$NON-NLS-1$ > > + bindings.put("sampler", currentSampler); //$NON-NLS-1$ > > + bindings.put("sampleResult", previousResult); //$NON-NLS-1$ > > + newContext.setBindings(bindings, > ScriptContext.ENGINE_SCOPE); > > + Object result = engine.eval(script, newContext); > > + resultStr = result.toString(); > > + if (varName != null && vars != null) {// vars can be null > if run from TestPlan > > + vars.put(varName, resultStr); > > + } > > + } catch (Exception e) { > > + log.error("Error processing Javascript: [" + script + > "]\n", e); > > + throw new InvalidVariableException("Error processing > Javascript: [" + script + "]", e); > > + } > > + return resultStr; > > + } > > + > > + /** > > + * @param previousResult {@link SampleResult} > > + * @param currentSampler {@link Sampler} > > + * @param jmctx {@link JMeterContext} > > + * @param vars {@link JMeterVariables} > > + * @param script Javascript code > > + * @param varName variable name > > + * @return result as String > > + * @throws InvalidVariableException > > + */ > > + private String executeWithRhino(SampleResult previousResult, > > + Sampler currentSampler, JMeterContext jmctx, > JMeterVariables vars, > > + String script, String varName) > > + throws InvalidVariableException { > > Context cx = Context.enter(); > > + String resultStr = null; > > try { > > > > Scriptable scope = cx.initStandardObjects(null); > > @@ -91,16 +187,13 @@ public class JavaScript extends Abstract > > if (varName != null && vars != null) {// vars can be null > if run from TestPlan > > vars.put(varName, resultStr); > > } > > - > > } catch (RhinoException e) { > > log.error("Error processing Javascript: [" + script + > "]\n", e); > > throw new InvalidVariableException("Error processing > Javascript: [" + script + "]", e); > > } finally { > > Context.exit(); > > } > > - > > return resultStr; > > - > > } > > > > /** {@inheritDoc} */ > > > > Modified: jmeter/trunk/xdocs/changes.xml > > URL: > http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1706624&r1=1706623&r2=1706624&view=diff > > > ============================================================================== > > --- jmeter/trunk/xdocs/changes.xml (original) > > +++ jmeter/trunk/xdocs/changes.xml Sat Oct 3 20:29:27 2015 > > @@ -113,6 +113,7 @@ Summary > > > > <h3>Functions</h3> > > <ul> > > + <li><bug>58477</bug> __javaScript function : Allow use of Nashorn > engine for Java8 and upper versions</li> > > </ul> > > > > <h3>I18N</h3> > > > > > -- Cordialement. Philippe Mouawad.