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}