/* vim: set ts=2 et sw=2 cindent fo=qroca: */
package com.globant.katari.core.web;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.commons.lang.Validate;
/** A wrapper filter that can enable or disable a wrapped filter at
* configuration time.
*/
public class OptionalFilter implements Filter {
/** The class logger.
*/
private static Logger log = LoggerFactory.getLogger(OptionalFilter.class);
/** The filter to enable or disable.
*
* It is never null.
*/
private Filter targetFilter;
/** Defines if the filter is enabled or not.
*/
private boolean enabled;
/** Constructor that wraps the filter to enable or disable.
*
* @param filter The target filter that will be enabled or disabled. It
* cannot be null.
*
* @param isEnabled if true, it enables the filter, if false, it disables it.
*/
public OptionalFilter(final Filter filter, final boolean isEnabled) {
Validate.notNull(filter, "The target filter cannot be null.");
targetFilter = filter;
enabled = isEnabled;
}
/** Initializes the filter if enabled.
*
* @param filterConfig The provided filter configuration.
*
* @throws ServletException in case of error.
*/
public void init(final FilterConfig filterConfig) throws ServletException {
log.trace("Entering init");
if (enabled) {
targetFilter.init(filterConfig);
}
log.trace("Leaving init");
}
/** {@inheritDoc}
*
* Passes the request to the target filter only if enabled.
*/
public void doFilter(final ServletRequest request, final ServletResponse
response, final FilterChain chain) throws IOException,
ServletException {
log.trace("Entering doFilter.");
if (enabled) {
targetFilter.doFilter(request, response, chain);
} else {
chain.doFilter(request, response);
}
log.trace("Leaving doFilter.");
}
/** Destroys the target filter only if enabled.
*/
public void destroy() {
log.trace("Entering destroy");
if (enabled) {
targetFilter.destroy();
}
log.trace("Leaving destroy");
}
}