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 @Override
69 public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
70 Context ctx = MgnlContext.hasInstance() ? MgnlContext.getInstance() : null;
71 boolean updateCtx = ctx instanceof WebContext && request instanceof HttpServletRequest && response instanceof HttpServletResponse;
72 if (updateCtx) {
73 ((WebContext) ctx).push((HttpServletRequest) request, (HttpServletResponse) response);
74 }
75 try {
76 if (position == filters.length) {
77 originalChain.doFilter(request, response);
78 }
79 else {
80 position++;
81 MgnlFilter filter = filters[position - 1];
82 if (filter.matches((HttpServletRequest)request)) {
83 filter.doFilter(request, response, this);
84 } else {
85 doFilter(request, response);
86 }
87 }
88 } finally {
89 if (updateCtx) {
90 ((WebContext) ctx).pop();
91 }
92 }
93 }
94
95 public void reset() {
96 position = 0;
97 }
98 }