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 bac8032c..8546bb92 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 @@ -1,5 +1,5 @@ /* - * Copyright 2004-2012 the original author or authors. + * Copyright 2004-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,23 +38,21 @@ import com.sun.faces.component.CompositeComponentStackManager; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.binding.expression.Expression; -import org.springframework.util.Assert; import org.springframework.webflow.execution.RequestContext; import org.springframework.webflow.execution.View; import org.springframework.webflow.execution.ViewFactory; /** * JSF-specific {@link ViewFactory} implementation. - *

- * This factory is responsible for performing the duties of the RESTORE_VIEW phase of the JSF lifecycle. + * + *

This factory is responsible for performing the duties of the RESTORE_VIEW + * phase of the JSF lifecycle. * * @author Jeremy Grelle * @author Phillip Webb */ public class JsfViewFactory implements ViewFactory { - private static String SKIP_ITERATION_HINT = "javax.faces.visit.SKIP_ITERATION"; - private static final Log logger = LogFactory.getLog(JsfViewFactory.class); private final Expression viewIdExpression; @@ -72,12 +70,10 @@ public class JsfViewFactory implements ViewFactory { */ public View getView(RequestContext context) { FacesContext facesContext = FacesContext.getCurrentInstance(); - Assert.state( - facesContext != null, - "FacesContext has not been initialized within the current Web Flow request." - + " Check the configuration for your ." - + " For JSF you will need FlowFacesContextLifecycleListener configured as one of its flow execution listeners."); - + if (facesContext == null) { + throw new IllegalStateException("FacesContext has not been initialized within " + + "the current Web Flow request. Has FlowFacesContextLifecycleListener been added?"); + } facesContext.setCurrentPhaseId(PhaseId.RESTORE_VIEW); // only publish a RESTORE_VIEW event if this is the first phase of the lifecycle @@ -131,19 +127,21 @@ public class JsfViewFactory implements ViewFactory { return viewRoot; } - private UIViewRoot getViewStateViewRoot(RequestContext context, FacesContext facesContext, ViewHandler viewHandler, - String viewName) { - UIViewRoot viewRoot = viewHandler.restoreView(facesContext, viewName); + private UIViewRoot getViewStateViewRoot(RequestContext context, FacesContext facesContext, + ViewHandler handler, String viewName) { + + UIViewRoot viewRoot = handler.restoreView(facesContext, viewName); if (viewRoot != null) { if (logger.isDebugEnabled()) { logger.debug("UIViewRoot restored for '" + viewName + "'"); } processTree(facesContext, viewRoot); - } else { + } + else { if (logger.isDebugEnabled()) { logger.debug("Creating UIViewRoot from '" + viewName + "'"); } - viewRoot = viewHandler.createView(facesContext, viewName); + viewRoot = handler.createView(facesContext, viewName); } return viewRoot; } @@ -160,9 +158,6 @@ public class JsfViewFactory implements ViewFactory { /** * Walk the component tree to perform any required per-component operations. - * - * @param context - * @param component */ private void processTree(FacesContext context, UIComponent component) { @@ -195,25 +190,28 @@ public class JsfViewFactory implements ViewFactory { } private void publishPostRestoreStateEvent(FacesContext facesContext) { - VisitHint visitHint = null; + EnumSet visitHints = null; try { - Enum.valueOf(VisitHint.class, "SKIP_ITERATION"); + visitHints = EnumSet.of(VisitHint.SKIP_ITERATION); } catch (IllegalArgumentException ex) { // JSF < 2.1 } + String attributeName = "javax.faces.visit.SKIP_ITERATION"; + facesContext.getAttributes().put(attributeName, true); try { - facesContext.getAttributes().put(SKIP_ITERATION_HINT, true); - VisitContext visitContext = (visitHint != null ? - VisitContext.createVisitContext(facesContext, null, EnumSet.of(VisitHint.SKIP_ITERATION)) : + VisitContext visitContext = (visitHints != null ? + VisitContext.createVisitContext(facesContext, null, visitHints) : VisitContext.createVisitContext(facesContext)); - facesContext.getViewRoot().visitTree(visitContext, - new PostRestoreStateEventVisitCallback()); - } catch (AbortProcessingException e) { - facesContext.getApplication().publishEvent(facesContext, ExceptionQueuedEvent.class, - new ExceptionQueuedEventContext(facesContext, e, null, facesContext.getCurrentPhaseId())); - } finally { - facesContext.getAttributes().remove(SKIP_ITERATION_HINT); + facesContext.getViewRoot().visitTree(visitContext, new PostRestoreStateEventVisitCallback()); + } + catch (AbortProcessingException e) { + PhaseId phaseId = facesContext.getCurrentPhaseId(); + ExceptionQueuedEventContext eventContext = new ExceptionQueuedEventContext(facesContext, e, null, phaseId); + facesContext.getApplication().publishEvent(facesContext, ExceptionQueuedEvent.class, eventContext); + } + finally { + facesContext.getAttributes().remove(attributeName); } }