Thank you Adrian,
but I am not sure I understand what you are proposing; could you add some
details?
If I use the declaration:
def testMethod1(Map context) {
...
}
I get the error:
javax.script.ScriptException: java.lang.NullPointerException: Cannot set
property 'orderId' on null object
Thanks,
Jacopo
On Apr 13, 2012, at 12:57 PM, Adrian Crum wrote:
> Functions/methods should return a value. Also, according to the JSR if a
> scripting language doesn't support returning a value, then the last value
> assigned to a variable is returned.
>
> So, trying to return values from a function via the context Map will not
> work. That's why I originally supplied the context Map as a function/method
> argument - so you could do something like:
>
> def testMethod1(Map context) {
> orderId = parameters.orderId;
> context.orderId = orderId;
> }
>
>
> -Adrian
>
>
> On 4/13/2012 11:37 AM, Jacopo Cappellato wrote:
>> Hi Adrian,
>>
>> I am trying to test the ability to specify a method name from from a<script>
>> element in a screen widget but I am getting an error and I am wondering if
>> you could help in figuring out what is wrong.
>>
>> If you apply this patch:
>>
>> Index: applications/order/widget/ordermgr/OrderViewScreens.xml
>> ===================================================================
>> --- applications/order/widget/ordermgr/OrderViewScreens.xml (revision
>> 1325649)
>> +++ applications/order/widget/ordermgr/OrderViewScreens.xml (working copy)
>> @@ -55,7 +55,7 @@
>> <set field="layoutSettings.javaScripts[]"
>> value="/ordermgr/images/js/order.js" global="true"/>
>> <set field="layoutSettings.javaScripts[]"
>> value="/ordermgr/images/js/OrderShippingInfo.js" global="true"/>
>> <set field="layoutSettings.javaScripts[]"
>> value="/ordermgr/images/js/geoAutoCompleter.js" global="true"/>
>> -<script
>> location="component://order/webapp/ordermgr/WEB-INF/actions/order/OrderView.groovy"/>
>> +<script
>> location="component://order/webapp/ordermgr/WEB-INF/actions/order/OrderView.groovy#testMethod1"/>
>> <script
>> location="component://order/webapp/ordermgr/WEB-INF/actions/order/OrderViewWebSecure.groovy"/>
>> </actions>
>> <widgets>
>> Index:
>> applications/order/webapp/ordermgr/WEB-INF/actions/order/OrderView.groovy
>> ===================================================================
>> ---
>> applications/order/webapp/ordermgr/WEB-INF/actions/order/OrderView.groovy
>> (revision 1325649)
>> +++
>> applications/order/webapp/ordermgr/WEB-INF/actions/order/OrderView.groovy
>> (working copy)
>> @@ -33,6 +33,8 @@
>>
>> import javolution.util.FastMap;
>>
>> +def testMethod1() {
>> +
>> orderId = parameters.orderId;
>> context.orderId = orderId;
>>
>> @@ -494,3 +496,5 @@
>> }
>> }
>> context.orderAdjustmentId = orderAdjustmentId;
>> +
>> +}
>>
>> and then visit this url:
>>
>> https://localhost:8443/ordermgr/control/orderview?orderId=Demo1002
>>
>> you will get the following error:
>>
>> [java] Error running script at location
>> [component://order/webapp/ordermgr/WEB-INF/actions/order/OrderView.groovy]:
>> javax.script.ScriptException: groovy.lang.MissingPropertyException: No such
>> property: context for class: Script1
>> [java] Exception: javax.script.ScriptException
>> [java] Message: groovy.lang.MissingPropertyException: No such property:
>> context for class: Script1
>> [java] ---- cause
>> ---------------------------------------------------------------------
>> [java] Exception: groovy.lang.MissingPropertyException
>> [java] Message: No such property: context for class: Script1
>> [java] ---- stack trace
>> ---------------------------------------------------------------
>> [java] groovy.lang.MissingPropertyException: No such property: context
>> for class: Script1
>> [java]
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:50)
>> [java]
>> org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:49)
>> [java]
>> org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:231)
>> [java] Script1.testMethod1(Script1.groovy:39)
>> [java] sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> [java]
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>> [java]
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>> [java] java.lang.reflect.Method.invoke(Method.java:597)
>> [java]
>> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
>> [java] groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
>> [java] groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1047)
>> [java] groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:914)
>> [java] groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:877)
>> [java] groovy.lang.Closure.call(Closure.java:412)
>> [java]
>> org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.callGlobal(GroovyScriptEngineImpl.java:385)
>> [java]
>> org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.callGlobal(GroovyScriptEngineImpl.java:379)
>> [java]
>> org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.invokeImpl(GroovyScriptEngineImpl.java:368)
>> [java]
>> org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.invokeFunction(GroovyScriptEngineImpl.java:163)
>> [java] org.ofbiz.base.util.ScriptUtil.executeScript(ScriptUtil.java:387)
>> [java] org.ofbiz.base.util.ScriptUtil.executeScript(ScriptUtil.java:339)
>> [java] org.ofbiz.base.util.ScriptUtil.executeScript(ScriptUtil.java:324)
>> [java]
>> org.ofbiz.widget.ModelWidgetAction$Script.runAction(ModelWidgetAction.java:416)
>> ...
>>
>> So the error is caused by line 387 of ScriptUtil.java; here is the relevant
>> code:
>>
>> if (UtilValidate.isNotEmpty(functionName)) {
>> try {
>> Invocable invocableEngine = (Invocable) engine;
>> result = invocableEngine.invokeFunction(functionName, args
>> == null ? EMPTY_ARGS : args); // this is where the error is thrown
>> } catch (ClassCastException e) {
>> throw new ScriptException("Script engine " +
>> engine.getClass().getName() + " does not support function/method
>> invocations");
>> }
>> }
>>
>> Any hint on how I could solve this?
>>
>> Thanks!
>>
>> Jacopo
>>
>>
>>
>>
>>