903
|
1 /*
|
|
2 * DigilibRequest.java
|
|
3 *
|
|
4 * lightweight class carrying all parameters for a request to digilib
|
|
5 *
|
|
6
|
|
7 Digital Image Library servlet components
|
|
8
|
|
9 Copyright (C) 2001, 2002 Robert Casties (robcast@mail.berlios.de),
|
|
10 Christian Luginbuehl
|
|
11
|
|
12 This program is free software; you can redistribute it and/or modify it
|
|
13 under the terms of the GNU General Public License as published by the
|
|
14 Free Software Foundation; either version 2 of the License, or (at your
|
|
15 option) any later version.
|
|
16
|
|
17 Please read license.txt for the full details. A copy of the GPL
|
|
18 may be found at http://www.gnu.org/copyleft/lgpl.html
|
|
19
|
|
20 You should have received a copy of the GNU General Public License
|
|
21 along with this program; if not, write to the Free Software
|
|
22 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
23
|
|
24 * Created on 27. August 2002, 19:43
|
|
25 */
|
|
26
|
|
27 package digilib.servlet;
|
|
28
|
|
29 import java.io.UnsupportedEncodingException;
|
|
30 import java.net.URLDecoder;
|
|
31 import java.util.Enumeration;
|
|
32 import java.util.StringTokenizer;
|
|
33
|
|
34 import javax.servlet.ServletRequest;
|
|
35 import javax.servlet.http.HttpServletRequest;
|
|
36
|
|
37 import digilib.image.DocuImage;
|
|
38 import digilib.io.FileOps;
|
|
39 import digilib.util.OptionsSet;
|
|
40 import digilib.util.Parameter;
|
|
41
|
|
42 /**
|
|
43 * Class holding the parameters of a digilib user request. The parameters are
|
|
44 * mostly named like the servlet parameters: <br>
|
|
45 * request_path: url of the page/document. <br>
|
|
46 * fn: url of the page/document. <br>
|
|
47 * pn: page number. <br>
|
|
48 * dw: width of result window in pixels. <br>
|
|
49 * dh: height of result window in pixels. <br>
|
|
50 * wx: left edge of image area (float from 0 to 1). <br>
|
|
51 * wy: top edge of image area (float from 0 to 1). <br>
|
|
52 * ww: width of image area(float from 0 to 1). <br>
|
|
53 * wh: height of image area(float from 0 to 1). <br>
|
|
54 * ws: scale factor. <br>
|
|
55 * mo: special options like 'fit' for gifs. <br>
|
|
56 * mk: list of marks. <br>
|
|
57 * pt: total number of pages (generated by sevlet). <br>
|
|
58 * baseURL: base URL (from http:// to below /servlet). <br>
|
|
59 * ...et alii
|
|
60 *
|
|
61 * @author casties
|
|
62 *
|
|
63 */
|
|
64 public class DigilibServletRequest extends DigilibRequest {
|
|
65
|
|
66 protected DocuImage image; // internal DocuImage instance for this request
|
|
67
|
|
68 protected HttpServletRequest servletRequest; // internal ServletRequest
|
|
69
|
|
70 /**
|
|
71 * Creates a new instance of DigilibRequest with parameters from a
|
|
72 * ServletRequest. All undefined parameters are set to default values.
|
|
73 *
|
|
74 * @param request
|
|
75 */
|
|
76 public DigilibServletRequest(HttpServletRequest request) {
|
|
77 setWithRequest(request);
|
|
78 initOptions();
|
|
79 }
|
|
80
|
|
81 /** set up parameters.
|
|
82 *
|
|
83 */
|
|
84 protected void initParams() {
|
|
85 /*
|
|
86 * Definition of parameters and default values. Parameter of type 's'
|
|
87 * are for the servlet.
|
|
88 */
|
|
89
|
|
90 // url of the page/document (second part)
|
|
91 newParameter("fn", "", null, 's');
|
|
92 // page number
|
|
93 newParameter("pn", new Integer(1), null, 's');
|
|
94 // width of client in pixels
|
|
95 newParameter("dw", new Integer(0), null, 's');
|
|
96 // height of client in pixels
|
|
97 newParameter("dh", new Integer(0), null, 's');
|
|
98 // left edge of image (float from 0 to 1)
|
|
99 newParameter("wx", new Float(0), null, 's');
|
|
100 // top edge in image (float from 0 to 1)
|
|
101 newParameter("wy", new Float(0), null, 's');
|
|
102 // width of image (float from 0 to 1)
|
|
103 newParameter("ww", new Float(1), null, 's');
|
|
104 // height of image (float from 0 to 1)
|
|
105 newParameter("wh", new Float(1), null, 's');
|
|
106 // scale factor
|
|
107 newParameter("ws", new Float(1), null, 's');
|
|
108 // special options like 'fit' for gifs
|
|
109 newParameter("mo", this.options, null, 's');
|
|
110 // rotation angle (degree)
|
|
111 newParameter("rot", new Float(0), null, 's');
|
|
112 // contrast enhancement factor
|
|
113 newParameter("cont", new Float(0), null, 's');
|
|
114 // brightness enhancement factor
|
|
115 newParameter("brgt", new Float(0), null, 's');
|
|
116 // color multiplicative factors
|
|
117 newParameter("rgbm", "0/0/0", null, 's');
|
|
118 // color additive factors
|
|
119 newParameter("rgba", "0/0/0", null, 's');
|
|
120 // display dpi resolution (total)
|
|
121 newParameter("ddpi", new Float(0), null, 's');
|
|
122 // display dpi X resolution
|
|
123 newParameter("ddpix", new Float(0), null, 's');
|
|
124 // display dpi Y resolution
|
|
125 newParameter("ddpiy", new Float(0), null, 's');
|
|
126 // scale factor for mo=ascale
|
|
127 newParameter("scale", new Float(1), null, 's');
|
|
128 // color conversion operation
|
|
129 newParameter("colop", "", null, 's');
|
|
130
|
|
131 /*
|
|
132 * Parameters of type 'i' are not exchanged between client and server,
|
|
133 * but are for the servlets or JSPs internal use.
|
|
134 */
|
|
135
|
|
136 // url of the page/document (first part, may be empty)
|
|
137 newParameter("request.path", "", null, 'i');
|
|
138 // base URL (from http:// to below /servlet)
|
|
139 newParameter("base.url", null, null, 'i');
|
|
140 // DocuImage instance for this request
|
|
141 newParameter("docu.image", image, null, 'i');
|
|
142 image = null;
|
|
143 // HttpServletRequest for this request
|
|
144 newParameter("servlet.request", servletRequest, null, 'i');
|
|
145 servletRequest = null;
|
|
146
|
|
147 /*
|
|
148 * Parameters of type 'c' are for the clients use
|
|
149 */
|
|
150
|
|
151 // "real" filename
|
|
152 newParameter("img.fn", "", null, 'c');
|
|
153 // image dpi x
|
|
154 newParameter("img.dpix", new Integer(0), null, 'c');
|
|
155 // image dpi y
|
|
156 newParameter("img.dpiy", new Integer(0), null, 'c');
|
|
157 // hires image size x
|
|
158 newParameter("img.pix_x", new Integer(0), null, 'c');
|
|
159 // hires image size y
|
|
160 newParameter("img.pix_y", new Integer(0), null, 'c');
|
|
161 // total number of pages
|
|
162 newParameter("pt", new Integer(0), null, 'c');
|
|
163 // display level of digilib (0 = just image, 1 = one HTML page
|
|
164 // 2 = in frameset, 3 = XUL-'frameset'
|
|
165 // 4 = XUL-Sidebar )
|
|
166 newParameter("lv", new Integer(2), null, 'c');
|
|
167 // marks
|
|
168 newParameter("mk", "", null, 'c');
|
|
169 }
|
|
170
|
|
171 /* (non-Javadoc)
|
|
172 * @see digilib.servlet.ParameterMap#initOptions()
|
|
173 */
|
|
174 @Override
|
|
175 protected void initOptions() {
|
|
176 options = (OptionsSet) getValue("mo");
|
|
177 }
|
|
178
|
|
179 /**
|
|
180 * Populate the request object with data from a ServletRequest.
|
|
181 *
|
|
182 *
|
|
183 * @param request
|
|
184 */
|
|
185 public void setWithRequest(HttpServletRequest request) {
|
|
186 servletRequest = request;
|
|
187 // decide if it's old-style or new-style
|
|
188 String qs = ((HttpServletRequest) request).getQueryString();
|
|
189 if (qs != null) {
|
|
190 if (qs.indexOf("&") > -1) {
|
|
191 // & separator
|
|
192 setWithParamString(qs, "&");
|
|
193 } else if (qs.indexOf(";") > -1) {
|
|
194 // ; separator
|
|
195 setWithParamString(qs, ";");
|
|
196 } else if (request.getParameter("fn") != null) {
|
|
197 // standard '&' parameters
|
|
198 setWithParamRequest(request);
|
|
199 } else {
|
|
200 setWithOldString(qs);
|
|
201 }
|
|
202 }
|
|
203 setValue("servlet.request", request);
|
|
204 // add path from request
|
|
205 setValue("request.path", ((HttpServletRequest) request).getPathInfo());
|
|
206 // set the baseURL
|
|
207 setBaseURL((HttpServletRequest) request);
|
|
208 }
|
|
209
|
|
210 /**
|
|
211 * Populate a request from a string in the old "++++" parameter form.
|
|
212 *
|
|
213 * @param queryString
|
|
214 * String with paramters in the old "+++" form.
|
|
215 */
|
|
216 public void setWithOldString(String queryString) {
|
|
217 if (queryString == null) {
|
|
218 return;
|
|
219 }
|
|
220 // enable the passing of delimiter to get empty parameters
|
|
221 StringTokenizer query = new StringTokenizer(queryString, "+", true);
|
|
222 String token;
|
|
223 // first parameter FN
|
|
224 if (query.hasMoreTokens()) {
|
|
225 token = query.nextToken();
|
|
226 if (!token.equals("+")) {
|
|
227 setValueFromString("fn", token);
|
|
228 if (query.hasMoreTokens()) {
|
|
229 query.nextToken();
|
|
230 }
|
|
231 }
|
|
232 }
|
|
233 // second parameter PN
|
|
234 if (query.hasMoreTokens()) {
|
|
235 token = query.nextToken();
|
|
236 if (!token.equals("+")) {
|
|
237 setValueFromString("pn", token);
|
|
238 if (query.hasMoreTokens()) {
|
|
239 query.nextToken();
|
|
240 }
|
|
241 }
|
|
242 }
|
|
243 // third parameter WS
|
|
244 if (query.hasMoreTokens()) {
|
|
245 token = query.nextToken();
|
|
246 if (!token.equals("+")) {
|
|
247 setValueFromString("ws", token);
|
|
248 if (query.hasMoreTokens()) {
|
|
249 query.nextToken();
|
|
250 }
|
|
251 }
|
|
252 }
|
|
253 // fourth parameter MO
|
|
254 if (query.hasMoreTokens()) {
|
|
255 token = query.nextToken();
|
|
256 if (!token.equals("+")) {
|
|
257 setValueFromString("mo", token);
|
|
258 if (query.hasMoreTokens()) {
|
|
259 query.nextToken();
|
|
260 }
|
|
261 }
|
|
262 }
|
|
263 // fifth parameter MK
|
|
264 if (query.hasMoreTokens()) {
|
|
265 token = query.nextToken();
|
|
266 if (!token.equals("+")) {
|
|
267 setValueFromString("mk", token);
|
|
268 if (query.hasMoreTokens()) {
|
|
269 query.nextToken();
|
|
270 }
|
|
271 }
|
|
272 }
|
|
273 // sixth parameter WX
|
|
274 if (query.hasMoreTokens()) {
|
|
275 token = query.nextToken();
|
|
276 if (!token.equals("+")) {
|
|
277 setValueFromString("wx", token);
|
|
278 if (query.hasMoreTokens()) {
|
|
279 query.nextToken();
|
|
280 }
|
|
281 }
|
|
282 }
|
|
283 // seventh parameter WY
|
|
284 if (query.hasMoreTokens()) {
|
|
285 token = query.nextToken();
|
|
286 if (!token.equals("+")) {
|
|
287 setValueFromString("wy", token);
|
|
288 if (query.hasMoreTokens()) {
|
|
289 query.nextToken();
|
|
290 }
|
|
291 }
|
|
292 }
|
|
293 // eigth parameter WW
|
|
294 if (query.hasMoreTokens()) {
|
|
295 token = query.nextToken();
|
|
296 if (!token.equals("+")) {
|
|
297 setValueFromString("ww", token);
|
|
298 if (query.hasMoreTokens()) {
|
|
299 query.nextToken();
|
|
300 }
|
|
301 }
|
|
302 }
|
|
303 // ninth parameter WH
|
|
304 if (query.hasMoreTokens()) {
|
|
305 token = query.nextToken();
|
|
306 if (!token.equals("+")) {
|
|
307 setValueFromString("wh", token);
|
|
308 if (query.hasMoreTokens()) {
|
|
309 query.nextToken();
|
|
310 }
|
|
311 }
|
|
312 }
|
|
313 }
|
|
314
|
|
315 /**
|
|
316 * Return the request parameters as a String in the parameter form
|
|
317 * 'fn=/icons&pn=1'. Empty (undefined) fields are not included.
|
|
318 *
|
|
319 * @return String of request parameters in parameter form.
|
|
320 */
|
|
321 public String getAsString() {
|
|
322 return getAsString(0);
|
|
323 }
|
|
324
|
|
325 /**
|
|
326 * Return the request parameters of a given type type as a String in the
|
|
327 * parameter form 'fn=/icons&pn=1'. Empty (undefined) fields are not
|
|
328 * included.
|
|
329 *
|
|
330 * @return String of request parameters in parameter form.
|
|
331 */
|
|
332 public String getAsString(int type) {
|
|
333 StringBuffer s = new StringBuffer(50);
|
|
334 // go through all values
|
|
335 for (Parameter p: params.values()) {
|
|
336 if ((type > 0) && (p.getType() != type)) {
|
|
337 // skip the wrong types
|
|
338 continue;
|
|
339 }
|
|
340 String name = p.getName();
|
|
341 /*
|
|
342 * handling special cases
|
|
343 */
|
|
344 // request_path adds to fn
|
|
345 if (name.equals("fn")) {
|
|
346 s.append("&fn=" + getAsString("request.path")
|
|
347 + getAsString("fn"));
|
|
348 continue;
|
|
349 }
|
|
350 /*
|
|
351 * the rest is sent with its name
|
|
352 */
|
|
353 // parameters that are not set or internal are not sent
|
|
354 if ((!p.hasValue()) || (p.getType() == 'i')) {
|
|
355 continue;
|
|
356 }
|
|
357 s.append("&" + name + "=" + p.getAsString());
|
|
358 }
|
|
359 // kill first "&"
|
|
360 s.deleteCharAt(0);
|
|
361 return s.toString();
|
|
362 }
|
|
363
|
|
364 /**
|
|
365 * Returns request parameters in old '++++' form.
|
|
366 *
|
|
367 * @return String with parameters in old '++++' form.
|
|
368 */
|
|
369 public String getAsOldString() {
|
|
370 StringBuffer s = new StringBuffer(50);
|
|
371 s.append(getAsString("request.path"));
|
|
372 s.append(getAsString("fn"));
|
|
373 s.append("+" + getAsString("pn"));
|
|
374 s.append("+" + getAsString("ws"));
|
|
375 s.append("+" + getAsString("mo"));
|
|
376 s.append("+" + getAsString("mk"));
|
|
377 s.append("+" + getAsString("wx"));
|
|
378 s.append("+" + getAsString("wy"));
|
|
379 s.append("+" + getAsString("ww"));
|
|
380 s.append("+" + getAsString("wh"));
|
|
381 return s.toString();
|
|
382 }
|
|
383
|
|
384 /**
|
|
385 * Set request parameters from javax.servlet.ServletRequest. Uses the
|
|
386 * Requests getParameter methods for 'fn=foo' style parameters.
|
|
387 *
|
|
388 * @param request
|
|
389 * ServletRequest to get parameters from.
|
|
390 */
|
|
391 //@SuppressWarnings("unchecked") // ServletRequest.getParameterNames() returns naked Enumeration
|
|
392 public void setWithParamRequest(ServletRequest request) {
|
|
393 setValue("servlet.request", request);
|
|
394 // go through all request parameters
|
|
395 for (Enumeration<String> i = request.getParameterNames(); i.hasMoreElements();) {
|
|
396 String name = (String) i.nextElement();
|
|
397 // is this a known parameter?
|
|
398 if (params.containsKey(name)) {
|
|
399 Parameter p = (Parameter) this.get(name);
|
|
400 // internal parameters are not set
|
|
401 if (p.getType() == 'i') {
|
|
402 continue;
|
|
403 }
|
|
404 p.setValueFromString(request.getParameter(name));
|
|
405 continue;
|
|
406 }
|
|
407 // unknown parameters are just added with type 'r'
|
|
408 newParameter(name, null, request.getParameter(name), 'r');
|
|
409 }
|
|
410 // add path from request
|
|
411 setValue("request.path", ((HttpServletRequest) request).getPathInfo());
|
|
412 }
|
|
413
|
|
414 /**
|
|
415 * Set request parameters from query string. Uses the separator string qs to
|
|
416 * get 'fn=foo' style parameters.
|
|
417 *
|
|
418 * @param qs
|
|
419 * query string
|
|
420 * @param sep
|
|
421 * parameter-separator string
|
|
422 */
|
|
423 public void setWithParamString(String qs, String sep) {
|
|
424 // go through all request parameters
|
|
425 String[] qa = qs.split(sep);
|
|
426 for (int i = 0; i < qa.length; i++) {
|
|
427 // split names and values on "="
|
|
428 String[] nv = qa[i].split("=");
|
|
429 try {
|
|
430 String name = URLDecoder.decode(nv[0], "UTF-8");
|
|
431 String val = URLDecoder.decode(nv[1], "UTF-8");
|
|
432 // is this a known parameter?
|
|
433 if (params.containsKey(name)) {
|
|
434 Parameter p = (Parameter) this.get(name);
|
|
435 // internal parameters are not set
|
|
436 if (p.getType() == 'i') {
|
|
437 continue;
|
|
438 }
|
|
439 p.setValueFromString(val);
|
|
440 continue;
|
|
441 }
|
|
442 // unknown parameters are just added with type 'r'
|
|
443 newParameter(name, null, val, 'r');
|
|
444 } catch (UnsupportedEncodingException e) {
|
|
445 // this shouldn't happen anyway
|
|
446 e.printStackTrace();
|
|
447 }
|
|
448 }
|
|
449 }
|
|
450
|
|
451 /**
|
|
452 * Test if option string <code>opt</code> is set. Checks if the substring
|
|
453 * <code>opt</code> is contained in the options string <code>param</code>.
|
|
454 * Deprecated! use hasOption(String opt) for "mo"-options.
|
|
455 *
|
|
456 * @param opt
|
|
457 * Option string to be tested.
|
|
458 * @return boolean
|
|
459 */
|
|
460 public boolean hasOption(String param, String opt) {
|
|
461 String s = getAsString(param);
|
|
462 if (s != null) {
|
|
463 StringTokenizer i = new StringTokenizer(s, ",");
|
|
464 while (i.hasMoreTokens()) {
|
|
465 if (i.nextToken().equals(opt)) {
|
|
466 return true;
|
|
467 }
|
|
468 }
|
|
469 }
|
|
470 return false;
|
|
471 }
|
|
472
|
|
473 /**
|
|
474 * The image file path to be accessed.
|
|
475 *
|
|
476 * The mage file path is assembled from the servlets RequestPath and
|
|
477 * Parameter fn and normalized.
|
|
478 *
|
|
479 * @return String the effective filepath.
|
|
480 */
|
|
481 public String getFilePath() {
|
|
482 String s = getAsString("request.path");
|
|
483 s += getAsString("fn");
|
|
484 return FileOps.normalName(s);
|
|
485 }
|
|
486
|
|
487 /* Property getter and setter */
|
|
488
|
|
489 /**
|
|
490 * Set the requests base URL parameter from a
|
|
491 * javax.sevlet.http.HttpServletRequest.
|
|
492 *
|
|
493 * @param request
|
|
494 * HttpServletRequest to set the base URL.
|
|
495 */
|
|
496 public void setBaseURL(javax.servlet.http.HttpServletRequest request) {
|
|
497 String baseURL = null;
|
|
498 // calculate base URL string from request (minus last part)
|
|
499 String s = request.getRequestURL().toString();
|
|
500 int eop = s.lastIndexOf("/");
|
|
501 if (eop > 0) {
|
|
502 baseURL = s.substring(0, eop);
|
|
503 } else {
|
|
504 // fall back
|
|
505 baseURL = "http://" + request.getServerName()
|
|
506 + "/docuserver/digitallibrary";
|
|
507 }
|
|
508 setValue("base.url", baseURL);
|
|
509 }
|
|
510
|
|
511 /**
|
|
512 * Returns the image.
|
|
513 *
|
|
514 * @return DocuImage
|
|
515 */
|
|
516 public DocuImage getImage() {
|
|
517 return image;
|
|
518 }
|
|
519
|
|
520 /**
|
|
521 * Sets the image.
|
|
522 *
|
|
523 * @param image
|
|
524 * The image to set
|
|
525 */
|
|
526 public void setImage(DocuImage image) {
|
|
527 this.image = image;
|
|
528 setValue("docu.image", image);
|
|
529 }
|
|
530
|
|
531 /**
|
|
532 * @return
|
|
533 */
|
|
534 public HttpServletRequest getServletRequest() {
|
|
535 return servletRequest;
|
|
536 }
|
|
537
|
|
538 }
|