KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > roller > ui > rendering > servlets > SearchServlet


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.ui.rendering.servlets;
20
21 import java.io.IOException JavaDoc;
22 import java.util.HashMap JavaDoc;
23 import java.util.Map JavaDoc;
24 import javax.servlet.ServletConfig JavaDoc;
25 import javax.servlet.ServletException JavaDoc;
26 import javax.servlet.http.HttpServlet JavaDoc;
27 import javax.servlet.http.HttpServletRequest JavaDoc;
28 import javax.servlet.http.HttpServletResponse JavaDoc;
29 import javax.servlet.jsp.JspFactory JavaDoc;
30 import javax.servlet.jsp.PageContext JavaDoc;
31 import org.apache.commons.logging.Log;
32 import org.apache.commons.logging.LogFactory;
33 import org.apache.roller.RollerException;
34 import org.apache.roller.config.RollerConfig;
35 import org.apache.roller.config.RollerRuntimeConfig;
36 import org.apache.roller.model.RollerFactory;
37 import org.apache.roller.model.UserManager;
38 import org.apache.roller.pojos.Template;
39 import org.apache.roller.pojos.WebsiteData;
40 import org.apache.roller.ui.rendering.Renderer;
41 import org.apache.roller.ui.rendering.RendererManager;
42 import org.apache.roller.ui.rendering.model.Model;
43 import org.apache.roller.ui.rendering.model.ModelLoader;
44 import org.apache.roller.ui.rendering.model.SearchResultsModel;
45 import org.apache.roller.ui.rendering.util.WeblogPageRequest;
46 import org.apache.roller.ui.rendering.util.WeblogSearchRequest;
47 import org.apache.roller.util.cache.CachedContent;
48
49
50 /**
51  * Handles search queries for weblogs.
52  *
53  * @web.servlet name="SearchServlet" load-on-startup="5"
54  * @web.servlet-mapping url-pattern="/roller-ui/rendering/search/*"
55  */

56 public class SearchServlet extends HttpServlet JavaDoc {
57     
58     private static Log log = LogFactory.getLog(SearchServlet.class);
59     
60     
61     /**
62      * Init method for this servlet
63      */

64     public void init(ServletConfig JavaDoc servletConfig) throws ServletException JavaDoc {
65         
66         super.init(servletConfig);
67         
68         log.info("Initializing SearchServlet");
69     }
70     
71     
72     /**
73      * Handle GET requests for weblog pages.
74      */

75     public void doGet(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
76             throws ServletException JavaDoc, IOException JavaDoc {
77         
78         log.debug("Entering");
79         
80         WebsiteData weblog = null;
81         WeblogSearchRequest searchRequest = null;
82         
83         // first off lets parse the incoming request and validate it
84
try {
85             searchRequest = new WeblogSearchRequest(request);
86             
87             // now make sure the specified weblog really exists
88
UserManager userMgr = RollerFactory.getRoller().getUserManager();
89             weblog = userMgr.getWebsiteByHandle(searchRequest.getWeblogHandle(), Boolean.TRUE);
90             
91         } catch(Exception JavaDoc e) {
92             // invalid search request format or weblog doesn't exist
93
log.debug("error creating weblog search request", e);
94             response.sendError(HttpServletResponse.SC_NOT_FOUND);
95             return;
96         }
97         
98         // get their default page template to use for rendering
99
Template page = null;
100         try {
101             page = weblog.getDefaultPage();
102             if(page == null) {
103                 throw new RollerException("Could not lookup default page "+
104                         "for weblog "+weblog.getHandle());
105             }
106         } catch(Exception JavaDoc e) {
107             log.error("Error getting weblogs default page", e);
108         }
109         
110         // set the content type
111
response.setContentType("text/html; charset=utf-8");
112         
113         // looks like we need to render content
114
Map JavaDoc model = new HashMap JavaDoc();
115         try {
116             PageContext JavaDoc pageContext = JspFactory.getDefaultFactory().getPageContext(
117                     this, request, response,"", true, 8192, true);
118             
119             // populate the rendering model
120
Map JavaDoc initData = new HashMap JavaDoc();
121             initData.put("request", request);
122             initData.put("pageContext", pageContext);
123             
124             // this is a little hacky, but nothing we can do about it
125
// we need the 'weblogRequest' to be a pageRequest so other models
126
// are properly loaded, which means that searchRequest needs its
127
// own custom initData property aside from the standard weblogRequest.
128
// possible better approach is make searchRequest extend pageRequest.
129
WeblogPageRequest pageRequest = new WeblogPageRequest();
130             pageRequest.setWeblogHandle(searchRequest.getWeblogHandle());
131             pageRequest.setWeblogCategoryName(searchRequest.getWeblogCategoryName());
132             initData.put("weblogRequest", pageRequest);
133             initData.put("searchRequest", searchRequest);
134             
135             // Load models for pages
136
String JavaDoc searchModels = RollerConfig.getProperty("rendering.searchModels");
137             ModelLoader.loadModels(searchModels, model, initData, true);
138             
139             // Load special models for site-wide blog
140
if(RollerRuntimeConfig.isSiteWideWeblog(weblog.getHandle())) {
141                 String JavaDoc siteModels = RollerConfig.getProperty("rendering.siteModels");
142                 ModelLoader.loadModels(siteModels, model, initData, true);
143             }
144
145             // Load weblog custom models
146
ModelLoader.loadCustomModels(weblog, model, initData);
147             
148             // ick, gotta load pre-3.0 model stuff as well :(
149
ModelLoader.loadOldModels(model, request, response, pageContext, pageRequest);
150             
151             // manually add search model again to support pre-3.0 weblogs
152
Model searchModel = new SearchResultsModel();
153             searchModel.init(initData);
154             model.put("searchResults", searchModel);
155             
156         } catch (RollerException ex) {
157             log.error("Error loading model objects for page", ex);
158             
159             if(!response.isCommitted()) response.reset();
160             response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
161             return;
162         }
163
164         
165         // lookup Renderer we are going to use
166
Renderer renderer = null;
167         try {
168             log.debug("Looking up renderer");
169             renderer = RendererManager.getRenderer(page);
170         } catch(Exception JavaDoc e) {
171             // nobody wants to render my content :(
172
log.error("Couldn't find renderer for rsd template", e);
173             
174             if(!response.isCommitted()) response.reset();
175             response.sendError(HttpServletResponse.SC_NOT_FOUND);
176             return;
177         }
178         
179         // render content
180
CachedContent rendererOutput = new CachedContent(4096);
181         try {
182             log.debug("Doing rendering");
183             renderer.render(model, rendererOutput.getCachedWriter());
184             
185             // flush rendered output and close
186
rendererOutput.flush();
187             rendererOutput.close();
188         } catch(Exception JavaDoc e) {
189             // bummer, error during rendering
190
log.error("Error during rendering for rsd template", e);
191             
192             if(!response.isCommitted()) response.reset();
193             response.sendError(HttpServletResponse.SC_NOT_FOUND);
194             return;
195         }
196         
197         
198         // post rendering process
199

200         // flush rendered content to response
201
log.debug("Flushing response output");
202         response.setContentLength(rendererOutput.getContent().length);
203         response.getOutputStream().write(rendererOutput.getContent());
204         
205         log.debug("Exiting");
206     }
207     
208 }
209
Popular Tags