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