You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ad...@apache.org on 2011/09/02 22:55:15 UTC

svn commit: r1164712 - /ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/SetOperation.java

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()) {



Re: svn commit: r1164712 - /ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/SetOperation.java

Posted by Jacques Le Roux <ja...@les7arts.com>.
From: "Adrian Crum" <ad...@sandglass-software.com>
> 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" <ad...@sandglass-software.com>
>>>> 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: <ad...@apache.org>
>>>>>> 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()) {
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>
>>> 



Re: svn commit: r1164712 - /ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/SetOperation.java

Posted by Adrian Crum <ad...@sandglass-software.com>.
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.

-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" <ad...@sandglass-software.com>
>>> 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: <ad...@apache.org>
>>>>> 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()) {
>>>>>
>>>>>
>>>>
>>>>
>>
>>

Re: svn commit: r1164712 - /ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/SetOperation.java

Posted by Adrian Crum <ad...@sandglass-software.com>.
On 9/3/2011 2:16 PM, Jacques Le Roux wrote:
> Comments inline
>
> From: "Adrian Crum" <ad...@sandglass-software.com>
>> 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: <ad...@apache.org>
>>>> 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()) {
>>>>
>>>>
>>>
>>>
>
>

Re: svn commit: r1164712 - /ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/SetOperation.java

Posted by Jacques Le Roux <ja...@les7arts.com>.
Comments inline

From: "Adrian Crum" <ad...@sandglass-software.com>
>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...

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

And looking in simple-method services in found many cases where type= is used also

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: <ad...@apache.org>
>>> 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()) {
>>>
>>>
>>
>> 



Re: svn commit: r1164712 - /ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/SetOperation.java

Posted by Adrian Crum <ad...@sandglass-software.com>.
I agree it is confusing. A while ago I suggested having another 
attribute like from-expression, but there wasn't much interest in it.

The value attribute returns a String, while from-field attribute returns 
an Object.

-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: <ad...@apache.org>
>> 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()) {
>>
>>
>
>

Re: svn commit: r1164712 - /ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/SetOperation.java

Posted by Jacques Le Roux <ja...@les7arts.com>.
Is it not a bit confusing (it's not a field at all), was not value enough?

Jacques

From: <ad...@apache.org>
> 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()) {
>
>