Mercurial > hg > digilib-old
annotate servlet/src/digilib/servlet/ServletOps.java @ 819:a23c4c15a6a8 stream
clean up possible resource leaks. better behaviour with unknown image types.
author | robcast |
---|---|
date | Mon, 21 Feb 2011 22:36:35 +0100 |
parents | e6d0cdaa7923 |
children | dc8cda290f2f |
rev | line source |
---|---|
181 | 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 * | |
246 | 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. | |
181 | 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 */ | |
1 | 21 |
22 package digilib.servlet; | |
23 | |
181 | 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.StringTokenizer; | |
1 | 30 |
806
d811204ce5a4
Initialiser is now a ServletContextListener (doesn't need web.xml).
robcast
parents:
805
diff
changeset
|
31 import javax.servlet.ServletContext; |
570 | 32 import javax.servlet.ServletException; |
181 | 33 import javax.servlet.http.HttpServletResponse; |
1 | 34 |
181 | 35 import org.apache.log4j.Logger; |
36 | |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
37 import digilib.image.DocuImage; |
570 | 38 import digilib.image.ImageOpException; |
181 | 39 import digilib.io.FileOps; |
1 | 40 |
41 public class ServletOps { | |
42 | |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
43 private static Logger logger = Logger.getLogger("servlet.op"); |
1 | 44 |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
45 /** |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
46 * convert a string with a list of pathnames into an array of strings using |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
47 * the system's path seperator string |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
48 */ |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
49 public static String[] getPathArray(String paths) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
50 // split list into directories |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
51 StringTokenizer dirs = new StringTokenizer(paths, |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
52 java.io.File.pathSeparator); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
53 int n = dirs.countTokens(); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
54 if (n < 1) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
55 return null; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
56 } |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
57 // add directories into array |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
58 String[] pathArray = new String[n]; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
59 for (int i = 0; i < n; i++) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
60 pathArray[i] = dirs.nextToken(); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
61 } |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
62 return pathArray; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
63 } |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
64 |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
65 /** |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
66 * get a real File for a web app File. |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
67 * |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
68 * If the File is not absolute the path is appended to the base directory of |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
69 * the web-app. |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
70 * |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
71 * @param file |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
72 * @param sc |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
73 * @return |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
74 */ |
806
d811204ce5a4
Initialiser is now a ServletContextListener (doesn't need web.xml).
robcast
parents:
805
diff
changeset
|
75 public static File getFile(File f, ServletContext sc) { |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
76 // is the filename absolute? |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
77 if (!f.isAbsolute()) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
78 // relative path -> use getRealPath to resolve in WEB-INF |
806
d811204ce5a4
Initialiser is now a ServletContextListener (doesn't need web.xml).
robcast
parents:
805
diff
changeset
|
79 String fn = sc.getRealPath(f.getPath()); |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
80 f = new File(fn); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
81 } |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
82 return f; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
83 } |
1 | 84 |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
85 /** |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
86 * get a real file name for a web app file pathname. |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
87 * |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
88 * If filename starts with "/" its treated as absolute else the path is |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
89 * appended to the base directory of the web-app. |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
90 * |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
91 * @param filename |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
92 * @param sc |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
93 * @return |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
94 */ |
806
d811204ce5a4
Initialiser is now a ServletContextListener (doesn't need web.xml).
robcast
parents:
805
diff
changeset
|
95 public static String getFile(String filename, ServletContext sc) { |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
96 File f = new File(filename); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
97 // is the filename absolute? |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
98 if (!f.isAbsolute()) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
99 // relative path -> use getRealPath to resolve in WEB-INF |
806
d811204ce5a4
Initialiser is now a ServletContextListener (doesn't need web.xml).
robcast
parents:
805
diff
changeset
|
100 filename = sc.getRealPath(filename); |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
101 } |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
102 return filename; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
103 } |
393
8a9fd4d64ea7
digilib can now take its error-icons from the web app
robcast
parents:
299
diff
changeset
|
104 |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
105 /** |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
106 * get a real File for a config File. |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
107 * |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
108 * If the File is not absolute the path is appended to the WEB-INF directory |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
109 * of the web-app. |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
110 * |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
111 * @param file |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
112 * @param sc |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
113 * @return |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
114 */ |
806
d811204ce5a4
Initialiser is now a ServletContextListener (doesn't need web.xml).
robcast
parents:
805
diff
changeset
|
115 public static File getConfigFile(File f, ServletContext sc) { |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
116 String fn = f.getPath(); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
117 // is the filename absolute? |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
118 if (f.isAbsolute()) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
119 // does it exist? |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
120 if (f.canRead()) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
121 // fine |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
122 return f; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
123 } else { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
124 // try just the filename as relative |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
125 fn = f.getName(); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
126 } |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
127 } |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
128 // relative path -> use getRealPath to resolve in WEB-INF |
806
d811204ce5a4
Initialiser is now a ServletContextListener (doesn't need web.xml).
robcast
parents:
805
diff
changeset
|
129 String newfn = sc.getRealPath("WEB-INF/" + fn); |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
130 f = new File(newfn); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
131 return f; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
132 } |
393
8a9fd4d64ea7
digilib can now take its error-icons from the web app
robcast
parents:
299
diff
changeset
|
133 |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
134 /** |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
135 * get a real file name for a config file pathname. |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
136 * |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
137 * If filename starts with "/" its treated as absolute else the path is |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
138 * appended to the WEB-INF directory of the web-app. |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
139 * |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
140 * @param filename |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
141 * @param sc |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
142 * @return |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
143 */ |
806
d811204ce5a4
Initialiser is now a ServletContextListener (doesn't need web.xml).
robcast
parents:
805
diff
changeset
|
144 public static String getConfigFile(String filename, ServletContext sc) { |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
145 File f = new File(filename); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
146 // is the filename absolute? |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
147 if (!f.isAbsolute()) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
148 // relative path -> use getRealPath to resolve in WEB-INF |
806
d811204ce5a4
Initialiser is now a ServletContextListener (doesn't need web.xml).
robcast
parents:
805
diff
changeset
|
149 filename = sc.getRealPath("WEB-INF/" + filename); |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
150 } |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
151 return filename; |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
152 } |
264 | 153 |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
154 /** |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
155 * print a servlet response and exit |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
156 */ |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
157 public static void htmlMessage(String msg, HttpServletResponse response) |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
158 throws IOException { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
159 htmlMessage("Scaler", msg, response); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
160 } |
246 | 161 |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
162 /** |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
163 * print a servlet response and exit |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
164 */ |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
165 public static void htmlMessage(String title, String msg, |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
166 HttpServletResponse response) throws IOException { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
167 response.setContentType("text/html; charset=iso-8859-1"); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
168 PrintWriter out = response.getWriter(); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
169 out.println("<html>"); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
170 out.println("<head><title>" + title + "</title></head>"); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
171 out.println("<body>"); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
172 out.println("<p>" + msg + "</p>"); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
173 out.println("</body></html>"); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
174 } |
246 | 175 |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
176 /** |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
177 * Transfers an image file as-is with the mime type mt. |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
178 * |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
179 * The local file is copied to the <code>OutputStream</code> of the |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
180 * <code>ServletResponse</code>. If mt is null then the mime-type is |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
181 * auto-detected with mimeForFile. |
572 | 182 * |
183 * @param f | |
184 * Image file to be sent. | |
185 * @param mt | |
186 * mime-type of the file. | |
187 * @param name | |
188 * name of the download file (for application/x) | |
189 * @param res | |
190 * ServletResponse where the image file will be sent. | |
191 * @throws ImageOpException | |
192 * @throws ServletException | |
193 * Exception on sending data. | |
819
a23c4c15a6a8
clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents:
816
diff
changeset
|
194 * @throws IOException |
572 | 195 */ |
196 public static void sendFile(File f, String mt, String name, | |
819
a23c4c15a6a8
clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents:
816
diff
changeset
|
197 HttpServletResponse response) throws ImageOpException, IOException { |
572 | 198 // use default logger |
199 ServletOps.sendFile(f, mt, name, response, ServletOps.logger); | |
200 } | |
201 | |
202 /** | |
203 * Transfers an image file as-is with the mime type mt. | |
204 * | |
205 * The local file is copied to the <code>OutputStream</code> of the | |
206 * <code>ServletResponse</code>. If mt is null then the mime-type is | |
207 * auto-detected with mimeForFile. | |
557 | 208 * @param f |
209 * Image file to be sent. | |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
210 * @param mt |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
211 * mime-type of the file. |
557 | 212 * @param name |
213 * name of the download file (for application/x) | |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
214 * @param res |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
215 * ServletResponse where the image file will be sent. |
572 | 216 * @param logger |
217 * Logger to use | |
570 | 218 * @throws ImageOpException |
219 * @throws ServletException Exception on sending data. | |
819
a23c4c15a6a8
clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents:
816
diff
changeset
|
220 * @throws IOException |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
221 */ |
572 | 222 public static void sendFile(File f, String mt, String name, HttpServletResponse response, Logger logger) |
819
a23c4c15a6a8
clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents:
816
diff
changeset
|
223 throws ImageOpException, IOException { |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
224 logger.debug("sendRawFile(" + mt + ", " + f + ")"); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
225 if (mt == null) { |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
226 // auto-detect mime-type |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
227 mt = FileOps.mimeForFile(f); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
228 if (mt == null) { |
570 | 229 throw new ImageOpException("Unknown file type."); |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
230 } |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
231 } |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
232 response.setContentType(mt); |
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
233 // open file |
557 | 234 if (mt.startsWith("application")) { |
235 if (name == null) { | |
236 // no download name -- use filename | |
237 name = f.getName(); | |
238 } | |
239 response.addHeader("Content-Disposition", "attachment; filename=\""+name+"\""); | |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
240 } |
803
225054177f67
remove all ServletOutputStream.flush(). (stupid me ;-)
robcast
parents:
572
diff
changeset
|
241 FileInputStream inFile = null; |
570 | 242 try { |
803
225054177f67
remove all ServletOutputStream.flush(). (stupid me ;-)
robcast
parents:
572
diff
changeset
|
243 inFile = new FileInputStream(f); |
570 | 244 OutputStream outStream = response.getOutputStream(); |
803
225054177f67
remove all ServletOutputStream.flush(). (stupid me ;-)
robcast
parents:
572
diff
changeset
|
245 // TODO: should we set content length? |
225054177f67
remove all ServletOutputStream.flush(). (stupid me ;-)
robcast
parents:
572
diff
changeset
|
246 // see http://www.prozesse-und-systeme.de/servletFlush.html |
570 | 247 response.setContentLength( (int) f.length()); |
248 byte dataBuffer[] = new byte[4096]; | |
249 int len; | |
250 while ((len = inFile.read(dataBuffer)) != -1) { | |
251 // copy out file | |
252 outStream.write(dataBuffer, 0, len); | |
253 } | |
803
225054177f67
remove all ServletOutputStream.flush(). (stupid me ;-)
robcast
parents:
572
diff
changeset
|
254 } finally { |
225054177f67
remove all ServletOutputStream.flush(). (stupid me ;-)
robcast
parents:
572
diff
changeset
|
255 try { |
225054177f67
remove all ServletOutputStream.flush(). (stupid me ;-)
robcast
parents:
572
diff
changeset
|
256 if (inFile != null) { |
225054177f67
remove all ServletOutputStream.flush(). (stupid me ;-)
robcast
parents:
572
diff
changeset
|
257 inFile.close(); |
225054177f67
remove all ServletOutputStream.flush(). (stupid me ;-)
robcast
parents:
572
diff
changeset
|
258 } |
225054177f67
remove all ServletOutputStream.flush(). (stupid me ;-)
robcast
parents:
572
diff
changeset
|
259 } catch (IOException e) { |
225054177f67
remove all ServletOutputStream.flush(). (stupid me ;-)
robcast
parents:
572
diff
changeset
|
260 // nothing to do |
225054177f67
remove all ServletOutputStream.flush(). (stupid me ;-)
robcast
parents:
572
diff
changeset
|
261 } |
544
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
543
diff
changeset
|
262 } |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
263 } |
1 | 264 |
544
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
543
diff
changeset
|
265 /** |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
543
diff
changeset
|
266 * Write image img to ServletResponse response. |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
543
diff
changeset
|
267 * |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
543
diff
changeset
|
268 * @param img |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
543
diff
changeset
|
269 * @param mimeType |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
543
diff
changeset
|
270 * @param response |
570 | 271 * @throws ImageOpException |
272 * @throws ServletException Exception on sending data. | |
544
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
543
diff
changeset
|
273 */ |
5ff500d6812a
more steps towards more standard java.util.concurrent design
robcast
parents:
543
diff
changeset
|
274 public static void sendImage(DocuImage img, String mimeType, |
570 | 275 HttpServletResponse response) throws ImageOpException, |
276 ServletException { | |
572 | 277 ServletOps.sendImage(img, mimeType, response, ServletOps.logger); |
278 } | |
279 | |
280 /** | |
281 * Write image img to ServletResponse response. | |
282 * | |
283 * @param img | |
284 * @param mimeType | |
285 * @param response | |
286 * @param logger | |
287 * @throws ImageOpException | |
288 * @throws ServletException Exception on sending data. | |
289 */ | |
290 public static void sendImage(DocuImage img, String mimeType, | |
291 HttpServletResponse response, Logger logger) throws ImageOpException, | |
292 ServletException { | |
805 | 293 logger.debug("sending to response:"+ response + " committed=" + response.isCommitted()); |
570 | 294 try { |
295 OutputStream outstream = response.getOutputStream(); | |
296 // setup output -- if mime type is set use that otherwise | |
297 // if source is JPG then dest will be JPG else it's PNG | |
298 if (mimeType == null) { | |
299 mimeType = img.getMimetype(); | |
819
a23c4c15a6a8
clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents:
816
diff
changeset
|
300 if (mimeType == null) { |
a23c4c15a6a8
clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents:
816
diff
changeset
|
301 // still no mime-type |
a23c4c15a6a8
clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents:
816
diff
changeset
|
302 logger.warn("sendImage without mime-type! using image/jpeg."); |
a23c4c15a6a8
clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents:
816
diff
changeset
|
303 mimeType = "image/jpeg"; |
a23c4c15a6a8
clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents:
816
diff
changeset
|
304 } |
570 | 305 } |
819
a23c4c15a6a8
clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents:
816
diff
changeset
|
306 if ((mimeType.equals("image/jpeg") || mimeType.equals("image/jp2") || |
a23c4c15a6a8
clean up possible resource leaks. better behaviour with unknown image types.
robcast
parents:
816
diff
changeset
|
307 mimeType.equals("image/fpx"))) { |
570 | 308 mimeType = "image/jpeg"; |
309 } else { | |
310 mimeType = "image/png"; | |
311 } | |
312 // write the image | |
313 response.setContentType(mimeType); | |
314 img.writeImage(mimeType, outstream); | |
315 } catch (IOException e) { | |
316 throw new ServletException("Error sending image:", e); | |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
317 } |
803
225054177f67
remove all ServletOutputStream.flush(). (stupid me ;-)
robcast
parents:
572
diff
changeset
|
318 // TODO: should we: finally { img.dispose(); } |
543
919e008ab1fb
more steps towards more standard java.util.concurrent design
robcast
parents:
524
diff
changeset
|
319 } |
1 | 320 |
246 | 321 } |