You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Christian Oldiges (JIRA)" <ji...@apache.org> on 2010/03/02 15:18:27 UTC
[jira] Created: (WICKET-2764) MarkupCache messed up when using
MergedMarkup (e.g. for Page markup inheritance) together with
IResourceStreams that do NOT also implement IFixedLocationResourceStream
MarkupCache messed up when using MergedMarkup (e.g. for Page markup inheritance) together with IResourceStreams that do NOT also implement IFixedLocationResourceStream
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Key: WICKET-2764
URL: https://issues.apache.org/jira/browse/WICKET-2764
Project: Wicket
Issue Type: Bug
Components: wicket
Affects Versions: 1.4.6
Reporter: Christian Oldiges
Priority: Minor
For a project that requires markup reloading and a custom markup directory structure we have implemented a custom IResourceStreamLocator.
This implementation creates instance of its own IResourceStream implementation which does NOT at the same time implement IFixedLocationResourceStream.
This means there is no "locationAsString()" method implemented on the resource stream instances.
Now the MarkupCache comes into the picture. It is using a cacheKey and the locationAsString as cache keys using a 2 step mechanism.
cacheKey -> locationAsString
locationAsString -> Markup
Additionally MergedMarkup comes into play. MergedMarkup is a markup instance that merges a base markup with another markup.
This is typically used for markup inheritance.
BasePage.html implemented by BasePage
PageA.html extends BasePage
PageB.html extends BasePage
MergedMarkup#locationAsString() concatenates the locationAsString values of its source markup/resource objects putting a ":" inbetween.
This means it will NEVER be NULL, even if both source objects return NULL as their locationAsString values.
Now, in case the original resource streams do not implement IFixedLocationResourceStream, this result in a locationAsString of "null:null".
Unfortunately this is the case for ALL possible combinations of the source objects of MergedMarkup
So the locationAsString is "null:null" for (BasePage,PageA) and also for (BasePage,PageB)
Back to the MarkupCache#loadMarkup method.
There is a check to use the cacheKey as a replacement for locationAsString in case its NULL.
Now, if the Markup loaded is a MergedMarkup instance, it doesnt return NULL, but "null:null".
So, putIntoCache() gets called with "null:null" as the key for ALL possible combinations resulting in a huge chaos of templates being merged together, when those cache entries are used later on.
A workaround is to implement IFixedLocationResourceStream on our custom IResourceStream implementation.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
[jira] Commented: (WICKET-2764) MarkupCache messed up when using
MergedMarkup (e.g. for Page markup inheritance) together with
IResourceStreams that do NOT also implement IFixedLocationResourceStream
Posted by "Juergen Donnerstag (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/jira/browse/WICKET-2764?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12840255#action_12840255 ]
Juergen Donnerstag commented on WICKET-2764:
--------------------------------------------
please provide a quickstart. Thanks.
> MarkupCache messed up when using MergedMarkup (e.g. for Page markup inheritance) together with IResourceStreams that do NOT also implement IFixedLocationResourceStream
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: WICKET-2764
> URL: https://issues.apache.org/jira/browse/WICKET-2764
> Project: Wicket
> Issue Type: Bug
> Components: wicket
> Affects Versions: 1.4.6
> Reporter: Christian Oldiges
> Priority: Minor
>
> For a project that requires markup reloading and a custom markup directory structure we have implemented a custom IResourceStreamLocator.
> This implementation creates instance of its own IResourceStream implementation which does NOT at the same time implement IFixedLocationResourceStream.
> This means there is no "locationAsString()" method implemented on the resource stream instances.
> Now the MarkupCache comes into the picture. It is using a cacheKey and the locationAsString as cache keys using a 2 step mechanism.
> cacheKey -> locationAsString
> locationAsString -> Markup
> Additionally MergedMarkup comes into play. MergedMarkup is a markup instance that merges a base markup with another markup.
> This is typically used for markup inheritance.
> BasePage.html implemented by BasePage
> PageA.html extends BasePage
> PageB.html extends BasePage
> MergedMarkup#locationAsString() concatenates the locationAsString values of its source markup/resource objects putting a ":" inbetween.
> This means it will NEVER be NULL, even if both source objects return NULL as their locationAsString values.
> Now, in case the original resource streams do not implement IFixedLocationResourceStream, this result in a locationAsString of "null:null".
> Unfortunately this is the case for ALL possible combinations of the source objects of MergedMarkup
> So the locationAsString is "null:null" for (BasePage,PageA) and also for (BasePage,PageB)
> Back to the MarkupCache#loadMarkup method.
> There is a check to use the cacheKey as a replacement for locationAsString in case its NULL.
> Now, if the Markup loaded is a MergedMarkup instance, it doesnt return NULL, but "null:null".
> So, putIntoCache() gets called with "null:null" as the key for ALL possible combinations resulting in a huge chaos of templates being merged together, when those cache entries are used later on.
> A workaround is to implement IFixedLocationResourceStream on our custom IResourceStream implementation.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
[jira] Updated: (WICKET-2764) MarkupCache messed up when using
MergedMarkup (e.g. for Page markup inheritance) together with
IResourceStreams that do NOT also implement IFixedLocationResourceStream
Posted by "Christian Oldiges (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/jira/browse/WICKET-2764?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Christian Oldiges updated WICKET-2764:
--------------------------------------
Attachment: wicket2764.tgz
Here is a quickstart to reproduce the problem.
There are 2 HomePage classes, one showing "HomePage", the other one showing "HomePage2".
If you start the server and access the URL:
http://localhost:8080/wicket2764/p1.html it will show you "HomePage"
Now access the 2. page:
http://localhost:8080/wicket2764/p2.html it will still show you "HomePage"
Now restart the server and access p2 first -> it will show you "HomePage2"
Then access "p1.html" -> it will show you "HomePage2" again.
The MergedMarkup instance get mixed up in the cache because for both combinations (BasePage,HomePage) and (BasePage,HomePage2).
"null:null" will be used as the locationAsString.
A quick fix would be include a NULL check in MergedMarkup#locationsAsString and return NULL in case both
source values are NULL, but I am not sure about the implications of such a fix.
> MarkupCache messed up when using MergedMarkup (e.g. for Page markup inheritance) together with IResourceStreams that do NOT also implement IFixedLocationResourceStream
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: WICKET-2764
> URL: https://issues.apache.org/jira/browse/WICKET-2764
> Project: Wicket
> Issue Type: Bug
> Components: wicket
> Affects Versions: 1.4.6
> Reporter: Christian Oldiges
> Priority: Minor
> Attachments: wicket2764.tgz
>
>
> For a project that requires markup reloading and a custom markup directory structure we have implemented a custom IResourceStreamLocator.
> This implementation creates instance of its own IResourceStream implementation which does NOT at the same time implement IFixedLocationResourceStream.
> This means there is no "locationAsString()" method implemented on the resource stream instances.
> Now the MarkupCache comes into the picture. It is using a cacheKey and the locationAsString as cache keys using a 2 step mechanism.
> cacheKey -> locationAsString
> locationAsString -> Markup
> Additionally MergedMarkup comes into play. MergedMarkup is a markup instance that merges a base markup with another markup.
> This is typically used for markup inheritance.
> BasePage.html implemented by BasePage
> PageA.html extends BasePage
> PageB.html extends BasePage
> MergedMarkup#locationAsString() concatenates the locationAsString values of its source markup/resource objects putting a ":" inbetween.
> This means it will NEVER be NULL, even if both source objects return NULL as their locationAsString values.
> Now, in case the original resource streams do not implement IFixedLocationResourceStream, this result in a locationAsString of "null:null".
> Unfortunately this is the case for ALL possible combinations of the source objects of MergedMarkup
> So the locationAsString is "null:null" for (BasePage,PageA) and also for (BasePage,PageB)
> Back to the MarkupCache#loadMarkup method.
> There is a check to use the cacheKey as a replacement for locationAsString in case its NULL.
> Now, if the Markup loaded is a MergedMarkup instance, it doesnt return NULL, but "null:null".
> So, putIntoCache() gets called with "null:null" as the key for ALL possible combinations resulting in a huge chaos of templates being merged together, when those cache entries are used later on.
> A workaround is to implement IFixedLocationResourceStream on our custom IResourceStream implementation.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
[jira] Resolved: (WICKET-2764) MarkupCache messed up when using
MergedMarkup (e.g. for Page markup inheritance) together with
IResourceStreams that do NOT also implement IFixedLocationResourceStream
Posted by "Juergen Donnerstag (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/jira/browse/WICKET-2764?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Juergen Donnerstag resolved WICKET-2764.
----------------------------------------
Resolution: Fixed
Fix Version/s: 1.5-M1
1.4.8
Assignee: Juergen Donnerstag
thanks
> MarkupCache messed up when using MergedMarkup (e.g. for Page markup inheritance) together with IResourceStreams that do NOT also implement IFixedLocationResourceStream
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: WICKET-2764
> URL: https://issues.apache.org/jira/browse/WICKET-2764
> Project: Wicket
> Issue Type: Bug
> Components: wicket
> Affects Versions: 1.4.6
> Reporter: Christian Oldiges
> Assignee: Juergen Donnerstag
> Priority: Minor
> Fix For: 1.4.8, 1.5-M1
>
> Attachments: wicket2764.tgz
>
>
> For a project that requires markup reloading and a custom markup directory structure we have implemented a custom IResourceStreamLocator.
> This implementation creates instance of its own IResourceStream implementation which does NOT at the same time implement IFixedLocationResourceStream.
> This means there is no "locationAsString()" method implemented on the resource stream instances.
> Now the MarkupCache comes into the picture. It is using a cacheKey and the locationAsString as cache keys using a 2 step mechanism.
> cacheKey -> locationAsString
> locationAsString -> Markup
> Additionally MergedMarkup comes into play. MergedMarkup is a markup instance that merges a base markup with another markup.
> This is typically used for markup inheritance.
> BasePage.html implemented by BasePage
> PageA.html extends BasePage
> PageB.html extends BasePage
> MergedMarkup#locationAsString() concatenates the locationAsString values of its source markup/resource objects putting a ":" inbetween.
> This means it will NEVER be NULL, even if both source objects return NULL as their locationAsString values.
> Now, in case the original resource streams do not implement IFixedLocationResourceStream, this result in a locationAsString of "null:null".
> Unfortunately this is the case for ALL possible combinations of the source objects of MergedMarkup
> So the locationAsString is "null:null" for (BasePage,PageA) and also for (BasePage,PageB)
> Back to the MarkupCache#loadMarkup method.
> There is a check to use the cacheKey as a replacement for locationAsString in case its NULL.
> Now, if the Markup loaded is a MergedMarkup instance, it doesnt return NULL, but "null:null".
> So, putIntoCache() gets called with "null:null" as the key for ALL possible combinations resulting in a huge chaos of templates being merged together, when those cache entries are used later on.
> A workaround is to implement IFixedLocationResourceStream on our custom IResourceStream implementation.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.