but with setOutputMarkupId() we make sure the most appropriate ID is used, if one hasn't already been assigned. And in case wicket:id is present, it'll be used. And IDs have to be page-unique. That is no tag on the same page must have the same ID.
Juergen On Fri, Mar 30, 2012 at 4:33 PM, Sven Meier <[email protected]> wrote: > Javascript ids are session unique anyway - just prefixed with the component > id in non-deployment config. > > Sven > > > On 03/30/2012 04:11 PM, Juergen Donnerstag wrote: >> >> On Fri, Mar 30, 2012 at 3:57 PM, Sven Meier<[email protected]> wrote: >>> >>> Hi Juergen and Jesse, >>> >>> I've debugged WicketLinkTagHandler and everything worked as I have >>> expected >>> it: >>> >>> The WicketTag is always the same instance, coming from the cached markup. >>> Changing its id doesn't make sense to me: This is global state which is >>> accessed for *each* rendering of the container. >>> >>> >>>> An id which is unique with markup file is not guranteed to be unique in >>>> the >>>> page markup. >>>> That's why resolvers are using the page.autoIndex to create a page >>>> unique >>>> id >>> >>> Yes, the id has to be unique for components inside their container. That >>> hasn't changed with the patch. >>> >> From a component resolution point of view you are right, but I think >> you are ignoring Javascript here. wicket-ids may become become ids and >> they need to be page unique, correct? >> >> Juergen >> >>> Back to debugging >>> Sven >>> >>> >>> >>> On 03/30/2012 12:40 PM, Juergen Donnerstag wrote: >>>> >>>> On Fri, Mar 30, 2012 at 3:01 AM, Jesse Long<[email protected]> >>>> wrote: >>>>> >>>>> Hi Juergen, Sven, >>>>> >>>>> We are not doing away with adding the "auto index" unique number to the >>>>> resultant component id, we are only doing away with modifying the id in >>>>> the >>>>> cached markup tag. >>>> >>>> The patched changed the resolver and not the filter. Hence the markup >>>> loaded into the cache is still the same, but the id presented at >>>> render time is now a different. >>>> >>>>> The uniqueness of the id of the component returned by the resolve() >>>>> method >>>>> is still being guaranteed (as far as I understand) because it takes the >>>>> original id from the tag and append the current page's next auto index >>>>> number. The component (TransparentWebMarkupContainer) is then created >>>>> with >>>>> this modified id. >>>> >>>> sorry but this is also not correct. The markup of a page is composed >>>> of potentially many markup files (fragments, panels, inheritance, >>>> etc.). An id which is unique with markup file is not guranteed to be >>>> unique in the page markup. That's why resolvers are using the >>>> page.autoIndex to create a page unique id >>>> >>>>> All I'm asking in this patch is to not modify the original id stored in >>>>> the >>>>> markup tag, because its not necessary. (AFAIK). >>>>> >>>>> Anyway, the resultant component id is now (after the patch) as unique >>>>> as >>>>> it >>>>> is on the first render without the patch... >>>> >>>> sorry, but this is not true. >>>> >>>>> This problem is actually very serious. I have a base page which 90% of >>>>> my >>>>> pages extend. Without the patch, on every single render, the id stored >>>>> in >>>>> the tag has a few bytes appended, causing the id of the resultant >>>>> component >>>>> to be a few bytes longer (for every render of every page in any >>>>> session). >>>>> I'm not sure if these ids get stored in memory after the render (I dont >>>>> know >>>>> wicket internals well enough to tell) or stored in the page store. If >>>>> they >>>>> do, its a big memory leak. >>>>> >>>>> At the very least its spews out huge amounts of data in the debug >>>>> logging. >>>> >>>> I very well understand your pain point, but lets fix the problem >>>> properly and not introduce a bug with an enhancement. >>>> >>>> Juergen >>>> >>>>> Cheers, >>>>> Jesse >>>>> >>>>> >>>>> >>>>> On 29/03/2012 22:39, Sven Meier wrote: >>>>>> >>>>>> Hi, >>>>>> >>>>>>> An artifical markup which creates duplicate IDs can be constructed. >>>>>> >>>>>> all auto labels' tags have the same id already (its class name) so no >>>>>> need >>>>>> to create some artificial markup. >>>>>> >>>>>>> To me the applied patch leaves us with a bigger problem than it >>>>>>> fixes. >>>>>> >>>>>> If the id of the tag in the cached markup is altered on each render, >>>>>> the >>>>>> id can get quite long pretty fast. As the reporter of the issues has >>>>>> stated, >>>>>> this is a 'big' problem ;). >>>>>> >>>>>>> we should fix it properly >>>>>> >>>>>> Agreed. Obviously I'm missing a key concept here. >>>>>> I'll try to debug this issue tomorrow to understand the problem you've >>>>>> identified. >>>>>> >>>>>> Sven >>>>>> >>>>>> On 03/29/2012 09:44 PM, Juergen Donnerstag wrote: >>>>>>> >>>>>>> Hi Sven >>>>>>> >>>>>>>> I double checked with how other filters/resolvers are doing it and I >>>>>>>> found >>>>>>>> AutoLabelTextResolver to leave the tag id untouched too. >>>>>>> >>>>>>> which is a fault as well. Same risk. >>>>>>> >>>>>>>>> May be a Component's flag bit can be used for that purpose. >>>>>>>> >>>>>>>> Shouldn't that be a flag on the markup tag instead then? >>>>>>> >>>>>>> No, because the Pages are made of potentially many markups. Since the >>>>>>> ID has no info about hierarchy, the number appended is the only thing >>>>>>> that makes it page unique. Hence it can not be per markup. Since >>>>>>> every >>>>>>> tag gets associated with a Component, the Component is the right >>>>>>> place >>>>>>> for the flag. >>>>>>> >>>>>>>>> I don't know how likely it is and I know we have no tests for it. >>>>>>>> >>>>>>>> Yeah, I didn't find one either. I'm not sure I understand where's a >>>>>>>> possible >>>>>>>> problem here. It's hard to discuss this issues without an actual >>>>>>>> case. >>>>>>> >>>>>>> An artifical markup which creates duplicate IDs can be constructed. >>>>>>> I've not tried it but I don't expect it to be too difficult. Knowing >>>>>>> there is a potential risk which will be very hard to find by a normal >>>>>>> user, makes me belief we should fix it properly, To me the applied >>>>>>> patch leaves us with a bigger problem than it fixes. >>>>>>> >>>>>>> Juergen >>>>>>> >>>>>>>> Sven >>>>>>>> >>>>>>>> >>>>>>>> On 03/29/2012 08:42 PM, Juergen Donnerstag wrote: >>>>>>>>> >>>>>>>>> Hi Sven, >>>>>>>>> >>>>>>>>> the change introduces a theoretical risk of duplicate ids. I don't >>>>>>>>> know how likely it is and I know we have no tests for it. But >>>>>>>>> Filters >>>>>>>>> are created per markup file and modify the markup upon loading, >>>>>>>>> prior >>>>>>>>> to caching. Which also means that the Page is not available. In >>>>>>>>> case >>>>>>>>> of inheritance it might not even be the same Page. To be absolutely >>>>>>>>> sure the ID is page-unique, it gets update in the Resolvers where >>>>>>>>> the >>>>>>>>> Page instance is available. >>>>>>>>> >>>>>>>>> The root cause is that we don't validate if the ID has been updated >>>>>>>>> already and avoid subsequent updates. We have no means to do that >>>>>>>>> check. A number at the end of the ID would not be sufficient. May >>>>>>>>> be >>>>>>>>> a >>>>>>>>> Component's flag bit can be used for that purpose. >>>>>>>>> >>>>>>>>> I understand the problem in your application, but users will have >>>>>>>>> an >>>>>>>>> extremly hard time to identify the issue if it occurs. I'm not sure >>>>>>>>> it's worth it. May be the approach outlined above solved your >>>>>>>>> problem >>>>>>>>> as well, but in a safe manner. >>>>>>>>> >>>>>>>>> Juergen >>>>>>>>> >>>>>>>>> On Thu, Mar 29, 2012 at 6:43 PM,<[email protected]> >>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>> Updated Branches: >>>>>>>>>> refs/heads/wicket-1.5.x c6c45a510 -> d7e0d8845 >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> WICKET-4484 do not change tag id when resolving component >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Project: http://git-wip-us.apache.org/repos/asf/wicket/repo >>>>>>>>>> Commit: >>>>>>>>>> http://git-wip-us.apache.org/repos/asf/wicket/commit/d7e0d884 >>>>>>>>>> Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/d7e0d884 >>>>>>>>>> Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/d7e0d884 >>>>>>>>>> >>>>>>>>>> Branch: refs/heads/wicket-1.5.x >>>>>>>>>> Commit: d7e0d8845dd509110e48ba965f0e11a3aae6a1f5 >>>>>>>>>> Parents: c6c45a5 >>>>>>>>>> Author: Sven Meier<[email protected]> >>>>>>>>>> Authored: Thu Mar 29 18:43:07 2012 +0200 >>>>>>>>>> Committer: Sven Meier<[email protected]> >>>>>>>>>> Committed: Thu Mar 29 18:43:07 2012 +0200 >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> ---------------------------------------------------------------------- >>>>>>>>>> .../markup/parser/filter/WicketLinkTagHandler.java | 1 - >>>>>>>>>> 1 files changed, 0 insertions(+), 1 deletions(-) >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> ---------------------------------------------------------------------- >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> http://git-wip-us.apache.org/repos/asf/wicket/blob/d7e0d884/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/WicketLinkTagHandler.java >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> ---------------------------------------------------------------------- >>>>>>>>>> diff --git >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/WicketLinkTagHandler.java >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/WicketLinkTagHandler.java >>>>>>>>>> index 689133e..8779b6f 100644 >>>>>>>>>> --- >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> a/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/WicketLinkTagHandler.java >>>>>>>>>> +++ >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> b/wicket-core/src/main/java/org/apache/wicket/markup/parser/filter/WicketLinkTagHandler.java >>>>>>>>>> @@ -208,7 +208,6 @@ public class WicketLinkTagHandler extends >>>>>>>>>> AbstractMarkupFilter implements ICompo >>>>>>>>>> if (wtag.isLinkTag()&& >>>>>>>>>> (wtag.getNamespace() >>>>>>>>>> != >>>>>>>>>> null)) >>>>>>>>>> { >>>>>>>>>> String id = tag.getId() + "-" + >>>>>>>>>> container.getPage().getAutoIndex(); >>>>>>>>>> - tag.setId(id); >>>>>>>>>> >>>>>>>>>> return new >>>>>>>>>> TransparentWebMarkupContainer(id); >>>>>>>>>> } >>>>>>>>>> >
