File Source: PreviewServlet.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 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 javax.servlet.jsp.JspFactory;
30 import javax.servlet.jsp.PageContext;
31 import org.apache.commons.logging.Log;
32 import org.apache.commons.logging.LogFactory;
33 import org.apache.roller.weblogger.WebloggerException;
34 import org.apache.roller.weblogger.business.WebloggerFactory;
35 import org.apache.roller.weblogger.config.WebloggerConfig;
36 import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;
37 import org.apache.roller.weblogger.pojos.Template;
38 import org.apache.roller.weblogger.pojos.Theme;
39 import org.apache.roller.weblogger.pojos.ThemeTemplate;
40 import org.apache.roller.weblogger.pojos.WeblogTheme;
41 import org.apache.roller.weblogger.pojos.Weblog;
42 import org.apache.roller.weblogger.ui.core.RollerContext;
43 import org.apache.roller.weblogger.util.cache.CachedContent;
44 import org.apache.roller.weblogger.ui.rendering.Renderer;
45 import org.apache.roller.weblogger.ui.rendering.RendererManager;
46 import org.apache.roller.weblogger.ui.rendering.model.ModelLoader;
47 import org.apache.roller.weblogger.ui.rendering.util.WeblogPreviewRequest;
48
49
50 /**
51 * Responsible for rendering weblog page previews.
52 *
53 * This servlet is used as part of the authoring interface to provide previews
54 * of what a weblog will look like with a given theme. It is not available
55 * outside of the authoring interface.
56 */
/*
P/P * Method: void org.apache.roller.weblogger.ui.rendering.servlets.PreviewServlet()
*/
57 public class PreviewServlet extends HttpServlet {
58
/*
P/P * Method: org.apache.roller.weblogger.ui.rendering.servlets.PreviewServlet__static_init
*
* Postconditions:
* init'ed(log)
*/
59 private static Log log = LogFactory.getLog(PreviewServlet.class);
60
61
62 /**
63 * Init method for this servlet
64 */
65 public void init(ServletConfig servletConfig) throws ServletException {
66
/*
P/P * Method: void init(ServletConfig)
*
* Preconditions:
* log != null
*/
67 super.init(servletConfig);
68
69 log.info("Initializing PreviewServlet");
70 }
71
72
73 /**
74 * Handle GET requests for weblog pages.
75 */
76 public void doGet(HttpServletRequest request, HttpServletResponse response)
77 throws ServletException, IOException {
78
/*
P/P * Method: void doGet(HttpServletRequest, HttpServletResponse)
*
* Preconditions:
* log != null
* response != null
* (soft) org/apache/roller/weblogger/ui/rendering/util/WeblogPageRequest.log != null
* (soft) org/apache/roller/weblogger/ui/rendering/util/WeblogPreviewRequest.log != null
* (soft) org/apache/roller/weblogger/ui/rendering/util/WeblogRequest.log != null
* (soft) request != null
*
* Presumptions:
* javax.servlet.http.HttpServletResponse:getOutputStream(...)@271 != null
* javax.servlet.jsp.JspFactory:getDefaultFactory(...)@193 != null
* org.apache.roller.weblogger.business.Weblogger:getUrlStrategy(...)@205 != null
* org.apache.roller.weblogger.business.Weblogger:getUrlStrategy(...)@221 != null
* org.apache.roller.weblogger.business.WebloggerFactory:getWeblogger(...)@205 != null
* ...
*
* Test Vectors:
* java.lang.String:equals(...)@116: {0}, {1}
* java.lang.String:equals(...)@131: {0}, {1}
* java.lang.String:equals(...)@135: {0}, {1}
* java.lang.String:equals(...)@185: {0}, {1}
* javax.servlet.http.HttpServletResponse:isCommitted(...)@146: {1}, {0}
* javax.servlet.http.HttpServletResponse:isCommitted(...)@170: {1}, {0}
* org.apache.roller.weblogger.config.WebloggerRuntimeConfig:isSiteWideWeblog(...)@212: {0}, {1}
* org.apache.roller.weblogger.pojos.Theme:isEnabled(...)@114: {0}, {1}
* org.apache.roller.weblogger.pojos.Weblog:isShowAllLangs(...)@126: {1}, {0}
* org.apache.roller.weblogger.ui.rendering.util.WeblogPreviewRequest:getLocale(...)@126: Inverse{null}, Addr_Set{null}
* ...
*/
79 log.debug("Entering");
80
81 Weblog weblog = null;
82
83 WeblogPreviewRequest previewRequest = null;
84 try {
85 previewRequest = new WeblogPreviewRequest(request);
86
87 // lookup weblog specified by preview request
88 weblog = previewRequest.getWeblog();
89 if(weblog == null) {
90 throw new WebloggerException("unable to lookup weblog: "+
91 previewRequest.getWeblogHandle());
92 }
93 } catch (Exception e) {
94 // some kind of error parsing the request or getting weblog
95 log.debug("error creating preview request", e);
96 response.sendError(HttpServletResponse.SC_NOT_FOUND);
97 return;
98 }
99
100 Weblog tmpWebsite = weblog;
101
102 if (previewRequest.getThemeName() != null) {
103 // only create temporary weblog object if theme name was specified
104 // in request, which indicates we're doing a theme preview
105
106 // try getting the preview theme
107 log.debug("preview theme = "+previewRequest.getThemeName());
108 Theme previewTheme = previewRequest.getTheme();
109
110 // construct a temporary Website object for this request
111 // and set the EditorTheme to our previewTheme
112 tmpWebsite = new Weblog();
113 tmpWebsite.setData(weblog);
114 if(previewTheme != null && previewTheme.isEnabled()) {
115 tmpWebsite.setEditorTheme(previewTheme.getId());
116 } else if(WeblogTheme.CUSTOM.equals(previewRequest.getThemeName())) {
117 tmpWebsite.setEditorTheme(WeblogTheme.CUSTOM);
118 }
119
120 // we've got to set the weblog in our previewRequest because that's
121 // the object that gets referenced during rendering operations
122 previewRequest.setWeblog(tmpWebsite);
123 }
124
125 // do we need to force a specific locale for the request?
126 if(previewRequest.getLocale() == null && !weblog.isShowAllLangs()) {
127 previewRequest.setLocale(weblog.getLocale());
128 }
129
130 Template page = null;
131 if("page".equals(previewRequest.getContext())) {
132 page = previewRequest.getWeblogPage();
133
134 // If request specified tags section index, then look for custom template
135 } else if("tags".equals(previewRequest.getContext()) &&
136 previewRequest.getTags() == null) {
137 try {
138 page = weblog.getTheme().getTemplateByAction(ThemeTemplate.ACTION_TAGSINDEX);
139 } catch(Exception e) {
140 log.error("Error getting weblog page for action 'tagsIndex'", e);
141 }
142
143 // if we don't have a custom tags page then 404, we don't let
144 // this one fall through to the default template
145 if(page == null) {
146 if(!response.isCommitted()) response.reset();
147 response.sendError(HttpServletResponse.SC_NOT_FOUND);
148 return;
149 }
150
151 // If this is a permalink then look for a permalink template
152 } else if(previewRequest.getWeblogAnchor() != null) {
153 try {
154 page = weblog.getTheme().getTemplateByAction(ThemeTemplate.ACTION_PERMALINK);
155 } catch(Exception e) {
156 log.error("Error getting weblog page for action 'permalink'", e);
157 }
158 }
159
160 if(page == null) {
161 try {
162 page = tmpWebsite.getTheme().getDefaultTemplate();
163 } catch(WebloggerException re) {
164 log.error("Error getting default page for preview", re);
165 }
166 }
167
168 // Still no page? Then that is a 404
169 if (page == null) {
170 if(!response.isCommitted()) response.reset();
171 response.sendError(HttpServletResponse.SC_NOT_FOUND);
172 return;
173 }
174
175
176 log.debug("preview page found, dealing with it");
177
178 // set the content type
179 String pageLink = previewRequest.getWeblogPageName();
180 String mimeType = pageLink != null ? RollerContext.getServletContext().getMimeType(pageLink) : null;
181 String contentType = "text/html; charset=utf-8";
182 if(mimeType != null) {
183 // we found a match ... set the content type
184 contentType = mimeType+"; charset=utf-8";
185 } else if ("_css".equals(previewRequest.getWeblogPageName())) {
186 // TODO: store content-type for each page so this hack is unnecessary
187 contentType = "text/css; charset=utf-8";
188 }
189
190 // looks like we need to render content
191 Map model = new HashMap();
192 try {
193 PageContext pageContext = JspFactory.getDefaultFactory().getPageContext(
194 this, request, response,"", false, 8192, true);
195
196 // special hack for menu tag
197 request.setAttribute("pageRequest", previewRequest);
198
199 // populate the rendering model
200 Map initData = new HashMap();
201 initData.put("parsedRequest", previewRequest);
202 initData.put("pageContext", pageContext);
203
204 // define url strategy
205 initData.put("urlStrategy", WebloggerFactory.getWeblogger().getUrlStrategy().getPreviewURLStrategy(previewRequest.getThemeName()));
206
207 // Load models for page previewing
208 String pageModels = WebloggerConfig.getProperty("rendering.previewModels");
209 ModelLoader.loadModels(pageModels, model, initData, true);
210
211 // Load special models for site-wide blog
212 if(WebloggerRuntimeConfig.isSiteWideWeblog(weblog.getHandle())) {
213 String siteModels = WebloggerConfig.getProperty("rendering.siteModels");
214 ModelLoader.loadModels(siteModels, model, initData, true);
215 }
216
217 // Load weblog custom models
218 ModelLoader.loadCustomModels(weblog, model, initData);
219
220 // ick, gotta load pre-3.0 model stuff as well :(
221 ModelLoader.loadOldModels(model, request, response, pageContext, previewRequest, WebloggerFactory.getWeblogger().getUrlStrategy().getPreviewURLStrategy(previewRequest.getThemeName()));
222
223 } catch (WebloggerException ex) {
224 log.error("ERROR loading model for page", ex);
225
226 if(!response.isCommitted()) response.reset();
227 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
228 return;
229 }
230
231
232 // lookup Renderer we are going to use
233 Renderer renderer = null;
234 try {
235 log.debug("Looking up renderer");
236 renderer = RendererManager.getRenderer(page);
237 } catch(Exception e) {
238 // nobody wants to render my content :(
239 log.error("Couldn't find renderer for page "+page.getId(), e);
240
241 if(!response.isCommitted()) response.reset();
242 response.sendError(HttpServletResponse.SC_NOT_FOUND);
243 return;
244 }
245
246 // render content. use default size of about 24K for a standard page
247 CachedContent rendererOutput = new CachedContent(24567);
248 try {
249 log.debug("Doing rendering");
250 renderer.render(model, rendererOutput.getCachedWriter());
251
252 // flush rendered output and close
253 rendererOutput.flush();
254 rendererOutput.close();
255 } catch(Exception e) {
256 // bummer, error during rendering
257 log.error("Error during rendering for page "+page.getId(), e);
258
259 if(!response.isCommitted()) response.reset();
260 response.sendError(HttpServletResponse.SC_NOT_FOUND);
261 return;
262 }
263
264
265 // post rendering process
266
267 // flush rendered content to response
268 log.debug("Flushing response output");
269 response.setContentType(contentType);
270 response.setContentLength(rendererOutput.getContent().length);
271 response.getOutputStream().write(rendererOutput.getContent());
272
273 log.debug("Exiting");
274 }
275
276 }
SofCheck Inspector Build Version : 2.18479
| PreviewServlet.java |
2009-Jan-02 14:24:56 |
| PreviewServlet.class |
2009-Sep-04 03:12:45 |