KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > icesoft > faces > webapp > http > common > standard > CacheControlledServer


1 package com.icesoft.faces.webapp.http.common.standard;
2
3 import com.icesoft.faces.webapp.http.common.Request;
4 import com.icesoft.faces.webapp.http.common.RequestProxy;
5 import com.icesoft.faces.webapp.http.common.Response;
6 import com.icesoft.faces.webapp.http.common.ResponseHandler;
7 import com.icesoft.faces.webapp.http.common.Server;
8
9 import java.util.Collection JavaDoc;
10 import java.util.Date JavaDoc;
11 import java.util.HashSet JavaDoc;
12
13 public class CacheControlledServer implements Server {
14     private static final Date JavaDoc ExpirationDate = new Date JavaDoc(System.currentTimeMillis() + 2629743830l);
15     private static final Collection JavaDoc cache = new HashSet JavaDoc();
16     private static final Date JavaDoc StartupTime = new Date JavaDoc();
17     private Server server;
18     private boolean served;
19
20     public CacheControlledServer(Server server) {
21         this.server = server;
22         //todo: run a thread to clean up the cache.
23
}
24
25     public void service(Request request) throws Exception JavaDoc {
26         if (served) {
27             //tell to IE to cache these resources
28
//see: http://mir.aculo.us/articles/2005/08/28/internet-explorer-and-ajax-image-caching-woes
29
//see: http://www.bazon.net/mishoo/articles.epl?art_id=958
30
//see: http://support.microsoft.com/default.aspx?scid=kb;en-us;319546
31
if (cache.contains(request.getHeader("If-None-Match"))) {
32                 request.respondWith(new NotModifiedHandler(ExpirationDate));
33             } else {
34                 try {
35                     Date JavaDoc modifiedSince = request.getHeaderAsDate("If-Modified-Since");
36                     if (StartupTime.getTime() - modifiedSince.getTime() > 1000) {
37                         server.service(new EnhancedRequest(request));
38                     } else {
39                         request.respondWith(new NotModifiedHandler(ExpirationDate));
40                     }
41                 } catch (Exception JavaDoc e) {
42                     server.service(new EnhancedRequest(request));
43                 }
44             }
45         } else {
46             server.service(new EnhancedRequest(request));
47             served = true;
48         }
49     }
50
51     public void shutdown() {
52         cache.clear();
53         served = false;
54     }
55
56     private class EnhancedRequest extends RequestProxy {
57
58         public EnhancedRequest(Request request) {
59             super(request);
60         }
61
62         public void respondWith(final ResponseHandler handler) throws Exception JavaDoc {
63             request.respondWith(new ResponseHandler() {
64                 public void respond(Response response) throws Exception JavaDoc {
65                     String JavaDoc eTag = String.valueOf(Math.abs(request.getURI().hashCode()));
66                     cache.add(eTag);
67                     response.setHeader("ETag", eTag);
68                     response.setHeader("Cache-Control", new String JavaDoc[]{"private", "max-age=86400"});
69                     response.setHeader("Last-Modified", StartupTime);
70                     handler.respond(response);
71                 }
72             });
73         }
74     }
75 }
76
Popular Tags