[ 
https://issues.apache.org/jira/browse/PLUTO-557?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Ate Douma resolved PLUTO-557.
-----------------------------

    Resolution: Fixed

Committed

> Fixing the RequestDispatcher implementation to be more web container generic 
> and pluggable through a Service
> ------------------------------------------------------------------------------------------------------------
>
>                 Key: PLUTO-557
>                 URL: https://issues.apache.org/jira/browse/PLUTO-557
>             Project: Pluto
>          Issue Type: Bug
>          Components: portlet container
>    Affects Versions: 2.0.0
>         Environment: Tomcat 5/6, Websphere 6.1
>            Reporter: Ate Douma
>            Assignee: Ate Douma
>            Priority: Critical
>             Fix For: 2.0.0
>
>
> The requirements of the new portlet 2.0 specification with respect to portlet 
> request dispatching is one area where complexity has grown massively. 
> Especially the new support for forwarding, *even* from a RenderRequest, which 
> requires the portlet container to "fake" the dispatch state as a forward 
> while internally it must use an include, is very difficult to implement 
> generically.
> The current implementation as I wrote some months ago uses a solution by 
> interpreting the expected dispatch state *upfront*, before doing the actual 
> dispatch, and then use that state internally to present to the invoked 
> Servlet (RequestDispatcherPathInfo).
> This solution however now turned out to be "not good enough"...
> While the Portlet 2.0 TCK is a great help of validating our container 
> implementation, in certain areas it only goes about "1 inch deep".
> So, while the current implementation passes the TCK, its not difficult to 
> come up with practical use-cases which break the implementation flat out :(
> One specific conveniently "ignored" servlet api usage in the TCK is using a 
> ServletContext.getRequestDispatcher(path) from within a dispatched Servlet. 
> While there are a few (minor) descriptions in JSR-286 how the dispatcher 
> state should be managed and what is allowed and not, the TCK *only* tests 
> using a ServletRequest.getRequestDispatcher(path)...
> The real problem of using the ServletContext.getRequestDispatcher is that the 
> portlet container handling will not, *and can not*, be aware of that as the 
> servlet api provides no means to intercept or wrap such usage! 
> Another very important limitation of the current implementation is that it 
> turned out to be very Tomcat specific!
> For instance, the "detection" if a dispatched request is further dispatched 
> (nested) currently depends on how Tomcat deals with that.
> Tomcat always "injects" another Tomcat specific RequestHandler *above* the 
> current request wrapper to handle nested dispatch specific state (like merged 
> query string parameters on the parameter map and include/forward specific 
> request path attributes).
> The current implementation checks if the getRequest() of the current request 
> is changed, and if so rebuilds its internal parameterMap cache.  
> However, while testing Pluto (or actually Jetspeed using Pluto) on Websphere 
> 6.1, this turned out to be not working at all. 
> Websphere (and like Jetty I thereafter discovered) dynamically update its 
> initial RequestHandler instead.
> To cut a long story short: the current implementation is both broken and too 
> much (Tomcat) web container specific.
> However, I've been working on an alternative solution during the last week 
> which is much more generic and capable of handling much more use-cases (but 
> not all: that will *never* be possible because of spec limitations).
> This new solution no longer tries to interpret expected dispatch state 
> *upfront*, but instead *derives* this during/after a dispatch, including 
> nested dispatch and ServletContext.getRequestDispatcher invocations.
> This solution no longer needs the servlet url mapping from web.xml as used by 
> the current implementation (only), which means that part of the OM loading 
> can be dropped again and removed from the pluto container api as well!
> I have tested this against both Tomcat 5/6 and Websphere 6.1 successfully, 
> which includes the TCK tests and several other real usage test-cases. 
> One downside of the new implementation is that it requires somewhat more 
> runtime overhead, as it for instance requires comparing all (10) dispatch 
> path attributes on the current request with a previously cached copy on each 
> request attribute read access (for these attributes).  
> However, I'm already working on a "adaptive" algorithm to automatically 
> detect at runtime if a much more optimal nested dispatch detection as we used 
> for Tomcat may be used too. If true, the implementation then can "switch" to 
> using that detection mechanism instead.
> All the above however makes clear that we're dealing with a very tricky part 
> of the portlet spec which might or might not work on other web containers 
> than has been tested against Tomcat/Websphere so far.
> For that reason, I'm also reworking the current implementation towards a new 
> container RequestDispatcherService to make it pluggable and extendable.
> The RequestDispatcherService rewrite already is mostly done, the "adaptive" 
> nested dispatch detection is still in the works but should be completed 
> pretty soon. When both are finished, I'll replace the current broken 
> implementation with this new solution ASAP.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to