File Source: RSDServlet.java
1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. The ASF licenses this file to You
4 * under the Apache License, Version 2.0 (the "License"); you may not
5 * use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License. For additional information regarding
15 * copyright in this work, please see the NOTICE file in the top level
16 * directory of this distribution.
17 */
18
19 package org.apache.roller.weblogger.ui.rendering.servlets;
20
21 import java.io.IOException;
22 import java.util.HashMap;
23 import javax.servlet.ServletConfig;
24 import javax.servlet.ServletException;
25 import javax.servlet.http.HttpServlet;
26 import javax.servlet.http.HttpServletRequest;
27 import javax.servlet.http.HttpServletResponse;
28 import org.apache.commons.logging.Log;
29 import org.apache.commons.logging.LogFactory;
30 import org.apache.roller.weblogger.WebloggerException;
31 import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;
32 import org.apache.roller.weblogger.pojos.StaticTemplate;
33 import org.apache.roller.weblogger.pojos.Template;
34 import org.apache.roller.weblogger.pojos.Weblog;
35 import org.apache.roller.weblogger.ui.rendering.util.WeblogRequest;
36 import org.apache.roller.weblogger.ui.rendering.util.ModDateHeaderUtil;
37 import org.apache.roller.weblogger.ui.rendering.Renderer;
38 import org.apache.roller.weblogger.ui.rendering.RendererManager;
39 import org.apache.roller.weblogger.util.cache.CachedContent;
40
41
42 /**
43 * Generates simple rsd feed for a given weblog.
44 *
45 * This servlet supports 304 If-Modified-Since checking, but does not do any
46 * level of content caching.
47 *
48 * @web.servlet name="RSDServlet" load-on-startup="7"
49 * @web.servlet-mapping url-pattern="/roller-ui/rendering/rsd/*"
50 */
/*
P/P * Method: void org.apache.roller.weblogger.ui.rendering.servlets.RSDServlet()
*/
51 public class RSDServlet extends HttpServlet {
52
/*
P/P * Method: org.apache.roller.weblogger.ui.rendering.servlets.RSDServlet__static_init
*
* Postconditions:
* init'ed(log)
*/
53 private static Log log = LogFactory.getLog(RSDServlet.class);
54
55
56 /**
57 * Init method for this servlet
58 */
59 public void init(ServletConfig servletConfig) throws ServletException {
60
/*
P/P * Method: void init(ServletConfig)
*
* Preconditions:
* log != null
*/
61 super.init(servletConfig);
62
63 log.info("Initializing RSDServlet");
64 }
65
66
67 /**
68 * Handle GET requests for weblog pages.
69 */
70 public void doGet(HttpServletRequest request, HttpServletResponse response)
71 throws ServletException, IOException {
72
/*
P/P * Method: void doGet(HttpServletRequest, HttpServletResponse)
*
* Preconditions:
* log != null
* (soft) org/apache/roller/weblogger/ui/rendering/util/WeblogRequest.log != null
* (soft) request != null
* (soft) response != null
*
* Presumptions:
* javax.servlet.http.HttpServletResponse:getOutputStream(...)@157 != null
* org.apache.roller.weblogger.pojos.Weblog:getLastModified(...)@100 != null
* org.apache.roller.weblogger.ui.rendering.RendererManager:getRenderer(...)@123 != null
* org.apache.roller.weblogger.util.cache.CachedContent:getContent(...).length@156 <= 232-1
* org.apache.roller.weblogger.util.cache.CachedContent:getContent(...)@156 != null
*
* Test Vectors:
* org.apache.roller.weblogger.pojos.Weblog:getLastModified(...)@99: Addr_Set{null}, Inverse{null}
*/
73 log.debug("Entering");
74
75 Weblog weblog = null;
76
77 WeblogRequest weblogRequest = null;
78 try {
79 weblogRequest = new WeblogRequest(request);
80
81 // now make sure the specified weblog really exists
82 weblog = weblogRequest.getWeblog();
83 if(weblog == null) {
+ 84 throw new WebloggerException("Unable to lookup weblog: "+
85 weblogRequest.getWeblogHandle());
86 }
87
88 } catch(Exception e) {
89 // invalid rsd request format or weblog doesn't exist
90 log.debug("error creating weblog request", e);
91 response.sendError(HttpServletResponse.SC_NOT_FOUND);
92 return;
93 }
94
95
96
97 // Respond with 304 Not Modified if it is not modified.
98 long lastModified = System.currentTimeMillis();
99 if (weblog.getLastModified() != null) {
100 lastModified = weblog.getLastModified().getTime();
101 }
102 if (ModDateHeaderUtil.respondIfNotModified(request,response,lastModified)) {
103 return;
104 }
105
106 // set last-modified date
107 ModDateHeaderUtil.setLastModifiedHeader(response,lastModified);
108
109 // set the content type
110 response.setContentType("application/rsd+xml; charset=utf-8");
111
112 // populate the model
113 HashMap model = new HashMap();
114 model.put("website", weblog);
115 model.put("absBaseURL", WebloggerRuntimeConfig.getAbsoluteContextURL());
116
117
118 // lookup Renderer we are going to use
119 Renderer renderer = null;
120 try {
121 log.debug("Looking up renderer");
122 Template template = new StaticTemplate("templates/weblog/rsd.vm", "velocity");
123 renderer = RendererManager.getRenderer(template);
124 } catch(Exception e) {
125 // nobody wants to render my content :(
126 log.error("Couldn't find renderer for rsd template", e);
127
128 if(!response.isCommitted()) response.reset();
129 response.sendError(HttpServletResponse.SC_NOT_FOUND);
130 return;
131 }
132
133 // render content
134 CachedContent rendererOutput = new CachedContent(4096);
135 try {
136 log.debug("Doing rendering");
137 renderer.render(model, rendererOutput.getCachedWriter());
138
139 // flush rendered output and close
140 rendererOutput.flush();
141 rendererOutput.close();
142 } catch(Exception e) {
143 // bummer, error during rendering
144 log.error("Error during rendering for rsd template", e);
145
146 if(!response.isCommitted()) response.reset();
147 response.sendError(HttpServletResponse.SC_NOT_FOUND);
148 return;
149 }
150
151
152 // post rendering process
153
154 // flush rendered content to response
155 log.debug("Flushing response output");
156 response.setContentLength(rendererOutput.getContent().length);
157 response.getOutputStream().write(rendererOutput.getContent());
158
159 log.debug("Exiting");
160 }
161
162 }
SofCheck Inspector Build Version : 2.18479
| RSDServlet.java |
2009-Jan-02 14:25:26 |
| RSDServlet.class |
2009-Sep-04 03:12:45 |