Ticket #18164: 18164.patch

File 18164.patch, 12.1 KB (added by simon04, 4 years ago)
  • src/org/openstreetmap/josm/gui/download/OverpassQueryWizardDialog.java

    commit 1bd6c58c8c6d6d733d8a8051c22826620eb353d1
    Author: Simon Legner <Simon.Legner@gmail.com>
    Date:   2020-02-29 23:51:15 +0100
    
        fix #18164 - Migrate OverpassTurboQueryWizard to overpass-wizard-server
    
    diff --git a/src/org/openstreetmap/josm/gui/download/OverpassQueryWizardDialog.java b/src/org/openstreetmap/josm/gui/download/OverpassQueryWizardDialog.java
    index 891c991c1..5de809442 100644
    a b  
    55
    66import java.awt.GridBagLayout;
    77import java.awt.event.ActionEvent;
     8import java.io.IOException;
    89import java.util.ArrayList;
    910import java.util.Arrays;
    1011import java.util.Collections;
    private void saveHistory() {  
    143144    private Optional<String> tryParseSearchTerm(String searchTerm) {
    144145        try {
    145146            return Optional.of(overpassQueryBuilder.constructQuery(searchTerm));
    146         } catch (UncheckedParseException | IllegalStateException ex) {
     147        } catch (IOException | UncheckedParseException ex) {
    147148            Logging.error(ex);
    148149            JOptionPane.showMessageDialog(
    149150                    dsPanel.getParent(),
  • src/org/openstreetmap/josm/tools/OverpassTurboQueryWizard.java

    diff --git a/src/org/openstreetmap/josm/tools/OverpassTurboQueryWizard.java b/src/org/openstreetmap/josm/tools/OverpassTurboQueryWizard.java
    index fc4c340f8..4f7b17f1d 100644
    a b  
    22package org.openstreetmap.josm.tools;
    33
    44import java.io.IOException;
    5 import java.io.Reader;
     5import java.net.URL;
    66
    7 import javax.script.Invocable;
    8 import javax.script.ScriptEngine;
    9 import javax.script.ScriptException;
    10 
    11 import org.openstreetmap.josm.io.CachedFile;
    127import org.openstreetmap.josm.spi.preferences.Config;
    138
    149/**
    1510 * Uses <a href="https://github.com/tyrasd/overpass-wizard/">Overpass Turbo query wizard</a> code (MIT Licensed)
    1611 * to build an Overpass QL from a {@link org.openstreetmap.josm.actions.search.SearchAction} like query.
    1712 *
    18  * Requires a JavaScript {@link ScriptEngine}.
     13 * This involves a HTTP request to an overpass-wizard-server.
    1914 * @since 8744
    2015 */
    2116public final class OverpassTurboQueryWizard {
    2217
    2318    private static OverpassTurboQueryWizard instance;
    24     private final ScriptEngine engine = Utils.getJavaScriptEngine();
    2519
    2620    /**
    2721     * Replies the unique instance of this class.
    public static synchronized OverpassTurboQueryWizard getInstance() {  
    3529        return instance;
    3630    }
    3731
    38     private OverpassTurboQueryWizard() {
    39         try (CachedFile file = new CachedFile("resource://data/overpass-wizard.js");
    40              Reader reader = file.getContentReader()) {
    41             if (engine != null) {
    42                 engine.eval("var console = {error: " + Logging.class.getCanonicalName() + ".warn};");
    43                 engine.eval("var global = {};");
    44                 engine.eval(reader);
    45                 engine.eval("var overpassWizardJOSM = function(query) {" +
    46                         "  return overpassWizard(query, {" +
    47                         "    comment: false," +
    48                         "    timeout: " + Config.getPref().getInt("overpass.wizard.timeout", 90) + "," +
    49                         "    outputFormat: 'xml'," +
    50                         "    outputMode: 'recursive_meta'" +
    51                         "  });" +
    52                         "}");
    53             }
    54         } catch (ScriptException | IOException ex) {
    55             throw new IllegalStateException("Failed to initialize OverpassTurboQueryWizard", ex);
    56         }
    57     }
    58 
    5932    /**
    6033     * Builds an Overpass QL from a {@link org.openstreetmap.josm.actions.search.SearchAction} like query.
    6134     * @param search the {@link org.openstreetmap.josm.actions.search.SearchAction} like query
    6235     * @return an Overpass QL query
    6336     * @throws UncheckedParseException when the parsing fails
     37     * @throws IOException in case of I/O error
    6438     */
    65     public String constructQuery(String search) {
    66         if (engine == null) {
    67             throw new IllegalStateException("Failed to retrieve JavaScript engine");
    68         }
    69         try {
    70             final Object result = ((Invocable) engine).invokeFunction("overpassWizardJOSM", search);
    71             if (Boolean.FALSE.equals(result)) {
    72                 throw new UncheckedParseException();
    73             }
    74             return (String) result;
    75         } catch (NoSuchMethodException e) {
    76             throw new IllegalStateException(e);
    77         } catch (ScriptException e) {
    78             throw new UncheckedParseException("Failed to execute OverpassTurboQueryWizard", e);
     39    public String constructQuery(String search) throws UncheckedParseException, IOException {
     40        String url = Config.getPref().get("overpass.wizard.server", "https://overpass-wizard.josm.eu/overpass-wizard/")
     41                + "?search=" + Utils.encodeUrl(search)
     42                + "&comment=false"
     43                + "&timeout=" + Config.getPref().getInt("overpass.wizard.timeout", 90)
     44                + "&outputFormat=xml"
     45                + "&outputMode=recursive_meta";
     46        final String query = HttpClient.create(new URL(url))
     47                .connect()
     48                .fetchContent();
     49        if ("false".equals(query)) {
     50            throw new UncheckedParseException();
    7951        }
     52        return query;
    8053    }
    8154}
  • test/unit/org/openstreetmap/josm/io/OverpassDownloadReaderTest.java

    diff --git a/test/unit/org/openstreetmap/josm/io/OverpassDownloadReaderTest.java b/test/unit/org/openstreetmap/josm/io/OverpassDownloadReaderTest.java
    index 8c2d6831e..fe96ccca0 100644
    a b  
    1010import static org.junit.Assert.assertNull;
    1111import static org.junit.Assert.assertTrue;
    1212
     13import java.io.IOException;
    1314import java.io.StringReader;
    1415import java.time.LocalDateTime;
    1516import java.util.regex.Matcher;
    public void setUp() {  
    5758        NameFinder.NOMINATIM_URL_PROP.put("http://localhost:" + wireMockRule.port() + NOMINATIM_URL_PATH);
    5859    }
    5960
    60     private String getExpandedQuery(String search) {
     61    private String getExpandedQuery(String search) throws IOException {
    6162        final String query = OverpassTurboQueryWizard.getInstance().constructQuery(search);
    6263        final String request = new OverpassDownloadReader(new Bounds(1, 2, 3, 4), null, query)
    6364                .getRequestForBbox(1, 2, 3, 4)
    private String getExpandedQuery(String search) {  
    6970     * Tests evaluating the extended query feature {@code bbox}.
    7071     */
    7172    @Test
    72     public void testBbox() {
     73    public void testBbox() throws IOException {
    7374        final String query = getExpandedQuery("amenity=drinking_water");
    7475        assertEquals("" +
    7576                "[out:xml][timeout:90][bbox:2.0,1.0,4.0,3.0];\n" +
    public void testDate() {  
    118119     * Tests evaluating the extended query feature {@code date} through {@code newer:} operator.
    119120     */
    120121    @Test
    121     public void testDateNewer() {
     122    public void testDateNewer() throws IOException {
    122123        final String query = getExpandedQuery("type:node and newer:3minutes");
    123124        String statement = query.substring(query.indexOf("node(newer:\"") + 12, query.lastIndexOf("\");"));
    124125        assertNotNull(DateUtils.fromString(statement));
    public void testDateNewer() {  
    128129     * Tests evaluating the extended query feature {@code geocodeArea}.
    129130     */
    130131    @Test
    131     public void testGeocodeArea() {
     132    public void testGeocodeArea() throws IOException {
    132133        stubNominatim("London");
    133134        final String query = getExpandedQuery("amenity=drinking_water in London");
    134135        assertEquals("" +
  • test/unit/org/openstreetmap/josm/tools/OverpassTurboQueryWizardTest.java

    diff --git a/test/unit/org/openstreetmap/josm/tools/OverpassTurboQueryWizardTest.java b/test/unit/org/openstreetmap/josm/tools/OverpassTurboQueryWizardTest.java
    index 90a3a2a65..899ae0b7e 100644
    a b  
    33
    44import static org.junit.Assert.assertEquals;
    55
     6import java.io.IOException;
     7
    68import org.junit.Ignore;
    79import org.junit.Rule;
    810import org.junit.Test;
     
    2527     * Test {@code key=value}.
    2628     */
    2729    @Test
    28     public void testKeyValue() {
     30    public void testKeyValue() throws IOException {
    2931        final String query = OverpassTurboQueryWizard.getInstance().constructQuery("amenity=drinking_water");
    3032        assertEquals("" +
    3133                "[out:xml][timeout:90][bbox:{{bbox}}];\n" +
    public void testKeyValue() {  
    4042     * Test {@code key!=value}.
    4143     */
    4244    @Test
    43     public void testKeyNotValue() {
     45    public void testKeyNotValue() throws IOException {
    4446        final String query = OverpassTurboQueryWizard.getInstance().constructQuery("amenity!=drinking_water");
    4547        assertEquals("" +
    4648                "[out:xml][timeout:90][bbox:{{bbox}}];\n" +
    public void testKeyNotValue() {  
    5557     * Test {@code foo=bar and baz=42}.
    5658     */
    5759    @Test
    58     public void testBooleanAnd() {
     60    public void testBooleanAnd() throws IOException {
    5961        final String expected = "" +
    6062                "[out:xml][timeout:90][bbox:{{bbox}}];\n" +
    6163                "(\n" +
    public void testBooleanAnd() {  
    7274     * Test {@code foo=bar or baz=42}.
    7375     */
    7476    @Test
    75     public void testBooleanOr() {
     77    public void testBooleanOr() throws IOException {
    7678        final String expected = "" +
    7779                "[out:xml][timeout:90][bbox:{{bbox}}];\n" +
    7880                "(\n" +
    public void testBooleanOr() {  
    9092     * Test {@code (foo=* or bar=*) and (asd=* or fasd=*)}.
    9193     */
    9294    @Test
    93     public void testBoolean() {
     95    public void testBoolean() throws IOException {
    9496        final String query = OverpassTurboQueryWizard.getInstance().constructQuery("(foo=* or bar=*) and (asd=* or fasd=*)");
    9597        assertEquals("" +
    9698                "[out:xml][timeout:90][bbox:{{bbox}}];\n" +
    public void testBoolean() {  
    108110     * Test {@code foo=bar and (type:node or type:way)}.
    109111     */
    110112    @Test
    111     public void testType() {
     113    public void testType() throws IOException {
    112114        final String query = OverpassTurboQueryWizard.getInstance().constructQuery("foo=bar and (type:node or type:way)");
    113115        assertEquals("" +
    114116                "[out:xml][timeout:90][bbox:{{bbox}}];\n" +
    public void testType() {  
    124126     * Test {@code user:foo or uid:42}.
    125127     */
    126128    @Test
    127     public void testUser() {
     129    public void testUser() throws IOException {
    128130        final String query = OverpassTurboQueryWizard.getInstance().constructQuery("user:foo or uid:42");
    129131        assertEquals("" +
    130132                "[out:xml][timeout:90][bbox:{{bbox}}];\n" +
    public void testUser() {  
    140142     * Test {@code foo=bar and (type:node or type:way)}.
    141143     */
    142144    @Test
    143     public void testEmpty() {
     145    public void testEmpty() throws IOException {
    144146        final String query = OverpassTurboQueryWizard.getInstance().constructQuery("foo='' and type:way");
    145147        assertEquals("" +
    146148                "[out:xml][timeout:90][bbox:{{bbox}}];\n" +
    public void testEmpty() {  
    155157     * Test geocodeArea.
    156158     */
    157159    @Test
    158     public void testInArea() {
     160    public void testInArea() throws IOException {
    159161        final String query = OverpassTurboQueryWizard.getInstance().constructQuery("foo=bar in Josmland");
    160162        assertEquals("" +
    161163                "[out:xml][timeout:90];\n" +
    public void testInArea() {  
    172174     */
    173175    @Test
    174176    @Ignore("preset handling not implemented")
    175     public void testPreset() {
     177    public void testPreset() throws IOException {
    176178        final String query = OverpassTurboQueryWizard.getInstance().constructQuery("Hospital");
    177179        assertEquals("" +
    178180                "[out:xml][timeout:90];\n" +
    public void testPreset() {  
    187189     * Test erroneous value.
    188190     */
    189191    @Test(expected = UncheckedParseException.class)
    190     public void testErroneous() {
     192    public void testErroneous() throws IOException {
    191193        OverpassTurboQueryWizard.getInstance().constructQuery("foo");
    192194    }
    193195}