Projekt von de.halbekunst.juplo nach de.juplo verschoben und aufgeräumt
[percentcodec] / accelerator / src / main / java / de / juplo / accelerator / CacheControlInterceptor.java
diff --git a/accelerator/src/main/java/de/juplo/accelerator/CacheControlInterceptor.java b/accelerator/src/main/java/de/juplo/accelerator/CacheControlInterceptor.java
new file mode 100644 (file)
index 0000000..10aaee1
--- /dev/null
@@ -0,0 +1,83 @@
+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;
+  }
+}