You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by mf...@apache.org on 2010/07/29 17:42:58 UTC
svn commit: r980479 - in
/myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces:
bridge/BridgeImpl.java context/PortletExternalContextImpl.java
Author: mfreedman
Date: Thu Jul 29 15:42:58 2010
New Revision: 980479
URL: http://svn.apache.org/viewvc?rev=980479&view=rev
Log:
PORTLETBRIDGE-158: Portlet 2.0 Bridge event redirect doesn't work because scope isn't cleared
PORTLETBRIDGE-157: NullPointerException from Bridge encodeActionUrl when use portlet: syntax
PORTLETBRIDGE-156: Encoding Public render parameters in a render redirect done incorrectly if url already action encoded
Modified:
myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/bridge/BridgeImpl.java
myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/context/PortletExternalContextImpl.java
Modified: myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/bridge/BridgeImpl.java
URL: http://svn.apache.org/viewvc/myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/bridge/BridgeImpl.java?rev=980479&r1=980478&r2=980479&view=diff
==============================================================================
--- myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/bridge/BridgeImpl.java (original)
+++ myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/bridge/BridgeImpl.java Thu Jul 29 15:42:58 2010
@@ -470,7 +470,7 @@ public class BridgeImpl
if (mEventHandler == null)
{
// make sure the render parameters are carried forward into the next request
- response.setRenderParameters(request.getParameterMap());
+ response.setRenderParameters(request);
// TODO: maybe log something here?
return;
}
@@ -516,7 +516,7 @@ public class BridgeImpl
List<String> preExistingAttributes = getRequestAttributes(request);
// Make sure that at a minimum the current render parameters are carried forward
- response.setRenderParameters(request.getParameterMap());
+ response.setRenderParameters(request);
FacesContext context = null;
Lifecycle lifecycle = null;
@@ -534,6 +534,7 @@ public class BridgeImpl
}
}
boolean restoredScope = false;
+ boolean removeScope = false;
restoredScope = restoreBridgeRequestScopeData(request, scopeId);
@@ -568,11 +569,23 @@ public class BridgeImpl
EventNavigationResult result = mEventHandler.handleEvent(context, request.getEvent());
// If redirected either during lifecycle or event handling merely return as new target is already encoded in response.
- if (context.getResponseComplete()) return;
+ if (context.getResponseComplete())
+ {
+ // clear scopeid render parameter
+ removeScope = true;
+ return;
+ }
if (result != null)
{
context.getApplication().getNavigationHandler().handleNavigation(context, result.getFromAction(), result.getOutcome());
+ // the navigation rule might indicate a redirect
+ if (context.getResponseComplete())
+ {
+ // clear scopeid render parameter
+ removeScope = true;
+ return;
+ }
}
finalizeActionResponse(context);
@@ -616,6 +629,10 @@ public class BridgeImpl
// RequestScope.
saveBridgeRequestScopeData(context, scopeId, preExistingAttributes);
}
+ else
+ {
+ removeScope = true;
+ }
}
catch (Exception e)
@@ -629,7 +646,14 @@ public class BridgeImpl
}
finally
{
+ if (removeScope)
+ {
+ // Because we automatically copy forward all render parameters when the scope is not carried forward we must clear its param
+ removeRequestScopes(scopeId);
+ }
+
dumpScopeId(scopeId, "EVENT_PHASE");
+
if (lifecycle != null)
{
lifecycle.removePhaseListener(this);
Modified: myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/context/PortletExternalContextImpl.java
URL: http://svn.apache.org/viewvc/myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/context/PortletExternalContextImpl.java?rev=980479&r1=980478&r2=980479&view=diff
==============================================================================
--- myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/context/PortletExternalContextImpl.java (original)
+++ myfaces/portlet-bridge/core/trunk_2.0.x/impl/src/main/java/org/apache/myfaces/portlet/faces/context/PortletExternalContextImpl.java Thu Jul 29 15:42:58 2010
@@ -326,7 +326,7 @@ public class PortletExternalContextImpl
// the current render params
queryStr.removeParameter(Bridge.FACES_VIEW_ID_PARAMETER);
}
- else if (s != null && s1.equals(Bridge.FACES_USE_CURRENT_VIEW_PARAMETER))
+ else if (s1 != null && s1.equals(Bridge.FACES_USE_CURRENT_VIEW_PARAMETER))
{
isPortletURLSelfReference = true;
// by removing the parameter we will rely on retaining the current view info based on \
@@ -625,36 +625,19 @@ public class PortletExternalContextImpl
throws IOException
{
// As this doesn't go back to the consumer -- we need to reencode the public render parameters so they are there
- redirectPortletView(encodePublicRenderParameters(url), true);
+ redirectPortletView(url, true);
}
- private String encodePublicRenderParameters(String inUrl)
+ private void encodeRenderRedirectPublicRenderParameters(QueryString queryStr)
{
// If there are no Public Render Parameters just return the inUrl
Map<String, String[]> m = mPortletRequest.getPublicParameterMap();
if (m == null || m.isEmpty())
{
- return inUrl;
- }
-
- // Otherwise -- there are public render parameters that need to be encoded
- StringBuffer outUrl = null;
- QueryString queryStr = null;
- int queryStart = inUrl.indexOf('?');
-
- if (queryStart != -1)
- {
- // Get the query string
- queryStr = new QueryString(inUrl.substring(queryStart + 1), "UTF8");
- outUrl = new StringBuffer(inUrl.substring(0, queryStart));
- }
- else
- {
- outUrl = new StringBuffer(inUrl);
- // construct an empty queryString to hold the viewId
- queryStr = new QueryString("UTF8");
+ return;
}
+ // Otherwise -- there are public render parameters that need to be encoded
for (Map.Entry<String, String[]> entry:m.entrySet())
{
String key = entry.getKey();
@@ -668,7 +651,6 @@ public class PortletExternalContextImpl
}
}
}
- return outUrl.append("?").append(queryStr.toString()).toString();
}
private void redirectPortletView(String url, boolean isRenderPhase)
@@ -695,6 +677,11 @@ public class PortletExternalContextImpl
// a request attribute, keyed with the generated URL. If this generated
// url is passed to redirect() we can get the original url back and
// process based on it.
+
+ if (isRenderPhase)
+ {
+ encodeRenderRedirectPublicRenderParameters(params);
+ }
getRequestMap().put(BridgeImpl.REDIRECT_VIEWPARAMS, params);
FacesContext.getCurrentInstance().responseComplete();