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
{