blob: aecfe9290a887e29e9695f298bf85cde2f41c0df [file] [log] [blame]
/*
* $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;
}
}