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/src/org/openstreetmap/josm/gui/io/DownloadPrimitivesTask.java
+++ b/src/org/openstreetmap/josm/gui/io/DownloadPrimitivesTask.java
@@ -23,6 +23,7 @@ import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.io.MultiFetchOverpassObjectReader;
 import org.openstreetmap.josm.io.MultiFetchServerObjectReader;
 import org.openstreetmap.josm.io.OsmServerObjectReader;
 import org.openstreetmap.josm.io.OsmTransferException;
@@ -140,7 +141,7 @@ public class DownloadPrimitivesTask extends PleaseWaitRunnable {
         try {
             synchronized (this) {
                 if (canceled) return;
-                multiObjectReader = new MultiFetchServerObjectReader();
+                multiObjectReader = new MultiFetchOverpassObjectReader();
             }
             initMultiFetchReader(multiObjectReader);
             theirDataSet = multiObjectReader.parseOsm(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
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
--- /dev/null
+++ b/src/org/openstreetmap/josm/io/MultiFetchOverpassObjectReader.java
@@ -0,0 +1,26 @@
+package org.openstreetmap.josm.io;
+
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.tools.Utils;
+
+import java.util.Set;
+
+public class MultiFetchOverpassObjectReader extends MultiFetchServerObjectReader {
+
+    @Override
+    protected String buildRequestString(final OsmPrimitiveType type, Set<Long> idPackage) {
+        final Utils.Function<Long, Object> toOverpassExpression = new Utils.Function<Long, Object>() {
+            @Override
+            public Object apply(Long x) {
+                return type.getAPIName() + "(" + x + ");>;";
+            }
+        };
+        final String query = "(" + Utils.join("", Utils.transform(idPackage, toOverpassExpression)) + ");out meta;";
+        return "interpreter?data=" + Utils.encodeUrl(query);
+    }
+
+    @Override
+    protected String getBaseUrl() {
+        return "http://overpass-api.de/api/";
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java b/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
index 3e68202..cc81a74 100644
--- a/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
+++ b/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
@@ -9,6 +9,7 @@ import java.io.InputStream;
 import java.net.HttpURLConnection;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
@@ -265,35 +266,13 @@ public class MultiFetchServerObjectReader extends OsmServerReader{
      * @param idPackage  the package of ids
      * @return the request string
      */
-    protected static String buildRequestString(OsmPrimitiveType type, Set<Long> idPackage) {
-        StringBuilder sb = new StringBuilder();
-        sb.append(type.getAPIName()).append("s?")
-        .append(type.getAPIName()).append("s=");
-
-        Iterator<Long> it = idPackage.iterator();
-        for (int i = 0; i < idPackage.size(); i++) {
-            sb.append(it.next());
-            if (i < idPackage.size()-1) {
-                sb.append(',');
-            }
-        }
-        return sb.toString();
+    protected String buildRequestString(final OsmPrimitiveType type, Set<Long> idPackage) {
+        return type.getAPIName() + "s?" + type.getAPIName() + "s=" + Utils.join(",", idPackage);
     }
 
-    /**
-     * builds the Multi Get request string for a single id and a given {@link OsmPrimitiveType}.
-     *
-     * @param type The primitive type. Must be one of {@link OsmPrimitiveType#NODE NODE}, {@link OsmPrimitiveType#WAY WAY},
-     * {@link OsmPrimitiveType#RELATION RELATION}
-     * @param id the id
-     * @return the request string
-     */
-    protected static String buildRequestString(OsmPrimitiveType type, long id) {
-        StringBuilder sb = new StringBuilder();
-        sb.append(type.getAPIName()).append("s?")
-        .append(type.getAPIName()).append("s=")
-        .append(id);
-        return sb.toString();
+    @Override
+    protected String getBaseUrl() {
+        return super.getBaseUrl();
     }
 
     protected void rememberNodesOfIncompleteWaysToLoad(DataSet from) {
@@ -328,7 +307,7 @@ public class MultiFetchServerObjectReader extends OsmServerReader{
      */
     protected void fetchPrimitives(Set<Long> ids, OsmPrimitiveType type, ProgressMonitor progressMonitor) throws OsmTransferException {
         String msg = "";
-        String baseUrl = OsmApi.getOsmApi().getBaseUrl();
+        final String baseUrl = getBaseUrl();
         switch (type) {
             case NODE:     msg = tr("Fetching a package of nodes from ''{0}''",     baseUrl); break;
             case WAY:      msg = tr("Fetching a package of ways from ''{0}''",      baseUrl); break;
@@ -453,7 +432,7 @@ public class MultiFetchServerObjectReader extends OsmServerReader{
      * The inheritance of {@link OsmServerReader} is only explained by the need to have a distinct OSM connection by {@code Fetcher} instance.
      * @see FetchResult
      */
-    protected static class Fetcher extends OsmServerReader implements Callable<FetchResult> {
+    protected class Fetcher extends OsmServerReader implements Callable<FetchResult> {
 
         private final Set<Long> pkg;
         private final OsmPrimitiveType type;
@@ -503,6 +482,11 @@ public class MultiFetchServerObjectReader extends OsmServerReader{
             }
         }
 
+        @Override
+        protected String getBaseUrl() {
+            return MultiFetchServerObjectReader.this.getBaseUrl();
+        }
+
         /**
          * invokes a Multi Get for a set of ids and a given {@link OsmPrimitiveType}.
          * The retrieved primitives are merged to {@link #outputDataSet}.
@@ -542,7 +526,7 @@ public class MultiFetchServerObjectReader extends OsmServerReader{
          * @throws OsmTransferException if an error occurs while communicating with the API server
          */
         protected DataSet singleGetId(OsmPrimitiveType type, long id, ProgressMonitor progressMonitor) throws OsmTransferException {
-            String request = buildRequestString(type, id);
+            String request = buildRequestString(type, Collections.singleton(id));
             DataSet result = null;
             try (InputStream in = getInputStream(request, NullProgressMonitor.INSTANCE)) {
                 if (in == null) return null;
