Ticket #9476: 9476.patch
| File 9476.patch, 8.4 KB (added by , 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- + 1 package org.openstreetmap.josm.io.remotecontrol; 2 3 import java.lang.annotation.ElementType; 4 import java.lang.annotation.Retention; 5 import java.lang.annotation.RetentionPolicy; 6 import java.lang.annotation.Target; 7 8 @Retention(RetentionPolicy.RUNTIME) 9 @Target(ElementType.METHOD) 10 public @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
- + 1 package org.openstreetmap.josm.io.remotecontrol; 2 3 import java.lang.annotation.ElementType; 4 import java.lang.annotation.Retention; 5 import java.lang.annotation.RetentionPolicy; 6 import java.lang.annotation.Target; 7 8 @Retention(RetentionPolicy.RUNTIME) 9 @Target(ElementType.PARAMETER) 10 public @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; 10 10 import java.io.PrintWriter; 11 11 import java.io.StringWriter; 12 12 import java.io.Writer; 13 import java.lang.reflect.Method; 14 import java.lang.reflect.Parameter; 13 15 import java.net.Socket; 14 16 import java.util.Arrays; 15 17 import java.util.Date; 16 18 import java.util.HashMap; 19 import java.util.List; 17 20 import java.util.Map; 18 21 import java.util.Map.Entry; 19 22 import java.util.StringTokenizer; … … public class RequestProcessor extends Thread { 209 212 210 213 // find a handler for this command 211 214 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 212 239 if (handlerClass == null) { 213 240 String usage = getUsageAsHtml(); 214 241 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; 13 13 import org.openstreetmap.josm.gui.util.GuiHelper; 14 14 import org.openstreetmap.josm.io.remotecontrol.AddTagsDialog; 15 15 import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault; 16 import org.openstreetmap.josm.io.remotecontrol.RequestMethod; 17 import org.openstreetmap.josm.io.remotecontrol.RequestParameter; 16 18 17 19 /** 18 20 * Loads OSM primitives using their ID … … public class LoadObjectHandler extends RequestHandler { 46 48 }; 47 49 } 48 50 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 49 87 @Override 50 88 protected void handleRequest() throws RequestHandlerErrorException, RequestHandlerBadRequestException { 51 89 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 { 190 190 * Can be overridden by subclass. 191 191 */ 192 192 protected void parseArgs() { 193 this.args = parseArgs(this.request); 194 } 195 196 public static Map<String, String> parseArgs(String request) { 193 197 try { 194 String req = URLDecoder.decode( this.request, "UTF-8");198 String req = URLDecoder.decode(request, "UTF-8"); 195 199 HashMap<String, String> args = new HashMap<String, String>(); 196 200 if (req.indexOf('?') != -1) { 197 201 String query = req.substring(req.indexOf('?') + 1); 198 202 if (query.indexOf('#') != -1) { 199 query = query.substring(0, query.indexOf('#'));200 }203 query = query.substring(0, query.indexOf('#')); 204 } 201 205 String[] params = query.split("&", -1); 202 206 for (String param : params) { 203 207 int eq = param.indexOf('='); … … public abstract class RequestHandler { 206 210 } 207 211 } 208 212 } 209 this.args =args;213 return args; 210 214 } catch (UnsupportedEncodingException ex) { 211 215 throw new IllegalStateException(ex); 212 216 }
