comparison servlet2/src/main/java/digilib/servlet/ServletOps.java @ 903:7779b37d1d05

refactored into maven modules per servlet type. can build servlet-api 2.3 and 3.0 via profile now!
author robcast
date Tue, 26 Apr 2011 20:24:31 +0200
parents
children
comparison
equal deleted inserted replaced
902:89ba3ffcf552 903:7779b37d1d05
1 /*
2 * ServletOps -- Servlet utility class
3 *
4 * Digital Image Library servlet components
5 *
6 * Copyright (C) 2001, 2002 Robert Casties (robcast@mail.berlios.de)
7 *
8 * This program is free software; you can redistribute it and/or modify it under
9 * the terms of the GNU General Public License as published by the Free Software
10 * Foundation; either version 2 of the License, or (at your option) any later
11 * version.
12 *
13 * Please read license.txt for the full details. A copy of the GPL may be found
14 * at http://www.gnu.org/copyleft/lgpl.html
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
18 * Place, Suite 330, Boston, MA 02111-1307 USA
19 *
20 */
21
22 package digilib.servlet;
23
24 import java.io.File;
25 import java.io.FileInputStream;
26 import java.io.IOException;
27 import java.io.OutputStream;
28 import java.io.PrintWriter;
29 import java.util.Enumeration;
30 import java.util.StringTokenizer;
31
32 import javax.servlet.ServletContext;
33 import javax.servlet.ServletException;
34 import javax.servlet.http.HttpServletRequest;
35 import javax.servlet.http.HttpServletResponse;
36
37 import org.apache.log4j.Logger;
38
39 import digilib.image.DocuImage;
40 import digilib.image.ImageOpException;
41 import digilib.io.FileOps;
42
43 public class ServletOps {
44
45 private static Logger logger = Logger.getLogger("servlet.op");
46
47 /**
48 * convert a string with a list of pathnames into an array of strings using
49 * the system's path seperator string
50 */
51 public static String[] getPathArray(String paths) {
52 // split list into directories
53 StringTokenizer dirs = new StringTokenizer(paths,
54 java.io.File.pathSeparator);
55 int n = dirs.countTokens();
56 if (n < 1) {
57 return null;
58 }
59 // add directories into array
60 String[] pathArray = new String[n];
61 for (int i = 0; i < n; i++) {
62 pathArray[i] = dirs.nextToken();
63 }
64 return pathArray;
65 }
66
67 /**
68 * get a real File for a web app File.
69 *
70 * If the File is not absolute the path is appended to the base directory of
71 * the web-app.
72 *
73 * @param file
74 * @param sc
75 * @return
76 */
77 public static File getFile(File f, ServletContext sc) {
78 // is the filename absolute?
79 if (!f.isAbsolute()) {
80 // relative path -> use getRealPath to resolve in WEB-INF
81 String fn = sc.getRealPath(f.getPath());
82 f = new File(fn);
83 }
84 return f;
85 }
86
87 /**
88 * get a real file name for a web app file pathname.
89 *
90 * If filename starts with "/" its treated as absolute else the path is
91 * appended to the base directory of the web-app.
92 *
93 * @param filename
94 * @param sc
95 * @return
96 */
97 public static String getFile(String filename, ServletContext sc) {
98 File f = new File(filename);
99 // is the filename absolute?
100 if (!f.isAbsolute()) {
101 // relative path -> use getRealPath to resolve in WEB-INF
102 filename = sc.getRealPath(filename);
103 }
104 return filename;
105 }
106
107 /**
108 * get a real File for a config File.
109 *
110 * If the File is not absolute the path is appended to the WEB-INF directory
111 * of the web-app.
112 *
113 * @param file
114 * @param sc
115 * @return
116 */
117 public static File getConfigFile(File f, ServletContext sc) {
118 String fn = f.getPath();
119 // is the filename absolute?
120 if (f.isAbsolute()) {
121 // does it exist?
122 if (f.canRead()) {
123 // fine
124 return f;
125 } else {
126 // try just the filename as relative
127 fn = f.getName();
128 }
129 }
130 // relative path -> use getRealPath to resolve in WEB-INF
131 String newfn = sc.getRealPath("WEB-INF/" + fn);
132 f = new File(newfn);
133 return f;
134 }
135
136 /**
137 * get a real file name for a config file pathname.
138 *
139 * If filename starts with "/" its treated as absolute else the path is
140 * appended to the WEB-INF directory of the web-app.
141 *
142 * @param filename
143 * @param sc
144 * @return
145 */
146 public static String getConfigFile(String filename, ServletContext sc) {
147 File f = new File(filename);
148 // is the filename absolute?
149 if (!f.isAbsolute()) {
150 // relative path -> use getRealPath to resolve in WEB-INF
151 filename = sc.getRealPath("WEB-INF/" + filename);
152 }
153 return filename;
154 }
155
156 /**
157 * print a servlet response
158 */
159 public static void htmlMessage(String msg, HttpServletResponse response)
160 throws IOException {
161 htmlMessage("Scaler", msg, response);
162 }
163
164 /**
165 * print a servlet response
166 */
167 public static void htmlMessage(String title, String msg,
168 HttpServletResponse response) throws IOException {
169 response.setContentType("text/html; charset=iso-8859-1");
170 PrintWriter out = response.getWriter();
171 out.println("<html>");
172 out.println("<head><title>" + title + "</title></head>");
173 out.println("<body>");
174 out.println("<p>" + msg + "</p>");
175 out.println("</body></html>");
176 }
177
178 /**
179 * Transfers an image file as-is with the mime type mt.
180 *
181 * The local file is copied to the <code>OutputStream</code> of the
182 * <code>ServletResponse</code>. If mt is null then the mime-type is
183 * auto-detected with mimeForFile.
184 *
185 * @param f
186 * Image file to be sent.
187 * @param mt
188 * mime-type of the file.
189 * @param name
190 * name of the download file (for application/x)
191 * @param res
192 * ServletResponse where the image file will be sent.
193 * @throws ImageOpException
194 * @throws ServletException
195 * Exception on sending data.
196 * @throws IOException
197 */
198 public static void sendFile(File f, String mt, String name,
199 HttpServletResponse response) throws ImageOpException, IOException {
200 // use default logger
201 ServletOps.sendFile(f, mt, name, response, ServletOps.logger);
202 }
203
204 /**
205 * Transfers an image file as-is with the mime type mt.
206 *
207 * The local file is copied to the <code>OutputStream</code> of the
208 * <code>ServletResponse</code>. If mt is null then the mime-type is
209 * auto-detected with mimeForFile.
210 * @param f
211 * Image file to be sent.
212 * @param mt
213 * mime-type of the file.
214 * @param name
215 * name of the download file (for application/x)
216 * @param res
217 * ServletResponse where the image file will be sent.
218 * @param logger
219 * Logger to use
220 * @throws ImageOpException
221 * @throws ServletException Exception on sending data.
222 * @throws IOException
223 */
224 public static void sendFile(File f, String mt, String name, HttpServletResponse response, Logger logger)
225 throws ImageOpException, IOException {
226 logger.debug("sendRawFile(" + mt + ", " + f + ")");
227 if (response == null) {
228 logger.error("No response!");
229 return;
230 }
231 if (mt == null) {
232 // auto-detect mime-type
233 mt = FileOps.mimeForFile(f);
234 if (mt == null) {
235 throw new ImageOpException("Unknown file type.");
236 }
237 }
238 response.setContentType(mt);
239 // open file
240 if (mt.startsWith("application")) {
241 if (name == null) {
242 // no download name -- use filename
243 name = f.getName();
244 }
245 response.addHeader("Content-Disposition", "attachment; filename=\""+name+"\"");
246 }
247 FileInputStream inFile = null;
248 try {
249 inFile = new FileInputStream(f);
250 OutputStream outStream = response.getOutputStream();
251 // TODO: should we set content length?
252 // see http://www.prozesse-und-systeme.de/servletFlush.html
253 response.setContentLength( (int) f.length());
254 byte dataBuffer[] = new byte[4096];
255 int len;
256 while ((len = inFile.read(dataBuffer)) != -1) {
257 // copy out file
258 outStream.write(dataBuffer, 0, len);
259 }
260 } finally {
261 try {
262 if (inFile != null) {
263 inFile.close();
264 }
265 } catch (IOException e) {
266 // nothing to do
267 }
268 }
269 }
270
271 /**
272 * Write image img to ServletResponse response.
273 *
274 * @param img
275 * @param mimeType
276 * @param response
277 * @throws ImageOpException
278 * @throws ServletException Exception on sending data.
279 */
280 public static void sendImage(DocuImage img, String mimeType,
281 HttpServletResponse response) throws ImageOpException,
282 ServletException {
283 ServletOps.sendImage(img, mimeType, response, ServletOps.logger);
284 }
285
286 /**
287 * Write image img to ServletResponse response.
288 *
289 * @param img
290 * @param mimeType
291 * @param response
292 * @param logger
293 * @throws ImageOpException
294 * @throws ServletException Exception on sending data.
295 */
296 public static void sendImage(DocuImage img, String mimeType,
297 HttpServletResponse response, Logger logger) throws ImageOpException,
298 ServletException {
299 if (response == null) {
300 logger.error("No response!");
301 return;
302 }
303 //logger.debug("sending to response: ("+ headersToString(response) + ") committed=" + response.isCommitted());
304 logger.debug("sending to response. committed=" + response.isCommitted());
305 // TODO: should we erase or replace old last-modified header?
306 try {
307 OutputStream outstream = response.getOutputStream();
308 // setup output -- if mime type is set use that otherwise
309 // if source is JPG then dest will be JPG else it's PNG
310 if (mimeType == null) {
311 mimeType = img.getMimetype();
312 if (mimeType == null) {
313 // still no mime-type
314 logger.warn("sendImage without mime-type! using image/jpeg.");
315 mimeType = "image/jpeg";
316 }
317 }
318 if ((mimeType.equals("image/jpeg") || mimeType.equals("image/jp2") ||
319 mimeType.equals("image/fpx"))) {
320 mimeType = "image/jpeg";
321 } else {
322 mimeType = "image/png";
323 }
324 // write the image
325 response.setContentType(mimeType);
326 img.writeImage(mimeType, outstream);
327 } catch (IOException e) {
328 throw new ServletException("Error sending image:", e);
329 }
330 // TODO: should we: finally { img.dispose(); }
331 }
332
333 /** Returns text representation of headers for debuggging purposes.
334 * @param req
335 * @return
336 */
337 public static String headersToString(HttpServletRequest req) {
338 String s = "";
339 @SuppressWarnings("unchecked")
340 Enumeration<String> hns = req.getHeaderNames();
341 while (hns.hasMoreElements()) {
342 String hn = hns.nextElement();
343 s += hn + "=" + req.getHeader(hn) + "; ";
344 }
345 return s;
346 }
347
348
349 }