1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package de.mindcrimeilab.xsanalyzer.xml;
19
20 import java.util.ArrayList;
21 import java.util.Collections;
22 import java.util.List;
23
24 import javax.xml.namespace.QName;
25
26 import org.apache.commons.lang.StringUtils;
27 import org.apache.commons.logging.Log;
28 import org.apache.commons.logging.LogFactory;
29 import org.xml.sax.Attributes;
30 import org.xml.sax.ContentHandler;
31 import org.xml.sax.Locator;
32 import org.xml.sax.SAXException;
33
34
35
36
37
38
39
40
41
42
43 public class AnnotationContentHandler implements ContentHandler {
44
45
46 private static final Log logger = LogFactory.getLog(AnnotationContentHandler.class);
47
48
49 private static final QName XSD_ANNOTATION_TAG = new QName("http://www.w3.org/2001/XMLSchema", "annotation");
50
51
52 private static final QName XSD_DOCUMENTATION_TAG = new QName("http://www.w3.org/2001/XMLSchema", "documentation");
53
54
55 private static final QName XSD_APPINFO_TAG = new QName("http://www.w3.org/2001/XMLSchema", "appinfo");
56
57 private final StringBuilder annotationContent;
58
59
60 private StringBuilder anContent;
61
62
63
64
65
66 private final List<XmlSchemaAnnotation> annotations;
67
68
69
70
71 public AnnotationContentHandler() {
72 annotationContent = new StringBuilder();
73 annotations = new ArrayList<XmlSchemaAnnotation>();
74 }
75
76
77
78
79
80
81
82 public List<XmlSchemaAnnotation> getAnnotations() {
83 return Collections.unmodifiableList(annotations);
84 }
85
86
87
88 @Override
89 public void characters(char[] ch, int start, int length) throws SAXException {
90 annotationContent.append(ch, start, length);
91 if (null != anContent) {
92 anContent.append(ch, start, length);
93 }
94 }
95
96 @Override
97 public void endDocument() throws SAXException {
98 logger.debug("Annotation content [" + annotationContent.toString() + "]");
99 }
100
101 @Override
102 public void endElement(String uri, String localName, String qName) throws SAXException {
103 annotationContent.append("</").append(qName).append(">");
104 if (StringUtils.equals(XSD_APPINFO_TAG.getNamespaceURI(), uri) && StringUtils.equals(XSD_APPINFO_TAG.getLocalPart(), localName)) {
105 logger.debug("found appinfo end tag ");
106 annotations.add(new XmlSchemaAnnotation(XmlSchemaAnnotation.Type.APPINFO, anContent.toString()));
107 anContent = null;
108 }
109 else if (StringUtils.equals(XSD_DOCUMENTATION_TAG.getNamespaceURI(), uri) && StringUtils.equals(XSD_DOCUMENTATION_TAG.getLocalPart(), localName)) {
110 logger.debug("found documentation end tag");
111 annotations.add(new XmlSchemaAnnotation(XmlSchemaAnnotation.Type.DOCUMENTATION, anContent.toString()));
112 anContent = null;
113 }
114 else if (null != anContent) {
115 anContent.append("</").append(qName).append(">");
116 }
117
118 }
119
120 @Override
121 public void endPrefixMapping(String arg0) throws SAXException {
122
123
124 }
125
126 @Override
127 public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
128
129
130 }
131
132 @Override
133 public void processingInstruction(String target, String data) throws SAXException {
134
135
136 }
137
138 @Override
139 public void setDocumentLocator(Locator locator) {
140
141
142 }
143
144 @Override
145 public void skippedEntity(String name) throws SAXException {
146
147
148 }
149
150 @Override
151 public void startDocument() throws SAXException {
152
153
154 }
155
156 @Override
157 public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
158 if (StringUtils.equals(XSD_ANNOTATION_TAG.getNamespaceURI(), uri) && StringUtils.equals(XSD_ANNOTATION_TAG.getLocalPart(), localName)) {
159 logger.debug("found annotation tag");
160 }
161 else if (StringUtils.equals(XSD_APPINFO_TAG.getNamespaceURI(), uri) && StringUtils.equals(XSD_APPINFO_TAG.getLocalPart(), localName)) {
162 logger.debug("found appinfo tag");
163 anContent = new StringBuilder();
164 }
165 else if (StringUtils.equals(XSD_DOCUMENTATION_TAG.getNamespaceURI(), uri) && StringUtils.equals(XSD_DOCUMENTATION_TAG.getLocalPart(), localName)) {
166 logger.debug("found documentation tag");
167 anContent = new StringBuilder();
168 }
169 else if (null != anContent) {
170 anContent.append("<").append(qName);
171 for (int i = 0; i < atts.getLength(); ++i) {
172 annotationContent.append(" ").append(atts.getQName(i)).append("=\"").append(atts.getValue(i)).append("\"");
173 anContent.append(" ").append(atts.getQName(i)).append("=\"").append(atts.getValue(i)).append("\"");
174 }
175 anContent.append(">");
176 }
177
178 annotationContent.append("<").append(qName);
179 for (int i = 0; i < atts.getLength(); ++i) {
180 annotationContent.append(" ").append(atts.getQName(i)).append("=\"").append(atts.getValue(i)).append("\"");
181 }
182 annotationContent.append(">");
183
184 }
185
186 @Override
187 public void startPrefixMapping(String prefix, String uri) throws SAXException {
188
189
190 }
191
192 public String getAnnotationContent() {
193 return annotationContent.toString();
194 }
195 }