Ignore:
File:
1 edited

Legend:

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

    r5085 r5691  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
    6 import java.io.UnsupportedEncodingException;
    7 import java.net.URLDecoder;
     6import java.net.MalformedURLException;
     7import java.net.URL;
     8import java.util.Collection;
    89import java.util.HashMap;
    910
     11import org.openstreetmap.josm.Main;
    1012import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
    1113import org.openstreetmap.josm.actions.downloadtasks.DownloadTask;
     
    1719public class ImportHandler extends RequestHandler {
    1820
     21    /**
     22     * The remote control command name used to import data.
     23     */
    1924    public static final String command = "import";
     25   
     26    private URL url;
     27    private Collection<DownloadTask> suitableDownloadTasks;
    2028
    2129    @Override
    2230    protected void handleRequest() throws RequestHandlerErrorException {
    2331        try {
    24             DownloadTask osmTask = new DownloadOsmTask();
    25             osmTask.loadUrl(false, args.get("url"), null);
     32            if (suitableDownloadTasks != null && !suitableDownloadTasks.isEmpty()) {
     33                // TODO: add new_layer parameter
     34                // TODO: handle multiple suitable download tasks ?
     35                suitableDownloadTasks.iterator().next().loadUrl(false, url.toExternalForm(), null);
     36            }
    2637        } catch (Exception ex) {
    2738            System.out.println("RemoteControl: Error parsing import remote control request:");
     
    3849    @Override
    3950    public String getPermissionMessage() {
     51        // URL can be any suitable URL giving back OSM data, including OSM API calls, even if calls to the main API
     52        // should rather be passed to LoadAndZoomHandler or LoadObjectHandler.
     53        // Other API instances will however use the import handler to force JOSM to make requests to this API instance.
     54        // (Example with OSM-FR website that makes calls to the OSM-FR API)
     55        // For user-friendliness, let's try to decode these OSM API calls to give a better confirmation message.
     56        String taskMessage = null;
     57        if (suitableDownloadTasks != null && !suitableDownloadTasks.isEmpty()) {
     58            // TODO: handle multiple suitable download tasks ?
     59            taskMessage = suitableDownloadTasks.iterator().next().getConfirmationMessage(url);
     60        }
    4061        return tr("Remote Control has been asked to import data from the following URL:")
    41                 + "<br>" + request;
     62                + "<br>" + (taskMessage == null ? url.toString() : taskMessage);
    4263    }
    4364
     
    5374            String query = request.substring(request.indexOf('?') + 1);
    5475            if (query.indexOf("url=") == 0) {
    55                 args.put("url", decodeURL(query.substring(4)));
     76                args.put("url", decodeParam(query.substring(4)));
    5677            } else {
    5778                int urlIdx = query.indexOf("&url=");
    5879                if (urlIdx != -1) {
    59                     String url = query.substring(urlIdx + 1);
    60                     args.put("url", decodeURL(query.substring(urlIdx + 5)));
     80                    /*String url =*/ query.substring(urlIdx + 1);
     81                    args.put("url", decodeParam(query.substring(urlIdx + 5)));
    6182                    query = query.substring(0, urlIdx);
    6283                } else {
     
    7798    }
    7899
    79     private String decodeURL(String url) {
     100    @Override
     101    protected void validateRequest() throws RequestHandlerBadRequestException {
     102        final String urlString = args.get("url");
    80103        try {
    81             return URLDecoder.decode(url, "UTF-8");
    82         } catch (UnsupportedEncodingException e) {
    83             throw new RuntimeException();
     104            // Ensure the URL is valid
     105            url = new URL(urlString);
     106        } catch (MalformedURLException e) {
     107            throw new RequestHandlerBadRequestException("MalformedURLException: "+e.getMessage());
     108        }
     109        // Find download tasks for the given URL
     110        suitableDownloadTasks = Main.main.menu.openLocation.findDownloadTasks(urlString);
     111        if (suitableDownloadTasks.isEmpty()) {
     112            // It should maybe be better to reject the request in that case ?
     113            // For compatibility reasons with older instances of JOSM, arbitrary choice of DownloadOsmTask
     114            suitableDownloadTasks.add(new DownloadOsmTask());
    84115        }
    85116    }
Note: See TracChangeset for help on using the changeset viewer.