// License: GPL. For details, see LICENSE file.
package org.openstreetmap.hot.sds;
import org.openstreetmap.josm.data.osm.DataSet;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* Parser for answers from SDS. These anwers look like this:
*
* <pre>
<?xml version="1.0" encoding="UTF-8"?>
<osm_sds>
<osm_shadow osm_id="499770" osm_type="way">
<tag k="hot:bbb:grant_received_date" v="a"/>
<tag k="hot:bbb:grant_received" v="b"/>
<tag k="hot:bbb:home_owner_name" v="lll"/>
</osm_shadow>
</osm_sds>
* </pre>
* @author Frederik Ramm
*/
public class SdsParser extends DefaultHandler {
private DataSet dataSet;
private OsmPrimitive currentPrimitive;
private SeparateDataStorePlugin plugin;
private boolean ensureMatch;
public SdsParser(DataSet ds, SeparateDataStorePlugin p, boolean ensureMatch) {
this.dataSet = ds;
plugin = p;
this.ensureMatch = ensureMatch;
}
public SdsParser(DataSet ds, SeparateDataStorePlugin p) {
this(ds, p, true);
}
@Override public void endElement(String namespaceURI, String localName, String qName) {
// after successfully reading a full set of tags from the separate data store,
// update it in our cache so we can determine changes later.
if ("osm_shadow".equals(qName) && currentPrimitive != null) {
plugin.learn(currentPrimitive.save());
}
}
@Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
if ("osm_shadow".equals(qName)) {
String type = atts.getValue("osm_type");
String id = atts.getValue("osm_id");
currentPrimitive = dataSet.getPrimitiveById(Long.parseLong(id), OsmPrimitiveType.fromApiTypeName(type));
if (currentPrimitive == null && ensureMatch) {
throw new SAXException("unexpected object in response");
}
} else if ("tag".equals(qName)) {
String v = atts.getValue("v");
String k = atts.getValue("k");
if (currentPrimitive != null) currentPrimitive.put(k, v);
}
}
}