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}