commit f9b6849a844329b96bfed184cfc224141f9cd5a8
Author: Simon Legner <Simon.Legner@gmail.com>
Date:   2020-04-11 19:39:24 +0200

    fix #19071 - Tag2Link: obtain rules via Apache Ivy and org.webjars.npm

diff --git a/build.xml b/build.xml
index 77a24027c..bf67bdfa1 100644
--- a/build.xml
+++ b/build.xml
@@ -1055,6 +1055,12 @@ Build-Date: ${build.tstamp}
         <ivy:cachepath log="download-only" pathid="test.path" conf="test"/>
     </target>
     <target name="extract-libraries" depends="resolve" description="extract libraries to build dir">
+        <unzip dest="${build.dir}">
+            <fileset refid="runtime.fileset"/>
+            <patternset>
+                <include name="META-INF/resources/webjars/tag2link/*/index.json"/>
+            </patternset>
+        </unzip>
         <unzip dest="${build.dir}">
             <fileset refid="runtime.fileset"/>
             <patternset>
diff --git a/ivy.xml b/ivy.xml
index 55f43c995..d99f56381 100644
--- a/ivy.xml
+++ b/ivy.xml
@@ -30,6 +30,7 @@
         <dependency conf="api->default" org="org.tukaani" name="xz" rev="1.8"/>
         <dependency conf="api->default" org="com.drewnoakes" name="metadata-extractor" rev="2.13.0"/>
         <dependency conf="api->default" org="ch.poole" name="OpeningHoursParser" rev="0.21.1"/>
+        <dependency conf="api->default" org="org.webjars.npm" name="tag2link" rev="2020.4.6"/>
         <!-- sources->sources -->
         <dependency conf="sources->sources" org="org.openstreetmap.jmapviewer" name="jmapviewer" rev="2.13"/>
         <dependency conf="sources->sources" org="javax.json" name="javax.json-api" rev="1.1.4"/>
@@ -40,6 +41,7 @@
         <dependency conf="sources->sources" org="org.tukaani" name="xz" rev="1.8"/>
         <dependency conf="sources->sources" org="com.drewnoakes" name="metadata-extractor" rev="2.13.0"/>
         <dependency conf="sources->sources" org="ch.poole" name="OpeningHoursParser" rev="0.21.1"/>
+        <dependency conf="sources->sources" org="org.webjars.npm" name="tag2link" rev="2020.4.6"/>
         <!-- commonslang->default -->
         <dependency conf="commonslang->default" org="org.apache.commons" name="commons-lang3" rev="3.10"/>
         <!-- jacocoant->default -->
diff --git a/resources/data/tag2link.sophox.sparql b/resources/data/tag2link.sophox.sparql
deleted file mode 100644
index 045ec234b..000000000
--- a/resources/data/tag2link.sophox.sparql
+++ /dev/null
@@ -1,5 +0,0 @@
-SELECT (CONCAT("Key:", ?permanent_key_ID) as ?OSM_key) ?formatter_URL WHERE {
-  ?item osmdt:P2 osmd:Q7.
-  ?item osmdt:P16 ?permanent_key_ID.
-  ?item osmdt:P8 ?formatter_URL.
-}
diff --git a/resources/data/tag2link.wikidata.sparql b/resources/data/tag2link.wikidata.sparql
deleted file mode 100644
index 3a67b5af7..000000000
--- a/resources/data/tag2link.wikidata.sparql
+++ /dev/null
@@ -1,10 +0,0 @@
-SELECT ?OSM_key ?formatter_URL WHERE {
-  { ?item wdt:P1282 ?OSM_key. }
-  FILTER(STRSTARTS(?OSM_key, 'Key:')) .
-
-  {
-    { ?item wdt:P1630 ?formatter_URL. }
-    UNION
-    { ?item wdt:P3303 ?formatter_URL. }
-  }
-}
diff --git a/src/org/openstreetmap/josm/tools/Tag2Link.java b/src/org/openstreetmap/josm/tools/Tag2Link.java
index c778461f4..2fcd89d05 100644
--- a/src/org/openstreetmap/josm/tools/Tag2Link.java
+++ b/src/org/openstreetmap/josm/tools/Tag2Link.java
@@ -4,11 +4,10 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 import static org.openstreetmap.josm.tools.I18n.trn;
 
-import java.io.BufferedReader;
 import java.io.IOException;
+import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 import java.util.Map;
 import java.util.function.UnaryOperator;
@@ -23,8 +22,6 @@
 import javax.json.JsonValue;
 
 import org.openstreetmap.josm.data.osm.OsmUtils;
-import org.openstreetmap.josm.io.CachedFile;
-import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
  * Extracts web links from OSM tags.
