package cz.nalezen.osm.extractor.cp; import java.io.BufferedReader; import java.io.FileReader; import org.apache.commons.lang.math.NumberUtils; import org.apache.log4j.Logger; import cz.nalezen.osm.extractor.data.City; import cz.nalezen.osm.extractor.data.City.AuxiliaryData; import cz.nalezen.osm.extractor.data.CzechRepublicAddresses; import cz.nalezen.osm.extractor.data.District; public class CzechPostDataLoader { private CzechRepublicAddresses root; private String path; private static final Logger logger = Logger.getLogger(CzechPostDataLoader.class); public CzechPostDataLoader(CzechRepublicAddresses root, String path) { this.root = root; this.path = path; } public void load() { boolean first = true; try(BufferedReader br = new BufferedReader(new FileReader(path))) { for(String line; (line = br.readLine()) != null; ) { //skip header if (first) { first = false; continue; } parsePostCode(line); } } catch (Exception e) { throw new RuntimeException(e); } } private void parsePostCode(String line) { String[] items = line.split("\\|"); if (items.length!=6) { throw new RuntimeException(); } int postCode = NumberUtils.toInt(items[1], -1); String districtName = items[4]; String cityName = items[5]; District district = root.lookupDistrict(districtName); if (district==null) { logger.warn(String.format("Cannot lookup district '%s'!", districtName)); return; } City city = district.lookupCity(cityName); if (city==null) { logger.warn(String.format("Cannot lookup city '%s' within district '%s'!", cityName, districtName)); return; } AuxiliaryData aux = city.assureAuxiliaryData(); if (postCode<aux.minPostcodeMvcr || postCode>aux.maxPostcodeMvcr) { logger.warn(String.format("City '%s' within district '%s' is out of postcode range - %d! Allowed range <%d, %d>", cityName, districtName, postCode, aux.minPostcodeMvcr, aux.maxPostcodeMvcr)); } city.getPostcodes().add(postCode); } }