package se.kodapan.osm.sweden.ext.se.posten.postnummer.local;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import se.kodapan.osm.parser.xml.instantiated.InstantiatedOsmXmlParser;
import se.kodapan.osm.domain.Node;
import se.kodapan.osm.services.overpass.Overpass;
import se.kodapan.osm.sweden.ext.se.posten.postnummer.PostenPostnummerService;
import se.kodapan.osm.sweden.ext.se.posten.postnummer.PostenPostnummerServiceRecord;
import se.kodapan.osm.sweden.ext.se.posten.postnummer.PostenPostnummerServiceResponse;
import java.io.StringReader;
import java.util.*;
/**
* @author kalle
* @since 2013-09-02 1:57 PM
*/
public class LocalPostenPostnummerService {
private static Logger log = LoggerFactory.getLogger(LocalPostenPostnummerService.class);
private Root root;
public Root factory(PostenPostnummerService posten, Overpass overpass) throws Exception {
Root root = new Root();
Map<String, Set<String>> postnummerByPostort = posten.gatherAllPostnummerByPostorter();
log.info("Constructing local root from Posten service data...");
for (Map.Entry<String, Set<String>> postortAndPostnummer : postnummerByPostort.entrySet()) {
Postort postort = new Postort();
postort.setIdentity(postortAndPostnummer.getKey());
root.getPostortByIdentity().put(postort.getIdentity(), postort);
for (String postnummerIdentity : postortAndPostnummer.getValue()) {
Postnummer postnummer = new Postnummer();
postnummer.setIdentity(postnummerIdentity);
postnummer.setPostort(postort);
postort.getPostnummer().add(postnummer);
root.getPostnummerByIdentity().put(postnummer.getIdentity(), postnummer);
PostenPostnummerServiceResponse recordsInPostnummer = posten.resolveAllServiceRecordsInPostnummer(postnummer.getIdentity());
for (PostenPostnummerServiceRecord record : recordsInPostnummer.getRecords()) {
PostnummerSegment segment = new PostnummerSegment();
segment.setGatunamn(record.getGatunamn());
segment.setStarthusnummer(record.getStarthusnummer());
segment.setSluthusnummer(record.getSluthusnummer());
segment.setPostnummer(postnummer);
postnummer.getSegmentsByName().add(segment);
postort.getSegmentsByName().add(segment);
root.getSegmentsByName().add(segment);
}
}
}
log.info("Augmenting local root with OSM data...");
InstantiatedOsmXmlParser parser = new InstantiatedOsmXmlParser();
parser.setRoot(new se.kodapan.osm.domain.root.Root());
parser.parse(overpass.execute("<osm-script>\n" +
" <query type=\"node\">\n" +
" <has-kv k=\"ref:se:pts:postort\"/>\n" +
" </query>\n" +
" <print/>\n" +
"</osm-script>"));
for (Node node : parser.getRoot().getNodes().values()) {
Postort postort = root.getPostortByIdentity().get(node.getTag("ref:se:pts:postort"));
if (postort == null) {
throw new RuntimeException("No postort " + node.getTag("ref:se:pts:postort"));
}
postort.getReferencedObjects().add(node);
}
log.info("Local root has been constructed.");
return root;
}
public Root getRoot() {
return root;
}
public void setRoot(Root root) {
this.root = root;
}
}