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

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

improve download tasks unit tests

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