Sébastien Deleuze created PLUTO-641:
---------------------------------------

             Summary: Empty Portlet when using the forward to include fallback 
mechanism
                 Key: PLUTO-641
                 URL: https://issues.apache.org/jira/browse/PLUTO-641
             Project: Pluto
          Issue Type: Bug
          Components: portlet container
    Affects Versions: 2.0.3
            Reporter: Sébastien Deleuze


While working on the [SPR-12374|https://jira.spring.io/browse/SPR-12374] Spring 
bug report, I may have find a bug in the forward to include fallback mechanism 
of Apache Pluto.

In 
{{[PortletRequestDispatcherImpl#forward()|http://svn.apache.org/viewvc/portals/pluto/tags/pluto-2.0.3/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletRequestDispatcherImpl.java?view=markup#l245]}},
 {{req.setNestedForward()}} is called whether forwarding is possible or not, so 
even if {{requestDispatcher.include(request, response)}} is called, the 
{{forwarded}} attribute is set to {{true}}.

As a consequence, in 
{{[HttpServletPortletRequestWrapper#setupFirstDispatchPathValues()|http://svn.apache.org/viewvc/portals/pluto/tags/pluto-2.0.3/pluto-container/src/main/java/org/apache/pluto/container/impl/HttpServletPortletRequestWrapper.java?view=markup#l741]}},
 the forward request attributes are used instead of the include ones, and the 
JSP is never rendered.

In order to fix that, my proposal (untested) would be modify the 
{{PortletRequestDispatcherImpl#forward()}} implementation to:

{code:java}
public void forward(ServletRequest request, ServletResponse response) throws 
ServletException, IOException
{
        HttpServletPortletRequestWrapper req = getWrappedRequest(request);
        HttpServletPortletResponseWrapper res = getWrappedResponse(response);
        res.resetBuffer();

        // cache the current dispatch state
        boolean forwarded = req.isForwarded();
        boolean namedDispatch = req.isNamedDispatch();
        Map<String,Object> pathAttributeValues = req.getPathAttributeValues();
        HttpServletPortletRequestWrapper.PathMethodValues pathMethodValues = 
req.getInitPathMethodValues();

        if (req.isForwardingPossible())
        {
                // (re)initialize the request wrapper to a nested forward
                req.setNestedForward();
                try
                {
                        requestDispatcher.forward(request, response);           
                }
                finally
                {
                        // restore the previously cached dispatch state
                        req.restoreFromNestedForward(forwarded, namedDispatch, 
pathMethodValues, pathAttributeValues);
                }
        }
        else
        {
                // need to "fake" the forward using an include
                requestDispatcher.include(request, response);
        }
}
{code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to