##### Coverage Report - org.apache.turbine.services.pull.tools.TemplateLink

Classes in this File | Line Coverage | Branch Coverage | Complexity
TemplateLink |
18% | 15/81
25% | 2/8
| 1.1176470588235294;1,118

1 |  |
     package org.apache.turbine.services.pull.tools;
2 |  |
3 |  |
4 |  |
     /*
5 |  |
      * Licensed to the Apache Software Foundation (ASF) under one
6 |  |
      * or more contributor license agreements.  See the NOTICE file
7 |  |
      * distributed with this work for additional information
8 |  |
      * regarding copyright ownership.  The ASF licenses this file
9 |  |
      * to you under the Apache License, Version 2.0 (the
10 |  |
      * "License"); you may not use this file except in compliance
11 |  |
      * with the License.  You may obtain a copy of the License at
12 |  |
      *
13 |  |
      *   http://www.apache.org/licenses/LICENSE-2.0
14 |  |
      *
15 |  |
      * Unless required by applicable law or agreed to in writing,
16 |  |
      * software distributed under the License is distributed on an
17 |  |
      * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
18 |  |
      * KIND, either express or implied.  See the License for the
19 |  |
      * specific language governing permissions and limitations
20 |  |
      * under the License.
21 |  |
      */
22 |  |
23 |  |
24 |  |
     import org.apache.commons.configuration.Configuration;
25 |  |
     import org.apache.commons.logging.Log;
26 |  |
     import org.apache.commons.logging.LogFactory;
27 |  |
     import org.apache.fulcrum.parser.ParameterParser;
28 |  |
     import org.apache.turbine.Turbine;
29 |  |
     import org.apache.turbine.pipeline.PipelineData;
30 |  |
     import org.apache.turbine.services.pull.ApplicationTool;
31 |  |
     import org.apache.turbine.util.RunData;
32 |  |
     import org.apache.turbine.util.uri.TemplateURI;
33 |  |
34 |  |
     /**
35 |  |
      * This is a pull to to be used in Templates to convert links in
36 |  |
      * Templates into the correct references.
37 |  |
      *
38 |  |
      * The pull service might insert this tool into the Context.
39 |  |
      * in templates.  Here's an example of its Velocity use:
40 |  |
      *
41 |  |
      * <p><code>
42 |  |
      * $link.setPage("index.vm").addPathInfo("hello","world")
43 |  |
      * This would return: http://foo.com/Turbine/template/index.vm/hello/world
44 |  |
      * </code>
45 |  |
      *
46 |  |
      * <p>
47 |  |
      *
48 |  |
      * This is an application pull tool for the template system. You should <b>not</b>
49 |  |
      * use it in a normal application!
50 |  |
      *
51 |  |
      * @author <a href="mbryson@mont.mindspring.com">Dave Bryson</a>
52 |  |
      * @author <a href="mailto:jon@latchkey.com">Jon S. Stevens</a>
53 |  |
      * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
54 |  |
      * @author <a href="mailto:quintonm@bellsouth.net">Quinton McCombs</a>
55 |  |
      * @author <a href="mailto:peter@courcoux.biz">Peter Courcoux</a>
56 |  |
      * @version $Id: TemplateLink.java 1129102 2011-05-30 10:01:17Z tv $
57 |  |
      */
58 |  |
59 |  |
     public class TemplateLink
60 |  |
         implements ApplicationTool
