001// License: Apache 2.0. For details, see LICENSE file.
002package org.openstreetmap.josm.plugins.wkt;
003
004import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
005import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
006import org.openstreetmap.josm.data.Bounds;
007import org.openstreetmap.josm.data.osm.DataSet;
008import org.openstreetmap.josm.gui.MainApplication;
009import org.openstreetmap.josm.gui.layer.OsmDataLayer;
010import org.openstreetmap.josm.gui.progress.ProgressMonitor;
011import org.openstreetmap.josm.tools.Utils;
012
013import java.util.Optional;
014import java.util.concurrent.Future;
015
016import static org.openstreetmap.josm.tools.I18n.tr;
017
018/**
019 * WKT download task.
020 * Modified version of geojson plugin. Thanks to the geojson author:
021 * @author Omar Vega Ramos <ovruni@riseup.net>
022 */
023public class WktDownloadTask extends DownloadOsmTask {
024
025    private static final String PATTERN_COMPRESS = "https?://.*/(.*\\.(wkt|txt)(\\.(gz|xz|bz2?|zip))?)";
026
027    @Override
028    public String[] getPatterns() {
029        return new String[]{PATTERN_COMPRESS};
030    }
031
032    @Override
033    public String getTitle() {
034        return tr("Download Wkt");
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 WktServerReader(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}