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