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

Reply via email to