You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2009/10/03 02:24:54 UTC

svn commit: r821206 - in /myfaces/core/trunk: api/src/main/javascript/META-INF/resources/myfaces/_impl/xhrCore/ impl/src/main/java/org/apache/myfaces/application/ impl/src/main/java/org/apache/myfaces/context/servlet/

Author: lu4242
Date: Sat Oct  3 00:24:53 2009
New Revision: 821206

URL: http://svn.apache.org/viewvc?rev=821206&view=rev
Log:
MYFACES-2116 TODO 65: Partial View Lifecycle and MYFACES-2330 Get "basic-ajax" 2.0 sample app working (fix ajax redirect case)

Modified:
    myfaces/core/trunk/api/src/main/javascript/META-INF/resources/myfaces/_impl/xhrCore/_AjaxResponse.js
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/servlet/PartialViewContextImpl.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/servlet/ServletExternalContextImpl.java

Modified: myfaces/core/trunk/api/src/main/javascript/META-INF/resources/myfaces/_impl/xhrCore/_AjaxResponse.js
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/api/src/main/javascript/META-INF/resources/myfaces/_impl/xhrCore/_AjaxResponse.js?rev=821206&r1=821205&r2=821206&view=diff
==============================================================================
--- myfaces/core/trunk/api/src/main/javascript/META-INF/resources/myfaces/_impl/xhrCore/_AjaxResponse.js (original)
+++ myfaces/core/trunk/api/src/main/javascript/META-INF/resources/myfaces/_impl/xhrCore/_AjaxResponse.js Sat Oct  3 00:24:53 2009
@@ -36,6 +36,7 @@
     /*partial response types*/
     myfaces._impl.xhrCore._AjaxResponse.prototype._RESPONSE_PARTIAL         = "partial-response";
     myfaces._impl.xhrCore._AjaxResponse.prototype._RESPONSETYPE_ERROR       = "error";
+    /*TODO: -=Leonardo Uribe=- Does this response type really exists? really from server comes a partial-response with redirect command*/
     myfaces._impl.xhrCore._AjaxResponse.prototype._RESPONSETYPE_REDIRECT    = "redirect";
     myfaces._impl.xhrCore._AjaxResponse.prototype._RESPONSETYPE_REDIRECT    = "changes";
 
@@ -48,7 +49,7 @@
     myfaces._impl.xhrCore._AjaxResponse.prototype._PCMD_ERROR       = "error";
     myfaces._impl.xhrCore._AjaxResponse.prototype._PCMD_ATTRIBUTES  = "attributes";
     myfaces._impl.xhrCore._AjaxResponse.prototype._PCMD_EXTENSION   = "extension";
