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    }