001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.actions.downloadtasks;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.util.Optional;
007import java.util.concurrent.Future;
008
009import org.openstreetmap.josm.data.Bounds;
010import org.openstreetmap.josm.data.osm.DataSet;
011import org.openstreetmap.josm.gui.MainApplication;
012import org.openstreetmap.josm.gui.layer.OsmDataLayer;
013import org.openstreetmap.josm.gui.progress.ProgressMonitor;
014import org.openstreetmap.josm.io.Compression;
015import org.openstreetmap.josm.io.GeoJSONServerReader;
016import org.openstreetmap.josm.io.UrlPatterns.GeoJsonUrlPattern;
017import org.openstreetmap.josm.tools.Utils;
018
019/**
020 * GeoJson download task.
021 * @author Omar Vega Ramos <ovruni@riseup.net>
022 * @since 15424
023 */
024public class DownloadGeoJsonTask extends DownloadOsmTask {
025
026    @Override
027    public String[] getPatterns() {
028        return patterns(GeoJsonUrlPattern.class);
029    }
030
031    @Override
032    public String getTitle() {
033        return tr("Download GeoJSON");
034    }
035
036    @Override
037    public Future<?> download(DownloadParams settings, Bounds downloadArea, ProgressMonitor progressMonitor) {
038        return null;
039    }
040
041    @Override
042    public Future<?> loadUrl(DownloadParams settings, String url, ProgressMonitor progressMonitor) {
043        downloadTask = new InternalDownloadTask(settings, url, progressMonitor);
044        return MainApplication.worker.submit(downloadTask);
045    }
046
047    class InternalDownloadTask extends DownloadTask {
048
049        private final String url;
050
051        InternalDownloadTask(DownloadParams settings, String url, ProgressMonitor progressMonitor) {
052            super(settings, new GeoJSONServerReader(url), progressMonitor, true, Compression.byExtension(url));
053            this.url = url;
054        }
055
056        @Override
057        protected String generateLayerName() {
058            return Optional.of(url.substring(url.lastIndexOf('/')+1))
059                .filter(it -> !Utils.isStripEmpty(it))
060                .orElse(super.generateLayerName());
061        }
062
063        @Override
064        protected OsmDataLayer createNewLayer(final DataSet dataSet, final Optional<String> layerName) {
065            if (layerName.filter(Utils::isStripEmpty).isPresent()) {
066                throw new IllegalArgumentException("Blank layer name!");
067            }
068            return new OsmDataLayer(dataSet, layerName.orElseGet(this::generateLayerName), null);
069        }
070    }
071}