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

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

see #15182 - deprecate all Main logging methods and introduce suitable replacements in Logging for most of them

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