From e3f220bbae34875106506ab55bb226fc96a2f7a2 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 24 Jun 2016 09:42:12 -0400 Subject: [PATCH] Add Mojarra present checks For cases where isMyFacesInUse cannot properly detect due to issues in dependent libraries (e.g. Tomahawk) we also check if Mojarra is even present to strengthen those checks. Issue: SWF-1687 --- .../org/springframework/faces/webflow/FlowRenderKit.java | 2 +- .../faces/webflow/JsfRuntimeInformation.java | 7 +++++++ .../org/springframework/faces/webflow/JsfViewFactory.java | 3 ++- .../context/portlet/PortletExternalContextImpl.java | 7 ++++--- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowRenderKit.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowRenderKit.java index e0d89c10..2bafa153 100644 --- a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowRenderKit.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowRenderKit.java @@ -44,7 +44,7 @@ public class FlowRenderKit extends RenderKitWrapper { } private ResponseStateManager initResponseStateManager(ResponseStateManager wrapped) { - if (!JsfRuntimeInformation.isMyFacesInUse()) { + if (JsfRuntimeInformation.isMojarraPresent() && !JsfRuntimeInformation.isMyFacesInUse()) { return new FlowResponseStateManager(wrapped); } Constructor constructor; 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 429548d5..d6a7ebd7 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 @@ -71,6 +71,9 @@ public class JsfRuntimeInformation { } + private static final boolean mojarraPresent = + ClassUtils.isPresent("com.sun.faces.context.FacesContextImpl", CLASSLOADER); + private static final boolean myFacesPresent = ClassUtils.isPresent("org.apache.myfaces.webapp.MyFacesServlet", CLASSLOADER); @@ -109,6 +112,10 @@ public class JsfRuntimeInformation { } + public static boolean isMojarraPresent() { + return mojarraPresent; + } + public static boolean isMyFacesPresent() { return myFacesPresent; } 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 aaa25e42..864f83ff 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 @@ -40,6 +40,7 @@ import org.springframework.webflow.execution.RequestContext; import org.springframework.webflow.execution.View; import org.springframework.webflow.execution.ViewFactory; +import static org.springframework.faces.webflow.JsfRuntimeInformation.isMojarraPresent; import static org.springframework.faces.webflow.JsfRuntimeInformation.isPortletRequest; /** @@ -162,7 +163,7 @@ public class JsfViewFactory implements ViewFactory { private void processTree(FacesContext context, UIComponent component) { Object mojarraTreeHandler = null; - if (!JsfRuntimeInformation.isMyFacesInUse()) { + if (isMojarraPresent() && !JsfRuntimeInformation.isMyFacesInUse()) { mojarraTreeHandler = new MojarraProcessTreeHandler().handleBefore(context, component); } diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/context/portlet/PortletExternalContextImpl.java b/spring-faces/src/main/java/org/springframework/faces/webflow/context/portlet/PortletExternalContextImpl.java index d2197982..5947eb4d 100644 --- a/spring-faces/src/main/java/org/springframework/faces/webflow/context/portlet/PortletExternalContextImpl.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/context/portlet/PortletExternalContextImpl.java @@ -127,11 +127,12 @@ public class PortletExternalContextImpl extends ExternalContext { } private Flash createFlash() { - if (JsfRuntimeInformation.isMyFacesInUse()) { - return new MyFacesFlashFactory().newFlash(this); - } else { + if (JsfRuntimeInformation.isMojarraPresent() && !JsfRuntimeInformation.isMyFacesInUse()) { return new MojarraFlashFactory().newFlash(this); } + else { + return new MyFacesFlashFactory().newFlash(this); + } } public void dispatch(String path) throws IOException {