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