HiAdrian,

I am still getting an error; I did some debugging and here are my findings:

On May 15, 2012, at 10:50 AM, Adrian Crum wrote:

> On 5/15/2012 7:22 AM, Jacopo Cappellato wrote:
>> Thank you Adrian, much appreciated.
>> I have a question about one of the changes you have committed:
>> 
>> +            if (this.resultFma.containsNestedExpression()) {
> ^^^ If this result-name attribute contains a nested expression, like 
> "${result1}"
>> +                String expression = (String) 
>> this.resultFma.get(methodContext.getEnvMap());
> ^^^ then evaluate the expression using the main context (expression = 
> "result1")

This doesn't work as expected and "expression" is null.

If I have the following code:
<set field="total" value="10" type="BigDecimal"/>
<set field="result1" value="totalOrders"/>
<field-to-result field="total" result-name="${result1}"/>

I would expect that the above returns: expression == "totalOrders"
Is it correct assumption?
The problem I think is in FMA.getExpression(...):

    protected String getExpression(Map<String, ? extends Object> base) {
        String expression = null;
        if (this.fse != null) {
            expression = 
FlexibleStringExpander.openBracket.concat(UelUtil.prepareExpression(this.fse.expandString(base)).concat(FlexibleStringExpander.closeBracket));
        } else {
            expression = this.bracketedOriginal;
        }
        return expression;
    }

and specifically in line:

            expression = 
FlexibleStringExpander.openBracket.concat(UelUtil.prepareExpression(this.fse.expandString(base)).concat(FlexibleStringExpander.closeBracket));

because this.fse.expandString(base) returns:

"${totalOrders}"

rather than "totalOrders"

and then (I guess) the value is not found in the resultmap and the expression 
comes as null.

Is it possible?

Jacopo


>> +                FlexibleMapAccessor<Object>  resultFma = 
>> FlexibleMapAccessor.getInstance(expression);
> ^^^ Create a new FMA for the nested expression
>> +                resultFma.put(methodContext.getResults(), fieldVal);
> ^^^ then evaluate the nested expression using the result Map.
> 
> -Adrian
> 
>> +            }...
>> 
>> if I read it correctly, if a nested expression is detected then a new FMA is 
>> created as a local variable and the result value is added to that instead of 
>> adding it to the instance FMA. Aren't we loosing the result in this way?
>> 
>> Thanks,
>> 
>> Jacopo
>> 
>> On May 14, 2012, at 10:50 PM, Adrian Crum wrote:
>> 
>>> Jacopo,
>>> 
>>> I committed a fix in rev 1338394. Let me know if that solves your problem.
>>> 
>>> -Adrian
>>> 
>>> On 5/14/2012 1:54 PM, Adrian Crum wrote:
>>>> Then that seems to be a flaw in the<field-to-result>  logic. I will look 
>>>> into it.
>>>> 
>>>> -Adrian
>>>> 
>>>> On 5/14/2012 1:51 PM, Jacopo Cappellato wrote:
>>>>> Ok, I am debugging it and the problem is actually in the method 
>>>>> FlexibleMapAccessor.put at line:
>>>>> 
>>>>> UelUtil.setValue(base, getExpression(base), value == null ? Object.class 
>>>>> : value.getClass(), value);
>>>>> 
>>>>> The problem is that the "base" map is the map containing the results and 
>>>>> not the "context" of the method.
>>>>> For example:
>>>>> 
>>>>> <set field="total" value="10" type="BigDecimal"/>
>>>>> <set field="result1" value="totalOrders"/>
>>>>> <field-to-result field="total" result-name="${result1}"/>
>>>>> 
>>>>> This should add to the output the entry: ["totalOrders": 10]
>>>>> 
>>>>> It instead throws the error because the ${result1} is expanded using the 
>>>>> "result" map rather than the "context" map where the "result1" field is 
>>>>> set.
>>>>> 
>>>>> Jacopo
>>>>> 
>>>>> 
>>>>> On May 14, 2012, at 12:34 PM, Adrian Crum wrote:
>>>>> 
>>>>>> It must be an old bug. As far as I know, the expression parsing hasn't 
>>>>>> changed recently (with the exception of the recent security fix).
>>>>>> 
>>>>>> -Adrian
>>>>>> 
>>>>>> On 5/14/2012 11:27 AM, Jacopo Cappellato wrote:
>>>>>>> Ok, I will try to look at it and find a fix... do you have any idea 
>>>>>>> about why the content of the brackets is removed during parsing? Is it 
>>>>>>> related to recent changes or it is an old bug? They may be silly 
>>>>>>> questions but I actually don't know much about this code.
>>>>>>> 
>>>>>>> Jacopo
>>>>>>> 
>>>>>>> On May 14, 2012, at 12:03 PM, Adrian Crum wrote:
>>>>>>> 
>>>>>>>> That is a nested expression: The result name is contained in the 
>>>>>>>> variable named "key".
>>>>>>>> 
>>>>>>>> UEL does not support nested expressions, but we make it work in 
>>>>>>>> FlexibleStringExpander by pre-parsing the String and extracting nested 
>>>>>>>> expressions.
>>>>>>>> 
>>>>>>>> In addition, FlexibleMapAccessor contains some code to handle nested 
>>>>>>>> expressions (line 66 and 192). So, maybe that code can be improved to 
>>>>>>>> be smarter.
>>>>>>>> 
>>>>>>>> -Adrian
>>>>>>>> 
>>>>>>>> On 5/14/2012 10:37 AM, Jacopo Cappellato wrote:
>>>>>>>>> Hi Adrian,
>>>>>>>>> 
>>>>>>>>> we have noticed that the following instruction:
>>>>>>>>> 
>>>>>>>>> <field-to-result field="val" result-name="${key}"/>
>>>>>>>>> 
>>>>>>>>> (from ContentServices.xml) returns an error in the console:
>>>>>>>>> 
>>>>>>>>> 2012-05-14 14:12:02,679 (default-invoker-Thread-11) 
>>>>>>>>> [FlexibleMapAccessor.java:163:ERROR] UEL exception while setting 
>>>>>>>>> value: javax.el.ELException: Error parsing '${}': syntax error at 
>>>>>>>>> position 2, encountered '}', 
>>>>>>>>> expected<IDENTIFIER>|<STRING>|<FLOAT>|<INTEGER>|'true'|'false'|'null'|'-'|'!'|'not'|'empty'|'(',
>>>>>>>>>  original = ${key}
>>>>>>>>> 
>>>>>>>>> However it seems that the value is still returned properly. Any idea 
>>>>>>>>> of how we could fix it?
>>>>>>>>> 
>>>>>>>>> Thanks,
>>>>>>>>> 
>>>>>>>>> Jacopo
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 

Reply via email to