@@ -79,8 +76,7 @@ private Tag2Link() {
     public static void initialize() {
         try {
             wikidataRules.clear();
-            fetchRulesViaSPARQL("resource://data/tag2link.wikidata.sparql", Config.getUrls().getJOSMWebsite() + "/remote/wikidata-sparql");
-            fetchRulesViaSPARQL("resource://data/tag2link.sophox.sparql", Config.getUrls().getJOSMWebsite() + "/remote/sophox-sparql");
+            initializeFromResources();
         } catch (Exception e) {
             Logging.error("Failed to initialize tag2link rules");
             Logging.error(e);
@@ -88,29 +84,21 @@ public static void initialize() {
     }
 
     /**
-     * Fetches rules from Wikidata using a SPARQL query.
+     * Initializes the tag2link rules from the resources.
      *
-     * @param query the SPARQL query
-     * @param server the query server
      * @throws IOException in case of I/O error
      */
-    private static void fetchRulesViaSPARQL(final String query, final String server) throws IOException {
-        final int initialSize = wikidataRules.size();
-        final String sparql;
-        try (CachedFile cachedFile = new CachedFile(query)) {
-            sparql = new String(cachedFile.getByteContent(), StandardCharsets.UTF_8);
-        }
-
+    private static void initializeFromResources() throws IOException {
+        final String resource = "META-INF/resources/webjars/tag2link/2020.4.6/index.json";
         final JsonArray rules;
-        try (CachedFile cachedFile = new CachedFile(server + "?query=" + Utils.encodeUrl(sparql));
-             BufferedReader reader = cachedFile.setHttpAccept("application/json").getContentReader();
-             JsonReader jsonReader = Json.createReader(reader)) {
-            rules = jsonReader.read().asJsonObject().getJsonObject("results").getJsonArray("bindings");
+        try (InputStream inputStream = Tag2Link.class.getClassLoader().getResourceAsStream(resource);
+             JsonReader jsonReader = Json.createReader(inputStream)) {
+            rules = jsonReader.readArray();
         }
 
         for (JsonValue rule : rules) {
-            final String key = rule.asJsonObject().getJsonObject("OSM_key").getString("value");
-            final String url = rule.asJsonObject().getJsonObject("formatter_URL").getString("value");
+            final String key = rule.asJsonObject().getString("key");
+            final String url = rule.asJsonObject().getString("url");
             if (key.startsWith("Key:")) {
                 wikidataRules.put(key.substring("Key:".length()), url);
             }
@@ -119,11 +107,11 @@ private static void fetchRulesViaSPARQL(final String query, final String server)
         Stream.of("image", "url", "website", "wikidata", "wikimedia_commons")
                 .forEach(wikidataRules::remove);
 
-        final int size = wikidataRules.size() - initialSize;
+        final int size = wikidataRules.size();
         Logging.info(trn(
                 "Obtained {0} Tag2Link rule from {1}",
                 "Obtained {0} Tag2Link rules from {1}",
-                size, size, server));
+                size, size, resource));
     }
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/tools/Tag2LinkTest.java b/test/unit/org/openstreetmap/josm/tools/Tag2LinkTest.java
index 1e1bc16fd..4a2a8928b 100644
--- a/test/unit/org/openstreetmap/josm/tools/Tag2LinkTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/Tag2LinkTest.java
@@ -23,6 +23,15 @@ void checkLinks(String... expected) {
         Assert.assertEquals(Arrays.asList(expected), links);
     }
 
+    /**
+     * Unit test of function {@link Tag2Link#initialize()}.
+     */
+    @Test
+    public void testInitialize() {
+        Tag2Link.initialize();
+        Assert.assertTrue("obtains at least 40 rules", Tag2Link.wikidataRules.size() > 40);
+    }
+
     /**
      * Unit test of function {@link Tag2Link#getLinksForTag}.
      */
diff --git a/test/unit/org/openstreetmap/josm/tools/Tag2LinkTestIT.java b/test/unit/org/openstreetmap/josm/tools/Tag2LinkTestIT.java
deleted file mode 100644
index 0dc69c7cb..000000000
--- a/test/unit/org/openstreetmap/josm/tools/Tag2LinkTestIT.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.tools;
-
-import org.junit.Assert;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-
-/**
- * Integration tests for the {@link Tag2Link}
- */
-public class Tag2LinkTestIT {
-
-    /**
-     * Setup rule
-     */
-    @ClassRule
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public static JOSMTestRules test = new JOSMTestRules().timeout(20_000);
-
-    /**
-     * Integration test of function {@link org.openstreetmap.josm.tools.Tag2Link#initialize()}.
-     */
-    @Test
-    public void testInitialize() {
-        Tag2Link.initialize();
-        Assert.assertTrue("obtails at least 40 rules", Tag2Link.wikidataRules.size() > 40);
-    }
-}
