source: josm/trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadDataHandler.java@ 7636

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

fix #10646 - Remote Control v1.6: new load_data handler to load OSM data directly from URL (modified patch by sanderd17)

File size: 4.8 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.io.ByteArrayInputStream;
7import java.io.InputStream;
8import java.io.UnsupportedEncodingException;
9import java.net.URLDecoder;
10import java.util.HashMap;
11import java.util.Map;
12
13import org.openstreetmap.josm.Main;
14import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
15import org.openstreetmap.josm.data.osm.DataSet;
16import org.openstreetmap.josm.io.OsmReader;
17import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
18
19/**
20 * Handler to load data directly from the URL.
21 * @since 7634
22 */
23public class LoadDataHandler extends RequestHandler {
24
25 private static final String OSM_MIME_TYPE = "application/x-osm+xml";
26
27 /**
28 * The remote control command name used to import data.
29 */
30 public static final String command = "load_data";
31
32 /**
33 * Holds the data input string
34 */
35 private String data;
36
37 /**
38 * Holds the mime type. Currently only OSM_MIME_TYPE is supported
39 * But it could be extended to text/csv, application/gpx+xml, ... or even binary encoded data
40 */
41 private String mimeType;
42
43 @Override
44 protected void handleRequest() throws RequestHandlerErrorException {
45 try {
46 // Transform data string to inputstream
47 InputStream source = new ByteArrayInputStream(data.getBytes("UTF-8"));
48 DataSet dataSet = new DataSet();
49 if (mimeType != null && mimeType.contains(OSM_MIME_TYPE))
50 dataSet = OsmReader.parseDataSet(source, null);
51 Main.worker.submit(new LoadDataTask(isLoadInNewLayer(), dataSet, args.get("layer_name")));
52 } catch (Exception e) {
53 Main.warn("Problem with data: " + data);
54 throw new RequestHandlerErrorException(e);
55 }
56 }
57
58 @Override
59 public String[] getMandatoryParams() {
60 return new String[]{"data"};
61 }
62
63 @Override
64 public String[] getOptionalParams() {
65 return new String[] {"new_layer", "mime_type", "layer_name"};
66 }
67
68 @Override
69 public String getUsage() {
70 return "Reads data encoded directly in the URL and adds it to the current data set";
71 }
72
73 @Override
74 public String[] getUsageExamples() {
75 return new String[] {
76 "/load_data?layer_name=extra_layer&new_layer=true&data=%3Cosm%3E%3Cnode%3E...%3C%2Fnode%3E%3C%2Fosm%3E" };
77 }
78
79 @Override
80 public String getPermissionMessage() {
81 return tr("Remote Control has been asked to load the following data:")
82 + "<br>" + data;
83 }
84
85 @Override
86 public PermissionPrefWithDefault getPermissionPref() {
87 // Same permission as the import data, as the difference from a user pov is minimal
88 return PermissionPrefWithDefault.IMPORT_DATA;
89 }
90
91 @Override
92 protected void parseArgs() {
93 if (request.indexOf('?') == -1)
94 return; // nothing to do
95
96 Map<String, String> args = new HashMap<>();
97
98 // The data itself shouldn't contain any &, = or ? chars.
99 // Those are reserved for the URL parsing
100 // and should be URL encoded as %26, %3D or %3F
101 String query = request.substring(request.indexOf('?') + 1);
102 String[] params = query.split("&");
103 for (String param : params) {
104 String[] kv = param.split("=");
105 if (kv.length == 2)
106 args.put(kv[0], kv[1]);
107 }
108 this.args = args;
109 }
110
111 @Override
112 protected void validateRequest() throws RequestHandlerBadRequestException {
113 if (args.get("data") == null)
114 throw new RequestHandlerBadRequestException("RemoteControl: No data defined in URL");
115 try {
116 data = URLDecoder.decode(args.get("data"), "UTF-8");
117 } catch (UnsupportedEncodingException e) {
118 throw new RequestHandlerBadRequestException("RemoteControl: UnsupportedEncodingException: " + e.getMessage(), e);
119 }
120 mimeType = args.get("mime_type");
121 if (mimeType == null) {
122 mimeType = OSM_MIME_TYPE;
123 }
124 }
125
126 protected class LoadDataTask extends DownloadOsmTask.AbstractInternalTask {
127
128 protected final String layerName;
129
130 public LoadDataTask(boolean newLayer, DataSet dataSet, String layerName) {
131 super(newLayer, tr("Loading data"), false);
132 this.dataSet = dataSet;
133 this.layerName = layerName;
134 }
135
136 @Override
137 public void realRun() {
138 // No real run, the data is already loaded
139 }
140
141 @Override
142 protected void cancel() {
143 // No Cancel, would be hard without a real run
144 }
145
146 @Override
147 protected void finish() {
148 loadData(layerName, null);
149 }
150 }
151}
Note: See TracBrowser for help on using the repository browser.