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; |