1 4 package org.roller.presentation.filters; 5 6 import org.apache.commons.lang.StringUtils; 7 import org.apache.commons.logging.Log; 8 import org.apache.commons.logging.LogFactory; 9 import org.roller.RollerException; 10 import org.roller.model.Roller; 11 import org.roller.model.WeblogManager; 12 import org.roller.pojos.UserData; 13 import org.roller.presentation.RollerContext; 14 import org.roller.presentation.RollerRequest; 15 import org.roller.util.LRUCache2; 16 17 import java.io.IOException ; 18 import java.text.SimpleDateFormat ; 19 import java.util.Date ; 20 21 import javax.servlet.Filter ; 22 import javax.servlet.FilterChain ; 23 import javax.servlet.FilterConfig ; 24 import javax.servlet.ServletException ; 25 import javax.servlet.ServletRequest ; 26 import javax.servlet.ServletResponse ; 27 import javax.servlet.http.HttpServletRequest ; 28 import javax.servlet.http.HttpServletResponse ; 29 import org.roller.config.RollerConfig; 30 31 47 public class IfModifiedFilter implements Filter 48 { 49 private static Log mLogger = 50 LogFactory.getFactory().getInstance(IfModifiedFilter.class); 51 52 private static int mCacheSize = 300; 54 private static int mCacheTime = 1800; 55 private static LRUCache2 mDateCache = null; 56 SimpleDateFormat dateFormatter = 57 new SimpleDateFormat ("EEE MMM d HH:mm:ss z yyyy"); 58 59 public IfModifiedFilter() 60 { 61 super(); 62 } 63 64 67 public void init(FilterConfig filterConfig) throws ServletException 68 { 69 mLogger.debug("Initializing IfModified Filter"); 70 71 String cacheSizeString = RollerConfig.getProperty("cache.filter.ifmodified.size"); 72 String cacheTimeString = RollerConfig.getProperty("cache.filter.ifmodified.timeout"); 73 74 try 75 { 76 if (cacheSizeString != null) mCacheSize = Integer.parseInt(cacheSizeString); 77 } 78 catch (Throwable e) 79 { 80 mLogger.warn("ERROR parsing cache size"); 81 } 82 try 83 { 84 if (cacheTimeString != null) mCacheTime = Integer.parseInt(cacheTimeString); 85 } 86 catch (Throwable e) 87 { 88 mLogger.warn("ERROR parsing cache time"); 89 } 90 91 mLogger.info("cache size is: "+mCacheSize); 92 mLogger.info("cache timeout is: "+mCacheTime); 93 94 mDateCache = new LRUCache2(mCacheSize, mCacheTime*60*1000); 95 } 96 97 101 private static LRUCache2 getCache() 102 { 103 if (mDateCache == null) 104 { 105 mDateCache = new LRUCache2(mCacheSize, mCacheTime*60*1000); 106 } 107 return mDateCache; 108 } 109 110 116 public void doFilter( 117 ServletRequest req, 118 ServletResponse res, 119 FilterChain chain) 120 throws IOException , ServletException 121 { 122 HttpServletRequest request = (HttpServletRequest ) req; 123 HttpServletResponse response = (HttpServletResponse ) res; 124 125 Date updateTime = null; 126 try 127 { 128 updateTime = getLastPublishedDate(request); 129 130 request.setAttribute("updateTime", updateTime); 132 133 Date sinceDate = 135 new Date (request.getDateHeader("If-Modified-Since")); 136 137 if (updateTime != null) 138 { 139 String date = dateFormatter.format(updateTime); 141 updateTime = new Date (date); 142 if (updateTime.compareTo(sinceDate) <= 0) 143 { 144 response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); 145 return; 146 } 147 } 148 mLogger.debug("Not returning 304 for: "+request.getRequestURI()); 149 } 150 catch (RollerException e) 151 { 152 response.setStatus(HttpServletResponse.SC_BAD_REQUEST); 154 return; 155 } 156 catch (IllegalArgumentException e) 157 { 158 } 162 163 if (updateTime != null) 165 { 166 response.setDateHeader("Last-Modified", updateTime.getTime()); 167 } 168 169 chain.doFilter(request, response); 170 } 171 172 public static Date getLastPublishedDate(HttpServletRequest request) 173 throws RollerException 174 { 175 String userName = null; 177 String pathInfo = request.getPathInfo(); 178 pathInfo = pathInfo != null ? pathInfo : ""; 179 String [] pathInfoArray = StringUtils.split(pathInfo, "/"); 180 if (pathInfoArray.length == 1) 181 { 182 userName = pathInfoArray[0]; 183 } 184 else if (pathInfoArray.length > 1) 185 { 186 return null; 188 } 189 190 String catname = 192 request.getParameter(RollerRequest.WEBLOGCATEGORYNAME_KEY); 193 194 StringBuffer sb = new StringBuffer (); 196 sb.append("zzz_"); 197 sb.append(userName); 198 sb.append("_zzz_"); 199 sb.append(catname); 200 String key = sb.toString(); 201 202 Date updateTime = (Date )getCache().get(key); 203 if (updateTime == null) 204 { 205 mLogger.debug("Hitting database for update time: "+key); 206 Roller roller = RollerContext.getRoller(request); 207 WeblogManager wmgr = roller.getWeblogManager(); 208 updateTime = wmgr.getWeblogLastPublishTime(userName, catname); 209 getCache().put(key, updateTime); 210 } 211 return updateTime; 212 } 213 214 public static void purgeDateCache(UserData user) 215 { 216 String userName = (user != null) ? user.getUserName() : null; 217 StringBuffer sb = new StringBuffer (); 218 sb.append("zzz_"); 219 sb.append(userName); 220 sb.append("_zzz_"); 221 getCache().purge(new String [] {sb.toString()}); 222 } 223 224 227 public void destroy() 228 { 229 } 230 } 231 | Popular Tags |