2009/9/3 Curtiss Howard <[email protected]>

> Hi,
>
> I've got a bug I need to fix related to composite component attribute
> handling and I think this might be a possible issue to raise for the
> EG.  Here's the background:
>
> We've got a page defined roughly as such:
>
> <h:form id="form1" prependId="false">
>  <ez:spinner value="#{number.number}" increment="10"/><br/>
>  <h:outputText value="Last number submitted: #{number.number}" /><br/>
>  <h:commandButton value="reload" type="submit"/><br/>
>  <h:messages/>
> </h:form>
>
> The composite component implementation for <ez:spinner> is essentially
> a text field with some buttons.  The value it references is
> #{cc.attrs.value}.
>
> The problem I'm seeing is that when I submit a value the text field
> updates with the new value, but the <h:outputText> will always output
> the original value (0 in this case).  What's happening is that the
> composite component attribute map's "value" attribute is getting
> updated, but #{number.number}, what #{cc.attrs.value} _really_ points
> to, does not.  The reason for this discrepancy is what makes me think
> this is something in the spec that needs to be addressed.
>
> According to the spec, the CC attributes EL resolver's setValue()
> method needs to retrieve the component's attributes map and call
> getValue().  If the result is a ValueExpression, call setValue(),
> which will in turn update the underlying bean property.  Otherwise, do
> the default, which is to simply update the CC attributes map.  The
> problem is that the component's getAttributes().get() method will
> auto-evaluate all ValueExpressions, so the CC attributes EL resolver
> never gets a _chance_ to see a ValueExpression.  This is by design in
> the spec, so I'm confused as to how this is supposed to work.  So far,
> I'm thinking that _ComponentAttributesMap() should have an alternate
> form of get() that will not evaluate ValueExpressions.  What does
> everyone else think?
>
> Hi

It seems when _ComponentAttributesMap().get is called, the resolution order
is this:

- getter on component class
- attribute map
- ValueExpression (or binding) map

Note that setValueExpression put a value expression on a binding map.

I think we can avoid the hacks committed _ComponentAttributeMap, adding some
code on CompositeComponentAttributesMapWrapper.put() method that call
setValueExpression instead _originalMap.put. The problems starts from here,
and that is the reason why the ValueExpression is hidden.

regards

Leonardo Uribe


> Thanks,
>
>
> Curtiss Howard
>

Reply via email to