Mercurial > hg > digilib-old
annotate servlet/src/digilib/servlet/Scaler.java @ 487:6c01d283e90e
Servlet version 1.16.1
- now with absolute scaling: mo=ascale&scale=X
- reworked scale factor and resolution selection so that absolute scale can use prescaled images (osize can do that too)
ASSIGNED - # 23: display thumbnails with absolute scaling
https://itgroup.mpiwg-berlin.mpg.de:8080/tracs/cdli/ticket/23
author | robcast |
---|---|
date | Sat, 12 May 2007 14:23:34 +0200 |
parents | fd66d412fe6b |
children | 882ee6a055bd |
rev | line source |
---|---|
181 | 1 /* |
2 * Scaler -- Scaler servlet main class | |
3 * | |
4 * Digital Image Library servlet components | |
5 * | |
303 | 6 * Copyright (C) 200-2004 Robert Casties (robcast@mail.berlios.de) |
181 | 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.ImageOpException; |
284 | 43 import digilib.image.ImageOps; |
149 | 44 import digilib.image.ImageSize; |
86 | 45 import digilib.io.DocuDirCache; |
335 | 46 import digilib.io.DocuDirectory; |
47 import digilib.io.DocuDirent; | |
181 | 48 import digilib.io.FileOpException; |
49 import digilib.io.FileOps; | |
161 | 50 import digilib.io.ImageFile; |
51 import digilib.io.ImageFileset; | |
1 | 52 |
73 | 53 /** |
181 | 54 * @author casties |
55 */ | |
348 | 56 // public class Scaler extends HttpServlet implements SingleThreadModel { |
1 | 57 public class Scaler extends HttpServlet { |
58 | |
263 | 59 private static final long serialVersionUID = -325080527268912852L; |
60 | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
61 /** digilib servlet version (for all components) */ |
487 | 62 public static final String dlVersion = "1.6.1"; |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
63 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
64 /** logger for accounting requests */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
65 private static Logger accountlog = Logger.getLogger("account.request"); |
335 | 66 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
67 /** gengeral logger for this class */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
68 private static Logger logger = Logger.getLogger("digilib.servlet"); |
335 | 69 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
70 /** logger for authentication related */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
71 private static Logger authlog = Logger.getLogger("digilib.auth"); |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
72 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
73 /** general error code */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
74 public static final int ERROR_UNKNOWN = 0; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
75 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
76 /** error code for authentication error */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
77 public static final int ERROR_AUTH = 1; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
78 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
79 /** error code for file operation error */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
80 public static final int ERROR_FILE = 2; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
81 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
82 /** error code for image operation error */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
83 public static final int ERROR_IMAGE = 3; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
84 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
85 /** DocuDirCache instance */ |
86 | 86 DocuDirCache dirCache; |
161 | 87 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
88 /** authentication error image file */ |
153 | 89 File denyImgFile; |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
90 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
91 /** image error image file */ |
153 | 92 File errorImgFile; |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
93 |
363 | 94 /** not found error image file */ |
95 File notfoundImgFile; | |
96 | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
97 /** subsampling before scaling */ |
153 | 98 float minSubsample = 2f; |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
99 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
100 /** send files as is? */ |
153 | 101 boolean sendFileAllowed = true; |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
102 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
103 /** default scaling quality */ |
153 | 104 int defaultQuality = 1; |
1 | 105 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
106 /** DigilibConfiguration instance */ |
73 | 107 DigilibConfiguration dlConfig; |
1 | 108 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
109 /** use authorization database */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
110 boolean useAuthorization = true; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
111 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
112 /** AuthOps instance */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
113 AuthOps authOp; |
1 | 114 |
100 | 115 // EXPRIMENTAL |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
116 /** try to enlarge cropping area for "oblique" angles */ |
100 | 117 boolean wholeRotArea = false; |
118 | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
119 /** |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
120 * Initialisation on first run. |
73 | 121 * |
122 * @see javax.servlet.Servlet#init(javax.servlet.ServletConfig) | |
123 */ | |
124 public void init(ServletConfig config) throws ServletException { | |
125 super.init(config); | |
1 | 126 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
127 System.out |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
128 .println("***** Digital Image Library Image Scaler Servlet (version " |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
129 + dlVersion + ") *****"); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
130 // say hello in the log file |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
131 logger |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
132 .info("***** Digital Image Library Image Scaler Servlet (version " |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
133 + dlVersion + ") *****"); |
1 | 134 |
73 | 135 // get our ServletContext |
136 ServletContext context = config.getServletContext(); | |
137 // see if there is a Configuration instance | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
138 dlConfig = (DigilibConfiguration) context |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
139 .getAttribute("digilib.servlet.configuration"); |
73 | 140 if (dlConfig == null) { |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
141 // no Configuration |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
142 throw new ServletException("No Configuration!"); |
335 | 143 } |
73 | 144 // set our AuthOps |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
145 useAuthorization = dlConfig.getAsBoolean("use-authorization"); |
153 | 146 authOp = (AuthOps) dlConfig.getValue("servlet.auth.op"); |
181 | 147 |
86 | 148 // DocuDirCache instance |
153 | 149 dirCache = (DocuDirCache) dlConfig.getValue("servlet.dir.cache"); |
394
31643c12d939
digilib can now take its error-icons from the web app
robcast
parents:
363
diff
changeset
|
150 denyImgFile = ServletOps.getFile((File) dlConfig.getValue("denied-image"), config); |
31643c12d939
digilib can now take its error-icons from the web app
robcast
parents:
363
diff
changeset
|
151 errorImgFile = ServletOps.getFile((File) dlConfig.getValue("error-image"), config); |
31643c12d939
digilib can now take its error-icons from the web app
robcast
parents:
363
diff
changeset
|
152 notfoundImgFile = ServletOps.getFile((File) dlConfig.getValue("notfound-image"), config); |
153 | 153 sendFileAllowed = dlConfig.getAsBoolean("sendfile-allowed"); |
154 minSubsample = dlConfig.getAsFloat("subsample-minimum"); | |
155 defaultQuality = dlConfig.getAsInt("default-quality"); | |
73 | 156 } |
1 | 157 |
181 | 158 /** Process the HTTP Get request */ |
73 | 159 public void doGet(HttpServletRequest request, HttpServletResponse response) |
335 | 160 throws ServletException, IOException { |
161 accountlog.info("GET from " + request.getRemoteAddr()); | |
73 | 162 // create new request with defaults |
163 DigilibRequest dlReq = new DigilibRequest(); | |
164 // set with request parameters | |
165 dlReq.setWithRequest(request); | |
166 // add DigilibRequest to ServletRequest | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
167 request.setAttribute("digilib.servlet.request", dlReq); |
73 | 168 // do the processing |
169 processRequest(request, response); | |
170 } | |
1 | 171 |
181 | 172 /** Process the HTTP Post request */ |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
173 public void doPost(HttpServletRequest request, HttpServletResponse response) |
335 | 174 throws ServletException, IOException { |
175 accountlog.info("POST from " + request.getRemoteAddr()); | |
73 | 176 // create new request with defaults |
177 DigilibRequest dlReq = new DigilibRequest(); | |
178 // set with request parameters | |
179 dlReq.setWithRequest(request); | |
180 // add DigilibRequest to ServletRequest | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
181 request.setAttribute("digilib.servlet.request", dlReq); |
73 | 182 // do the processing |
183 processRequest(request, response); | |
184 } | |
185 | |
335 | 186 /* |
187 * (non-Javadoc) | |
188 * | |
189 * @see javax.servlet.http.HttpServlet#getLastModified(javax.servlet.http.HttpServletRequest) | |
190 */ | |
191 protected long getLastModified(HttpServletRequest request) { | |
337 | 192 accountlog.debug("GetLastModified from " + request.getRemoteAddr() |
193 + " for " + request.getQueryString()); | |
335 | 194 long mtime = -1; |
195 // create new request with defaults | |
196 DigilibRequest dlReq = new DigilibRequest(); | |
197 // set with request parameters | |
198 dlReq.setWithRequest(request); | |
199 // find the requested file | |
200 DocuDirent f = findFile(dlReq); | |
201 if (f != null) { | |
202 DocuDirectory dd = (DocuDirectory) f.getParent(); | |
203 mtime = dd.getDirMTime() / 1000 * 1000; | |
204 } | |
205 return mtime; | |
206 } | |
207 | |
73 | 208 /** main request handler. */ |
348 | 209 void processRequest(HttpServletRequest request, HttpServletResponse response) |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
210 throws ServletException { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
211 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
212 if (dlConfig == null) { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
213 throw new ServletException("ERROR: No Configuration!"); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
214 } |
1 | 215 |
335 | 216 accountlog.debug("request: " + request.getQueryString()); |
217 logger.debug("request: " + request.getQueryString()); | |
218 | |
73 | 219 // time for benchmarking |
220 long startTime = System.currentTimeMillis(); | |
335 | 221 // output mime-type |
73 | 222 String mimeType = "image/png"; |
1 | 223 |
405
ffb2036da205
first stab at PDF printer servlet. DOES NOT WORK YET!
robcast
parents:
394
diff
changeset
|
224 /* preset request parameters */ |
1 | 225 |
73 | 226 // scale the image file to fit window size i.e. respect dw,dh |
227 boolean scaleToFit = true; | |
100 | 228 // scale the image by a fixed factor only |
229 boolean absoluteScale = false; | |
149 | 230 // use low resolution images only |
231 boolean loresOnly = false; | |
232 // use hires images only | |
122 | 233 boolean hiresOnly = false; |
352 | 234 // send the image always as a specific type (e.g. JPEG or PNG) |
235 int forceType = ImageOps.TYPE_AUTO; | |
73 | 236 // interpolation to use for scaling |
153 | 237 int scaleQual = defaultQuality; |
73 | 238 // send html error message (or image file) |
239 boolean errorMsgHtml = false; | |
130 | 240 // original (hires) image resolution |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
241 float origResX = 0; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
242 float origResY = 0; |
1 | 243 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
244 /* request parameters */ |
73 | 245 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
246 DigilibRequest dlRequest = (DigilibRequest) request |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
247 .getAttribute("digilib.servlet.request"); |
1 | 248 |
73 | 249 // destination image width |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
250 int paramDW = dlRequest.getAsInt("dw"); |
73 | 251 // destination image height |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
252 int paramDH = dlRequest.getAsInt("dh"); |
73 | 253 // relative area x_offset (0..1) |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
254 float paramWX = dlRequest.getAsFloat("wx"); |
73 | 255 // relative area y_offset |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
256 float paramWY = dlRequest.getAsFloat("wy"); |
73 | 257 // relative area width (0..1) |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
258 float paramWW = dlRequest.getAsFloat("ww"); |
73 | 259 // relative area height |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
260 float paramWH = dlRequest.getAsFloat("wh"); |
73 | 261 // scale factor (additional to dw/width, dh/height) |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
262 float paramWS = dlRequest.getAsFloat("ws"); |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
263 // rotation angle |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
264 float paramROT = dlRequest.getAsFloat("rot"); |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
265 // contrast enhancement |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
266 float paramCONT = dlRequest.getAsFloat("cont"); |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
267 // brightness enhancement |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
268 float paramBRGT = dlRequest.getAsFloat("brgt"); |
86 | 269 // color modification |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
270 float[] paramRGBM = null; |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
271 Parameter p = dlRequest.get("rgbm"); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
272 if (p.hasValue() && (!p.getAsString().equals("0/0/0"))) { |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
273 paramRGBM = p.parseAsFloatArray("/"); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
274 } |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
275 float[] paramRGBA = null; |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
276 p = dlRequest.get("rgba"); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
277 if (p.hasValue() && (!p.getAsString().equals("0/0/0"))) { |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
278 paramRGBA = p.parseAsFloatArray("/"); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
279 } |
130 | 280 // destination resolution (DPI) |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
281 float paramDDPIX = dlRequest.getAsFloat("ddpix"); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
282 float paramDDPIY = dlRequest.getAsFloat("ddpiy"); |
130 | 283 if ((paramDDPIX == 0) || (paramDDPIY == 0)) { |
284 // 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
|
285 paramDDPIX = dlRequest.getAsFloat("ddpi"); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
286 paramDDPIY = paramDDPIX; |
130 | 287 } |
487 | 288 // absolute scale factor for mo=ascale (and mo=osize) |
289 float paramSCALE = dlRequest.getAsFloat("scale"); | |
1 | 290 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
291 /* |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
292 * operation mode: "fit": always fit to page, "clip": send original |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
293 * resolution cropped, "file": send whole file (if allowed) |
73 | 294 */ |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
295 if (dlRequest.hasOption("mo", "clip")) { |
73 | 296 scaleToFit = false; |
100 | 297 absoluteScale = false; |
149 | 298 hiresOnly = true; |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
299 } else if (dlRequest.hasOption("mo", "fit")) { |
73 | 300 scaleToFit = true; |
100 | 301 absoluteScale = false; |
149 | 302 hiresOnly = false; |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
303 } else if (dlRequest.hasOption("mo", "osize")) { |
100 | 304 scaleToFit = false; |
305 absoluteScale = true; | |
122 | 306 hiresOnly = true; |
487 | 307 } else if (dlRequest.hasOption("mo", "ascale")) { |
308 scaleToFit = false; | |
309 absoluteScale = true; | |
310 hiresOnly = false; | |
73 | 311 } |
487 | 312 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
313 // operation mode: "lores": try to use scaled image, "hires": use |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
314 // unscaled image |
348 | 315 // "autores": try best fitting resolution |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
316 if (dlRequest.hasOption("mo", "lores")) { |
149 | 317 loresOnly = true; |
318 hiresOnly = false; | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
319 } else if (dlRequest.hasOption("mo", "hires")) { |
149 | 320 loresOnly = false; |
321 hiresOnly = true; | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
322 } else if (dlRequest.hasOption("mo", "autores")) { |
149 | 323 loresOnly = false; |
324 hiresOnly = false; | |
325 } | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
326 // operation mode: "errtxt": error message in html, "errimg": error |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
327 // image |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
328 if (dlRequest.hasOption("mo", "errtxt")) { |
73 | 329 errorMsgHtml = true; |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
330 } else if (dlRequest.hasOption("mo", "errimg")) { |
73 | 331 errorMsgHtml = false; |
332 } | |
333 // operation mode: "q0" - "q2": interpolation quality | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
334 if (dlRequest.hasOption("mo", "q0")) { |
73 | 335 scaleQual = 0; |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
336 } else if (dlRequest.hasOption("mo", "q1")) { |
73 | 337 scaleQual = 1; |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
338 } else if (dlRequest.hasOption("mo", "q2")) { |
73 | 339 scaleQual = 2; |
340 } | |
303 | 341 // operation mode: "jpg": always use JPEG |
342 if (dlRequest.hasOption("mo", "jpg")) { | |
352 | 343 forceType = ImageOps.TYPE_JPEG; |
344 } | |
345 // operation mode: "png": always use PNG | |
346 if (dlRequest.hasOption("mo", "png")) { | |
347 forceType = ImageOps.TYPE_PNG; | |
335 | 348 } |
1 | 349 |
185 | 350 // check with the maximum allowed size (if set) |
351 int maxImgSize = dlConfig.getAsInt("max-image-size"); | |
352 if (maxImgSize > 0) { | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
353 paramDW = (paramDW * paramWS > maxImgSize) ? (int) (maxImgSize / paramWS) |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
354 : paramDW; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
355 paramDH = (paramDH * paramWS > maxImgSize) ? (int) (maxImgSize / paramWS) |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
356 : paramDH; |
185 | 357 } |
335 | 358 |
348 | 359 // "big" try for all file/image actions |
73 | 360 try { |
361 | |
161 | 362 // ImageFileset of the image to load |
363 ImageFileset fileset = null; | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
364 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
365 /* find the file to load/send */ |
1 | 366 |
73 | 367 // get PathInfo |
368 String loadPathName = dlRequest.getFilePath(); | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
369 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
370 /* check permissions */ |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
371 if (useAuthorization) { |
73 | 372 // get a list of required roles (empty if no restrictions) |
373 List rolesRequired = authOp.rolesForPath(loadPathName, request); | |
374 if (rolesRequired != null) { | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
375 authlog.debug("Role required: " + rolesRequired); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
376 authlog.debug("User: " + request.getRemoteUser()); |
73 | 377 // is the current request/user authorized? |
378 if (!authOp.isRoleAuthorized(rolesRequired, request)) { | |
379 // send deny answer and abort | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
380 throw new AuthOpException(); |
73 | 381 } |
382 } | |
335 | 383 } |
1 | 384 |
335 | 385 // find the file |
386 fileset = (ImageFileset) findFile(dlRequest); | |
94 | 387 if (fileset == null) { |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
388 throw new FileOpException("File " + loadPathName + "(" |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
389 + dlRequest.getAsInt("pn") + ") not found."); |
94 | 390 } |
181 | 391 |
487 | 392 /* for absolute scale and original size we need the hires size */ |
393 ImageSize hiresSize = null; | |
394 if (absoluteScale) { | |
395 ImageFile hiresFile = fileset.getBiggest(); | |
396 if (!hiresFile.isChecked()) { | |
397 ImageOps.checkFile(hiresFile); | |
398 } | |
399 hiresSize = hiresFile.getSize(); | |
400 | |
401 /* prepare resolution and scale factor for original size */ | |
402 if (dlRequest.hasOption("mo", "osize")) { | |
403 // get original resolution from metadata | |
404 fileset.checkMeta(); | |
405 origResX = fileset.getResX(); | |
406 origResY = fileset.getResY(); | |
407 if ((origResX == 0) || (origResY == 0)) { | |
408 throw new ImageOpException("Missing image DPI information!"); | |
409 } | |
410 | |
411 if ((paramDDPIX == 0) || (paramDDPIY == 0)) { | |
412 throw new ImageOpException( | |
413 "Missing display DPI information!"); | |
414 } | |
415 // calculate absolute scale factor | |
416 float sx = paramDDPIX / origResX; | |
417 float sy = paramDDPIY / origResY; | |
418 // currently only same scale :-( | |
419 paramSCALE = (sx + sy)/2f; | |
420 } | |
421 | |
422 } | |
423 | |
424 | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
425 /* calculate expected source image size */ |
149 | 426 ImageSize expectedSourceSize = new ImageSize(); |
122 | 427 if (scaleToFit) { |
487 | 428 // scale to fit -- calculate minimum source size |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
429 float scale = (1 / Math.min(paramWW, paramWH)) * paramWS; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
430 expectedSourceSize.setSize((int) (paramDW * scale), |
335 | 431 (int) (paramDH * scale)); |
487 | 432 } else if (absoluteScale && dlRequest.hasOption("mo", "ascale")) { |
433 // absolute scale -- apply scale to hires size | |
434 expectedSourceSize = hiresSize.getScaled(paramSCALE); | |
122 | 435 } else { |
487 | 436 // clip to fit -- source = destination size |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
437 expectedSourceSize.setSize((int) (paramDW * paramWS), |
335 | 438 (int) (paramDH * paramWS)); |
100 | 439 } |
440 | |
335 | 441 ImageFile fileToLoad; |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
442 /* select a resolution */ |
149 | 443 if (hiresOnly) { |
444 // get first element (= highest resolution) | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
445 fileToLoad = fileset.getBiggest(); |
149 | 446 } else if (loresOnly) { |
447 // enforced lores uses next smaller resolution | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
448 fileToLoad = fileset.getNextSmaller(expectedSourceSize); |
149 | 449 if (fileToLoad == null) { |
450 // this is the smallest we have | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
451 fileToLoad = fileset.getSmallest(); |
149 | 452 } |
453 } else { | |
130 | 454 // autores: use next higher resolution |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
455 fileToLoad = fileset.getNextBigger(expectedSourceSize); |
122 | 456 if (fileToLoad == null) { |
130 | 457 // this is the highest we have |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
458 fileToLoad = fileset.getBiggest(); |
122 | 459 } |
86 | 460 } |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
461 logger.info("Planning to load: " + fileToLoad.getFile()); |
73 | 462 |
181 | 463 /* |
464 * send the image if its mo=(raw)file | |
465 */ | |
466 if (dlRequest.hasOption("mo", "file") | |
335 | 467 || dlRequest.hasOption("mo", "rawfile")) { |
181 | 468 if (sendFileAllowed) { |
469 String mt = null; | |
470 if (dlRequest.hasOption("mo", "rawfile")) { | |
471 mt = "application/octet-stream"; | |
472 } | |
263 | 473 logger.debug("Sending RAW File as is."); |
181 | 474 ServletOps.sendFile(fileToLoad.getFile(), mt, response); |
263 | 475 logger.info("Done in " |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
476 + (System.currentTimeMillis() - startTime) + "ms"); |
263 | 477 return; |
181 | 478 } |
479 } | |
480 | |
86 | 481 // check the source image |
122 | 482 if (!fileToLoad.isChecked()) { |
284 | 483 ImageOps.checkFile(fileToLoad); |
122 | 484 } |
86 | 485 // get the source image type |
486 mimeType = fileToLoad.getMimetype(); | |
149 | 487 // get the source image size |
488 ImageSize imgSize = fileToLoad.getSize(); | |
489 | |
130 | 490 // decide if the image can be sent as is |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
491 boolean mimetypeSendable = mimeType.equals("image/jpeg") |
122 | 492 || mimeType.equals("image/png") |
493 || mimeType.equals("image/gif"); | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
494 boolean imagoOptions = dlRequest.hasOption("mo", "hmir") |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
495 || dlRequest.hasOption("mo", "vmir") || (paramROT != 0) |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
496 || (paramRGBM != null) || (paramRGBA != null) |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
497 || (paramCONT != 0) || (paramBRGT != 0); |
139
11cfe4c89fdc
Servlet version 1.11b1 with improved original-size.
robcast
parents:
130
diff
changeset
|
498 boolean imageSendable = mimetypeSendable && !imagoOptions; |
73 | 499 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
500 /* |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
501 * if not autoRes and image smaller than requested size then send as |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
502 * is. if autoRes and image has requested size then send as is. if |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
503 * not autoScale and not scaleToFit nor cropToFit then send as is |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
504 * (mo=file) |
73 | 505 */ |
181 | 506 if (imageSendable |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
507 && ((loresOnly && fileToLoad.getSize().isSmallerThan( |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
508 expectedSourceSize)) || (!(loresOnly || hiresOnly) && fileToLoad |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
509 .getSize().fitsIn(expectedSourceSize)))) { |
73 | 510 |
181 | 511 logger.debug("Sending File as is."); |
1 | 512 |
181 | 513 ServletOps.sendFile(fileToLoad.getFile(), null, response); |
514 | |
515 logger.info("Done in " | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
516 + (System.currentTimeMillis() - startTime) + "ms"); |
73 | 517 return; |
518 } | |
1 | 519 |
348 | 520 |
521 /* | |
522 * stop here if we're overloaded... | |
523 * | |
524 * 503 Service Unavailable | |
525 * The server is currently unable to | |
526 * handle the request due to a temporary overloading or maintenance | |
527 * of the server. The implication is that this is a temporary | |
528 * condition which will be alleviated after some delay. If known, | |
529 * the length of the delay MAY be indicated in a Retry-After header. | |
530 * If no Retry-After is given, the client SHOULD handle the response | |
531 * as it would for a 500 response. Note: The existence of the 503 | |
532 * status code does not imply that a server must use it when | |
533 * becoming overloaded. Some servers may wish to simply refuse the | |
534 * connection. | |
535 * (RFC2616 HTTP1.1) | |
536 */ | |
537 if (! DigilibWorker.canRun()) { | |
538 logger.error("Servlet overloaded!"); | |
539 response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE); | |
540 return; | |
541 } | |
542 | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
543 // set missing dw or dh from aspect ratio |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
544 float imgAspect = fileToLoad.getAspect(); |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
545 if (paramDW == 0) { |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
546 paramDW = (int) Math.round(paramDH * imgAspect); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
547 } else if (paramDH == 0) { |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
548 paramDH = (int) Math.round(paramDW / imgAspect); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
549 } |
149 | 550 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
551 /* crop and scale the image */ |
1 | 552 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
553 logger.debug("IMG: " + imgSize.getWidth() + "x" |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
554 + imgSize.getHeight()); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
555 logger.debug("time " + (System.currentTimeMillis() - startTime) |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
556 + "ms"); |
1 | 557 |
73 | 558 // coordinates and scaling |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
559 float areaWidth; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
560 float areaHeight; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
561 float scaleX; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
562 float scaleY; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
563 float scaleXY; |
1 | 564 |
100 | 565 // coordinates using Java2D |
566 // image size in pixels | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
567 Rectangle2D imgBounds = new Rectangle2D.Float(0, 0, imgSize |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
568 .getWidth(), imgSize.getHeight()); |
100 | 569 // user window area in [0,1] coordinates |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
570 Rectangle2D relUserArea = new Rectangle2D.Float(paramWX, paramWY, |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
571 paramWW, paramWH); |
100 | 572 // transform from relative [0,1] to image coordinates. |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
573 AffineTransform imgTrafo = AffineTransform.getScaleInstance(imgSize |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
574 .getWidth(), imgSize.getHeight()); |
85 | 575 // transform user coordinate area to image coordinate area |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
576 Rectangle2D userImgArea = imgTrafo.createTransformedShape( |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
577 relUserArea).getBounds2D(); |
100 | 578 |
579 // calculate scaling factors based on inner user area | |
73 | 580 if (scaleToFit) { |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
581 areaWidth = (float) userImgArea.getWidth(); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
582 areaHeight = (float) userImgArea.getHeight(); |
73 | 583 scaleX = paramDW / areaWidth * paramWS; |
584 scaleY = paramDH / areaHeight * paramWS; | |
585 scaleXY = (scaleX > scaleY) ? scaleY : scaleX; | |
100 | 586 } else if (absoluteScale) { |
487 | 587 scaleXY = paramSCALE; |
588 // we need to correct the factor if we use a pre-scaled image | |
589 if (imgSize.getWidth() != hiresSize.getWidth()) { | |
590 scaleXY *= (float)hiresSize.getWidth() / (float)imgSize.getWidth(); | |
591 } | |
592 scaleX = scaleXY; | |
593 scaleY = scaleXY; | |
130 | 594 areaWidth = paramDW / scaleXY * paramWS; |
595 areaHeight = paramDH / scaleXY * paramWS; | |
100 | 596 // reset user area size |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
597 userImgArea.setRect(userImgArea.getX(), userImgArea.getY(), |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
598 areaWidth, areaHeight); |
73 | 599 } else { |
600 // crop to fit | |
85 | 601 areaWidth = paramDW * paramWS; |
602 areaHeight = paramDH * paramWS; | |
100 | 603 // reset user area size |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
604 userImgArea.setRect(userImgArea.getX(), userImgArea.getY(), |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
605 areaWidth, areaHeight); |
73 | 606 scaleX = 1f; |
607 scaleY = 1f; | |
608 scaleXY = 1f; | |
100 | 609 } |
85 | 610 |
100 | 611 // enlarge image area for rotations to cover additional pixels |
612 Rectangle2D outerUserImgArea = userImgArea; | |
613 Rectangle2D innerUserImgArea = userImgArea; | |
614 if (wholeRotArea) { | |
615 if (paramROT != 0) { | |
616 try { | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
617 // rotate user area coordinates around center of user |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
618 // area |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
619 AffineTransform rotTrafo = AffineTransform |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
620 .getRotateInstance(Math.toRadians(paramROT), |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
621 userImgArea.getCenterX(), userImgArea |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
622 .getCenterY()); |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
623 // get bounds from rotated end position |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
624 innerUserImgArea = rotTrafo.createTransformedShape( |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
625 userImgArea).getBounds2D(); |
100 | 626 // get bounds from back-rotated bounds |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
627 outerUserImgArea = rotTrafo.createInverse() |
100 | 628 .createTransformedShape(innerUserImgArea) |
629 .getBounds2D(); | |
630 } catch (NoninvertibleTransformException e1) { | |
631 // this shouldn't happen anyway | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
632 logger.error(e1); |
100 | 633 } |
634 } | |
73 | 635 } |
1 | 636 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
637 logger.debug("Scale " + scaleXY + "(" + scaleX + "," + scaleY |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
638 + ") on " + outerUserImgArea); |
1 | 639 |
73 | 640 // clip area at the image border |
100 | 641 outerUserImgArea = outerUserImgArea.createIntersection(imgBounds); |
85 | 642 |
73 | 643 // check image parameters sanity |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
644 if ((outerUserImgArea.getWidth() < 1) |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
645 || (outerUserImgArea.getHeight() < 1) |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
646 || (scaleXY * outerUserImgArea.getWidth() < 2) |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
647 || (scaleXY * outerUserImgArea.getHeight() < 2)) { |
181 | 648 logger.error("ERROR: invalid scale parameter set!"); |
73 | 649 throw new ImageOpException("Invalid scale parameter set!"); |
650 } | |
1 | 651 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
652 /* |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
653 * submit the image worker job |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
654 */ |
85 | 655 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
656 DigilibWorker job = new DigilibImageWorker(dlConfig, response, |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
657 mimeType, scaleQual, dlRequest, paramROT, paramCONT, |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
658 paramBRGT, paramRGBM, paramRGBA, fileToLoad, scaleXY, |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
659 outerUserImgArea, innerUserImgArea, minSubsample, |
352 | 660 wholeRotArea, forceType); |
85 | 661 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
662 job.run(); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
663 if (job.hasError()) { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
664 throw new ImageOpException(job.getError().toString()); |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
665 } |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
666 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
667 logger.debug("servlet done in " |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
668 + (System.currentTimeMillis() - startTime)); |
73 | 669 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
670 /* error handling */ |
1 | 671 |
73 | 672 } // end of "big" try |
156 | 673 catch (IOException e) { |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
674 logger.error("ERROR: File IO Error: " + e); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
675 digilibError(errorMsgHtml, ERROR_FILE, |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
676 "ERROR: File IO Error: " + e, response); |
73 | 677 } catch (AuthOpException e) { |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
678 logger.error("ERROR: Authorization error: " + e); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
679 digilibError(errorMsgHtml, ERROR_AUTH, |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
680 "ERROR: Authorization error: " + e, response); |
73 | 681 } catch (ImageOpException e) { |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
682 logger.error("ERROR: Image Error: " + e); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
683 digilibError(errorMsgHtml, ERROR_IMAGE, |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
684 "ERROR: Image Operation Error: " + e, response); |
73 | 685 } catch (RuntimeException e) { |
686 // JAI likes to throw RuntimeExceptions ;-( | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
687 logger.error("ERROR: Other Image Error: " + e); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
688 digilibError(errorMsgHtml, ERROR_IMAGE, |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
689 "ERROR: Other Image Operation Error: " + e, response); |
73 | 690 } |
691 } | |
405
ffb2036da205
first stab at PDF printer servlet. DOES NOT WORK YET!
robcast
parents:
394
diff
changeset
|
692 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
693 /** |
335 | 694 * Returns the DocuDirent corresponding to the DigilibRequest. |
695 * | |
696 * @param dlRequest | |
697 * @return | |
698 */ | |
699 public DocuDirent findFile(DigilibRequest dlRequest) { | |
700 // find the file(set) | |
701 DocuDirent f = dirCache.getFile(dlRequest.getFilePath(), dlRequest | |
702 .getAsInt("pn"), FileOps.CLASS_IMAGE); | |
703 return f; | |
704 } | |
705 | |
706 /** | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
707 * Sends an error to the client as text or image. |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
708 * |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
709 * @param asHTML |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
710 * @param type |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
711 * @param msg |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
712 * @param response |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
713 */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
714 public void digilibError(boolean asHTML, int type, String msg, |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
715 HttpServletResponse response) { |
335 | 716 try { |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
717 File img = null; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
718 if (type == ERROR_AUTH) { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
719 if (msg == null) { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
720 msg = "ERROR: Unauthorized access!"; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
721 } |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
722 img = denyImgFile; |
363 | 723 } else if (type == ERROR_FILE) { |
724 if (msg == null) { | |
725 msg = "ERROR: Image file not found!"; | |
726 } | |
727 img = notfoundImgFile; | |
335 | 728 } else { |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
729 if (msg == null) { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
730 msg = "ERROR: Other image error!"; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
731 } |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
732 img = this.errorImgFile; |
335 | 733 } |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
734 if (asHTML && (img != null)) { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
735 ServletOps.htmlMessage(msg, response); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
736 } else { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
737 ServletOps.sendFile(img, null, response); |
335 | 738 } |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
739 } catch (IOException e) { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
740 logger.error("Error sending error!", e); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
741 } |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
742 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
743 } |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
744 |
348 | 745 } // Scaler class |