Ticket #20416: 20416.4.patch

File 20416.4.patch, 7.4 KB (added by GerdP, 5 years ago)
  • src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java

     
    3838import org.openstreetmap.josm.data.osm.RelationMember;
    3939import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
    4040import org.openstreetmap.josm.data.osm.Way;
    41 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
    4241import org.openstreetmap.josm.gui.progress.ProgressMonitor;
    4342import org.openstreetmap.josm.spi.preferences.Config;
    4443import org.openstreetmap.josm.tools.Logging;
     
    7978
    8079    protected boolean recurseDownRelations;
    8180    private boolean recurseDownAppended = true;
     81    private boolean hideSubTaskDetails;
    8282
     83    private ExecutorService exec;
     84
    8385    /**
    8486     * Constructs a {@code MultiFetchServerObjectReader}.
    8587     */
     
    301303     * @throws OsmTransferException if an error occurs while communicating with the API server
    302304     */
    303305    protected void fetchPrimitives(Set<Long> ids, OsmPrimitiveType type, ProgressMonitor progressMonitor) throws OsmTransferException {
     306        int n = ids.size();
     307        if (n == 0)
     308            return;
    304309        String msg;
    305310        final String baseUrl = getBaseUrl();
    306311        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();
    313323        }
     324        progressMonitor.setTicks(0);
    314325        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);
    316332        // The complete set containing all primitives to fetch
    317333        Set<Long> toFetch = new HashSet<>(ids);
    318334        // Build a list of fetchers that will  download smaller sets containing only MAX_IDS_PER_REQUEST (200) primitives each.
     
    319335        // we will run up to MAX_DOWNLOAD_THREADS concurrent fetchers.
    320336        int threadsNumber = Config.getPref().getInt("osm.download.threads", OsmApi.MAX_DOWNLOAD_THREADS);
    321337        threadsNumber = Utils.clamp(threadsNumber, 1, OsmApi.MAX_DOWNLOAD_THREADS);
    322         final ExecutorService exec = Executors.newFixedThreadPool(
     338        exec = Executors.newFixedThreadPool(
    323339                threadsNumber, Utils.newThreadFactory(getClass() + "-%d", Thread.NORM_PRIORITY));
    324340        CompletionService<FetchResult> ecs = new ExecutorCompletionService<>(exec);
    325341        List<Future<FetchResult>> jobs = new ArrayList<>();
     
    328344        }
    329345        // Run the fetchers
    330346        for (int i = 0; i < jobs.size() && !isCanceled(); i++) {
    331             progressMonitor.subTask(msg + "... " + progressMonitor.getTicks() + '/' + progressMonitor.getTicksCount());
    332347            try {
    333348                FetchResult result = ecs.take().get();
    334349                if (result.rc404 != null) {
    335350                    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)));
    339354                }
    340355                if (result.missingPrimitives != null) {
    341356                    missingPrimitives.addAll(result.missingPrimitives);
     
    357372                job.cancel(true);
    358373            }
    359374        }
     375        exec = null;
    360376    }
    361377
    362378    /**
     
    618634                throws OsmTransferException {
    619635            String request = buildRequestString(type, pkg);
    620636            FetchResult result = null;
    621             try (InputStream in = getInputStream(request, NullProgressMonitor.INSTANCE)) {
     637            try (InputStream in = getInputStream(request, progressMonitor.createSubTaskMonitor(1, hideSubTaskDetails))) {
    622638                if (in == null) return null;
    623                 progressMonitor.subTask(tr("Downloading OSM data..."));
    624639                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);
    626642                } catch (IllegalDataException e) {
    627643                    throw new OsmTransferException(e);
    628644                }
     
    634650        }
    635651
    636652        /**
    637          * invokes a Multi Get for a single id and a given {@link OsmPrimitiveType}.
     653         * invokes a Get for a single id and a given {@link OsmPrimitiveType}.
    638654         * The retrieved primitive is merged to {@link #outputDataSet}.
    639655         *
    640656         * @param type The primitive type. Must be one of {@link OsmPrimitiveType#NODE NODE}, {@link OsmPrimitiveType#WAY WAY},
     
    647663        protected DataSet singleGetId(OsmPrimitiveType type, long id, ProgressMonitor progressMonitor) throws OsmTransferException {
    648664            String request = buildRequestString(type, Collections.singleton(id));
    649665            DataSet result = null;
    650             try (InputStream in = getInputStream(request, NullProgressMonitor.INSTANCE)) {
     666            try (InputStream in = getInputStream(request, progressMonitor.createSubTaskMonitor(1, hideSubTaskDetails))) {
    651667                if (in == null) return null;
    652                 progressMonitor.subTask(tr("Downloading OSM data..."));
    653668                try {
    654                     result = OsmReader.parseDataSet(in, progressMonitor.createSubTaskMonitor(1, false));
     669                    result = OsmReader.parseDataSet(in, progressMonitor.createSubTaskMonitor(1, hideSubTaskDetails));
    655670                } catch (IllegalDataException e) {
    656671                    throw new OsmTransferException(e);
    657672                }
     
    705720            return result;
    706721        }
    707722    }
     723
     724    @Override
     725    public void cancel() {
     726        super.cancel();
     727        if (exec != null)
     728            exec.shutdownNow();
     729    }
    708730}