From: "Adrian Crum" <[email protected]>
To illustrate the problem this commit solves, let's use this example:
<set field="someList" value="${groovy:someObject.methodThatReturnsAList();}"
type="List" />
You would assume the someList field contains the List that someObject.methodThatReturnsAList() returned. It doesn't. Instead, a
new List is created, the list returned from someObject.methodThatReturnsAList() is converted to a String, the String is added to
the new List, and the new List is returned.
So you mean only strings can be returned? Another type of Object in the returned list would be lost (I hope all the content is
currently returned but only strings are possible) ?
Then I'd understand your need, and from-field with a good documentationin in
XSD would do it for me
Thanks
Jacques
PS: actually you explain it quite well in you previous message, OK with me...
Yes, an attribute is needed that returns something other than a String. The from-field attribute returns an Object retrieved from
the context Map. The value and default-value attributes return a String. You can try to convert those Strings to the desired type,
but some types can not be converted (like the entity models I was trying to use).
Are you sure? Actually I have not much used groovy: in minilang. I have used it in screen actions and there you can also specify
the type using type=
Yes, I am sure. I spent several hours trying to find a way to call an Object's
method and get the correct type returned - no luck.
-Adrian
On 9/3/2011 2:25 PM, Adrian Crum wrote:
On 9/3/2011 2:16 PM, Jacques Le Roux wrote:
Comments inline
From: "Adrian Crum" <[email protected]>
I agree it is confusing. A while ago I suggested having another attribute like from-expression, but there wasn't much interest
in it.
Would be more clear than from-field IMO, but I still wonder if any of those is
needed...
Yes, an attribute is needed that returns something other than a String. The from-field attribute returns an Object retrieved from
the context Map. The value and default-value attributes return a String. You can try to convert those Strings to the desired
type, but some types can not be converted (like the entity models I was trying to use).
The value attribute returns a String, while from-field attribute returns an
Object.
Are you sure? Actually I have not much used groovy: in minilang. I have used it in screen actions and there you can also specify
the type using type=
Yes, I am sure. I spent several hours trying to find a way to call an Object's method and get the correct type returned - no
luck.
And looking in simple-method services in found many cases where type= is used
also
Look at the WorkEffort services I just committed. See if you can get them to
work without this commit.
Jacques
-Adrian
On 9/3/2011 12:16 PM, Jacques Le Roux wrote:
Is it not a bit confusing (it's not a field at all), was not value enough?
Jacques
From: <[email protected]>
Author: adrianc
Date: Fri Sep 2 20:55:15 2011
New Revision: 1164712
URL: http://svn.apache.org/viewvc?rev=1164712&view=rev
Log:
Improved mini-language <set> operation: now supports groovy: syntax in the
from-field attribute.
Modified:
ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/SetOperation.java
Modified:
ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/SetOperation.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/SetOperation.java?rev=1164712&r1=1164711&r2=1164712&view=diff
==============================================================================
---
ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/SetOperation.java (original)
+++
ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/SetOperation.java
Fri Sep 2 20:55:15 2011
@@ -21,8 +21,10 @@ package org.ofbiz.minilang.method.envops
import javolution.util.FastList;
import javolution.util.FastMap;
+import org.codehaus.groovy.runtime.InvokerHelper;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.GeneralException;
+import org.ofbiz.base.util.GroovyUtil;
import org.ofbiz.base.util.ObjectType;
import org.ofbiz.base.util.UtilValidate;
import org.ofbiz.base.util.string.FlexibleStringExpander;
@@ -54,11 +56,16 @@ public class SetOperation extends Method
protected String type;
protected boolean setIfNull; // default to false
protected boolean setIfEmpty; // default to true
+ protected Class<?> parsedGroovyScript = null;
public SetOperation(Element element, SimpleMethod simpleMethod) {
super(element, simpleMethod);
this.field = new ContextAccessor<Object>(element.getAttribute("field"));
- this.fromField = new
ContextAccessor<Object>(element.getAttribute("from-field"));
+ String fromFieldStr = element.getAttribute("from-field");
+ if (fromFieldStr != null && fromFieldStr.startsWith("groovy:")) {
+ this.parsedGroovyScript =
GroovyUtil.parseClass(fromFieldStr.replace("groovy:", ""));
+ }
+ this.fromField = new ContextAccessor<Object>(fromFieldStr);
this.valueExdr =
FlexibleStringExpander.getInstance(element.getAttribute("value"));
this.defaultExdr =
FlexibleStringExpander.getInstance(element.getAttribute("default-value"));
this.type = element.getAttribute("type");
@@ -75,7 +82,9 @@ public class SetOperation extends Method
@Override
public boolean exec(MethodContext methodContext) {
Object newValue = null;
- if (!this.fromField.isEmpty()) {
+ if (this.parsedGroovyScript != null) {
+ newValue = InvokerHelper.createScript(this.parsedGroovyScript,
GroovyUtil.getBinding(methodContext.getEnvMap())).run();
+ } else if (!this.fromField.isEmpty()) {
newValue = this.fromField.get(methodContext);
if (Debug.verboseOn()) Debug.logVerbose("In screen getting value for field from [" + this.fromField.toString() +
"]: " + newValue, module);
} else if (!this.valueExdr.isEmpty()) {