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();