You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ba...@apache.org on 2007/01/09 14:44:10 UTC

svn commit: r494409 - in /myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces: application/jsp/JspViewHandlerImpl.java application/jsp/ViewResponseWrapper.java context/servlet/FacesContextImpl.java taglib/core/ViewTag.java

Author: baranda
Date: Tue Jan  9 05:44:08 2007
New Revision: 494409

URL: http://svn.apache.org/viewvc?view=rev&rev=494409
Log:
JspViewHandlerImpl now working an rendering output to the page. Created wrapper for the response, so the rendered code can be mixed with other code. Flushing when the view tag is started

Modified:
    myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/application/jsp/JspViewHandlerImpl.java
    myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/application/jsp/ViewResponseWrapper.java
    myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/context/servlet/FacesContextImpl.java
    myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/taglib/core/ViewTag.java

Modified: myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/application/jsp/JspViewHandlerImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/application/jsp/JspViewHandlerImpl.java?view=diff&rev=494409&r1=494408&r2=494409
==============================================================================
--- myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/application/jsp/JspViewHandlerImpl.java (original)
+++ myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/application/jsp/JspViewHandlerImpl.java Tue Jan  9 05:44:08 2007
@@ -17,7 +17,6 @@
 
 import java.io.IOException;
 import java.io.StringWriter;
-import java.io.Writer;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
@@ -26,8 +25,6 @@
 import javax.faces.FactoryFinder;
 import javax.faces.application.Application;
 import javax.faces.application.ViewHandler;
-import javax.faces.application.StateManager;
-import javax.faces.application.ViewHandlerWrapper;
 import javax.faces.component.UIViewRoot;
 import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
@@ -36,14 +33,11 @@
 import javax.faces.render.RenderKit;
 import javax.portlet.PortletURL;
 import javax.portlet.RenderResponse;
-import javax.portlet.PortletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.ServletRequest;
 import javax.servlet.jsp.jstl.core.Config;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-import javax.servlet.http.HttpServletResponseWrapper;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -256,15 +250,15 @@
                        Config.FMT_LOCALE,
                        facesContext.getViewRoot().getLocale());
 
-        ViewResponseWrapper wrapped = new ViewResponseWrapper((HttpServletResponse)response);
+        ViewResponseWrapper wrappedResponse = new ViewResponseWrapper((HttpServletResponse)response);
 
-        externalContext.setResponse(wrapped);
+        externalContext.setResponse(wrappedResponse);
         externalContext.dispatch(viewId);
         externalContext.setResponse(response);
 
