Thank you Adrian,
this is now implemented in rev. 1325750
Kind regards,
Jacopo
On Apr 13, 2012, at 2:49 PM, Adrian Crum wrote:
> The context Map needs to be passed in the ScriptUtil.executeScript method
> args argument. I originally set up the events and services to do that, but it
> was removed. See rev 1300473.
>
> -Adrian
>
> On 4/13/2012 1:33 PM, Jacopo Cappellato wrote:
>> 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
>>>>
>>>>
>>>>
>>>>
>>>>