Ticket #19920: 19920.patch

File 19920.patch, 2.6 KB (added by GerdP, 4 years ago)
  • src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java

     
    327327            jobs.add(ecs.submit(new Fetcher(type, extractIdPackage(toFetch), progressMonitor)));
    328328        }
    329329        // Run the fetchers
    330         for (int i = 0; i < jobs.size() && !isCanceled(); i++) {
     330        for (int i = 0; i < jobs.size() && !isCanceled() && !progressMonitor.isCanceled(); i++) {
    331331            progressMonitor.subTask(msg + "... " + progressMonitor.getTicks() + '/' + progressMonitor.getTicksCount());
    332332            try {
    333333                FetchResult result = ecs.take().get();
     
    348348                Logging.error(e);
    349349            }
    350350        }
     351        if (progressMonitor.isCanceled() && !isCanceled())
     352            cancel();
    351353        exec.shutdown();
    352354        // Cancel requests if the user chose to
    353355        if (isCanceled()) {
     
    441443     */
    442444    private void downloadRelations(ProgressMonitor progressMonitor) throws OsmTransferException {
    443445        Set<Long> toDownload = new LinkedHashSet<>(relations);
     446        if (toDownload.isEmpty())
     447            return;
    444448        fetchPrimitives(toDownload, OsmPrimitiveType.RELATION, progressMonitor);
    445449        if (!recurseDownRelations) {
    446450            return;
     
    450454            if (!r.isVisible())
    451455                toDownload.remove(r.getUniqueId());
    452456        }
     457        // remember downloaded relations
     458        DataSet invisible = new DataSet();
     459        new DataSetMerger(invisible, outputDataSet).merge();
     460        // clear dataset so that merge() doesn't find the incomplete relation(s)
     461        outputDataSet.clear();
    453462        // fetch full info for all visible relations
    454463        for (long id : toDownload) {
    455464            if (isCanceled())
     
    458467            DataSet ds = reader.parseOsm(progressMonitor.createSubTaskMonitor(1, false));
    459468            merge(ds);
    460469        }
     470        // merge possibly invisible relations back
     471        new DataSetMerger(outputDataSet, invisible).merge();
    461472    }
    462473
    463474    /**
     
    585596                        Logging.info(tr("Server replied with response code 404, retrying with an individual request for each object."));
    586597                        return singleGetIdPackage(type, pkg, progressMonitor);
    587598                    }
    588                 } else {
    589                     throw e;
    590599                }
     600                throw e;
    591601            }
    592602        }
    593603