View Javadoc

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   * Handler para la validación del XML
18   * 
19   * 
20   *
21   */
22  public class XmlValidationHandler extends DefaultHandler {
23  
24  	/**
25  	 * Log
26  	 */
27  	private static Logger logger = Logger.getLogger(XmlValidationHandler.class);
28  
29  	/**
30  	 * Errores de validacion
31  	 */
32  	private boolean  validationError; 
33  	/**
34  	 * Error al parsear
35  	 */
36  	private SAXParseException saxParseExceptionError; 
37  	/**
38  	 * Representacion del arbol XML
39  	 */
40  	private XmlTree xmlTree;
41  
42  	private List<String> positionInTree = new ArrayList<String>();
43  
44  
45  	/**
46  	 * @return Devuelve el valor del campo validationError
47  	 */
48  	public boolean isValidationError() {
49  		return validationError;
50  	}
51  
52  
53  	/**
54  	 * @param Asigna al campo validationError el valor del parámetro validationError
55  	 */
56  	public void setValidationError(boolean validationError) {
57  		this.validationError = validationError;
58  	}
59  
60  
61  	/**
62  	 * @return Devuelve el valor del campo saxParseExceptionError
63  	 */
64  	public SAXParseException getSaxParseExceptionError() {
65  		return saxParseExceptionError;
66  	}
67  
68  
69  	/**
70  	 * @param Asigna al campo saxParseExceptionError el valor del parámetro saxParseExceptionError
71  	 */
72  	public void setSaxParseExceptionError(SAXParseException saxParseExceptionError) {
73  		this.saxParseExceptionError = saxParseExceptionError;
74  	}
75  
76  	/**
77  	 * @return Devuelve el valor del campo xmlTree
78  	 */
79  	public XmlTree getXmlTree() {
80  		return xmlTree;
81  	}
82  
83  
84  	/**
85  	 * @param Asigna al campo xmlTree el valor del parámetro xmlTree
86  	 */
87  	public void setXmlTree(XmlTree xmlTree) {
88  		this.xmlTree = xmlTree;
89  	}
90  
91  	/**
92  	 * @return Devuelve el valor del campo positionInTree
93  	 */
94  	public List<String> getPositionInTree() {
95  		return positionInTree;
96  	}
97  
98  	/**
99  	 * @see org.xml.sax.helpers.DefaultHandler#error(org.xml.sax.SAXParseException)
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 	 * @see org.xml.sax.helpers.DefaultHandler#fatalError(org.xml.sax.SAXParseException)
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 	 * @see org.xml.sax.helpers.DefaultHandler#warning(org.xml.sax.SAXParseException)
121 	 */
122 	@Override
123 	public void warning(SAXParseException exception) throws SAXException{
124 		logger.debug(ExceptionUtils.stackTraceToString(exception));
125 	}
126 
127 
128 
129 	/**
130 	 * 
131 	 * @see org.xml.sax.helpers.DefaultHandler#startDocument()
132 	 */
133 	public void startDocument(){
134 		xmlTree = new XmlTree();
135 	}
136 
137 
138 	/**
139 	 * 
140 	 * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
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 		//Profundidad del arbol
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 	 * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
177 	 */
178 	public void endElement(String uri,String qName,String lName){
179 		upLevelInTree();       
180 	}
181 	
182 	/**
183 	 * 
184 	 * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
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 	 * Baja un nivel
194 	 * @param nodeId
195 	 */
196 	private void downLevelInTree(String nodeId) {
197 		getPositionInTree().add(nodeId);
198 	}
199 
200 	/**
201 	 * Sube un nivel
202 	 */
203 	private void upLevelInTree() {
204 		getPositionInTree().remove(getPositionInTree().size()-1);
205 	}
206 
207 	/**
208 	 * Devuelve el nodo actual
209 	 * @return nodo
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 }