-        boolean errorResponse = wrapped.getStatus() < 200 || wrapped.getStatus() > 299;
+        boolean errorResponse = wrappedResponse.getStatus() < 200 || wrappedResponse.getStatus() > 299;
         if (errorResponse) {
-            wrapped.flushToWrappedResponse();
+            wrappedResponse.flushToWrappedResponse();
         }
         
         /*
@@ -282,7 +276,7 @@
         RenderKitFactory renderFactory = (RenderKitFactory) FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
         RenderKit renderKit = renderFactory.getRenderKit(facesContext, viewToRender.getRenderKitId());
 
-        ResponseWriter responseWriter;
+        ResponseWriter newResponseWriter;
         StringWriter enclosedWriter = new StringWriter();
 
         // If the FacesContext has a non-null ResponseWriter create a new writer using its
@@ -291,35 +285,44 @@
         ResponseWriter oldResponseWriter = facesContext.getResponseWriter();
         if (oldResponseWriter != null)
         {
-            responseWriter = oldResponseWriter.cloneWithWriter(enclosedWriter);
+            newResponseWriter = oldResponseWriter.cloneWithWriter(enclosedWriter);
         }
         else
         {
             if (log.isTraceEnabled()) log.trace("Creating new ResponseWriter");
             
-            responseWriter = renderKit.createResponseWriter(enclosedWriter, null,
+            newResponseWriter = renderKit.createResponseWriter(enclosedWriter, null,
                     ((HttpServletRequest) externalContext.getRequest()).getCharacterEncoding());
         }
 
         // Set the new ResponseWriter into the FacesContext, saving the old one aside.
-        facesContext.setResponseWriter(responseWriter);
+        facesContext.setResponseWriter(newResponseWriter);
 
         // TODO: Call saveView() on the StateManager for this application, saving the result in a
         // thread-safe manner for use in the writeState() method of ViewHandler.
 
         // Call startDocument() on the ResponseWriter.
-        responseWriter.startDocument();
+        newResponseWriter.startDocument();
 
         // Call encodeAll() on the UIViewRoot
         viewToRender.encodeAll(facesContext);
 
-        // TODO: Output any content in the wrapped response from above to the response, removing the
-        // wrapped response from the thread-safe storage.
+        // Output any content in the wrappedResponse response from above to the response, removing the
+        // wrappedResponse response from the thread-safe storage.
         // (next line is a test only)
+        if (oldResponseWriter != null) {
+            newResponseWriter = oldResponseWriter.cloneWithWriter(response.getWriter());
+        } else {
+            newResponseWriter = newResponseWriter.cloneWithWriter(response.getWriter());
+        }
+        facesContext.setResponseWriter(newResponseWriter);
+
         response.getWriter().write(enclosedWriter.toString());
+        response.getWriter().write(wrappedResponse.toString());
 
         // Call endDocument() on the ResponseWriter
-        responseWriter.endDocument();
+        newResponseWriter.endDocument();
+
 
         // If the old ResponseWriter was not null, place the old ResponseWriter back
         // into the FacesContext.
@@ -329,8 +332,6 @@
         }
         
         response.flushBuffer();
-
-        log.debug("SHOULD WRITE TO PAGE:\n"+enclosedWriter.toString());
     }
 
 

Modified: myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/application/jsp/ViewResponseWrapper.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/application/jsp/ViewResponseWrapper.java?view=diff&rev=494409&r1=494408&r2=494409
==============================================================================
--- myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/application/jsp/ViewResponseWrapper.java (original)
+++ myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/application/jsp/ViewResponseWrapper.java Tue Jan  9 05:44:08 2007
@@ -2,10 +2,10 @@
 
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponseWrapper;
+import java.io.CharArrayWriter;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
-import java.io.Writer;
 
 /**
  * @author Bruno Aranda (latest modification by $Author$)
@@ -14,7 +14,7 @@
 public class ViewResponseWrapper extends HttpServletResponseWrapper
 {
     private PrintWriter _writer;
-    private StringWriter _stringWriter;
+    private CharArrayWriter _charArrayWriter;
     private int _status = HttpServletResponse.SC_OK;
 
     public ViewResponseWrapper(HttpServletResponse httpServletResponse)
@@ -57,7 +57,10 @@
 
     public void flushToWrappedResponse() throws IOException
     {
-        getResponse().getWriter().write(_stringWriter.toString());
+        _charArrayWriter.writeTo(getResponse().getWriter());
+        _charArrayWriter.reset();
+        _writer.flush();
+        
     }
 
     @Override
@@ -65,8 +68,8 @@
     {
         if (_writer == null)
         {
-            _stringWriter = new StringWriter(4096);
-            _writer = new PrintWriter(_stringWriter);
+            _charArrayWriter = new CharArrayWriter(4096);
+            _writer = new PrintWriter(_charArrayWriter);
         }
         return _writer;
     }
@@ -74,6 +77,6 @@
     @Override
     public String toString()
     {
-        return _stringWriter.toString();
+        return _charArrayWriter.toString();
     }
 }

Modified: myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/context/servlet/FacesContextImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/context/servlet/FacesContextImpl.java?view=diff&rev=494409&r1=494408&r2=494409
==============================================================================
--- myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/context/servlet/FacesContextImpl.java (original)
+++ myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/context/servlet/FacesContextImpl.java Tue Jan  9 05:44:08 2007
@@ -351,6 +351,7 @@
         
         
         _elContext = new FacesELContext(getApplication().getELResolver(), this);
+        _elContext.putContext(FacesContext.class, this);
         
         ELContextEvent event = new ELContextEvent(_elContext);
         for (ELContextListener listener : getApplication().getELContextListeners()) {

Modified: myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/taglib/core/ViewTag.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/taglib/core/ViewTag.java?view=diff&rev=494409&r1=494408&r2=494409
==============================================================================
--- myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/taglib/core/ViewTag.java (original)
+++ myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/taglib/core/ViewTag.java Tue Jan  9 05:44:08 2007
@@ -18,6 +18,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.myfaces.shared_impl.util.LocaleUtils;
+import org.apache.myfaces.application.jsp.ViewResponseWrapper;
 
 import javax.el.ELContext;
 import javax.el.MethodExpression;
@@ -31,6 +32,7 @@
 import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.jstl.core.Config;
 import java.util.Locale;
+import java.io.IOException;
 
 /**
  * @author Manfred Geiler (latest modification by $Author$)
@@ -82,9 +84,23 @@
     {
         if (log.isTraceEnabled()) log.trace("entering ViewTag.doStartTag");
 
-        int retVal = super.doStartTag();
-
         FacesContext facesContext = FacesContext.getCurrentInstance();
+        Object response = facesContext.getExternalContext().getResponse();
+        if (response instanceof ViewResponseWrapper)
+        {
+            try
+            {
+                pageContext.getOut().flush();
+                ((ViewResponseWrapper) response).flushToWrappedResponse();
+            }
+            catch (IOException e)
+            {
+                throw new JspException("Can't write content above <f:view> tag"
+                        + " " + e.getMessage());
+            }
+        }
+
+        int retVal = super.doStartTag();
 
         Config.set(pageContext.getRequest(),
                        Config.FMT_LOCALE,