View Javadoc
1   /*
2    * #%L
3    * JRst :: Api
4    * %%
5    * Copyright (C) 2004 - 2010 CodeLutin
6    * %%
7    * This program is free software: you can redistribute it and/or modify
8    * it under the terms of the GNU Lesser General Public License as 
9    * published by the Free Software Foundation, either version 3 of the 
10   * License, or (at your option) any later version.
11   * 
12   * This program is distributed in the hope that it will be useful,
13   * but WITHOUT ANY WARRANTY; without even the implied warranty of
14   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   * GNU General Lesser Public License for more details.
16   * 
17   * You should have received a copy of the GNU General Lesser Public 
18   * License along with this program.  If not, see
19   * <http://www.gnu.org/licenses/lgpl-3.0.html>.
20   * #L%
21   */
22  package org.nuiton.jrst.convertisor;
23  
24  import java.util.ArrayList;
25  import java.util.List;
26  import org.apache.commons.logging.Log;
27  import org.apache.commons.logging.LogFactory;
28  import org.dom4j.Element;
29  import org.dom4j.VisitorSupport;
30  import org.nuiton.jrst.legacy.ReStructuredText;
31  
32  /**
33   *
34   * @author letellier
35   */
36  public abstract class DocUtilsVisitor extends VisitorSupport {
37  
38      public static final String EMPTY_STRING = "";
39      public static final String LINE_SEPARATOR = "\n";
40      public static final String SPACE = " ";
41      /** to use log facility, just put in your code: log.info(\"...\"); */
42      private static Log log = LogFactory.getLog(DocUtilsVisitor.class);
43      // Enregistre les elements parse pour ne jamais les revisiter
44      protected List<Element> cachedElements;
45      // le resultat de la visite
46      protected StringBuilder rstResult;
47  
48      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
49      // Root Element
50      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
51      public abstract String composeDocument(Element e);
52  
53      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
54      // Title Elements
55      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
56      public abstract String composeTitle(Element e);
57  
58      public abstract String composeSubTitle(Element e);
59  
60      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
61      // Bibliographic Elements
62      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
63      public abstract String composeDocInfo(Element e);
64  
65      // public abstract String compose
66      public abstract String composeAutor(Element e);
67  
68      public abstract String composeAutors(Element e);
69  
70      public abstract String composeOrganisation(Element e);
71  
72      public abstract String composeAddress(Element e);
73  
74      public abstract String composeContact(Element e);
75  
76      public abstract String composeVersion(Element e);
77  
78      public abstract String composeResvision(Element e);
79  
80      public abstract String composeStatus(Element e);
81  
82      public abstract String composeDate(Element e);
83  
84      public abstract String composeCopyright(Element e);
85  
86      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
87      // Decoration Elements
88      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
89      public abstract String composeDecoration(Element e);
90  
91      public abstract String composeHeader(Element e);
92  
93      public abstract String composeFooter(Element e);
94  
95      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
96      // Structural Elements
97      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
98      public abstract String composeSection(Element e);
99  
100     public abstract String composeTopic(Element e);
101 
102     public abstract String composeSideBar(Element e);
103 
104     public abstract String composeTransition(Element e);
105 
106     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
107     // Body Elements
108     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
109     public abstract String composeParagraph(Element e);
110 
111     public abstract String composeCompound(Element e);
112 
113     public abstract String composeContainer(Element e);
114 
115     public abstract String composeBulletList(Element e);
116 
117     public abstract String composeEnumeratedList(Element e);
118 
119     public abstract String composeListItem(Element e);
120 
121     public abstract String composeDefinitionList(Element e);
122 
123     public abstract String composeDefinitionListItem(Element e);
124 
125     public abstract String composeTerm(Element e);
126 
127     public abstract String composeClassifier(Element e);
128 
129     public abstract String composeDefinition(Element e);
130 
131     public abstract String composeFieldList(Element e);
132 
133     public abstract String composeField(Element e);
134 
135     public abstract String composeFieldName(Element e);
136 
137     public abstract String composeFieldBody(Element e);
138 
139     public abstract String composeOptionList(Element e);
140 
141     public abstract String composeOptionListItem(Element e);
142 
143     public abstract String composeOptionGroup(Element e);
144 
145     public abstract String composeOption(Element e);
146 
147     public abstract String composeOptionString(Element e);
148 
149     public abstract String composeOptionArgument(Element e);
150 
151     public abstract String composeDescription(Element e);
152 
153     public abstract String composeLiteralBlock(Element e);
154 
155     public abstract String composeLineBlock(Element e);
156 
157     public abstract String composeLine(Element e);
158 
159     public abstract String composeBlockQuote(Element e);
160 
161     public abstract String composeAttribution(Element e);
162 
163     public abstract String composeDocTestBlock(Element e);
164 
165     public abstract String composeAttention(Element e);
166 
167     public abstract String composeCaution(Element e);
168 
169     public abstract String composeDanger(Element e);
170 
171     public abstract String composeError(Element e);
172 
173     public abstract String composeHint(Element e);
174 
175     public abstract String composeImportant(Element e);
176 
177     public abstract String composeNote(Element e);
178 
179     public abstract String composeTip(Element e);
180 
181     public abstract String composeWarning(Element e);
182 
183     public abstract String composeAdmonition(Element e);
184 
185     public abstract String composeFootnote(Element e);
186 
187     public abstract String composeCitation(Element e);
188 
189     public abstract String composeLabel(Element e);
190 
191     public abstract String composeRubric(Element e);
192 
193     public abstract String composeTarget(Element e);
194 
195     public abstract String composeSubstitutionDefinition(Element e);
196 
197     public abstract String composeComment(Element e);
198 
199     public abstract String composePending(Element e);
200 
201     public abstract String composeFigure(Element e);
202 
203     public abstract String composeImage(Element e);
204 
205     public abstract String composeCaption(Element e);
206 
207     public abstract String composeLegend(Element e);
208 
209     public abstract String composeSystemMessage(Element e);
210 
211     public abstract String composeRaw(Element e);
212 
213     // table
214     public abstract String composeTable(Element e);
215 
216     public abstract String composeTgroup(Element e);
217 
218     public abstract String composeColspec(Element e);
219 
220     public abstract String composeThead(Element e);
221 
222     public abstract String composeTbody(Element e);
223 
224     public abstract String composeRow(Element e);
225 
226     public abstract String composeEntry(Element e);
227 
228     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
229     // Inline Elements
230     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
231     public abstract String composeEmphasis(Element e);
232 
233     public abstract String composeStrong(Element e);
234 
235     public abstract String composeLiteral(Element e);
236 
237     public abstract String composeReference(Element e);
238 
239     public abstract String composeFootnoteReference(Element e);
240 
241     public abstract String composeCitationReference(Element e);
242 
243     public abstract String composeSubstitutionReference(Element e);
244 
245     public abstract String composeTitleReference(Element e);
246 
247     public abstract String composeAbbreviation(Element e);
248 
249     public abstract String composeAcronyme(Element e);
250 
251     public abstract String composeSuperscipt(Element e);
252 
253     public abstract String composeSubscript(Element e);
254 
255     public abstract String composeInline(Element e);
256 
257     public abstract String composeProblematic(Element e);
258 
259     public abstract String composeGenerated(Element e);
260 
261     public DocUtilsVisitor() {
262         cachedElements = new ArrayList<Element>();
263         rstResult = new StringBuilder();
264     }
265 
266     @Override
267     public void visit(Element e) {
268 
269         if (!cachedElements.contains(e)) {
270             log.debug("entre element " + e.getName());
271             addCachedElement(e);
272 
273             // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
274             // Root Element
275             // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
276             if (elementEquals(ReStructuredText.DOCUMENT, e)) {
277                 appendResult(composeDocument(e));
278             } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
279             // Title Elements
280             // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
281             else if (elementEquals(ReStructuredText.TITLE, e)) {
282                 appendResult(composeTitle(e));
283             } else if (elementEquals(ReStructuredText.SUBTITLE, e)) {
284                 appendResult(composeSubTitle(e));
285             } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
286             // Bibliographic Elements
287             // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
288             else if (elementEquals(ReStructuredText.DOCINFO, e)) {
289                 appendResult(composeDocInfo(e));
290 
291                 // } else if (elementEquals(ReStructuredText.INFO,e)) { appendResult(composeInfo(e));
292             } else if (elementEquals(ReStructuredText.AUTHOR, e)) {
293                 appendResult(composeAutor(e));
294             } else if (elementEquals(ReStructuredText.AUTHORS, e)) {
295                 appendResult(composeAutors(e));
296             } else if (elementEquals(ReStructuredText.ORGANIZATION, e)) {
297                 appendResult(composeOrganisation(e));
298             } else if (elementEquals(ReStructuredText.ADDRESS, e)) {
299                 appendResult(composeAddress(e));
300             } else if (elementEquals(ReStructuredText.CONTACT, e)) {
301                 appendResult(composeContact(e));
302             } else if (elementEquals(ReStructuredText.VERSION, e)) {
303                 appendResult(composeVersion(e));
304             } else if (elementEquals(ReStructuredText.REVISION, e)) {
305                 appendResult(composeResvision(e));
306             } else if (elementEquals(ReStructuredText.STATUS, e)) {
307                 appendResult(composeStatus(e));
308             } else if (elementEquals(ReStructuredText.DATE, e)) {
309                 appendResult(composeDate(e));
310             } else if (elementEquals(ReStructuredText.COPYRIGHT, e)) {
311                 appendResult(composeCopyright(e));
312             } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
313             // Decoration Elements
314             // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
315             else if (elementEquals(ReStructuredText.DECORATION, e)) {
316                 appendResult(composeDecoration(e));
317             } else if (elementEquals(ReStructuredText.HEADER, e)) {
318                 appendResult(composeHeader(e));
319             } else if (elementEquals(ReStructuredText.FOOTER, e)) {
320                 appendResult(composeFooter(e));
321             } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
322             // Structural Elements
323             // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
324             else if (elementEquals(ReStructuredText.SECTION, e)) {
325                 appendResult(composeSection(e));
326             } else if (elementEquals(ReStructuredText.TOPIC, e)) {
327                 appendResult(composeTopic(e));
328             } else if (elementEquals(ReStructuredText.SIDEBAR, e)) {
329                 appendResult(composeSideBar(e));
330             } else if (elementEquals(ReStructuredText.TRANSITION, e)) {
331                 appendResult(composeTransition(e));
332             } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
333             // Body Elements
334             // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
335             else if (elementEquals(ReStructuredText.PARAGRAPH, e)) {
336                 appendResult(composeParagraph(e));
337             } else if (elementEquals(ReStructuredText.COMPOUND, e)) {
338                 appendResult(composeCompound(e));
339             } else if (elementEquals(ReStructuredText.CONTAINER, e)) {
340                 appendResult(composeContainer(e));
341             } else if (elementEquals(ReStructuredText.BULLET_LIST, e)) {
342                 appendResult(composeBulletList(e));
343             } else if (elementEquals(ReStructuredText.ENUMERATED_LIST, e)) {
344                 appendResult(composeEnumeratedList(e));
345             } else if (elementEquals(ReStructuredText.LIST_ITEM, e)) {
346                 appendResult(composeListItem(e));
347             } else if (elementEquals(ReStructuredText.DEFINITION_LIST, e)) {
348                 appendResult(composeDefinitionList(e));
349             } else if (elementEquals(ReStructuredText.DEFINITION_LIST_ITEM, e)) {
350                 appendResult(composeDefinitionListItem(e));
351             } else if (elementEquals(ReStructuredText.TERM, e)) {
352                 appendResult(composeTerm(e));
353             } else if (elementEquals(ReStructuredText.CLASSIFIER, e)) {
354                 appendResult(composeClassifier(e));
355             } else if (elementEquals(ReStructuredText.DEFINITION, e)) {
356                 appendResult(composeDefinition(e));
357             } else if (elementEquals(ReStructuredText.FIELD_LIST, e)) {
358                 appendResult(composeFieldList(e));
359             } else if (elementEquals(ReStructuredText.FIELD, e)) {
360                 appendResult(composeField(e));
361             } else if (elementEquals(ReStructuredText.FIELD_NAME, e)) {
362                 appendResult(composeFieldName(e));
363             } else if (elementEquals(ReStructuredText.FIELD_BODY, e)) {
364                 appendResult(composeFieldBody(e));
365             } else if (elementEquals(ReStructuredText.OPTION_LIST, e)) {
366                 appendResult(composeOptionList(e));
367             } else if (elementEquals(ReStructuredText.OPTION_LIST_ITEM, e)) {
368                 appendResult(composeOptionListItem(e));
369             } else if (elementEquals(ReStructuredText.OPTION_GROUP, e)) {
370                 appendResult(composeOptionGroup(e));
371             } else if (elementEquals(ReStructuredText.OPTION, e)) {
372                 appendResult(composeOption(e));
373             } else if (elementEquals(ReStructuredText.OPTION_STRING, e)) {
374                 appendResult(composeOptionString(e));
375             } else if (elementEquals(ReStructuredText.OPTION_ARGUMENT, e)) {
376                 appendResult(composeOptionArgument(e));
377             } else if (elementEquals(ReStructuredText.DESCRIPTION, e)) {
378                 appendResult(composeDescription(e));
379             } else if (elementEquals(ReStructuredText.LITERAL_BLOCK, e)) {
380                 appendResult(composeLiteralBlock(e));
381             } else if (elementEquals(ReStructuredText.LINE_BLOCK, e)) {
382                 appendResult(composeLineBlock(e));
383             } else if (elementEquals(ReStructuredText.LINE, e)) {
384                 appendResult(composeLine(e));
385             } else if (elementEquals(ReStructuredText.BLOCK_QUOTE, e)) {
386                 appendResult(composeBlockQuote(e));
387             } else if (elementEquals(ReStructuredText.ATTRIBUTION, e)) {
388                 appendResult(composeAttribution(e));
389             } else if (elementEquals(ReStructuredText.DOCTEST_BLOCK, e)) {
390                 appendResult(composeDocTestBlock(e));
391             } else if (elementEquals(ReStructuredText.ATTENTION, e)) {
392                 appendResult(composeAttention(e));
393             } else if (elementEquals(ReStructuredText.CAUTION, e)) {
394                 appendResult(composeCaution(e));
395             } else if (elementEquals(ReStructuredText.DANGER, e)) {
396                 appendResult(composeDanger(e));
397             } else if (elementEquals(ReStructuredText.ERROR, e)) {
398                 appendResult(composeError(e));
399             } else if (elementEquals(ReStructuredText.HINT, e)) {
400                 appendResult(composeHint(e));
401             } else if (elementEquals(ReStructuredText.IMPORTANT, e)) {
402                 appendResult(composeImportant(e));
403             } else if (elementEquals(ReStructuredText.NOTE, e)) {
404                 appendResult(composeNote(e));
405             } else if (elementEquals(ReStructuredText.TIP, e)) {
406                 appendResult(composeTip(e));
407             } else if (elementEquals(ReStructuredText.WARNING, e)) {
408                 appendResult(composeWarning(e));
409             } else if (elementEquals(ReStructuredText.ADMONITION, e)) {
410                 appendResult(composeAdmonition(e));
411             } else if (elementEquals(ReStructuredText.FOOTNOTE, e)) {
412                 appendResult(composeFootnote(e));
413             } else if (elementEquals(ReStructuredText.CITATION, e)) {
414                 appendResult(composeCitation(e));
415             } else if (elementEquals(ReStructuredText.LABEL, e)) {
416                 appendResult(composeLabel(e));
417             } else if (elementEquals(ReStructuredText.RUBRIC, e)) {
418                 appendResult(composeRubric(e));
419             } else if (elementEquals(ReStructuredText.TARGET, e)) {
420                 appendResult(composeTarget(e));
421             } else if (elementEquals(ReStructuredText.SUBSTITUTION_DEFINITION, e)) {
422                 appendResult(composeSubstitutionDefinition(e));
423             } else if (elementEquals(ReStructuredText.COMMENT, e)) {
424                 appendResult(composeComment(e));
425             } else if (elementEquals(ReStructuredText.PENDING, e)) {
426                 appendResult(composePending(e));
427             } else if (elementEquals(ReStructuredText.FIGURE, e)) {
428                 appendResult(composeFigure(e));
429             } else if (elementEquals(ReStructuredText.IMAGE, e)) {
430                 appendResult(composeImage(e));
431             } else if (elementEquals(ReStructuredText.CAPTION, e)) {
432                 appendResult(composeCaption(e));
433             } else if (elementEquals(ReStructuredText.LEGEND, e)) {
434                 appendResult(composeLegend(e));
435             } else if (elementEquals(ReStructuredText.SYSTEM_MESSAGE, e)) {
436                 appendResult(composeSystemMessage(e));
437             } else if (elementEquals(ReStructuredText.RAW, e)) {
438                 appendResult(composeRaw(e));
439 
440                 // table
441             } else if (elementEquals(ReStructuredText.TABLE, e)) {
442                 appendResult(composeTable(e));
443             } else if (elementEquals(ReStructuredText.TGROUP, e)) {
444                 appendResult(composeTgroup(e));
445             } else if (elementEquals(ReStructuredText.COLSPEC, e)) {
446                 appendResult(composeColspec(e));
447             } else if (elementEquals(ReStructuredText.THEAD, e)) {
448                 appendResult(composeThead(e));
449             } else if (elementEquals(ReStructuredText.TBODY, e)) {
450                 appendResult(composeTbody(e));
451             } else if (elementEquals(ReStructuredText.ROW, e)) {
452                 appendResult(composeRow(e));
453             } else if (elementEquals(ReStructuredText.ENTRY, e)) {
454                 appendResult(composeEntry(e));
455             } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
456             // Inline Elements
457             // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
458             else if (elementEquals(ReStructuredText.EMPHASIS, e)) {
459                 appendResult(composeEmphasis(e));
460             } else if (elementEquals(ReStructuredText.STRONG, e)) {
461                 appendResult(composeStrong(e));
462             } else if (elementEquals(ReStructuredText.LITERAL, e)) {
463                 appendResult(composeLiteral(e));
464             } else if (elementEquals(ReStructuredText.REFERENCE, e)) {
465                 appendResult(composeReference(e));
466             } else if (elementEquals(ReStructuredText.FOOTNOTE_REFERENCE, e)) {
467                 appendResult(composeFootnoteReference(e));
468             } else if (elementEquals(ReStructuredText.CITATION_REFERENCE, e)) {
469                 appendResult(composeCitationReference(e));
470             } else if (elementEquals(ReStructuredText.SUBSTITUTION_REFERENCE, e)) {
471                 appendResult(composeSubstitutionReference(e));
472             } else if (elementEquals(ReStructuredText.TITLE_REFERENCE, e)) {
473                 appendResult(composeTitleReference(e));
474             } else if (elementEquals(ReStructuredText.ABBREVIATION, e)) {
475                 appendResult(composeAbbreviation(e));
476             } else if (elementEquals(ReStructuredText.ACRONYM, e)) {
477                 appendResult(composeAcronyme(e));
478             } else if (elementEquals(ReStructuredText.SUPERSCRIPT, e)) {
479                 appendResult(composeSuperscipt(e));
480             } else if (elementEquals(ReStructuredText.SUBSCRIPT, e)) {
481                 appendResult(composeSubscript(e));
482             } else if (elementEquals(ReStructuredText.INLINE, e)) {
483                 appendResult(composeInline(e));
484             } else if (elementEquals(ReStructuredText.PROBLEMATIC, e)) {
485                 appendResult(composeProblematic(e));
486             } else if (elementEquals(ReStructuredText.GENERATED, e)) {
487                 appendResult(composeGenerated(e));
488             }
489 
490         }
491     }
492 
493     public String parseDocument(Element el) {
494         try {
495 
496             if (log.isDebugEnabled()) {
497                 log.debug("This element : " + el.getName());
498             }
499 
500             // Creation dune nouvelle instance du visitor utilise            
501             DocUtilsVisitor visitor = getClass().newInstance();
502 
503             // Traitement recursif (pour parser un document dans un autre)
504             try {
505                 el.accept(visitor);
506                 String result = visitor.getResult();
507                 if (log.isDebugEnabled()) {
508                     log.debug("document parsing result:\n" + result);
509                 }
510                 return result;
511             } finally {
512                 // Recuperation des elements parcourus
513                 addCachedElements(visitor.getCachedElements());
514                 // nettoyage du visiteur temporaire
515                 visitor.clear();
516             }
517 
518         } catch (Exception ex) {
519             if (log.isErrorEnabled()) {
520                 log.error("Cant compose document for reason " + ex.getMessage(), ex);
521             }
522             //FIXME : TC-20090816 should deal better the exception ?
523             return EMPTY_STRING;
524         }
525     }
526 
527     public String getResult() {
528         return rstResult.toString();
529     }
530 
531     public void clear() {
532         cachedElements.clear();
533         rstResult = null;
534     }
535     
536     protected void appendResult(String result) {
537         rstResult.append(result);
538     }
539 
540     protected boolean elementEquals(String name, Element e) {
541         return e.getName().equals(name);
542     }
543 
544     protected List<Element> getCachedElements() {
545         return cachedElements;
546     }
547 
548     // Permet de ne jamais repasser sur ce noeud
549     protected void addCachedElement(Element e) {
550         cachedElements.add(e);
551     }
552 
553     protected void addCachedElements(List<Element> elements) {
554         cachedElements.addAll(elements);
555     }
556 
557     protected String indent(String toIndent, int l) {
558         String prefix = EMPTY_STRING;
559         for (int i = 0; i < l; i++) {
560             prefix += SPACE;
561         }
562         StringBuilder buffer = new StringBuilder();
563         for (String s : toIndent.split(LINE_SEPARATOR)) {
564             buffer.append(prefix).append(s).append(LINE_SEPARATOR);
565         }
566         return buffer.toString();
567     }
568 }