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.concurrent.Future; 007 008import org.openstreetmap.josm.Main; 009import org.openstreetmap.josm.data.Bounds; 010import org.openstreetmap.josm.data.osm.DataSet; 011import org.openstreetmap.josm.gui.progress.ProgressMonitor; 012import org.openstreetmap.josm.io.OsmServerLocationReader; 013import org.openstreetmap.josm.io.OsmTransferException; 014 015/** 016 * Task allowing to download compressed OSM files (gzip and bzip2) 017 * @since 5317 018 */ 019public class DownloadOsmCompressedTask extends DownloadOsmTask { 020 021 private static final String PATTERN_COMPRESS = "https?://.*/.*\\.osm.(gz|bz2?|zip)"; 022 023 @Override 024 public String[] getPatterns() { 025 return new String[]{PATTERN_COMPRESS}; 026 } 027 028 @Override 029 public String getTitle() { 030 return tr("Download Compressed OSM"); 031 } 032 033 @Override 034 public Future<?> download(boolean newLayer, Bounds downloadArea, 035 ProgressMonitor progressMonitor) { 036 return null; 037 } 038 039 /** 040 * Loads a given URL 041 * @param newLayer {@code true} if the data should be saved to a new layer 042 * @param url The URL as String 043 * @param progressMonitor progress monitor for user interaction 044 */ 045 @Override 046 public Future<?> loadUrl(boolean newLayer, final String url, ProgressMonitor progressMonitor) { 047 downloadTask = new DownloadTask(newLayer, new OsmServerLocationReader(url), progressMonitor) { 048 @Override 049 protected DataSet parseDataSet() throws OsmTransferException { 050 ProgressMonitor subTaskMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false); 051 if (url.matches("https?://.*/.*\\.osm.bz2?")) { 052 return reader.parseOsmBzip2(subTaskMonitor); 053 } else if (url.matches("https?://.*/.*\\.osm.gz")) { 054 return reader.parseOsmGzip(subTaskMonitor); 055 } else { 056 return reader.parseOsmZip(subTaskMonitor); 057 } 058 } 059 }; 060 currentBounds = null; 061 // Extract .osm.gz/bz/bz2/zip filename from URL to set the new layer name 062 extractOsmFilename("https?://.*/(.*\\.osm.(gz|bz2?|zip))", url); 063 return Main.worker.submit(downloadTask); 064 } 065}