source: josm/trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesTask.java@ 12630

Last change on this file since 12630 was 12630, checked in by Don-vip, 7 years ago

see #15182 - deprecate Main.map and Main.isDisplayingMapView(). Replacements: gui.MainApplication.getMap() / gui.MainApplication.isDisplayingMapView()

  • Property svn:eol-style set to native
File size: 8.6 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions.downloadtasks;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5import static org.openstreetmap.josm.tools.I18n.trn;
6
7import java.io.IOException;
8import java.net.URL;
9import java.util.List;
10import java.util.concurrent.Future;
11
12import javax.swing.JOptionPane;
13
14import org.openstreetmap.josm.Main;
15import org.openstreetmap.josm.data.Bounds;
16import org.openstreetmap.josm.data.ProjectionBounds;
17import org.openstreetmap.josm.data.ViewportData;
18import org.openstreetmap.josm.data.notes.Note;
19import org.openstreetmap.josm.data.osm.NoteData;
20import org.openstreetmap.josm.data.preferences.IntegerProperty;
21import org.openstreetmap.josm.gui.MainApplication;
22import org.openstreetmap.josm.gui.MapFrame;
23import org.openstreetmap.josm.gui.PleaseWaitRunnable;
24import org.openstreetmap.josm.gui.layer.NoteLayer;
25import org.openstreetmap.josm.gui.progress.ProgressMonitor;
26import org.openstreetmap.josm.io.BoundingBoxDownloader;
27import org.openstreetmap.josm.io.BoundingBoxDownloader.MoreNotesException;
28import org.openstreetmap.josm.io.OsmApi;
29import org.openstreetmap.josm.io.OsmServerLocationReader;
30import org.openstreetmap.josm.io.OsmServerReader;
31import org.openstreetmap.josm.io.OsmTransferException;
32import org.openstreetmap.josm.tools.Logging;
33import org.xml.sax.SAXException;
34
35/**
36 * General task for downloading OSM notes.
37 * <p>
38 * It handles two URL patterns: API call and dump file export.
39 * @since 7531
40 */
41public class DownloadNotesTask extends AbstractDownloadTask<NoteData> {
42
43 private static final String PATTERN_API_URL = "https?://.*/api/0.6/notes.*";
44 private static final String PATTERN_DUMP_FILE = "https?://.*/(.*\\.osn(.bz2)?)";
45 /** Property defining the number of notes to be downloaded */
46 public static final IntegerProperty DOWNLOAD_LIMIT = new IntegerProperty("osm.notes.downloadLimit", 1000);
47 /** Property defining number of days a bug needs to be closed to no longer be downloaded */
48 public static final IntegerProperty DAYS_CLOSED = new IntegerProperty("osm.notes.daysClosed", 7);
49
50 private DownloadTask downloadTask;
51 private NoteLayer noteLayer;
52
53 /**
54 * Download a specific note by its id.
55 * @param id Note identifier
56 * @param progressMonitor progress monitor
57 * @return the future representing the asynchronous task
58 */
59 public Future<?> download(long id, ProgressMonitor progressMonitor) {
60 final String url = OsmApi.getOsmApi().getBaseUrl() + "notes/" + id;
61 downloadTask = new DownloadRawUrlTask(new OsmServerLocationReader(url), progressMonitor);
62 return Main.worker.submit(downloadTask);
63 }
64
65 @Override
66 public Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
67 downloadTask = new DownloadBoundingBoxTask(new BoundingBoxDownloader(downloadArea), progressMonitor);
68 return Main.worker.submit(downloadTask);
69 }
70
71 @Override
72 public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
73 if (url.endsWith(".bz2")) {
74 downloadTask = new DownloadBzip2RawUrlTask(new OsmServerLocationReader(url), progressMonitor);
75 } else {
76 downloadTask = new DownloadRawUrlTask(new OsmServerLocationReader(url), progressMonitor);
77 }
78 return Main.worker.submit(downloadTask);
79 }
80
81 @Override
82 public void cancel() {
83 if (downloadTask != null) {
84 downloadTask.cancel();
85 }
86 }
87
88 @Override
89 public String getConfirmationMessage(URL url) {
90 return null;
91 }
92
93 @Override
94 public String getTitle() {
95 return tr("Download OSM Notes");
96 }
97
98 @Override
99 public String[] getPatterns() {
100 return new String[] {PATTERN_API_URL, PATTERN_DUMP_FILE};
101 }
102
103 @Override
104 public boolean isSafeForRemotecontrolRequests() {
105 return true;
106 }
107
108 @Override
109 public ProjectionBounds getDownloadProjectionBounds() {
110 return noteLayer != null ? noteLayer.getViewProjectionBounds() : null;
111 }
112
113 abstract class DownloadTask extends PleaseWaitRunnable {
114 protected OsmServerReader reader;
115 protected List<Note> notesData;
116
117 DownloadTask(OsmServerReader reader, ProgressMonitor progressMonitor) {
118 super(tr("Downloading Notes"), progressMonitor, false);
119 this.reader = reader;
120 }
121
122 @Override
123 protected void finish() {
124 rememberDownloadedData(new NoteData(notesData));
125 if (isCanceled() || isFailed() || notesData == null || notesData.isEmpty()) {
126 return;
127 }
128 if (Logging.isDebugEnabled()) {
129 Logging.debug("Notes downloaded: {0}", notesData.size());
130 }
131
132 noteLayer = new NoteLayer(notesData, tr("Notes"));
133 List<NoteLayer> noteLayers = Main.getLayerManager().getLayersOfType(NoteLayer.class);
134 if (!noteLayers.isEmpty()) {
135 noteLayers.get(0).getNoteData().addNotes(notesData);
136 MapFrame map = MainApplication.getMap();
137 if (map != null && zoomAfterDownload) {
138 map.mapView.scheduleZoomTo(new ViewportData(noteLayer.getViewProjectionBounds()));
139 }
140 } else {
141 Main.getLayerManager().addLayer(noteLayer, zoomAfterDownload);
142 }
143 }
144
145 @Override
146 protected void cancel() {
147 setCanceled(true);
148 if (reader != null) {
149 reader.cancel();
150 }
151 }
152
153 @Override
154 public abstract void realRun() throws IOException, SAXException, OsmTransferException;
155 }
156
157 class DownloadBoundingBoxTask extends DownloadTask {
158
159 DownloadBoundingBoxTask(OsmServerReader reader, ProgressMonitor progressMonitor) {
160 super(reader, progressMonitor);
161 }
162
163 @Override
164 public void realRun() throws IOException, SAXException, OsmTransferException {
165 if (isCanceled()) {
166 return;
167 }
168 ProgressMonitor subMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
169 try {
170 notesData = reader.parseNotes(DOWNLOAD_LIMIT.get(), DAYS_CLOSED.get(), subMonitor);
171 } catch (MoreNotesException e) {
172 Logging.debug(e);
173 notesData = e.notes;
174 JOptionPane.showMessageDialog(Main.parent, "<html>"
175 + trn("{0} note has been downloaded.", "{0} notes have been downloaded.", e.limit, e.limit)
176 + "<br>"
177 + tr("Since the download limit was {0}, there might be more notes to download.", e.limit)
178 + "<br>"
179 + tr("Request a smaller area to make sure that all notes are being downloaded.")
180 + "</html>",
181 tr("More notes to download"), JOptionPane.INFORMATION_MESSAGE);
182 } catch (OsmTransferException e) {
183 if (isCanceled())
184 return;
185 rememberException(e);
186 }
187 }
188 }
189
190 class DownloadRawUrlTask extends DownloadTask {
191
192 DownloadRawUrlTask(OsmServerReader reader, ProgressMonitor progressMonitor) {
193 super(reader, progressMonitor);
194 }
195
196 @Override
197 public void realRun() throws IOException, SAXException, OsmTransferException {
198 if (isCanceled()) {
199 return;
200 }
201 ProgressMonitor subMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
202 try {
203 notesData = reader.parseRawNotes(subMonitor);
204 } catch (OsmTransferException e) {
205 if (isCanceled())
206 return;
207 rememberException(e);
208 }
209 }
210 }
211
212 class DownloadBzip2RawUrlTask extends DownloadTask {
213
214 DownloadBzip2RawUrlTask(OsmServerReader reader, ProgressMonitor progressMonitor) {
215 super(reader, progressMonitor);
216 }
217
218 @Override
219 public void realRun() throws IOException, SAXException, OsmTransferException {
220 if (isCanceled()) {
221 return;
222 }
223 ProgressMonitor subMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
224 try {
225 notesData = reader.parseRawNotesBzip2(subMonitor);
226 } catch (OsmTransferException e) {
227 if (isCanceled())
228 return;
229 rememberException(e);
230 }
231 }
232 }
233}
Note: See TracBrowser for help on using the repository browser.