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

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

sonar - squid:S1166 - Exception handlers should preserve the original exceptions

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