File Source: SearchServlet.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.config.WebloggerConfig;
35 import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;
36 import org.apache.roller.weblogger.business.WebloggerFactory;
37 import org.apache.roller.weblogger.business.UserManager;
38 import org.apache.roller.weblogger.pojos.ThemeTemplate;
39 import org.apache.roller.weblogger.pojos.Weblog;
40 import org.apache.roller.weblogger.ui.rendering.Renderer;
41 import org.apache.roller.weblogger.ui.rendering.RendererManager;
42 import org.apache.roller.weblogger.ui.rendering.model.Model;
43 import org.apache.roller.weblogger.ui.rendering.model.ModelLoader;
44 import org.apache.roller.weblogger.ui.rendering.model.SearchResultsModel;
45 import org.apache.roller.weblogger.ui.rendering.util.WeblogPageRequest;
46 import org.apache.roller.weblogger.ui.rendering.util.WeblogSearchRequest;
47 import org.apache.roller.weblogger.util.cache.CachedContent;
48
49
50 /**
51 * Handles search queries for weblogs.
52 */
/*
P/P * Method: void org.apache.roller.weblogger.ui.rendering.servlets.SearchServlet()
*/
53 public class SearchServlet extends HttpServlet {
54
/*
P/P * Method: org.apache.roller.weblogger.ui.rendering.servlets.SearchServlet__static_init
*
* Postconditions:
* init'ed(log)
*/
55 private static Log log = LogFactory.getLog(SearchServlet.class);
56
57
58 /**
59 * Init method for this servlet
60 */
61 public void init(ServletConfig servletConfig) throws ServletException {
62
/*
P/P * Method: void init(ServletConfig)
*
* Preconditions:
* log != null
*/
63 super.init(servletConfig);
64
65 log.info("Initializing SearchServlet");
66 }
67
68
69 /**
70 * Handle GET requests for weblog pages.
71 */
72 public void doGet(HttpServletRequest request, HttpServletResponse response)
73 throws ServletException, IOException {
74
/*
P/P * Method: void doGet(HttpServletRequest, HttpServletResponse)
*
* Preconditions:
* log != null
* response != null
* (soft) org/apache/roller/weblogger/ui/rendering/util/WeblogRequest.log != null
* (soft) request != null
*
* Presumptions:
* init'ed(java.lang.Boolean.TRUE)
* javax.servlet.http.HttpServletResponse:getOutputStream(...)@217 != null
* javax.servlet.jsp.JspFactory:getDefaultFactory(...)@127 != null
* org.apache.roller.weblogger.business.UserManager:getWebsiteByHandle(...)@86 != null
* org.apache.roller.weblogger.business.Weblogger:getUserManager(...)@85 != null
* ...
*
* Test Vectors:
* org.apache.roller.weblogger.config.WebloggerRuntimeConfig:isSiteWideWeblog(...)@154: {0}, {1}
* org.apache.roller.weblogger.pojos.Weblog:isShowAllLangs(...)@96: {1}, {0}
* org.apache.roller.weblogger.pojos.WeblogTheme:getTemplateByAction(...)@104: Inverse{null}, Addr_Set{null}
* org.apache.roller.weblogger.ui.rendering.util.WeblogSearchRequest:getLocale(...)@96: Inverse{null}, Addr_Set{null}
*/
75 log.debug("Entering");
76
77 Weblog weblog = null;
78 WeblogSearchRequest searchRequest = null;
79
80 // first off lets parse the incoming request and validate it
81 try {
82 searchRequest = new WeblogSearchRequest(request);
83
84 // now make sure the specified weblog really exists
85 UserManager userMgr = WebloggerFactory.getWeblogger().getUserManager();
86 weblog = userMgr.getWebsiteByHandle(searchRequest.getWeblogHandle(), Boolean.TRUE);
87
88 } catch(Exception e) {
89 // invalid search request format or weblog doesn't exist
90 log.debug("error creating weblog search request", e);
91 response.sendError(HttpServletResponse.SC_NOT_FOUND);
92 return;
93 }
94
95 // do we need to force a specific locale for the request?
96 if(searchRequest.getLocale() == null && !weblog.isShowAllLangs()) {
97 searchRequest.setLocale(weblog.getLocale());
98 }
99
100 // lookup template to use for rendering
101 ThemeTemplate page = null;
102 try {
103 // first try looking for a specific search page
104 page = weblog.getTheme().getTemplateByAction(ThemeTemplate.ACTION_SEARCH);
105
106 // if not found then fall back on default page
107 if(page == null) {
108 page = weblog.getTheme().getDefaultTemplate();
109 }
110
111 // if still null then that's a problem
112 if(page == null) {
+ 113 throw new WebloggerException("Could not lookup default page "+
114 "for weblog "+weblog.getHandle());
115 }
116 } catch(Exception e) {
117 log.error("Error getting default page for weblog "+
118 weblog.getHandle(), e);
119 }
120
121 // set the content type
122 response.setContentType("text/html; charset=utf-8");
123
124 // looks like we need to render content
125 Map model = new HashMap();
126 try {
127 PageContext pageContext = JspFactory.getDefaultFactory().getPageContext(
128 this, request, response,"", false, 8192, true);
129
130 // populate the rendering model
131 Map initData = new HashMap();
132 initData.put("request", request);
133 initData.put("pageContext", pageContext);
134
135 // this is a little hacky, but nothing we can do about it
136 // we need the 'weblogRequest' to be a pageRequest so other models
137 // are properly loaded, which means that searchRequest needs its
138 // own custom initData property aside from the standard weblogRequest.
139 // possible better approach is make searchRequest extend pageRequest.
140 WeblogPageRequest pageRequest = new WeblogPageRequest();
141 pageRequest.setWeblogHandle(searchRequest.getWeblogHandle());
142 pageRequest.setWeblogCategoryName(searchRequest.getWeblogCategoryName());
143 initData.put("parsedRequest", pageRequest);
144 initData.put("searchRequest", searchRequest);
145
146 // define url strategy
147 initData.put("urlStrategy", WebloggerFactory.getWeblogger().getUrlStrategy());
148
149 // Load models for pages
150 String searchModels = WebloggerConfig.getProperty("rendering.searchModels");
151 ModelLoader.loadModels(searchModels, model, initData, true);
152
153 // Load special models for site-wide blog
154 if(WebloggerRuntimeConfig.isSiteWideWeblog(weblog.getHandle())) {
155 String siteModels = WebloggerConfig.getProperty("rendering.siteModels");
156 ModelLoader.loadModels(siteModels, model, initData, true);
157 }
158
159 // Load weblog custom models
160 ModelLoader.loadCustomModels(weblog, model, initData);
161
162 // ick, gotta load pre-3.0 model stuff as well :(
163 ModelLoader.loadOldModels(model, request, response, pageContext, pageRequest, WebloggerFactory.getWeblogger().getUrlStrategy());
164
165 // manually add search model again to support pre-3.0 weblogs
166 Model searchModel = new SearchResultsModel();
167 searchModel.init(initData);
168 model.put("searchResults", searchModel);
169
170 } catch (WebloggerException ex) {
171 log.error("Error loading model objects for page", ex);
172
173 if(!response.isCommitted()) response.reset();
174 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
175 return;
176 }
177
178
179 // lookup Renderer we are going to use
180 Renderer renderer = null;
181 try {
182 log.debug("Looking up renderer");
183 renderer = RendererManager.getRenderer(page);
184 } catch(Exception e) {
185 // nobody wants to render my content :(
186 log.error("Couldn't find renderer for rsd template", e);
187
188 if(!response.isCommitted()) response.reset();
189 response.sendError(HttpServletResponse.SC_NOT_FOUND);
190 return;
191 }
192
193 // render content
194 CachedContent rendererOutput = new CachedContent(4096);
195 try {
196 log.debug("Doing rendering");
197 renderer.render(model, rendererOutput.getCachedWriter());
198
199 // flush rendered output and close
200 rendererOutput.flush();
201 rendererOutput.close();
202 } catch(Exception e) {
203 // bummer, error during rendering
204 log.error("Error during rendering for rsd template", e);
205
206 if(!response.isCommitted()) response.reset();
207 response.sendError(HttpServletResponse.SC_NOT_FOUND);
208 return;
209 }
210
211
212 // post rendering process
213
214 // flush rendered content to response
215 log.debug("Flushing response output");
216 response.setContentLength(rendererOutput.getContent().length);
217 response.getOutputStream().write(rendererOutput.getContent());
218
219 log.debug("Exiting");
220 }
221
222 }
SofCheck Inspector Build Version : 2.18479
| SearchServlet.java |
2009-Jan-02 14:25:28 |
| SearchServlet.class |
2009-Sep-04 03:12:45 |