From b8ab19a4679325039973d9a124807986810f0433 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 17 Jun 2016 11:38:52 -0400 Subject: [PATCH] Also check if MyFaces in use at runtime Issue: SWF-1670 --- .../faces/webflow/JsfRuntimeInformation.java | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) 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 0cee4e17..429548d5 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 @@ -74,7 +74,7 @@ public class JsfRuntimeInformation { private static final boolean myFacesPresent = ClassUtils.isPresent("org.apache.myfaces.webapp.MyFacesServlet", CLASSLOADER); - private static final boolean myFacesInUse = checkMyFacesContextFactory(); + private static boolean myFacesInUse = isMyFacesContextFactoryInUse(); private static boolean portletPresent = ClassUtils.isPresent("javax.portlet.Portlet", CLASSLOADER); @@ -83,19 +83,6 @@ public class JsfRuntimeInformation { ClassUtils.isPresent("org.springframework.web.portlet.DispatcherPortlet", CLASSLOADER); - private static boolean checkMyFacesContextFactory() { - try { - Class clazz = CLASSLOADER.loadClass("org.apache.myfaces.context.FacesContextFactoryImpl"); - Object factory = FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); - while (!clazz.isInstance(factory) && factory instanceof FacesWrapper) { - factory = ((FacesWrapper) factory).getWrapped(); - } - return (factory != null && clazz.isInstance(factory)); - } - catch (Throwable ex) { - return false; - } - } public static boolean isAtLeastJsf22() { return jsfVersion >= JSF_22; @@ -127,9 +114,28 @@ public class JsfRuntimeInformation { } public static boolean isMyFacesInUse() { + if (myFacesInUse) { + return true; + } + // On WebSphere MyFaces may have loaded after this class... + myFacesInUse = isMyFacesContextFactoryInUse(); return myFacesInUse; } + private static boolean isMyFacesContextFactoryInUse() { + try { + Class clazz = CLASSLOADER.loadClass("org.apache.myfaces.context.FacesContextFactoryImpl"); + Object factory = FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); + while (!clazz.isInstance(factory) && factory instanceof FacesWrapper) { + factory = ((FacesWrapper) factory).getWrapped(); + } + return (factory != null && clazz.isInstance(factory)); + } + catch (Throwable ex) { + return false; + } + } + /** * Determines if the container has support for portlets and if Spring MVC portlet support is available