comparison servlet2/src/main/java/digilib/servlet/DigilibServletRequest.java @ 903:7779b37d1d05

refactored into maven modules per servlet type. can build servlet-api 2.3 and 3.0 via profile now!
author robcast
date Tue, 26 Apr 2011 20:24:31 +0200
parents
children 7a4f27ee087f
comparison
equal deleted inserted replaced
902:89ba3ffcf552 903:7779b37d1d05
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("&amp;") > -1) {
191 // &amp; separator
192 setWithParamString(qs, "&amp;");
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&amp;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&amp;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 }