1
2
3
4
5
6
7
8 package org.dom4j.io;
9
10 import java.io.IOException;
11
12 import org.dom4j.DocumentFactory;
13 import org.dom4j.Element;
14 import org.dom4j.ElementHandler;
15
16 import org.xml.sax.Attributes;
17 import org.xml.sax.Locator;
18 import org.xml.sax.SAXException;
19
20 /***
21 * This extension of the SAXContentHandler writes SAX events immediately to the
22 * provided XMLWriter, unless some {@link org.dom4.ElementHandler}is still
23 * handling the current Element.
24 *
25 * @author Wonne Keysers (Realsoftware.be)
26 *
27 * @see org.dom4j.io.SAXContentHandler
28 */
29 class SAXModifyContentHandler extends SAXContentHandler {
30 private XMLWriter xmlWriter;
31
32 public SAXModifyContentHandler() {
33 }
34
35 public SAXModifyContentHandler(DocumentFactory documentFactory) {
36 super(documentFactory);
37 }
38
39 public SAXModifyContentHandler(DocumentFactory documentFactory,
40 ElementHandler elementHandler) {
41 super(documentFactory, elementHandler);
42 }
43
44 public SAXModifyContentHandler(DocumentFactory documentFactory,
45 ElementHandler elementHandler, ElementStack elementStack) {
46 super(documentFactory, elementHandler, elementStack);
47 }
48
49 public void setXMLWriter(XMLWriter writer) {
50 this.xmlWriter = writer;
51 }
52
53 public void startCDATA() throws SAXException {
54 super.startCDATA();
55
56 if (!activeHandlers() && (xmlWriter != null)) {
57 xmlWriter.startCDATA();
58 }
59 }
60
61 public void startDTD(String name, String publicId, String systemId)
62 throws SAXException {
63 super.startDTD(name, publicId, systemId);
64
65 if (xmlWriter != null) {
66 xmlWriter.startDTD(name, publicId, systemId);
67 }
68 }
69
70 public void endDTD() throws org.xml.sax.SAXException {
71 super.endDTD();
72
73 if (xmlWriter != null) {
74 xmlWriter.endDTD();
75 }
76 }
77
78 public void comment(char[] characters, int parm2, int parm3)
79 throws SAXException {
80 super.comment(characters, parm2, parm3);
81
82 if (!activeHandlers() && (xmlWriter != null)) {
83 xmlWriter.comment(characters, parm2, parm3);
84 }
85 }
86
87 public void startEntity(String name) throws SAXException {
88 super.startEntity(name);
89
90 if (xmlWriter != null) {
91 xmlWriter.startEntity(name);
92 }
93 }
94
95 public void endCDATA() throws org.xml.sax.SAXException {
96 super.endCDATA();
97
98 if (!activeHandlers() && (xmlWriter != null)) {
99 xmlWriter.endCDATA();
100 }
101 }
102
103 public void endEntity(String name) throws SAXException {
104 super.endEntity(name);
105
106 if (xmlWriter != null) {
107 xmlWriter.endEntity(name);
108 }
109 }
110
111 public void unparsedEntityDecl(String name, String publicId,
112 String systemId, String notation) throws SAXException {
113 super.unparsedEntityDecl(name, publicId, systemId, notation);
114
115 if (!activeHandlers() && (xmlWriter != null)) {
116 xmlWriter.unparsedEntityDecl(name, publicId, systemId, notation);
117 }
118 }
119
120 public void notationDecl(String name, String publicId, String systemId)
121 throws SAXException {
122 super.notationDecl(name, publicId, systemId);
123
124 if (xmlWriter != null) {
125 xmlWriter.notationDecl(name, publicId, systemId);
126 }
127 }
128
129 public void startElement(String uri, String localName, String qName,
130 Attributes atts) throws SAXException {
131 super.startElement(uri, localName, qName, atts);
132
133 if (!activeHandlers() && (xmlWriter != null)) {
134 xmlWriter.startElement(uri, localName, qName, atts);
135 }
136 }
137
138 public void startDocument() throws SAXException {
139 super.startDocument();
140
141 if (xmlWriter != null) {
142 xmlWriter.startDocument();
143 }
144 }
145
146 public void ignorableWhitespace(char[] parm1, int parm2, int parm3)
147 throws SAXException {
148 super.ignorableWhitespace(parm1, parm2, parm3);
149
150 if (!activeHandlers() && (xmlWriter != null)) {
151 xmlWriter.ignorableWhitespace(parm1, parm2, parm3);
152 }
153 }
154
155 public void processingInstruction(String target, String data)
156 throws SAXException {
157 super.processingInstruction(target, data);
158
159 if (!activeHandlers() && (xmlWriter != null)) {
160 xmlWriter.processingInstruction(target, data);
161 }
162 }
163
164 public void setDocumentLocator(Locator locator) {
165 super.setDocumentLocator(locator);
166
167 if (xmlWriter != null) {
168 xmlWriter.setDocumentLocator(locator);
169 }
170 }
171
172 public void skippedEntity(String name) throws SAXException {
173 super.skippedEntity(name);
174
175 if (!activeHandlers() && (xmlWriter != null)) {
176 xmlWriter.skippedEntity(name);
177 }
178 }
179
180 public void endDocument() throws SAXException {
181 super.endDocument();
182
183 if (xmlWriter != null) {
184 xmlWriter.endDocument();
185 }
186 }
187
188 public void startPrefixMapping(String prefix, String uri)
189 throws SAXException {
190 super.startPrefixMapping(prefix, uri);
191
192 if (xmlWriter != null) {
193 xmlWriter.startPrefixMapping(prefix, uri);
194 }
195 }
196
197 public void endElement(String uri, String localName, String qName)
198 throws SAXException {
199 ElementHandler currentHandler = getElementStack().getDispatchHandler()
200 .getHandler(getElementStack().getPath());
201
202 super.endElement(uri, localName, qName);
203
204 if (!activeHandlers()) {
205 if (xmlWriter != null) {
206 if (currentHandler == null) {
207 xmlWriter.endElement(uri, localName, qName);
208 } else if (currentHandler instanceof SAXModifyElementHandler) {
209 SAXModifyElementHandler modifyHandler
210 = (SAXModifyElementHandler) currentHandler;
211 Element modifiedElement = modifyHandler
212 .getModifiedElement();
213
214 try {
215 xmlWriter.write(modifiedElement);
216 } catch (IOException ex) {
217 throw new SAXModifyException(ex);
218 }
219 }
220 }
221 }
222 }
223
224 public void endPrefixMapping(String prefix) throws SAXException {
225 super.endPrefixMapping(prefix);
226
227 if (xmlWriter != null) {
228 xmlWriter.endPrefixMapping(prefix);
229 }
230 }
231
232 public void characters(char[] parm1, int parm2, int parm3)
233 throws SAXException {
234 super.characters(parm1, parm2, parm3);
235
236 if (!activeHandlers() && (xmlWriter != null)) {
237 xmlWriter.characters(parm1, parm2, parm3);
238 }
239 }
240
241 protected XMLWriter getXMLWriter() {
242 return this.xmlWriter;
243 }
244
245 private boolean activeHandlers() {
246 DispatchHandler handler = getElementStack().getDispatchHandler();
247
248 return handler.getActiveHandlerCount() > 0;
249 }
250 }
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287