| /* |
| * $Id$ |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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.apache.struts2.jsf; |
| |
| import javax.faces.context.FacesContext; |
| import javax.faces.event.PhaseEvent; |
| import javax.faces.event.PhaseId; |
| import javax.faces.event.PhaseListener; |
| import javax.faces.lifecycle.Lifecycle; |
| |
| import com.opensymphony.xwork2.ActionContext; |
| import com.opensymphony.xwork2.util.logging.Logger; |
| import com.opensymphony.xwork2.util.logging.LoggerFactory; |
| |
| /** |
| * Provides common lifecycle phase methods needed by interceptors and results. |
| */ |
| public class FacesSupport { |
| |
| private static final String LIFECYCLE_KEY = "lifecycle"; |
| |
| /** Log instance for each class */ |
| protected Logger log; |
| |
| /** |
| * Marker key for the ActionContext to dictate whether to treat the request |
| * as a JSF faces request and therefore process the Faces phases |
| */ |
| protected static final String FACES_ENABLED = "facesEnabled"; |
| |
| /** Initializes log instance for the instance object */ |
| protected FacesSupport() { |
| log = LoggerFactory.getLogger(getClass()); |
| } |
| |
| /** |
| * Gets the shared lifecycle for this request |
| * |
| * @return The lifecycle |
| */ |
| private Lifecycle getLifecycle() { |
| return (Lifecycle) ActionContext.getContext().get(LIFECYCLE_KEY); |
| } |
| |
| /** |
| * Sets the lifecycle for this request |
| * |
| * @param lifecycle |
| * The lifecycle |
| */ |
| protected void setLifecycle(Lifecycle lifecycle) { |
| ActionContext.getContext().put(LIFECYCLE_KEY, lifecycle); |
| } |
| |
| /** |
| * Informs phase listeners before a phase is executed |
| * |
| * @param facesContext |
| * The current faces context |
| * @param phaseId |
| * The phase id about to be executed |
| */ |
| protected void informPhaseListenersBefore(FacesContext facesContext, |
| PhaseId phaseId) { |
| Lifecycle lifecycle = getLifecycle(); |
| PhaseListener[] phaseListeners = lifecycle.getPhaseListeners(); |
| for (int i = 0; i < phaseListeners.length; i++) { |
| PhaseListener phaseListener = phaseListeners[i]; |
| int listenerPhaseId = phaseListener.getPhaseId().getOrdinal(); |
| if (listenerPhaseId == PhaseId.ANY_PHASE.getOrdinal() |
| || listenerPhaseId == phaseId.getOrdinal()) { |
| phaseListener.beforePhase(new PhaseEvent(FacesContext |
| .getCurrentInstance(), phaseId, lifecycle)); |
| } |
| } |
| |
| } |
| |
| /** |
| * Informs phase listeners after a phase is executed |
| * |
| * @param facesContext |
| * The current faces context |
| * @param phaseId |
| * The phase id that was executed |
| */ |
| protected void informPhaseListenersAfter(FacesContext facesContext, |
| PhaseId phaseId) { |
| Lifecycle lifecycle = getLifecycle(); |
| PhaseListener[] phaseListeners = lifecycle.getPhaseListeners(); |
| for (int i = 0; i < phaseListeners.length; i++) { |
| PhaseListener phaseListener = phaseListeners[i]; |
| int listenerPhaseId = phaseListener.getPhaseId().getOrdinal(); |
| if (listenerPhaseId == PhaseId.ANY_PHASE.getOrdinal() |
| || listenerPhaseId == phaseId.getOrdinal()) { |
| phaseListener.afterPhase(new PhaseEvent(FacesContext |
| .getCurrentInstance(), phaseId, lifecycle)); |
| } |
| } |
| |
| } |
| |
| /** |
| * Checks to see if the response has been completed. Mainly used for better |
| * debugging messages. |
| * |
| * @param facesContext |
| * The current faces context |
| * @param phase |
| * The phase id in execution |
| * @param before |
| * Whether the phase has been executed or not |
| * @return True if the response is complete |
| */ |
| protected boolean isResponseComplete(FacesContext facesContext, |
| String phase, boolean before) { |
| boolean flag = false; |
| if (facesContext.getResponseComplete()) { |
| if (log.isDebugEnabled()) |
| log |
| .debug("exiting from lifecycle.execute in " |
| + phase |
| + " because getResponseComplete is true from one of the " |
| + (before ? "before" : "after") + " listeners"); |
| flag = true; |
| } |
| return flag; |
| } |
| |
| /** |
| * Checks to see the render phase should be executed next. Mainly used for |
| * better debugging messages. |
| * |
| * @param facesContext |
| * The current faces context |
| * @param phase |
| * The phase id in execution |
| * @param before |
| * Whether the phase has been executed or not |
| * @return True if the response is complete |
| */ |
| protected boolean shouldRenderResponse(FacesContext facesContext, |
| String phase, boolean before) { |
| boolean flag = false; |
| if (facesContext.getRenderResponse()) { |
| if (log.isDebugEnabled()) |
| log.debug("exiting from lifecycle.execute in " + phase |
| + " because getRenderResponse is true from one of the " |
| + (before ? "before" : "after") + " listeners"); |
| flag = true; |
| } |
| return flag; |
| } |
| } |