61 |  |
     {
62 |  |
         /** Prefix for Parameters for this tool */
63 |  |
         public static final String TEMPLATE_LINK_PREFIX = "tool.link";
64 |  |
65 |  |
         /** Should this tool return relative URIs or absolute? Default: Absolute. */
66 |  |
         public static final String TEMPLATE_LINK_RELATIVE_KEY = "want.relative";
67 |  |
68 |  |
         /** Default Value for TEMPLATE_LINK_RELATIVE_KEY */
69 |  |
         public static final boolean TEMPLATE_LINK_RELATIVE_DEFAULT = false;
70 |  |
71 |  |
72 |  |
         /** Do we want a relative link? */
73 | 16 |
         protected boolean wantRelative = false;
74 |  |
75 |  |
         /** cache of the template name for getPage() */
76 | 16 |
         protected String template = null;
77 |  |
78 |  |
         /** TemplateURI used as backend for this object */
79 | 16 |
         protected TemplateURI templateURI = null;
80 |  |
81 |  |
         /** Logging */
82 | 28 |
         private static Log log = LogFactory.getLog(TemplateLink.class);
83 |  |
84 |  |
         /**
85 |  |
          * Default constructor
86 |  |
          * <p>
87 |  |
          * The init method must be called before use.
88 |  |
          */
89 |  |
         public TemplateLink()
90 | 16 |
         {
91 |  |
             // empty
92 | 16 |
         }
93 |  |
94 |  |
         /*
95 |  |
          * ========================================================================
96 |  |
          *
97 |  |
          * Application Tool Interface
98 |  |
          *
99 |  |
          * ========================================================================
100 |  |
          *
101 |  |
          */
102 |  |
103 |  |
         /**
104 |  |
          * This will initialise a TemplateLink object that was
105 |  |
          * constructed with the default constructor (ApplicationTool
106 |  |
          * method).
107 |  |
          *
108 |  |
          * @param data assumed to be a RunData object
109 |  |
          */
110 |  |
         public void init(Object data)
111 |  |
         {
112 |  |
             // we just blithely cast to RunData as if another object
113 |  |
             // or null is passed in we'll throw an appropriate runtime
114 |  |
             // exception.
115 | 16 |
             if (data instanceof PipelineData)
116 |  |
             {
117 | 16 |
                 PipelineData pipelineData = (PipelineData) data;
118 | 16 |
                 RunData runData = (RunData)pipelineData;
119 | 16 |
                 templateURI = new TemplateURI(runData);
120 | 16 |
             }
121 |  |
             else
122 |  |
             {
123 | 0 |
                 templateURI = new TemplateURI((RunData) data);
124 |  |
             }
125 |  |
126 | 16 |
             Configuration conf =
127 |  |
                     Turbine.getConfiguration().subset(TEMPLATE_LINK_PREFIX);
128 |  |
129 | 16 |
             if (conf != null)
130 |  |
             {
131 | 16 |
                 wantRelative = conf.getBoolean(TEMPLATE_LINK_RELATIVE_KEY,
132 |  |
                         TEMPLATE_LINK_RELATIVE_DEFAULT);
133 |  |
             }
134 |  |
135 | 16 |
         }
136 |  |
137 |  |
         /**
138 |  |
          * Refresh method - does nothing
139 |  |
          */
140 |  |
         public void refresh()
141 |  |
         {
142 |  |
             // empty
143 | 0 |
         }
144 |  |
145 |  |
         /*
146 |  |
          * ========================================================================
147 |  |
          *
148 |  |
          * getter/setter
149 |  |
          *
150 |  |
          * All setter return "this" so you can "chain" them together in the Context
151 |  |
          *
152 |  |
          * ========================================================================
153 |  |
          */
154 |  |
155 |  |
         /**
156 |  |
          * This will turn off the execution of res.encodeURL()
157 |  |
          * by making res == null. This is a hack for cases
158 |  |
          * where you don't want to see the session information
159 |  |
          *
160 |  |
          * @return A <code>TemplateLink</code> (self).
161 |  |
          */
162 |  |
         public TemplateLink setEncodeURLOff()
163 |  |
         {
164 | 0 |
             templateURI.clearResponse();
165 | 0 |
             return this;
166 |  |
         }
167 |  |
168 |  |
         /**
169 |  |
          * Sets the template variable used by the Template Service.
170 |  |
          *
171 |  |
          * @param template A String with the template name.
172 |  |
          * @return A TemplateLink.
173 |  |
          */
174 |  |
         public TemplateLink setPage(String template)
175 |  |
         {
176 | 0 |
             log.debug("setPage(" + template + ")");
177 | 0 |
             this.template = template;
178 | 0 |
             templateURI.setTemplate(template);
179 | 0 |
             return this;
180 |  |
         }
181 |  |
182 |  |
         /**
183 |  |
          * Gets the template variable used by the Template Service.
184 |  |
          * It is only available after setPage() has been called.
185 |  |
          *
186 |  |
          * @return The template name.
187 |  |
          */
188 |  |
         public String getPage()
189 |  |
         {
190 | 0 |
             return template;
191 |  |
         }
192 |  |
193 |  |
         /**
194 |  |
          * Sets the action= value for this URL.
195 |  |
          *
196 |  |
          * By default it adds the information to the path_info instead
197 |  |
          * of the query data.
198 |  |
          *
199 |  |
          * @param action A String with the action value.
200 |  |
          * @return A <code>TemplateLink</code> (self).
201 |  |
          */
202 |  |
         public TemplateLink setAction(String action)
203 |  |
         {
204 | 0 |
             log.debug("setAction(" + action + ")");
205 | 0 |
             templateURI.setAction(action);
206 | 0 |
             return this;
207 |  |
         }
208 |  |
209 |  |
         /**
210 |  |
          * Sets the action= and eventSubmit= values for this URL.
211 |  |
          *
212 |  |
          * By default it adds the information to the path_info instead
213 |  |
          * of the query data.
214 |  |
          *
215 |  |
          * @param action A String with the action value.
216 |  |
          * @param event A string with the event name.
217 |  |
          * @return A <code>TemplateLink</code> (self).
218 |  |
          */
219 |  |
         public TemplateLink setActionEvent(String action, String event)
220 |  |
         {
221 | 0 |
             log.debug("setActionEvent(" + action + ", "+ event +")");
222 | 0 |
             templateURI.setActionEvent(action, event);
223 | 0 |
             return this;
224 |  |
         }
225 |  |
226 |  |
         /**
227 |  |
          * Sets the screen= value for this URL.
228 |  |
          *
229 |  |
          * By default it adds the information to the path_info instead
230 |  |
          * of the query data.
231 |  |
          *
232 |  |
          * @param screen A String with the screen value.
233 |  |
          * @return A <code>TemplateLink</code> (self).
234 |  |
          */
235 |  |
         public TemplateLink setScreen(String screen)
236 |  |
         {
237 | 0 |
             log.debug("setScreen(" + screen + ")");
238 | 0 |
             templateURI.setScreen(screen);
239 | 0 |
             return this;
240 |  |
         }
241 |  |
242 |  |
         /**
243 |  |
          * Sets a reference anchor (#ref).
244 |  |
          *
245 |  |
          * @param reference A String containing the reference.
246 |  |
          * @return A <code>TemplateLink</code> (self).
247 |  |
          */
248 |  |
         public TemplateLink setReference(String reference)
249 |  |
         {
250 | 0 |
             templateURI.setReference(reference);
251 | 0 |
             return this;
252 |  |
         }
253 |  |
254 |  |
         /**
255 |  |
          * Returns the current reference anchor.
256 |  |
          *
257 |  |
          * @return A String containing the reference.
258 |  |
          */
259 |  |
         public String getReference()
260 |  |
         {
261 | 0 |
             return templateURI.getReference();
262 |  |
         }
263 |  |
264 |  |
         /*
265 |  |
          * ========================================================================
266 |  |
          *
267 |  |
          * Adding and removing Data from the Path Info and Query Data
268 |  |
          *
269 |  |
          * ========================================================================
270 |  |
          */
271 |  |
272 |  |
273 |  |
         /**
274 |  |
          * Adds a name=value pair for every entry in a ParameterParser
275 |  |
          * object to the path_info string.
276 |  |
          *
277 |  |
          * @param pp A ParameterParser.
278 |  |
          * @return A <code>TemplateLink</code> (self).
279 |  |
          */
280 |  |
         public TemplateLink addPathInfo(ParameterParser pp)
281 |  |
         {
282 | 0 |
             templateURI.addPathInfo(pp);
283 | 0 |
             return this;
284 |  |
         }
285 |  |
286 |  |
         /**
287 |  |
          * Adds a name=value pair to the path_info string.
288 |  |
          *
289 |  |
          * @param name A String with the name to add.
290 |  |
          * @param value An Object with the value to add.
291 |  |
          * @return A <code>TemplateLink</code> (self).
292 |  |
          */
293 |  |
         public TemplateLink addPathInfo(String name, Object value)
294 |  |
         {
295 | 0 |
             templateURI.addPathInfo(name, value);
296 | 0 |
             return this;
297 |  |
         }
298 |  |
299 |  |
         /**
300 |  |
          * Adds a name=value pair to the path_info string.
301 |  |
          *
302 |  |
          * @param name A String with the name to add.
303 |  |
          * @param value A String with the value to add.
304 |  |
          * @return A <code>TemplateLink</code> (self).
305 |  |
          */
306 |  |
         public TemplateLink addPathInfo(String name, String value)
307 |  |
         {
308 | 0 |
             templateURI.addPathInfo(name, value);
309 | 0 |
             return this;
310 |  |
         }
311 |  |
312 |  |
         /**
313 |  |
          * Adds a name=value pair to the path_info string.
314 |  |
          *
315 |  |
          * @param name A String with the name to add.
316 |  |
          * @param value A double with the value to add.
317 |  |
          * @return A <code>TemplateLink</code> (self).
318 |  |
          */
319 |  |
         public TemplateLink addPathInfo(String name, double value)
320 |  |
         {
321 | 0 |
             templateURI.addPathInfo(name, value);
322 | 0 |
             return this;
323 |  |
         }
324 |  |
325 |  |
         /**
326 |  |
          * Adds a name=value pair to the path_info string.
327 |  |
          *
328 |  |
          * @param name A String with the name to add.
329 |  |
          * @param value An int with the value to add.
330 |  |
          * @return A <code>TemplateLink</code> (self).
331 |  |
          */
332 |  |
         public TemplateLink addPathInfo(String name, int value)
333 |  |
         {
334 | 0 |
             templateURI.addPathInfo(name, value);
335 | 0 |
             return this;
336 |  |
         }
337 |  |
338 |  |
         /**
339 |  |
          * Adds a name=value pair to the path_info string.
340 |  |
          *
341 |  |
          * @param name A String with the name to add.
342 |  |
          * @param value A long with the value to add.
343 |  |
          * @return A <code>TemplateLink</code> (self).
344 |  |
          */
345 |  |
         public TemplateLink addPathInfo(String name, long value)
346 |  |
         {
347 | 0 |
             templateURI.addPathInfo(name, value);
348 | 0 |
             return this;
349 |  |
         }
350 |  |
351 |  |
         /**
352 |  |
          * Adds a name=value pair to the query string.
353 |  |
          *
354 |  |
          * @param name A String with the name to add.
355 |  |
          * @param value An Object with the value to add.
356 |  |
          * @return A <code>TemplateLink</code> (self).
357 |  |
          */
358 |  |
         public TemplateLink addQueryData(String name, Object value)
359 |  |
         {
360 | 0 |
             templateURI.addQueryData(name, value);
361 | 0 |
             return this;
362 |  |
         }
363 |  |
364 |  |
         /**
365 |  |
          * Adds a name=value pair to the query string.
366 |  |
          *
367 |  |
          * @param name A String with the name to add.
368 |  |
          * @param value A String with the value to add.
369 |  |
          * @return A <code>TemplateLink</code> (self).
370 |  |
          */
371 |  |
         public TemplateLink addQueryData(String name, String value)
372 |  |
         {
373 | 0 |
             templateURI.addQueryData(name, value);
374 | 0 |
             return this;
375 |  |
         }
376 |  |
377 |  |
         /**
378 |  |
          * Adds a name=value pair to the query string.
379 |  |
          *
380 |  |
          * @param name A String with the name to add.
381 |  |
          * @param value A double with the value to add.
382 |  |
          * @return A <code>TemplateLink</code> (self).
383 |  |
          */
384 |  |
         public TemplateLink addQueryData(String name, double value)
385 |  |
         {
386 | 0 |
             templateURI.addQueryData(name, value);
387 | 0 |
             return this;
388 |  |
         }
389 |  |
390 |  |
         /**
391 |  |
          * Adds a name=value pair to the query string.
392 |  |
          *
393 |  |
          * @param name A String with the name to add.
394 |  |
          * @param value An int with the value to add.
395 |  |
          * @return A <code>TemplateLink</code> (self).
396 |  |
          */
397 |  |
         public TemplateLink addQueryData(String name, int value)
398 |  |
         {
399 | 0 |
             templateURI.addQueryData(name, value);
400 | 0 |
             return this;
401 |  |
         }
402 |  |
403 |  |
         /**
404 |  |
          * Adds a name=value pair to the query string.
405 |  |
          *
406 |  |
          * @param name A String with the name to add.
407 |  |
          * @param value A long with the value to add.
408 |  |
          * @return A <code>TemplateLink</code> (self).
409 |  |
          */
410 |  |
         public TemplateLink addQueryData(String name, long value)
411 |  |
         {
412 | 0 |
             templateURI.addQueryData(name, value);
413 | 0 |
             return this;
414 |  |
         }
415 |  |
416 |  |
         /**
417 |  |
          * Adds a name=value pair for every entry in a ParameterParser
418 |  |
          * object to the query string.
419 |  |
          *
420 |  |
          * @param pp A ParameterParser.
421 |  |
          * @return A <code>TemplateLink</code> (self).
422 |  |
          */
423 |  |
         public TemplateLink addQueryData(ParameterParser pp)
424 |  |
         {
425 | 0 |
             templateURI.addQueryData(pp);
426 | 0 |
             return this;
427 |  |
         }
428 |  |
429 |  |
         /**
430 |  |
          * Removes all the path info elements.
431 |  |
          *
432 |  |
          * @return A <code>TemplateLink</code> (self).
433 |  |
          */
434 |  |
         public TemplateLink removePathInfo()
435 |  |
         {
436 | 0 |
             templateURI.removePathInfo();
437 | 0 |
             return this;
438 |  |
         }
439 |  |
440 |  |
         /**
441 |  |
          * Removes a name=value pair from the path info.
442 |  |
          *
443 |  |
          * @param name A String with the name to be removed.
444 |  |
          * @return A <code>TemplateLink</code> (self).
445 |  |
          */
446 |  |
         public TemplateLink removePathInfo(String name)
447 |  |
         {
448 | 0 |
             templateURI.removePathInfo(name);
449 | 0 |
             return this;
450 |  |
         }
451 |  |
452 |  |
         /**
453 |  |
          * Removes all the query string elements.
454 |  |
          *
455 |  |
          * @return A <code>TemplateLink</code> (self).
456 |  |
          */
457 |  |
         public TemplateLink removeQueryData()
458 |  |
         {
459 | 0 |
             templateURI.removeQueryData();
460 | 0 |
             return this;
461 |  |
         }
462 |  |
463 |  |
         /**
464 |  |
          * Removes a name=value pair from the query string.
465 |  |
          *
466 |  |
          * @param name A String with the name to be removed.
467 |  |
          * @return A <code>TemplateLink</code> (self).
468 |  |
          */
469 |  |
         public TemplateLink removeQueryData(String name)
470 |  |
         {
471 | 0 |
             templateURI.removeQueryData(name);
472 | 0 |
             return this;
473 |  |
         }
474 |  |
475 |  |
         /**
476 |  |
          * Builds the URL with all of the data URL-encoded as well as
477 |  |
          * encoded using HttpServletResponse.encodeUrl(). The resulting
478 |  |
          * URL is absolute; it starts with http/https...
479 |  |
          *
480 |  |
          * <p>
481 |  |
          * <code><pre>
482 |  |
          * TemplateURI tui = new TemplateURI (data, "UserScreen");
483 |  |
          * tui.addPathInfo("user","jon");
484 |  |
          * tui.getAbsoluteLink();
485 |  |
          * </pre></code>
486 |  |
          *
487 |  |
          *  The above call to absoluteLink() would return the String:
488 |  |
          *
489 |  |
          * <p>
490 |  |
          * http://www.server.com/servlets/Turbine/screen/UserScreen/user/jon
491 |  |
          *
492 |  |
          * <p>
493 |  |
          * After rendering the URI, it clears the
494 |  |
          * pathInfo and QueryString portions of the TemplateURI. So you can
495 |  |
          * use the $link reference multiple times on a page and start over
496 |  |
          * with a fresh object every time.
497 |  |
          *
498 |  |
          * @return A String with the built URL.
499 |  |
          */
500 |  |
         public String getAbsoluteLink()
501 |  |
         {
502 | 0 |
             String output = templateURI.getAbsoluteLink();
503 |  |
504 |  |
             // This was added to use $link multiple times on a page and start
505 |  |
             // over with a fresh set of data every time.
506 | 0 |
             templateURI.removePathInfo();
507 | 0 |
             templateURI.removeQueryData();
508 |  |
509 | 0 |
             return output;
510 |  |
         }
511 |  |
512 |  |
513 |  |
         /**
514 |  |
          * Builds the URL with all of the data URL-encoded as well as
515 |  |
          * encoded using HttpServletResponse.encodeUrl(). The resulting
516 |  |
          * URL is relative to the webserver root.
517 |  |
          *
518 |  |
          * <p>
519 |  |
          * <code><pre>
520 |  |
          * TemplateURI tui = new TemplateURI (data, "UserScreen");
521 |  |
          * tui.addPathInfo("user","jon");
522 |  |
          * tui.getRelativeLink();
523 |  |
          * </pre></code>
524 |  |
          *
525 |  |
          *  The above call to absoluteLink() would return the String:
526 |  |
          *
527 |  |
          * <p>
528 |  |
          * /servlets/Turbine/screen/UserScreen/user/jon
529 |  |
          *
530 |  |
          * <p>
531 |  |
          * After rendering the URI, it clears the
532 |  |
          * pathInfo and QueryString portions of the TemplateURI. So you can
533 |  |
          * use the $link reference multiple times on a page and start over
534 |  |
          * with a fresh object every time.
535 |  |
          *
536 |  |
          * @return A String with the built URL.
537 |  |
          */
538 |  |
         public String getRelativeLink()
539 |  |
         {
540 | 0 |
             String output = templateURI.getRelativeLink();
541 |  |
542 |  |
             // This was added to use $link multiple times on a page and start
543 |  |
             // over with a fresh set of data every time.
544 | 0 |
             templateURI.removePathInfo();
545 | 0 |
             templateURI.removeQueryData();
546 |  |
547 | 0 |
             return output;
548 |  |
         }
549 |  |
550 |  |
         /**
551 |  |
          * Returns the URI. After rendering the URI, it clears the
552 |  |
          * pathInfo and QueryString portions of the TemplateURI.
553 |  |
          *
554 |  |
          * @return A String with the URI in the form
555 |  |
          * http://foo.com/Turbine/template/index.wm/hello/world
556 |  |
          */
557 |  |
         public String getLink()
558 |  |
         {
559 | 0 |
             return wantRelative ?
560 |  |
                     getRelativeLink() : getAbsoluteLink();
561 |  |
         }
562 |  |
563 |  |
         /**
564 |  |
          * Returns the relative URI leaving the source intact. Use this
565 |  |
          * if you need the path_info and query data multiple times.
566 |  |
          * This is equivalent to $link.Link or just $link,
567 |  |
          * but does not reset the path_info and query data.
568 |  |
          *
569 |  |
          * @return A String with the URI in the form
570 |  |
          * http://foo.com/Turbine/template/index.wm/hello/world
571 |  |
          */
572 |  |
         public String getURI()
573 |  |
         {
574 | 0 |
             return wantRelative ?
575 |  |
                     templateURI.getRelativeLink() : templateURI.getAbsoluteLink();
576 |  |
         }
577 |  |
578 |  |
         /**
579 |  |
          * Returns the absolute URI leaving the source intact. Use this
580 |  |
          * if you need the path_info and query data multiple times.
581 |  |
          * This is equivalent to $link.AbsoluteLink but does not reset
582 |  |
          * the path_info and query data.
583 |  |
          *
584 |  |
          * @return A String with the URI in the form
585 |  |
          * http://foo.com/Turbine/template/index.wm/hello/world
586 |  |
          */
587 |  |
         public String getAbsoluteURI()
588 |  |
         {
589 | 0 |
             return templateURI.getAbsoluteLink();
590 |  |
         }
591 |  |
592 |  |
         /**
593 |  |
          * Returns the relative URI leaving the source intact. Use this
594 |  |
          * if you need the path_info and query data multiple times.
595 |  |
          * This is equivalent to $link.RelativeLink but does not reset
596 |  |
          * the path_info and query data.
597 |  |
          *
598 |  |
          * @return A String with the URI in the form
599 |  |
          * http://foo.com/Turbine/template/index.wm/hello/world
600 |  |
          */
601 |  |
         public String getRelativeURI()
602 |  |
         {
603 | 0 |
             return templateURI.getRelativeLink();
604 |  |
         }
605 |  |
606 |  |
         /**
607 |  |
          * Same as getLink().
608 |  |
          *
609 |  |
          * @return A String with the URI represented by this object.
610 |  |
          *
611 |  |
          */
612 |  |
         @Override
613 |  |
         public String toString()
614 |  |
         {
615 | 0 |
             return getLink();
616 |  |
         }
617 |  |
     }