%line | %branch | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
org.apache.turbine.util.uri.TurbineURI |
|
|
1 | package org.apache.turbine.util.uri; |
|
2 | ||
3 | /* |
|
4 | * Copyright 2001-2005 The Apache Software Foundation. |
|
5 | * |
|
6 | * Licensed under the Apache License, Version 2.0 (the "License") |
|
7 | * you may not use this file except in compliance with the License. |
|
8 | * You may obtain a copy of the License at |
|
9 | * |
|
10 | * http://www.apache.org/licenses/LICENSE-2.0 |
|
11 | * |
|
12 | * Unless required by applicable law or agreed to in writing, software |
|
13 | * distributed under the License is distributed on an "AS IS" BASIS, |
|
14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
15 | * See the License for the specific language governing permissions and |
|
16 | * limitations under the License. |
|
17 | */ |
|
18 | ||
19 | import java.net.URLEncoder; |
|
20 | ||
21 | import java.util.ArrayList; |
|
22 | import java.util.Collection; |
|
23 | import java.util.Iterator; |
|
24 | import java.util.List; |
|
25 | ||
26 | import org.apache.commons.lang.StringUtils; |
|
27 | ||
28 | import org.apache.commons.logging.Log; |
|
29 | import org.apache.commons.logging.LogFactory; |
|
30 | ||
31 | import org.apache.turbine.util.RunData; |
|
32 | import org.apache.turbine.util.ServerData; |
|
33 | import org.apache.turbine.util.parser.ParameterParser; |
|
34 | import org.apache.turbine.util.parser.ParserUtils; |
|
35 | ||
36 | /** |
|
37 | * This class allows you to keep all the information needed for a single |
|
38 | * link at one place. It keeps your query data, path info, the server |
|
39 | * scheme, name, port and the script path. |
|
40 | * |
|
41 | * If you must generate a Turbine Link, use this class. |
|
42 | * |
|
43 | * @author <a href="mailto:jon@clearink.com">Jon S. Stevens</a> |
|
44 | * @author <a href="mailto:jvanzyl@periapt.com">Jason van Zyl</a> |
|
45 | * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a> |
|
46 | * @version $Id: TurbineURI.java 264148 2005-08-29 14:21:04Z henning $ |
|
47 | */ |
|
48 | ||
49 | 1 | public class TurbineURI |
50 | extends BaseURI |
|
51 | { |
|
52 | /** Logging */ |
|
53 | 3 | private static Log log = LogFactory.getLog(TurbineURI.class); |
54 | ||
55 | /** Contains the PathInfo and QueryData vectors */ |
|
56 | 2 | private List [] dataVectors = null; |
57 | ||
58 | /* |
|
59 | * ======================================================================== |
|
60 | * |
|
61 | * Constructors |
|
62 | * |
|
63 | * ======================================================================== |
|
64 | * |
|
65 | */ |
|
66 | ||
67 | /** |
|
68 | * Empty C'tor. Uses Turbine.getDefaultServerData(). |
|
69 | */ |
|
70 | public TurbineURI() |
|
71 | { |
|
72 | 0 | super(); |
73 | 0 | init(); |
74 | 0 | } |
75 | ||
76 | /** |
|
77 | * Constructor with a RunData object. |
|
78 | * |
|
79 | * @param runData A RunData object |
|
80 | */ |
|
81 | public TurbineURI(RunData runData) |
|
82 | { |
|
83 | 0 | super(runData); |
84 | 0 | init(); |
85 | 0 | } |
86 | ||
87 | /** |
|
88 | * Constructor, set explicit redirection. |
|
89 | * |
|
90 | * @param runData A RunData object |
|
91 | * @param redirect True if redirection allowed. |
|
92 | */ |
|
93 | public TurbineURI(RunData runData, boolean redirect) |
|
94 | { |
|
95 | 0 | super(runData, redirect); |
96 | 0 | init(); |
97 | 0 | } |
98 | ||
99 | /** |
|
100 | * Constructor, set Screen. |
|
101 | * |
|
102 | * @param runData A RunData object |
|
103 | * @param screen A Screen Name |
|
104 | */ |
|
105 | public TurbineURI(RunData runData, String screen) |
|
106 | { |
|
107 | 0 | this(runData); |
108 | 0 | setScreen(screen); |
109 | 0 | } |
110 | ||
111 | /** |
|
112 | * Constructor, set Screen, set explicit redirection. |
|
113 | * |
|
114 | * @param runData A RunData object |
|
115 | * @param screen A Screen Name |
|
116 | * @param redirect True if redirection allowed. |
|
117 | */ |
|
118 | public TurbineURI(RunData runData, String screen, boolean redirect) |
|
119 | { |
|
120 | 0 | this(runData, redirect); |
121 | 0 | setScreen(screen); |
122 | 0 | } |
123 | ||
124 | /** |
|
125 | * Constructor, set Screen and Action. |
|
126 | * |
|
127 | * @param runData A RunData object |
|
128 | * @param screen A Screen Name |
|
129 | * @param action An Action Name |
|
130 | */ |
|
131 | public TurbineURI(RunData runData, String screen, String action) |
|
132 | { |
|
133 | 0 | this(runData, screen); |
134 | 0 | setAction(action); |
135 | 0 | } |
136 | ||
137 | /** |
|
138 | * Constructor, set Screen and Action, set explicit redirection. |
|
139 | * |
|
140 | * @param runData A RunData object |
|
141 | * @param screen A Screen Name |
|
142 | * @param action An Action Name |
|
143 | * @param redirect True if redirection allowed. |
|
144 | */ |
|
145 | public TurbineURI(RunData runData, String screen, String action, boolean redirect) |
|
146 | { |
|
147 | 0 | this(runData, screen, redirect); |
148 | 0 | setAction(action); |
149 | 0 | } |
150 | ||
151 | /** |
|
152 | * Constructor with a ServerData object. |
|
153 | * |
|
154 | * @param serverData A ServerData object |
|
155 | */ |
|
156 | public TurbineURI(ServerData serverData) |
|
157 | { |
|
158 | 2 | super(serverData); |
159 | 2 | init(); |
160 | 2 | } |
161 | ||
162 | /** |
|
163 | * Constructor, set explicit redirection. |
|
164 | * |
|
165 | * @param serverData A ServerData object |
|
166 | * @param redirect True if redirection allowed. |
|
167 | */ |
|
168 | public TurbineURI(ServerData serverData, boolean redirect) |
|
169 | { |
|
170 | 0 | super(serverData, redirect); |
171 | 0 | init(); |
172 | 0 | } |
173 | ||
174 | /** |
|
175 | * Constructor, set Screen. |
|
176 | * |
|
177 | * @param serverData A ServerData object |
|
178 | * @param screen A Screen Name |
|
179 | */ |
|
180 | public TurbineURI(ServerData serverData, String screen) |
|
181 | { |
|
182 | 0 | this(serverData); |
183 | 0 | setScreen(screen); |
184 | 0 | } |
185 | ||
186 | /** |
|
187 | * Constructor, set Screen, set explicit redirection. |
|
188 | * |
|
189 | * @param serverData A ServerData object |
|
190 | * @param screen A Screen Name |
|
191 | * @param redirect True if redirection allowed. |
|
192 | */ |
|
193 | public TurbineURI(ServerData serverData, String screen, boolean redirect) |
|
194 | { |
|
195 | 0 | this(serverData, redirect); |
196 | 0 | setScreen(screen); |
197 | 0 | } |
198 | ||
199 | /** |
|
200 | * Constructor, set Screen and Action. |
|
201 | * |
|
202 | * @param serverData A ServerData object |
|
203 | * @param screen A Screen Name |
|
204 | * @param action An Action Name |
|
205 | */ |
|
206 | public TurbineURI(ServerData serverData, String screen, String action) |
|
207 | { |
|
208 | 0 | this(serverData, screen); |
209 | 0 | setAction(action); |
210 | 0 | } |
211 | ||
212 | /** |
|
213 | * Constructor, set Screen and Action, set explicit redirection. |
|
214 | * |
|
215 | * @param serverData A ServerData object |
|
216 | * @param screen A Screen Name |
|
217 | * @param action An Action Name |
|
218 | * @param redirect True if redirection allowed. |
|
219 | */ |
|
220 | public TurbineURI(ServerData serverData, String screen, String action, |
|
221 | boolean redirect) |
|
222 | { |
|
223 | 0 | this(serverData, screen, redirect); |
224 | 0 | setAction(action); |
225 | 0 | } |
226 | ||
227 | /** |
|
228 | * Constructor, user Turbine.getDefaultServerData(), set Screen and Action. |
|
229 | * |
|
230 | * @param screen A Screen Name |
|
231 | * @param action An Action Name |
|
232 | */ |
|
233 | public TurbineURI(String screen, String action) |
|
234 | { |
|
235 | 0 | this(); |
236 | 0 | setScreen(screen); |
237 | 0 | setAction(action); |
238 | 0 | } |
239 | ||
240 | /* |
|
241 | * ======================================================================== |
|
242 | * |
|
243 | * Init |
|
244 | * |
|
245 | * ======================================================================== |
|
246 | * |
|
247 | */ |
|
248 | ||
249 | /** |
|
250 | * Init the TurbineURI. |
|
251 | */ |
|
252 | private void init() |
|
253 | { |
|
254 | 2 | dataVectors = new List[2]; |
255 | 2 | dataVectors[PATH_INFO] = new ArrayList(); |
256 | 2 | dataVectors[QUERY_DATA] = new ArrayList(); |
257 | 2 | } |
258 | ||
259 | /** |
|
260 | * Sets the action= value for this URL. |
|
261 | * |
|
262 | * By default it adds the information to the path_info instead |
|
263 | * of the query data. An empty value (null or "") cleans out |
|
264 | * an existing value. |
|
265 | * |
|
266 | * @param action A String with the action value. |
|
267 | */ |
|
268 | public void setAction(String action) |
|
269 | { |
|
270 | 0 | if(StringUtils.isNotEmpty(action)) |
271 | { |
|
272 | 0 | add(PATH_INFO, CGI_ACTION_PARAM, action); |
273 | } |
|
274 | else |
|
275 | { |
|
276 | 0 | clearAction(); |
277 | } |
|
278 | 0 | } |
279 | ||
280 | /** |
|
281 | * Sets the fired eventSubmit= value for this URL. |
|
282 | * |
|
283 | * @param event The event to fire. |
|
284 | * |
|
285 | */ |
|
286 | public void setEvent(String event) |
|
287 | { |
|
288 | 0 | add(PATH_INFO, EVENT_PREFIX + event, event); |
289 | 0 | } |
290 | ||
291 | /** |
|
292 | * Sets the action= and eventSubmit= values for this URL. |
|
293 | * |
|
294 | * By default it adds the information to the path_info instead |
|
295 | * of the query data. An empty value (null or "") for the action cleans out |
|
296 | * an existing value. An empty value (null or "") for the event has no |
|
297 | * effect. |
|
298 | * |
|
299 | * @param action A String with the action value. |
|
300 | * @param event A string with the event name. |
|
301 | */ |
|
302 | public void setActionEvent(String action, String event) |
|
303 | { |
|
304 | 0 | setAction(action); |
305 | 0 | if(StringUtils.isNotEmpty(event)) |
306 | { |
|
307 | 0 | setEvent(event); |
308 | } |
|
309 | 0 | } |
310 | ||
311 | /** |
|
312 | * Clears the action= value for this URL. |
|
313 | */ |
|
314 | public void clearAction() |
|
315 | { |
|
316 | 0 | removePathInfo(CGI_ACTION_PARAM); |
317 | 0 | } |
318 | ||
319 | /** |
|
320 | * Sets the screen= value for this URL. |
|
321 | * |
|
322 | * By default it adds the information to the path_info instead |
|
323 | * of the query data. An empty value (null or "") cleans out |
|
324 | * an existing value. |
|
325 | * |
|
326 | * @param screen A String with the screen value. |
|
327 | */ |
|
328 | public void setScreen(String screen) |
|
329 | { |
|
330 | 0 | if(StringUtils.isNotEmpty(screen)) |
331 | { |
|
332 | 0 | add(PATH_INFO, CGI_SCREEN_PARAM, screen); |
333 | } |
|
334 | else |
|
335 | { |
|
336 | 0 | clearScreen(); |
337 | } |
|
338 | 0 | } |
339 | ||
340 | /** |
|
341 | * Clears the screen= value for this URL. |
|
342 | */ |
|
343 | public void clearScreen() |
|
344 | { |
|
345 | 0 | removePathInfo(CGI_SCREEN_PARAM); |
346 | 0 | } |
347 | ||
348 | /* |
|
349 | * ======================================================================== |
|
350 | * |
|
351 | * Adding and removing Data from the Path Info and Query Data |
|
352 | * |
|
353 | * ======================================================================== |
|
354 | */ |
|
355 | ||
356 | ||
357 | /** |
|
358 | * Adds a name=value pair for every entry in a ParameterParser |
|
359 | * object to the path_info string. |
|
360 | * |
|
361 | * @param pp A ParameterParser. |
|
362 | */ |
|
363 | public void addPathInfo(ParameterParser pp) |
|
364 | { |
|
365 | 0 | add(PATH_INFO, pp); |
366 | 0 | } |
367 | ||
368 | /** |
|
369 | * Adds an existing List of URIParam objects to |
|
370 | * the path_info string. |
|
371 | * |
|
372 | * @param list A list with URIParam objects. |
|
373 | */ |
|
374 | public void addPathInfo(List list) |
|
375 | { |
|
376 | 0 | add(PATH_INFO, list); |
377 | 0 | } |
378 | ||
379 | /** |
|
380 | * Adds a name=value pair to the path_info string. |
|
381 | * |
|
382 | * @param name A String with the name to add. |
|
383 | * @param value An Object with the value to add. |
|
384 | */ |
|
385 | public void addPathInfo(String name, Object value) |
|
386 | { |
|
387 | 0 | add(PATH_INFO, name, value.toString()); |
388 | 0 | } |
389 | ||
390 | /** |
|
391 | * Adds a name=value pair to the path_info string. |
|
392 | * |
|
393 | * @param name A String with the name to add. |
|
394 | * @param value A String with the value to add. |
|
395 | */ |
|
396 | public void addPathInfo(String name, String value) |
|
397 | { |
|
398 | 2 | add(PATH_INFO, name, value); |
399 | 2 | } |
400 | ||
401 | /** |
|
402 | * Adds a name=value pair to the path_info string. |
|
403 | * |
|
404 | * @param name A String with the name to add. |
|
405 | * @param value A double with the value to add. |
|
406 | */ |
|
407 | public void addPathInfo(String name, double value) |
|
408 | { |
|
409 | 0 | add(PATH_INFO, name, Double.toString(value)); |
410 | 0 | } |
411 | ||
412 | /** |
|
413 | * Adds a name=value pair to the path_info string. |
|
414 | * |
|
415 | * @param name A String with the name to add. |
|
416 | * @param value An int with the value to add. |
|
417 | */ |
|
418 | public void addPathInfo(String name, int value) |
|
419 | { |
|
420 | 0 | add(PATH_INFO, name, Integer.toString(value)); |
421 | 0 | } |
422 | ||
423 | /** |
|
424 | * Adds a name=value pair to the path_info string. |
|
425 | * |
|
426 | * @param name A String with the name to add. |
|
427 | * @param value A long with the value to add. |
|
428 | */ |
|
429 | public void addPathInfo(String name, long value) |
|
430 | { |
|
431 | 0 | add(PATH_INFO, name, Long.toString(value)); |
432 | 0 | } |
433 | ||
434 | /** |
|
435 | * Adds a name=value pair to the query string. |
|
436 | * |
|
437 | * @param name A String with the name to add. |
|
438 | * @param value An Object with the value to add. |
|
439 | */ |
|
440 | public void addQueryData(String name, Object value) |
|
441 | { |
|
442 | 0 | add(QUERY_DATA, name, value.toString()); |
443 | 0 | } |
444 | ||
445 | /** |
|
446 | * Adds a name=value pair to the query string. |
|
447 | * |
|
448 | * @param name A String with the name to add. |
|
449 | * @param value A String with the value to add. |
|
450 | */ |
|
451 | public void addQueryData(String name, String value) |
|
452 | { |
|
453 | 2 | add(QUERY_DATA, name, value); |
454 | 2 | } |
455 | ||
456 | /** |
|
457 | * Adds a name=value pair to the query string. |
|
458 | * |
|
459 | * @param name A String with the name to add. |
|
460 | * @param value A double with the value to add. |
|
461 | */ |
|
462 | public void addQueryData(String name, double value) |
|
463 | { |
|
464 | 0 | add(QUERY_DATA, name, Double.toString(value)); |
465 | 0 | } |
466 | ||
467 | /** |
|
468 | * Adds a name=value pair to the query string. |
|
469 | * |
|
470 | * @param name A String with the name to add. |
|
471 | * @param value An int with the value to add. |
|
472 | */ |
|
473 | public void addQueryData(String name, int value) |
|
474 | { |
|
475 | 0 | add(QUERY_DATA, name, Integer.toString(value)); |
476 | 0 | } |
477 | ||
478 | /** |
|
479 | * Adds a name=value pair to the query string. |
|
480 | * |
|
481 | * @param name A String with the name to add. |
|
482 | * @param value A long with the value to add. |
|
483 | */ |
|
484 | public void addQueryData(String name, long value) |
|
485 | { |
|
486 | 0 | add(QUERY_DATA, name, Long.toString(value)); |
487 | 0 | } |
488 | ||
489 | /** |
|
490 | * Adds a name=value pair for every entry in a ParameterParser |
|
491 | * object to the query string. |
|
492 | * |
|
493 | * @param pp A ParameterParser. |
|
494 | */ |
|
495 | public void addQueryData(ParameterParser pp) |
|
496 | { |
|
497 | 0 | add(QUERY_DATA, pp); |
498 | 0 | } |
499 | ||
500 | /** |
|
501 | * Adds an existing List of URIParam objects to the query data. |
|
502 | * |
|
503 | * @param list A list with URIParam objects. |
|
504 | */ |
|
505 | public void addQueryData(List list) |
|
506 | { |
|
507 | 0 | add(QUERY_DATA, list); |
508 | 0 | } |
509 | ||
510 | /** |
|
511 | * Is Path Info data set in this URI? |
|
512 | * |
|
513 | * @return true if Path Info has values |
|
514 | */ |
|
515 | public boolean hasPathInfo() |
|
516 | { |
|
517 | 12 | return !dataVectors[PATH_INFO].isEmpty(); |
518 | } |
|
519 | ||
520 | /** |
|
521 | * Removes all the path info elements. |
|
522 | */ |
|
523 | public void removePathInfo() |
|
524 | { |
|
525 | 0 | dataVectors[PATH_INFO].clear(); |
526 | 0 | } |
527 | ||
528 | /** |
|
529 | * Removes a name=value pair from the path info. |
|
530 | * |
|
531 | * @param name A String with the name to be removed. |
|
532 | */ |
|
533 | public void removePathInfo(String name) |
|
534 | { |
|
535 | 2 | remove(PATH_INFO, name); |
536 | 2 | } |
537 | ||
538 | /** |
|
539 | * Is Query data set in this URI? |
|
540 | * |
|
541 | * @return true if Query data has values |
|
542 | */ |
|
543 | public boolean hasQueryData() |
|
544 | { |
|
545 | 12 | return !dataVectors[QUERY_DATA].isEmpty(); |
546 | } |
|
547 | ||
548 | /** |
|
549 | * Removes all the query string elements. |
|
550 | */ |
|
551 | public void removeQueryData() |
|
552 | { |
|
553 | 0 | dataVectors[QUERY_DATA].clear(); |
554 | 0 | } |
555 | ||
556 | /** |
|
557 | * Removes a name=value pair from the query string. |
|
558 | * |
|
559 | * @param name A String with the name to be removed. |
|
560 | */ |
|
561 | public void removeQueryData(String name) |
|
562 | { |
|
563 | 2 | remove (QUERY_DATA, name); |
564 | 2 | } |
565 | ||
566 | /** |
|
567 | * Template Link and friends want to be able to turn the encoding |
|
568 | * of the servlet container off. After calling this method, |
|
569 | * the no encoding will happen any longer. If you think, that you |
|
570 | * need this outside a template context, think again. |
|
571 | */ |
|
572 | public void clearResponse() |
|
573 | { |
|
574 | 0 | setResponse(null); |
575 | 0 | } |
576 | ||
577 | ||
578 | /** |
|
579 | * Builds the URL with all of the data URL-encoded as well as |
|
580 | * encoded using HttpServletResponse.encodeUrl(). The resulting |
|
581 | * URL is absolute; it starts with http/https... |
|
582 | * |
|
583 | * <p> |
|
584 | * <code><pre> |
|
585 | * TurbineURI tui = new TurbineURI (data, "UserScreen"); |
|
586 | * tui.addPathInfo("user","jon"); |
|
587 | * tui.getAbsoluteLink(); |
|
588 | * </pre></code> |
|
589 | * |
|
590 | * The above call to absoluteLink() would return the String: |
|
591 | * |
|
592 | * <p> |
|
593 | * http://www.server.com/servlets/Turbine/screen/UserScreen/user/jon |
|
594 | * |
|
595 | * @return A String with the built URL. |
|
596 | */ |
|
597 | public String getAbsoluteLink() |
|
598 | { |
|
599 | 0 | StringBuffer output = new StringBuffer(); |
600 | ||
601 | 0 | getSchemeAndPort(output); |
602 | ||
603 | 0 | buildRelativeLink(output); |
604 | ||
605 | // |
|
606 | // Encode Response does all the fixup for the Servlet Container |
|
607 | // |
|
608 | 0 | return encodeResponse(output.toString()); |
609 | } |
|
610 | ||
611 | /** |
|
612 | * Builds the URL with all of the data URL-encoded as well as |
|
613 | * encoded using HttpServletResponse.encodeUrl(). The resulting |
|
614 | * URL is relative to the webserver root. |
|
615 | * |
|
616 | * <p> |
|
617 | * <code><pre> |
|
618 | * TurbineURI tui = new TurbineURI (data, "UserScreen"); |
|
619 | * tui.addPathInfo("user","jon"); |
|
620 | * tui.getRelativeLink(); |
|
621 | * </pre></code> |
|
622 | * |
|
623 | * The above call to relativeLink() would return the String: |
|
624 | * |
|
625 | * <p> |
|
626 | * /servlets/Turbine/screen/UserScreen/user/jon |
|
627 | * |
|
628 | * @return A String with the built URL. |
|
629 | */ |
|
630 | public String getRelativeLink() |
|
631 | { |
|
632 | 0 | StringBuffer output = new StringBuffer(); |
633 | ||
634 | 0 | buildRelativeLink(output); |
635 | ||
636 | // |
|
637 | // Encode Response does all the fixup for the Servlet Container |
|
638 | // |
|
639 | 0 | return encodeResponse(output.toString()); |
640 | } |
|
641 | ||
642 | /** |
|
643 | * Add everything needed for a relative link to the passed StringBuffer. |
|
644 | * |
|
645 | * @param output A Stringbuffer |
|
646 | */ |
|
647 | private void buildRelativeLink(StringBuffer output) |
|
648 | { |
|
649 | 0 | getContextAndScript(output); |
650 | ||
651 | 0 | if (hasPathInfo()) |
652 | { |
|
653 | 0 | output.append('/'); |
654 | 0 | getPathInfoAsString(output); |
655 | } |
|
656 | ||
657 | 0 | if (hasReference()) |
658 | { |
|
659 | 0 | output.append('#'); |
660 | 0 | output.append(getReference()); |
661 | } |
|
662 | ||
663 | 0 | if (hasQueryData()) |
664 | { |
|
665 | 0 | output.append('?'); |
666 | 0 | getQueryDataAsString(output); |
667 | } |
|
668 | 0 | } |
669 | ||
670 | /** |
|
671 | * Gets the current Query Data List. |
|
672 | * |
|
673 | * @return A List which contains all query data keys. The keys |
|
674 | * are URIParam objects. |
|
675 | */ |
|
676 | public List getPathInfo() |
|
677 | { |
|
678 | 0 | return dataVectors[PATH_INFO]; |
679 | } |
|
680 | ||
681 | /** |
|
682 | * Sets the Query Data List. Replaces the current query data list |
|
683 | * with the one supplied. The list must contain only URIParam |
|
684 | * objects! |
|
685 | * |
|
686 | * @param pathInfo A List with new param objects. |
|
687 | */ |
|
688 | ||
689 | public void setPathInfo(List pathInfo) |
|
690 | { |
|
691 | 0 | dataVectors[PATH_INFO] = pathInfo; |
692 | 0 | } |
693 | ||
694 | /** |
|
695 | * Gets the current Query Data List. |
|
696 | * |
|
697 | * @return A List which contains all query data keys. The keys |
|
698 | * are URIParam objects. |
|
699 | */ |
|
700 | public List getQueryData() |
|
701 | { |
|
702 | 0 | return dataVectors[QUERY_DATA]; |
703 | } |
|
704 | ||
705 | /** |
|
706 | * Sets the Query Data List. Replaces the current query data list |
|
707 | * with the one supplied. The list must contain only URIParam |
|
708 | * objects! |
|
709 | * |
|
710 | * @param queryData A List with new param objects. |
|
711 | */ |
|
712 | ||
713 | public void setQueryData(List queryData) |
|
714 | { |
|
715 | 0 | dataVectors[QUERY_DATA] = queryData; |
716 | 0 | } |
717 | ||
718 | /** |
|
719 | * Simply calls getAbsoluteLink(). You should not use this in your |
|
720 | * code unless you have to. Use getAbsoluteLink. |
|
721 | * |
|
722 | * @return This URI as a String |
|
723 | * |
|
724 | */ |
|
725 | public String toString() |
|
726 | { |
|
727 | 0 | return getAbsoluteLink(); |
728 | } |
|
729 | ||
730 | /* |
|
731 | * ======================================================================== |
|
732 | * |
|
733 | * Protected / Private Methods |
|
734 | * |
|
735 | * ======================================================================== |
|
736 | * |
|
737 | */ |
|
738 | ||
739 | /** |
|
740 | * Returns the Path Info data as a String. |
|
741 | * |
|
742 | * @param output The StringBuffer that should hold the path info. |
|
743 | */ |
|
744 | private void getPathInfoAsString(StringBuffer output) |
|
745 | { |
|
746 | 0 | doEncode(output, dataVectors[PATH_INFO], '/', '/'); |
747 | 0 | } |
748 | ||
749 | /** |
|
750 | * Returns the Query data as a String. |
|
751 | * |
|
752 | * @param output The StringBuffer that should hold the query data. |
|
753 | */ |
|
754 | private void getQueryDataAsString(StringBuffer output) |
|
755 | { |
|
756 | 0 | doEncode(output, dataVectors[QUERY_DATA], '&', '='); |
757 | 0 | } |
758 | ||
759 | /** |
|
760 | * Does the actual encoding for pathInfoAsString and queryDataAsString. |
|
761 | * |
|
762 | * @param output The Stringbuffer that should contain the information. |
|
763 | * @param list A Collection |
|
764 | * @param fieldDelim A char which is used to separate key/value pairs |
|
765 | * @param valueDelim A char which is used to separate key and value |
|
766 | */ |
|
767 | private void doEncode(StringBuffer output, Collection list, char fieldDelim, class="keyword">char valueDelim) |
|
768 | { |
|
769 | 0 | if(!list.isEmpty()) |
770 | { |
|
771 | 0 | for(Iterator it = list.iterator(); it.hasNext();) |
772 | { |
|
773 | 0 | URIParam uriParam = (URIParam) it.next(); |
774 | 0 | String key = URLEncoder.encode(uriParam.getKey()); |
775 | 0 | String val = String.valueOf(uriParam.getValue()); |
776 | ||
777 | 0 | output.append(key); |
778 | 0 | output.append(valueDelim); |
779 | ||
780 | 0 | if(StringUtils.isEmpty(val)) |
781 | { |
|
782 | // Fixme? |
|
783 | 0 | log.debug("Found a null value for " + key); |
784 | 0 | output.append("null"); |
785 | } |
|
786 | else |
|
787 | { |
|
788 | 0 | output.append(URLEncoder.encode(val)); |
789 | } |
|
790 | ||
791 | 0 | if (it.hasNext()) |
792 | { |
|
793 | 0 | output.append(fieldDelim); |
794 | } |
|
795 | } |
|
796 | } |
|
797 | 0 | } |
798 | ||
799 | /** |
|
800 | * If the type is PATH_INFO, then add name/value to the pathInfo |
|
801 | * hashtable. |
|
802 | * <p> |
|
803 | * If the type is QUERY_DATA, then add name/value to the queryData |
|
804 | * hashtable. |
|
805 | * |
|
806 | * @param type Type (PATH_INFO or QUERY_DATA) of insertion. |
|
807 | * @param name A String with the name to add. |
|
808 | * @param value A String with the value to add. |
|
809 | */ |
|
810 | protected void add(int type, |
|
811 | String name, |
|
812 | String value) |
|
813 | { |
|
814 | 4 | URIParam uriParam = new URIParam(ParserUtils.convertAndTrim(name), value); |
815 | ||
816 | 4 | dataVectors[type].add(uriParam); // Code so clean you can eat from... |
817 | 4 | } |
818 | ||
819 | /** |
|
820 | * Method for a quick way to add all the parameters in a |
|
821 | * ParameterParser. |
|
822 | * |
|
823 | * <p>If the type is P (0), then add name/value to the pathInfo |
|
824 | * hashtable. |
|
825 | * |
|
826 | * <p>If the type is Q (1), then add name/value to the queryData |
|
827 | * hashtable. |
|
828 | * |
|
829 | * @param type Type of insertion (@see #add(char type, String name, String value)) |
|
830 | * @param pp A ParameterParser. |
|
831 | */ |
|
832 | protected void add(int type, |
|
833 | ParameterParser pp) |
|
834 | { |
|
835 | 0 | for(Iterator it = pp.keySet().iterator(); it.hasNext();) |
836 | { |
|
837 | 0 | String key = (String) it.next(); |
838 | ||
839 | 0 | if (!key.equalsIgnoreCase(CGI_ACTION_PARAM) && |
840 | !key.equalsIgnoreCase(CGI_SCREEN_PARAM)) |
|
841 | { |
|
842 | 0 | String[] values = pp.getStrings(key); |
843 | 0 | for (int i = 0; i < values.length; i++) |
844 | { |
|
845 | 0 | add(type, key, values[i]); |
846 | } |
|
847 | } |
|
848 | } |
|
849 | 0 | } |
850 | ||
851 | /** |
|
852 | * Method for a quick way to add all the parameters in a |
|
853 | * List with URIParam objects. |
|
854 | * |
|
855 | * <p>If the type is P (0), then add name/value to the pathInfo |
|
856 | * hashtable. |
|
857 | * |
|
858 | * <p>If the type is Q (1), then add name/value to the queryData |
|
859 | * hashtable. |
|
860 | * |
|
861 | * @param type Type of insertion (@see #add(char type, String name, String value)) |
|
862 | * @param list A List of URIParam objects |
|
863 | */ |
|
864 | protected void add(int type, |
|
865 | List list) |
|
866 | { |
|
867 | 0 | for (Iterator it = list.iterator(); it.hasNext();) |
868 | { |
|
869 | // Strictly spoken we don't need this cast. But if we do, |
|
870 | // we get class cast right here is someone tries to put |
|
871 | // a list with wrong objects into this method. |
|
872 | 0 | URIParam uriParam = (URIParam) it.next(); |
873 | 0 | dataVectors[type].add(uriParam); |
874 | } |
|
875 | 0 | } |
876 | ||
877 | /** |
|
878 | * If the type is P (0), then remove name/value from the |
|
879 | * pathInfo hashtable. |
|
880 | * |
|
881 | * <p>If the type is Q (1), then remove name/value from the |
|
882 | * queryData hashtable. |
|
883 | * |
|
884 | * @param type Type (P or Q) of removal. |
|
885 | * @param name A String with the name to be removed. |
|
886 | */ |
|
887 | protected void remove (int type, |
|
888 | String name) |
|
889 | { |
|
890 | 4 | Collection c = dataVectors[type]; |
891 | 4 | String key = ParserUtils.convertAndTrim(name); |
892 | ||
893 | 8 | for (Iterator it = c.iterator(); it.hasNext();) |
894 | { |
|
895 | 4 | URIParam uriParam = (URIParam) it.next(); |
896 | ||
897 | 4 | if (key.equals(uriParam.getKey())) |
898 | { |
|
899 | 4 | it.remove(); |
900 | } |
|
901 | } |
|
902 | 4 | } |
903 | } |
This report is generated by jcoverage, Maven and Maven JCoverage Plugin. |