source: josm/trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java@ 5680

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

fix #8148 - Improve remote control handlers (requests validation, display of confirmation messages, robustness, javadoc)

File size: 3.3 KB
Line 
1package org.openstreetmap.josm.io.remotecontrol.handler;
2
3import static org.openstreetmap.josm.tools.I18n.tr;
4
5import java.util.ArrayList;
6import java.util.Arrays;
7import java.util.LinkedList;
8import java.util.List;
9
10import org.openstreetmap.josm.Main;
11import org.openstreetmap.josm.actions.AutoScaleAction;
12import org.openstreetmap.josm.command.AddCommand;
13import org.openstreetmap.josm.command.Command;
14import org.openstreetmap.josm.command.SequenceCommand;
15import org.openstreetmap.josm.data.coor.LatLon;
16import org.openstreetmap.josm.data.osm.Node;
17import org.openstreetmap.josm.data.osm.Way;
18import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
19import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler.RequestHandlerBadRequestException;
20
21/**
22 * Adds a way to the current dataset. For instance, {@code /add_way?way=lat1,lon2;lat2,lon2}.
23 */
24public class AddWayHandler extends RequestHandler {
25
26 /**
27 * The remote control command name used to add a way.
28 */
29 public static final String command = "add_way";
30
31 private final List<LatLon> allCoordinates = new ArrayList<LatLon>();
32
33 @Override
34 public String[] getMandatoryParams() {
35 return new String[]{"way"};
36 }
37
38 @Override
39 protected void handleRequest() throws RequestHandlerErrorException, RequestHandlerBadRequestException {
40 Way way = new Way();
41 List<Command> commands = new LinkedList<Command>();
42 for (LatLon ll : allCoordinates) {
43 Node node = new Node(ll);
44 way.addNode(node);
45 commands.add(new AddCommand(node));
46 }
47 allCoordinates.clear();
48 commands.add(new AddCommand(way));
49 Main.main.undoRedo.add(new SequenceCommand(tr("Add way"), commands));
50 Main.main.getCurrentDataSet().setSelected(way);
51 if (PermissionPrefWithDefault.CHANGE_VIEWPORT.isAllowed()) {
52 AutoScaleAction.autoScale("selection");
53 } else {
54 Main.map.mapView.repaint();
55 }
56 }
57
58 @Override
59 public String getPermissionMessage() {
60 return tr("Remote Control has been asked to create a new way.");
61 }
62
63 @Override
64 public PermissionPrefWithDefault getPermissionPref() {
65 return PermissionPrefWithDefault.CREATE_OBJECTS;
66 }
67
68 @Override
69 protected void validateRequest() throws RequestHandlerBadRequestException {
70 allCoordinates.clear();
71 for (String coordinatesString : args.get("way").split(";\\s*")) {
72 String[] coordinates = coordinatesString.split(",\\s*", 2);
73 if (coordinates.length < 2) {
74 throw new RequestHandlerBadRequestException(
75 tr("Invalid coordinates: {0}", Arrays.toString(coordinates)));
76 }
77 try {
78 double lat = Double.parseDouble(coordinates[0]);
79 double lon = Double.parseDouble(coordinates[1]);
80 allCoordinates.add(new LatLon(lat, lon));
81 } catch (NumberFormatException e) {
82 throw new RequestHandlerBadRequestException("NumberFormatException ("+e.getMessage()+")");
83 }
84 }
85 if (allCoordinates.isEmpty()) {
86 throw new RequestHandlerBadRequestException(tr("Empty ways"));
87 } else if (allCoordinates.size() == 1) {
88 throw new RequestHandlerBadRequestException(tr("One node ways"));
89 }
90 }
91}
Note: See TracBrowser for help on using the repository browser.