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; } }