001 package org.tynamo.security.services.impl;
002
003 import java.util.ArrayList;
004 import java.util.List;
005
006 import javax.servlet.Filter;
007
008 import org.apache.tapestry5.ioc.services.PipelineBuilder;
009 import org.apache.tapestry5.services.HttpServletRequestFilter;
010 import org.apache.tapestry5.services.HttpServletRequestHandler;
011 import org.slf4j.Logger;
012 import org.tynamo.security.shiro.AccessControlFilter;
013
014 public class SecurityFilterChain {
015 private String path;
016
017 private HttpServletRequestHandler handler;
018
019 public SecurityFilterChain(String path, HttpServletRequestHandler handler) {
020 this.path = path;
021 this.handler = handler;
022 }
023
024 public HttpServletRequestHandler getHandler() {
025 return handler;
026 }
027
028 public String getPath() {
029 return path;
030 }
031
032 public static class Builder {
033 PipelineBuilder pipelineBuilder;
034 String path;
035 private List<HttpServletRequestFilter> filters = new ArrayList<HttpServletRequestFilter>();
036 private Logger logger;
037
038 public Builder (Logger logger, PipelineBuilder pipelineBuilder, String path) {
039 this.logger = logger;
040 this.pipelineBuilder = pipelineBuilder;
041 this.path = path;
042 }
043
044 public Builder add(Class<HttpServletRequestFilter> filterType) {
045 try {
046 filters.add(filterType.newInstance());
047 } catch (InstantiationException e) {
048 throw new RuntimeException("Couldn't instantiate a filter while building a security chain for path '" + path + "': ", e);
049 } catch (IllegalAccessException e) {
050 throw new RuntimeException("Couldn't instantiate a filter while building a security chain for path '" + path + "': ", e);
051 }
052 return this;
053 }
054
055 public Builder add(Filter filter) {
056 if (filter instanceof AccessControlFilter) add((AccessControlFilter)filter, null);
057 else filters.add(new HttpServletRequestFilterWrapper(filter));
058 return this;
059 }
060
061 public Builder add(AccessControlFilter filter, String config) {
062 filter.addConfig(config);
063 filters.add(new HttpServletRequestFilterWrapper(filter));
064 return this;
065 }
066
067
068 public SecurityFilterChain build() {
069 return new SecurityFilterChain(path, pipelineBuilder.build(logger, HttpServletRequestHandler.class, HttpServletRequestFilter.class, filters));
070 }
071
072 }
073 }