Qedeq2Xml.java
001 /* This file is part of the project "Hilbert II" - http://www.qedeq.org
002  *
003  * Copyright 2000-2011,  Michael Meyling <mime@qedeq.org>.
004  *
005  * "Hilbert II" is free software; you can redistribute
006  * it and/or modify it under the terms of the GNU General Public
007  * License as published by the Free Software Foundation; either
008  * version 2 of the License, or (at your option) any later version.
009  *
010  * This program is distributed in the hope that it will be useful,
011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013  * GNU General Public License for more details.
014  */
015 
016 package org.qedeq.kernel.xml.dao;
017 
018 import java.io.IOException;
019 
020 import org.qedeq.base.io.TextOutput;
021 import org.qedeq.base.utility.StringUtility;
022 import org.qedeq.kernel.bo.KernelContext;
023 import org.qedeq.kernel.bo.module.ControlVisitor;
024 import org.qedeq.kernel.bo.module.KernelQedeqBo;
025 import org.qedeq.kernel.se.base.list.ElementList;
026 import org.qedeq.kernel.se.base.module.Add;
027 import org.qedeq.kernel.se.base.module.Author;
028 import org.qedeq.kernel.se.base.module.AuthorList;
029 import org.qedeq.kernel.se.base.module.Axiom;
030 import org.qedeq.kernel.se.base.module.Chapter;
031 import org.qedeq.kernel.se.base.module.Existential;
032 import org.qedeq.kernel.se.base.module.FormalProof;
033 import org.qedeq.kernel.se.base.module.FormalProofLine;
034 import org.qedeq.kernel.se.base.module.FormalProofLineList;
035 import org.qedeq.kernel.se.base.module.Formula;
036 import org.qedeq.kernel.se.base.module.FunctionDefinition;
037 import org.qedeq.kernel.se.base.module.Header;
038 import org.qedeq.kernel.se.base.module.Import;
039 import org.qedeq.kernel.se.base.module.ImportList;
040 import org.qedeq.kernel.se.base.module.InitialFunctionDefinition;
041 import org.qedeq.kernel.se.base.module.InitialPredicateDefinition;
042 import org.qedeq.kernel.se.base.module.Latex;
043 import org.qedeq.kernel.se.base.module.LatexList;
044 import org.qedeq.kernel.se.base.module.LinkList;
045 import org.qedeq.kernel.se.base.module.LiteratureItem;
046 import org.qedeq.kernel.se.base.module.LiteratureItemList;
047 import org.qedeq.kernel.se.base.module.Location;
048 import org.qedeq.kernel.se.base.module.LocationList;
049 import org.qedeq.kernel.se.base.module.ModusPonens;
050 import org.qedeq.kernel.se.base.module.Node;
051 import org.qedeq.kernel.se.base.module.PredicateDefinition;
052 import org.qedeq.kernel.se.base.module.Proof;
053 import org.qedeq.kernel.se.base.module.Proposition;
054 import org.qedeq.kernel.se.base.module.Qedeq;
055 import org.qedeq.kernel.se.base.module.Rename;
056 import org.qedeq.kernel.se.base.module.Rule;
057 import org.qedeq.kernel.se.base.module.Section;
058 import org.qedeq.kernel.se.base.module.Specification;
059 import org.qedeq.kernel.se.base.module.Subsection;
060 import org.qedeq.kernel.se.base.module.SubsectionList;
061 import org.qedeq.kernel.se.base.module.SubstFree;
062 import org.qedeq.kernel.se.base.module.SubstFunc;
063 import org.qedeq.kernel.se.base.module.SubstPred;
064 import org.qedeq.kernel.se.base.module.Term;
065 import org.qedeq.kernel.se.base.module.Universal;
066 import org.qedeq.kernel.se.base.module.UsedByList;
067 import org.qedeq.kernel.se.base.module.VariableList;
068 import org.qedeq.kernel.se.common.Plugin;
069 import org.qedeq.kernel.se.common.SourceFileExceptionList;
070 
071 
072 /**
073  * This class prints a QEDEQ module in XML format in an output stream.
074  *
075  @author  Michael Meyling
076  */
077 public final class Qedeq2Xml extends ControlVisitor implements Plugin {
078 
079     /** Output goes here. */
080     private TextOutput printer;
081 
082     /**
083      * Constructor.
084      *
085      @param   plugin  This plugin we work for.
086      @param   bo      QEDEQ BO.
087      @param   printer Print herein.
088      */
089     private Qedeq2Xml(final Plugin plugin, final KernelQedeqBo bo, final TextOutput printer) {
090         super(plugin, bo);
091         this.printer = printer;
092     }
093 
094     /**
095      * Prints a XML representation of given QEDEQ module into a given output stream.
096      *
097      @param   plugin              Plugin we work for.
098      @param   bo                  BO QEDEQ module object.
099      @param   printer             Print herein.
100      @throws  SourceFileExceptionList Major problem occurred.
101      @throws  IOException         Writing failed.
102      */
103     public static void print(final Plugin plugin, final KernelQedeqBo bo, final TextOutput printerthrows
104             SourceFileExceptionList, IOException {
105         final Qedeq2Xml converter = new Qedeq2Xml(plugin, bo, printer);
106         try {
107             converter.traverse();
108         finally {
109             printer.flush();
110         }
111         if (printer.checkError()) {
112             throw printer.getError();
113         }
114     }
115 
116     public final void visitEnter(final Qedeq qedeq) {
117         printer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
118         printer.println("<QEDEQ");
119         printer.println("    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"");
120         printer.println("    xsi:noNamespaceSchemaLocation=\"http://www.qedeq.org/"
121             + KernelContext.getInstance().getKernelVersionDirectory() "/xml/qedeq.xsd\">");
122         printer.pushLevel();
123     }
124 
125     public final void visitLeave(final Qedeq qedeq) {
126         printer.popLevel();
127         printer.println("</QEDEQ>");
128     }
129 
130     public void visitEnter(final Header header) {
131         printer.print("<HEADER");
132         if (header.getEmail() != null) {
133             printer.print(" email=\"" + StringUtility.escapeXml(header.getEmail()) "\"");
134         }
135         printer.println(">");
136         printer.pushLevel();
137     }
138 
139     public void visitLeave(final Header header) {
140         printer.popLevel();
141         printer.println("</HEADER>");
142     }
143 
144     public void visitEnter(final Specification specification) {
145         printer.print("<SPECIFICATION");
146         if (specification.getName() != null) {
147             printer.print(" name=\"" + StringUtility.escapeXml(specification.getName()) "\"");
148         }
149         if (specification.getName() != null) {
150             printer.print(" ruleVersion=\"" + StringUtility.escapeXml(specification.getRuleVersion()) "\"");
151         }
152         printer.println(">");
153         printer.pushLevel();
154     }
155 
156     public void visitLeave(final Specification specification) {
157         printer.popLevel();
158         printer.println("</SPECIFICATION>");
159     }
160 
161     public void visitEnter(final LatexList latexList) {
162         final String last = getCurrentContext().getLocationWithinModule();
163         if (last.endsWith(".getTitle()")) {
164             printer.println("<TITLE>");
165         else if (last.endsWith(".getSummary()")) {
166             printer.println("<ABSTRACT>");
167         else if (last.endsWith(".getIntroduction()")) {
168             printer.println("<INTRODUCTION>");
169         else if (last.endsWith(".getName()")) {
170             printer.println("<NAME>");
171         else if (last.endsWith(".getPrecedingText()")) {
172             printer.println("<PRECEDING>");
173         else if (last.endsWith(".getSucceedingText()")) {
174             printer.println("<SUCCEEDING>");
175         else if (last.endsWith(".getLatex()")) {
176             printer.println("<TEXT>");
177         else if (last.endsWith(".getDescription()")) {
178             printer.println("<DESCRIPTION>");
179         }
180         printer.pushLevel();
181     }
182 
183     public void visitLeave(final LatexList latexList) {
184         printer.popLevel();
185         final String last = getCurrentContext().getLocationWithinModule();
186         if (last.endsWith(".getTitle()")) {
187             printer.println("</TITLE>");
188         else if (last.endsWith(".getSummary()")) {
189             printer.println("</ABSTRACT>");
190         else if (last.endsWith(".getIntroduction()")) {
191             printer.println("</INTRODUCTION>");
192         else if (last.endsWith(".getName()")) {
193             printer.println("</NAME>");
194         else if (last.endsWith(".getPrecedingText()")) {
195             printer.println("</PRECEDING>");
196         else if (last.endsWith(".getSucceedingText()")) {
197             printer.println("</SUCCEEDING>");
198         else if (last.endsWith(".getLatex()")) {
199             printer.println("</TEXT>");
200         else if (last.endsWith(".getDescription()")) {
201             printer.println("</DESCRIPTION>");
202         }
203     }
204 
205     public void visitEnter(final Latex latex) {
206         printer.print("<LATEX");
207         if (latex.getLanguage() != null) {
208             printer.print(" language=\"" + latex.getLanguage() "\"");
209         }
210         printer.println(">");
211         if (latex.getLatex() != null) {
212             printer.pushLevel();
213             printer.println("<![CDATA[");
214             printer.print("  ");
215             final String tabs = printer.getLevel();
216             printer.clearLevel();
217             // escape ]]>
218             final String data = StringUtility.replace(latex.getLatex(),
219                 "]]>""]]]]><![CDATA[>");
220             printer.println(StringUtility.useSystemLineSeparator(data).trim());
221             printer.pushLevel(tabs);
222         }
223     }
224 
225     public void visitLeave(final Latex latex) {
226         if (latex.getLatex() != null) {
227             printer.println("]]>");
228             printer.popLevel();
229         }
230         printer.println("</LATEX>");
231     }
232 
233     public void visitEnter(final LocationList locationList) {
234         printer.println("<LOCATIONS>");
235         printer.pushLevel();
236     }
237 
238     public void visitLeave(final LocationList locationList) {
239         printer.popLevel();
240         printer.println("</LOCATIONS>");
241     }
242 
243     public void visitEnter(final Location location) {
244         printer.print("<LOCATION");
245         if (location.getLocation() != null) {
246             printer.print(" value=\"" + location.getLocation() "\"");
247         }
248         printer.println(" />");
249     }
250 
251     public void visitEnter(final AuthorList authorList) {
252         printer.println("<AUTHORS>");
253         printer.pushLevel();
254     }
255 
256     public void visitLeave(final AuthorList authorList) {
257         printer.popLevel();
258         printer.println("</AUTHORS>");
259     }
260 
261     public void visitEnter(final Author author) {
262         printer.print("<AUTHOR");
263         if (author.getEmail() != null) {
264             printer.print(" email=\"" + StringUtility.escapeXml(author.getEmail()) "\"");
265         }
266         printer.println(">");
267         printer.pushLevel();
268         if (author.getName() != null) {
269             printer.println("<NAME>");
270         }
271         printer.pushLevel();
272     }
273 
274     public void visitLeave(final Author author) {
275         printer.popLevel();
276         if (author.getName() != null) {
277             printer.println("</NAME>");
278         }
279         printer.popLevel();
280         printer.println("</AUTHOR>");
281     }
282 
283     public void visitEnter(final ImportList importList) {
284         printer.println("<IMPORTS>");
285         printer.pushLevel();
286     }
287 
288     public void visitLeave(final ImportList importList) {
289         printer.popLevel();
290         printer.println("</IMPORTS>");
291     }
292 
293     public void visitEnter(final Import imp) {
294         printer.print("<IMPORT");
295         if (imp.getLabel() != null) {
296             printer.print(" label=\"" + StringUtility.escapeXml(imp.getLabel()) "\"");
297         }
298         printer.println(">");
299         printer.pushLevel();
300     }
301 
302     public void visitLeave(final Import imp) {
303         printer.popLevel();
304         printer.println("</IMPORT>");
305     }
306 
307     public void visitEnter(final UsedByList usedByList) {
308         printer.println("<USEDBY>");
309         printer.pushLevel();
310     }
311 
312     public void visitLeave(final UsedByList usedByList) {
313         printer.popLevel();
314         printer.println("</USEDBY>");
315     }
316 
317     public void visitEnter(final Chapter chapter) {
318         printer.print("<CHAPTER");
319         if (chapter.getNoNumber() != null) {
320             printer.print(" noNumber=\"" + chapter.getNoNumber().booleanValue() "\"");
321         }
322         printer.println(">");
323         printer.pushLevel();
324     }
325 
326     public void visitLeave(final Chapter chapter) {
327         printer.popLevel();
328         printer.println("</CHAPTER>");
329     }
330 
331     public void visitEnter(final Section section) {
332         printer.print("<SECTION");
333         if (section.getNoNumber() != null) {
334             printer.print(" noNumber=\"" + section.getNoNumber().booleanValue() "\"");
335         }
336         printer.println(">");
337         printer.pushLevel();
338     }
339 
340     public void visitLeave(final Section section) {
341         printer.popLevel();
342         printer.println("</SECTION>");
343     }
344 
345     public void visitEnter(final SubsectionList subsectionList) {
346         printer.println("<SUBSECTIONS>");
347         printer.pushLevel();
348     }
349 
350     public void visitLeave(final SubsectionList subsectionList) {
351         printer.popLevel();
352         printer.println("</SUBSECTIONS>");
353     }
354 
355     public void visitEnter(final Subsection subsection) {
356         printer.print("<SUBSECTION");
357         if (subsection.getId() != null) {
358             printer.print(" id=\"" + StringUtility.escapeXml(subsection.getId()) "\"");
359         }
360         if (subsection.getLevel() != null) {
361             printer.print(" level=\"" + StringUtility.escapeXml(subsection.getLevel()) "\"");
362         }
363         printer.println(">");
364         printer.pushLevel();
365     }
366 
367     public void visitLeave(final Subsection subsection) {
368         printer.popLevel();
369         printer.println("</SUBSECTION>");
370     }
371 
372     public void visitEnter(final Node node) {
373         printer.print("<NODE");
374         if (node.getId() != null) {
375             printer.print(" id=\"" + StringUtility.escapeXml(node.getId()) "\"");
376         }
377         if (node.getLevel() != null) {
378             printer.print(" level=\"" + StringUtility.escapeXml(node.getLevel()) "\"");
379         }
380         printer.println(">");
381         printer.pushLevel();
382     }
383 
384     public void visitLeave(final Node node) {
385         printer.popLevel();
386         printer.println("</NODE>");
387     }
388 
389     public void visitEnter(final Axiom axiom) {
390         printer.print("<AXIOM");
391         if (axiom.getDefinedOperator() != null) {
392             printer.print(" definedOperator=\"" + StringUtility.escapeXml(axiom.getDefinedOperator()) "\"");
393         }
394         printer.println(">");
395         printer.pushLevel();
396     }
397 
398     public void visitLeave(final Axiom axiom) {
399         printer.popLevel();
400         printer.println("</AXIOM>");
401     }
402 
403     public void visitEnter(final Proposition proposition) {
404         printer.println("<THEOREM>");
405         printer.pushLevel();
406     }
407 
408     public void visitLeave(final Proposition proposition) {
409         printer.popLevel();
410         printer.println("</THEOREM>");
411     }
412 
413     public void visitEnter(final Proof proof) {
414         printer.print("<PROOF");
415         if (proof.getKind() != null) {
416             printer.print(" kind=\"" + StringUtility.escapeXml(proof.getKind()) "\"");
417         }
418         if (proof.getLevel() != null) {
419             printer.print(" level=\"" + StringUtility.escapeXml(proof.getLevel()) "\"");
420         }
421         printer.println(">");
422     }
423 
424     public void visitLeave(final Proof proof) {
425         printer.println("</PROOF>");
426     }
427 
428     public void visitEnter(final FormalProof proof) {
429         printer.println("<FORMAL_PROOF>");
430         printer.pushLevel();
431     }
432 
433     public void visitLeave(final FormalProof proof) {
434         printer.popLevel();
435         printer.println("</FORMAL_PROOF>");
436     }
437 
438     public void visitEnter(final FormalProofLineList proof) {
439         printer.println("<LINES>");
440         printer.pushLevel();
441     }
442 
443     public void visitLeave(final FormalProofLineList proof) {
444         printer.popLevel();
445         printer.println("</LINES>");
446     }
447 
448     public void visitEnter(final FormalProofLine line) {
449         printer.print("<L");
450         if (line.getLabel() != null) {
451             printer.print(" label=\"" + StringUtility.escapeXml(line.getLabel()) "\"");
452         }
453         printer.println(">");
454         printer.pushLevel();
455     }
456 
457     public void visitLeave(final FormalProofLine line) {
458         printer.popLevel();
459         printer.println("</L>");
460     }
461 
462     public void visitEnter(final ModusPonens reason) {
463         printer.print("<MP");
464         if (reason.getReference1() != null) {
465             printer.print(" ref1=\"" + StringUtility.escapeXml(reason.getReference1()) "\"");
466         }
467         if (reason.getReference2() != null) {
468             printer.print(" ref2=\"" + StringUtility.escapeXml(reason.getReference2()) "\"");
469         }
470     }
471 
472     public void visitLeave(final ModusPonens reason) {
473         printer.println("/>");
474     }
475 
476     public void visitEnter(final Add reason) {
477         printer.print("<ADD");
478         if (reason.getReference() != null) {
479             printer.print(" ref=\"" + StringUtility.escapeXml(reason.getReference()) "\"");
480         }
481     }
482 
483     public void visitLeave(final Add reason) {
484         printer.println("/>");
485     }
486 
487     public void visitEnter(final Rename reason) {
488         printer.print("<RENAME");
489         if (reason.getReference() != null) {
490             printer.print(" ref=\"" + StringUtility.escapeXml(reason.getReference()) "\"");
491         }
492         if (reason.getOccurrence() != 0) {
493             printer.print(" occurrence=\"" + StringUtility.escapeXml("" + reason.getOccurrence()) "\"");
494         }
495         printer.println(">");
496         printer.pushLevel();
497     }
498 
499     public void visitLeave(final Rename reason) {
500         printer.popLevel();
501         printer.println("</RENAME>");
502     }
503 
504     public void visitEnter(final SubstFree reason) {
505         printer.print("<SUBST_FREE");
506         if (reason.getReference() != null) {
507             printer.print(" ref=\"" + StringUtility.escapeXml(reason.getReference()) "\"");
508         }
509         printer.println(">");
510         printer.pushLevel();
511     }
512 
513     public void visitLeave(final SubstFree reason) {
514         printer.popLevel();
515         printer.println("</SUBST_FREE>");
516     }
517 
518     public void visitEnter(final SubstFunc reason) {
519         printer.print("<SUBST_FUNVAR");
520         if (reason.getReference() != null) {
521             printer.print(" ref=\"" + StringUtility.escapeXml(reason.getReference()) "\"");
522         }
523         printer.println(">");
524         printer.pushLevel();
525     }
526 
527     public void visitLeave(final SubstFunc reason) {
528         printer.popLevel();
529         printer.println("</SUBST_FUNVAR>");
530     }
531 
532     public void visitEnter(final SubstPred reason) {
533         printer.print("<SUBST_PREDVAR");
534         if (reason.getReference() != null) {
535             printer.print(" ref=\"" + StringUtility.escapeXml(reason.getReference()) "\"");
536         }
537         printer.println(">");
538         printer.pushLevel();
539     }
540 
541     public void visitLeave(final SubstPred reason) {
542         printer.popLevel();
543         printer.println("</SUBST_PREDVAR>");
544     }
545 
546     public void visitEnter(final Existential reason) {
547         printer.print("<EXISTENTIAL");
548         if (reason.getReference() != null) {
549             printer.print(" ref=\"" + StringUtility.escapeXml(reason.getReference()) "\"");
550         }
551         printer.println(">");
552         printer.pushLevel();
553     }
554 
555     public void visitLeave(final Existential reason) {
556         printer.popLevel();
557         printer.println("</EXISTENTIAL>");
558     }
559 
560     public void visitEnter(final Universal reason) {
561         printer.print("<UNIVERSAL");
562         if (reason.getReference() != null) {
563             printer.print(" ref=\"" + StringUtility.escapeXml(reason.getReference()) "\"");
564         }
565         printer.println(">");
566         printer.pushLevel();
567     }
568 
569     public void visitLeave(final Universal reason) {
570         printer.popLevel();
571         printer.println("</UNIVERSAL>");
572     }
573 
574     public void visitEnter(final InitialPredicateDefinition definition) {
575         printer.print("<DEFINITION_PREDICATE_INITIAL");
576         if (definition.getArgumentNumber() != null) {
577             printer.print(" arguments=\"" + StringUtility.escapeXml(definition.getArgumentNumber()) "\"");
578         }
579         if (definition.getName() != null) {
580             printer.print(" name=\"" + StringUtility.escapeXml(definition.getName()) "\"");
581         }
582         printer.println(">");
583         printer.pushLevel();
584         if (definition.getLatexPattern() != null) {
585             printer.println("<LATEXPATTERN>" + StringUtility.escapeXml(definition.getLatexPattern())
586                 "</LATEXPATTERN>");
587         }
588     }
589 
590     public void visitLeave(final InitialPredicateDefinition definition) {
591         printer.popLevel();
592         printer.println("</DEFINITION_PREDICATE_INITIAL>");
593     }
594 
595     public void visitEnter(final PredicateDefinition definition) {
596         printer.print("<DEFINITION_PREDICATE");
597         if (definition.getArgumentNumber() != null) {
598             printer.print(" arguments=\"" + StringUtility.escapeXml(definition.getArgumentNumber()) "\"");
599         }
600         if (definition.getName() != null) {
601             printer.print(" name=\"" + StringUtility.escapeXml(definition.getName()) "\"");
602         }
603         printer.println(">");
604         printer.pushLevel();
605         if (definition.getLatexPattern() != null) {
606             printer.println("<LATEXPATTERN>" + StringUtility.escapeXml(definition.getLatexPattern())
607                 "</LATEXPATTERN>");
608         }
609     }
610 
611     public void visitLeave(final PredicateDefinition definition) {
612         printer.popLevel();
613         printer.println("</DEFINITION_PREDICATE>");
614     }
615 
616     public void visitEnter(final InitialFunctionDefinition definition) {
617         printer.print("<DEFINITION_FUNCTION_INITIAL");
618         if (definition.getArgumentNumber() != null) {
619             printer.print(" arguments=\"" + StringUtility.escapeXml(definition.getArgumentNumber()) "\"");
620         }
621         if (definition.getName() != null) {
622             printer.print(" name=\"" + StringUtility.escapeXml(definition.getName()) "\"");
623         }
624         printer.println(">");
625         printer.pushLevel();
626         if (definition.getLatexPattern() != null) {
627             printer.println("<LATEXPATTERN>" + definition.getLatexPattern()
628                 "</LATEXPATTERN>");
629         }
630     }
631 
632     public void visitLeave(final InitialFunctionDefinition definition) {
633         printer.popLevel();
634         printer.println("</DEFINITION_FUNCTION_INITIAL>");
635     }
636 
637     public void visitEnter(final FunctionDefinition definition) {
638         printer.print("<DEFINITION_FUNCTION");
639         if (definition.getArgumentNumber() != null) {
640             printer.print(" arguments=\"" + StringUtility.escapeXml(definition.getArgumentNumber()) "\"");
641         }
642         if (definition.getName() != null) {
643             printer.print(" name=\"" + StringUtility.escapeXml(definition.getName()) "\"");
644         }
645         printer.println(">");
646         printer.pushLevel();
647         if (definition.getLatexPattern() != null) {
648             printer.println("<LATEXPATTERN>" + definition.getLatexPattern()
649                 "</LATEXPATTERN>");
650         }
651     }
652 
653     public void visitLeave(final FunctionDefinition definition) {
654         printer.popLevel();
655         printer.println("</DEFINITION_FUNCTION>");
656     }
657 
658     public void visitEnter(final Rule rule) {
659         printer.print("<RULE");
660         if (rule.getName() != null) {
661             printer.print(" name=\"" + StringUtility.escapeXml(rule.getName()) "\"");
662         }
663         printer.println(">");
664         printer.pushLevel();
665     }
666 
667     public void visitLeave(final Rule rule) {
668         printer.popLevel();
669         printer.println("</RULE>");
670     }
671 
672     public void visitEnter(final LinkList linkList) {
673         for (int i = 0; i < linkList.size(); i++) {
674             printer.print("<LINK");
675             if (linkList.get(i!= null) {
676                 printer.print(" id=\"" + StringUtility.escapeXml(linkList.get(i)) "\"");
677             }
678             printer.println("/>");
679         };
680     }
681 
682     public void visitEnter(final Formula formula) {
683         printer.println("<FORMULA>");
684         printer.pushLevel();
685     }
686 
687     public void visitLeave(final Formula formula) {
688         printer.popLevel();
689         printer.println("</FORMULA>");
690     }
691 
692     public void visitEnter(final Term term) {
693         printer.println("<TERM>");
694         printer.pushLevel();
695     }
696 
697     public void visitLeave(final Term term) {
698         printer.popLevel();
699         printer.println("</TERM>");
700     }
701 
702     public void visitEnter(final VariableList variableList) {
703         printer.println("<VARLIST>");
704         printer.pushLevel();
705     }
706 
707     public void visitLeave(final VariableList variableList) {
708         printer.popLevel();
709         printer.println("</VARLIST>");
710     }
711 
712     // TODO mime 20070217: what do we do if an atom is not first element of a list?
713     // we wouldn't get it here!!! But can we think of an output syntax anyway????
714     public void visitEnter(final ElementList list) {
715         final String operator = list.getOperator();
716         printer.print("<" + operator);
717         final boolean firstIsAtom = list.size() && list.getElement(0).isAtom();
718         if (firstIsAtom) {
719             final String atom = list.getElement(0).getAtom().getString();
720             if (atom != null) {
721                 if ("VAR".equals(operator|| "PREDVAR".equals(operator)
722                         || "FUNVAR".equals(operator)) {
723                     printer.print(" id=\"" + StringUtility.escapeXml(atom"\"");
724                 else if ("PREDCON".equals(operator|| "FUNCON".equals(operator)) {
725                     printer.print(" ref=\"" + StringUtility.escapeXml(atom"\"");
726                 else {
727                     printer.print(" unknown=\"" + StringUtility.escapeXml(atom"\"");
728                 }
729             }
730         }
731         if (list.size() == || list.size() == && list.getElement(0).isAtom()) {
732             printer.print("/");
733         }
734         printer.println(">");
735         printer.pushLevel();
736     }
737 
738     public void visitLeave(final ElementList list) {
739         printer.popLevel();
740         if (list.size() == || list.size() == && list.getElement(0).isAtom()) {
741             return;
742         }
743         printer.println("</" + list.getOperator() ">");
744     }
745 
746     public void visitEnter(final LiteratureItemList list) {
747         printer.println("<BIBLIOGRAPHY>");
748         printer.pushLevel();
749     }
750 
751     public void visitLeave(final LiteratureItemList list) {
752         printer.popLevel();
753         printer.println("</BIBLIOGRAPHY>");
754     }
755 
756     public void visitEnter(final LiteratureItem item) {
757         printer.print("<ITEM");
758         if (item.getLabel() != null) {
759             printer.print(" label=\"" + StringUtility.escapeXml(item.getLabel()) "\"");
760         }
761         printer.println(">");
762         printer.pushLevel();
763     }
764 
765     public void visitLeave(final LiteratureItem item) {
766         printer.popLevel();
767         printer.println("</ITEM>");
768     }
769 
770     public String getPluginId() {
771         return this.getClass().getName();
772     }
773 
774     public String getPluginActionName() {
775         return "generate XML";
776     }
777 
778     public String getPluginDescription() {
779         return "Transformes QEDEQ module into XML data";
780     }
781 
782 }