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)