Responsible for rendering out a page; a Portlet render URL is built during action processing that
stores the active page; this is the page that will be rendered. The render service is (typically)
the only service that operates during a portlet RenderRequest. All other services will be an
ActionRequest that (via
PortletResponseRenderer
, writes
query parameters to activate this service during the render request.
Problematic is is anything related to the portlet mode or window state. As per the Portlet spec,
when the user clicks the "help" or "edit" buttons (or the minimize, maximize, etc.), this causes
a new RenderRequest, but explicitly keeps the render parameters set by the most recent
ActionRequest. But what Tapestry needs is to detect that the mode or state has changed and select
a different page to render the response. So we store the mode and state in effect when the
ActionRequest executed as two more query parameters, and detect changes to mode and state that
way. If there is a change, then we ignore the page query parameter and use the
PortletPageResolver
to figure out the correct page to display instead.