File Source: PreviewThemeImageServlet.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.logging.Log;
31 import org.apache.commons.logging.LogFactory;
32 import org.apache.roller.weblogger.business.WebloggerFactory;
33 import org.apache.roller.weblogger.business.themes.SharedTheme;
34 import org.apache.roller.weblogger.business.themes.ThemeManager;
35 import org.apache.roller.weblogger.pojos.ThemeResource;
36 import org.apache.roller.weblogger.ui.rendering.util.ModDateHeaderUtil;
37
38 /**
39 * Special previewing servlet which serves files uploaded by users as well as
40 * static resources in shared themes. This servlet differs from the normal
41 * ResourceServlet because it can accept urls parameters which affect how it
42 * behaves which are used for previewing.
43 */
/*
P/P * Method: void org.apache.roller.weblogger.ui.rendering.servlets.PreviewThemeImageServlet()
*
* Postconditions:
* this.context == null
*/
44 public class PreviewThemeImageServlet extends HttpServlet {
45
/*
P/P * Method: org.apache.roller.weblogger.ui.rendering.servlets.PreviewThemeImageServlet__static_init
*
* Postconditions:
* init'ed(log)
*/
46 private static Log log = LogFactory.getLog(PreviewThemeImageServlet.class);
47
48 private ServletContext context = null;
49
50
51 public void init(ServletConfig config) throws ServletException {
52
/*
P/P * Method: void init(ServletConfig)
*
* Preconditions:
* config != null
* log != null
*
* Postconditions:
* init'ed(this.context)
*/
53 super.init(config);
54
55 log.info("Initializing PreviewThemeImageServlet");
56
57 this.context = config.getServletContext();
58 }
59
60
61 /**
62 * Handles requests for user uploaded resources.
63 */
64 public void doGet(HttpServletRequest request, HttpServletResponse response)
65 throws ServletException, IOException {
66
/*
P/P * Method: void doGet(HttpServletRequest, HttpServletResponse)
*
* Preconditions:
* log != null
* request != null
* (soft) response != null
* (soft) this.context != null
*
* Presumptions:
* javax.servlet.http.HttpServletResponse:getOutputStream(...)@116 != null
* org.apache.roller.weblogger.business.Weblogger:getThemeManager(...)@77 != null
* org.apache.roller.weblogger.business.WebloggerFactory:getWeblogger(...)@77 != null
* org.apache.roller.weblogger.business.themes.ThemeManager:getTheme(...)@78 != null
*
* Test Vectors:
* java.io.InputStream:read(...)@117: {-231..0}, {1..232-1}
* org.apache.roller.weblogger.business.themes.SharedTheme:getPreviewImage(...)@79: Addr_Set{null}, Inverse{null}
*/
67 String theme = request.getParameter("theme");
68
69 log.debug("Theme requested ["+theme+"]");
70
71 long resourceLastMod = 0;
72 InputStream resourceStream = null;
73 String previewImagePath = null;
74
75 // try looking up selected theme
76 try {
77 ThemeManager tmgr = WebloggerFactory.getWeblogger().getThemeManager();
78 SharedTheme previewTheme = tmgr.getTheme(theme);
79 ThemeResource previewImage = previewTheme.getPreviewImage();
80 if(previewImage != null) {
81 previewImagePath = previewImage.getPath();
82 resourceLastMod = previewImage.getLastModified();
83 resourceStream = previewImage.getInputStream();
84 }
85 } catch (Exception ex) {
86 log.debug("error looking up preview image", ex);
87 response.sendError(HttpServletResponse.SC_NOT_FOUND);
88 return;
89 }
90
91 // if we don't have a stream to the file then we can't continue
92 if(resourceStream == null) {
93 log.debug("Unable to get theme preview for theme - "+theme);
94 response.sendError(HttpServletResponse.SC_NOT_FOUND);
95 return;
96 }
97
98 // Respond with 304 Not Modified if it is not modified.
99 if (ModDateHeaderUtil.respondIfNotModified(request, response, resourceLastMod)) {
100 return;
101 } else {
102 // set last-modified date
103 ModDateHeaderUtil.setLastModifiedHeader(response, resourceLastMod);
104 }
105
106 log.debug("Everything is cool, sending image");
107
108 // set the content type based on whatever is in our web.xml mime defs
109 response.setContentType(this.context.getMimeType(previewImagePath));
110
111 OutputStream out = null;
112 try {
113 // ok, lets serve up the file
114 byte[] buf = new byte[8192];
115 int length = 0;
116 out = response.getOutputStream();
117 while((length = resourceStream.read(buf)) > 0) {
118 out.write(buf, 0, length);
119 }
120
121 // cleanup
122 out.close();
123 resourceStream.close();
124
125 } catch (Exception ex) {
126 log.error("Error writing resource file", ex);
127 if(!response.isCommitted()) {
128 response.reset();
129 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
130 }
131 }
132
133 }
134
135 }
SofCheck Inspector Build Version : 2.18479
| PreviewThemeImageServlet.java |
2009-Jan-02 14:25:22 |
| PreviewThemeImageServlet.class |
2009-Sep-04 03:12:45 |