001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.io.remotecontrol.handler;
003    
004    import static org.openstreetmap.josm.tools.I18n.tr;
005    
006    import java.io.UnsupportedEncodingException;
007    import java.net.URLDecoder;
008    import java.util.HashMap;
009    
010    import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
011    import org.openstreetmap.josm.actions.downloadtasks.DownloadTask;
012    import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
013    
014    /**
015     * Handler for import request
016     */
017    public class ImportHandler extends RequestHandler {
018    
019        public static final String command = "import";
020    
021        @Override
022        protected void handleRequest() throws RequestHandlerErrorException {
023            try {
024                DownloadTask osmTask = new DownloadOsmTask();
025                osmTask.loadUrl(false, args.get("url"), null);
026            } catch (Exception ex) {
027                System.out.println("RemoteControl: Error parsing import remote control request:");
028                ex.printStackTrace();
029                throw new RequestHandlerErrorException();
030            }
031        }
032    
033        @Override
034        public String[] getMandatoryParams() {
035            return new String[]{"url"};
036        }
037    
038        @Override
039        public String getPermissionMessage() {
040            return tr("Remote Control has been asked to import data from the following URL:")
041                    + "<br>" + request;
042        }
043    
044        @Override
045        public PermissionPrefWithDefault getPermissionPref() {
046            return PermissionPrefWithDefault.IMPORT_DATA;
047        }
048    
049        @Override
050        protected void parseArgs() {
051            HashMap<String, String> args = new HashMap<String, String>();
052            if (request.indexOf('?') != -1) {
053                String query = request.substring(request.indexOf('?') + 1);
054                if (query.indexOf("url=") == 0) {
055                    args.put("url", decodeURL(query.substring(4)));
056                } else {
057                    int urlIdx = query.indexOf("&url=");
058                    if (urlIdx != -1) {
059                        String url = query.substring(urlIdx + 1);
060                        args.put("url", decodeURL(query.substring(urlIdx + 5)));
061                        query = query.substring(0, urlIdx);
062                    } else {
063                        if (query.indexOf('#') != -1) {
064                            query = query.substring(0, query.indexOf('#'));
065                        }
066                    }
067                    String[] params = query.split("&", -1);
068                    for (String param : params) {
069                        int eq = param.indexOf('=');
070                        if (eq != -1) {
071                            args.put(param.substring(0, eq), param.substring(eq + 1));
072                        }
073                    }
074                }
075            }
076            this.args = args;
077        }
078    
079        private String decodeURL(String url) {
080            try {
081                return URLDecoder.decode(url, "UTF-8");
082            } catch (UnsupportedEncodingException e) {
083                throw new RuntimeException();
084            }
085        }
086    }