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;
|
23 | 23 | import org.openstreetmap.josm.gui.layer.OsmDataLayer; |
24 | 24 | import org.openstreetmap.josm.gui.progress.ProgressMonitor; |
25 | 25 | import org.openstreetmap.josm.gui.util.GuiHelper; |
| 26 | import org.openstreetmap.josm.io.MultiFetchOverpassObjectReader; |
26 | 27 | import org.openstreetmap.josm.io.MultiFetchServerObjectReader; |
27 | 28 | import org.openstreetmap.josm.io.OsmServerObjectReader; |
28 | 29 | import org.openstreetmap.josm.io.OsmTransferException; |
… |
… |
public class DownloadPrimitivesTask extends PleaseWaitRunnable {
|
140 | 141 | try { |
141 | 142 | synchronized (this) { |
142 | 143 | if (canceled) return; |
143 | | multiObjectReader = new MultiFetchServerObjectReader(); |
| 144 | multiObjectReader = new MultiFetchOverpassObjectReader(); |
144 | 145 | } |
145 | 146 | initMultiFetchReader(multiObjectReader); |
146 | 147 | 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
-
|
+
|
|
| 1 | package org.openstreetmap.josm.io; |
| 2 | |
| 3 | import org.openstreetmap.josm.data.osm.OsmPrimitiveType; |
| 4 | import org.openstreetmap.josm.tools.Utils; |
| 5 | |
| 6 | import java.util.Set; |
| 7 | |
| 8 | public 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 | } |
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;
|
9 | 9 | import java.net.HttpURLConnection; |
10 | 10 | import java.util.ArrayList; |
11 | 11 | import java.util.Collection; |
| 12 | import java.util.Collections; |
12 | 13 | import java.util.HashSet; |
13 | 14 | import java.util.Iterator; |
14 | 15 | import java.util.LinkedHashSet; |
… |
… |
public class MultiFetchServerObjectReader extends OsmServerReader{
|
265 | 266 | * @param idPackage the package of ids |
266 | 267 | * @return the request string |
267 | 268 | */ |
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); |
281 | 271 | } |
282 | 272 | |
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(); |
297 | 276 | } |
298 | 277 | |
299 | 278 | protected void rememberNodesOfIncompleteWaysToLoad(DataSet from) { |
… |
… |
public class MultiFetchServerObjectReader extends OsmServerReader{
|
328 | 307 | */ |
329 | 308 | protected void fetchPrimitives(Set<Long> ids, OsmPrimitiveType type, ProgressMonitor progressMonitor) throws OsmTransferException { |
330 | 309 | String msg = ""; |
331 | | String baseUrl = OsmApi.getOsmApi().getBaseUrl(); |
| 310 | final String baseUrl = getBaseUrl(); |
332 | 311 | switch (type) { |
333 | 312 | case NODE: msg = tr("Fetching a package of nodes from ''{0}''", baseUrl); break; |
334 | 313 | case WAY: msg = tr("Fetching a package of ways from ''{0}''", baseUrl); break; |
… |
… |
public class MultiFetchServerObjectReader extends OsmServerReader{
|
453 | 432 | * The inheritance of {@link OsmServerReader} is only explained by the need to have a distinct OSM connection by {@code Fetcher} instance. |
454 | 433 | * @see FetchResult |
455 | 434 | */ |
456 | | protected static class Fetcher extends OsmServerReader implements Callable<FetchResult> { |
| 435 | protected class Fetcher extends OsmServerReader implements Callable<FetchResult> { |
457 | 436 | |
458 | 437 | private final Set<Long> pkg; |
459 | 438 | private final OsmPrimitiveType type; |
… |
… |
public class MultiFetchServerObjectReader extends OsmServerReader{
|
503 | 482 | } |
504 | 483 | } |
505 | 484 | |
| 485 | @Override |
| 486 | protected String getBaseUrl() { |
| 487 | return MultiFetchServerObjectReader.this.getBaseUrl(); |
| 488 | } |
| 489 | |
506 | 490 | /** |
507 | 491 | * invokes a Multi Get for a set of ids and a given {@link OsmPrimitiveType}. |
508 | 492 | * The retrieved primitives are merged to {@link #outputDataSet}. |
… |
… |
public class MultiFetchServerObjectReader extends OsmServerReader{
|
542 | 526 | * @throws OsmTransferException if an error occurs while communicating with the API server |
543 | 527 | */ |
544 | 528 | 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)); |
546 | 530 | DataSet result = null; |
547 | 531 | try (InputStream in = getInputStream(request, NullProgressMonitor.INSTANCE)) { |
548 | 532 | if (in == null) return null; |