// License: GPL. Copyright 2007-2008 by Brett Henderson and other contributors. // Modified by Ruediger Lunde, 2009 package aimax.osm.reader; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import aimax.osm.data.EntityAttributeManager; import aimax.osm.data.MapBuilder; import aimax.osm.data.entities.EntityAttribute; /** * Provides an element processor implementation for a way. * @author Ruediger Lunde */ public class WayElementProcessor extends ElementProcessor implements TagListener { private static final String ELEMENT_NAME_TAG = "tag"; private static final String ELEMENT_NAME_NODE = "nd"; private static final String ATTRIBUTE_NAME_ID = "id"; // private static final String ATTRIBUTE_NAME_TIMESTAMP = "timestamp"; // private static final String ATTRIBUTE_NAME_USER = "user"; // private static final String ATTRIBUTE_NAME_USERID = "uid"; // private static final String ATTRIBUTE_NAME_CHANGESET_ID = "changeset"; // private static final String ATTRIBUTE_NAME_VERSION = "version"; private TagElementProcessor tagElementProcessor; private WayNodeElementProcessor wayNodeElementProcessor; private long wayId; private String wayName; private List<EntityAttribute> wayAttributes; private List<Long> wayNodeIds; private boolean skipElement; /** * Creates a new instance. * * @param parentProcessor * The parent of this element processor. * @param mdConsumer * The sink for receiving processed data. */ public WayElementProcessor(ElementProcessor parentProcessor, MapBuilder mdConsumer) { super(parentProcessor, mdConsumer); tagElementProcessor = new TagElementProcessor(this, this); wayNodeElementProcessor = new WayNodeElementProcessor(this, this); wayAttributes = new ArrayList<EntityAttribute>(); wayNodeIds = new ArrayList<Long>(); } /** * {@inheritDoc} */ public void begin(Attributes attributes) { wayId = Long.parseLong(attributes.getValue(ATTRIBUTE_NAME_ID)); skipElement = getMapBuilder().isWayDefined(wayId); if (!skipElement) { wayName = null; wayAttributes.clear(); wayNodeIds.clear(); } } /** * Retrieves the appropriate child element processor for the newly * encountered nested element. * * @param uri * The element uri. * @param localName * The element localName. * @param qName * The element qName. * @return The appropriate element processor for the nested element. */ @Override public ElementProcessor getChild(String uri, String localName, String qName) { if (!skipElement) { if (ELEMENT_NAME_NODE.equals(qName)) return wayNodeElementProcessor; else if (ELEMENT_NAME_TAG.equals(qName)) return tagElementProcessor; } return super.getChild(uri, localName, qName); } /** * {@inheritDoc} */ public void end() { if (!skipElement) getMapBuilder().addWay(wayId, wayName, wayAttributes, wayNodeIds); } /** * This is called by child element processors when a tag object is * encountered. * * @param tag * The tag to be processed. */ public void processTag(Tag tag) { String key = tag.getKey(); String value = tag.getValue(); if (key.equals("name")) { wayName = value; } else { EntityAttribute att = EntityAttributeManager.instance().intern (new EntityAttribute(key, value)); if (att != null) wayAttributes.add(att); } } /** * This is called by child element processors when a way node object is * encountered. * * @param nodeId * The id of the way node to be processed. */ public void addWayNode(long nodeId) { wayNodeIds.add(nodeId); } }