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; } > > }