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/07 21:42:26 UTC

svn commit: r493828 - in /myfaces: core/branches/jsf12/impl/src/main/java/org/apache/myfaces/lifecycle/ shared/branches/3_0_0/core/src/main/java/org/apache/myfaces/shared/renderkit/ shared/branches/3_0_0/core/src/main/java/org/apache/myfaces/shared/util/

Author: baranda
Date: Sun Jan  7 12:42:25 2007
New Revision: 493828

URL: http://svn.apache.org/viewvc?view=rev&rev=493828
Log:
Implementation of the RestoreView phase according to the 1.2 spec

Modified:
    myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/lifecycle/RestoreViewExecutor.java
    myfaces/shared/branches/3_0_0/core/src/main/java/org/apache/myfaces/shared/renderkit/RendererUtils.java
    myfaces/shared/branches/3_0_0/core/src/main/java/org/apache/myfaces/shared/util/RestoreStateUtils.java

Modified: myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/lifecycle/RestoreViewExecutor.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/lifecycle/RestoreViewExecutor.java?view=diff&rev=493828&r1=493827&r2=493828
==============================================================================
--- myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/lifecycle/RestoreViewExecutor.java (original)
+++ myfaces/core/branches/jsf12/impl/src/main/java/org/apache/myfaces/lifecycle/RestoreViewExecutor.java Sun Jan  7 12:42:25 2007
@@ -21,8 +21,10 @@
 import java.io.IOException;
 
 import javax.faces.FacesException;
+import javax.faces.render.ResponseStateManager;
 import javax.faces.application.Application;
 import javax.faces.application.ViewHandler;
+import javax.faces.application.ViewExpiredException;
 import javax.faces.component.UIViewRoot;
 import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
@@ -34,21 +36,39 @@
 import org.apache.myfaces.portlet.MyFacesGenericPortlet;
 import org.apache.myfaces.portlet.PortletUtil;
 import org.apache.myfaces.shared_impl.util.RestoreStateUtils;
+import org.apache.myfaces.shared_impl.renderkit.RendererUtils;
 import org.apache.myfaces.util.DebugUtils;
 
 /**
- * Implements the lifecycle as described in Spec. 1.0 PFD Chapter 2
+ * Implements the Restore View Phase (JSF Spec 2.2.1)
+ *
  * @author Nikolay Petrov
+ * @author Bruno Aranda (JSF 1.2)
+ * @version $Revision$ $Date$
  *
- * Restore view phase (JSF Spec 2.2.1)
  */
 class RestoreViewExecutor implements PhaseExecutor {
 
 	private static final Log log = LogFactory.getLog(LifecycleImpl.class);
 
 	public boolean execute(FacesContext facesContext) {
-		if(facesContext.getViewRoot() != null) {
-			facesContext.getViewRoot().setLocale(facesContext.getExternalContext().getRequestLocale());
+
+        if (facesContext == null)
+        {
+            throw new FacesException("FacesContext is null");
+        }
+
+        // init the ViewHandler
+        Application application = facesContext.getApplication();
+        ViewHandler viewHandler = application.getViewHandler();
+        viewHandler.initView(facesContext);
+
+        UIViewRoot viewRoot = facesContext.getViewRoot();
+
+        if(viewRoot != null) {
+            if (log.isTraceEnabled()) log.trace("View already exists in the FacesContext");
+
+            viewRoot.setLocale(facesContext.getExternalContext().getRequestLocale());
 			RestoreStateUtils.recursivelyHandleComponentReferencesAndSetValid(facesContext, facesContext.getViewRoot());
 			return false;
 		}
@@ -74,19 +94,30 @@
 			}
 		}
 
-		Application application = facesContext.getApplication();
-		ViewHandler viewHandler = application.getViewHandler();
+        // Determine if this request is a postback or initial request
+        if (isPostback(facesContext))
+        {
+            if (log.isTraceEnabled()) log.trace("Request is a postback");
+
+            viewRoot = viewHandler.restoreView(facesContext, viewId);
+            if (viewRoot == null)
+            {
+                throw new ViewExpiredException("The expected view was not returned " +
+                        "for the view identifier: "+viewId);
+            }
+            RestoreStateUtils.recursivelyHandleComponentReferencesAndSetValid(facesContext, facesContext.getViewRoot());
+        }
+        else
+        {
+            if (log.isTraceEnabled()) log.trace("Request is not a postback. New UIViewRoot will be created");
+
+            viewRoot = viewHandler.createView(facesContext, viewId);
+            viewRoot.setViewId(viewId);
+            facesContext.renderResponse();
+            // viewCreated = true;
+        }
 
-		// boolean viewCreated = false;
-		UIViewRoot viewRoot = viewHandler.restoreView(facesContext, viewId);
-		if (viewRoot == null) {
-			viewRoot = viewHandler.createView(facesContext, viewId);
-			viewRoot.setViewId(viewId);
-			facesContext.renderResponse();
-			// viewCreated = true;
-		}
-
-		facesContext.setViewRoot(viewRoot);
+        facesContext.setViewRoot(viewRoot);
 
 		if (facesContext.getExternalContext().getRequestParameterMap().isEmpty()) {
 			// no POST or query parameters --> set render response flag
@@ -135,4 +166,16 @@
 
 		return viewId;
 	}
+
+    /**
+     * Determine if this request is a postback or initial request
+     */
+    private boolean isPostback(FacesContext facesContext) {
+
+        ViewHandler viewHandler = facesContext.getApplication().getViewHandler();
+        String renderkitId = viewHandler.calculateRenderKitId(facesContext);
+        ResponseStateManager rsm = RendererUtils.getResponseStateManager(facesContext,
+                renderkitId);
+        return rsm.isPostback(facesContext);
+    }
 }

