1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.shiro.guice.web;
20
21 import java.util.Arrays;
22 import java.util.Iterator;
23 import java.util.Map;
24
25 import javax.servlet.Filter;
26 import javax.servlet.FilterChain;
27 import javax.servlet.ServletRequest;
28 import javax.servlet.ServletResponse;
29
30 import com.google.inject.Injector;
31 import com.google.inject.Key;
32
33 import org.apache.shiro.util.PatternMatcher;
34 import org.apache.shiro.web.filter.mgt.FilterChainResolver;
35 import org.apache.shiro.web.util.WebUtils;
36
37 class SimpleFilterChainResolver implements FilterChainResolver {
38 private final Map<String, Key<? extends Filter>[]> chains;
39 private final Injector injector;
40 private final PatternMatcher patternMatcher;
41
42 SimpleFilterChainResolver(Map<String, Key<? extends Filter>[]> chains, Injector injector, PatternMatcher patternMatcher) {
43 this.chains = chains;
44 this.injector = injector;
45 this.patternMatcher = patternMatcher;
46 }
47
48 public FilterChain getChain(ServletRequest request, ServletResponse response, final FilterChain originalChain) {
49 String path = WebUtils.getPathWithinApplication(WebUtils.toHttp(request));
50 for (final String pathPattern : chains.keySet()) {
51 if (patternMatcher.matches(pathPattern, path)) {
52 final Iterator<Key<? extends Filter>> chain = Arrays.asList(chains.get(pathPattern)).iterator();
53 return new SimpleFilterChain(originalChain, new Iterator<Filter>() {
54 public boolean hasNext() {
55 return chain.hasNext();
56 }
57
58 public Filter next() {
59 return injector.getInstance(chain.next());
60 }
61
62 public void remove() {
63 throw new UnsupportedOperationException();
64 }
65 });
66 }
67 }
68 return null;
69 }
70
71 }