1 package es.inteco.eni.xml;
2
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.Map;
6
7 import org.apache.log4j.Logger;
8 import org.xml.sax.Attributes;
9 import org.xml.sax.SAXException;
10 import org.xml.sax.SAXParseException;
11 import org.xml.sax.helpers.AttributesImpl;
12 import org.xml.sax.helpers.DefaultHandler;
13
14 import es.inteco.eni.utils.ExceptionUtils;
15
16
17
18
19
20
21
22 public class XmlValidationHandler extends DefaultHandler {
23
24
25
26
27 private static Logger logger = Logger.getLogger(XmlValidationHandler.class);
28
29
30
31
32 private boolean validationError;
33
34
35
36 private SAXParseException saxParseExceptionError;
37
38
39
40 private XmlTree xmlTree;
41
42 private List<String> positionInTree = new ArrayList<String>();
43
44
45
46
47
48 public boolean isValidationError() {
49 return validationError;
50 }
51
52
53
54
55
56 public void setValidationError(boolean validationError) {
57 this.validationError = validationError;
58 }
59
60
61
62
63
64 public SAXParseException getSaxParseExceptionError() {
65 return saxParseExceptionError;
66 }
67
68
69
70
71
72 public void setSaxParseExceptionError(SAXParseException saxParseExceptionError) {
73 this.saxParseExceptionError = saxParseExceptionError;
74 }
75
76
77
78
79 public XmlTree getXmlTree() {
80 return xmlTree;
81 }
82
83
84
85
86
87 public void setXmlTree(XmlTree xmlTree) {
88 this.xmlTree = xmlTree;
89 }
90
91
92
93
94 public List<String> getPositionInTree() {
95 return positionInTree;
96 }
97
98
99
100
101 @Override
102 public void error(SAXParseException exception) throws SAXException{
103 setValidationError(true);
104 setSaxParseExceptionError(exception);
105 logger.debug(ExceptionUtils.stackTraceToString(exception));
106 }
107
108
109
110
111
112 @Override
113 public void fatalError(SAXParseException exception) throws SAXException{
114 setValidationError(true);
115 setSaxParseExceptionError(exception);
116 logger.debug(ExceptionUtils.stackTraceToString(exception));
117 }
118
119
120
121
122 @Override
123 public void warning(SAXParseException exception) throws SAXException{
124 logger.debug(ExceptionUtils.stackTraceToString(exception));
125 }
126
127
128
129
130
131
132
133 public void startDocument(){
134 xmlTree = new XmlTree();
135 }
136
137
138
139
140
141
142 public void startElement(String uri,String qName,String lName,Attributes attributes){
143 XmlNode parentNode = getActualTreeNode();
144
145 XmlNode xmlNode = new XmlNode();
146 xmlNode.setAttributes(new AttributesImpl(attributes));
147 xmlNode.setlName(lName);
148 xmlNode.setqName(qName);
149 xmlNode.setUri(uri);
150 xmlNode.setDeep(getPositionInTree().size()+1);
151 xmlNode.setParent(parentNode);
152
153
154 if(xmlNode.getDeep()>xmlTree.getDeep()){
155 xmlTree.setDeep(xmlNode.getDeep());
156 }
157
158 int childsSize = xmlTree.getXmlNodes().size();
159 if(parentNode!=null){
160 childsSize = parentNode.getChilds().size();
161 }
162 String nodeId = qName + "-" +xmlNode.getDeep() + "-" + childsSize;
163
164 if(parentNode==null){
165 xmlTree.getXmlNodes().put(nodeId, xmlNode);
166 }else{
167 parentNode.getChilds().put(nodeId, xmlNode);
168 }
169
170 downLevelInTree(nodeId);
171 }
172
173
174
175
176
177
178 public void endElement(String uri,String qName,String lName){
179 upLevelInTree();
180 }
181
182
183
184
185
186 public void characters(char[] ch, int start, int length) {
187 String value = getActualTreeNode().getValue()!=null ? getActualTreeNode().getValue() : "";
188 getActualTreeNode().setValue(value + new String(ch, start, length));
189 }
190
191
192
193
194
195
196 private void downLevelInTree(String nodeId) {
197 getPositionInTree().add(nodeId);
198 }
199
200
201
202
203 private void upLevelInTree() {
204 getPositionInTree().remove(getPositionInTree().size()-1);
205 }
206
207
208
209
210
211 private XmlNode getActualTreeNode() {
212 XmlNode result = null;
213 List<String> position = getPositionInTree();
214 Map<String, XmlNode> childs = xmlTree.getXmlNodes();
215 for(String nodeId : position){
216 result = childs.get(nodeId);
217 if(result.getChilds().size()>0){
218 childs = result.getChilds();
219 }
220 }
221 return result;
222 }
223
224
225 }