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 |
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 > > > > > |
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 >> >> >> >> >> |
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 >>> >>> >>> >>> >>> |
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 >>>> >>>> >>>> >>>> >>>> |
Free forum by Nabble | Edit this page |