Ticket #9476: 9476.patch

File 9476.patch, 8.4 KB (added by simon04, 12 years ago)
  • new file src/org/openstreetmap/josm/io/remotecontrol/RequestMethod.java

    commit 4f3016815dc9eafe0fe3ed4cfc8063487732783d
    Author: Simon Legner <Simon.Legner@gmail.com>
    Date:   Thu Dec 26 11:43:43 2013 +0100
    
        see #9476 - Annotations for remote control implementation
    
    diff --git a/src/org/openstreetmap/josm/io/remotecontrol/RequestMethod.java b/src/org/openstreetmap/josm/io/remotecontrol/RequestMethod.java
    new file mode 100644
    index 0000000..9c7fee5
    - +  
     1package org.openstreetmap.josm.io.remotecontrol;
     2
     3import java.lang.annotation.ElementType;
     4import java.lang.annotation.Retention;
     5import java.lang.annotation.RetentionPolicy;
     6import java.lang.annotation.Target;
     7
     8@Retention(RetentionPolicy.RUNTIME)
     9@Target(ElementType.METHOD)
     10public @interface RequestMethod {
     11    String command();
     12
     13    String contentType() default "text/plain";
     14
     15    String usage();
     16
     17    String[] usageExamples() default {};
     18}
  • new file src/org/openstreetmap/josm/io/remotecontrol/RequestParameter.java

    diff --git a/src/org/openstreetmap/josm/io/remotecontrol/RequestParameter.java b/src/org/openstreetmap/josm/io/remotecontrol/RequestParameter.java
    new file mode 100644
    index 0000000..44aafbb
    - +  
     1package org.openstreetmap.josm.io.remotecontrol;
     2
     3import java.lang.annotation.ElementType;
     4import java.lang.annotation.Retention;
     5import java.lang.annotation.RetentionPolicy;
     6import java.lang.annotation.Target;
     7
     8@Retention(RetentionPolicy.RUNTIME)
     9@Target(ElementType.PARAMETER)
     10public @interface RequestParameter {
     11    String name();
     12    boolean optional() default false;
     13}
  • src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java

    diff --git a/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java b/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java
    index 30c3acd..c73fc15 100644
    a b import java.io.OutputStreamWriter;  
    1010import java.io.PrintWriter;
    1111import java.io.StringWriter;
    1212import java.io.Writer;
     13import java.lang.reflect.Method;
     14import java.lang.reflect.Parameter;
    1315import java.net.Socket;
    1416import java.util.Arrays;
    1517import java.util.Date;
    1618import java.util.HashMap;
     19import java.util.List;
    1720import java.util.Map;
    1821import java.util.Map.Entry;
    1922import java.util.StringTokenizer;
    public class RequestProcessor extends Thread {  
    209212
    210213            // find a handler for this command
    211214            Class<? extends RequestHandler> handlerClass = handlers.get(command);
     215
     216            for (final Method m : handlerClass.getDeclaredMethods()) {
     217                final RequestMethod requestMethod = m.getAnnotation(RequestMethod.class);
     218                if (requestMethod != null) {
     219                    final Map<String, String> httpArgs = RequestHandler.parseArgs(url);
     220                    final List<String> args = Utils.transform(Arrays.asList(m.getParameters()), new Utils.Function<Parameter, String>() {
     221                        @Override
     222                        public String apply(Parameter x) {
     223                            final RequestParameter requestParameter = x.getAnnotation(RequestParameter.class);
     224                            if (requestParameter == null) {
     225                                return null;
     226                            } else {
     227                                return httpArgs.get(requestParameter.name());
     228                            }
     229                        }
     230                    });
     231                    final String result = (String) m.invoke(handlerClass.newInstance(), args.toArray());
     232                    sendHeader(out, "200 OK", requestMethod.contentType(), false);
     233                    out.write(result);
     234                    out.flush();
     235                    return;
     236                }
     237            }
     238
    212239            if (handlerClass == null) {
    213240                String usage = getUsageAsHtml();
    214241                String websiteDoc = HelpUtil.getWikiBaseHelpUrl() +"/Help/Preferences/RemoteControl";
  • src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java

    diff --git a/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java b/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java
    index 592e672..3cfcab5 100644
    a b import org.openstreetmap.josm.data.osm.SimplePrimitiveId;  
    1313import org.openstreetmap.josm.gui.util.GuiHelper;
    1414import org.openstreetmap.josm.io.remotecontrol.AddTagsDialog;
    1515import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
     16import org.openstreetmap.josm.io.remotecontrol.RequestMethod;
     17import org.openstreetmap.josm.io.remotecontrol.RequestParameter;
    1618
    1719/**
    1820 * Loads OSM primitives using their ID
    public class LoadObjectHandler extends RequestHandler {  
    4648        };
    4749    }
    4850
     51    @RequestMethod(
     52            command = "load_object",
     53            usage = "Download objects with given id.",
     54            usageExamples = {"/load_object?new_layer=true&objects=w106159509",
     55                    "/load_object?new_layer=true&objects=r2263653&relation_members=true"
     56            })
     57    public static void loadObject(@RequestParameter(name = "objects") String objects,
     58                              @RequestParameter(name="new_layer", optional = false) String new_layer,
     59                              @RequestParameter(name="relation_members", optional = false) String relation_members) {
     60        final List<PrimitiveId> ps = new LinkedList<PrimitiveId>();
     61        for (String i : objects.split(",\\s*")) {
     62            try {
     63                ps.add(SimplePrimitiveId.fromString(i));
     64            } catch (IllegalArgumentException e) {
     65                Main.warn("RemoteControl: invalid selection '" + i + "' ignored");
     66            }
     67        }
     68        if (!ps.isEmpty()) {
     69            final boolean newLayer = Boolean.parseBoolean(new_layer);
     70            final boolean relationMembers = Boolean.parseBoolean(relation_members);
     71            GuiHelper.runInEDTAndWait(new Runnable() {
     72                @Override public void run() {
     73                    DownloadPrimitiveAction.processItems(newLayer, ps, true, relationMembers);
     74                }
     75            });
     76            GuiHelper.executeByMainWorkerInEDT(new Runnable() {
     77                @Override
     78                public void run() {
     79                    Main.main.getCurrentDataSet().setSelected(ps);
     80                    // todo AddTagsDialog.addTags(args, sender);
     81                    ps.clear();
     82                }
     83            });
     84        }
     85    }
     86
    4987    @Override
    5088    protected void handleRequest() throws RequestHandlerErrorException, RequestHandlerBadRequestException {
    5189        if (!PermissionPrefWithDefault.LOAD_DATA.isAllowed()) {
  • src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java

    diff --git a/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java b/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java
    index cfdffd0..28c1136 100644
    a b public abstract class RequestHandler {  
    190190     * Can be overridden by subclass.
    191191     */
    192192    protected void parseArgs() {
     193        this.args = parseArgs(this.request);
     194    }
     195
     196    public static Map<String, String> parseArgs(String request) {
    193197        try {
    194             String req = URLDecoder.decode(this.request, "UTF-8");
     198            String req = URLDecoder.decode(request, "UTF-8");
    195199            HashMap<String, String> args = new HashMap<String, String>();
    196200            if (req.indexOf('?') != -1) {
    197201                String query = req.substring(req.indexOf('?') + 1);
    198202                if (query.indexOf('#') != -1) {
    199                             query = query.substring(0, query.indexOf('#'));
    200                         }
     203                    query = query.substring(0, query.indexOf('#'));
     204                }
    201205                String[] params = query.split("&", -1);
    202206                for (String param : params) {
    203207                    int eq = param.indexOf('=');
    public abstract class RequestHandler {  
    206210                    }
    207211                }
    208212            }
    209             this.args = args;
     213            return args;
    210214        } catch (UnsupportedEncodingException ex) {
    211215            throw new IllegalStateException(ex);
    212216        }