1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.monitoring.web.servlet;
18
19 import org.apache.commons.monitoring.Role;
20 import org.apache.commons.monitoring.counters.Counter;
21 import org.apache.commons.monitoring.repositories.Repository;
22 import org.apache.commons.monitoring.stopwatches.StopWatch;
23
24 import javax.servlet.Filter;
25 import javax.servlet.FilterChain;
26 import javax.servlet.FilterConfig;
27 import javax.servlet.ServletException;
28 import javax.servlet.ServletRequest;
29 import javax.servlet.ServletResponse;
30 import javax.servlet.http.HttpServletRequest;
31 import javax.servlet.http.HttpServletResponse;
32 import java.io.IOException;
33
34 public class MonitoringFilter implements Filter {
35 @Override
36 public void init(final FilterConfig filterConfig) throws ServletException {
37
38 }
39
40 @Override
41 public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
42 if (HttpServletRequest.class.isInstance(request)) {
43 final HttpServletRequest httpRequest = HttpServletRequest.class.cast(request);
44 final HttpServletResponse httpResponse = HttpServletResponse.class.cast(response);
45 doFilter(httpRequest, httpResponse, chain);
46 } else {
47
48 chain.doFilter(request, response);
49 }
50 }
51
52 @Override
53 public void destroy() {
54
55 }
56
57 protected void doFilter(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) throws IOException, ServletException {
58 final String uri = getRequestedUri(request);
59 final StopWatch stopWatch = Repository.INSTANCE.start(Repository.INSTANCE.getCounter(new Counter.Key(Role.WEB, uri)));
60 try {
61 chain.doFilter(request, response);
62 } finally {
63 stopWatch.stop();
64 }
65 }
66
67 protected String getRequestedUri(final HttpServletRequest request) {
68 final String uri = request.getRequestURI();
69 final String context = request.getContextPath();
70 return uri.substring(context.length());
71 }
72 }