001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.io;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.io.IOException;
007
008import org.openstreetmap.josm.data.Bounds;
009import org.openstreetmap.josm.data.osm.DataSet;
010import org.openstreetmap.josm.data.osm.DataSetMerger;
011import org.openstreetmap.josm.gui.ExceptionDialogUtil;
012import org.openstreetmap.josm.gui.PleaseWaitRunnable;
013import org.openstreetmap.josm.gui.progress.ProgressMonitor;
014import org.openstreetmap.josm.io.OsmTransferException;
015import org.openstreetmap.josm.io.OverpassDownloadReader;
016import org.xml.sax.SAXException;
017
018/**
019 * Download OSM data from Overpass API
020 *
021 */
022public class DownloadFromOverpassTask extends PleaseWaitRunnable {
023    private boolean canceled;
024    private final String request;
025    private final DataSet ds;
026    private Exception lastException;
027
028    /**
029     * Constructor
030     * @param request the overpass query
031     * @param ds the {@code DataSet} instance that should contain the downloaded data
032     * @param monitor ProgressMonitor to use or null to create a new one.
033     */
034    public DownloadFromOverpassTask(String request, DataSet ds, ProgressMonitor monitor) {
035        super(tr("Download objects via Overpass API"), monitor, false);
036        this.request = request;
037        this.ds = ds;
038    }
039
040    @Override
041    protected void cancel() {
042        canceled = true;
043    }
044
045    @Override
046    protected void realRun() throws SAXException, IOException, OsmTransferException {
047        try {
048            OverpassDownloadReader reader = new OverpassDownloadReader(new Bounds(0, 0, 0, 0),
049                    OverpassDownloadReader.OVERPASS_SERVER.get(), request);
050            DataSet tmpDs = reader.parseOsm(progressMonitor.createSubTaskMonitor(1, false));
051            if (!canceled) {
052                new DataSetMerger(ds, tmpDs).merge();
053            }
054        } catch (OsmTransferException e) {
055            if (canceled)
056                return;
057            lastException = e;
058        }
059
060    }
061
062    @Override
063    protected void finish() {
064        if (canceled)
065            return;
066        if (lastException != null) {
067            ExceptionDialogUtil.explainException(lastException);
068        }
069    }
070}