// This software is released into the Public Domain. See copying.txt for details. package org.openstreetmap.osmosis.xml.v0_6.impl; import org.xml.sax.Attributes; import org.openstreetmap.osmosis.core.OsmosisRuntimeException; import org.openstreetmap.osmosis.core.container.v0_6.BoundContainer; import org.openstreetmap.osmosis.core.domain.v0_6.Bound; import org.openstreetmap.osmosis.core.task.v0_6.Sink; import org.openstreetmap.osmosis.xml.common.BaseElementProcessor; /** * Provides an element processor implementation for a node. * * @author Karl Newman * @author Igor Podolskiy */ public class BoundsElementProcessor extends SourceElementProcessor { private Bound bound; private String defaultOrigin; /** * Creates a new instance. * * @param parentProcessor * The parent of this element processor. * @param sink * The sink for receiving processed data. * @param enableDateParsing * If true, dates will be parsed from xml data, else the current date will be used * thus saving parsing time. * @param defaultOrigin * The origin to set on the bound entity if there is no explicit origin defined. */ public BoundsElementProcessor(BaseElementProcessor parentProcessor, Sink sink, boolean enableDateParsing, String defaultOrigin) { super(parentProcessor, sink, enableDateParsing); this.defaultOrigin = defaultOrigin; } /** * {@inheritDoc} */ @Override public void begin(Attributes attributes) { double bottom = getRequiredDoubleValue(attributes, XmlConstants.ATTRIBUTE_NAME_MINLAT); double left = getRequiredDoubleValue(attributes, XmlConstants.ATTRIBUTE_NAME_MINLON); double top = getRequiredDoubleValue(attributes, XmlConstants.ATTRIBUTE_NAME_MAXLAT); double right = getRequiredDoubleValue(attributes, XmlConstants.ATTRIBUTE_NAME_MAXLON); String origin = attributes.getValue(XmlConstants.ATTRIBUTE_NAME_ORIGIN); if (origin == null) { origin = defaultOrigin; } bound = new Bound(right, left, top, bottom, origin); } private double getRequiredDoubleValue(Attributes attributes, String attributeName) { String valueString = attributes.getValue(attributeName); if (valueString == null) { throw new OsmosisRuntimeException(String.format( "Required attribute %s of the bounds element is missing", attributeName)); } try { return Double.parseDouble(valueString); } catch (NumberFormatException e) { throw new OsmosisRuntimeException( String.format("Cannot parse the %s attribute of the bounds element", attributeName), e); } } /** * {@inheritDoc} */ @Override public void end() { getSink().process(new BoundContainer(bound)); bound = null; } }