Mercurial > hg > digilib-old
annotate servlet/src/digilib/servlet/Scaler.java @ 263:e16d132aa6f6
Servlet version 1.21b1
- directory indexing got faster but less safe
(configurable by "safe-dir-index")
- mo=rawfile supplies filename
- DigilibConfig takes File parameters
- some SerialVersionUIDs (suggested by Eclipse)
author | robcast |
---|---|
date | Mon, 11 Oct 2004 21:23:00 +0200 |
parents | 2adfb8bea870 |
children | fba0857fde34 |
rev | line source |
---|---|
181 | 1 /* |
2 * Scaler -- Scaler servlet main class | |
3 * | |
4 * Digital Image Library servlet components | |
5 * | |
6 * Copyright (C) 2001, 2002, 2003 Robert Casties (robcast@mail.berlios.de) | |
7 * | |
8 * This program is free software; you can redistribute it and/or modify it | |
9 * under the terms of the GNU General Public License as published by the Free | |
10 * Software Foundation; either version 2 of the License, or (at your option) | |
11 * any later version. | |
12 * | |
13 * Please read license.txt for the full details. A copy of the GPL may be found | |
14 * at http://www.gnu.org/copyleft/lgpl.html | |
15 * | |
16 * You should have received a copy of the GNU General Public License along with | |
17 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple | |
18 * Place, Suite 330, Boston, MA 02111-1307 USA | |
19 * | |
20 */ | |
1 | 21 |
22 package digilib.servlet; | |
23 | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
24 import java.awt.geom.AffineTransform; |
100 | 25 import java.awt.geom.NoninvertibleTransformException; |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
26 import java.awt.geom.Rectangle2D; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
27 import java.io.File; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
28 import java.io.IOException; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
29 import java.util.List; |
1 | 30 |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
31 import javax.servlet.ServletConfig; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
32 import javax.servlet.ServletContext; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
33 import javax.servlet.ServletException; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
34 import javax.servlet.http.HttpServlet; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
35 import javax.servlet.http.HttpServletRequest; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
36 import javax.servlet.http.HttpServletResponse; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
37 |
181 | 38 import org.apache.log4j.Logger; |
39 | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
40 import digilib.auth.AuthOpException; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
41 import digilib.auth.AuthOps; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
42 import digilib.image.DocuImage; |
122 | 43 import digilib.image.DocuInfo; |
149 | 44 import digilib.image.ImageLoaderImageInfoDocuInfo; |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
45 import digilib.image.ImageOpException; |
149 | 46 import digilib.image.ImageSize; |
86 | 47 import digilib.io.DocuDirCache; |
181 | 48 import digilib.io.FileOpException; |
49 import digilib.io.FileOps; | |
161 | 50 import digilib.io.ImageFile; |
51 import digilib.io.ImageFileset; | |
1 | 52 |
64
5ea1999befd4
New JAI ImageLoader plugin. Currently uses first beta version of the plugin.
robcast
parents:
62
diff
changeset
|
53 //import tilecachetool.*; |
1 | 54 |
73 | 55 /** |
181 | 56 * @author casties |
57 */ | |
1 | 58 //public class Scaler extends HttpServlet implements SingleThreadModel { |
59 public class Scaler extends HttpServlet { | |
60 | |
263 | 61 private static final long serialVersionUID = -325080527268912852L; |
62 | |
73 | 63 // digilib servlet version (for all components) |
263 | 64 public static final String dlVersion = "1.21b1"; |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
65 |
181 | 66 // logger for accounting requests |
67 Logger accountlog = Logger.getLogger("account.request"); | |
68 // gengeral logger for this class | |
69 Logger logger = Logger.getLogger("digilib.servlet"); | |
70 // logger for authentication related | |
71 Logger authlog = Logger.getLogger("digilib.auth"); | |
72 | |
73 | |
73 | 74 // AuthOps instance |
75 AuthOps authOp; | |
86 | 76 // DocuDirCache instance |
77 DocuDirCache dirCache; | |
161 | 78 |
153 | 79 // deny image file |
80 File denyImgFile; | |
81 // error image file | |
82 File errorImgFile; | |
83 // subsampling before scaling | |
84 float minSubsample = 2f; | |
85 // send files as is? | |
86 boolean sendFileAllowed = true; | |
87 // default scaling quality | |
88 int defaultQuality = 1; | |
1 | 89 |
94 | 90 // DigilibConfiguration instance |
73 | 91 DigilibConfiguration dlConfig; |
1 | 92 |
73 | 93 // use authorization database |
94 boolean useAuthentication = true; | |
1 | 95 |
100 | 96 // EXPRIMENTAL |
97 // try to enlarge cropping area for "oblique" angles | |
98 boolean wholeRotArea = false; | |
99 | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
100 /** |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
101 * Initialisation on first run. |
73 | 102 * |
103 * @see javax.servlet.Servlet#init(javax.servlet.ServletConfig) | |
104 */ | |
105 public void init(ServletConfig config) throws ServletException { | |
106 super.init(config); | |
1 | 107 |
73 | 108 // Debuggin! |
109 //TCTool tctool = new TCTool(); | |
153 | 110 |
147 | 111 System.out.println( |
189 | 112 "***** Digital Image Library Image Scaler Servlet (version " |
147 | 113 + dlVersion |
114 + ") *****"); | |
1 | 115 |
73 | 116 // get our ServletContext |
117 ServletContext context = config.getServletContext(); | |
118 // see if there is a Configuration instance | |
119 dlConfig = | |
120 (DigilibConfiguration) context.getAttribute( | |
86 | 121 "digilib.servlet.configuration"); |
73 | 122 if (dlConfig == null) { |
123 // create new Configuration | |
124 try { | |
125 dlConfig = new DigilibConfiguration(config); | |
86 | 126 context.setAttribute("digilib.servlet.configuration", dlConfig); |
73 | 127 } catch (Exception e) { |
128 throw new ServletException(e); | |
129 } | |
130 } | |
181 | 131 // say hello in the log file |
189 | 132 logger.info("***** Digital Image Library Image Scaler Servlet (version " |
181 | 133 + dlVersion |
134 + ") *****"); | |
73 | 135 // set our AuthOps |
153 | 136 useAuthentication = dlConfig.getAsBoolean("use-authorization"); |
181 | 137 // AuthOps instance |
153 | 138 authOp = (AuthOps) dlConfig.getValue("servlet.auth.op"); |
181 | 139 |
86 | 140 // DocuDirCache instance |
153 | 141 dirCache = (DocuDirCache) dlConfig.getValue("servlet.dir.cache"); |
142 denyImgFile = new File(dlConfig.getAsString("denied-image")); | |
143 errorImgFile = new File(dlConfig.getAsString("error-image")); | |
144 sendFileAllowed = dlConfig.getAsBoolean("sendfile-allowed"); | |
145 minSubsample = dlConfig.getAsFloat("subsample-minimum"); | |
146 defaultQuality = dlConfig.getAsInt("default-quality"); | |
73 | 147 } |
1 | 148 |
181 | 149 /** Process the HTTP Get request */ |
73 | 150 public void doGet(HttpServletRequest request, HttpServletResponse response) |
151 throws ServletException, IOException { | |
181 | 152 accountlog.info("GET from "+request.getRemoteAddr()); |
73 | 153 // create new request with defaults |
154 DigilibRequest dlReq = new DigilibRequest(); | |
155 // set with request parameters | |
156 dlReq.setWithRequest(request); | |
157 // add DigilibRequest to ServletRequest | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
158 request.setAttribute("digilib.servlet.request", dlReq); |
73 | 159 // do the processing |
160 processRequest(request, response); | |
161 } | |
1 | 162 |
181 | 163 /** Process the HTTP Post request */ |
73 | 164 public void doPost( |
165 HttpServletRequest request, | |
166 HttpServletResponse response) | |
167 throws ServletException, IOException { | |
181 | 168 accountlog.info("POST from "+request.getRemoteAddr()); |
73 | 169 // create new request with defaults |
170 DigilibRequest dlReq = new DigilibRequest(); | |
171 // set with request parameters | |
172 dlReq.setWithRequest(request); | |
173 // add DigilibRequest to ServletRequest | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
174 request.setAttribute("digilib.servlet.request", dlReq); |
73 | 175 // do the processing |
176 processRequest(request, response); | |
177 } | |
178 | |
179 /** main request handler. */ | |
180 void processRequest( | |
181 HttpServletRequest request, | |
182 HttpServletResponse response) | |
183 throws ServletException, IOException { | |
1 | 184 |
181 | 185 accountlog.debug("request: "+request.getQueryString()); |
189 | 186 logger.debug("request: "+request.getQueryString()); |
181 | 187 |
73 | 188 // time for benchmarking |
189 long startTime = System.currentTimeMillis(); | |
190 // output mime/type | |
191 String mimeType = "image/png"; | |
1 | 192 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
193 /* parameters for a session */ |
1 | 194 |
73 | 195 // scale the image file to fit window size i.e. respect dw,dh |
196 boolean scaleToFit = true; | |
100 | 197 // scale the image by a fixed factor only |
198 boolean absoluteScale = false; | |
122 | 199 // only crop the image to fit |
200 boolean cropToFit = false; | |
149 | 201 // send the file as is |
202 boolean sendFile = false; | |
203 // use low resolution images only | |
204 boolean loresOnly = false; | |
205 // use hires images only | |
122 | 206 boolean hiresOnly = false; |
73 | 207 // interpolation to use for scaling |
153 | 208 int scaleQual = defaultQuality; |
73 | 209 // send html error message (or image file) |
210 boolean errorMsgHtml = false; | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
211 // mirror the image |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
212 boolean doMirror = false; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
213 // angle of mirror axis |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
214 double mirrorAngle = 0; |
130 | 215 // original (hires) image resolution |
216 double origResX = 0; | |
217 double origResY = 0; | |
1 | 218 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
219 /* request parameters */ |
73 | 220 |
221 DigilibRequest dlRequest = | |
222 (DigilibRequest) request.getAttribute("digilib.servlet.request"); | |
1 | 223 |
73 | 224 // destination image width |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
225 int paramDW = dlRequest.getAsInt("dw"); |
73 | 226 // destination image height |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
227 int paramDH = dlRequest.getAsInt("dh"); |
73 | 228 // relative area x_offset (0..1) |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
229 double paramWX = dlRequest.getAsFloat("wx"); |
73 | 230 // relative area y_offset |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
231 double paramWY = dlRequest.getAsFloat("wy"); |
73 | 232 // relative area width (0..1) |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
233 double paramWW = dlRequest.getAsFloat("ww"); |
73 | 234 // relative area height |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
235 double paramWH = dlRequest.getAsFloat("wh"); |
73 | 236 // scale factor (additional to dw/width, dh/height) |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
237 double paramWS = dlRequest.getAsFloat("ws"); |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
238 // rotation angle |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
239 double paramROT = dlRequest.getAsFloat("rot"); |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
240 // contrast enhancement |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
241 float paramCONT = dlRequest.getAsFloat("cont"); |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
242 // brightness enhancement |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
243 float paramBRGT = dlRequest.getAsFloat("brgt"); |
86 | 244 // color modification |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
245 float[] paramRGBM = null; |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
246 Parameter p = dlRequest.get("rgbm"); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
247 if (p.hasValue() && (!p.getAsString().equals("0/0/0"))) { |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
248 paramRGBM = p.parseAsFloatArray("/"); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
249 } |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
250 float[] paramRGBA = null; |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
251 p = dlRequest.get("rgba"); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
252 if (p.hasValue() && (!p.getAsString().equals("0/0/0"))) { |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
253 paramRGBA = p.parseAsFloatArray("/"); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
254 } |
130 | 255 // destination resolution (DPI) |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
256 float paramDDPIX = dlRequest.getAsFloat("ddpix"); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
257 float paramDDPIY = dlRequest.getAsFloat("ddpiy"); |
130 | 258 if ((paramDDPIX == 0) || (paramDDPIY == 0)) { |
259 // if X or Y resolution isn't set, use DDPI | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
260 paramDDPIX = dlRequest.getAsFloat("ddpi"); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
261 paramDDPIY = paramDDPIX; |
130 | 262 } |
1 | 263 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
264 /* |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
265 * operation mode: "fit": always fit to page, "clip": send original |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
266 * resolution cropped, "file": send whole file (if allowed) |
73 | 267 */ |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
268 if (dlRequest.hasOption("mo", "clip")) { |
73 | 269 scaleToFit = false; |
100 | 270 absoluteScale = false; |
73 | 271 cropToFit = true; |
149 | 272 sendFile = false; |
273 hiresOnly = true; | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
274 } else if (dlRequest.hasOption("mo", "fit")) { |
73 | 275 scaleToFit = true; |
100 | 276 absoluteScale = false; |
122 | 277 cropToFit = false; |
149 | 278 sendFile = false; |
279 hiresOnly = false; | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
280 } else if (dlRequest.hasOption("mo", "osize")) { |
100 | 281 scaleToFit = false; |
282 absoluteScale = true; | |
122 | 283 cropToFit = false; |
149 | 284 sendFile = false; |
122 | 285 hiresOnly = true; |
73 | 286 } |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
287 // operation mode: "lores": try to use scaled image, "hires": use |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
288 // unscaled image |
149 | 289 // "autores": try best fitting resolution |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
290 if (dlRequest.hasOption("mo", "lores")) { |
149 | 291 loresOnly = true; |
292 hiresOnly = false; | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
293 } else if (dlRequest.hasOption("mo", "hires")) { |
149 | 294 loresOnly = false; |
295 hiresOnly = true; | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
296 } else if (dlRequest.hasOption("mo", "autores")) { |
149 | 297 loresOnly = false; |
298 hiresOnly = false; | |
299 } | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
300 // operation mode: "errtxt": error message in html, "errimg": error |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
301 // image |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
302 if (dlRequest.hasOption("mo", "errtxt")) { |
73 | 303 errorMsgHtml = true; |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
304 } else if (dlRequest.hasOption("mo", "errimg")) { |
73 | 305 errorMsgHtml = false; |
306 } | |
307 // operation mode: "q0" - "q2": interpolation quality | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
308 if (dlRequest.hasOption("mo", "q0")) { |
73 | 309 scaleQual = 0; |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
310 } else if (dlRequest.hasOption("mo", "q1")) { |
73 | 311 scaleQual = 1; |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
312 } else if (dlRequest.hasOption("mo", "q2")) { |
73 | 313 scaleQual = 2; |
314 } | |
1 | 315 |
185 | 316 // check with the maximum allowed size (if set) |
317 int maxImgSize = dlConfig.getAsInt("max-image-size"); | |
318 if (maxImgSize > 0) { | |
319 paramDW = (paramDW * paramWS > maxImgSize) ? (int)(maxImgSize / paramWS) : paramDW; | |
320 paramDH = (paramDH * paramWS > maxImgSize) ? (int)(maxImgSize / paramWS) : paramDH; | |
321 } | |
322 | |
73 | 323 //"big" try for all file/image actions |
324 try { | |
325 | |
161 | 326 // ImageFileset of the image to load |
327 ImageFileset fileset = null; | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
328 |
122 | 329 // new DocuInfo instance |
149 | 330 DocuInfo docuInfo = new ImageLoaderImageInfoDocuInfo(); |
73 | 331 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
332 /* find the file to load/send */ |
1 | 333 |
73 | 334 // get PathInfo |
335 String loadPathName = dlRequest.getFilePath(); | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
336 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
337 /* check permissions */ |
73 | 338 if (useAuthentication) { |
339 // get a list of required roles (empty if no restrictions) | |
340 List rolesRequired = authOp.rolesForPath(loadPathName, request); | |
341 if (rolesRequired != null) { | |
181 | 342 authlog.info("Role required: " + rolesRequired); |
343 authlog.info("User: " + request.getRemoteUser()); | |
73 | 344 // is the current request/user authorized? |
345 if (!authOp.isRoleAuthorized(rolesRequired, request)) { | |
346 // send deny answer and abort | |
181 | 347 authlog.error("ERROR: access denied!"); |
73 | 348 if (errorMsgHtml) { |
349 ServletOps.htmlMessage( | |
350 "ERROR: Unauthorized access!", | |
351 response); | |
352 } else { | |
181 | 353 ServletOps.sendFile(denyImgFile, null, response); |
73 | 354 } |
355 return; | |
356 } | |
357 } | |
358 } | |
1 | 359 |
122 | 360 // find the file(set) |
161 | 361 ImageFile fileToLoad; |
362 fileset = | |
363 (ImageFileset) dirCache.getFile( | |
364 loadPathName, | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
365 dlRequest.getAsInt("pn"), |
161 | 366 FileOps.CLASS_IMAGE); |
94 | 367 if (fileset == null) { |
368 throw new FileOpException( | |
369 "File " | |
370 + loadPathName | |
371 + "(" | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
372 + dlRequest.getAsInt("pn") |
94 | 373 + ") not found."); |
374 } | |
181 | 375 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
376 /* calculate expected source image size */ |
149 | 377 ImageSize expectedSourceSize = new ImageSize(); |
122 | 378 if (scaleToFit) { |
379 double scale = (1 / Math.min(paramWW, paramWH)) * paramWS; | |
149 | 380 expectedSourceSize.setSize( |
381 (int) (paramDW * scale), | |
382 (int) (paramDH * scale)); | |
122 | 383 } else { |
384 expectedSourceSize.setSize( | |
149 | 385 (int) (paramDW * paramWS), |
386 (int) (paramDH * paramWS)); | |
100 | 387 } |
388 | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
389 /* select a resolution */ |
149 | 390 if (hiresOnly) { |
391 // get first element (= highest resolution) | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
392 fileToLoad = fileset.getBiggest(); |
149 | 393 } else if (loresOnly) { |
394 // enforced lores uses next smaller resolution | |
395 fileToLoad = | |
396 fileset.getNextSmaller(expectedSourceSize, docuInfo); | |
397 if (fileToLoad == null) { | |
398 // this is the smallest we have | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
399 fileToLoad = fileset.getSmallest(); |
149 | 400 } |
401 } else { | |
130 | 402 // autores: use next higher resolution |
122 | 403 fileToLoad = |
404 fileset.getNextBigger(expectedSourceSize, docuInfo); | |
405 if (fileToLoad == null) { | |
130 | 406 // this is the highest we have |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
407 fileToLoad = fileset.getBiggest(); |
122 | 408 } |
86 | 409 } |
181 | 410 logger.info("Loading: " + fileToLoad.getFile()); |
73 | 411 |
181 | 412 /* |
413 * send the image if its mo=(raw)file | |
414 */ | |
415 if (dlRequest.hasOption("mo", "file") | |
416 || dlRequest.hasOption("mo", "rawfile")) { | |
417 if (sendFileAllowed) { | |
418 String mt = null; | |
419 if (dlRequest.hasOption("mo", "rawfile")) { | |
420 mt = "application/octet-stream"; | |
421 } | |
263 | 422 logger.debug("Sending RAW File as is."); |
181 | 423 ServletOps.sendFile(fileToLoad.getFile(), mt, response); |
263 | 424 logger.info("Done in " |
425 + (System.currentTimeMillis() - startTime) | |
426 + "ms"); | |
427 return; | |
181 | 428 } |
429 } | |
430 | |
431 /* | |
432 * prepare resolution for original size | |
433 */ | |
130 | 434 if (absoluteScale) { |
435 // get original resolution from metadata | |
436 fileset.checkMeta(); | |
437 origResX = fileset.getResX(); | |
438 origResY = fileset.getResY(); | |
139
11cfe4c89fdc
Servlet version 1.11b1 with improved original-size.
robcast
parents:
130
diff
changeset
|
439 if ((origResX == 0) || (origResY == 0)) { |
11cfe4c89fdc
Servlet version 1.11b1 with improved original-size.
robcast
parents:
130
diff
changeset
|
440 throw new ImageOpException("Missing image DPI information!"); |
11cfe4c89fdc
Servlet version 1.11b1 with improved original-size.
robcast
parents:
130
diff
changeset
|
441 } |
11cfe4c89fdc
Servlet version 1.11b1 with improved original-size.
robcast
parents:
130
diff
changeset
|
442 |
11cfe4c89fdc
Servlet version 1.11b1 with improved original-size.
robcast
parents:
130
diff
changeset
|
443 if ((paramDDPIX == 0) || (paramDDPIY == 0)) { |
11cfe4c89fdc
Servlet version 1.11b1 with improved original-size.
robcast
parents:
130
diff
changeset
|
444 throw new ImageOpException("Missing display DPI information!"); |
11cfe4c89fdc
Servlet version 1.11b1 with improved original-size.
robcast
parents:
130
diff
changeset
|
445 } |
130 | 446 } |
447 | |
86 | 448 // check the source image |
122 | 449 if (!fileToLoad.isChecked()) { |
149 | 450 docuInfo.checkFile(fileToLoad); |
122 | 451 } |
86 | 452 // get the source image type |
453 mimeType = fileToLoad.getMimetype(); | |
149 | 454 // get the source image size |
455 ImageSize imgSize = fileToLoad.getSize(); | |
456 | |
130 | 457 // decide if the image can be sent as is |
458 boolean mimetypeSendable = | |
122 | 459 mimeType.equals("image/jpeg") |
460 || mimeType.equals("image/png") | |
461 || mimeType.equals("image/gif"); | |
130 | 462 boolean imagoOptions = |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
463 dlRequest.hasOption("mo", "hmir") |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
464 || dlRequest.hasOption("mo", "vmir") |
130 | 465 || (paramROT != 0) |
466 || (paramRGBM != null) | |
467 || (paramRGBA != null) | |
468 || (paramCONT != 0) | |
469 || (paramBRGT != 0); | |
139
11cfe4c89fdc
Servlet version 1.11b1 with improved original-size.
robcast
parents:
130
diff
changeset
|
470 boolean imageSendable = mimetypeSendable && !imagoOptions; |
73 | 471 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
472 /* |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
473 * if not autoRes and image smaller than requested size then send |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
474 * as is. if autoRes and image has requested size then send as is. |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
475 * if not autoScale and not scaleToFit nor cropToFit then send as |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
476 * is (mo=file) |
73 | 477 */ |
181 | 478 if (imageSendable |
479 && ((loresOnly | |
480 && fileToLoad.getSize().isSmallerThan(expectedSourceSize)) | |
481 || (!(loresOnly || hiresOnly) | |
482 && fileToLoad.getSize().fitsIn(expectedSourceSize)))) { | |
73 | 483 |
181 | 484 logger.debug("Sending File as is."); |
1 | 485 |
181 | 486 ServletOps.sendFile(fileToLoad.getFile(), null, response); |
487 | |
488 logger.info("Done in " | |
73 | 489 + (System.currentTimeMillis() - startTime) |
490 + "ms"); | |
491 return; | |
492 } | |
1 | 493 |
149 | 494 // new DocuImage instance |
495 DocuImage docuImage = dlConfig.getDocuImageInstance(); | |
496 if (docuImage == null) { | |
497 throw new ImageOpException("Unable to load DocuImage class!"); | |
498 } | |
499 | |
500 // set interpolation quality | |
501 docuImage.setQuality(scaleQual); | |
181 | 502 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
503 // set missing dw or dh from aspect ratio |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
504 double imgAspect = fileToLoad.getAspect(); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
505 if (paramDW == 0) { |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
506 paramDW = (int) Math.round(paramDH * imgAspect); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
507 } else if (paramDH == 0) { |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
508 paramDH = (int) Math.round(paramDW / imgAspect); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
509 } |
149 | 510 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
511 /* crop and scale the image */ |
1 | 512 |
181 | 513 logger.debug("IMG: " + imgSize.getWidth() + "x" + imgSize.getHeight()); |
514 logger.debug("time " + (System.currentTimeMillis() - startTime) + "ms"); | |
1 | 515 |
73 | 516 // coordinates and scaling |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
517 double areaXoff; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
518 double areaYoff; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
519 double areaWidth; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
520 double areaHeight; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
521 double scaleX; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
522 double scaleY; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
523 double scaleXY; |
1 | 524 |
100 | 525 // coordinates using Java2D |
526 // image size in pixels | |
527 Rectangle2D imgBounds = | |
149 | 528 new Rectangle2D.Double( |
529 0, | |
530 0, | |
531 imgSize.getWidth(), | |
532 imgSize.getHeight()); | |
100 | 533 // user window area in [0,1] coordinates |
534 Rectangle2D relUserArea = | |
535 new Rectangle2D.Double(paramWX, paramWY, paramWW, paramWH); | |
536 // transform from relative [0,1] to image coordinates. | |
537 AffineTransform imgTrafo = | |
149 | 538 AffineTransform.getScaleInstance( |
539 imgSize.getWidth(), | |
540 imgSize.getHeight()); | |
85 | 541 // transform user coordinate area to image coordinate area |
100 | 542 Rectangle2D userImgArea = |
543 imgTrafo.createTransformedShape(relUserArea).getBounds2D(); | |
544 | |
545 // calculate scaling factors based on inner user area | |
73 | 546 if (scaleToFit) { |
100 | 547 areaWidth = userImgArea.getWidth(); |
548 areaHeight = userImgArea.getHeight(); | |
73 | 549 scaleX = paramDW / areaWidth * paramWS; |
550 scaleY = paramDH / areaHeight * paramWS; | |
551 scaleXY = (scaleX > scaleY) ? scaleY : scaleX; | |
100 | 552 } else if (absoluteScale) { |
553 // absolute scale | |
130 | 554 scaleX = paramDDPIX / origResX; |
555 scaleY = paramDDPIY / origResY; | |
556 // currently only same scale :-( | |
557 scaleXY = scaleX; | |
558 areaWidth = paramDW / scaleXY * paramWS; | |
559 areaHeight = paramDH / scaleXY * paramWS; | |
100 | 560 // reset user area size |
561 userImgArea.setRect( | |
562 userImgArea.getX(), | |
563 userImgArea.getY(), | |
564 areaWidth, | |
565 areaHeight); | |
73 | 566 } else { |
567 // crop to fit | |
85 | 568 areaWidth = paramDW * paramWS; |
569 areaHeight = paramDH * paramWS; | |
100 | 570 // reset user area size |
571 userImgArea.setRect( | |
572 userImgArea.getX(), | |
573 userImgArea.getY(), | |
574 areaWidth, | |
575 areaHeight); | |
73 | 576 scaleX = 1f; |
577 scaleY = 1f; | |
578 scaleXY = 1f; | |
100 | 579 } |
85 | 580 |
100 | 581 // enlarge image area for rotations to cover additional pixels |
582 Rectangle2D outerUserImgArea = userImgArea; | |
583 Rectangle2D innerUserImgArea = userImgArea; | |
584 if (wholeRotArea) { | |
585 if (paramROT != 0) { | |
586 try { | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
587 // rotate user area coordinates around center of user |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
588 // area |
100 | 589 AffineTransform rotTrafo = |
590 AffineTransform.getRotateInstance( | |
591 Math.toRadians(paramROT), | |
592 userImgArea.getCenterX(), | |
593 userImgArea.getCenterY()); | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
594 // get bounds from rotated end position |
100 | 595 innerUserImgArea = |
596 rotTrafo | |
597 .createTransformedShape(userImgArea) | |
598 .getBounds2D(); | |
599 // get bounds from back-rotated bounds | |
600 outerUserImgArea = | |
601 rotTrafo | |
602 .createInverse() | |
603 .createTransformedShape(innerUserImgArea) | |
604 .getBounds2D(); | |
605 } catch (NoninvertibleTransformException e1) { | |
606 // this shouldn't happen anyway | |
607 e1.printStackTrace(); | |
608 } | |
609 } | |
73 | 610 } |
1 | 611 |
181 | 612 logger.debug("Scale " |
73 | 613 + scaleXY |
614 + "(" | |
615 + scaleX | |
616 + "," | |
617 + scaleY | |
618 + ") on " | |
100 | 619 + outerUserImgArea); |
1 | 620 |
73 | 621 // clip area at the image border |
100 | 622 outerUserImgArea = outerUserImgArea.createIntersection(imgBounds); |
85 | 623 |
100 | 624 areaWidth = outerUserImgArea.getWidth(); |
625 areaHeight = outerUserImgArea.getHeight(); | |
626 areaXoff = outerUserImgArea.getX(); | |
627 areaYoff = outerUserImgArea.getY(); | |
1 | 628 |
181 | 629 logger.debug("crop: " |
73 | 630 + areaXoff |
631 + "," | |
632 + areaYoff | |
633 + " " | |
634 + areaWidth | |
635 + "x" | |
636 + areaHeight); | |
1 | 637 |
73 | 638 // check image parameters sanity |
639 if ((areaWidth < 1) | |
640 || (areaHeight < 1) | |
641 || (scaleXY * areaWidth < 2) | |
642 || (scaleXY * areaHeight < 2)) { | |
181 | 643 logger.error("ERROR: invalid scale parameter set!"); |
73 | 644 throw new ImageOpException("Invalid scale parameter set!"); |
645 } | |
1 | 646 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
647 /* crop and scale image */ |
85 | 648 |
649 // use subimage loading if possible | |
650 if (docuImage.isSubimageSupported()) { | |
181 | 651 logger.debug("Subimage: scale " + scaleXY + " = " + (1 / scaleXY)); |
85 | 652 double subf = 1d; |
653 double subsamp = 1d; | |
654 if (scaleXY < 1) { | |
655 subf = 1 / scaleXY; | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
656 // for higher quality reduce subsample factor by |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
657 // minSubsample |
140 | 658 if (scaleQual > 0) { |
161 | 659 subsamp = Math.max(Math.floor(subf / minSubsample), 1d); |
140 | 660 } else { |
661 subsamp = Math.floor(subf); | |
662 } | |
85 | 663 scaleXY = subsamp / subf; |
181 | 664 logger.debug("Using subsampling: " + subsamp + " rest " + scaleXY); |
85 | 665 } |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
666 |
85 | 667 docuImage.loadSubimage( |
149 | 668 fileToLoad, |
100 | 669 outerUserImgArea.getBounds(), |
85 | 670 (int) subsamp); |
671 | |
181 | 672 logger.debug("SUBSAMP: " |
85 | 673 + subsamp |
674 + " -> " | |
675 + docuImage.getWidth() | |
676 + "x" | |
677 + docuImage.getHeight()); | |
678 | |
149 | 679 docuImage.scale(scaleXY, scaleXY); |
85 | 680 |
681 } else { | |
100 | 682 // else load and crop the whole file |
149 | 683 docuImage.loadImage(fileToLoad); |
85 | 684 docuImage.crop( |
685 (int) areaXoff, | |
686 (int) areaYoff, | |
687 (int) areaWidth, | |
688 (int) areaHeight); | |
689 | |
149 | 690 docuImage.scale(scaleXY, scaleXY); |
85 | 691 } |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
692 |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
693 // mirror image |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
694 // operation mode: "hmir": mirror horizontally, "vmir": mirror |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
695 // vertically |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
696 if (dlRequest.hasOption("mo", "hmir")) { |
100 | 697 docuImage.mirror(0); |
698 } | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
699 if (dlRequest.hasOption("mo", "vmir")) { |
100 | 700 docuImage.mirror(90); |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
701 } |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
702 |
100 | 703 // rotate image |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
704 if (paramROT != 0d) { |
94 | 705 docuImage.rotate(paramROT); |
100 | 706 if (wholeRotArea) { |
707 // crop to the inner bounding box | |
708 double xcrop = | |
709 docuImage.getWidth() | |
710 - innerUserImgArea.getWidth() * scaleXY; | |
711 double ycrop = | |
712 docuImage.getHeight() | |
713 - innerUserImgArea.getHeight() * scaleXY; | |
714 if ((xcrop > 0) || (ycrop > 0)) { | |
715 // only crop smaller | |
716 xcrop = (xcrop > 0) ? xcrop : 0; | |
717 ycrop = (ycrop > 0) ? ycrop : 0; | |
718 // crop image | |
719 docuImage.crop( | |
720 (int) (xcrop / 2), | |
721 (int) (ycrop / 2), | |
722 (int) (docuImage.getWidth() - xcrop), | |
723 (int) (docuImage.getHeight() - ycrop)); | |
724 } | |
725 } | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
726 |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
727 } |
1 | 728 |
86 | 729 // color modification |
730 if ((paramRGBM != null) || (paramRGBA != null)) { | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
731 // make shure we actually have two arrays |
86 | 732 if (paramRGBM == null) { |
733 paramRGBM = new float[3]; | |
734 } | |
735 if (paramRGBA == null) { | |
736 paramRGBA = new float[3]; | |
737 } | |
100 | 738 // calculate "contrast" values (c=2^x) |
86 | 739 float[] mult = new float[3]; |
740 for (int i = 0; i < 3; i++) { | |
94 | 741 mult[i] = (float) Math.pow(2, (double) paramRGBM[i]); |
86 | 742 } |
743 docuImage.enhanceRGB(mult, paramRGBA); | |
744 } | |
94 | 745 |
100 | 746 // contrast and brightness enhancement |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
747 if ((paramCONT != 0f) || (paramBRGT != 0f)) { |
100 | 748 double mult = Math.pow(2, paramCONT); |
749 docuImage.enhance((float) mult, (float) paramBRGT); | |
750 } | |
751 | |
181 | 752 logger.debug("time " + (System.currentTimeMillis() - startTime) + "ms"); |
73 | 753 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
754 /* write the resulting image */ |
1 | 755 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
756 // setup output -- if source is JPG then dest will be JPG else it's |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
757 // PNG |
100 | 758 if (mimeType.equals("image/jpeg") |
759 || mimeType.equals("image/jp2")) { | |
760 mimeType = "image/jpeg"; | |
761 } else { | |
73 | 762 mimeType = "image/png"; |
763 } | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
764 response.setContentType(mimeType); |
1 | 765 |
73 | 766 // write the image |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
767 docuImage.writeImage(mimeType, response.getOutputStream()); |
1 | 768 |
181 | 769 logger.info("Done in " + (System.currentTimeMillis() - startTime) + "ms"); |
209 | 770 |
771 docuImage.dispose(); | |
73 | 772 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
773 /* error handling */ |
1 | 774 |
73 | 775 } // end of "big" try |
156 | 776 catch (IOException e) { |
197 | 777 logger.fatal("ERROR: File IO Error: "+e); |
73 | 778 try { |
779 if (errorMsgHtml) { | |
780 ServletOps.htmlMessage( | |
781 "ERROR: File IO Error: " + e, | |
782 response); | |
783 } else { | |
181 | 784 ServletOps.sendFile(errorImgFile, null, response); |
73 | 785 } |
786 } catch (FileOpException ex) { | |
787 } // so we don't get a loop | |
788 } catch (AuthOpException e) { | |
197 | 789 logger.fatal("ERROR: Authorization error: "+e); |
73 | 790 try { |
791 if (errorMsgHtml) { | |
792 ServletOps.htmlMessage( | |
793 "ERROR: Authorization error: " + e, | |
794 response); | |
795 } else { | |
181 | 796 ServletOps.sendFile(errorImgFile, null, response); |
73 | 797 } |
798 } catch (FileOpException ex) { | |
799 } // so we don't get a loop | |
800 } catch (ImageOpException e) { | |
197 | 801 logger.fatal("ERROR: Image Error: "+e); |
73 | 802 try { |
803 if (errorMsgHtml) { | |
804 ServletOps.htmlMessage( | |
805 "ERROR: Image Operation Error: " + e, | |
806 response); | |
807 } else { | |
181 | 808 ServletOps.sendFile(errorImgFile, null, response); |
73 | 809 } |
810 } catch (FileOpException ex) { | |
811 } // so we don't get a loop | |
812 } catch (RuntimeException e) { | |
813 // JAI likes to throw RuntimeExceptions ;-( | |
197 | 814 logger.fatal("ERROR: Other Image Error: "+e); |
73 | 815 try { |
816 if (errorMsgHtml) { | |
817 ServletOps.htmlMessage( | |
818 "ERROR: Other Image Operation Error: " + e, | |
819 response); | |
820 } else { | |
181 | 821 ServletOps.sendFile(errorImgFile, null, response); |
73 | 822 } |
823 } catch (FileOpException ex) { | |
824 } // so we don't get a loop | |
825 } | |
826 } | |
1 | 827 |
73 | 828 } //Scaler class |