Author: adrianc
Date: Tue Mar 6 02:16:29 2012 New Revision: 1297323 URL: http://svn.apache.org/viewvc?rev=1297323&view=rev Log: More JSR-233 work - added a generic script service engine. Added: ofbiz/trunk/framework/common/script/org/ofbiz/common/JavaScriptTest.js ofbiz/trunk/framework/service/src/org/ofbiz/service/engine/ScriptEngine.java (with props) Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptUtil.java ofbiz/trunk/framework/common/script/org/ofbiz/common/GroovyServiceTest.groovy ofbiz/trunk/framework/common/servicedef/services_test.xml ofbiz/trunk/framework/service/config/serviceengine.xml Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptUtil.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptUtil.java?rev=1297323&r1=1297322&r2=1297323&view=diff ============================================================================== --- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptUtil.java (original) +++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptUtil.java Tue Mar 6 02:16:29 2012 @@ -197,7 +197,7 @@ public final class ScriptUtil { try { CompiledScript compiledScript = compileScriptString(language, script); if (compiledScript != null) { - return executeScript(compiledScript, null, inputMap); + return executeScript(compiledScript, null, createScriptContext(inputMap), null); } ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName(language); @@ -221,13 +221,12 @@ public final class ScriptUtil { * * @param script Compiled script. * @param functionName Optional function or method to invoke. - * @param context Script execution context. + * @param scriptContext Script execution context. * @return The script result. * @throws IllegalArgumentException */ - public static Object executeScript(CompiledScript script, String functionName, Map<String, ? extends Object> context) throws ScriptException, NoSuchMethodException { - Assert.notNull("script", script, "context", context); - ScriptContext scriptContext = createScriptContext(context); + public static Object executeScript(CompiledScript script, String functionName, ScriptContext scriptContext, Object[] args) throws ScriptException, NoSuchMethodException { + Assert.notNull("script", script, "scriptContext", scriptContext); Object result = script.eval(scriptContext); if (UtilValidate.isNotEmpty(functionName)) { if (Debug.verboseOn()) { @@ -236,7 +235,7 @@ public final class ScriptUtil { ScriptEngine engine = script.getEngine(); try { Invocable invocableEngine = (Invocable) engine; - result = invocableEngine.invokeFunction(functionName, EMPTY_ARGS); + result = invocableEngine.invokeFunction(functionName, args); } catch (ClassCastException e) { throw new ScriptException("Script engine " + engine.getClass().getName() + " does not support function/method invocations"); } @@ -254,39 +253,70 @@ public final class ScriptUtil { * @throws IllegalArgumentException */ public static Object executeScript(String filePath, String functionName, Map<String, ? extends Object> context) { + return executeScript(filePath, functionName, context, EMPTY_ARGS); + } + + /** + * Executes the script at the specified location and returns the result. + * + * @param filePath Script path and file name. + * @param functionName Optional function or method to invoke. + * @param scriptContext Script execution context. + * @param args Function/method arguments. + * @return The script result. + * @throws ScriptException + * @throws MalformedURLException + * @throws FileNotFoundException + * @throws NoSuchMethodException + * @throws IllegalArgumentException + */ + public static Object executeScript(String filePath, String functionName, ScriptContext scriptContext, Object[] args) throws FileNotFoundException, MalformedURLException, ScriptException, NoSuchMethodException { + CompiledScript script = compileScriptFile(filePath); + if (script != null) { + return executeScript(script, functionName, scriptContext, args); + } + String fileExtension = getFileExtension(filePath); + ScriptEngineManager manager = new ScriptEngineManager(); + ScriptEngine engine = manager.getEngineByExtension(fileExtension); + if (engine == null) { + throw new IllegalArgumentException("The script type is not supported for location: " + filePath); + } + if (Debug.verboseOn()) { + Debug.logVerbose("Begin processing script [" + script + "] using engine " + engine.getClass().getName(), module); + } + URL scriptUrl = FlexibleLocation.resolveLocation(filePath); + FileReader reader = new FileReader(new File(scriptUrl.getFile())); + Object result = engine.eval(reader, scriptContext); + if (UtilValidate.isNotEmpty(functionName)) { + try { + Invocable invocableEngine = (Invocable) engine; + result = invocableEngine.invokeFunction(functionName, args); + } catch (ClassCastException e) { + throw new ScriptException("Script engine " + engine.getClass().getName() + " does not support function/method invocations"); + } + } + return result; + } + + /** + * Executes the script at the specified location and returns the result. + * + * @param filePath Script path and file name. + * @param functionName Optional function or method to invoke. + * @param context Script execution context. + * @param args Function/method arguments. + * @return The script result. + * @throws IllegalArgumentException + */ + public static Object executeScript(String filePath, String functionName, Map<String, ? extends Object> context, Object[] args) { Assert.notNull("filePath", filePath, "context", context); try { - CompiledScript script = compileScriptFile(filePath); - if (script != null) { - return executeScript(script, functionName, context); - } String fileExtension = getFileExtension(filePath); // TODO: Remove beanshell check when all beanshell code has been removed. if ("bsh".equals(fileExtension)) { return BshUtil.runBshAtLocation(filePath, context); - } else { - ScriptEngineManager manager = new ScriptEngineManager(); - ScriptEngine engine = manager.getEngineByExtension(fileExtension); - if (engine == null) { - throw new IllegalArgumentException("The script type is not supported for location: " + filePath); - } - if (Debug.verboseOn()) { - Debug.logVerbose("Begin processing script [" + script + "] using engine " + engine.getClass().getName(), module); - } - ScriptContext scriptContext = createScriptContext(context); - URL scriptUrl = FlexibleLocation.resolveLocation(filePath); - FileReader reader = new FileReader(new File(scriptUrl.getFile())); - Object result = engine.eval(reader, scriptContext); - if (UtilValidate.isNotEmpty(functionName)) { - try { - Invocable invocableEngine = (Invocable) engine; - result = invocableEngine.invokeFunction(functionName, EMPTY_ARGS); - } catch (ClassCastException e) { - throw new ScriptException("Script engine " + engine.getClass().getName() + " does not support function/method invocations"); - } - } - return result; } + return executeScript(filePath, functionName, createScriptContext(context), args); } catch (Exception e) { String errMsg = "Error running script at location [" + filePath + "]: " + e.toString(); Debug.logWarning(e, errMsg, module); Modified: ofbiz/trunk/framework/common/script/org/ofbiz/common/GroovyServiceTest.groovy URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/script/org/ofbiz/common/GroovyServiceTest.groovy?rev=1297323&r1=1297322&r2=1297323&view=diff ============================================================================== --- ofbiz/trunk/framework/common/script/org/ofbiz/common/GroovyServiceTest.groovy (original) +++ ofbiz/trunk/framework/common/script/org/ofbiz/common/GroovyServiceTest.groovy Tue Mar 6 02:16:29 2012 @@ -32,5 +32,38 @@ if (context.message) { result.result = (String) "[no message received]"; Debug.logInfo("----- No message received -----", ""); } - return result; + +// GroovyEngine will invoke the no-arg method. +public Map testMethod() { + Debug.logInfo("----- no-arg testMethod invoked -----", ""); + result = ServiceUtil.returnSuccess(); + if (context.message) { + String message = context.message; + result.successMessage = (String) "Got message [$message] and finished fine"; + result.result = message; + Debug.logInfo("----- Message is: $message -----", ""); + } else { + result.successMessage = (String) "Got no message but finished fine anyway"; + result.result = (String) "[no message received]"; + Debug.logInfo("----- No message received -----", ""); + } + return result; +} + +// ScriptEngine (JSR-223) will invoke the arg method. +public Map testMethod(Map context) { + Debug.logInfo("----- arg testMethod invoked -----", ""); + result = ServiceUtil.returnSuccess(); + if (context.message) { + String message = context.message; + result.successMessage = (String) "Got message [$message] and finished fine"; + result.result = message; + Debug.logInfo("----- Message is: $message -----", ""); + } else { + result.successMessage = (String) "Got no message but finished fine anyway"; + result.result = (String) "[no message received]"; + Debug.logInfo("----- No message received -----", ""); + } + return result; +} Added: ofbiz/trunk/framework/common/script/org/ofbiz/common/JavaScriptTest.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/script/org/ofbiz/common/JavaScriptTest.js?rev=1297323&view=auto ============================================================================== --- ofbiz/trunk/framework/common/script/org/ofbiz/common/JavaScriptTest.js (added) +++ ofbiz/trunk/framework/common/script/org/ofbiz/common/JavaScriptTest.js Tue Mar 6 02:16:29 2012 @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + +if (message) { + var successMessage = "Got message [" + message + "] and finished fine"; + var result = message; +} else { + var successMessage = "Got no message but finished fine anyway"; + var result = "[no message received]"; +} + +function testFunction(context) { + if (message) { + var successMessage = "Got message [" + message + "] and finished fine"; + var result = message; + } else { + var successMessage = "Got no message but finished fine anyway"; + var result = "[no message received]"; + } + return result; +} Modified: ofbiz/trunk/framework/common/servicedef/services_test.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/servicedef/services_test.xml?rev=1297323&r1=1297322&r2=1297323&view=diff ============================================================================== --- ofbiz/trunk/framework/common/servicedef/services_test.xml (original) +++ ofbiz/trunk/framework/common/servicedef/services_test.xml Tue Mar 6 02:16:29 2012 @@ -172,6 +172,38 @@ under the License. <attribute name="result" type="String" mode="OUT"/> </service> + <service name="testGroovyMethod" engine="groovy" location="component://common/script/org/ofbiz/common/GroovyServiceTest.groovy" invoke="testMethod"> + <description>Test Groovy Script Service Method Invocation</description> + <attribute name="message" type="String" mode="IN" optional="true"/> + <attribute name="result" type="String" mode="OUT"/> + </service> + + <service name="testScriptEngineGroovy" engine="script" location="component://common/script/org/ofbiz/common/GroovyServiceTest.groovy" invoke=""> + <description>Test Script Engine With Groovy Script</description> + <attribute name="message" type="String" mode="IN" optional="true"/> + <attribute name="result" type="String" mode="OUT"/> + </service> + + <service name="testScriptEngineGroovyMethod" engine="script" location="component://common/script/org/ofbiz/common/GroovyServiceTest.groovy" invoke="testMethod"> + <description>Test Script Engine With Groovy Script Method Invocation</description> + <attribute name="message" type="String" mode="IN" optional="true"/> + <attribute name="result" type="String" mode="OUT"/> + </service> + + <service name="testScriptEngineJavaScript" engine="script" location="component://common/script/org/ofbiz/common/JavaScriptTest.js" invoke=""> + <description>Test Script Engine With JavaScript</description> + <attribute name="message" type="String" mode="IN" optional="true"/> + <attribute name="result" type="String" mode="OUT"/> + </service> + + <!-- JavaScript function invocations are not working, so commenting this out for now + <service name="testScriptEngineJavaScriptFunction" engine="script" location="component://common/script/org/ofbiz/common/JavaScriptTest.js" invoke="testFunction"> + <description>Test Script Engine With JavaScript Function Invocation</description> + <attribute name="message" type="String" mode="IN" optional="true"/> + <attribute name="result" type="String" mode="OUT"/> + </service> + --> + <service name="testJMSQueue" engine="jms" location="serviceMessenger" invoke="testScv"> <description>Test JMS Queue service</description> <attribute name="message" type="String" mode="IN"/> Modified: ofbiz/trunk/framework/service/config/serviceengine.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/config/serviceengine.xml?rev=1297323&r1=1297322&r2=1297323&view=diff ============================================================================== --- ofbiz/trunk/framework/service/config/serviceengine.xml (original) +++ ofbiz/trunk/framework/service/config/serviceengine.xml Tue Mar 6 02:16:29 2012 @@ -40,20 +40,23 @@ under the License. </thread-pool> <!-- Service Engine Configuration --> - <engine name="bsh" class="org.ofbiz.service.engine.BeanShellEngine"/> <engine name="entity-auto" class="org.ofbiz.service.engine.EntityAutoEngine"/> - <engine name="groovy" class="org.ofbiz.service.engine.GroovyEngine"/> <engine name="group" class="org.ofbiz.service.group.ServiceGroupEngine"/> - <engine name="http" class="org.ofbiz.service.engine.HttpEngine"/> <engine name="interface" class="org.ofbiz.service.engine.InterfaceEngine"/> - <engine name="jacl" class="org.ofbiz.service.engine.BSFEngine"/> <engine name="java" class="org.ofbiz.service.engine.StandardJavaEngine"/> - <engine name="javascript" class="org.ofbiz.service.engine.BSFEngine"/> - <engine name="jms" class="org.ofbiz.service.jms.JmsServiceEngine"/> + <engine name="simple" class="org.ofbiz.minilang.SimpleServiceEngine"/> + <engine name="script" class="org.ofbiz.service.engine.ScriptEngine"/> + <!-- Engines that can be replaced by the generic script engine --> + <engine name="bsh" class="org.ofbiz.service.engine.BeanShellEngine"/> + <engine name="groovy" class="org.ofbiz.service.engine.GroovyEngine"/> + <engine name="jacl" class="org.ofbiz.service.engine.BSFEngine"/> + <engine name="javascript" class="org.ofbiz.service.engine.ScriptEngine"/> <engine name="jpython" class="org.ofbiz.service.engine.BSFEngine"/> + <!-- --> <engine name="route" class="org.ofbiz.service.engine.RouteEngine"/> + <engine name="http" class="org.ofbiz.service.engine.HttpEngine"/> + <engine name="jms" class="org.ofbiz.service.jms.JmsServiceEngine"/> <engine name="rmi" class="org.ofbiz.service.rmi.RmiServiceEngine"/> - <engine name="simple" class="org.ofbiz.minilang.SimpleServiceEngine"/> <engine name="soap" class="org.ofbiz.service.engine.SOAPClientEngine"/> <engine name="ofbiz-workflow" class="org.ofbiz.workflow.WorkflowEngine"/> <engine name="workflow" class="org.ofbiz.shark.service.SharkServiceEngine"/> @@ -63,6 +66,7 @@ under the License. <parameter name="login" value="admin"/> <parameter name="password" value="ofbiz"/> </engine> + <service-location name="main-rmi" location="rmi://localhost:1099/RMIDispatcher"/> <service-location name="main-http" location="http://localhost:8080/webtools/control/httpService"/> Added: ofbiz/trunk/framework/service/src/org/ofbiz/service/engine/ScriptEngine.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/engine/ScriptEngine.java?rev=1297323&view=auto ============================================================================== --- ofbiz/trunk/framework/service/src/org/ofbiz/service/engine/ScriptEngine.java (added) +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/engine/ScriptEngine.java Tue Mar 6 02:16:29 2012 @@ -0,0 +1,92 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + *******************************************************************************/ +package org.ofbiz.service.engine; + +import static org.ofbiz.base.util.UtilGenerics.cast; + +import java.util.Map; + +import javax.script.ScriptContext; + +import javolution.util.FastMap; + +import org.ofbiz.base.util.Assert; +import org.ofbiz.base.util.Debug; +import org.ofbiz.base.util.ScriptUtil; +import org.ofbiz.service.DispatchContext; +import org.ofbiz.service.GenericServiceException; +import org.ofbiz.service.ModelService; +import org.ofbiz.service.ServiceDispatcher; +import org.ofbiz.service.ServiceUtil; + +/** + * Generic Script Service Engine. This service engine uses the javax.script package (JSR-223) to invoke scripts or script functions. + * <p>The script service engine will put the following artifacts in the script engine's bindings:<br /> + * <ul> + * <li><code>parameters</code> - the service attributes <code>Map</code></li> + * <li><code>dctx</code> - a <code>DispatchContext</code> instance</li> + * <li><code>dispatcher</code> - a <code>LocalDispatcher</code> instance</li> + * <li><code>delegator</code> - a <code>Delegator</code> instance</li> + * </ul></p> + * <p>If the service definition includes an invoke attribute, then the matching script function/method will be called + * with a single argument - the bindings <code>Map</code>.</p> + */ +public final class ScriptEngine extends GenericAsyncEngine { + + public static final String module = ScriptEngine.class.getName(); + + public ScriptEngine(ServiceDispatcher dispatcher) { + super(dispatcher); + } + + @Override + public void runSyncIgnore(String localName, ModelService modelService, Map<String, Object> context) throws GenericServiceException { + runSync(localName, modelService, context); + } + + @Override + public Map<String, Object> runSync(String localName, ModelService modelService, Map<String, Object> context) throws GenericServiceException { + Assert.notNull("localName", localName, "modelService.location", modelService.location, "context", context); + Map<String, Object> params = FastMap.newInstance(); + params.putAll(context); + context.put("parameters", params); + DispatchContext dctx = dispatcher.getLocalContext(localName); + context.put("dctx", dctx); + context.put("dispatcher", dctx.getDispatcher()); + context.put("delegator", dispatcher.getDelegator()); + try { + ScriptContext scriptContext = ScriptUtil.createScriptContext(context); + Object resultObj = ScriptUtil.executeScript(getLocation(modelService), modelService.invoke, scriptContext, new Object[] { context }); + if (resultObj == null) { + resultObj = scriptContext.getAttribute("result"); + } + Debug.logInfo("resultObj = " + resultObj, module); + if (resultObj != null && resultObj instanceof Map<?, ?>) { + return cast(resultObj); + } + Map<String, Object> result = ServiceUtil.returnSuccess(); + result.putAll(modelService.makeValid(scriptContext.getBindings(ScriptContext.ENGINE_SCOPE), "OUT")); + return result; + } catch (Exception e) { + Debug.logInfo(e, module); + throw new GenericServiceException(e); + } + } + +} Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/engine/ScriptEngine.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/engine/ScriptEngine.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Rev URL |
Free forum by Nabble | Edit this page |