1 18 19 package org.apache.roller.ui.rendering.servlets; 20 21 import java.io.IOException ; 22 import java.util.Date ; 23 import java.util.HashMap ; 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.RollerRuntimeConfig; 33 import org.apache.roller.model.PlanetManager; 34 import org.apache.roller.model.RollerFactory; 35 import org.apache.roller.pojos.StaticTemplate; 36 import org.apache.roller.pojos.Template; 37 import org.apache.roller.ui.rendering.Renderer; 38 import org.apache.roller.ui.rendering.RendererManager; 39 import org.apache.roller.ui.rendering.model.UtilitiesModel; 40 import org.apache.roller.ui.rendering.util.PlanetCache; 41 import org.apache.roller.ui.rendering.util.PlanetRequest; 42 import org.apache.roller.ui.rendering.util.ModDateHeaderUtil; 43 import org.apache.roller.util.cache.CachedContent; 44 45 46 52 public class PlanetFeedServlet extends HttpServlet { 53 54 private static Log log = LogFactory.getLog(PlanetFeedServlet.class); 55 56 private PlanetCache planetCache = null; 57 58 59 62 public void init(ServletConfig servletConfig) throws ServletException { 63 64 super.init(servletConfig); 65 66 log.info("Initializing PlanetRssServlet"); 67 68 this.planetCache = PlanetCache.getInstance(); 69 } 70 71 72 75 public void doGet(HttpServletRequest request, HttpServletResponse response) 76 throws ServletException , IOException { 77 78 log.debug("Entering"); 79 80 PlanetManager planet = null; 81 try { 82 planet = RollerFactory.getRoller().getPlanetManager(); 83 } catch (RollerException ex) { 84 log.error("Unable to get planet manager", ex); 86 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 87 return; 88 } 89 90 PlanetRequest planetRequest = null; 91 try { 92 planetRequest = new PlanetRequest(request); 93 } catch (Exception e) { 94 log.debug("error creating planet request", e); 96 response.sendError(HttpServletResponse.SC_NOT_FOUND); 97 return; 98 } 99 100 Date lastModified = planetCache.getLastModified(); 102 103 if (ModDateHeaderUtil.respondIfNotModified(request,response,lastModified.getTime())) { 105 return; 106 } 107 108 String accepts = request.getHeader("Accept"); 110 String userAgent = request.getHeader("User-Agent"); 111 if (accepts != null && userAgent != null 112 && accepts.indexOf("*/*") != -1 && userAgent.startsWith("Mozilla")) { 113 response.setContentType("text/xml"); 117 } else { 118 response.setContentType("application/rss+xml; charset=utf-8"); 119 } 120 121 ModDateHeaderUtil.setLastModifiedHeader(response,lastModified.getTime()); 123 124 String cacheKey = PlanetCache.CACHE_ID+":"+this.generateKey(planetRequest); 126 CachedContent entry = (CachedContent) planetCache.get(cacheKey); 127 if(entry != null) { 128 response.setContentLength(entry.getContent().length); 129 response.getOutputStream().write(entry.getContent()); 130 return; 131 132 } 133 134 135 HashMap model = new HashMap (); 137 try { 138 if (request.getParameter("group") != null) { 140 model.put("group", planet.getGroup(request.getParameter("group"))); 141 } 142 model.put("planet", planet); 143 model.put("date", new Date ()); 144 model.put("utils", new UtilitiesModel()); 145 model.put("absoluteSite", RollerRuntimeConfig.getAbsoluteContextURL()); 146 model.put("feedStyle", new Boolean (RollerRuntimeConfig.getBooleanProperty("site.newsfeeds.styledFeeds"))); 147 148 int entryCount = 149 RollerRuntimeConfig.getIntProperty("site.newsfeeds.defaultEntries"); 150 int maxEntries = 151 RollerRuntimeConfig.getIntProperty("site.newsfeeds.maxEntries"); 152 String sCount = request.getParameter("count"); 153 if (sCount!=null) { 154 try { 155 entryCount = Integer.parseInt(sCount); 156 } catch (NumberFormatException e) { 157 log.warn("Improperly formatted count parameter"); 158 } 159 if ( entryCount > maxEntries ) entryCount = maxEntries; 160 if ( entryCount < 0 ) entryCount = 0; 161 } 162 model.put("entryCount", new Integer (entryCount)); 163 164 } catch (RollerException ex) { 165 log.error("Error loading model objects for page", ex); 166 167 if(!response.isCommitted()) response.reset(); 168 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 169 return; 170 } 171 172 173 Renderer renderer = null; 175 try { 176 log.debug("Looking up renderer"); 177 Template template = new StaticTemplate("templates/planet/planetrss.vm", null, "velocity"); 178 renderer = RendererManager.getRenderer(template); 179 } catch(Exception e) { 180 log.error("Couldn't find renderer for planet rss", e); 182 183 if(!response.isCommitted()) response.reset(); 184 response.sendError(HttpServletResponse.SC_NOT_FOUND); 185 return; 186 } 187 188 CachedContent rendererOutput = new CachedContent(24567); 190 try { 191 log.debug("Doing rendering"); 192 renderer.render(model, rendererOutput.getCachedWriter()); 193 194 rendererOutput.flush(); 196 rendererOutput.close(); 197 } catch(Exception e) { 198 log.error("Error during rendering for planet rss", e); 200 201 if(!response.isCommitted()) response.reset(); 202 response.sendError(HttpServletResponse.SC_NOT_FOUND); 203 return; 204 } 205 206 207 209 log.debug("Flushing response output"); 211 response.setContentLength(rendererOutput.getContent().length); 212 response.getOutputStream().write(rendererOutput.getContent()); 213 214 this.planetCache.put(cacheKey, rendererOutput); 216 217 log.debug("Exiting"); 218 } 219 220 221 236 private String generateKey(PlanetRequest planetRequest) { 237 238 StringBuffer key = new StringBuffer (); 239 key.append(planetRequest.getContext()); 240 key.append("/"); 241 key.append(planetRequest.getType()); 242 243 if(planetRequest.getFlavor() != null) { 244 key.append("/").append(planetRequest.getFlavor()); 245 } 246 247 key.append("/").append(planetRequest.getLanguage()); 249 250 if(planetRequest.getFlavor() != null) { 251 if(planetRequest.isExcerpts()) { 253 key.append("/excerpts"); 254 } 255 } else { 256 if(planetRequest.getAuthenticUser() != null) { 258 key.append("/user=").append(planetRequest.getAuthenticUser()); 259 } 260 } 261 262 return key.toString(); 263 } 264 265 } 266 | Popular Tags |