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