Need Help on Building Nashorn Equivalent code for Below Programme(From Rhino)
Sundararajan Athijegannathan
sundararajan.athijegannathan at oracle.com
Thu Nov 17 15:07:56 UTC 2016
Hi,
The Rhino APIs you mention are all Rhino specific. There is no
one-to-one correspondence between Rhino internals and Nashorn
internals. If you had used javax.script (JSR-223) API to access Rhino
from your Java code, it is lot simpler to migrate to Nashorn. Nashorn
supports Nashorn specific API apart from javax.script (JSR-223):
https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/index.html?jdk/nashorn/api/scripting/ScriptObjectMirror.html
We've a migration guide that deals with JS language & API differences
between Rhino and Nashorn:
https://wiki.openjdk.java.net/display/Nashorn/Rhino+Migration+Guide
HTH,
-Sundar
On 11/17/2016 7:43 PM, RAVI KIRAN wrote:
> Hi Team,
>
> I am new to Java Scripting and now i need to Migrate all Rhino Script java
> service to Nashorn supported code.
> I need help from experts who can share the equivalent
> functions/methods/classes in Nashorn which Rhino was using earlier from
> below code snippet. Request you all to help
>
> 1) Equivalent function for Context(Rhino) in Nashorn. I believe it will
> be SimpleScriptContext.
> 2) Context.enter() replacement in Nashorn ?
> 3) how to set OptimizationLevel in Nashorn. In Rhino we used
> cx.setOptimizationLevel(9);
> 4) How to create and use shared scope as a prototype when creating the
> local .scope. Rhino way is Scriptable scope = cx.newObject(sharedScope);
> 5) Exit from the context in Nashorn? Rhino way is Context.exit();
> 6) How to extend ContextFactory ? Rhino way is private static class
> MyFactory extends ContextFactory
> 7) How to Initialize the global scope to be reused by all service threads?
>
> Changing Below code in Nashorn by any Expert is really Appreciated.
> -----------------------------------------------------------------------------------------------------
> package se.stubs.common.ruleEngine;
>
> import com.wm.data.*;
> import com.wm.util.Values;
> import com.wm.app.b2b.server.Service;
> import com.wm.app.b2b.server.ServiceException;
> import java.util.*;
> import com.wm.app.b2b.server.*;
> import com.wm.lang.ns.*;
> import org.mozilla.javascript.*;
>
> public final class executeJavaScript_SVC
>
> {
>
> /**
> * The primary method for the Java service
> *
> * @param pipeline
> * The IData pipeline
> * @throws ServiceException
> */
> public static final void executeJavaScript(IData pipeline)
> throws ServiceException {
> // pipeline
> IDataCursor pipelineCursor = pipeline.getCursor();
> //
> // Declare input variables
> //
> String script = IDataUtil.getString(pipelineCursor, "script");
> String function = IDataUtil.getString(pipelineCursor, "functionToCall");
> // Creates and enters a Context. The Context stores information
> // about the execution environment of a script.
> Context cx = Context.enter();
> cx.setOptimizationLevel(9);
> try {
> //use the shared scope as a prototype when creating the local
> "scope"
> Scriptable scope = cx.newObject(sharedScope);
> scope.setPrototype(sharedScope);
> scope.setParentScope(null); // We want "scope" to be a new
> top-level
> // Evaluate the string received
> try{
> cx.evaluateString(scope, script, "<cmd>", 1, null);
> } catch (Exception e) {
> throw new ServiceException(
> "Error evaluating script, original exception message: "
> + e.getMessage()); }
> //call given function
> Object result=null;
>
> try {
> Object fObj = scope.get(function, scope);
> if (!(fObj instanceof Function)) {
> throw new ServiceException(function+" is undefined or not
> a function.");
> } else {
> Function f = (Function)fObj;
> result = f.call(cx, scope, scope, (Object[]) null);
> }
> } catch (Exception e) {
> throw new ServiceException("Error executing function (" + function
> + "), original exception message: " + e.getMessage()); }
> // Null return means no match => error.
> if (result == null) {
> throw new ServiceException("Function returned null: " + function);
> }
> //Although an array could be returned represented as a string
> // the stubs limit the results to these types.
> if (!(result instanceof String) && !(result instanceof Double) &&
> !(result instanceof Integer)) {
> throw new ServiceException("Function returned nor string nor
> double: " + function);
> }
> IDataUtil.put( pipelineCursor, "result",
> Context.toString(result) );
> }
> catch (Exception ex) {
> throw new ServiceException(ex);
> } finally {
> // Exit from the context.
> Context.exit();
> }
> pipelineCursor.destroy();
> }
> // --- <<IS-BEGIN-SHARED-SOURCE-AREA>> ---
> //the shared scope variable
> private static ScriptableObject sharedScope=null;
> private static class MyFactory extends ContextFactory
> {
> @Override
> protected boolean hasFeature(Context cx, int featureIndex)
> {
> if (featureIndex == Context.FEATURE_DYNAMIC_SCOPE) {
> return true;
> }
> return super.hasFeature(cx, featureIndex);
> }
> }
> //Initialize the global scope to be reused by all service threads.
> //the scope is sealed, so any changes to its objects throw an exception.
> //each thread will have it own set of variables that do not colide.
> static {
> ContextFactory.initGlobal(new MyFactory());
> // avoid init all the standard objects since this is a costly
> operation
> Context cx = Context.enter();
> try {
> sharedScope = cx.initStandardObjects(null, true);
> sharedScope.sealObject();
> } finally {
> Context.exit();
> }
> }
> private static String getFirstPipelineValue(IData doc, String key) {
> IDataCursor idc = doc.getCursor();
> String result = "";
> while (idc.next() && result.equals("")) {
> Object placeholder = idc.getValue();
> if (placeholder instanceof IData) {
> result = getFirstPipelineValue((IData)placeholder, key);
> }
> if (placeholder instanceof IData[]) {
> result = getFirstPipelineValue(((IData[])placeholder)[0], key);
> if ((result.equals("") || result.equals("SUCCESS")) &&
> idc.getKey().equals("header:Status")) {
> IDataUtil.remove(idc, idc.getKey());
> }
> }
> if (idc.getKey().equals(key)) {
> if (placeholder instanceof String[]) {
> result = ((String[])placeholder)[0];
> }
> if (placeholder instanceof String) {
> result = (String) placeholder;
> }
> }
> }
> idc.destroy();
> return result;
> }
> // --- <<IS-END-SHARED-SOURCE-AREA>> ---
>
> /**
> * The service implementations given below are read-only and show only the
> * method definitions and not the complete implementation.
> */
> public static final void removeSuccessHeader(IData pipeline)
> throws ServiceException {
> }
>
> final static executeJavaScript_SVC _instance = new executeJavaScript_SVC();
>
> static executeJavaScript_SVC _newInstance() { return new
> executeJavaScript_SVC(); }
>
> static executeJavaScript_SVC _cast(Object o) { return
> (executeJavaScript_SVC)o; }
>
> }
More information about the nashorn-dev
mailing list