| 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 ; 10 import java.util.Date ; 11 import java.util.HashSet ; 12 13 public class CacheControlledServer implements Server { 14 private static final Date ExpirationDate = new Date (System.currentTimeMillis() + 2629743830l); 15 private static final Collection cache = new HashSet (); 16 private static final Date StartupTime = new Date (); 17 private Server server; 18 private boolean served; 19 20 public CacheControlledServer(Server server) { 21 this.server = server; 22 } 24 25 public void service(Request request) throws Exception { 26 if (served) { 27 if (cache.contains(request.getHeader("If-None-Match"))) { 32 request.respondWith(new NotModifiedHandler(ExpirationDate)); 33 } else { 34 try { 35 Date 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 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 { 63 request.respondWith(new ResponseHandler() { 64 public void respond(Response response) throws Exception { 65 String eTag = String.valueOf(Math.abs(request.getURI().hashCode())); 66 cache.add(eTag); 67 response.setHeader("ETag", eTag); 68 response.setHeader("Cache-Control", new String []{"private", "max-age=86400"}); 69 response.setHeader("Last-Modified", StartupTime); 70 handler.respond(response); 71 } 72 }); 73 } 74 } 75 } 76 | Popular Tags |