be28e0ea1b6bad74508766936d8651a38dbf55d4
[percentcodec] / cachecontrol / src / main / java / de / halbekunst / juplo / cachecontrol / annotations / LastModified.java
1 package de.halbekunst.juplo.cachecontrol.annotations;
2
3 import java.lang.annotation.ElementType;
4 import java.lang.annotation.Retention;
5 import java.lang.annotation.RetentionPolicy;
6 import java.lang.annotation.Target;
7 import javax.servlet.http.HttpServlet;
8 import javax.servlet.http.HttpServletRequest;
9
10 /**
11  * Über diese Annotation kann der Inhalt des <code>Last-Modified</code>-Headers
12  * gesteuert werden.
13  * Mit dieser Annotation können Klassen oder Methoden merkiert werden.
14  * <p>
15  * Wenn eine Methode annotiert wird, muss diese eine Instanz von
16  * {@link HttpServletRequest} als (einziges!) Argument akzeptieren und einen
17  * Wert liefern, der sich nach <code>long</code> casten lässt.
18  * Die Signatur der Methode entspricht der Methode
19  * {@link HttpServlet#getLastModified(javax.servlet.http.HttpServletRequest)}
20  * aus dem <code>HttpServlet</code>-Interface.
21  * Um das Cache-Verhalten ein existierendes Servlet, das diese Methode bereits
22  * implementiert, mit Juplo-CacheControll zu verbessern, kann als erste
23  * Maßnahme daher einfach diese Methode mit dieser Annotation markiert werden.
24  * <p>
25  * Wenn eine Klasse Annotiert wird, muss der Annotation der Wert für den
26  * <code>Last-Modified</code>-Header übergeben werden.
27  * Da dieser Wert somit statisch ist, macht es nur Sinn, Klassen mit dieser
28  * Annotation zu markieren, die ausschließlich statische Ressourcen ausliefern,
29  * die sich nur mit der Neuinstallation der Webanwendung ändern.
30  * </p>
31  * Über diese Annotation wird der Zeitpunkt gesteuert, zu dem die gelieferte
32  * Ressource zuletzt verändert wurde.
33  * Erwartet wird eine Zeitangabe in Millisekunden seit dem Unix-0-Zeitpunkt,
34  * die dann an {@link HttpServletResponse#setDateHeader(String, long)}
35  * weitergegeben wird.
36  * <p>
37  * <strong>Zu beachten:</strong>
38  * Wenn zugleich die Annotation {@link CacheSeconds} verwendet wird, wird
39  * die mit dieser Annotation markierte Methode nur aufgerufen, wenn die mit
40  * der Annotation {@link CacheSeconds} markierte Methode einen Wert größer
41  * oder gleich <code>0</code> liefert, bzw. für die mit Annotation
42  * {@link CacheSeconds} markierte Klasse eine Cache-Zeit größer oder gleich
43  * <code>0</code> festgelegt wurde.
44  *
45  * @author kai
46  * @see Cacheable
47  * @see CacheSeconds
48  */
49 @Retention(RetentionPolicy.RUNTIME)
50 @Target({ ElementType.TYPE, ElementType.METHOD })
51 public @interface LastModified {
52   long value() default 0;
53 }