--- /dev/null
+package de.juplo.accelerator;
+
+import de.juplo.accelerator.AcceleratorFilter.AccelerationWrapper;
+import de.juplo.accelerator.annotations.Cacheable;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+/**
+ *
+ * @author kai
+ */
+public class CacheControlInterceptor implements HandlerInterceptor {
+ private final static Logger log = LoggerFactory.getLogger(CacheControlInterceptor.class);
+
+
+ private CacheControl cacheControl;
+
+
+ @Override
+ public boolean preHandle(
+ HttpServletRequest request,
+ HttpServletResponse response,
+ Object handler
+ ) throws Exception
+ {
+ Cacheable cacheable = handler.getClass().getAnnotation(Cacheable.class);
+ if (cacheable == null) {
+ /** Der Handler ist nicht mit @Cacheable annotiert: keine Dekorationen anbringen! */
+ return true;
+ }
+
+ AccelerationWrapper wrapper = (AccelerationWrapper)request.getAttribute(AcceleratorFilter.RESPONSE_WRAPPER);
+ if (wrapper != null)
+ wrapper.supressGuessing();
+
+ /** CacheControll initialisieren (Handler nach annotierte Methoden scannen etc.) */
+ cacheControl.init(handler, wrapper);
+
+ if (cacheable.eager()) {
+ return cacheControl.decorate(request, response);
+ }
+ else {
+ return true;
+ }
+ }
+
+ @Override
+ public void postHandle(
+ HttpServletRequest request,
+ HttpServletResponse response,
+ Object handler,
+ ModelAndView modelAndView
+ ) throws Exception
+ {
+ /**
+ * Dekoration nur dann anstossen, wenn sie nicht bereits von dem
+ * AcceleratorFilter ausgelöst wird.
+ */
+ if (request.getAttribute(AcceleratorFilter.RESPONSE_WRAPPER) == null)
+ cacheControl.decorate(request, response);
+ }
+
+ @Override
+ public void afterCompletion(
+ HttpServletRequest request,
+ HttpServletResponse response,
+ Object handler, Exception ex
+ ) throws Exception
+ {
+ cacheControl.release();
+ }
+
+
+ @Autowired
+ public void setCacheControl(CacheControl cacheControl) {
+ this.cacheControl = cacheControl;
+ }
+}