Hi, 
I got finally into PageLabels that are implemented in portal block in cocoon 
2.1.6 and documented at http://wiki.apache.org/cocoon/PortalPageLabels.

Ralf Goers wrote on 
http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=110191154925434&w=2:
> >Main issue I see in implementing CachingPortletAdapter is 
> "link translation".
> > 1.) links that are sent to browser are valid only for the 
> next request
> > 2.) translated links are part of generated content
> > 3.) portlet content cannot be cached since its links will 
> not be valid after next request
> >  
> >
> If you use PageLabels the above is not true.  Events are valid until 
> they are regenerated on the next request to that page label.

It is not exactly so. Lifecycle of links when using PageLabels is very simmilar 
to that in the original DefaultEventConverter. They are genereated and stored 
to ENCODE hashmap in the coplet generation phase and live until the portal tab 
page is generated again. Links are preserved ONLY when switching form one 
tagged page to another tagged page.

Therefore I refine my statements of issues for implementing 
CachingPortletAdapter (using PageLabels):
1.) links that are sent to browser are valid only for the next request (unless 
the tagged page is switched)
2.) translated links are part of generated content
3.) portlet content cannot be cached since its links will not be valid after 
next request to the same tagged page

I have CachingPortletAdapter finished, but I must solve the problem with links 
to make it working. 

I see these possibilities:
A.) invert the responsibility and let the coplets to maintain lifecycle of 
their events/links

 - coplet will add the event to store (EventConverter) on content generation
 - coplet will remember its own list of its events
 - coplet will remove its remembered old events from the store when 
regenerating or removing (logout)
 - EventConverter will not remove events

B.) enhance PageLabelEventConverter and add name of coplet instance to key for 
events store

 - currently only page tab name is used for pageLabel parameter i.e. 
portal?pageLabel=Gallery&cocoon-portal-event=3
 - after adding coplet instance name the link would look like this 
portal?pageLabel=Gallery.Gallery-Viewer&cocoon-portal-event=3
 - new events for one coplet now don't replace old events for another coplet on 
the same page

C.) add compare method to event interface
 - before new event is stored to events store compare new event with old events 
whether "same" event not already present in the store
 - if same event is found between old events it will be returned instead of new 
on and the link will stay the same (index to store does not change)
 - gradually all links from portal are stored in the events store but there is 
no duplicate and the indexes to events are preserved between requests

D.) name one :)

I find the
case A.) is little bit harder to implement but it was my first thought :-)
case B.) is nice and clean way how to prevent that events for cached portlet 
without focus will not be overriden by currently focused coplet
case C.) is only one that also allows the browser back button to work properly 
because repeated http requests will invoke same action as the event will be 
still alive in the store. Of course, internal coplet states are not taken into 
account. This simplified view solves only situation when coplet state is 
maintained exclusivelly through request parameters.

I would like to know, if anyone has any preference to one or other solution. 
Also all cases can have some issues that am not aware of and I would be happy 
if you could also point them out.

Thank you,
Michal

Reply via email to