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

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

fix #13922 - Add (expert) option to not zoom to the new downloaded data

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