Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
1.0
-
None
-
None
-
Sun JSF Reference Implementation version 1.2 (jsf-impl.jar)
Websphere portlet container version 6.1.0
Apache MyFaces JSF portal bridge version 1.0 (portals-bridges-jsf-1.0.jar)
Description
I evaluating the MyFaces portlet bridge with a sample JSF portal app and I ran into a problem. The portlet worked with the Sun portlet bridge, but does not even complete the render phase when I try to use the MyFaces portlet bridge.
The exception I am seeing is:
javax.servlet.ServletException: only absolute URLs or full path URIs are allowed
Caused by: java.lang.IllegalArgumentException: only absolute URLs or full path URIs are allowed
at com.ibm.ws.portletcontainer.core.impl.PortletResponseImpl.encodeURL(PortletResponseImpl.java:143)
at org.apache.portals.bridges.jsf.PortletExternalContextImpl.encodeActionURL(PortletExternalContextImpl.java)
I hooked up a remote debugger to see what was happening. The String URL that is passed into PortletExternalContextImpl is: pa.do?_pa=-1088437171&_rid=-507a2aba:10f977651ed:-7fee&.pa=true
As you can see the URL is already encoded and the encodeActionURL( String ) method attempts to call this.portletResponse.encodeURL(s). The PortletResponse tries to encode the string URL again, leading to the Exception.
I tracked down the difference in Sun's version of ExternalContextImpl. I found a Sun portlet bridge bug # 6243708 that addresses the same problem of double encoding the value from the portlet environment. The Sun portlet bridge fixed this bug in their com.sun.faces.portlet.ExternalContextImpl.encodeActionURL( String ) method to return the string url instead of attempting to encode it again.
I suggest that the PortletExternalContextImpl will always get portal encoded URL strings, and should return the string passed to it to avoid this Exceptional case.