1 18 19 package org.apache.roller.ui.rendering.servlets; 20 21 import java.io.IOException ; 22 import java.util.HashMap ; 23 import java.util.Map ; 24 import javax.servlet.ServletConfig ; 25 import javax.servlet.ServletException ; 26 import javax.servlet.http.HttpServlet ; 27 import javax.servlet.http.HttpServletRequest ; 28 import javax.servlet.http.HttpServletResponse ; 29 import org.apache.commons.logging.Log; 30 import org.apache.commons.logging.LogFactory; 31 import org.apache.roller.RollerException; 32 import org.apache.roller.config.RollerConfig; 33 import org.apache.roller.config.RollerRuntimeConfig; 34 import org.apache.roller.pojos.StaticTemplate; 35 import org.apache.roller.pojos.Template; 36 import org.apache.roller.pojos.WebsiteData; 37 import org.apache.roller.ui.rendering.util.WeblogFeedRequest; 38 import org.apache.roller.util.cache.CachedContent; 39 import org.apache.roller.ui.rendering.Renderer; 40 import org.apache.roller.ui.rendering.RendererManager; 41 import org.apache.roller.ui.rendering.model.ModelLoader; 42 import org.apache.roller.ui.rendering.util.SiteWideCache; 43 import org.apache.roller.ui.rendering.util.WeblogFeedCache; 44 import org.apache.roller.ui.rendering.util.ModDateHeaderUtil; 45 46 47 53 public class FeedServlet extends HttpServlet { 54 55 private static Log log = LogFactory.getLog(FeedServlet.class); 56 57 private WeblogFeedCache weblogFeedCache = null; 58 private SiteWideCache siteWideCache = null; 59 60 61 64 public void init(ServletConfig servletConfig) throws ServletException { 65 66 super.init(servletConfig); 67 68 log.info("Initializing FeedServlet"); 69 70 this.weblogFeedCache = WeblogFeedCache.getInstance(); 72 73 this.siteWideCache = SiteWideCache.getInstance(); 75 } 76 77 78 81 public void doGet(HttpServletRequest request, HttpServletResponse response) 82 throws ServletException , IOException { 83 84 log.debug("Entering"); 85 86 WebsiteData weblog = null; 87 boolean isSiteWide = false; 88 89 WeblogFeedRequest feedRequest = null; 90 try { 91 feedRequest = new WeblogFeedRequest(request); 93 94 weblog = feedRequest.getWeblog(); 95 if(weblog == null) { 96 throw new RollerException("unable to lookup weblog: "+ 97 feedRequest.getWeblogHandle()); 98 } 99 100 isSiteWide = RollerRuntimeConfig.isSiteWideWeblog(feedRequest.getWeblogHandle()); 102 103 } catch(Exception e) { 104 log.debug("error creating weblog feed request", e); 106 response.sendError(HttpServletResponse.SC_NOT_FOUND); 107 return; 108 } 109 110 111 long lastModified = System.currentTimeMillis(); 113 if(isSiteWide) { 114 lastModified = siteWideCache.getLastModified().getTime(); 115 } else if (weblog.getLastModified() != null) { 116 lastModified = weblog.getLastModified().getTime(); 117 } 118 119 if (ModDateHeaderUtil.respondIfNotModified(request,response,lastModified)) { 121 return; 122 } 123 124 ModDateHeaderUtil.setLastModifiedHeader(response, lastModified); 126 127 String accepts = request.getHeader("Accept"); 129 String userAgent = request.getHeader("User-Agent"); 130 if (RollerRuntimeConfig.getBooleanProperty("site.newsfeeds.styledFeeds") && 131 accepts != null && accepts.indexOf("*/*") != -1 && 132 userAgent != null && userAgent.startsWith("Mozilla")) { 133 response.setContentType("text/xml"); 137 } else if("rss".equals(feedRequest.getFormat())) { 138 response.setContentType("application/rss+xml; charset=utf-8"); 139 } else if("atom".equals(feedRequest.getFormat())) { 140 response.setContentType("application/atom+xml; charset=utf-8"); 141 } 142 143 String cacheKey = null; 145 if(isSiteWide) { 146 cacheKey = siteWideCache.generateKey(feedRequest); 147 } else { 148 cacheKey = weblogFeedCache.generateKey(feedRequest); 149 } 150 151 CachedContent cachedContent = null; 153 if(isSiteWide) { 154 cachedContent = (CachedContent) siteWideCache.get(cacheKey); 155 } else { 156 cachedContent = (CachedContent) weblogFeedCache.get(cacheKey, lastModified); 157 } 158 159 if(cachedContent != null) { 160 log.debug("HIT "+cacheKey); 161 162 response.setContentLength(cachedContent.getContent().length); 163 response.getOutputStream().write(cachedContent.getContent()); 164 return; 165 166 } else { 167 log.debug("MISS "+cacheKey); 168 } 169 170 171 HashMap model = new HashMap (); 173 String pageId = null; 174 try { 175 if (RollerRuntimeConfig.isSiteWideWeblog(weblog.getHandle())) { 177 pageId = "templates/feeds/site-"+feedRequest.getType()+"-"+feedRequest.getFormat()+".vm"; 178 } else { 179 pageId = "templates/feeds/weblog-"+feedRequest.getType()+"-"+feedRequest.getFormat()+".vm"; 180 } 181 182 Map initData = new HashMap (); 184 initData.put("request", request); 185 initData.put("weblogRequest", feedRequest); 186 187 String feedModels = RollerConfig.getProperty("rendering.feedModels"); 189 ModelLoader.loadModels(feedModels, model, initData, true); 190 191 193 if(RollerRuntimeConfig.isSiteWideWeblog(weblog.getHandle())) { 194 String siteModels = RollerConfig.getProperty("rendering.siteModels"); 195 ModelLoader.loadModels(siteModels, model, initData, true); 196 } 197 198 202 } catch (RollerException ex) { 203 log.error("ERROR loading model for page", ex); 204 205 if(!response.isCommitted()) response.reset(); 206 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 207 return; 208 } 209 210 211 Renderer renderer = null; 213 try { 214 log.debug("Looking up renderer"); 215 Template template = new StaticTemplate(pageId, null, "velocity"); 216 renderer = RendererManager.getRenderer(template); 217 } catch(Exception e) { 218 220 229 if(!response.isCommitted()) response.reset(); 230 response.sendError(HttpServletResponse.SC_NOT_FOUND); 231 return; 232 } 233 234 CachedContent rendererOutput = new CachedContent(24567); 236 try { 237 log.debug("Doing rendering"); 238 renderer.render(model, rendererOutput.getCachedWriter()); 239 240 rendererOutput.flush(); 242 rendererOutput.close(); 243 } catch(Exception e) { 244 log.error("Error during rendering for page "+pageId, e); 246 247 if(!response.isCommitted()) response.reset(); 248 response.sendError(HttpServletResponse.SC_NOT_FOUND); 249 return; 250 } 251 252 253 255 log.debug("Flushing response output"); 257 response.setContentLength(rendererOutput.getContent().length); 258 response.getOutputStream().write(rendererOutput.getContent()); 259 260 log.debug("PUT "+cacheKey); 262 if(isSiteWide) { 263 siteWideCache.put(cacheKey, rendererOutput); 264 } else { 265 weblogFeedCache.put(cacheKey, rendererOutput); 266 } 267 268 log.debug("Exiting"); 269 } 270 271 } 272 | Popular Tags |