001    package org.openstreetmap.josm.io.remotecontrol.handler;
002    
003    import static org.openstreetmap.josm.tools.I18n.tr;
004    
005    import java.util.LinkedList;
006    import java.util.List;
007    import org.openstreetmap.josm.Main;
008    import org.openstreetmap.josm.actions.AutoScaleAction;
009    import org.openstreetmap.josm.command.AddCommand;
010    import org.openstreetmap.josm.command.Command;
011    import org.openstreetmap.josm.command.SequenceCommand;
012    import org.openstreetmap.josm.data.coor.LatLon;
013    import org.openstreetmap.josm.data.osm.Node;
014    import org.openstreetmap.josm.data.osm.Way;
015    import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
016    
017    /**
018     * Adds a way to the current dataset. For instance, {@code /add_way?way=lat1,lon2;lat2,lon2}.
019     */
020    public class AddWayHandler extends RequestHandler {
021    
022        public static final String command = "add_way";
023    
024        @Override
025        public String[] getMandatoryParams() {
026            return new String[]{"way"};
027        }
028    
029        @Override
030        protected void handleRequest() throws RequestHandlerErrorException, RequestHandlerBadRequestException {
031            Way way = new Way();
032            List<Command> commands = new LinkedList<Command>();
033            for (String coordinatesString : args.get("way").split(";\\s*")) {
034                String[] coordinates = coordinatesString.split(",\\s*", 2);
035                double lat = Double.parseDouble(coordinates[0]);
036                double lon = Double.parseDouble(coordinates[1]);
037                Node node = new Node(new LatLon(lat, lon));
038                way.addNode(node);
039                commands.add(new AddCommand(node));
040            }
041            commands.add(new AddCommand(way));
042            Main.main.undoRedo.add(new SequenceCommand(tr("Add way"), commands));
043            Main.main.getCurrentDataSet().setSelected(way);
044            if (PermissionPrefWithDefault.CHANGE_VIEWPORT.isAllowed()) {
045                AutoScaleAction.autoScale("selection");
046            } else {
047                Main.map.mapView.repaint();
048            }
049        }
050    
051        @Override
052        public String getPermissionMessage() {
053            return tr("Remote Control has been asked to create a new way.");
054        }
055    
056        @Override
057        public PermissionPrefWithDefault getPermissionPref() {
058            return PermissionPrefWithDefault.CREATE_OBJECTS;
059        }
060    }