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