AddressFilter.java

package com.ziesemer.utils.web.addressFilter;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

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 com.ziesemer.utils.web.addressFilter.actions.IAction;

/**
 * @author Mark A. Ziesemer
 * 	<a href="http://www.ziesemer.com.">&lt;www.ziesemer.com&gt;</a>
 */
public class AddressFilter implements Filter{
	
	protected static final Logger LOGGER = LoggerFactory.getLogger(AddressFilter.class);
	
	// Cache for performance
	protected String filterName;
	
	protected final List<AddressGroup> groups = new LinkedList<AddressGroup>();
	protected final List<IAction> defaultActions = new LinkedList<IAction>();
	
	public void init(final FilterConfig config) throws ServletException{
		filterName = config.getFilterName();
	}
	
	public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain)
			throws IOException, ServletException{
		LOGGER.debug("({}) Request from: {}", filterName, request.getRemoteAddr());
		
		final FilterState fs = new FilterState(filterName);
		
		try{
			for(final AddressGroup group : groups){
				group.run(request, response, fs);
				if(!fs.getContinueFilter()){
					break;
				}
			}
			if(fs.getContinueFilter()){
				for(final IAction action : defaultActions){
					action.run(request, response, fs, "(DefaultActions)");
				}
			}
		}catch(final Exception ex){
			fs.setDoChain(false);
			LOGGER.error("({}) Error running filter: {}",
				filterName, ex, ex);
		}
		
		if(fs.getDoChain()){
			chain.doFilter(request, response);
		}
	}
	
	public void destroy(){
		// Nothing to do.
	}
	
}