001    // License: GPL. Copyright 2007 by Immanuel Scholz and others
002    package org.openstreetmap.josm.actions.downloadtasks;
003    
004    import java.util.concurrent.Future;
005    
006    import org.openstreetmap.josm.Main;
007    import org.openstreetmap.josm.data.Bounds;
008    import org.openstreetmap.josm.data.osm.DataSet;
009    import org.openstreetmap.josm.gui.progress.ProgressMonitor;
010    import org.openstreetmap.josm.io.OsmServerLocationReader;
011    import org.openstreetmap.josm.io.OsmTransferException;
012    
013    public class DownloadOsmCompressedTask extends DownloadOsmTask {
014        
015        /* (non-Javadoc)
016         * @see org.openstreetmap.josm.actions.downloadtasks.DownloadTask#acceptsUrl(java.lang.String)
017         */
018        @Override
019        public boolean acceptsUrl(String url) {
020            return url != null && url.matches("http://.*/.*\\.osm.(gz|bz2?)"); // Remote .osm.gz / .osm.bz / .osm.bz2 files
021        }
022        
023        /* (non-Javadoc)
024         * @see org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask#download(boolean, org.openstreetmap.josm.data.Bounds, org.openstreetmap.josm.gui.progress.ProgressMonitor)
025         */
026        @Override
027        public Future<?> download(boolean newLayer, Bounds downloadArea,
028                ProgressMonitor progressMonitor) {
029            return null;
030        }
031        
032        /**
033         * Loads a given URL
034         * @param True if the data should be saved to a new layer
035         * @param The URL as String
036         */
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("http://.*/.*\\.osm.bz2?")) {
043                        return reader.parseOsmBzip2(subTaskMonitor);
044                    } else {
045                        return reader.parseOsmGzip(subTaskMonitor);
046                    }
047                }
048            };
049            currentBounds = null;
050            // Extract .osm.gz/bz/bz2 filename from URL to set the new layer name
051            extractOsmFilename("http://.*/(.*\\.osm.(gz|bz2?))", url);
052            return Main.worker.submit(downloadTask);
053        }
054    }