[ 
http://issues.apache.org/jira/browse/TAPESTRY-517?page=comments#action_12322826 
] 

Jonas Maurus commented on TAPESTRY-517:
---------------------------------------

I honestly don't know why I feel attacked by you, but you didn't say that this 
is hard to fix, at least not in any official comments you've made.

Of course, _I know it's hard to fix_, otherwise I'd have a well thought-out 
patch by now. I _explicitly_ called my code a work-around, because _it is_ bad 
design. I described 3 additional approaches to fix the problem, none of which I 
feel would be able to land in time for 4.0 final because they'd  break existing 
components and change existing contracts or introduce more bad design, but at 
the component level. Providing the one component where this bug manifests 
itself right now with a work-around parameter, which was your suggestion, only 
pushes the bug down the road to be rediscovered by (I'd guess) primarily AJAX 
components and makes handling FieldLabel's awkward.

Not fixing this bug would mean to ship Tapestry with components that work only 
if they're used in a certain order, which is, I'd say, _worse_. Especially 
since they don't fail "gracefully".

At the center of the problem is Tapestry's quirky identity concept, which might 
even be a primary cause for quick page rendering and low memory consumption, so 
it probably should be kept that way, but it doesn't allow simple loop-handling, 
I've documented that in my other comments on this bug.

I believe more and more that my last comment (changing IdAllocator so it can 
"look into the future") is the way to go. I'm experimenting with different 
approaches in my spare time. Nevertheless, I seem to remember seeing multiple 
ways to get Ids in the current Tapestry codebase, so this would have to be 
unified first, then handling Ids should probably become a HiveMind service. I'm 
still trying to make loop-handling transparent, so a component doesn't have to 
know it's in a loop and a "looping component" doesn't have to do any special 
handling, but this is not easily done. Making it possible to prerender a page's 
"identity tree" is my current idea that I'm experimenting with.

I've called for developer input multiple times, in JIRA and on the mailing list 
and received no reply. If there existed a consensus on how to fix this for 4.0, 
I'd be more than willing to fix this properly, but I'll be out of the country 
during the last two weeks of september. I don't mind working on this until then 
and after coming back and I'd welcome any help. Perhaps you could outline what 
mechanism you're thinking of, then, at least, there'd be a goal to work toward.


> Using a FieldLabel component after the decorated form component causes the 
> FieldLabel's id attribute to be wrong
> ----------------------------------------------------------------------------------------------------------------
>
>          Key: TAPESTRY-517
>          URL: http://issues.apache.org/jira/browse/TAPESTRY-517
>      Project: Tapestry
>         Type: Bug
>   Components: Framework
>     Versions: 4.0
>     Reporter: Jonas Maurus
>     Assignee: Howard M. Lewis Ship
>  Attachments: AbstractFormComponent.clientid_fix.diff, 
> AbstractFormComponent.clientid_fix_2.diff, 
> AbstractFormComponent.clientid_fix_3.diff, 
> AbstractFormComponent.clientid_fix_4.diff, 
> AbstractFormComponent.clientid_fix_cvs_HEAD_20050825_1358.diff, 
> TAPESTRY-517.clientid_fix.diff
>
> Quoting from TAPESTRY-409:
> <!-- page definition -->
>   <component id="bookkeeperRCB" type="Checkbox">
>     <binding name="selected" value="hasBookkeeperRole" />
>   </component>
>   
>   <component id="adminRCB" type="Checkbox">
>     <binding name="selected" value="hasAdministratorRole" />
>   </component>
> <!-- page template -->
> <tr>
>   <td><input jwcid="bookkeeperRCB" type="checkbox" value="Y" /></td>
>   <td><label jwcid="@FieldLabel" for="bookkeeper"
>             field="ognl:components.bookkeeperRCB" 
> displayName="message:form.roles.bookkeeper">Bookkeeper</label></td>
> </tr>
> <tr>
>   <td><input jwcid="adminRCB" type="checkbox" value="Y" /></td>
>   <td><label jwcid="@FieldLabel" for="admin"
>            field="ognl:components.adminRCB" 
> displayName="message:form.roles.administrator">Administrator</label></td>
> </tr>
> yields:
> <tr>
>   <td><input type="checkbox" name="bookkeeperRCB" id="bookkeeperRCB" 
> value="Y"/></td>
>   <td><label for="bookkeeperRCB$0">Bookkeeper</label></td>
> </tr>
> <tr>
>   <td><input type="checkbox" name="adminRCB" checked="checked" id="adminRCB" 
> value="Y"/></td>
>   <td><label for="adminRCB$0">Administrator</label></td>
> </tr>
> as you can see the generated fieldnames ("bookkeeperRCB$0"...) are wrong. 
> This always results in a stale-link exception.
> I tracked down the bug: FieldLabel calls prerenderField() which in turn 
> causes an uniqueId to be allocated in 
> AbstractFormComponent.renderIdAttribute. Everything works out when the 
> FieldLabel precedes the form component it decorates. If it comes after the 
> form component, IRequestCycle.getUniqueId() will already have stored an id 
> for the component and return a new one.
> I'm not quite sure about the mechanics described above, as I don't fully 
> understand FormSupportImpl yet, perhaps someone else can shed light on this.
> However, the allocated client id wasn't cached properly in 
> AbstractFormComponent.renderIdAttribute. I'll attach a patch as soon as I've 
> saved this bug report.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to