View Javadoc

1   /* This file is part of the project "Hilbert II" - http://www.qedeq.org" target="alexandria_uri">http://www.qedeq.org
2    *
3    * Copyright 2000-2014,  Michael Meyling <mime@qedeq.org>.
4    *
5    * "Hilbert II" is free software; you can redistribute
6    * it and/or modify it under the terms of the GNU General Public
7    * License as published by the Free Software Foundation; either
8    * version 2 of the License, or (at your option) any later version.
9    *
10   * This program is distributed in the hope that it will be useful,
11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13   * GNU General Public License for more details.
14   */
15  
16  package org.qedeq.kernel.xml.handler.common;
17  
18  import org.qedeq.kernel.se.common.ModuleService;
19  import org.qedeq.kernel.xml.common.XmlSyntaxException;
20  
21  
22  /**
23   * Simple handler that gets SAX parser events. These events were received by the
24   * {@link org.qedeq.kernel.xml.handler.common.SaxDefaultHandler} and are delegated to the
25   * current {@link AbstractSimpleHandler}.
26   *
27   * @author  Michael Meyling
28   */
29  public abstract class AbstractSimpleHandler {
30  
31      /** This handler gets the original SAX events. */
32      private final SaxDefaultHandler defaultHandler;
33  
34      /** Start tag for this handler .*/
35      private final String startTag;
36  
37      /**
38       * Constructor.
39       *
40       * @param   defaultHandler  Original SAX event handler.
41       * @param   startTag        Start tag for this handler.
42       */
43      public AbstractSimpleHandler(final SaxDefaultHandler defaultHandler, final String startTag) {
44          this.defaultHandler = defaultHandler;
45          this.startTag = startTag;
46      }
47  
48      /**
49       * Constructor.
50       *
51       * @param   defaultHandler  Original SAX event handler.
52       */
53      public AbstractSimpleHandler(final SaxDefaultHandler defaultHandler) {
54          this.defaultHandler = defaultHandler;
55          this.startTag = null;
56      }
57  
58      /**
59       * Constructor, should be used for creating handlers within handlers.
60       *
61       * @param   handler     Already existing simple handler.
62       * @param   startTag    Start tag for this handler.
63       */
64      public AbstractSimpleHandler(final AbstractSimpleHandler handler, final String startTag) {
65          this.defaultHandler = handler.defaultHandler;
66          this.startTag = startTag;
67      }
68  
69      /**
70       * Constructor, should be used for creating handlers within handlers.
71       *
72       * @param   handler Already existing simple handler.
73       */
74      public AbstractSimpleHandler(final AbstractSimpleHandler handler) {
75          this.defaultHandler = handler.defaultHandler;
76          this.startTag = null;
77      }
78  
79      /**
80       * Must be called before a handler should parse a new section.
81       */
82      public abstract void init();
83  
84      /**
85       * Called at begin of element <code>elementName</code>. Must be overwritten.
86       *
87       * @param   elementName Tag name.
88       * @param   attributes  Tag attributes.
89       * @throws  XmlSyntaxException   There is a semantic error in this event occurrence.
90       */
91      public abstract void startElement(final String elementName, final SimpleAttributes attributes)
92          throws XmlSyntaxException;
93  
94      /**
95       * Called at end of element <code>elementName</code>. Must be overwritten.
96       *
97       * @param   elementName Tag name.
98       * @throws  XmlSyntaxException   There is a semantic error in this event occurrence.
99       */
100     public abstract void endElement(final String elementName) throws XmlSyntaxException;
101 
102     /**
103      * Called at end of element <code>elementName</code>. Must be overwritten if you expect
104      * character data.
105      *
106      * @param   elementName Tag name.
107      * @param   value   String value.
108      * @throws  XmlSyntaxException   There is a semantic error in this event occurrence.
109      */
110     public void characters(final String elementName, final String value) throws XmlSyntaxException {
111         // default implementation
112         throw XmlSyntaxException.createUnexpectedTextDataException(elementName, value);
113     }
114 
115     /**
116      * Change current handler to new one. The new handler gets automatically a
117      * <code>beginElement</code> event.
118      *
119      * @param   newHandler  Handler that gets all the events now.
120      * @param   elementName Current element name.
121      * @param   attributes  Current element attributes.
122      * @throws  XmlSyntaxException   New handler detected semantical problems.
123      */
124     public final void changeHandler(final AbstractSimpleHandler newHandler,
125             final String elementName, final SimpleAttributes attributes)
126             throws XmlSyntaxException {
127         if (newHandler.getStartTag() != null && !newHandler.getStartTag().equals(elementName)) {
128             throw new RuntimeException(newHandler.getClass().getName() + " has start tag \""
129                 + newHandler.getStartTag() + "\", but should start with tag \""
130                 + elementName + "\"");
131         }
132         defaultHandler.changeHandler(newHandler, elementName, attributes);
133     }
134 
135     /**
136      * Get current plugin we work for.
137      *
138      * @return  Plugin in use.
139      */
140     public final ModuleService getPlugin() {
141         return defaultHandler.getPlugin();
142     }
143 
144     /**
145      * Get current tag level.
146      *
147      * @return  Current level.
148      */
149     public final int getLevel() {
150         return defaultHandler.getLevel();
151     }
152 
153     /**
154      * Get start tag for this handler. Could be <code>null</code> if there is no specific start tag.
155      *
156      * @return  Start tag.
157      */
158     public final String getStartTag() {
159         return startTag;
160     }
161 
162 }