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 026 @Override 027 public String[] getPatterns() { 028 return new String[]{PATTERN_COMPRESS}; 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); 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}