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

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

fix #13922 - fix GPX and Note download area computation

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