Invoking a script method from a screen

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

Invoking a script method from a screen

Jacopo Cappellato-4
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 | Threaded
Open this post in threaded view
|

Re: Invoking a script method from a screen

Adrian Crum-3
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 | Threaded
Open this post in threaded view
|

Re: Invoking a script method from a screen

Jacopo Cappellato-4
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 | Threaded
Open this post in threaded view
|

Re: Invoking a script method from a screen

Adrian Crum-3
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 | Threaded
Open this post in threaded view
|

Re: Invoking a script method from a screen

Jacopo Cappellato-4
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
>>>>
>>>>
>>>>
>>>>
>>>>