From 5a34fb15b424e2f4fb9c8b2b366665d237f4c23e Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Mon, 12 Nov 2012 17:28:10 -0800 Subject: [PATCH] Fix package tangle with portlets Introduce PortletFacesContextFactory that will be used to create the FacesContext when running in a portlet environment. This moves logic from the FacesContextHelper preventing the package tangle that would otherwise occur. --- .../faces/webflow/FacesContextHelper.java | 10 +--- .../portlet/PortletFacesContextFactory.java | 50 +++++++++++++++++++ .../main/resources/META-INF/faces-config.xml | 5 +- 3 files changed, 54 insertions(+), 11 deletions(-) create mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/context/portlet/PortletFacesContextFactory.java diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FacesContextHelper.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FacesContextHelper.java index 0583e9e9..871a47f5 100644 --- a/spring-faces/src/main/java/org/springframework/faces/webflow/FacesContextHelper.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FacesContextHelper.java @@ -19,11 +19,6 @@ package org.springframework.faces.webflow; import javax.faces.context.FacesContext; import javax.faces.context.FacesContextFactory; import javax.faces.lifecycle.Lifecycle; -import javax.portlet.PortletContext; -import javax.portlet.PortletRequest; -import javax.portlet.PortletResponse; - -import org.springframework.faces.webflow.context.portlet.PortletFacesContextImpl; /** * Provides helper methods for getting a FacesContext that is suitable for use outside of Web Flow. Inside a running @@ -65,7 +60,7 @@ public class FacesContextHelper { * @see #getFacesContext(Object, Object, Object) */ public void releaseIfNecessary() { - if (release) { + if (this.release) { FacesContext.getCurrentInstance().release(); } } @@ -81,9 +76,6 @@ public class FacesContextHelper { * @return a new {@link FacesContext} instance */ public static FacesContext newDefaultInstance(Object context, Object request, Object response, Lifecycle lifecycle) { - if (JsfRuntimeInformation.isPortletContext(context)) { - return new PortletFacesContextImpl((PortletContext) context, (PortletRequest) request, (PortletResponse) response); - } FacesContextFactory facesContextFactory = JsfUtils.findFactory(FacesContextFactory.class); return facesContextFactory.getFacesContext(context, request, response, lifecycle); } diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/context/portlet/PortletFacesContextFactory.java b/spring-faces/src/main/java/org/springframework/faces/webflow/context/portlet/PortletFacesContextFactory.java new file mode 100644 index 00000000..2896ff23 --- /dev/null +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/context/portlet/PortletFacesContextFactory.java @@ -0,0 +1,50 @@ +/* + * Copyright 2004-2012 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.faces.webflow.context.portlet; + +import javax.faces.FacesException; +import javax.faces.context.FacesContext; +import javax.faces.context.FacesContextFactory; +import javax.faces.lifecycle.Lifecycle; +import javax.portlet.PortletContext; +import javax.portlet.PortletRequest; +import javax.portlet.PortletResponse; + +import org.springframework.faces.webflow.JsfRuntimeInformation; + +/** + * {@link FacesContextFactory} to support portlet environments. + * @author Phillip Webb + */ +public class PortletFacesContextFactory extends FacesContextFactory { + + private final FacesContextFactory factory; + + public PortletFacesContextFactory(FacesContextFactory factory) { + this.factory = factory; + } + + @Override + public FacesContext getFacesContext(Object context, Object request, Object response, Lifecycle lifecycle) + throws FacesException { + if (JsfRuntimeInformation.isPortletContext(context)) { + return new PortletFacesContextImpl((PortletContext) context, (PortletRequest) request, + (PortletResponse) response); + } + return this.factory.getFacesContext(context, request, response, lifecycle); + } +} diff --git a/spring-faces/src/main/resources/META-INF/faces-config.xml b/spring-faces/src/main/resources/META-INF/faces-config.xml index dd991be1..5db86ebd 100644 --- a/spring-faces/src/main/resources/META-INF/faces-config.xml +++ b/spring-faces/src/main/resources/META-INF/faces-config.xml @@ -4,7 +4,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" version="2.0"> - + org.springframework.faces.webflow.FlowActionListener org.springframework.faces.model.SelectionTrackingActionListener @@ -13,12 +13,13 @@ org.springframework.faces.webflow.FlowApplicationFactory + org.springframework.faces.webflow.context.portlet.PortletFacesContextFactory org.springframework.faces.support.RequestLoggingPhaseListener - + HTML_BASIC org.springframework.faces.webflow.FlowRenderKit