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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
181
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
1 /*
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
2 * ServletOps -- Servlet utility class
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
3 *
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
4 * Digital Image Library servlet components
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
5 *
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
6 * Copyright (C) 2001, 2002 Robert Casties (robcast@mail.berlios.de)
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
7 *
246
aaf6eace011d Servlet version 1.19b4
robcast
parents: 196
diff changeset
8 * This program is free software; you can redistribute it and/or modify it under
aaf6eace011d Servlet version 1.19b4
robcast
parents: 196
diff changeset
9 * the terms of the GNU General Public License as published by the Free Software
aaf6eace011d Servlet version 1.19b4
robcast
parents: 196
diff changeset
10 * Foundation; either version 2 of the License, or (at your option) any later
aaf6eace011d Servlet version 1.19b4
robcast
parents: 196
diff changeset
11 * version.
181
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
12 *
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
13 * Please read license.txt for the full details. A copy of the GPL may be found
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
14 * at http://www.gnu.org/copyleft/lgpl.html
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
15 *
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
16 * You should have received a copy of the GNU General Public License along with
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
17 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
18 * Place, Suite 330, Boston, MA 02111-1307 USA
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
19 *
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
20 */
1
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
21
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
22 package digilib.servlet;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
23
181
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
24 import java.io.File;
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
25 import java.io.FileInputStream;
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
26 import java.io.IOException;
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
27 import java.io.OutputStream;
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
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
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
31 import java.util.StringTokenizer;
1
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
32
806
d811204ce5a4 Initialiser is now a ServletContextListener (doesn't need web.xml).
robcast
parents: 805
diff changeset
33 import javax.servlet.ServletContext;
570
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
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
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
37 import javax.servlet.http.HttpServletResponse;
1
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
38
181
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
39 import org.apache.log4j.Logger;
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
40
543
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents: 524
diff changeset
41 import digilib.image.DocuImage;
570
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
42 import digilib.image.ImageOpException;
181
afe7ff98bb71 Servlet version 1.18b1
robcast
parents: 95
diff changeset
43 import digilib.io.FileOps;
1
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
44
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
45 public class ServletOps {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
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
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
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
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
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
4ea05660f3e0 Servlet version 1.21b1
robcast
parents: 246
diff changeset
157
543
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents: 524
diff changeset
158 /**
820
dc8cda290f2f deal with null response
robcast
parents: 819
diff changeset
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
aaf6eace011d Servlet version 1.19b4
robcast
parents: 196
diff changeset
165
543
919e008ab1fb more steps towards more standard java.util.concurrent design
robcast
parents: 524
diff changeset
166 /**
820
dc8cda290f2f deal with null response
robcast
parents: 819
diff changeset
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
aaf6eace011d Servlet version 1.19b4
robcast
parents: 196
diff changeset
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
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
186 *
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
187 * @param f
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
188 * Image file to be sent.
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
189 * @param mt
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
190 * mime-type of the file.
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
191 * @param name
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
192 * name of the download file (for application/x)
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
193 * @param res
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
194 * ServletResponse where the image file will be sent.
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
195 * @throws ImageOpException
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
196 * @throws ServletException
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
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
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
199 */
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
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
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
202 // use default logger
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
203 ServletOps.sendFile(f, mt, name, response, ServletOps.logger);
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
204 }
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
205
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
206 /**
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
207 * Transfers an image file as-is with the mime type mt.
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
208 *
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
209 * The local file is copied to the <code>OutputStream</code> of the
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
210 * <code>ServletResponse</code>. If mt is null then the mime-type is
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
211 * auto-detected with mimeForFile.
557
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 544
diff changeset
212 * @param f
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 544
diff changeset
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
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 544
diff changeset
216 * @param name
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 544
diff changeset
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
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
220 * @param logger
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
221 * Logger to use
570
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
222 * @throws ImageOpException
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
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
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
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
dc8cda290f2f deal with null response
robcast
parents: 819
diff changeset
229 if (response == null) {
dc8cda290f2f deal with null response
robcast
parents: 819
diff changeset
230 logger.error("No response!");
dc8cda290f2f deal with null response
robcast
parents: 819
diff changeset
231 return;
dc8cda290f2f deal with null response
robcast
parents: 819
diff changeset
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
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
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
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 544
diff changeset
242 if (mt.startsWith("application")) {
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 544
diff changeset
243 if (name == null) {
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 544
diff changeset
244 // no download name -- use filename
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 544
diff changeset
245 name = f.getName();
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 544
diff changeset
246 }
0885f5ca5b24 more refactoring and rearranging
robcast
parents: 544
diff changeset
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
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
250 try {
803
225054177f67 remove all ServletOutputStream.flush(). (stupid me ;-)
robcast
parents: 572
diff changeset
251 inFile = new FileInputStream(f);
570
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
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
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
255 response.setContentLength( (int) f.length());
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
256 byte dataBuffer[] = new byte[4096];
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
257 int len;
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
258 while ((len = inFile.read(dataBuffer)) != -1) {
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
259 // copy out file
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
260 outStream.write(dataBuffer, 0, len);
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
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
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
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
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
279 * @throws ImageOpException
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
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
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
283 HttpServletResponse response) throws ImageOpException,
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
284 ServletException {
572
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
285 ServletOps.sendImage(img, mimeType, response, ServletOps.logger);
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
286 }
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
287
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
288 /**
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
289 * Write image img to ServletResponse response.
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
290 *
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
291 * @param img
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
292 * @param mimeType
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
293 * @param response
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
294 * @param logger
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
295 * @throws ImageOpException
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
296 * @throws ServletException Exception on sending data.
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
297 */
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
298 public static void sendImage(DocuImage img, String mimeType,
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
299 HttpServletResponse response, Logger logger) throws ImageOpException,
800f2bb57f1f slightly better logging
robcast
parents: 570
diff changeset
300 ServletException {
820
dc8cda290f2f deal with null response
robcast
parents: 819
diff changeset
301 if (response == null) {
dc8cda290f2f deal with null response
robcast
parents: 819
diff changeset
302 logger.error("No response!");
dc8cda290f2f deal with null response
robcast
parents: 819
diff changeset
303 return;
dc8cda290f2f deal with null response
robcast
parents: 819
diff changeset
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
8ee72433bb8f logs more request and response headers.
robcast
parents: 831
diff changeset
306 // TODO: should we erase or replace old last-modified header?
570
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
307 try {
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
308 OutputStream outstream = response.getOutputStream();
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
309 // setup output -- if mime type is set use that otherwise
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
310 // if source is JPG then dest will be JPG else it's PNG
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
311 if (mimeType == null) {
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
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
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
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
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
321 mimeType = "image/jpeg";
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
322 } else {
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
323 mimeType = "image/png";
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
324 }
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
325 // write the image
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
326 response.setContentType(mimeType);
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
327 img.writeImage(mimeType, outstream);
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
328 } catch (IOException e) {
fd2ef7e46119 more cleanup, set version to 1.8.2
robcast
parents: 557
diff changeset
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
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
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
aaf6eace011d Servlet version 1.19b4
robcast
parents: 196
diff changeset
361 }