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

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

see #18613 - rework download tasks / URL patterns

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