From bc35b3d8a698cd32b468f6ec2833e51c28868859 Mon Sep 17 00:00:00 2001 From: Jeremy Grelle Date: Tue, 1 Apr 2008 15:30:47 +0000 Subject: [PATCH] SWF-538 - JSFViewFactory's execution of the restore view lifecycle doesn't appear to match the JSF spec. --- .../faces/mvc/JsfController.java | 16 ---------------- .../org/springframework/faces/mvc/JsfView.java | 9 ++++++++- .../faces/webflow/FlowViewStateManager.java | 6 ++---- .../springframework/faces/webflow/JsfUtils.java | 17 +++++++++++++++++ .../faces/webflow/JsfViewFactory.java | 4 ++++ .../faces/webflow/MockViewHandler.java | 4 ++++ 6 files changed, 35 insertions(+), 21 deletions(-) delete mode 100644 spring-faces/src/main/java/org/springframework/faces/mvc/JsfController.java diff --git a/spring-faces/src/main/java/org/springframework/faces/mvc/JsfController.java b/spring-faces/src/main/java/org/springframework/faces/mvc/JsfController.java deleted file mode 100644 index 914d3b17..00000000 --- a/spring-faces/src/main/java/org/springframework/faces/mvc/JsfController.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.springframework.faces.mvc; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.mvc.AbstractController; - -public class JsfController extends AbstractController { - - protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Auto-generated method stub"); - } - -} diff --git a/spring-faces/src/main/java/org/springframework/faces/mvc/JsfView.java b/spring-faces/src/main/java/org/springframework/faces/mvc/JsfView.java index ec2b84ba..d2d46f34 100644 --- a/spring-faces/src/main/java/org/springframework/faces/mvc/JsfView.java +++ b/spring-faces/src/main/java/org/springframework/faces/mvc/JsfView.java @@ -21,6 +21,7 @@ import java.util.Map; import javax.faces.FacesException; import javax.faces.FactoryFinder; +import javax.faces.application.ViewHandler; import javax.faces.component.UIViewRoot; import javax.faces.context.FacesContext; import javax.faces.context.FacesContextFactory; @@ -58,7 +59,13 @@ public class JsfView extends AbstractUrlBasedView { JsfUtils.notifyBeforeListeners(PhaseId.RESTORE_VIEW, facesLifecycle, facesContext); - UIViewRoot viewRoot = facesContext.getApplication().getViewHandler().createView(facesContext, getUrl()); + ViewHandler viewHandler = facesContext.getApplication().getViewHandler(); + + if (JsfUtils.isAtLeastJsf12()) { + viewHandler.initView(facesContext); + } + + UIViewRoot viewRoot = viewHandler.createView(facesContext, getUrl()); Assert.notNull(viewRoot, "A JSF view could not be created for " + getUrl()); viewRoot.setTransient(true); diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowViewStateManager.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowViewStateManager.java index 03d12083..a091abe9 100644 --- a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowViewStateManager.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowViewStateManager.java @@ -33,8 +33,6 @@ public class FlowViewStateManager extends StateManager { private static final String SERIALIZED_VIEW_STATE = "org.springframework.webflow.viewState"; - private static final String ACTIVE_VIEW_ROOT = "org.springframework.webflow.viewRoot"; - private StateManager delegate; public FlowViewStateManager(StateManager original) { @@ -91,7 +89,7 @@ public class FlowViewStateManager extends StateManager { return null; } if (logger.isDebugEnabled()) { - logger.debug("Restoring view root with id '" + viewId + "' from flow scope"); + logger.debug("Restoring view root with id '" + viewId + "' from view scope"); } if (view.treeStructure == null) { logger.debug("Tree structure is null indicating transient UIViewRoot; returning null"); @@ -141,7 +139,7 @@ public class FlowViewStateManager extends StateManager { RequestContext requestContext = RequestContextHolder.getRequestContext(); if (logger.isDebugEnabled()) { - logger.debug("Saving view root '" + context.getViewRoot().getViewId() + "' in flow scope"); + logger.debug("Saving view root '" + context.getViewRoot().getViewId() + "' in view scope"); } SerializedView view = new SerializedView(context.getViewRoot().getViewId(), getTreeStructureToSave(context), getComponentStateToSave(context)); diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfUtils.java b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfUtils.java index 55e9b47b..dad820b0 100644 --- a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfUtils.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfUtils.java @@ -21,6 +21,7 @@ import javax.faces.event.PhaseId; import javax.faces.event.PhaseListener; import javax.faces.lifecycle.Lifecycle; +import org.springframework.util.ReflectionUtils; import org.springframework.webflow.execution.RequestContextHolder; /** @@ -30,6 +31,18 @@ import org.springframework.webflow.execution.RequestContextHolder; */ public class JsfUtils { + private static final boolean JSF_12; + + private static final String JSF_12_METHOD = "getELContext"; + + static { + if (ReflectionUtils.findMethod(FacesContext.class, JSF_12_METHOD) != null) { + JSF_12 = true; + } else { + JSF_12 = false; + } + } + public static void notifyAfterListeners(PhaseId phaseId, Lifecycle lifecycle, FacesContext context) { PhaseEvent afterPhaseEvent = new PhaseEvent(context, phaseId, lifecycle); for (int i = 0; i < lifecycle.getPhaseListeners().length; i++) { @@ -65,4 +78,8 @@ public class JsfUtils { return false; } } + + public static boolean isAtLeastJsf12() { + return JSF_12; + } } diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfViewFactory.java b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfViewFactory.java index e3ca1a85..9b62193b 100644 --- a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfViewFactory.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfViewFactory.java @@ -78,6 +78,10 @@ public class JsfViewFactory implements ViewFactory { String viewName = resolveViewName(context); ViewHandler viewHandler = facesContext.getApplication().getViewHandler(); + if (JsfUtils.isAtLeastJsf12()) { + viewHandler.initView(facesContext); + } + if (viewExists(facesContext, viewName)) { if (logger.isDebugEnabled()) { logger.debug("Existing view root found for '" + viewName + "'"); diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/MockViewHandler.java b/spring-faces/src/test/java/org/springframework/faces/webflow/MockViewHandler.java index 760cb7da..05dbab5e 100644 --- a/spring-faces/src/test/java/org/springframework/faces/webflow/MockViewHandler.java +++ b/spring-faces/src/test/java/org/springframework/faces/webflow/MockViewHandler.java @@ -40,6 +40,10 @@ public class MockViewHandler extends ViewHandler { return createViewRoot; } + public void initView(FacesContext context) throws FacesException { + // do nothing + } + /** * Set the view root that this mock is supposed to create * @param createViewRoot the view to set.