Ticket #7670: 7670.patch

File 7670.patch, 7.0 KB (added by simon04, 10 years ago)
  • src/org/openstreetmap/josm/gui/io/DownloadPrimitivesTask.java

    commit b7818048454d74aad6475b72587cd926ec8a833c
    Author: Simon Legner <Simon.Legner@gmail.com>
    Date:   Thu Sep 10 10:50:58 2015 +0200
    
        v1
    
    diff --git a/src/org/openstreetmap/josm/gui/io/DownloadPrimitivesTask.java b/src/org/openstreetmap/josm/gui/io/DownloadPrimitivesTask.java
    index 30a96d6..4e3b707 100644
    a b import org.openstreetmap.josm.gui.PleaseWaitRunnable;  
    2323import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    2424import org.openstreetmap.josm.gui.progress.ProgressMonitor;
    2525import org.openstreetmap.josm.gui.util.GuiHelper;
     26import org.openstreetmap.josm.io.MultiFetchOverpassObjectReader;
    2627import org.openstreetmap.josm.io.MultiFetchServerObjectReader;
    2728import org.openstreetmap.josm.io.OsmServerObjectReader;
    2829import org.openstreetmap.josm.io.OsmTransferException;
    public class DownloadPrimitivesTask extends PleaseWaitRunnable {  
    140141        try {
    141142            synchronized (this) {
    142143                if (canceled) return;
    143                 multiObjectReader = new MultiFetchServerObjectReader();
     144                multiObjectReader = new MultiFetchOverpassObjectReader();
    144145            }
    145146            initMultiFetchReader(multiObjectReader);
    146147            theirDataSet = multiObjectReader.parseOsm(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
  • new file src/org/openstreetmap/josm/io/MultiFetchOverpassObjectReader.java

    diff --git a/src/org/openstreetmap/josm/io/MultiFetchOverpassObjectReader.java b/src/org/openstreetmap/josm/io/MultiFetchOverpassObjectReader.java
    new file mode 100644
    index 0000000..10b25b7
    - +  
     1package org.openstreetmap.josm.io;
     2
     3import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
     4import org.openstreetmap.josm.tools.Utils;
     5
     6import java.util.Set;
     7
     8public class MultiFetchOverpassObjectReader extends MultiFetchServerObjectReader {
     9
     10    @Override
     11    protected String buildRequestString(final OsmPrimitiveType type, Set<Long> idPackage) {
     12        final Utils.Function<Long, Object> toOverpassExpression = new Utils.Function<Long, Object>() {
     13            @Override
     14            public Object apply(Long x) {
     15                return type.getAPIName() + "(" + x + ");>;";
     16            }
     17        };
     18        final String query = "(" + Utils.join("", Utils.transform(idPackage, toOverpassExpression)) + ");out meta;";
     19        return "interpreter?data=" + Utils.encodeUrl(query);
     20    }
     21
     22    @Override
     23    protected String getBaseUrl() {
     24        return "http://overpass-api.de/api/";
     25    }
     26}
  • src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java

    diff --git a/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java b/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
    index 3e68202..cc81a74 100644
    a b import java.io.InputStream;  
    99import java.net.HttpURLConnection;
    1010import java.util.ArrayList;
    1111import java.util.Collection;
     12import java.util.Collections;
    1213import java.util.HashSet;
    1314import java.util.Iterator;
    1415import java.util.LinkedHashSet;
    public class MultiFetchServerObjectReader extends OsmServerReader{  
    265266     * @param idPackage  the package of ids
    266267     * @return the request string
    267268     */
    268     protected static String buildRequestString(OsmPrimitiveType type, Set<Long> idPackage) {
    269         StringBuilder sb = new StringBuilder();
    270         sb.append(type.getAPIName()).append("s?")
    271         .append(type.getAPIName()).append("s=");
    272 
    273         Iterator<Long> it = idPackage.iterator();
    274         for (int i = 0; i < idPackage.size(); i++) {
    275             sb.append(it.next());
    276             if (i < idPackage.size()-1) {
    277                 sb.append(',');
    278             }
    279         }
    280         return sb.toString();
     269    protected String buildRequestString(final OsmPrimitiveType type, Set<Long> idPackage) {
     270        return type.getAPIName() + "s?" + type.getAPIName() + "s=" + Utils.join(",", idPackage);
    281271    }
    282272
    283     /**
    284      * builds the Multi Get request string for a single id and a given {@link OsmPrimitiveType}.
    285      *
    286      * @param type The primitive type. Must be one of {@link OsmPrimitiveType#NODE NODE}, {@link OsmPrimitiveType#WAY WAY},
    287      * {@link OsmPrimitiveType#RELATION RELATION}
    288      * @param id the id
    289      * @return the request string
    290      */
    291     protected static String buildRequestString(OsmPrimitiveType type, long id) {
    292         StringBuilder sb = new StringBuilder();
    293         sb.append(type.getAPIName()).append("s?")
    294         .append(type.getAPIName()).append("s=")
    295         .append(id);
    296         return sb.toString();
     273    @Override
     274    protected String getBaseUrl() {
     275        return super.getBaseUrl();
    297276    }
    298277
    299278    protected void rememberNodesOfIncompleteWaysToLoad(DataSet from) {
    public class MultiFetchServerObjectReader extends OsmServerReader{  
    328307     */
    329308    protected void fetchPrimitives(Set<Long> ids, OsmPrimitiveType type, ProgressMonitor progressMonitor) throws OsmTransferException {
    330309        String msg = "";
    331         String baseUrl = OsmApi.getOsmApi().getBaseUrl();
     310        final String baseUrl = getBaseUrl();
    332311        switch (type) {
    333312            case NODE:     msg = tr("Fetching a package of nodes from ''{0}''",     baseUrl); break;
    334313            case WAY:      msg = tr("Fetching a package of ways from ''{0}''",      baseUrl); break;
    public class MultiFetchServerObjectReader extends OsmServerReader{  
    453432     * The inheritance of {@link OsmServerReader} is only explained by the need to have a distinct OSM connection by {@code Fetcher} instance.
    454433     * @see FetchResult
    455434     */
    456     protected static class Fetcher extends OsmServerReader implements Callable<FetchResult> {
     435    protected class Fetcher extends OsmServerReader implements Callable<FetchResult> {
    457436
    458437        private final Set<Long> pkg;
    459438        private final OsmPrimitiveType type;
    public class MultiFetchServerObjectReader extends OsmServerReader{  
    503482            }
    504483        }
    505484
     485        @Override
     486        protected String getBaseUrl() {
     487            return MultiFetchServerObjectReader.this.getBaseUrl();
     488        }
     489
    506490        /**
    507491         * invokes a Multi Get for a set of ids and a given {@link OsmPrimitiveType}.
    508492         * The retrieved primitives are merged to {@link #outputDataSet}.
    public class MultiFetchServerObjectReader extends OsmServerReader{  
    542526         * @throws OsmTransferException if an error occurs while communicating with the API server
    543527         */
    544528        protected DataSet singleGetId(OsmPrimitiveType type, long id, ProgressMonitor progressMonitor) throws OsmTransferException {
    545             String request = buildRequestString(type, id);
     529            String request = buildRequestString(type, Collections.singleton(id));
    546530            DataSet result = null;
    547531            try (InputStream in = getInputStream(request, NullProgressMonitor.INSTANCE)) {
    548532                if (in == null) return null;