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 00:45:42 UTC

svn commit: r494260 - /myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/application/jsp/JspViewHandlerImpl.java

Author: baranda
Date: Mon Jan  8 15:45:41 2007
New Revision: 494260

URL: http://svn.apache.org/viewvc?view=rev&rev=494260
Log:
Partial-unfinished implementation of the ViewHandler

Modified:
    myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/application/jsp/JspViewHandlerImpl.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=494260&r1=494259&r2=494260
==============================================================================
--- 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 Mon Jan  8 15:45:41 2007
@@ -16,23 +16,33 @@
 package org.apache.myfaces.application.jsp;
 
 import java.io.IOException;
+import java.io.StringWriter;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 
 import javax.faces.FacesException;
+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;
+import javax.faces.context.ResponseWriter;
 import javax.faces.render.RenderKitFactory;
+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;
@@ -53,6 +63,8 @@
     public static final String FORM_STATE_MARKER     = "<!-...@-->";
     public static final int    FORM_STATE_MARKER_LEN = FORM_STATE_MARKER.length();
 
+    private static final int BUFFER_SIZE = 4096;
+
 
     public JspViewHandlerImpl()
     {
@@ -188,11 +200,21 @@
             throw new NullPointerException("viewToRender must not be null");
         }
 
+        // do not render the view if the rendered attribute for the view is false
+        if (!viewToRender.isRendered())
+        {
+            if (log.isTraceEnabled()) log.trace("View is not rendered");
+            return;
+        }
+
         ExternalContext externalContext = facesContext.getExternalContext();
 
         String viewId = facesContext.getViewRoot().getViewId();
 
+        if (log.isTraceEnabled()) log.trace("Rendering JSP view: "+viewId);
+
         if (PortletUtil.isPortletRequest(facesContext)) {
+             if (log.isTraceEnabled()) log.trace("It is a portlet request. Dispatching to view");
             externalContext.dispatch(viewId);
             return;
         }
@@ -224,27 +246,83 @@
 
         if (log.isTraceEnabled()) log.trace("Dispatching to " + viewId);
 
-        // handle character encoding as of section 2.5.2.2 of JSF 1.1
-        if (externalContext.getResponse() instanceof ServletResponse) {
-            ServletResponse response = (ServletResponse) externalContext.getResponse();
-            response.setLocale(viewToRender.getLocale());
-        }
+        ServletResponse response = (ServletResponse) externalContext.getResponse();
+        ServletRequest request = (ServletRequest) externalContext.getRequest();
 
-        // TODO: 2.5.2.2 for Portlet?  What do I do?
+            Locale locale = viewToRender.getLocale();
+            response.setLocale(locale);
+            Config.set(request,
+                       Config.FMT_LOCALE,
+                       facesContext.getViewRoot().getLocale());
 
         externalContext.dispatch(viewId);
+        externalContext.setResponse(response);
 
+         /*
         // handle character encoding as of section 2.5.2.2 of JSF 1.1
+
         if (externalContext.getRequest() instanceof HttpServletRequest) {
-            HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
-            HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
-            HttpSession session = request.getSession(false);
+            HttpServletRequest httpServletRequest = (HttpServletRequest) externalContext.getRequest();
+            HttpSession session = httpServletRequest.getSession(false);
 
             if (session != null) {
                 session.setAttribute(ViewHandler.CHARACTER_ENCODING_KEY, response.getCharacterEncoding());
             }
         }
+        */
+        // render the view in this method (since JSF 1.2)
+        RenderKitFactory renderFactory = (RenderKitFactory) FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
+        RenderKit renderKit = renderFactory.getRenderKit(facesContext, viewToRender.getRenderKitId());
+
+        ResponseWriter responseWriter;
+        StringWriter enclosedWriter = new StringWriter();
+
+        // If the FacesContext has a non-null ResponseWriter create a new writer using its
+        // cloneWithWriter() method, passing the response’s Writer as the argument.
+        // Otherwise, use the current RenderKit to create a new ResponseWriter.
+        ResponseWriter oldResponseWriter = facesContext.getResponseWriter();
+        if (oldResponseWriter != null)
+        {
+            responseWriter = oldResponseWriter.cloneWithWriter(enclosedWriter);
+        }
+        else
+        {
+            if (log.isTraceEnabled()) log.trace("Creating new ResponseWriter");
+            
+            responseWriter = renderKit.createResponseWriter(enclosedWriter, null,
+                    ((HttpServletRequest) externalContext.getRequest()).getCharacterEncoding());
+        }
+
+        // Set the new ResponseWriter into the FacesContext, saving the old one aside.
+        facesContext.setResponseWriter(responseWriter);
+
+        // 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();
+
+        // 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.
+        // (next line is a test only)
+        response.getWriter().write(enclosedWriter.toString());
+
+        // Call endDocument() on the ResponseWriter
+        responseWriter.endDocument();
+
+        // If the old ResponseWriter was not null, place the old ResponseWriter back
+        // into the FacesContext.
+        if (oldResponseWriter != null)
+        {
+            facesContext.setResponseWriter(oldResponseWriter);
+        }
+        
+        response.flushBuffer();
 
+        log.debug("SHOULD WRITE TO PAGE:\n"+enclosedWriter.toString());
     }
 
 
@@ -396,6 +474,5 @@
             return null;
         }
     }
-
 
 }