source: josm/trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java@ 5095

Last change on this file since 5095 was 5095, checked in by simon04, 13 years ago

fix #7518 - Remote Control "load_object" doesn't work with addtags

  • Property svn:eol-style set to native
File size: 9.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.awt.geom.Area;
7import java.awt.geom.Rectangle2D;
8import java.io.UnsupportedEncodingException;
9import java.net.URLDecoder;
10import java.util.HashSet;
11import java.util.Map;
12import java.util.concurrent.Future;
13
14import org.openstreetmap.josm.Main;
15import org.openstreetmap.josm.actions.AutoScaleAction;
16import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
17import org.openstreetmap.josm.actions.downloadtasks.DownloadTask;
18import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
19import org.openstreetmap.josm.data.Bounds;
20import org.openstreetmap.josm.data.coor.LatLon;
21import org.openstreetmap.josm.data.osm.DataSet;
22import org.openstreetmap.josm.data.osm.Node;
23import org.openstreetmap.josm.data.osm.OsmPrimitive;
24import org.openstreetmap.josm.data.osm.Relation;
25import org.openstreetmap.josm.data.osm.Way;
26import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
27import org.openstreetmap.josm.io.remotecontrol.AddTagsDialog;
28import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
29import org.openstreetmap.josm.tools.Utils;
30
31/**
32 * Handler for load_and_zoom request.
33 */
34public class LoadAndZoomHandler extends RequestHandler
35{
36 public static final String command = "load_and_zoom";
37 public static final String command2 = "zoom";
38
39 @Override
40 public String getPermissionMessage()
41 {
42 return tr("Remote Control has been asked to load data from the API.") +
43 "<br>" + tr("Request details: {0}", request);
44 }
45
46 @Override
47 public String[] getMandatoryParams()
48 {
49 return new String[] { "bottom", "top", "left", "right" };
50 }
51
52 @Override
53 protected void handleRequest() throws RequestHandlerErrorException
54 {
55 DownloadTask osmTask = new DownloadOsmTask();
56 double minlat = 0;
57 double maxlat = 0;
58 double minlon = 0;
59 double maxlon = 0;
60 try {
61 minlat = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("bottom")));
62 maxlat = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("top")));
63 minlon = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("left")));
64 maxlon = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("right")));
65 boolean newLayer = isLoadInNewLayer();
66
67 if(command.equals(myCommand))
68 {
69 if (!PermissionPrefWithDefault.LOAD_DATA.isAllowed())
70 {
71 System.out.println("RemoteControl: download forbidden by preferences");
72 }
73 else
74 {
75 Area toDownload = null;
76 if (!newLayer) {
77 // find out whether some data has already been downloaded
78 Area present = null;
79 DataSet ds = Main.main.getCurrentDataSet();
80 if (ds != null) {
81 present = ds.getDataSourceArea();
82 }
83 if (present != null && !present.isEmpty()) {
84 toDownload = new Area(new Rectangle2D.Double(minlon,minlat,maxlon-minlon,maxlat-minlat));
85 toDownload.subtract(present);
86 if (!toDownload.isEmpty())
87 {
88 // the result might not be a rectangle (L shaped etc)
89 Rectangle2D downloadBounds = toDownload.getBounds2D();
90 minlat = downloadBounds.getMinY();
91 minlon = downloadBounds.getMinX();
92 maxlat = downloadBounds.getMaxY();
93 maxlon = downloadBounds.getMaxX();
94 }
95 }
96 }
97 if (toDownload != null && toDownload.isEmpty())
98 {
99 System.out.println("RemoteControl: no download necessary");
100 }
101 else
102 {
103 Future<?> future = osmTask.download(newLayer, new Bounds(minlat,minlon,maxlat,maxlon), null /* let the task manage the progress monitor */);
104 Main.worker.submit(new PostDownloadHandler(osmTask, future));
105 }
106 }
107 }
108 } catch (Exception ex) {
109 System.out.println("RemoteControl: Error parsing load_and_zoom remote control request:");
110 ex.printStackTrace();
111 throw new RequestHandlerErrorException();
112 }
113
114 /**
115 * deselect objects if parameter addtags given
116 */
117 if (args.containsKey("addtags")) {
118 Main.worker.execute(new Runnable() {
119 public void run() {
120 DataSet ds = Main.main.getCurrentDataSet();
121 if(ds == null) // e.g. download failed
122 return;
123 ds.clearSelection();
124 }
125 });
126 }
127
128 if (args.containsKey("select") && PermissionPrefWithDefault.CHANGE_SELECTION.isAllowed()) {
129 // select objects after downloading, zoom to selection.
130 final String selection = args.get("select");
131 Main.worker.execute(new Runnable() {
132 public void run() {
133 HashSet<Long> ways = new HashSet<Long>();
134 HashSet<Long> nodes = new HashSet<Long>();
135 HashSet<Long> relations = new HashSet<Long>();
136 HashSet<OsmPrimitive> newSel = new HashSet<OsmPrimitive>();
137 for (String item : selection.split(",")) {
138 if (item.startsWith("way")) {
139 ways.add(Long.parseLong(item.substring(3)));
140 } else if (item.startsWith("node")) {
141 nodes.add(Long.parseLong(item.substring(4)));
142 } else if (item.startsWith("relation")) {
143 relations.add(Long.parseLong(item.substring(8)));
144 } else if (item.startsWith("rel")) {
145 relations.add(Long.parseLong(item.substring(3)));
146 } else {
147 System.out.println("RemoteControl: invalid selection '"+item+"' ignored");
148 }
149 }
150 DataSet ds = Main.main.getCurrentDataSet();
151 if(ds == null) // e.g. download failed
152 return;
153 for (Way w : ds.getWays()) {
154 if (ways.contains(w.getId())) {
155 newSel.add(w);
156 }
157 }
158 for (Node n : ds.getNodes()) {
159 if (nodes.contains(n.getId())) {
160 newSel.add(n);
161 }
162 }
163 for (Relation r : ds.getRelations()) {
164 if (relations.contains(r.getId())) {
165 newSel.add(r);
166 }
167 }
168 ds.setSelected(newSel);
169 if (PermissionPrefWithDefault.CHANGE_VIEWPORT.isAllowed()) {
170 AutoScaleAction.autoScale("selection");
171 }
172 if (Main.map != null && Main.map.relationListDialog != null) {
173 Main.map.relationListDialog.selectRelations(null); // unselect all relations to fix #7342
174 Main.map.relationListDialog.dataChanged(null);
175 Main.map.relationListDialog.selectRelations(Utils.filteredCollection(newSel, Relation.class));
176 }
177 }
178 });
179 } else if (PermissionPrefWithDefault.CHANGE_VIEWPORT.isAllowed()) {
180 // after downloading, zoom to downloaded area.
181 zoom(minlat, maxlat, minlon, maxlon);
182 }
183
184 addTags(args);
185
186 }
187
188 /*
189 * parse addtags parameters Example URL (part):
190 * addtags=wikipedia:de%3DResidenzschloss Dresden|name:en%3DDresden Castle
191 */
192 static void addTags(final Map<String, String> args) {
193 if (args.containsKey("addtags")) {
194 Main.worker.execute(new Runnable() {
195
196 public void run() {
197 String[] tags = null;
198 try {
199 tags = URLDecoder.decode(args.get("addtags"), "UTF-8").split("\\|");
200 } catch (UnsupportedEncodingException e) {
201 throw new RuntimeException();
202 }
203 String[][] keyValue = new String[tags.length][2];
204 for (int i = 0; i < tags.length; i++) {
205 keyValue[i] = tags[i].split("=");
206
207 keyValue[i][0] = keyValue[i][0];
208 keyValue[i][1] = keyValue[i][1];
209 }
210
211 new AddTagsDialog(keyValue);
212 }
213 });
214 }
215 }
216
217 protected void zoom(double minlat, double maxlat, double minlon, double maxlon) {
218 final Bounds bounds = new Bounds(new LatLon(minlat, minlon),
219 new LatLon(maxlat, maxlon));
220
221 // make sure this isn't called unless there *is* a MapView
222 //
223 if (Main.map != null && Main.map.mapView != null) {
224 Main.worker.execute(new Runnable() {
225 public void run() {
226 BoundingXYVisitor bbox = new BoundingXYVisitor();
227 bbox.visit(bounds);
228 Main.map.mapView.recalculateCenterScale(bbox);
229 }
230 });
231 }
232 }
233
234 @Override
235 public PermissionPrefWithDefault getPermissionPref() {
236 return null;
237 }
238}
Note: See TracBrowser for help on using the repository browser.