// This software is released into the Public Domain. See copying.txt for details. package org.openstreetmap.osmosis.xml.v0_6.impl; import org.openstreetmap.osmosis.core.OsmosisRuntimeException; import org.openstreetmap.osmosis.core.task.v0_6.ChangeSink; import org.openstreetmap.osmosis.xml.common.ElementProcessor; import org.xml.sax.Attributes; import org.xml.sax.helpers.DefaultHandler; /** * This class is a SAX default handler for processing OSM Change XML files. It * utilises a tree of element processors to extract the data from the xml * structure. * * @author Brett Henderson */ public class OsmChangeHandler extends DefaultHandler { private static final String ELEMENT_NAME_OSM_CHANGE = "osmChange"; /** * The root element processor used to process the osm change element. */ private ElementProcessor changeSourceElementProcessor; /** * The currently active element processor. This is updated whenever new xml * elements are entered or exited. */ private ElementProcessor elementProcessor; /** * @param changeSink * The changeSink to write data to. * @param enableDateParsing * If true, dates will be parsed from xml data, else the current * date will be used thus saving parsing time. */ public OsmChangeHandler(ChangeSink changeSink, boolean enableDateParsing) { changeSourceElementProcessor = new ChangeSourceElementProcessor(null, changeSink, enableDateParsing); } /** * Begins processing of a new element. * * @param uri * The uri. * @param localName * The localName. * @param qName * The qName. * @param attributes * The attributes. */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) { // Get the appropriate element processor for the element. if (elementProcessor != null) { // We already have an active element processor, therefore use the // active element processor to retrieve the appropriate child // element processor. elementProcessor = elementProcessor.getChild(uri, localName, qName); } else if (ELEMENT_NAME_OSM_CHANGE.equals(qName)) { // There is no active element processor which means we have // encountered the root osm element. elementProcessor = changeSourceElementProcessor; } else { // There is no active element processor which means that this is a // root element. The root element in this case does not match the // expected name. throw new OsmosisRuntimeException("This does not appear to be an OSM Change XML file."); } // Initialise the element processor with the attributes of the new element. elementProcessor.begin(attributes); } /** * Ends processing of the current element. * * @param uri * The uri. * @param localName * The localName. * @param qName * The qName. */ @Override public void endElement(String uri, String localName, String qName) { // Tell the currently active element processor to complete its processing. elementProcessor.end(); // Set the active element processor to the parent of the existing processor. elementProcessor = elementProcessor.getParent(); } }