1 package com.atlassian.johnson.filters;
2
3 import com.atlassian.johnson.Johnson;
4 import com.atlassian.johnson.JohnsonEventContainer;
5 import com.atlassian.johnson.config.JohnsonConfig;
6 import com.atlassian.johnson.event.Event;
7 import com.atlassian.johnson.event.RequestEventCheck;
8 import com.atlassian.johnson.setup.SetupConfig;
9 import org.apache.commons.lang.StringUtils;
10
11 import javax.servlet.Filter;
12 import javax.servlet.FilterChain;
13 import javax.servlet.FilterConfig;
14 import javax.servlet.ServletException;
15 import javax.servlet.ServletRequest;
16 import javax.servlet.ServletResponse;
17 import javax.servlet.http.HttpServletRequest;
18 import javax.servlet.http.HttpServletResponse;
19 import java.io.IOException;
20 import java.util.Collection;
21
22
23
24
25 public abstract class AbstractJohnsonFilter implements Filter {
26
27 protected static final String TEXT_XML_UTF8_CONTENT_TYPE = "text/xml;charset=utf-8";
28
29 protected FilterConfig filterConfig;
30 protected JohnsonConfig config;
31
32
33
34
35 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
36 String alreadyFilteredKey = getClass().getName() + "_already_filtered";
37 if (servletRequest.getAttribute(alreadyFilteredKey) != null) {
38 filterChain.doFilter(servletRequest, servletResponse);
39 return;
40 } else {
41 servletRequest.setAttribute(alreadyFilteredKey, Boolean.TRUE);
42 }
43
44 HttpServletRequest request = (HttpServletRequest) servletRequest;
45 HttpServletResponse response = (HttpServletResponse) servletResponse;
46
47
48 String servletPath = getServletPath(request);
49
50
51 JohnsonEventContainer appEventContainer = getContainerAndRunEventChecks(request);
52
53 SetupConfig setup = config.getSetupConfig();
54
55
56 boolean ignoreUri = ignoreURI(servletPath);
57 if (appEventContainer.hasEvents() && !ignoreUri) {
58 handleError(appEventContainer, request, response);
59 }
60
61 else if (!ignoreUri && !setup.isSetup() && !setup.isSetupPage(servletPath)) {
62 handleNotSetup(request, response);
63 } else {
64 filterChain.doFilter(servletRequest, servletResponse);
65 }
66 }
67
68 public void destroy() {
69 }
70
71 public void init(FilterConfig filterConfig) {
72 this.filterConfig = filterConfig;
73
74 config = Johnson.getConfig();
75 }
76
77 protected JohnsonEventContainer getContainerAndRunEventChecks(HttpServletRequest req) {
78
79 JohnsonEventContainer appEventContainer = Johnson.getEventContainer(filterConfig.getServletContext());
80
81 for (RequestEventCheck requestEventCheck : config.getRequestEventChecks()) {
82 requestEventCheck.check(appEventContainer, req);
83 }
84 return appEventContainer;
85 }
86
87
88
89
90
91
92
93
94
95 protected static String getServletPath(HttpServletRequest request) {
96 String servletPath = request.getServletPath();
97 if (StringUtils.isNotEmpty(servletPath)) {
98 return servletPath;
99 }
100
101 String requestUri = request.getRequestURI();
102 int startIndex = request.getContextPath().equals("") ? 0 : request.getContextPath().length();
103 int endIndex = request.getPathInfo() == null ? requestUri.length() : requestUri.lastIndexOf(request.getPathInfo());
104 if (startIndex > endIndex) {
105
106 endIndex = startIndex;
107 }
108
109 return requestUri.substring(startIndex, endIndex);
110 }
111
112 protected String getStringForEvents(Collection<Event> events) {
113 StringBuilder message = new StringBuilder();
114 for (Event event : events) {
115 if (message.length() > 0) {
116 message.append("\n");
117 }
118 message.append(event.getDesc());
119 }
120 return message.toString();
121 }
122
123
124
125
126
127
128
129
130
131
132 protected abstract void handleError(JohnsonEventContainer appEventContainer, HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws IOException;
133
134
135
136
137
138
139
140
141
142 protected abstract void handleNotSetup(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws IOException;
143
144 protected boolean ignoreURI(String uri) {
145 return uri.equalsIgnoreCase(config.getErrorPath()) || config.isIgnoredPath(uri);
146 }
147 }