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

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

see #14794 - javadoc

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