Ticket #20416: 20416.4.patch
| File 20416.4.patch, 7.4 KB (added by , 5 years ago) |
|---|
-
src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
38 38 import org.openstreetmap.josm.data.osm.RelationMember; 39 39 import org.openstreetmap.josm.data.osm.SimplePrimitiveId; 40 40 import org.openstreetmap.josm.data.osm.Way; 41 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;42 41 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 43 42 import org.openstreetmap.josm.spi.preferences.Config; 44 43 import org.openstreetmap.josm.tools.Logging; … … 79 78 80 79 protected boolean recurseDownRelations; 81 80 private boolean recurseDownAppended = true; 81 private boolean hideSubTaskDetails; 82 82 83 private ExecutorService exec; 84 83 85 /** 84 86 * Constructs a {@code MultiFetchServerObjectReader}. 85 87 */ … … 301 303 * @throws OsmTransferException if an error occurs while communicating with the API server 302 304 */ 303 305 protected void fetchPrimitives(Set<Long> ids, OsmPrimitiveType type, ProgressMonitor progressMonitor) throws OsmTransferException { 306 int n = ids.size(); 307 if (n == 0) 308 return; 304 309 String msg; 305 310 final String baseUrl = getBaseUrl(); 306 311 switch (type) { 307 // CHECKSTYLE.OFF: SingleSpaceSeparator 308 case NODE: msg = tr("Fetching a package of nodes from ''{0}''", baseUrl); break; 309 case WAY: msg = tr("Fetching a package of ways from ''{0}''", baseUrl); break; 310 case RELATION: msg = tr("Fetching a package of relations from ''{0}''", baseUrl); break; 311 // CHECKSTYLE.ON: SingleSpaceSeparator 312 default: throw new AssertionError(); 312 case NODE: 313 msg = trn("Fetching {0} node from ''{1}''", "Fetching {0} nodes from ''{1}''", n, n, baseUrl); 314 break; 315 case WAY: 316 msg = trn("Fetching {0} way from ''{1}''", "Fetching {0} ways from ''{1}''", n, n, baseUrl); 317 break; 318 case RELATION: 319 msg = trn("Fetching {0} relation from ''{1}''", "Fetching {0} relations from ''{1}''", n, n, baseUrl); 320 break; 321 default: 322 throw new AssertionError(); 313 323 } 324 progressMonitor.setTicks(0); 314 325 progressMonitor.setTicksCount(ids.size()); 315 progressMonitor.setTicks(0); 326 327 hideSubTaskDetails = Config.getPref().getBoolean("download.multi-fetch.hide-monitor-details", false); 328 if (hideSubTaskDetails) 329 progressMonitor.subTask(msg); 330 else 331 progressMonitor.setCustomText(msg); 316 332 // The complete set containing all primitives to fetch 317 333 Set<Long> toFetch = new HashSet<>(ids); 318 334 // Build a list of fetchers that will download smaller sets containing only MAX_IDS_PER_REQUEST (200) primitives each. … … 319 335 // we will run up to MAX_DOWNLOAD_THREADS concurrent fetchers. 320 336 int threadsNumber = Config.getPref().getInt("osm.download.threads", OsmApi.MAX_DOWNLOAD_THREADS); 321 337 threadsNumber = Utils.clamp(threadsNumber, 1, OsmApi.MAX_DOWNLOAD_THREADS); 322 final ExecutorServiceexec = Executors.newFixedThreadPool(338 exec = Executors.newFixedThreadPool( 323 339 threadsNumber, Utils.newThreadFactory(getClass() + "-%d", Thread.NORM_PRIORITY)); 324 340 CompletionService<FetchResult> ecs = new ExecutorCompletionService<>(exec); 325 341 List<Future<FetchResult>> jobs = new ArrayList<>(); … … 328 344 } 329 345 // Run the fetchers 330 346 for (int i = 0; i < jobs.size() && !isCanceled(); i++) { 331 progressMonitor.subTask(msg + "... " + progressMonitor.getTicks() + '/' + progressMonitor.getTicksCount());332 347 try { 333 348 FetchResult result = ecs.take().get(); 334 349 if (result.rc404 != null) { 335 350 List<Long> toSplit = new ArrayList<>(result.rc404); 336 int n = toSplit.size() / 2;337 jobs.add(ecs.submit(new Fetcher(type, new HashSet<>(toSplit.subList(0, n )), progressMonitor)));338 jobs.add(ecs.submit(new Fetcher(type, new HashSet<>(toSplit.subList(n , toSplit.size())), progressMonitor)));351 int num = toSplit.size() / 2; 352 jobs.add(ecs.submit(new Fetcher(type, new HashSet<>(toSplit.subList(0, num)), progressMonitor))); 353 jobs.add(ecs.submit(new Fetcher(type, new HashSet<>(toSplit.subList(num, toSplit.size())), progressMonitor))); 339 354 } 340 355 if (result.missingPrimitives != null) { 341 356 missingPrimitives.addAll(result.missingPrimitives); … … 357 372 job.cancel(true); 358 373 } 359 374 } 375 exec = null; 360 376 } 361 377 362 378 /** … … 618 634 throws OsmTransferException { 619 635 String request = buildRequestString(type, pkg); 620 636 FetchResult result = null; 621 try (InputStream in = getInputStream(request, NullProgressMonitor.INSTANCE)) {637 try (InputStream in = getInputStream(request, progressMonitor.createSubTaskMonitor(1, hideSubTaskDetails))) { 622 638 if (in == null) return null; 623 progressMonitor.subTask(tr("Downloading OSM data..."));624 639 try { 625 result = new FetchResult(OsmReader.parseDataSet(in, progressMonitor.createSubTaskMonitor(pkg.size(), false)), null); 640 result = new FetchResult(OsmReader.parseDataSet(in, 641 progressMonitor.createSubTaskMonitor(pkg.size(), hideSubTaskDetails)), null); 626 642 } catch (IllegalDataException e) { 627 643 throw new OsmTransferException(e); 628 644 } … … 634 650 } 635 651 636 652 /** 637 * invokes a MultiGet for a single id and a given {@link OsmPrimitiveType}.653 * invokes a Get for a single id and a given {@link OsmPrimitiveType}. 638 654 * The retrieved primitive is merged to {@link #outputDataSet}. 639 655 * 640 656 * @param type The primitive type. Must be one of {@link OsmPrimitiveType#NODE NODE}, {@link OsmPrimitiveType#WAY WAY}, … … 647 663 protected DataSet singleGetId(OsmPrimitiveType type, long id, ProgressMonitor progressMonitor) throws OsmTransferException { 648 664 String request = buildRequestString(type, Collections.singleton(id)); 649 665 DataSet result = null; 650 try (InputStream in = getInputStream(request, NullProgressMonitor.INSTANCE)) {666 try (InputStream in = getInputStream(request, progressMonitor.createSubTaskMonitor(1, hideSubTaskDetails))) { 651 667 if (in == null) return null; 652 progressMonitor.subTask(tr("Downloading OSM data..."));653 668 try { 654 result = OsmReader.parseDataSet(in, progressMonitor.createSubTaskMonitor(1, false));669 result = OsmReader.parseDataSet(in, progressMonitor.createSubTaskMonitor(1, hideSubTaskDetails)); 655 670 } catch (IllegalDataException e) { 656 671 throw new OsmTransferException(e); 657 672 } … … 705 720 return result; 706 721 } 707 722 } 723 724 @Override 725 public void cancel() { 726 super.cancel(); 727 if (exec != null) 728 exec.shutdownNow(); 729 } 708 730 }
