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 }