View Javadoc

1   /*
2    $Id: SAXBuilder.java,v 1.4 2004/04/27 02:25:29 spullara Exp $
3   
4    Copyright 2003 (C) James Strachan and Bob Mcwhirter. All Rights Reserved.
5   
6    Redistribution and use of this software and associated documentation
7    ("Software"), with or without modification, are permitted provided
8    that the following conditions are met:
9   
10   1. Redistributions of source code must retain copyright
11      statements and notices.  Redistributions must also contain a
12      copy of this document.
13  
14   2. Redistributions in binary form must reproduce the
15      above copyright notice, this list of conditions and the
16      following disclaimer in the documentation and/or other
17      materials provided with the distribution.
18  
19   3. The name "groovy" must not be used to endorse or promote
20      products derived from this Software without prior written
21      permission of The Codehaus.  For written permission,
22      please contact info@codehaus.org.
23  
24   4. Products derived from this Software may not be called "groovy"
25      nor may "groovy" appear in their names without prior written
26      permission of The Codehaus. "groovy" is a registered
27      trademark of The Codehaus.
28  
29   5. Due credit should be given to The Codehaus -
30      http://groovy.codehaus.org/
31  
32   THIS SOFTWARE IS PROVIDED BY THE CODEHAUS AND CONTRIBUTORS
33   ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
34   NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
35   FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
36   THE CODEHAUS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
37   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
38   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
39   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
40   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
41   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
42   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
43   OF THE POSSIBILITY OF SUCH DAMAGE.
44  
45   */
46  package groovy.xml;
47  
48  import groovy.util.BuilderSupport;
49  
50  import java.util.Iterator;
51  import java.util.Map;
52  
53  import org.xml.sax.Attributes;
54  import org.xml.sax.ContentHandler;
55  import org.xml.sax.SAXException;
56  import org.xml.sax.helpers.AttributesImpl;
57  
58  /***
59   * A helper class for creating a W3C D
60   * 
61   * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
62   * @version $Revision: 1.4 $
63   */
64  public class SAXBuilder extends BuilderSupport {
65  
66      private ContentHandler handler;
67      private Attributes emptyAttributes = new AttributesImpl();
68  
69      public SAXBuilder(ContentHandler handler) {
70          this.handler = handler;
71      }
72  
73      protected void setParent(Object parent, Object child) {
74      }
75  
76      protected Object createNode(Object name) {
77          doStartElement(name, emptyAttributes);
78          return name;
79      }
80  
81      protected Object createNode(Object name, Object value) {
82          doStartElement(name, emptyAttributes);
83          doText(value);
84          return name;
85      }
86  
87      /***
88       * @param value
89       */
90      private void doText(Object value) {
91          try {
92              char[] text = value.toString().toCharArray();
93              handler.characters(text, 0, text.length);
94          }
95          catch (SAXException e) {
96              handleException(e);
97          }
98      }
99  
100     protected Object createNode(Object name, Map attributeMap, Object text) {
101         AttributesImpl attributes = new AttributesImpl();
102         for (Iterator iter = attributeMap.entrySet().iterator(); iter.hasNext();) {
103             Map.Entry entry = (Map.Entry) iter.next();
104             Object key = entry.getKey();
105             Object value = entry.getValue();
106             String uri = "";
107             String localName = null;
108             String qualifiedName = "";
109             String valueText = (value != null) ? value.toString() : "";
110             if (key instanceof QName) {
111                 QName qname = (QName) key;
112                 uri = qname.getNamespaceURI();
113                 localName = qname.getLocalPart();
114                 qualifiedName = qname.getQualifiedName();
115             }
116             else {
117                 localName = key.toString();
118                 qualifiedName = localName;
119             }
120 
121             attributes.addAttribute(uri, localName, qualifiedName, "CDATA", valueText);
122         }
123         doStartElement(name, attributes);
124         if (text != null) {
125             doText(text);
126         }
127         return name;
128     }
129 
130     protected void doStartElement(Object name, Attributes attributes) {
131         String uri = "";
132         String localName = null;
133         String qualifiedName = "";
134         if (name instanceof QName) {
135             QName qname = (QName) name;
136             uri = qname.getNamespaceURI();
137             localName = qname.getLocalPart();
138             qualifiedName = qname.getQualifiedName();
139         }
140         else {
141             localName = name.toString();
142             qualifiedName = localName;
143         }
144         try {
145             handler.startElement(uri, localName, qualifiedName, attributes);
146         }
147         catch (SAXException e) {
148             handleException(e);
149         }
150     }
151 
152     protected void nodeCompleted(Object parent, Object name) {
153         String uri = "";
154         String localName = null;
155         String qualifiedName = "";
156         if (name instanceof QName) {
157             QName qname = (QName) name;
158             uri = qname.getNamespaceURI();
159             localName = qname.getLocalPart();
160             qualifiedName = qname.getQualifiedName();
161         }
162         else {
163             localName = name.toString();
164             qualifiedName = localName;
165         }
166         try {
167             handler.endElement(uri, localName, qualifiedName);
168         }
169         catch (SAXException e) {
170             handleException(e);
171         }
172     }
173 
174     protected void handleException(SAXException e) {
175         throw new RuntimeException(e);
176     }
177 
178     /* (non-Javadoc)
179      * @see groovy.util.BuilderSupport#createNode(java.lang.Object, java.util.Map, java.lang.Object)
180      */
181     protected Object createNode(Object name, Map attributes) {
182         return createNode(name, attributes, null);
183     }
184 }