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