source: josm/trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java@ 6897

Last change on this file since 6897 was 6897, checked in by stoecker, 10 years ago

see #9778 - use TLS for JOSM website access

File size: 5.1 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.io.remotecontrol.handler;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.net.MalformedURLException;
7import java.net.URL;
8import java.util.Collection;
9import java.util.HashMap;
10
11import org.openstreetmap.josm.Main;
12import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
13import org.openstreetmap.josm.actions.downloadtasks.DownloadTask;
14import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
15
16/**
17 * Handler for import request
18 */
19public class ImportHandler extends RequestHandler {
20
21 /**
22 * The remote control command name used to import data.
23 */
24 public static final String command = "import";
25
26 private URL url;
27 private Collection<DownloadTask> suitableDownloadTasks;
28
29 @Override
30 protected void handleRequest() throws RequestHandlerErrorException {
31 try {
32 if (suitableDownloadTasks != null && !suitableDownloadTasks.isEmpty()) {
33 // TODO: handle multiple suitable download tasks ?
34 suitableDownloadTasks.iterator().next().loadUrl(isLoadInNewLayer(), url.toExternalForm(), null);
35 }
36 } catch (Exception ex) {
37 Main.warn("RemoteControl: Error parsing import remote control request:");
38 Main.error(ex);
39 throw new RequestHandlerErrorException(ex);
40 }
41 }
42
43 @Override
44 public String[] getMandatoryParams() {
45 return new String[]{"url"};
46 }
47
48 @Override
49 public String[] getOptionalParams() {
50 return new String[] {"new_layer"};
51 }
52
53 @Override
54 public String getUsage() {
55 return "downloads the specified OSM file and adds it to the current data set";
56 }
57
58 @Override
59 public String[] getUsageExamples() {
60 return new String[] { "/import?url="+Main.getJOSMWebsite()+"/browser/josm/trunk/data_nodist/direction-arrows.osm" };
61 }
62
63 @Override
64 public String getPermissionMessage() {
65 // URL can be any suitable URL giving back OSM data, including OSM API calls, even if calls to the main API
66 // should rather be passed to LoadAndZoomHandler or LoadObjectHandler.
67 // Other API instances will however use the import handler to force JOSM to make requests to this API instance.
68 // (Example with OSM-FR website that makes calls to the OSM-FR API)
69 // For user-friendliness, let's try to decode these OSM API calls to give a better confirmation message.
70 String taskMessage = null;
71 if (suitableDownloadTasks != null && !suitableDownloadTasks.isEmpty()) {
72 // TODO: handle multiple suitable download tasks ?
73 taskMessage = suitableDownloadTasks.iterator().next().getConfirmationMessage(url);
74 }
75 return tr("Remote Control has been asked to import data from the following URL:")
76 + "<br>" + (taskMessage == null ? url.toString() : taskMessage);
77 }
78
79 @Override
80 public PermissionPrefWithDefault getPermissionPref() {
81 return PermissionPrefWithDefault.IMPORT_DATA;
82 }
83
84 @Override
85 protected void parseArgs() {
86 HashMap<String, String> args = new HashMap<String, String>();
87 if (request.indexOf('?') != -1) {
88 String query = request.substring(request.indexOf('?') + 1);
89 if (query.indexOf("url=") == 0) {
90 args.put("url", decodeParam(query.substring(4)));
91 } else {
92 int urlIdx = query.indexOf("&url=");
93 if (urlIdx != -1) {
94 args.put("url", decodeParam(query.substring(urlIdx + 5)));
95 query = query.substring(0, urlIdx);
96 } else {
97 if (query.indexOf('#') != -1) {
98 query = query.substring(0, query.indexOf('#'));
99 }
100 }
101 String[] params = query.split("&", -1);
102 for (String param : params) {
103 int eq = param.indexOf('=');
104 if (eq != -1) {
105 args.put(param.substring(0, eq), param.substring(eq + 1));
106 }
107 }
108 }
109 }
110 this.args = args;
111 }
112
113 @Override
114 protected void validateRequest() throws RequestHandlerBadRequestException {
115 final String urlString = args.get("url");
116 try {
117 // Ensure the URL is valid
118 url = new URL(urlString);
119 } catch (MalformedURLException e) {
120 throw new RequestHandlerBadRequestException("MalformedURLException: "+e.getMessage(), e);
121 }
122 // Find download tasks for the given URL
123 suitableDownloadTasks = Main.main.menu.openLocation.findDownloadTasks(urlString);
124 if (suitableDownloadTasks.isEmpty()) {
125 // It should maybe be better to reject the request in that case ?
126 // For compatibility reasons with older instances of JOSM, arbitrary choice of DownloadOsmTask
127 suitableDownloadTasks.add(new DownloadOsmTask());
128 }
129 }
130}
Note: See TracBrowser for help on using the repository browser.