Changeset 15952 in josm


Ignore:
Timestamp:
2020-02-28T21:42:52+01:00 (4 years ago)
Author:
Don-vip
Message:

see #18772 - better error message, add non-regression tests

Location:
trunk
Files:
3 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/tools/Territories.java

    r15939 r15952  
    22package org.openstreetmap.josm.tools;
    33
     4import static java.util.Optional.ofNullable;
    45import static org.openstreetmap.josm.tools.I18n.tr;
    56
     
    2223import javax.json.Json;
    2324import javax.json.JsonArray;
    24 import javax.json.JsonObject;
    2525import javax.json.JsonString;
    2626import javax.json.JsonValue;
     
    163163    private static void initializeExternalData() {
    164164        taginfoGeofabrikCache = new TreeMap<>();
    165         try (CachedFile cf = new CachedFile(Config.getUrls().getJOSMWebsite() + "/remote/geofabrik-index-v1-nogeom.json");
    166                 InputStream is = cf.getInputStream();
    167                 JsonParser json = Json.createParser(is)) {
     165        initializeExternalData(taginfoGeofabrikCache, "Geofabrik",
     166                Config.getUrls().getJOSMWebsite() + "/remote/geofabrik-index-v1-nogeom.json");
     167    }
     168
     169    static void initializeExternalData(Map<String, TaginfoRegionalInstance> cache, String source, String path) {
     170        try (CachedFile cf = new CachedFile(path); InputStream is = cf.getInputStream(); JsonParser json = Json.createParser(is)) {
    168171            while (json.hasNext()) {
    169172                Event event = json.next();
    170173                if (event == Event.START_OBJECT) {
    171174                    for (JsonValue feature : json.getObject().getJsonArray("features")) {
    172                         JsonObject props = feature.asJsonObject().getJsonObject("properties");
    173                         if (props != null) {
    174                             JsonObject urls = props.getJsonObject("urls");
    175                             if (urls != null) {
    176                                 String taginfo = urls.getString(TAGINFO);
    177                                 if (taginfo != null) {
    178                                     JsonArray iso1 = props.getJsonArray(ISO3166_1_LC);
    179                                     JsonArray iso2 = props.getJsonArray(ISO3166_2_LC);
    180                                     if (iso1 != null) {
    181                                         readExternalTaginfo(taginfo, iso1);
    182                                     } else if (iso2 != null) {
    183                                         readExternalTaginfo(taginfo, iso2);
    184                                     }
    185                                 }
     175                        ofNullable(feature.asJsonObject().getJsonObject("properties")).ifPresent(props ->
     176                        ofNullable(props.getJsonObject("urls")).ifPresent(urls ->
     177                        ofNullable(urls.getString(TAGINFO)).ifPresent(taginfo -> {
     178                            JsonArray iso1 = props.getJsonArray(ISO3166_1_LC);
     179                            JsonArray iso2 = props.getJsonArray(ISO3166_2_LC);
     180                            if (iso1 != null) {
     181                                readExternalTaginfo(cache, taginfo, iso1, source);
     182                            } else if (iso2 != null) {
     183                                readExternalTaginfo(cache, taginfo, iso2, source);
    186184                            }
    187                         }
     185                        })));
    188186                    }
    189187                }
    190188            }
    191189        } catch (IOException | JsonParsingException e) {
    192             Logging.trace(e);
    193             Logging.warn(tr("Failed to parse taginfo data geofabrik-index-v1-nogeom.json"));
    194         }
    195     }
    196 
    197     private static void readExternalTaginfo(String taginfo, JsonArray jsonCodes) {
     190            Logging.debug(e);
     191            Logging.warn(tr("Failed to parse external taginfo data at {0}: {1}", path, e.getMessage()));
     192        }
     193    }
     194
     195    private static void readExternalTaginfo(Map<String, TaginfoRegionalInstance> cache, String taginfo, JsonArray jsonCodes, String source) {
    198196        Set<String> isoCodes = jsonCodes.getValuesAs(JsonString.class).stream().map(JsonString::getString).collect(Collectors.toSet());
    199         isoCodes.forEach(s -> taginfoGeofabrikCache.put(s, new TaginfoRegionalInstance(taginfo, isoCodes, "Geofabrik")));
     197        isoCodes.forEach(s -> cache.put(s, new TaginfoRegionalInstance(taginfo, isoCodes, source)));
    200198    }
    201199
  • trunk/test/unit/org/openstreetmap/josm/tools/TerritoriesTest.java

    r14138 r15952  
    22package org.openstreetmap.josm.tools;
    33
     4import static java.util.Collections.singleton;
    45import static org.junit.Assert.assertTrue;
     6import static org.junit.jupiter.api.Assertions.assertEquals;
     7
     8import java.util.Arrays;
     9import java.util.HashSet;
     10import java.util.Map;
     11import java.util.Set;
     12import java.util.TreeMap;
    513
    614import org.junit.Rule;
    715import org.junit.Test;
     16import org.openstreetmap.josm.TestUtils;
    817import org.openstreetmap.josm.data.coor.LatLon;
    918import org.openstreetmap.josm.testutils.JOSMTestRules;
     
    4554        }
    4655    }
     56
     57    /**
     58     * Test of {@link Territories#initializeExternalData} - nominal case
     59     */
     60    @Test
     61    public void testTaginfoGeofabrik_nominal() {
     62        Map<String, TaginfoRegionalInstance> cache = new TreeMap<>();
     63        Territories.initializeExternalData(cache, "foo", TestUtils.getTestDataRoot() + "/taginfo/geofabrik-index-v1-nogeom.json");
     64        assertEquals(5, cache.size());
     65        checkTaginfoInstance(cache.get("AF"), singleton("AF"), "https://taginfo.geofabrik.de/asia/afghanistan/");
     66        checkTaginfoInstance(cache.get("AL"), singleton("AL"), "https://taginfo.geofabrik.de/europe/albania/");
     67        checkTaginfoInstance(cache.get("CA-AB"), singleton("CA-AB"), "https://taginfo.geofabrik.de/north-america/canada/alberta/");
     68        Set<String> israelAndPalestine = new HashSet<>(Arrays.asList("PS", "IL"));
     69        checkTaginfoInstance(cache.get("PS"), israelAndPalestine, "https://taginfo.geofabrik.de/asia/israel-and-palestine/");
     70        checkTaginfoInstance(cache.get("IL"), israelAndPalestine, "https://taginfo.geofabrik.de/asia/israel-and-palestine/");
     71    }
     72
     73    private static void checkTaginfoInstance(TaginfoRegionalInstance instance, Set<String> expectedIsoCodes, String expectedUrl) {
     74        assertEquals(expectedIsoCodes, instance.getIsoCodes());
     75        assertEquals("foo", instance.getSuffix());
     76        assertEquals(expectedUrl, instance.getUrl());
     77    }
     78
     79    /**
     80     * Test of {@link Territories#initializeExternalData} - broken contents
     81     */
     82    @Test
     83    public void testTaginfoGeofabrik_broken() {
     84        Map<String, TaginfoRegionalInstance> cache = new TreeMap<>();
     85        Logging.clearLastErrorAndWarnings();
     86        Territories.initializeExternalData(cache, "foo", TestUtils.getTestDataRoot() + "taginfo/geofabrik-index-v1-nogeom-broken.json");
     87        assertTrue(cache.isEmpty());
     88        assertEquals("W: Failed to parse external taginfo data at test/data/taginfo/geofabrik-index-v1-nogeom-broken.json: " +
     89                "Invalid token=EOF at (line no=3, column no=49, offset=97). Expected tokens are: " +
     90                "[CURLYOPEN, SQUAREOPEN, STRING, NUMBER, TRUE, FALSE, NULL, SQUARECLOSE]",
     91                Logging.getLastErrorAndWarnings().get(0));
     92    }
    4793}
Note: See TracChangeset for help on using the changeset viewer.