diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfRuntimeInformation.java b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfRuntimeInformation.java index 3c575cfa..da480aba 100644 --- a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfRuntimeInformation.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfRuntimeInformation.java @@ -25,7 +25,7 @@ import org.springframework.webflow.execution.RequestContext; /** * Helper class to provide information about the JSF runtime environment such as JSF version and implementation. - * + * * @author Rossen Stoyanchev * @author Phillip Webb */ @@ -33,7 +33,7 @@ public class JsfRuntimeInformation { /** * JSF Version 1.1 - * + * * @deprecated As of Web Flow 2.4.0 JSF 2.0 is a minimum requirement */ @Deprecated @@ -41,7 +41,7 @@ public class JsfRuntimeInformation { /** * JSF Version 1.2 - * + * * @deprecated As of Web Flow 2.4.0 JSF 2.0 is a minimum requirement */ @Deprecated @@ -50,6 +50,12 @@ public class JsfRuntimeInformation { /** JSF Version 2.0 */ public static final int JSF_20 = 2; + /** JSF Version 2.1 */ + public static final int JSF_21 = 3; + + /** JSF Version 2.2 */ + public static final int JSF_22 = 4; + private static final int jsfVersion; private static final ClassLoader CLASS_LOADER = JsfUtils.class.getClassLoader(); @@ -57,11 +63,15 @@ public class JsfRuntimeInformation { private static final boolean myFacesPresent = ClassUtils.isPresent("org.apache.myfaces.webapp.MyFacesServlet", CLASS_LOADER); private static boolean portletPresent = ClassUtils.isPresent("javax.portlet.Portlet", CLASS_LOADER); - + private static boolean springPortletPresent = ClassUtils.isPresent("org.springframework.web.portlet.DispatcherPortlet", CLASS_LOADER); static { - if (ReflectionUtils.findMethod(FacesContext.class, "isPostback") != null) { + if (ReflectionUtils.findMethod(FacesContext.class, "getResourceLibraryContracts") != null) { + jsfVersion = JSF_22; + } else if (ReflectionUtils.findMethod(FacesContext.class, "isReleased") != null) { + jsfVersion = JSF_21; + } else if (ReflectionUtils.findMethod(FacesContext.class, "isPostback") != null) { jsfVersion = JSF_20; } else if (ReflectionUtils.findMethod(FacesContext.class, "getELContext") != null) { jsfVersion = JSF_12; @@ -70,6 +80,14 @@ public class JsfRuntimeInformation { } } + public static boolean isAtLeastJsf22() { + return jsfVersion >= JSF_22; + } + + public static boolean isAtLeastJsf21() { + return jsfVersion >= JSF_21; + } + /** * @deprecated As of Web Flow 2.4.0 JSF 2.0 is a minimum requirement */ @@ -100,7 +118,7 @@ public class JsfRuntimeInformation { /** * Determines if the container has support for portlets and if Spring MVC portlet support is available - * + * * @return true if a portlet environment is detected */ public static boolean isSpringPortletPresent() { @@ -109,7 +127,7 @@ public class JsfRuntimeInformation { /** * Determine if the specified {@link FacesContext} is from a portlet request. - * + * * @param context the faces context * @return true if the request is from a portlet */ @@ -120,7 +138,7 @@ public class JsfRuntimeInformation { /** * Determine if the specified {@link RequestContext} is from a portlet request. - * + * * @param context the request context * @return true if the request is from a portlet */ @@ -131,7 +149,7 @@ public class JsfRuntimeInformation { /** * Determine if the specified context object is from portlet. - * + * * @param nativeContext the native context * @return true if the context is from a portlet */ 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 db613883..72edba70 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 @@ -103,7 +103,9 @@ public class JsfUtils { FACTORY_NAMES.put(ApplicationFactory.class, FactoryFinder.APPLICATION_FACTORY); FACTORY_NAMES.put(ExceptionHandlerFactory.class, FactoryFinder.EXCEPTION_HANDLER_FACTORY); FACTORY_NAMES.put(ExternalContextFactory.class, FactoryFinder.EXTERNAL_CONTEXT_FACTORY); - FACTORY_NAMES.put(FaceletCacheFactory.class, FactoryFinder.FACELET_CACHE_FACTORY); + if (JsfRuntimeInformation.isAtLeastJsf21()) { + FACTORY_NAMES.put(FaceletCacheFactory.class, FactoryFinder.FACELET_CACHE_FACTORY); + } FACTORY_NAMES.put(FacesContextFactory.class, FactoryFinder.FACES_CONTEXT_FACTORY); FACTORY_NAMES.put(LifecycleFactory.class, FactoryFinder.LIFECYCLE_FACTORY); FACTORY_NAMES.put(PartialViewContextFactory.class, FactoryFinder.PARTIAL_VIEW_CONTEXT_FACTORY); 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 82eba121..f109315e 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 @@ -180,9 +180,18 @@ public class JsfViewFactory implements ViewFactory { } private void publishPostRestoreStateEvent(FacesContext facesContext) { + VisitHint visitHint = null; + try { + Enum.valueOf(VisitHint.class, "SKIP_ITERATION"); + } + catch (IllegalArgumentException ex) { + // JSF < 2.1 + } try { facesContext.getAttributes().put(SKIP_ITERATION_HINT, true); - VisitContext visitContext = VisitContext.createVisitContext(facesContext, null, EnumSet.of(VisitHint.SKIP_ITERATION)); + VisitContext visitContext = (visitHint != null ? + VisitContext.createVisitContext(facesContext, null, EnumSet.of(VisitHint.SKIP_ITERATION)) : + VisitContext.createVisitContext(facesContext)); facesContext.getViewRoot().visitTree(visitContext, new PostRestoreStateEventVisitCallback()); } catch (AbortProcessingException e) {