-
+    myfaces._impl.xhrCore._AjaxResponse.prototype._PCMD_REDIRECT    = "redirect"
     /**
      * uses response to start Html element replacement
      *

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java?rev=821206&r1=821205&r2=821206&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java Sat Oct  3 00:24:53 2009
@@ -38,6 +38,7 @@
 import javax.faces.component.UIViewRoot;
 import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
+import javax.faces.context.PartialViewContext;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -89,7 +90,20 @@
                 
                 ExternalContext externalContext = facesContext.getExternalContext();
                 ViewHandler viewHandler = facesContext.getApplication().getViewHandler();
-                String redirectPath = viewHandler.getActionURL(facesContext, navigationCase.getToViewId(facesContext));
+                String toViewId = navigationCase.getToViewId(facesContext);
+                String redirectPath = viewHandler.getActionURL(facesContext, toViewId );
+                
+                // JSF 2.0 the javadoc of handleNavigation() says something like this 
+                // "...If the view has changed after an application action, call
+                // PartialViewContext.setRenderAll(true)...". The effect is that ajax requests
+                // are included on navigation.
+                PartialViewContext partialViewContext = facesContext.getPartialViewContext();
+                if ( partialViewContext.isPartialRequest() && 
+                     !partialViewContext.isRenderAll() && 
+                     !facesContext.getViewRoot().getViewId().equals(toViewId))
+                {
+                    partialViewContext.setRenderAll(true);
+                }
                 
                 // JSF 2.0 Spec call Flash.setRedirect(true) to notify Flash scope and take proper actions
                 externalContext.getFlash().setRedirect(true);
@@ -107,6 +121,18 @@
                 ViewHandler viewHandler = facesContext.getApplication().getViewHandler();
                 //create new view
                 String newViewId = navigationCase.getToViewId(facesContext);
+                // JSF 2.0 the javadoc of handleNavigation() says something like this 
+                // "...If the view has changed after an application action, call
+                // PartialViewContext.setRenderAll(true)...". The effect is that ajax requests
+                // are included on navigation.
+                PartialViewContext partialViewContext = facesContext.getPartialViewContext();
+                if ( partialViewContext.isPartialRequest() && 
+                     !partialViewContext.isRenderAll() && 
+                     !facesContext.getViewRoot().getViewId().equals(newViewId))
+                {
+                    partialViewContext.setRenderAll(true);
+                }
+                
                 UIViewRoot viewRoot = viewHandler.createView(facesContext, newViewId);
                 facesContext.setViewRoot(viewRoot);
                 facesContext.renderResponse();

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/servlet/PartialViewContextImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/servlet/PartialViewContextImpl.java?rev=821206&r1=821205&r2=821206&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/servlet/PartialViewContextImpl.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/servlet/PartialViewContextImpl.java Sat Oct  3 00:24:53 2009
@@ -22,10 +22,13 @@
 import java.util.*;
 
 
+import javax.faces.FactoryFinder;
 import javax.faces.context.FacesContext;
 import javax.faces.context.PartialResponseWriter;
 import javax.faces.context.PartialViewContext;
 import javax.faces.event.PhaseId;
+import javax.faces.render.RenderKit;
+import javax.faces.render.RenderKitFactory;
 import javax.faces.component.visit.VisitContext;
 import javax.faces.component.visit.VisitHint;
 import javax.faces.component.visit.VisitCallback;
@@ -34,6 +37,8 @@
 
 import javax.faces.context.ExternalContext;
 import javax.faces.context.ResponseWriter;
+import javax.servlet.http.HttpServletRequest;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.myfaces.shared_impl.util.StringUtils;
@@ -54,6 +59,7 @@
     // Values that need to be saved because exists a setXX method 
     private Boolean _partialRequest = null;
     private Boolean _renderAll = null;
+    private PartialResponseWriter _partialResponseWriter = null;
 
     public PartialViewContextImpl(FacesContext context) {
         _facesContext = context;
@@ -218,9 +224,38 @@
     @Override
     public PartialResponseWriter getPartialResponseWriter() {
         assertNotReleased();
-        //TODO: JSF 2.0, add impl
-
-        return new PartialResponseWriter(_facesContext.getResponseWriter());
+        
+        if (_partialResponseWriter == null)
+        {
+            ResponseWriter responseWriter = _facesContext.getResponseWriter();
+            if (responseWriter == null)
+            {
+                // This case happens when getPartialResponseWriter() is called before
+                // render phase, like in ExternalContext.redirect(). We have to create a
+                // ResponseWriter from the RenderKit and then wrap if necessary. 
+                try
+                {
+                    responseWriter = _facesContext.getRenderKit().createResponseWriter(
+                            _facesContext.getExternalContext().getResponseOutputWriter(), "text/xml",
+                            _facesContext.getExternalContext().getRequestCharacterEncoding());
+                }
+                catch (IOException e)
+                {
+                    throw new IllegalStateException("Cannot create Partial Response Writer",e);
+                }
+            }
+            // It is possible that the RenderKit return a PartialResponseWriter instance when 
+            // createResponseWriter,  so we should cast here for it and prevent double wrapping.
+            if (responseWriter instanceof PartialResponseWriter)
+            {
+                _partialResponseWriter = (PartialResponseWriter) responseWriter;
+            }
+            else
+            {
+                _partialResponseWriter = new PartialResponseWriter(responseWriter);
+            }
+        }
+        return _partialResponseWriter;
     }
 
     /**

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/servlet/ServletExternalContextImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/servlet/ServletExternalContextImpl.java?rev=821206&r1=821205&r2=821206&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/servlet/ServletExternalContextImpl.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/servlet/ServletExternalContextImpl.java Sat Oct  3 00:24:53 2009
@@ -21,8 +21,8 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.io.Writer;
 import java.io.UnsupportedEncodingException;
+import java.io.Writer;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLEncoder;
@@ -39,6 +39,8 @@
 import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
 import javax.faces.context.Flash;
+import javax.faces.context.PartialResponseWriter;
+import javax.faces.context.PartialViewContext;
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
@@ -49,11 +51,12 @@
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.myfaces.context.ReleaseableExternalContext;
 import org.apache.myfaces.context.flash.FlashImpl;
+import org.apache.myfaces.shared_impl.renderkit.html.HtmlResponseWriterImpl;
 import org.apache.myfaces.util.EnumerationIterator;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 
 /**
  * Implements the external context for servlet request. JSF 1.2, 6.1.3
@@ -536,10 +539,23 @@
     @Override
     public void redirect(final String url) throws IOException
     {
-        if (_servletResponse instanceof HttpServletResponse)
+        FacesContext facesContext = FacesContext.getCurrentInstance();
+        PartialViewContext partialViewContext = facesContext.getPartialViewContext(); 
+        if (partialViewContext.isPartialRequest())
+        {
+            PartialResponseWriter writer = partialViewContext.getPartialResponseWriter();
+            this.setResponseContentType("text/xml");
+            this.setResponseCharacterEncoding("UTF-8");
+            this.addResponseHeader("Cache-control", "no-cache");
+            writer.startDocument();
+            writer.redirect(url);
+            writer.endDocument();
+            facesContext.responseComplete();
+        }
+        else if (_servletResponse instanceof HttpServletResponse)
         {
             ((HttpServletResponse) _servletResponse).sendRedirect(url);
-            FacesContext.getCurrentInstance().responseComplete();
+            facesContext.responseComplete();
         }
         else
         {