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 // marks
|
|
164 newParameter("mk", "", null, 'c');
|
|
165 }
|
|
166
|
|
167 /* (non-Javadoc)
|
|
168 * @see digilib.servlet.ParameterMap#initOptions()
|
|
169 */
|
|
170 @Override
|
|
171 protected void initOptions() {
|
|
172 options = (OptionsSet) getValue("mo");
|
|
173 }
|
|
174
|
|
175 /**
|
|
176 * Populate the request object with data from a ServletRequest.
|
|
177 *
|
|
178 *
|
|
179 * @param request
|
|
180 */
|
|
181 public void setWithRequest(HttpServletRequest request) {
|
|
182 servletRequest = request;
|
|
183 // decide if it's old-style or new-style
|
|
184 String qs = ((HttpServletRequest) request).getQueryString();
|
|
185 if (qs != null) {
|
|
186 if (qs.indexOf("&") > -1) {
|
|
187 // & separator
|
|
188 setWithParamString(qs, "&");
|
|
189 } else if (qs.indexOf(";") > -1) {
|
|
190 // ; separator
|
|
191 setWithParamString(qs, ";");
|
1157
|
192 } else if (request.getParameter("fn") != null ||
|
|
193 request.getParameter("dw") != null || request.getParameter("dh") != null) {
|
903
|
194 // standard '&' parameters
|
|
195 setWithParamRequest(request);
|
|
196 } else {
|
|
197 setWithOldString(qs);
|
|
198 }
|
|
199 }
|
|
200 setValue("servlet.request", request);
|
|
201 // add path from request
|
|
202 setValue("request.path", ((HttpServletRequest) request).getPathInfo());
|
|
203 // set the baseURL
|
|
204 setBaseURL((HttpServletRequest) request);
|
|
205 }
|
|
206
|
|
207 /**
|
|
208 * Populate a request from a string in the old "++++" parameter form.
|
|
209 *
|
|
210 * @param queryString
|
|
211 * String with paramters in the old "+++" form.
|
|
212 */
|
|
213 public void setWithOldString(String queryString) {
|
|
214 if (queryString == null) {
|
|
215 return;
|
|
216 }
|
|
217 // enable the passing of delimiter to get empty parameters
|
|
218 StringTokenizer query = new StringTokenizer(queryString, "+", true);
|
|
219 String token;
|
|
220 // first parameter FN
|
|
221 if (query.hasMoreTokens()) {
|
|
222 token = query.nextToken();
|
|
223 if (!token.equals("+")) {
|
|
224 setValueFromString("fn", token);
|
|
225 if (query.hasMoreTokens()) {
|
|
226 query.nextToken();
|
|
227 }
|
|
228 }
|
|
229 }
|
|
230 // second parameter PN
|
|
231 if (query.hasMoreTokens()) {
|
|
232 token = query.nextToken();
|
|
233 if (!token.equals("+")) {
|
|
234 setValueFromString("pn", token);
|
|
235 if (query.hasMoreTokens()) {
|
|
236 query.nextToken();
|
|
237 }
|
|
238 }
|
|
239 }
|
|
240 // third parameter WS
|
|
241 if (query.hasMoreTokens()) {
|
|
242 token = query.nextToken();
|
|
243 if (!token.equals("+")) {
|
|
244 setValueFromString("ws", token);
|
|
245 if (query.hasMoreTokens()) {
|
|
246 query.nextToken();
|
|
247 }
|
|
248 }
|
|
249 }
|
|
250 // fourth parameter MO
|
|
251 if (query.hasMoreTokens()) {
|
|
252 token = query.nextToken();
|
|
253 if (!token.equals("+")) {
|
|
254 setValueFromString("mo", token);
|
|
255 if (query.hasMoreTokens()) {
|
|
256 query.nextToken();
|
|
257 }
|
|
258 }
|
|
259 }
|
|
260 // fifth parameter MK
|
|
261 if (query.hasMoreTokens()) {
|
|
262 token = query.nextToken();
|
|
263 if (!token.equals("+")) {
|
|
264 setValueFromString("mk", token);
|
|
265 if (query.hasMoreTokens()) {
|
|
266 query.nextToken();
|
|
267 }
|
|
268 }
|
|
269 }
|
|
270 // sixth parameter WX
|
|
271 if (query.hasMoreTokens()) {
|
|
272 token = query.nextToken();
|
|
273 if (!token.equals("+")) {
|
|
274 setValueFromString("wx", token);
|
|
275 if (query.hasMoreTokens()) {
|
|
276 query.nextToken();
|
|
277 }
|
|
278 }
|
|
279 }
|
|
280 // seventh parameter WY
|
|
281 if (query.hasMoreTokens()) {
|
|
282 token = query.nextToken();
|
|
283 if (!token.equals("+")) {
|
|
284 setValueFromString("wy", token);
|
|
285 if (query.hasMoreTokens()) {
|
|
286 query.nextToken();
|
|
287 }
|
|
288 }
|
|
289 }
|
|
290 // eigth parameter WW
|
|
291 if (query.hasMoreTokens()) {
|
|
292 token = query.nextToken();
|
|
293 if (!token.equals("+")) {
|
|
294 setValueFromString("ww", token);
|
|
295 if (query.hasMoreTokens()) {
|
|
296 query.nextToken();
|
|
297 }
|
|
298 }
|
|
299 }
|
|
300 // ninth parameter WH
|
|
301 if (query.hasMoreTokens()) {
|
|
302 token = query.nextToken();
|
|
303 if (!token.equals("+")) {
|
|
304 setValueFromString("wh", token);
|
|
305 if (query.hasMoreTokens()) {
|
|
306 query.nextToken();
|
|
307 }
|
|
308 }
|
|
309 }
|
|
310 }
|
|
311
|
|
312 /**
|
|
313 * Return the request parameters as a String in the parameter form
|
|
314 * 'fn=/icons&pn=1'. Empty (undefined) fields are not included.
|
|
315 *
|
|
316 * @return String of request parameters in parameter form.
|
|
317 */
|
|
318 public String getAsString() {
|
|
319 return getAsString(0);
|
|
320 }
|
|
321
|
|
322 /**
|
|
323 * Return the request parameters of a given type type as a String in the
|
|
324 * parameter form 'fn=/icons&pn=1'. Empty (undefined) fields are not
|
|
325 * included.
|
|
326 *
|
|
327 * @return String of request parameters in parameter form.
|
|
328 */
|
|
329 public String getAsString(int type) {
|
|
330 StringBuffer s = new StringBuffer(50);
|
|
331 // go through all values
|
|
332 for (Parameter p: params.values()) {
|
|
333 if ((type > 0) && (p.getType() != type)) {
|
|
334 // skip the wrong types
|
|
335 continue;
|
|
336 }
|
|
337 String name = p.getName();
|
|
338 /*
|
|
339 * handling special cases
|
|
340 */
|
|
341 // request_path adds to fn
|
|
342 if (name.equals("fn")) {
|
|
343 s.append("&fn=" + getAsString("request.path")
|
|
344 + getAsString("fn"));
|
|
345 continue;
|
|
346 }
|
|
347 /*
|
|
348 * the rest is sent with its name
|
|
349 */
|
|
350 // parameters that are not set or internal are not sent
|
|
351 if ((!p.hasValue()) || (p.getType() == 'i')) {
|
|
352 continue;
|
|
353 }
|
|
354 s.append("&" + name + "=" + p.getAsString());
|
|
355 }
|
|
356 // kill first "&"
|
|
357 s.deleteCharAt(0);
|
|
358 return s.toString();
|
|
359 }
|
|
360
|
|
361 /**
|
|
362 * Returns request parameters in old '++++' form.
|
|
363 *
|
|
364 * @return String with parameters in old '++++' form.
|
|
365 */
|
|
366 public String getAsOldString() {
|
|
367 StringBuffer s = new StringBuffer(50);
|
|
368 s.append(getAsString("request.path"));
|
|
369 s.append(getAsString("fn"));
|
|
370 s.append("+" + getAsString("pn"));
|
|
371 s.append("+" + getAsString("ws"));
|
|
372 s.append("+" + getAsString("mo"));
|
|
373 s.append("+" + getAsString("mk"));
|
|
374 s.append("+" + getAsString("wx"));
|
|
375 s.append("+" + getAsString("wy"));
|
|
376 s.append("+" + getAsString("ww"));
|
|
377 s.append("+" + getAsString("wh"));
|
|
378 return s.toString();
|
|
379 }
|
|
380
|
|
381 /**
|
|
382 * Set request parameters from javax.servlet.ServletRequest. Uses the
|
|
383 * Requests getParameter methods for 'fn=foo' style parameters.
|
|
384 *
|
|
385 * @param request
|
|
386 * ServletRequest to get parameters from.
|
|
387 */
|
|
388 //@SuppressWarnings("unchecked") // ServletRequest.getParameterNames() returns naked Enumeration
|
|
389 public void setWithParamRequest(ServletRequest request) {
|
|
390 setValue("servlet.request", request);
|
|
391 // go through all request parameters
|
|
392 for (Enumeration<String> i = request.getParameterNames(); i.hasMoreElements();) {
|
|
393 String name = (String) i.nextElement();
|
|
394 // is this a known parameter?
|
|
395 if (params.containsKey(name)) {
|
|
396 Parameter p = (Parameter) this.get(name);
|
|
397 // internal parameters are not set
|
|
398 if (p.getType() == 'i') {
|
|
399 continue;
|
|
400 }
|
|
401 p.setValueFromString(request.getParameter(name));
|
|
402 continue;
|
|
403 }
|
|
404 // unknown parameters are just added with type 'r'
|
|
405 newParameter(name, null, request.getParameter(name), 'r');
|
|
406 }
|
|
407 // add path from request
|
|
408 setValue("request.path", ((HttpServletRequest) request).getPathInfo());
|
|
409 }
|
|
410
|
|
411 /**
|
|
412 * Set request parameters from query string. Uses the separator string qs to
|
|
413 * get 'fn=foo' style parameters.
|
|
414 *
|
|
415 * @param qs
|
|
416 * query string
|
|
417 * @param sep
|
|
418 * parameter-separator string
|
|
419 */
|
|
420 public void setWithParamString(String qs, String sep) {
|
|
421 // go through all request parameters
|
|
422 String[] qa = qs.split(sep);
|
|
423 for (int i = 0; i < qa.length; i++) {
|
|
424 // split names and values on "="
|
|
425 String[] nv = qa[i].split("=");
|
|
426 try {
|
|
427 String name = URLDecoder.decode(nv[0], "UTF-8");
|
|
428 String val = URLDecoder.decode(nv[1], "UTF-8");
|
|
429 // is this a known parameter?
|
|
430 if (params.containsKey(name)) {
|
|
431 Parameter p = (Parameter) this.get(name);
|
|
432 // internal parameters are not set
|
|
433 if (p.getType() == 'i') {
|
|
434 continue;
|
|
435 }
|
|
436 p.setValueFromString(val);
|
|
437 continue;
|
|
438 }
|
|
439 // unknown parameters are just added with type 'r'
|
|
440 newParameter(name, null, val, 'r');
|
|
441 } catch (UnsupportedEncodingException e) {
|
|
442 // this shouldn't happen anyway
|
|
443 e.printStackTrace();
|
|
444 }
|
|
445 }
|
|
446 }
|
|
447
|
|
448 /**
|
|
449 * Test if option string <code>opt</code> is set. Checks if the substring
|
|
450 * <code>opt</code> is contained in the options string <code>param</code>.
|
|
451 * Deprecated! use hasOption(String opt) for "mo"-options.
|
|
452 *
|
|
453 * @param opt
|
|
454 * Option string to be tested.
|
|
455 * @return boolean
|
|
456 */
|
|
457 public boolean hasOption(String param, String opt) {
|
|
458 String s = getAsString(param);
|
|
459 if (s != null) {
|
|
460 StringTokenizer i = new StringTokenizer(s, ",");
|
|
461 while (i.hasMoreTokens()) {
|
|
462 if (i.nextToken().equals(opt)) {
|
|
463 return true;
|
|
464 }
|
|
465 }
|
|
466 }
|
|
467 return false;
|
|
468 }
|
|
469
|
|
470 /**
|
|
471 * The image file path to be accessed.
|
|
472 *
|
|
473 * The mage file path is assembled from the servlets RequestPath and
|
|
474 * Parameter fn and normalized.
|
|
475 *
|
|
476 * @return String the effective filepath.
|
|
477 */
|
|
478 public String getFilePath() {
|
|
479 String s = getAsString("request.path");
|
|
480 s += getAsString("fn");
|
|
481 return FileOps.normalName(s);
|
|
482 }
|
|
483
|
|
484 /* Property getter and setter */
|
|
485
|
|
486 /**
|
|
487 * Set the requests base URL parameter from a
|
|
488 * javax.sevlet.http.HttpServletRequest.
|
|
489 *
|
|
490 * @param request
|
|
491 * HttpServletRequest to set the base URL.
|
|
492 */
|
|
493 public void setBaseURL(javax.servlet.http.HttpServletRequest request) {
|
|
494 String baseURL = null;
|
|
495 // calculate base URL string from request (minus last part)
|
|
496 String s = request.getRequestURL().toString();
|
|
497 int eop = s.lastIndexOf("/");
|
|
498 if (eop > 0) {
|
|
499 baseURL = s.substring(0, eop);
|
|
500 } else {
|
|
501 // fall back
|
|
502 baseURL = "http://" + request.getServerName()
|
|
503 + "/docuserver/digitallibrary";
|
|
504 }
|
|
505 setValue("base.url", baseURL);
|
|
506 }
|
|
507
|
|
508 /**
|
|
509 * Returns the image.
|
|
510 *
|
|
511 * @return DocuImage
|
|
512 */
|
|
513 public DocuImage getImage() {
|
|
514 return image;
|
|
515 }
|
|
516
|
|
517 /**
|
|
518 * Sets the image.
|
|
519 *
|
|
520 * @param image
|
|
521 * The image to set
|
|
522 */
|
|
523 public void setImage(DocuImage image) {
|
|
524 this.image = image;
|
|
525 setValue("docu.image", image);
|
|
526 }
|
|
527
|
|
528 /**
|
|
529 * @return
|
|
530 */
|
|
531 public HttpServletRequest getServletRequest() {
|
|
532 return servletRequest;
|
|
533 }
|
|
534
|
|
535 }
|