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.GeoJSONServerReader;
015import org.openstreetmap.josm.tools.Utils;
016
017/**
018 * GeoJson download task.
019 * @author Omar Vega Ramos <ovruni@riseup.net>
020 * @since 15424
021 */
022public class DownloadGeoJsonTask extends DownloadOsmTask {
023
024    private static final String PATTERN_COMPRESS = "https?://.*/(.*\\.(json|geojson)(\\.(gz|xz|bz2?|zip))?)";
025    private static final String PATTERN_FORMAT_GEOJSON = "https?://.*format=geojson.*";
026
027    @Override
028    public String[] getPatterns() {
029        return new String[]{PATTERN_COMPRESS, PATTERN_FORMAT_GEOJSON};
030    }
031
032    @Override
033    public String getTitle() {
034        return tr("Download GeoJSON");
035    }
036
037    @Override
038    public Future<?> download(DownloadParams settings, Bounds downloadArea, ProgressMonitor progressMonitor) {
039        return null;
040    }
041
042    @Override
043    public Future<?> loadUrl(DownloadParams settings, String url, ProgressMonitor progressMonitor) {
044        downloadTask = new InternalDownloadTask(settings, url, progressMonitor);
045        return MainApplication.worker.submit(downloadTask);
046    }
047
048    class InternalDownloadTask extends DownloadTask {
049
050        private final String url;
051
052        InternalDownloadTask(DownloadParams settings, String url, ProgressMonitor progressMonitor) {
053            super(settings, new GeoJSONServerReader(url), progressMonitor);
054            this.url = url;
055        }
056
057        @Override
058        protected String generateLayerName() {
059            return Optional.of(url.substring(url.lastIndexOf('/')+1))
060                .filter(it -> !Utils.isStripEmpty(it))
061                .orElse(super.generateLayerName());
062        }
063
064        @Override
065        protected OsmDataLayer createNewLayer(final DataSet dataSet, final Optional<String> layerName) {
066            if (layerName.filter(Utils::isStripEmpty).isPresent()) {
067                throw new IllegalArgumentException("Blank layer name!");
068            }
069            return new OsmDataLayer(dataSet, layerName.orElseGet(this::generateLayerName), null);
070        }
071    }
072}