Changeset 5680 in josm


Ignore:
Timestamp:
2013-01-27T19:11:23+01:00 (11 years ago)
Author:
Don-vip
Message:

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

Location:
trunk/src/org/openstreetmap/josm/io/remotecontrol/handler
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java

    r5085 r5680  
    1111import org.openstreetmap.josm.data.osm.Node;
    1212import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
     13import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler.RequestHandlerBadRequestException;
    1314
    1415/**
     
    1718public class AddNodeHandler extends RequestHandler {
    1819
     20    /**
     21     * The remote control command name used to add a node.
     22     */
    1923    public static final String command = "add_node";
     24   
     25    private double lat;
     26    private double lon;
    2027
    2128    @Override
     
    3239    @Override
    3340    public String getPermissionMessage() {
    34         return tr("Remote Control has been asked to create a new node.");
     41        return tr("Remote Control has been asked to create a new node.") +
     42                "<br>" + tr("Coordinates: ") + args.get("lat") + ", " + args.get("lon");
    3543    }
    3644
     
    4755
    4856        // Parse the arguments
    49         double lat = Double.parseDouble(args.get("lat"));
    50         double lon = Double.parseDouble(args.get("lon"));
    5157        System.out.println("Adding node at (" + lat + ", " + lon + ")");
    5258
     
    6470        }
    6571    }
     72
     73    @Override
     74    protected void validateRequest() throws RequestHandlerBadRequestException {
     75        try {
     76            lat = Double.parseDouble(args.get("lat"));
     77            lon = Double.parseDouble(args.get("lon"));
     78        } catch (NumberFormatException e) {
     79            throw new RequestHandlerBadRequestException("NumberFormatException ("+e.getMessage()+")");
     80        }
     81    }
    6682}
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java

    r5085 r5680  
    33import static org.openstreetmap.josm.tools.I18n.tr;
    44
     5import java.util.ArrayList;
     6import java.util.Arrays;
    57import java.util.LinkedList;
    68import java.util.List;
     9
    710import org.openstreetmap.josm.Main;
    811import org.openstreetmap.josm.actions.AutoScaleAction;
     
    1417import org.openstreetmap.josm.data.osm.Way;
    1518import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
     19import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler.RequestHandlerBadRequestException;
    1620
    1721/**
     
    2024public class AddWayHandler extends RequestHandler {
    2125
     26    /**
     27     * The remote control command name used to add a way.
     28     */
    2229    public static final String command = "add_way";
     30   
     31    private final List<LatLon> allCoordinates = new ArrayList<LatLon>();
    2332
    2433    @Override
     
    3140        Way way = new Way();
    3241        List<Command> commands = new LinkedList<Command>();
    33         for (String coordinatesString : args.get("way").split(";\\s*")) {
    34             String[] coordinates = coordinatesString.split(",\\s*", 2);
    35             double lat = Double.parseDouble(coordinates[0]);
    36             double lon = Double.parseDouble(coordinates[1]);
    37             Node node = new Node(new LatLon(lat, lon));
     42        for (LatLon ll : allCoordinates) {
     43            Node node = new Node(ll);
    3844            way.addNode(node);
    3945            commands.add(new AddCommand(node));
    4046        }
     47        allCoordinates.clear();
    4148        commands.add(new AddCommand(way));
    4249        Main.main.undoRedo.add(new SequenceCommand(tr("Add way"), commands));
     
    5865        return PermissionPrefWithDefault.CREATE_OBJECTS;
    5966    }
     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    }
    6091}
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java

    r5445 r5680  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
    6 import java.io.UnsupportedEncodingException;
    7 import java.net.URLDecoder;
    86import java.util.HashMap;
    97
     
    5957                imgInfo.setDefaultMinZoom(Integer.parseInt(min_zoom));
    6058            } catch (NumberFormatException e) {
    61                 System.err.println(e.getMessage());
     59                System.err.println("NumberFormatException ("+e.getMessage()+")");
    6260            }
    6361        }
     
    6765                imgInfo.setDefaultMaxZoom(Integer.parseInt(max_zoom));
    6866            } catch (NumberFormatException e) {
    69                 System.err.println(e.getMessage());
     67                System.err.println("NumberFormatException ("+e.getMessage()+")");
    7068            }
    7169        }
     
    102100    }
    103101
    104     private String decodeParam(String param) {
    105         try {
    106             return URLDecoder.decode(param, "UTF-8");
    107         } catch (UnsupportedEncodingException e) {
    108             throw new RuntimeException();
    109         }
     102    @Override
     103    protected void validateRequest() throws RequestHandlerBadRequestException {
     104        // Nothing to do
    110105    }
    111106}
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java

    r5085 r5680  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
    6 import java.io.UnsupportedEncodingException;
    7 import java.net.URLDecoder;
    86import java.util.HashMap;
    97
     
    1715public class ImportHandler extends RequestHandler {
    1816
     17    /**
     18     * The remote control command name used to import data.
     19     */
    1920    public static final String command = "import";
    2021
     
    3940    public String getPermissionMessage() {
    4041        return tr("Remote Control has been asked to import data from the following URL:")
    41                 + "<br>" + request;
     42                + "<br>" + args.get("url");
    4243    }
    4344
     
    5354            String query = request.substring(request.indexOf('?') + 1);
    5455            if (query.indexOf("url=") == 0) {
    55                 args.put("url", decodeURL(query.substring(4)));
     56                args.put("url", decodeParam(query.substring(4)));
    5657            } else {
    5758                int urlIdx = query.indexOf("&url=");
    5859                if (urlIdx != -1) {
    59                     String url = query.substring(urlIdx + 1);
    60                     args.put("url", decodeURL(query.substring(urlIdx + 5)));
     60                    /*String url =*/ query.substring(urlIdx + 1);
     61                    args.put("url", decodeParam(query.substring(urlIdx + 5)));
    6162                    query = query.substring(0, urlIdx);
    6263                } else {
     
    7778    }
    7879
    79     private String decodeURL(String url) {
    80         try {
    81             return URLDecoder.decode(url, "UTF-8");
    82         } catch (UnsupportedEncodingException e) {
    83             throw new RuntimeException();
    84         }
     80    @Override
     81    protected void validateRequest() throws RequestHandlerBadRequestException {
     82        // Nothing to do
    8583    }
    8684}
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java

    r5668 r5680  
    2020import org.openstreetmap.josm.data.Bounds;
    2121import org.openstreetmap.josm.data.coor.LatLon;
     22import org.openstreetmap.josm.data.osm.BBox;
    2223import org.openstreetmap.josm.data.osm.DataSet;
    2324import org.openstreetmap.josm.data.osm.Node;
     
    3536public class LoadAndZoomHandler extends RequestHandler
    3637{
     38    /**
     39     * The remote control command name used to load data and zoom.
     40     */
    3741    public static final String command = "load_and_zoom";
     42   
     43    /**
     44     * The remote control command name used to zoom.
     45     */
    3846    public static final String command2 = "zoom";
     47
     48    // Mandatory arguments
     49    private double minlat;
     50    private double maxlat;
     51    private double minlon;
     52    private double maxlon;
     53
     54    // Optional argument 'select'
     55    private final Set<Long> ways = new HashSet<Long>();
     56    private final Set<Long> nodes = new HashSet<Long>();
     57    private final Set<Long> relations = new HashSet<Long>();
    3958
    4059    @Override
    4160    public String getPermissionMessage()
    4261    {
    43         return tr("Remote Control has been asked to load data from the API.") +
    44                 "<br>" + tr("Request details: {0}", request);
     62        String msg = tr("Remote Control has been asked to load data from the API.") +
     63                "<br>" + tr("Bounding box: ") + new BBox(minlon, minlat, maxlon, maxlat).toStringCSV(", ");
     64        if (args.containsKey("select") && ways.size()+nodes.size()+relations.size() > 0) {
     65            msg += "<br>" + tr("Sel.: Rel.:{0} / Ways:{1} / Nodes:{2}", relations.size(), ways.size(), nodes.size());
     66        }
     67        return msg;
    4568    }
    4669
     
    5578    {
    5679        DownloadTask osmTask = new DownloadOsmTask();
    57         double minlat = 0;
    58         double maxlat = 0;
    59         double minlon = 0;
    60         double maxlon = 0;
    6180        try {
    62             minlat = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("bottom")));
    63             maxlat = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("top")));
    64             minlon = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("left")));
    65             maxlon = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("right")));
    6681            boolean newLayer = isLoadInNewLayer();
    6782
     
    130145        if (args.containsKey("select") && PermissionPrefWithDefault.CHANGE_SELECTION.isAllowed()) {
    131146            // select objects after downloading, zoom to selection.
    132             final String selection = args.get("select");
    133             Main.worker.execute(new Runnable() {
    134                 public void run() {
    135                     HashSet<Long> ways = new HashSet<Long>();
    136                     HashSet<Long> nodes = new HashSet<Long>();
    137                     HashSet<Long> relations = new HashSet<Long>();
     147            Main.worker.execute(new Runnable() {
     148                public void run() {
    138149                    HashSet<OsmPrimitive> newSel = new HashSet<OsmPrimitive>();
    139                     for (String item : selection.split(",")) {
    140                         if (item.startsWith("way")) {
    141                             ways.add(Long.parseLong(item.substring(3)));
    142                         } else if (item.startsWith("node")) {
    143                             nodes.add(Long.parseLong(item.substring(4)));
    144                         } else if (item.startsWith("relation")) {
    145                             relations.add(Long.parseLong(item.substring(8)));
    146                         } else if (item.startsWith("rel")) {
    147                             relations.add(Long.parseLong(item.substring(3)));
    148                         } else {
    149                             System.out.println("RemoteControl: invalid selection '"+item+"' ignored");
    150                         }
    151                     }
    152150                    DataSet ds = Main.main.getCurrentDataSet();
    153151                    if(ds == null) // e.g. download failed
     
    158156                        }
    159157                    }
     158                    ways.clear();
    160159                    for (Node n : ds.getNodes()) {
    161160                        if (nodes.contains(n.getId())) {
     
    163162                        }
    164163                    }
     164                    nodes.clear();
    165165                    for (Relation r : ds.getRelations()) {
    166166                        if (relations.contains(r.getId())) {
     
    168168                        }
    169169                    }
     170                    relations.clear();
    170171                    ds.setSelected(newSel);
    171172                    if (PermissionPrefWithDefault.CHANGE_VIEWPORT.isAllowed()) {
     
    190191
    191192        addTags(args);
    192 
    193193    }
    194194
     
    245245        return null;
    246246    }
     247
     248    @Override
     249    protected void validateRequest() throws RequestHandlerBadRequestException {
     250        // Process mandatory arguments
     251        minlat = 0;
     252        maxlat = 0;
     253        minlon = 0;
     254        maxlon = 0;
     255        try {
     256            minlat = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("bottom")));
     257            maxlat = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("top")));
     258            minlon = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("left")));
     259            maxlon = LatLon.roundToOsmPrecision(Double.parseDouble(args.get("right")));
     260        } catch (NumberFormatException e) {
     261            throw new RequestHandlerBadRequestException("NumberFormatException ("+e.getMessage()+")");
     262        }
     263
     264        // Process optional argument 'select'
     265        if (args.containsKey("select")) {
     266            ways.clear();
     267            nodes.clear();
     268            relations.clear();
     269            for (String item : args.get("select").split(",")) {
     270                try {
     271                    if (item.startsWith("way")) {
     272                        ways.add(Long.parseLong(item.substring(3)));
     273                    } else if (item.startsWith("node")) {
     274                        nodes.add(Long.parseLong(item.substring(4)));
     275                    } else if (item.startsWith("relation")) {
     276                        relations.add(Long.parseLong(item.substring(8)));
     277                    } else if (item.startsWith("rel")) {
     278                        relations.add(Long.parseLong(item.substring(3)));
     279                    } else {
     280                        System.out.println("RemoteControl: invalid selection '"+item+"' ignored");
     281                    }
     282                } catch (NumberFormatException e) {
     283                    System.out.println("RemoteControl: invalid selection '"+item+"' ignored");
     284                }
     285            }
     286        }
     287    }
    247288}
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java

    r5116 r5680  
    1818public class LoadObjectHandler extends RequestHandler {
    1919
     20    /**
     21     * The remote control command name used to load objects using their ID.
     22     */
    2023    public static final String command = "load_object";
     24   
     25    private final List<PrimitiveId> ps = new LinkedList<PrimitiveId>();
    2126
    2227    @Override
     
    3035            System.out.println("RemoteControl: download forbidden by preferences");
    3136        }
    32         final List<PrimitiveId> ps = new LinkedList<PrimitiveId>();
    33         for (String i : args.get("objects").split(",\\s*")) {
    34             ps.add(SimplePrimitiveId.fromString(i));
     37        if (!ps.isEmpty()) {
     38            boolean newLayer = isLoadInNewLayer();
     39            boolean relationMembers = Boolean.parseBoolean(args.get("relation_members"));
     40            DownloadPrimitiveAction.processItems(newLayer, ps, true, relationMembers);
     41            Main.worker.submit(new Runnable() {
     42   
     43                @Override
     44                public void run() {
     45                    Main.main.getCurrentDataSet().setSelected(ps);
     46                    LoadAndZoomHandler.addTags(args);
     47                    ps.clear();
     48                }
     49            });
    3550        }
    36         boolean newLayer = isLoadInNewLayer();
    37         boolean relationMembers = Boolean.parseBoolean(args.get("relation_members"));
    38         DownloadPrimitiveAction.processItems(newLayer, ps, true, relationMembers);
    39         Main.worker.submit(new Runnable() {
    40 
    41             @Override
    42             public void run() {
    43                 Main.main.getCurrentDataSet().setSelected(ps);
    44                 LoadAndZoomHandler.addTags(args);
    45             }
    46         });
    4751    }
    4852
     
    5660        return PermissionPrefWithDefault.LOAD_DATA;
    5761    }
     62
     63    @Override
     64    protected void validateRequest() throws RequestHandlerBadRequestException {
     65        ps.clear();
     66        for (String i : args.get("objects").split(",\\s*")) {
     67            try {
     68                ps.add(SimplePrimitiveId.fromString(i));
     69            } catch (IllegalArgumentException e) {
     70                System.out.println("RemoteControl: invalid selection '"+i+"' ignored");
     71            }
     72        }
     73    }
    5874}
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/OpenFileHandler.java

    r5085 r5680  
    77import static org.openstreetmap.josm.tools.I18n.tr;
    88
     9/**
     10 * Opens a local file
     11 */
    912public class OpenFileHandler extends RequestHandler {
    1013
     14    /**
     15     * The remote control command name used to open a local file.
     16     */
    1117    public static final String command = "open_file";
    1218
     
    3036        return tr("Remote Control has been asked to open a local file.");
    3137    }
     38
     39    @Override
     40    protected void validateRequest() throws RequestHandlerBadRequestException {
     41        // Nothing to do
     42    }
    3243}
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java

    r5103 r5680  
    5353    {
    5454        checkMandatoryParams();
     55        validateRequest();
    5556        checkPermission();
    5657        handleRequest();
    5758    }
     59
     60    /**
     61     * Validates the request before attempting to perform it.
     62     * @throws RequestHandlerBadRequestException
     63     * @since 5678
     64     */
     65    protected abstract void validateRequest() throws RequestHandlerBadRequestException;
    5866
    5967    /**
     
    219227    }
    220228
     229    protected final String decodeParam(String param) {
     230        try {
     231            return URLDecoder.decode(param, "UTF-8");
     232        } catch (UnsupportedEncodingException e) {
     233            throw new RuntimeException();
     234        }
     235    }
     236
    221237    public static class RequestHandlerException extends Exception {
    222238
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/VersionHandler.java

    r5085 r5680  
    1212public class VersionHandler extends RequestHandler {
    1313
     14    /**
     15     * The remote control command name used to reply version.
     16     */
    1417    public static final String command = "version";
    1518
     
    3841        return null;
    3942    }
     43
     44    @Override
     45    protected void validateRequest() throws RequestHandlerBadRequestException {
     46        // Nothing to do
     47    }
    4048}
Note: See TracChangeset for help on using the changeset viewer.