Modified: myfaces/shared/branches/3_0_0/core/src/main/java/org/apache/myfaces/shared/renderkit/RendererUtils.java
URL: http://svn.apache.org/viewvc/myfaces/shared/branches/3_0_0/core/src/main/java/org/apache/myfaces/shared/renderkit/RendererUtils.java?view=diff&rev=493828&r1=493827&r2=493828
==============================================================================
--- myfaces/shared/branches/3_0_0/core/src/main/java/org/apache/myfaces/shared/renderkit/RendererUtils.java (original)
+++ myfaces/shared/branches/3_0_0/core/src/main/java/org/apache/myfaces/shared/renderkit/RendererUtils.java Sun Jan  7 12:42:25 2007
@@ -22,6 +22,10 @@
 import org.apache.myfaces.shared.renderkit._SharedRendererUtils;
 
 import javax.faces.FacesException;
+import javax.faces.FactoryFinder;
+import javax.faces.render.RenderKit;
+import javax.faces.render.RenderKitFactory;
+import javax.faces.render.ResponseStateManager;
 import javax.faces.event.PhaseId;
 import javax.faces.component.*;
 import javax.faces.component.html.HtmlInputText;
@@ -958,5 +962,41 @@
                 facesContext.getExternalContext().getRequestMap().put(ACTION_FOR_PHASE_LIST,phaseList);
             }
         }
+    }
+
+    /**
+     * Gets the ResponseStateManager for the renderKit Id provided
+     */
+    public static ResponseStateManager getResponseStateManager(FacesContext facesContext, String renderKitId)
+            throws FacesException
+    {
+        RenderKit renderKit = facesContext.getRenderKit();
+
+        if (renderKit == null)
+        {
+            // look for the renderkit in the request
+            Map requestMap = facesContext.getExternalContext().getRequestMap();
+            RenderKitFactory factory = (RenderKitFactory) requestMap.get(ResponseStateManager.RENDER_KIT_ID_PARAM);
+
+            if (factory != null)
+            {
+                renderKit = factory.getRenderKit(facesContext, renderKitId);
+            }
+            else
+            {
+                factory = (RenderKitFactory) FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
+
+                if (factory == null)
+                {
+                    throw new IllegalStateException("Factory is null");
+                }
+                else
+                {
+                    requestMap.put(ResponseStateManager.RENDER_KIT_ID_PARAM, factory);
+                }
+                renderKit = factory.getRenderKit(facesContext, renderKitId);
+            }
+        }
+        return renderKit.getResponseStateManager();
     }
 }

Modified: myfaces/shared/branches/3_0_0/core/src/main/java/org/apache/myfaces/shared/util/RestoreStateUtils.java
URL: http://svn.apache.org/viewvc/myfaces/shared/branches/3_0_0/core/src/main/java/org/apache/myfaces/shared/util/RestoreStateUtils.java?view=diff&rev=493828&r1=493827&r2=493828
==============================================================================
--- myfaces/shared/branches/3_0_0/core/src/main/java/org/apache/myfaces/shared/util/RestoreStateUtils.java (original)
+++ myfaces/shared/branches/3_0_0/core/src/main/java/org/apache/myfaces/shared/util/RestoreStateUtils.java Sun Jan  7 12:42:25 2007
@@ -9,6 +9,7 @@
 import javax.faces.component.UIComponent;
 import javax.faces.component.UIInput;
 import javax.faces.el.ValueBinding;
+import javax.el.ValueExpression;
 import java.util.Iterator;
 import java.lang.reflect.Method;
 import java.lang.reflect.InvocationTargetException;
@@ -64,10 +65,10 @@
             {
                 UIComponent component = (UIComponent)it.next();
 
-                ValueBinding binding = component.getValueBinding("binding");    //TODO: constant
-                if (binding != null && !binding.isReadOnly(facesContext))
+                ValueExpression binding = component.getValueExpression("binding");    //TODO: constant
+                if (binding != null)
                 {
-                    binding.setValue(facesContext, component);
+                    binding.setValue(facesContext.getELContext(), component);
                 }
 
                 if (component instanceof UIInput)