File Source: PreviewResourceServlet.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.io.InputStream;
23 import java.io.OutputStream;
24 import javax.servlet.ServletConfig;
25 import javax.servlet.ServletContext;
26 import javax.servlet.ServletException;
27 import javax.servlet.http.HttpServlet;
28 import javax.servlet.http.HttpServletRequest;
29 import javax.servlet.http.HttpServletResponse;
30 import org.apache.commons.lang.StringUtils;
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.FileManager;
35 import org.apache.roller.weblogger.business.WebloggerFactory;
36 import org.apache.roller.weblogger.pojos.Theme;
37 import org.apache.roller.weblogger.pojos.ThemeResource;
38 import org.apache.roller.weblogger.pojos.WeblogTheme;
39 import org.apache.roller.weblogger.pojos.Weblog;
40 import org.apache.roller.weblogger.ui.rendering.util.ModDateHeaderUtil;
41 import org.apache.roller.weblogger.ui.rendering.util.WeblogPreviewResourceRequest;
42
43
44 /**
45 * Special previewing servlet which serves files uploaded by users as well as
46 * static resources in shared themes. This servlet differs from the normal
47 * ResourceServlet because it can accept urls parameters which affect how it
48 * behaves which are used for previewing.
49 *
50 * @web.servlet name="PreviewResourceServlet" load-on-startup="9"
51 * @web.servlet-mapping url-pattern="/roller-ui/authoring/previewresource/*"
52 */
/*
P/P * Method: void org.apache.roller.weblogger.ui.rendering.servlets.PreviewResourceServlet()
*
* Postconditions:
* this.context == null
*/
53 public class PreviewResourceServlet extends HttpServlet {
54
/*
P/P * Method: org.apache.roller.weblogger.ui.rendering.servlets.PreviewResourceServlet__static_init
*
* Postconditions:
* init'ed(log)
*/
55 private static Log log = LogFactory.getLog(PreviewResourceServlet.class);
56
57 private ServletContext context = null;
58
59
60 public void init(ServletConfig config) throws ServletException {
61
/*
P/P * Method: void init(ServletConfig)
*
* Preconditions:
* config != null
* log != null
*
* Postconditions:
* init'ed(this.context)
*/
62 super.init(config);
63
64 log.info("Initializing PreviewResourceServlet");
65
66 this.context = config.getServletContext();
67 }
68
69
70 /**
71 * Handles requests for user uploaded resources.
72 */
73 public void doGet(HttpServletRequest request, HttpServletResponse response)
74 throws ServletException, IOException {
75
/*
P/P * Method: void doGet(HttpServletRequest, HttpServletResponse)
*
* Preconditions:
* log != null
* request != null
* (soft) org/apache/roller/weblogger/ui/rendering/util/WeblogPreviewResourceRequest.log != null
* (soft) org/apache/roller/weblogger/ui/rendering/util/WeblogRequest.log != null
* (soft) org/apache/roller/weblogger/ui/rendering/util/WeblogResourceRequest.log != null
* (soft) response != null
* (soft) this.context != null
*
* Presumptions:
* javax.servlet.http.HttpServletResponse:getOutputStream(...)@165 != null
* org.apache.roller.weblogger.business.FileManager:getFile(...)@136 != null
* org.apache.roller.weblogger.business.Weblogger:getFileManager(...)@135 != null
* org.apache.roller.weblogger.business.WebloggerFactory:getWeblogger(...)@135 != null
* org.apache.roller.weblogger.pojos.ThemeResource:getInputStream(...)@139 != null
* ...
*
* Test Vectors:
* java.io.InputStream:read(...)@166: {-231..0}, {1..232-1}
* org.apache.commons.lang.StringUtils:isEmpty(...)@105: {1}, {0}
* org.apache.roller.weblogger.pojos.Theme:getResource(...)@107: Addr_Set{null}, Inverse{null}
* org.apache.roller.weblogger.pojos.Weblog:getTheme(...)@117: Addr_Set{null}, Inverse{null}
* org.apache.roller.weblogger.pojos.WeblogTheme:getResource(...)@119: Addr_Set{null}, Inverse{null}
*/
76 Weblog weblog = null;
+ 77 String context = request.getContextPath();
+ 78 String servlet = request.getServletPath();
+ 79 String reqURI = request.getRequestURI();
80
81 WeblogPreviewResourceRequest resourceRequest = null;
82 try {
83 // parse the incoming request and extract the relevant data
84 resourceRequest = new WeblogPreviewResourceRequest(request);
85
86 weblog = resourceRequest.getWeblog();
87 if(weblog == null) {
88 throw new WebloggerException("unable to lookup weblog: "+
89 resourceRequest.getWeblogHandle());
90 }
91
92 } catch(Exception e) {
93 // invalid resource request or weblog doesn't exist
94 log.debug("error creating weblog resource request", e);
95 response.sendError(HttpServletResponse.SC_NOT_FOUND);
96 return;
97 }
98
99 log.debug("Resource requested ["+resourceRequest.getResourcePath()+"]");
100
101 long resourceLastMod = 0;
102 InputStream resourceStream = null;
103
104 // first, see if we have a preview theme to operate from
105 if(!StringUtils.isEmpty(resourceRequest.getThemeName())) {
106 Theme theme = resourceRequest.getTheme();
+ 107 ThemeResource resource = theme.getResource(resourceRequest.getResourcePath());
108 if(resource != null) {
109 resourceLastMod = resource.getLastModified();
110 resourceStream = resource.getInputStream();
111 }
112 }
113
114 // second, see if resource comes from weblog's configured shared theme
115 if(resourceStream == null) {
116 try {
117 WeblogTheme weblogTheme = weblog.getTheme();
118 if(weblogTheme != null) {
119 ThemeResource resource = weblogTheme.getResource(resourceRequest.getResourcePath());
120 if(resource != null) {
121 resourceLastMod = resource.getLastModified();
122 resourceStream = resource.getInputStream();
123 }
124 }
125 } catch (Exception ex) {
126 // hmmm, some kind of error getting theme. that's an error.
127 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
128 return;
129 }
130 }
131
132 // if not from theme then see if resource is in weblog's upload dir
133 if(resourceStream == null) {
134 try {
135 FileManager fileMgr = WebloggerFactory.getWeblogger().getFileManager();
136 ThemeResource resource = fileMgr.getFile(weblog,
137 resourceRequest.getResourcePath());
138 resourceLastMod = resource.getLastModified();
139 resourceStream = resource.getInputStream();
140 } catch (Exception ex) {
141 // still not found? then we don't have it, 404.
142 log.debug("Unable to get resource", ex);
143 response.sendError(HttpServletResponse.SC_NOT_FOUND);
144 return;
145 }
146 }
147
148 // Respond with 304 Not Modified if it is not modified.
149 if (ModDateHeaderUtil.respondIfNotModified(request, response, resourceLastMod)) {
150 return;
151 } else {
152 // set last-modified date
153 ModDateHeaderUtil.setLastModifiedHeader(response, resourceLastMod);
154 }
155
156
157 // set the content type based on whatever is in our web.xml mime defs
158 response.setContentType(this.context.getMimeType(resourceRequest.getResourcePath()));
159
160 OutputStream out = null;
161 try {
162 // ok, lets serve up the file
163 byte[] buf = new byte[8192];
164 int length = 0;
165 out = response.getOutputStream();
166 while((length = resourceStream.read(buf)) > 0) {
167 out.write(buf, 0, length);
168 }
169
170 // cleanup
171 out.close();
172 resourceStream.close();
173
174 } catch (Exception ex) {
175 log.error("Error writing resource file", ex);
176 if(!response.isCommitted()) {
177 response.reset();
178 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
179 }
180 }
181
182 }
183
184 }
SofCheck Inspector Build Version : 2.18479
| PreviewResourceServlet.java |
2009-Jan-02 14:24:44 |
| PreviewResourceServlet.class |
2009-Sep-04 03:12:45 |