You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ms...@apache.org on 2012/03/07 22:10:10 UTC

svn commit: r1298120 - in /myfaces/trinidad/trunk: trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/ trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/ trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/w...

Author: mstarets
Date: Wed Mar  7 21:10:10 2012
New Revision: 1298120

URL: http://svn.apache.org/viewvc?rev=1298120&view=rev
Log:
TRINIDAD-2218 - Need an ability for the WindowManager implementation to be executed before all Configurators and filters and to complete teh response

Modified:
    myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/WindowManager.java
    myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/GlobalConfiguratorImpl.java
    myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/PseudoFacesContext.java
    myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/TrinidadFilterImpl.java

Modified: myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/WindowManager.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/WindowManager.java?rev=1298120&r1=1298119&r2=1298120&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/WindowManager.java (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/WindowManager.java Wed Mar  7 21:10:10 2012
@@ -85,4 +85,15 @@ abstract public class WindowManager
    * @throws IOException if an output exception occurs
    */
   public abstract void writeState(FacesContext context) throws IOException;
+  
+  /**
+   * Performs any necessary action at the very beginning of the request
+   * @param externalContext ExternalContext instance
+   * @return true if processing of the request should continue, false otherwise
+   */
+  public boolean beginRequest(ExternalContext externalContext) throws IOException
+  {
+    return true;
+  }
+
 }

Modified: myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/GlobalConfiguratorImpl.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/GlobalConfiguratorImpl.java?rev=1298120&r1=1298119&r2=1298120&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/GlobalConfiguratorImpl.java (original)
+++ myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/GlobalConfiguratorImpl.java Wed Mar  7 21:10:10 2012
@@ -18,6 +18,8 @@
  */
 package org.apache.myfaces.trinidadinternal.config;
 
+import java.io.IOException;
+
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
@@ -27,6 +29,7 @@ import java.util.concurrent.atomic.Atomi
 
 import java.util.concurrent.locks.ReentrantLock;
 
+import javax.faces.context.FacesContext;
 import javax.faces.context.ExternalContext;
 
 import javax.servlet.ServletRequest;
@@ -37,6 +40,7 @@ import org.apache.myfaces.trinidad.confi
 import org.apache.myfaces.trinidad.context.ExternalContextDecorator;
 import org.apache.myfaces.trinidad.context.RequestContext;
 import org.apache.myfaces.trinidad.context.RequestContextFactory;
+import org.apache.myfaces.trinidad.context.WindowManager;
 import org.apache.myfaces.trinidad.logging.TrinidadLogger;
 import org.apache.myfaces.trinidad.skin.SkinFactory;
 import org.apache.myfaces.trinidad.util.ClassLoaderUtils;
@@ -211,7 +215,19 @@ public final class GlobalConfiguratorImp
 
         if (state.get(_IN_REQUEST) == null)
         {
-          _startConfiguratorServiceRequest(ec);
+          // Allow WindowManager to perform some processing at the beginning of request and optionally complete the response
+          if (!Boolean.TRUE.equals(state.get(_CONFIGURATORS_ABORTED)))
+          {
+            if (_beginWindowManagerRequest(ec))
+            {
+              _startConfiguratorServiceRequest(ec);
+            }
+            else
+            {
+              FacesContext.getCurrentInstance().responseComplete();
+              state.put(_CONFIGURATORS_ABORTED, Boolean.TRUE);
+            }
+          }
         }
       }
       else
@@ -301,7 +317,7 @@ public final class GlobalConfiguratorImp
         {
           //Only end services at the end of a writable response.  This will
           //generally be RENDER, RESOURCE, and SERVLET.
-          if (ExternalContextUtils.isResponseWritable(ec))
+          if (ExternalContextUtils.isResponseWritable(ec) && !Boolean.TRUE.equals(state.get(_CONFIGURATORS_ABORTED)))
           {
             _endConfiguratorServiceRequest(ec);
           }
@@ -606,6 +622,23 @@ public final class GlobalConfiguratorImp
       }
     }
   }
