View Javadoc
1   /*
2    * Redistribution and use of this software and associated documentation
3    * ("Software"), with or without modification, are permitted provided
4    * that the following conditions are met:
5    *
6    * 1. Redistributions of source code must retain copyright
7    *    statements and notices.  Redistributions must also contain a
8    *    copy of this document.
9    *
10   * 2. Redistributions in binary form must reproduce the
11   *    above copyright notice, this list of conditions and the
12   *    following disclaimer in the documentation and/or other
13   *    materials provided with the distribution.
14   *
15   * 3. The name "Exolab" must not be used to endorse or promote
16   *    products derived from this Software without prior written
17   *    permission of Intalio, Inc.  For written permission,
18   *    please contact info@exolab.org.
19   *
20   * 4. Products derived from this Software may not be called "Exolab"
21   *    nor may "Exolab" appear in their names without prior written
22   *    permission of Intalio, Inc. Exolab is a registered
23   *    trademark of Intalio, Inc.
24   *
25   * 5. Due credit should be given to the Exolab Project
26   *    (http://www.exolab.org/).
27   *
28   * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS
29   * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
32   * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39   * OF THE POSSIBILITY OF SUCH DAMAGE.
40   *
41   * Copyright 1999 (C) Intalio, Inc. All Rights Reserved.
42   *
43   * This file was adapted From XSL:P
44   *
45   * $Id$
46   */
47  package org.exolab.castor.xml.util;
48  
49  import org.exolab.castor.xml.EventProducer;
50  import org.w3c.dom.Document;
51  import org.w3c.dom.Element;
52  import org.w3c.dom.Node;
53  import org.w3c.dom.ProcessingInstruction;
54  import org.w3c.dom.Text;
55  import org.xml.sax.AttributeList;
56  import org.xml.sax.DocumentHandler;
57  
58  /**
59   * A class for converting a DOM document to SAX events
60   * @author <a href="mailto:kvisco@intalio.com">Keith Visco</a>
61   * @version $Revision$ $Date: 2003-03-03 00:05:44 -0700 (Mon, 03 Mar 2003) $
62  **/
63  public class DOMEventProducer implements EventProducer {
64  
65  
66      private DocumentHandler _handler = null;
67  
68      private Node _node = null;
69  
70      /**
71       * Creates a new DOMEventProducer
72      **/
73      public DOMEventProducer() {
74          super();
75      } //-- DOMEventProducer
76  
77      /**
78       * Creates a new DOMEventProducer for the given Node
79       * @param node the node to create the DOMEventProducer for.
80      **/
81      public DOMEventProducer(Node node) {
82          super();
83          this._node = node;
84      } //-- DOMEventProducer
85  
86  
87      /**
88       * Sets the DocumentHandler to use when firing events
89      **/
90      public void setDocumentHandler(DocumentHandler handler) {
91          this._handler = handler;
92      } //-- setDocumentHandler
93  
94      /**
95       * Sets the node which is to be converted into SAX events
96       * @param node the node which is to be converted into SAX events
97      **/
98      public void setNode(Node node) {
99          this._node = node;
100     } //-- setNode
101 
102     /**
103      * Starts producing the events for the Node which is to be
104      * converted into SAX events
105     **/
106     public void start()
107         throws org.xml.sax.SAXException
108     {
109         if ((_node == null) || (_handler == null)) return;
110 
111         process(_node, _handler);
112 
113     } //-- start
114 
115     /**
116      * Walks the given DOM Document and converts it into it's corresponding
117      * SAX events
118      * @param document the Node to process into SAX events
119      * @param handler the DocumentHandler to send events to
120     **/
121     public static void process(Document document, DocumentHandler handler)
122 
123         throws org.xml.sax.SAXException
124 
125     {
126 
127         if (document == null) return;
128 
129         if (handler == null) return;
130 
131 
132 
133         handler.startDocument();
134 
135         processChildren(document, handler);
136 
137         handler.endDocument();
138 
139 
140 
141     } //-- process(Document, DocumentHandler)
142 
143 
144 
145     /**
146 
147      * Breaks down the given node into it's corresponding SAX events
148 
149      * @param node the Node to process into SAX events
150 
151      * @param handler the DocumentHandler to send events to
152 
153     **/
154 
155     public static void process(Node node, DocumentHandler handler)
156 
157         throws org.xml.sax.SAXException
158 
159     {
160 
161 
162 
163         if ((node == null) || (handler == null)) return;
164 
165 
166 
167         switch(node.getNodeType()) {
168 
169             case Node.DOCUMENT_NODE:
170 
171                 process((Document)node, handler);
172 
173                 break;
174 
175             case Node.DOCUMENT_FRAGMENT_NODE:
176 
177                 processChildren(node, handler);
178 
179                 break;
180 
181             case Node.ELEMENT_NODE:
182 
183                 process((Element)node, handler);
184 
185                 break;
186 
187             case Node.CDATA_SECTION_NODE:
188 
189             case Node.TEXT_NODE:
190 
191                 process((Text)node, handler);
192 
193                 break;
194 
195             case Node.PROCESSING_INSTRUCTION_NODE:
196 
197                 process((ProcessingInstruction)node, handler);
198 
199                 break;
200 
201             case Node.COMMENT_NODE:
202 
203 
204 
205             default:
206 
207                 break;
208 
209         }
210 
211 
212 
213     } //-- process(Node, DocumentHandler)
214 
215 
216 
217     //-------------------/
218 
219     //- Private Methods -/
220 
221     //-------------------/
222 
223 
224 
225     /**
226 
227      * Breaks down the given node into it's corresponding SAX events
228 
229      * @param handler the DocumentHandler to send events to
230 
231     **/
232 
233     private static void process(Element element, DocumentHandler handler)
234 
235         throws org.xml.sax.SAXException
236 
237     {
238 
239 
240 
241         String name = element.getNodeName();
242 
243         AttributeList atts
244             = new AttributeListWrapper(element.getAttributes());
245 
246         handler.startElement(name, atts);
247 
248         processChildren(element, handler);
249 
250         handler.endElement(name);
251 
252     } //-- process(Element, DocumentHandler);
253 
254 
255 
256     /**
257 
258      * Breaks down the given node into it's corresponding SAX events
259 
260      * @param handler the DocumentHandler to send events to
261 
262     **/
263 
264     private static void process(Text text, DocumentHandler handler)
265 
266         throws org.xml.sax.SAXException
267 
268     {
269 
270         String data = text.getData();
271 
272         if ((data != null) && (data.length() > 0)) {
273 
274             char[] chars = data.toCharArray();
275 
276             handler.characters(chars, 0, chars.length);
277 
278         }
279 
280     } //-- process(Text, DocumentHandler)
281 
282 
283 
284     /**
285 
286      * Breaks down the given ProcessingInstruction into it's corresponding
287 
288      * SAX event
289 
290      * @param pi the processing instruction to process
291 
292      * @param handler the DocumentHandler to send events to
293 
294     **/
295 
296     private static void process
297 
298         (ProcessingInstruction pi, DocumentHandler handler)
299 
300         throws org.xml.sax.SAXException
301 
302     {
303 
304         handler.processingInstruction(pi.getTarget(),pi.getData());
305 
306 
307 
308     } //-- process(ProcessingInstruction, DocumentHandler);
309 
310 
311 
312     /**
313 
314      * Processes the children of the given Node
315 
316      * @param node the Node to process the children of
317 
318      * @param handler the DocumentHandler to send events to
319 
320     **/
321 
322     private static void processChildren
323 
324         (Node node, DocumentHandler handler)
325 
326         throws org.xml.sax.SAXException
327 
328     {
329 
330         Node child = node.getFirstChild();
331 
332         while (child != null) {
333 
334             process(child, handler);
335 
336             child = child.getNextSibling();
337 
338         }
339 
340 
341 
342     } //-- processChildren
343 
344 
345 
346 
347 
348 } //-- DOMEventProducer
349