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 public class MgnlFilterChain implements FilterChain {
53
54 private MgnlFilter[] filters;
55
56 private int position;
57
58 private FilterChain originalChain;
59
60 public MgnlFilterChain(FilterChain originalChain, MgnlFilter[] filters) {
61 this.filters = filters;
62 this.originalChain = originalChain;
63 }
64
65 @Override
66 public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
67 Context ctx = MgnlContext.hasInstance() ? MgnlContext.getInstance() : null;
68 boolean updateCtx = ctx instanceof WebContext && request instanceof HttpServletRequest && response instanceof HttpServletResponse;
69 if (updateCtx) {
70 ((WebContext) ctx).push((HttpServletRequest) request, (HttpServletResponse) response);
71 }
72 try {
73 if (position == filters.length) {
74 originalChain.doFilter(request, response);
75 } else {
76 position++;
77 MgnlFilter filter = filters[position - 1];
78 if (filter.matches((HttpServletRequest) request)) {
79 filter.doFilter(request, response, this);
80 } else {
81 doFilter(request, response);
82 }
83 }
84 } finally {
85 if (updateCtx) {
86 ((WebContext) ctx).pop();
87 }
88 }
89 }
90
91 public void reset() {
92 position = 0;
93 }
94 }