+  
+  private boolean _beginWindowManagerRequest(ExternalContext ec)
+  {
+    WindowManager wm = RequestContext.getCurrentInstance().getWindowManager();
+    boolean cont = true;  
+    
+    try
+    {
+      cont = wm.beginRequest(ec);
+    }
+    catch(IOException e)
+    {
+      _LOG.severe(e);
+    }
+                        
+    return cont;                    
+  }
 
   static private boolean _isSetRequestBugPresent(ExternalContext ec)
   {
@@ -779,6 +812,9 @@ public final class GlobalConfiguratorImp
     GlobalConfiguratorImpl.class.getName() + ".REQUEST_CONTEXT";
   static private final String _REQUEST_TYPE =
     GlobalConfiguratorImpl.class.getName() + ".REQUEST_TYPE";
+  
+  static private final String _CONFIGURATORS_ABORTED =
+    GlobalConfiguratorImpl.class.getName() + ".CONFIGURATORS_ABORTED";
 
   static private class TestRequest
     extends ServletRequestWrapper

Modified: myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/PseudoFacesContext.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/PseudoFacesContext.java?rev=1298120&r1=1298119&r2=1298120&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/PseudoFacesContext.java (original)
+++ myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/PseudoFacesContext.java Wed Mar  7 21:10:10 2012
@@ -135,7 +135,7 @@ class PseudoFacesContext extends FacesCo
   @Override
   public boolean getResponseComplete()
   {
-    return false;
+    return _responseCompleted;
   }
 
   @Override
@@ -159,7 +159,7 @@ class PseudoFacesContext extends FacesCo
   @Override
   public void responseComplete()
   {
-    throw new UnsupportedOperationException();
+    _responseCompleted = true;    
   }
 
   @Override
@@ -238,4 +238,6 @@ class PseudoFacesContext extends FacesCo
   private final ExternalContext _external;
   private ELContext _elContext;
   private Application _application;
+  
+  private boolean _responseCompleted = false;
 }
\ No newline at end of file

Modified: myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/TrinidadFilterImpl.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/TrinidadFilterImpl.java?rev=1298120&r1=1298119&r2=1298120&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/TrinidadFilterImpl.java (original)
+++ myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/TrinidadFilterImpl.java Wed Mar  7 21:10:10 2012
@@ -173,6 +173,10 @@ public class TrinidadFilterImpl implemen
     GlobalConfiguratorImpl config = GlobalConfiguratorImpl.getInstance();
     config.beginRequest(externalContext);
     
+    // Allow Configurators to wrap response and request
+    request = (ServletRequest)externalContext.getRequest();
+    response = (ServletResponse)externalContext.getResponse();
+    
     String noJavaScript = request.getParameter(XhtmlConstants.NON_JS_BROWSER);
         
     // Wrap the request only for Non-javaScript browsers
@@ -190,13 +194,19 @@ public class TrinidadFilterImpl implemen
       FileUploadConfiguratorImpl.apply(externalContext);
       request = new UploadRequestWrapper((HttpServletRequest)request, addedParams);
     }
+    
+    boolean responseComplete = facesContext.getResponseComplete();
 
     // release the PseudoFacesContext, since _doFilterImpl() has its own FacesContext
     facesContext.release();
 
     try
     {
-      _doFilterImpl(request, response, chain);
+      // Abort processing if the response has been completed by Configurator
+      if (!responseComplete)
+      {
+        _doFilterImpl(request, response, chain);
+      }
     }
     // For PPR errors, handle the request specially
     catch (Throwable t)
@@ -246,7 +256,7 @@ public class TrinidadFilterImpl implemen
     ServletRequest  request,
     ServletResponse response,
     FilterChain     chain) throws IOException, ServletException
-  {
+  { 
     // -= Scott O'Bryan =-
     // Added for backward compatibility
     // potentially wrap the ServletContext to check ManagerBean HA