001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.actions.downloadtasks;
003
004import java.util.concurrent.Future;
005
006import static org.openstreetmap.josm.tools.I18n.tr;
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    String PATTERN_GZ =  "https?://.*/.*\\.osm.(gz|bz2?)";
022
023    @Override
024    public String[] getPatterns() {
025        return new String[]{PATTERN_GZ};
026    }
027
028    @Override
029    public String getTitle() {
030        return tr("Download Compressed OSM");
031    }
032    
033    /* (non-Javadoc)
034     * @see org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask#download(boolean, org.openstreetmap.josm.data.Bounds, org.openstreetmap.josm.gui.progress.ProgressMonitor)
035     */
036    @Override
037    public Future<?> download(boolean newLayer, Bounds downloadArea,
038            ProgressMonitor progressMonitor) {
039        return null;
040    }
041    
042    /**
043     * Loads a given URL
044     * @param new_layer {@code true} if the data should be saved to a new layer
045     * @param url The URL as String
046     * @param progressMonitor progress monitor for user interaction
047     */
048    @Override
049    public Future<?> loadUrl(boolean new_layer, final String url, ProgressMonitor progressMonitor) {
050        downloadTask = new DownloadTask(new_layer, new OsmServerLocationReader(url), progressMonitor) {
051            @Override
052            protected DataSet parseDataSet() throws OsmTransferException {
053                ProgressMonitor subTaskMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
054                if (url.matches("https?://.*/.*\\.osm.bz2?")) {
055                    return reader.parseOsmBzip2(subTaskMonitor);
056                } else {
057                    return reader.parseOsmGzip(subTaskMonitor);
058                }
059            }
060        };
061        currentBounds = null;
062        // Extract .osm.gz/bz/bz2 filename from URL to set the new layer name
063        extractOsmFilename("https?://.*/(.*\\.osm.(gz|bz2?))", url);
064        return Main.worker.submit(downloadTask);
065    }
066}