1 15 package org.apache.hivemind.parse; 16 17 import java.util.ArrayList ; 18 import java.util.HashMap ; 19 import java.util.List ; 20 import java.util.Map ; 21 22 import org.apache.hivemind.ApplicationRuntimeException; 23 import org.apache.hivemind.HiveMind; 24 import org.apache.hivemind.Location; 25 import org.apache.hivemind.Resource; 26 import org.apache.hivemind.impl.LocationImpl; 27 import org.xml.sax.Attributes ; 28 import org.xml.sax.Locator ; 29 import org.xml.sax.SAXException ; 30 import org.xml.sax.SAXParseException ; 31 import org.xml.sax.helpers.DefaultHandler ; 32 33 45 public abstract class AbstractParser extends DefaultHandler 46 { 47 48 52 private static class Item 53 { 54 StringBuffer _buffer; 55 56 String _elementName; 57 58 boolean _ignoreCharacterData; 59 60 Object _object; 61 62 65 int _priorState; 66 67 Item(String elementName, Object object, int priorState, boolean ignoreCharacterData) 68 { 69 _elementName = elementName; 70 _object = object; 71 _priorState = priorState; 72 _ignoreCharacterData = ignoreCharacterData; 73 } 74 75 void addContent(char[] buffer, int start, int length) 76 { 77 if (_ignoreCharacterData) 78 return; 79 80 if (_buffer == null) 81 _buffer = new StringBuffer (length); 82 83 _buffer.append(buffer, start, length); 84 } 85 86 String getContent() 87 { 88 if (_buffer != null) 89 return _buffer.toString().trim(); 90 91 return null; 92 } 93 } 94 95 private int _currentColumn; 96 97 private int _currentLine; 98 99 private Location _location; 100 101 private Locator _locator; 102 103 private Resource _resource; 104 105 private List _stack; 106 107 private int _state; 108 109 private Item _top; 110 111 116 public void characters(char[] ch, int start, int length) throws SAXException 117 { 118 _top.addContent(ch, start, length); 119 } 120 121 124 public void error(SAXParseException ex) throws SAXException 125 { 126 fatalError(ex); 127 } 128 129 134 public void fatalError(SAXParseException ex) throws SAXException 135 { 136 throw ex; 137 } 138 139 143 protected String getElementPath() 144 { 145 StringBuffer buffer = new StringBuffer (); 146 147 int count = _stack.size(); 148 for (int i = 0; i < count; i++) 149 { 150 if (i > 0) 151 buffer.append('/'); 152 153 Item item = (Item) _stack.get(i); 154 155 buffer.append(item._elementName); 156 } 157 158 return buffer.toString(); 159 } 160 161 164 protected Location getLocation() 165 { 166 int line = _locator.getLineNumber(); 167 int column = _locator.getColumnNumber(); 168 169 if (line != _currentLine || column != _currentColumn) 170 _location = null; 171 172 if (_location == null) 173 _location = new LocationImpl(_resource, line, column); 174 175 _currentLine = line; 176 _currentColumn = column; 177 178 return _location; 179 } 180 181 184 185 protected Resource getResource() 186 { 187 return _resource; 188 } 189 190 195 protected int getState() 196 { 197 return _state; 198 } 199 200 209 protected void initializeParser(Resource resource, int startState) 210 { 211 _resource = resource; 212 _stack = new ArrayList (); 213 214 _location = null; 215 _state = startState; 216 } 217 218 222 protected String peekContent() 223 { 224 return _top.getContent(); 225 } 226 227 230 protected String peekElementName() 231 { 232 return _top._elementName; 233 } 234 235 238 239 protected Object peekObject() 240 { 241 return _top._object; 242 } 243 244 249 protected void pop() 250 { 251 int count = _stack.size(); 252 253 _state = _top._priorState; 254 255 _stack.remove(count - 1); 256 257 if (count == 1) 258 _top = null; 259 else 260 _top = (Item) _stack.get(count - 2); 261 } 262 263 274 protected void push(String elementName, Object object, int state) 275 { 276 push(elementName, object, state, true); 277 } 278 279 294 protected void push(String elementName, Object object, int state, boolean ignoreCharacterData) 295 { 296 HiveMind.setLocation(object, getLocation()); 297 298 Item item = new Item(elementName, object, _state, ignoreCharacterData); 299 300 _stack.add(item); 301 302 _top = item; 303 _state = state; 304 } 305 306 309 protected void resetParser() 310 { 311 _resource = null; 312 _locator = null; 313 _stack = null; 314 _location = null; 315 } 316 317 320 public void setDocumentLocator(Locator locator) 321 { 322 _locator = locator; 323 } 324 325 328 protected void setState(int state) 329 { 330 _state = state; 331 } 332 333 340 protected void unexpectedElement(String elementName) 341 { 342 throw new ApplicationRuntimeException(ParseMessages.unexpectedElement( 343 elementName, 344 getElementPath()), getLocation(), null); 345 } 346 347 353 protected void updateObject(Object object) 354 { 355 _top._object = object; 356 } 357 358 361 public void warning(SAXParseException ex) throws SAXException 362 { 363 fatalError(ex); 364 } 365 366 private Map constructAttributesMap(Attributes attributes) 367 { 368 Map result = new HashMap (); 369 int count = attributes.getLength(); 370 371 for (int i = 0; i < count; i++) 372 { 373 String key = attributes.getLocalName(i); 374 375 if (HiveMind.isBlank(key)) 376 key = attributes.getQName(i); 377 378 String value = attributes.getValue(i); 379 380 result.put(key, value); 381 } 382 383 return result; 384 } 385 386 390 protected abstract void begin(String elementName, Map attributes); 391 392 397 398 protected abstract void end(String elementName); 399 400 public void endElement(String uri, String localName, String qName) throws SAXException 401 { 402 end(getElementName(localName, qName)); 403 } 404 405 public void startElement(String uri, String localName, String qName, Attributes attributes) 406 throws SAXException 407 { 408 String elementName = getElementName(localName, qName); 409 410 begin(elementName, constructAttributesMap(attributes)); 411 } 412 413 private String getElementName(String localName, String qName) 414 { 415 return qName != null ? qName : localName; 416 } 417 } | Popular Tags |