[jsr-314-open] #{cc} semantics
Ryan Lubke
Ryan.Lubke at Sun.COM
Fri Oct 9 15:41:20 EDT 2009
On 10/8/09 5:51 PM, Martin Marinschek wrote:
> I know I am way late with my post, but I (sure) also agree with Andy.
> Can we take this up as an issue against the implementation, and
> eventually a clarification to the spec?
>
> Ryan, what do you think?
>
We've made the necessary changes to Mojarra to support Andy's suggestion
and have
added a line item to the MR change log [1] (see C034).
[1] http://wiki.java.net/bin/view/Projects/Jsf2MR1ChangeLog
> Leonardo, can you do the same in MyFaces?
>
> regards,
>
> Martin
>
> On Thu, Sep 17, 2009 at 6:12 PM, Kito Mann<kito.mann at virtua.com> wrote:
>
>> +1
>> ---
>> Kito D. Mann -- Author, JavaServer Faces in Action
>> http://twitter.com/kito99 http://twitter.com/jsfcentral
>> JSF 2 Seminar Oct 6th: http://www.regonline.com/jsf2seminar
>> JSF Summit Conference Dec 1st-4th in Orlando: http://www.jsfsummit.com
>> http://www.JSFCentral.com - JavaServer Faces FAQ, news, and info
>> +1 203-404-4848 x3
>>
>>
>> On Tue, Sep 15, 2009 at 6:34 PM, Andy Schwartz<andy.schwartz at oracle.com>
>> wrote:
>>
>>> Ryan, All -
>>>
>>> Breaking this topic off into a separate thread, though I am impressed with
>>> the length of the "<h:dataTable> binding vs. ui:repeat" thread. :-)
>>>
>>> Ryan Lubke wrote:
>>>
>>>> On 9/7/09 6:06 PM, Andy Schwartz wrote:
>>>>
>>>>> Thanks Lincoln. I haven't had time to debug this, but I have a theory
>>>>> about what might be happening. In your sample:
>>>>>
>>>>>
>>>>>> <a:editText value="#{cc.attrs.task.text}"
>>>>>> rendered="#{!cc.attrs.disabled}">
>>>>>> *<f:actionListener for="submit"
>>>>>> action="#{taskController.saveTaskAjax(cc.attrs.story, cc.attrs.task)}" /> *
>>>>>> </a:editText>
>>>>>>
>>>>> We expect "cc" to resolve to the containing composite component (ie. to
>>>>> the<socialpm:taskBlock> component). I wouldn't be surprised if what is
>>>>> actually happening is that "cc" is being resolved to the<a:editText>
>>>>> composite component instead.
>>>>>
>>>> Yep, that's what is happening.
>>>>
>>>>> One reason why I suspect this might be happening is that I know that
>>>>> Ryan has investigated/resolved similar problems not too long ago.
>>>>>
>>>> The problem we resolved was the passing of #{cc.attrs} attributes between
>>>> nested composite components.
>>>> For this case, the spec recommends using cc.parent.attrs.story and
>>>> cc.parent.attrs.task, where parent resolves
>>>> to the nearest composite component parent of the current composite
>>>> component.
>>>>
>>> I am concerned about this behavior. It isn't clear to me whether the spec
>>> is explicit about this behavior, or whether this is something that happens
>>> to fall out of the implementation. Either way, the current behavior seems
>>> counterintuitive to me, and, well... wrong.
>>>
>>> My feeling is that when a composite component author uses a #{cc}
>>> expression in a composite component implementation, eg:
>>>
>>> <composite:implementation>
>>> <h:outputText value="#{cc.attrs.value}">
>>> </composite:implementation>
>>>
>>> The correct behavior (the behavior expected by the composite component
>>> author) is to resolve the #{cc} expression relative to where the expression
>>> is defined - not relative to where it happens to end up in the component
>>> tree. So, for example, I believe that these three uses of the
>>> #{cc.attrs.value} expression should all evaluate to the same value:
>>>
>>> <composite:implementation>
>>>
>>> <!-- 1. Expression directly in the implementation -->
>>> <h:outputText value="#{cc.attrs.value}">
>>>
>>> <!-- 2. Expression in non-composite component facet -->
>>> <bar:someJavaComposite>
>>> <f:facet name="someFacet">
>>> <h:outputText value="#{cc.attrs.value}">
>>> </f:facet>
>>> </bar:someJavaComponent>
>>>
>>> <!-- 3. Expression in composite component facet -->
>>> <foo:someCompositeComponent>
>>> <f:facet name="someFacet">
>>> <h:outputText value="#{cc.attrs.value}">
>>> </f:facet>
>>> </foo:someCompositeComponent>
>>>
>>> </composite:implementation>
>>>
>>> The fact that the #{cc.attrs.value} expression evaluates the same in cases
>>> #1 and #2 but not in case #3 is non-obvious and is going to be confusing for
>>> our users. The fact that Lincoln and I were confused about this is a good
>>> indication that others will be as well.
>>>
>>> I am not happy with the work around of using #cc.parent.attrs, since this
>>> means that:
>>>
>>> 1. The user must recognize that the component in question is a composite
>>> component and code the expression differently. While at the moment it is
>>> fairly easy to determine whether a particular component is a composite or
>>> not (by looking at the namespace declaration), I think that we should strive
>>> to blur these lines rather than reinforce them. For example, I would like
>>> to see the ability to define a single tag library that consists of both
>>> composite and non-composite components, making the choice of component
>>> implementation more transparent to the user.
>>>
>>> 2. Once the user has coded the expression in a composite
>>> component-specific way, this introduces a dependency on the fact that the
>>> component in question is a composite component - a dependency that shouldn't
>>> be necessary for this particular case. Such dependencies inhibit
>>> flexibility. If in the future the provider of the composite component
>>> decides to switch to a Java-based component, this will break any code (or EL
>>> expression) that assumes that the component is a composite. We should keep
>>> such dependencies to a minimum.
>>>
>>> 3. This also introduces a subtle dependency on the composite component's
>>> implementation. What if the composite component implementation passes the
>>> expression along to yet another nested composite component? Does the user
>>> now need to specify an expression that pops out multiple levels of parents?
>>>
>>> While it is certainly trickier to deal with from an implementation
>>> perspective, I believe that it is very important that we re-consider the
>>> current behavior and consider spec'ing that #{cc} expressions always resolve
>>> relative to the context in which they are defined. I feel that the current
>>> behavior violates the principle of least surprise (both Lincoln and I were
>>> surprised) and also breaks encapsulation (ie. introduces
>>> implementation-specific dependencies).
>>>
>>> Leaving aside questions of how we might implement my preferred behavior
>>> for the moment... Does anyone have comments on which behavior makes sense
>>> from a spec/end user perspective?
>>>
>>> Andy
>>>
>>>
>>
>>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/jsr-314-open-mirror/attachments/20091009/f22ba969/attachment.html
More information about the jsr-314-open-mirror
mailing list