1 24 package org.jresearch.gossip.filters.cache; 25 26 import java.io.File ; 27 import java.io.FileInputStream ; 28 import java.io.FileOutputStream ; 29 import java.io.IOException ; 30 import java.io.StringWriter ; 31 import java.util.Calendar ; 32 import java.util.Enumeration ; 33 import java.util.Locale ; 34 35 import javax.servlet.Filter ; 36 import javax.servlet.FilterChain ; 37 import javax.servlet.FilterConfig ; 38 import javax.servlet.ServletContext ; 39 import javax.servlet.ServletException ; 40 import javax.servlet.ServletOutputStream ; 41 import javax.servlet.ServletRequest ; 42 import javax.servlet.ServletResponse ; 43 import javax.servlet.http.HttpServletRequest ; 44 import javax.servlet.http.HttpServletResponse ; 45 46 import org.jresearch.gossip.IConst; 47 import org.jresearch.gossip.beans.user.User; 48 49 public class CacheFilter implements Filter { 50 51 ServletContext sc; 52 53 FilterConfig fc; 54 55 long cacheTimeout = Long.MAX_VALUE; 56 57 public void doFilter(ServletRequest req, ServletResponse res, 58 FilterChain chain) throws IOException , ServletException { 59 HttpServletRequest request = (HttpServletRequest ) req; 60 HttpServletResponse response = (HttpServletResponse ) res; 61 62 String uri = request.getRequestURI(); 64 if (uri == null || uri.equals("") || uri.equals("/")) { 65 chain.doFilter(request, response); 66 return; 67 } 68 String r = sc.getRealPath(""); 70 String path = fc.getInitParameter(uri); 71 if (path != null && path.equals("nocache")) { 72 chain.doFilter(request, response); 73 return; 74 } 75 path = r + path; 76 77 String id = request.getRequestURI() 79 + request.getQueryString() 80 + "__" 81 + ((User) request.getSession().getAttribute( 82 IConst.SESSION.USER_KEY)).getName(); 83 String localeSensitive = fc.getInitParameter("locale-sensitive"); 85 if (localeSensitive != null) { 86 StringWriter ldata = new StringWriter (); 87 Enumeration locales = request.getLocales(); 88 while (locales.hasMoreElements()) { 89 Locale locale = (Locale ) locales.nextElement(); 90 ldata.write(locale.getISO3Language()); 91 } 92 id = id + ldata.toString(); 93 } 94 File tempDir = (File ) sc.getAttribute("javax.servlet.context.tempdir"); 95 96 String temp = tempDir.getAbsolutePath(); 98 System.out.println(temp); 99 File file = new File (temp + id); 100 101 if (path == null) { 103 path = sc.getRealPath(request.getRequestURI()); 104 } 105 File current = new File (path); 106 107 try { 108 long now = Calendar.getInstance().getTimeInMillis(); 109 if (!file.exists() 111 || (file.exists() && current.lastModified() > file 112 .lastModified()) 113 || cacheTimeout < now - file.lastModified()) { 114 String name = file.getAbsolutePath(); 115 116 name = name.substring(0, 117 name.lastIndexOf(File.separatorChar) == -1 ? 0 : name 118 .lastIndexOf(File.separatorChar)); 119 new File (name).mkdirs(); 120 121 FileOutputStream fos = new FileOutputStream (file); 122 CacheResponseWrapper wrappedResponse = new CacheResponseWrapper( 123 response, fos); 124 chain.doFilter(req, wrappedResponse); 125 126 fos.flush(); 127 fos.close(); 128 } 129 } catch (ServletException e) { 130 if (!file.exists()) { 131 throw new ServletException (e); 132 } 133 } catch (IOException e) { 134 if (!file.exists()) { 135 throw e; 136 } 137 } 138 139 FileInputStream fis = new FileInputStream (file); 140 String mt = sc.getMimeType(request.getRequestURI()); 141 response.setContentType(mt); 142 ServletOutputStream sos = res.getOutputStream(); 143 for (int i = fis.read(); i != -1; i = fis.read()) { 144 sos.write((byte) i); 145 } 146 } 147 148 public void init(FilterConfig filterConfig) { 149 this.fc = filterConfig; 150 String ct = fc.getInitParameter("cacheTimeout"); 152 if (ct != null) { 153 cacheTimeout = 60 * 1000 * Long.parseLong(ct); 154 } 155 this.sc = filterConfig.getServletContext(); 157 } 158 159 public void destroy() { 160 this.sc = null; 161 this.fc = null; 162 } 163 } | Popular Tags |