myfaces-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Simon Kitching <skitch...@obsidium.com>
Subject Reconnecting UIComponentTag instances with the corresponding UIComponent
Date Tue, 22 Nov 2005 23:13:15 GMT
Hi,

As part of my investigations of
   http://issues.apache.org/jira/browse/MYFACES-856
I have found that I need to understand how a UIComponentTag finds its 
corresponding component.

When a JSP page is processed, each time a jsf tag is encountered a 
UIComponentTag instance is created, initialised with the tag attributes, 
and then doStartTag is invoked.

On the first visit to a view, there is no problem: each UIComponentTag 
simply creates its corresponding component.

However on a re-render the UIComponentTag has to locate the appropriate 
UIComponent instance in the view (see method findComponent). It's 
important that it does this correctly, as this is how components with 
failed validation (whose value to render is stored in the component's 
_submittedValue member) render their value into the correct place in the 
response.

The UIComponentTag knows its parent tag, and its parent tag knows its 
component. So far so good.

Now if the tag in question has an explicit id assigned by the user then 
there's no problem: a search is done in the children of the parent tag's 
component for a matching id.

But what happens if the tag has an auto-generated id?

It looks to me like the "reconnection" process then depends upon 
UIViewRoot generating anonymous ids in exactly the same sequence as on 
the first view.

Won't this fail horribly if on re-render of a page there are more or 
less JSF tags present than there were previously? UIComponentTags will 
then "find" the wrong UIComponents, potentially of completely the wrong 
type for that tag.


The methods UIComponentTag.removeFormerChildren/removeFormerFacets are 
in this class explicitly to handle cases where re-rendering of a view 
finds that JSF components have been added or removed. I had assumed that 
this was to handle JSTL c:if tags enclosing JSF tags in a page, and 
similar situations. Is this not the case? Perhaps this is not supported 
at all, and the removeFormerChildren method is there only to handle 
cases where components were programmatically added?

Is this all perhaps related to the mysterious comment in 
UIComponentBase.getClientId?
    if (id == null)
    {
       //Although this is an error prone side effect, we
       // automatically create a new id
       //just to be compatible to the RI


Thanks in advance for any info,

Simon

Mime
View raw message