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

Last change on this file since 7749 was 7749, checked in by bastiK, 11 years ago

remotecontrol /import: only allow whitelisted download tasks to be called from remotecontrol

Turned off import of session files for now.
I think it is not really an issue at the moment but as new features are added,
this may accidentally get overlooked.
E.g. any javascript execution with rhino engine as we currently do for loading of
preference snippets is a no-go.

In order to enable remotecontrol for a plugin download-task, override the method
isSafeForRemotecontrolRequests() in AbstractDownloadTask or derive from a
class that is already whitelisted (e.g. DownloadOsmTask).

  • Property svn:eol-style set to native
File size: 6.5 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;
5
6import java.io.IOException;
7import java.net.URL;
8import java.util.List;
9import java.util.concurrent.Future;
10
11import org.openstreetmap.josm.Main;
12import org.openstreetmap.josm.data.Bounds;
13import org.openstreetmap.josm.data.notes.Note;
14import org.openstreetmap.josm.gui.PleaseWaitRunnable;
15import org.openstreetmap.josm.gui.layer.NoteLayer;
16import org.openstreetmap.josm.gui.progress.ProgressMonitor;
17import org.openstreetmap.josm.io.BoundingBoxDownloader;
18import org.openstreetmap.josm.io.OsmServerLocationReader;
19import org.openstreetmap.josm.io.OsmServerReader;
20import org.openstreetmap.josm.io.OsmTransferException;
21import org.xml.sax.SAXException;
22
23/** Task for downloading notes */
24public class DownloadNotesTask extends AbstractDownloadTask {
25
26 private static final String PATTERN_API_URL = "https?://.*/api/0.6/notes.*";
27 private static final String PATTERN_DUMP_FILE = "https?://.*/(.*\\.osn(.bz2)?)";
28
29 private DownloadTask downloadTask;
30
31 @Override
32 public Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
33 downloadTask = new DownloadBoundingBoxTask(new BoundingBoxDownloader(downloadArea), progressMonitor);
34 return Main.worker.submit(downloadTask);
35 }
36
37 @Override
38 public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
39 if (url.endsWith(".bz2")) {
40 downloadTask = new DownloadBzip2RawUrlTask(new OsmServerLocationReader(url), progressMonitor);
41 } else {
42 downloadTask = new DownloadRawUrlTask(new OsmServerLocationReader(url), progressMonitor);
43 }
44 return Main.worker.submit(downloadTask);
45 }
46
47 @Override
48 public void cancel() {
49 if (downloadTask != null) {
50 downloadTask.cancel();
51 }
52 }
53
54 @Override
55 public String getConfirmationMessage(URL url) {
56 return null;
57 }
58
59 @Override
60 public String getTitle() {
61 return "Download OSM Notes";
62 }
63
64 @Override
65 public String[] getPatterns() {
66 return new String[] {PATTERN_API_URL, PATTERN_DUMP_FILE};
67 }
68
69 @Override
70 public boolean isSafeForRemotecontrolRequests() {
71 return true;
72 }
73
74 abstract class DownloadTask extends PleaseWaitRunnable {
75 protected OsmServerReader reader;
76 protected List<Note> notesData;
77
78 public DownloadTask(OsmServerReader reader, ProgressMonitor progressMonitor) {
79 super(tr("Downloading Notes"), progressMonitor, false);
80 this.reader = reader;
81 }
82
83 @Override
84 protected void finish() {
85 Main.debug("finish called in DownloadNotesTask");
86 if (isCanceled() || isFailed()) {
87 Main.debug("was cancelled or failed");
88 return;
89 }
90
91 if (notesData == null) {
92 return;
93 }
94 Main.debug("Notes downloaded: " + notesData.size());
95
96 List<NoteLayer> noteLayers = null;
97 if (Main.map != null) {
98 noteLayers = Main.map.mapView.getLayersOfType(NoteLayer.class);
99 }
100 NoteLayer layer;
101 if (noteLayers != null && noteLayers.size() > 0) {
102 layer = noteLayers.get(0);
103 layer.getNoteData().addNotes(notesData);
104 } else {
105 layer = new NoteLayer(notesData, "Notes");
106 Main.main.addLayer(layer);
107 }
108 }
109
110 @Override
111 protected void cancel() {
112 setCanceled(true);
113 if (reader != null) {
114 reader.cancel();
115 }
116 }
117
118 @Override
119 public abstract void realRun() throws IOException, SAXException, OsmTransferException;
120 }
121
122 class DownloadBoundingBoxTask extends DownloadTask {
123
124 public DownloadBoundingBoxTask(OsmServerReader reader, ProgressMonitor progressMonitor) {
125 super(reader, progressMonitor);
126 }
127
128 @Override
129 public void realRun() throws IOException, SAXException, OsmTransferException {
130 if (isCanceled()) {
131 return;
132 }
133 ProgressMonitor subMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
134 try {
135 notesData = reader.parseNotes(null, null, subMonitor);
136 } catch (Exception e) {
137 if (isCanceled())
138 return;
139 if (e instanceof OsmTransferException) {
140 rememberException(e);
141 } else {
142 rememberException(new OsmTransferException(e));
143 }
144 }
145 }
146 }
147
148 class DownloadRawUrlTask extends DownloadTask {
149
150 public DownloadRawUrlTask(OsmServerReader reader, ProgressMonitor progressMonitor) {
151 super(reader, progressMonitor);
152 }
153
154 @Override
155 public void realRun() throws IOException, SAXException, OsmTransferException {
156 if (isCanceled()) {
157 return;
158 }
159 ProgressMonitor subMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
160 try {
161 notesData = reader.parseRawNotes(subMonitor);
162 } catch (Exception e) {
163 if (isCanceled())
164 return;
165 if (e instanceof OsmTransferException) {
166 rememberException(e);
167 } else {
168 rememberException(new OsmTransferException(e));
169 }
170 }
171 }
172 }
173
174 class DownloadBzip2RawUrlTask extends DownloadTask {
175
176 public DownloadBzip2RawUrlTask(OsmServerReader reader, ProgressMonitor progressMonitor) {
177 super(reader, progressMonitor);
178 }
179
180 @Override
181 public void realRun() throws IOException, SAXException, OsmTransferException {
182 if (isCanceled()) {
183 return;
184 }
185 ProgressMonitor subMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
186 try {
187 notesData = reader.parseRawNotesBzip2(subMonitor);
188 } catch (Exception e) {
189 if (isCanceled())
190 return;
191 if (e instanceof OsmTransferException) {
192 rememberException(e);
193 } else {
194 rememberException(new OsmTransferException(e));
195 }
196 }
197 }
198 }
199
200}
Note: See TracBrowser for help on using the repository browser.