04c6dbd97f95a09dee8b3f43cb40411095f7ee43
[percentcodec] / cachecontrol / src / main / java / de / halbekunst / juplo / cachecontrol / CacheControlInterceptor.java
1 package de.halbekunst.juplo.cachecontrol;
2
3 import de.halbekunst.juplo.cachecontrol.AcceleratorFilter.AccelerationWrapper;
4 import de.halbekunst.juplo.cachecontrol.annotations.Cacheable;
5 import javax.servlet.http.HttpServletRequest;
6 import javax.servlet.http.HttpServletResponse;
7 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory;
9 import org.springframework.beans.factory.annotation.Autowired;
10 import org.springframework.web.servlet.HandlerInterceptor;
11 import org.springframework.web.servlet.ModelAndView;
12
13 /**
14  *
15  * @author kai
16  */
17 public class CacheControlInterceptor implements HandlerInterceptor {
18   private final static Logger log = LoggerFactory.getLogger(CacheControlInterceptor.class);
19
20
21   private CacheControl cacheControl;
22
23
24   @Override
25   public boolean preHandle(
26       HttpServletRequest request,
27       HttpServletResponse response,
28       Object handler
29       ) throws Exception
30   {
31     Cacheable cacheable = handler.getClass().getAnnotation(Cacheable.class);
32     if (cacheable == null) {
33       /** Der Handler ist nicht mit @Cacheable annotiert: keine Dekorationen anbringen! */
34       return true;
35     }
36
37     /** CacheControll initialisieren (Handler nach annotierte Methoden scannen etc.) */
38     cacheControl.init(handler);
39
40     AccelerationWrapper wrapper = (AccelerationWrapper)request.getAttribute(AcceleratorFilter.RESPONSE_WRAPPER);
41     if (wrapper != null) {
42       wrapper.guessingFinished();
43       if (log.isInfoEnabled()) {
44         StringBuilder builder = new StringBuilder();
45         builder.append("request should not be filtered, because it is intercepted: ");
46         builder.append(request.getRequestURI());
47         if (request.getQueryString() == null) {
48           builder.append ("?");
49           builder.append(request.getQueryString());
50         }
51         log.info(builder.toString());
52       }
53     }
54
55     if (cacheable.eager()) {
56       return cacheControl.decorate(request, response, handler);
57     }
58     else {
59       return true;
60     }
61   }
62
63   @Override
64   public void postHandle(
65       HttpServletRequest request,
66       HttpServletResponse response,
67       Object handler,
68       ModelAndView modelAndView
69       ) throws Exception
70   {
71     cacheControl.decorate(request, response, handler);
72   }
73
74   @Override
75   public void afterCompletion(
76       HttpServletRequest request,
77       HttpServletResponse response,
78       Object handler, Exception ex
79       ) throws Exception
80   {
81     cacheControl.release();
82   }
83
84
85   @Autowired
86   public void setCacheControl(CacheControl cacheControl) {
87     this.cacheControl = cacheControl;
88   }
89 }