Kito,
In case Neil didn't get back to you directly ... the problem is related to the fact that the Bridge RI works around a servlet dependency in the JSF 1.2 RI (prior to the 1.2_13) in resolving the viewId by setting the servlet include path attributes. Unfortunately, Liferay also rights these attributes with its own internal rep (that has invoke in it). This causes your problems. Neil has posted patches/suggested fixes to the bridge (basically code to disable the bridge from writing these attributes if running a version of Faces that doesn't contain this servlet dependency) + you would need to pick up the 1.2_13 version of Moharra. Watch this space for an official fix for PORTLETBRIDGE-77 which will be your signal I have checked a fix for the bridge into the trunk.
    -Mike-

Kito Mann wrote:
I'm testing out the latest snapshot of the 1.0 portlet bridge with Mojarra 1.2_10 and Liferay 5.2, and I noticed some peculiar behavior -- the app is expecting the file "invoke.jspx" regardless of which view I've configured for GenericFacesPortlet. It turns out that Liferay for some reason appends "/invoke" to the path when it dispatches a request for the portlet regardless of the mode:

        String path =
                StringPool.SLASH + _portletConfigImpl.getPortletName() +
                    "/invoke";

            RequestDispatcher requestDispatcher =
_portletContextImpl.getServletContext().getRequestDispatcher(
                    path);

HttpServletRequest request = portletRequest.getHttpServletRequest();
            HttpServletResponse response =
                portletResponse.getHttpServletResponse();

...
                    requestDispatcher.include(request, response);

As far as I can tell, this is questionable behavior and is probably a Liferay bug. However, it does bring up an interesting scenario for the bridge. When Mojarra tries to determine the viewId in RestoreViewPhase, it grabs it from the servlet path info:

   public void execute(FacesContext facesContext) throws FacesException {

...
        UIViewRoot viewRoot = facesContext.getViewRoot();
        if (viewRoot != null) {
...
            return;
        }

Map requestMap = facesContext.getExternalContext().getRequestMap();
        String viewId = (String)
              requestMap.get("javax.servlet.include.path_info");
        if (viewId == null) {
viewId = facesContext.getExternalContext().getRequestPathInfo();
        }

        if (viewId == null) {
            viewId = (String)
                  requestMap.get("javax.servlet.include.servlet_path");
        }
...
}

Since Liferay has sent along the "/invoke" path, Mojarra picks it up from the "javax.servlet.include.path_info" attribute, so the the bridge never has a chance to pick out the viewId itself (PortletViewHandler.createViewHandler() uses the viewId already set by Mojarra). Consequently, the app tries to display "/invoke.jspx".

So, the question is this: in the case where a path is specified for the initial render by the container, should the bridge overwrite this atribute so that Mojarra will pick the correct view, or should we assume that the portlet container won't send a path to begin with?

From what I can tell, other bridges used with Liferay automatically pick the default view for a particualr mode, so they ignore this path altogether.

Thoughts?



---
Kito D. Mann -- Author, JavaServer Faces in Action
http://twitter.com/kito99  http://twitter.com/jsfcentral
http://www.virtua.com - JSF/Java EE consulting, training, and mentoring
http://www.JSFCentral.com - JavaServer Faces FAQ, news, and info
+1 203-404-4848 x3

Reply via email to