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

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

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

Jacques Le Roux
Administrator
Is it not a bit confusing (it's not a field at all), was not value enough?

Jacques

From: <[hidden email]>

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


Reply | Threaded
Open this post in threaded view
|

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

Adrian Crum-3
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: <[hidden email]>
>> 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()) {
>>
>>
>
>
Reply | Threaded
Open this post in threaded view
|

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

Jacques Le Roux
Administrator
Comments inline

From: "Adrian Crum" <[hidden email]>
>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: <[hidden email]>
>>> 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()) {
>>>
>>>
>>
>>


Reply | Threaded
Open this post in threaded view
|

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

Adrian Crum-3
On 9/3/2011 2:16 PM, Jacques Le Roux wrote:
> Comments inline
>
> From: "Adrian Crum" <[hidden email]>
>> 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: <[hidden email]>
>>>> 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()) {
>>>>
>>>>
>>>
>>>
>
>
Reply | Threaded
Open this post in threaded view
|

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

Adrian Crum-3
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" <[hidden email]>
>>> 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: <[hidden email]>
>>>>> 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()) {
>>>>>
>>>>>
>>>>
>>>>
>>
>>
Reply | Threaded
Open this post in threaded view
|

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

Jacques Le Roux
Administrator
From: "Adrian Crum" <[hidden email]>
> 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" <[hidden email]>
>>>> 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: <[hidden email]>
>>>>>> 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()) {
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>
>>>