1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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
179
180
181 protected Object createNode(Object name, Map attributes) {
182 return createNode(name, attributes, null);
183 }
184 }