1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.cms.filters;
35
36 import info.magnolia.context.Context;
37 import info.magnolia.context.MgnlContext;
38 import info.magnolia.context.WebContext;
39
40 import java.io.IOException;
41
42 import javax.servlet.FilterChain;
43 import javax.servlet.ServletException;
44 import javax.servlet.ServletRequest;
45 import javax.servlet.ServletResponse;
46 import javax.servlet.http.HttpServletRequest;
47 import javax.servlet.http.HttpServletResponse;
48
49
50
51
52
53
54
55 public class MgnlFilterChain implements FilterChain {
56
57 private MgnlFilter[] filters;
58
59 private int position;
60
61 private FilterChain originalChain;
62
63 public MgnlFilterChain(FilterChain originalChain, MgnlFilter[] filters) {
64 this.filters = filters;
65 this.originalChain = originalChain;
66 }
67
68 public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
69 Context ctx = MgnlContext.hasInstance() ? MgnlContext.getInstance() : null;
70 boolean updateCtx = ctx instanceof WebContext && request instanceof HttpServletRequest && response instanceof HttpServletResponse;
71 if (updateCtx) {
72 ((WebContext) ctx).push((HttpServletRequest) request, (HttpServletResponse) response);
73 }
74 try {
75 if (position == filters.length) {
76 originalChain.doFilter(request, response);
77 }
78 else {
79 position++;
80 MgnlFilter filter = filters[position - 1];
81 if (filter.matches((HttpServletRequest)request)) {
82 filter.doFilter(request, response, this);
83 } else {
84 doFilter(request, response);
85 }
86 }
87 } finally {
88 if (updateCtx) {
89 ((WebContext) ctx).pop();
90 }
91 }
92 }
93
94 public void reset() {
95 position = 0;
96 }
97 }