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