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

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

fix #11998 - add two new protected boolean members to simplify customization of OSM download task for plugins + fix some javadoc/sonar issues

  • Property svn:eol-style set to native
File size: 4.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.io.ByteArrayInputStream;
7import java.nio.charset.StandardCharsets;
8
9import org.openstreetmap.josm.Main;
10import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
11import org.openstreetmap.josm.data.osm.DataSet;
12import org.openstreetmap.josm.io.IllegalDataException;
13import org.openstreetmap.josm.io.OsmReader;
14import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
15import org.openstreetmap.josm.tools.Utils;
16
17/**
18 * Handler to load data directly from the URL.
19 * @since 7636
20 */
21public class LoadDataHandler extends RequestHandler {
22
23 private static final String OSM_MIME_TYPE = "application/x-osm+xml";
24
25 /**
26 * The remote control command name used to import data.
27 */
28 public static final String command = "load_data";
29
30 /**
31 * Holds the data input string
32 */
33 private String data;
34
35 /**
36 * Holds the parsed data set
37 */
38 private DataSet dataSet;
39
40 @Override
41 protected void handleRequest() throws RequestHandlerErrorException {
42 Main.worker.submit(new LoadDataTask(isLoadInNewLayer(), dataSet, args.get("layer_name")));
43 }
44
45 @Override
46 public String[] getMandatoryParams() {
47 return new String[]{"data"};
48 }
49
50 @Override
51 public String[] getOptionalParams() {
52 return new String[] {"new_layer", "mime_type", "layer_name"};
53 }
54
55 @Override
56 public String getUsage() {
57 return "Reads data encoded directly in the URL and adds it to the current data set";
58 }
59
60 @Override
61 public String[] getUsageExamples() {
62 return new String[]{
63 "/load_data?layer_name=extra_layer&new_layer=true&data=" +
64 Utils.encodeUrl("<osm version='0.6'><node id='-1' lat='1' lon='2' /></osm>")};
65 }
66
67 @Override
68 public String getPermissionMessage() {
69 return tr("Remote Control has been asked to load the following data:")
70 + "<br>" + data;
71 }
72
73 @Override
74 public PermissionPrefWithDefault getPermissionPref() {
75 // Same permission as the import data, as the difference from a user pov is minimal
76 return PermissionPrefWithDefault.IMPORT_DATA;
77 }
78
79 @Override
80 protected void validateRequest() throws RequestHandlerBadRequestException {
81 this.data = args.get("data");
82 /**
83 * Holds the mime type. Currently only OSM_MIME_TYPE is supported
84 * But it could be extended to text/csv, application/gpx+xml, ... or even binary encoded data
85 */
86 final String mimeType = Utils.firstNonNull(args.get("mime_type"), OSM_MIME_TYPE);
87 try {
88 if (OSM_MIME_TYPE.equals(mimeType)) {
89 final ByteArrayInputStream in = new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8));
90 dataSet = OsmReader.parseDataSet(in, null);
91 } else {
92 dataSet = new DataSet();
93 }
94 } catch (IllegalDataException e) {
95 throw new RequestHandlerBadRequestException("Failed to parse " + data + ": " + e.getMessage(), e);
96 }
97 }
98
99 protected class LoadDataTask extends DownloadOsmTask.AbstractInternalTask {
100
101 protected final String layerName;
102
103 /**
104 * Constructs a new {@code LoadDataTask}.
105 * @param newLayer if {@code true}, force download to a new layer
106 * @param dataSet data set
107 * @param layerName layer name
108 */
109 public LoadDataTask(boolean newLayer, DataSet dataSet, String layerName) {
110 super(newLayer, tr("Loading data"), false, true);
111 this.dataSet = dataSet;
112 this.layerName = layerName;
113 }
114
115 @Override
116 public void realRun() {
117 // No real run, the data is already loaded
118 }
119
120 @Override
121 protected void cancel() {
122 // No Cancel, would be hard without a real run
123 }
124
125 @Override
126 protected void finish() {
127 loadData(layerName, null);
128 }
129 }
130}
Note: See TracBrowser for help on using the repository browser.