Changeset 16550 in josm


Ignore:
Timestamp:
2020-06-07T13:09:55+02:00 (4 years ago)
Author:
simon04
Message:

RequestProcessor.getHandlersInfoAsJSON: use javax.json

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

Legend:

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

    r16190 r16550  
    77import java.io.InputStreamReader;
    88import java.io.OutputStreamWriter;
    9 import java.io.PrintWriter;
    10 import java.io.StringWriter;
    119import java.io.Writer;
    1210import java.net.Socket;
    1311import java.nio.charset.Charset;
    1412import java.nio.charset.StandardCharsets;
     13import java.util.Arrays;
     14import java.util.Collection;
    1515import java.util.Date;
    1616import java.util.HashMap;
     
    2424import java.util.regex.Matcher;
    2525import java.util.regex.Pattern;
     26import java.util.stream.Collectors;
     27
     28import javax.json.Json;
     29import javax.json.JsonArray;
     30import javax.json.JsonArrayBuilder;
     31import javax.json.JsonObject;
     32import javax.json.JsonObjectBuilder;
    2633
    2734import org.openstreetmap.josm.gui.help.HelpUtil;
     
    390397
    391398    /**
    392      * Returns the JSON information for all handlers.
    393      * @return the JSON information for all handlers
    394      */
    395     public static String getHandlersInfoAsJSON() {
    396         StringBuilder r = new StringBuilder();
    397         boolean first = true;
    398         r.append('[');
    399 
    400         for (Entry<String, Class<? extends RequestHandler>> p : handlers.entrySet()) {
    401             if (first) {
    402                 first = false;
    403             } else {
    404                 r.append(", ");
    405             }
    406             r.append(getHandlerInfoAsJSON(p.getKey()));
    407         }
    408         r.append(']');
    409 
    410         return r.toString();
     399     * Returns the JSON information for the given (if null: all) handlers.
     400     * @param handlers the handlers
     401     * @return the JSON information for the given (if null: all) handlers
     402     */
     403    public static JsonArray getHandlersInfoAsJSON(Collection<String> handlers) {
     404        JsonArrayBuilder json = Json.createArrayBuilder();
     405        for (String s : Utils.firstNonNull(handlers, RequestProcessor.handlers.keySet())) {
     406            json.add(getHandlerInfoAsJSON(s));
     407        }
     408        return json.build();
    411409    }
    412410
     
    416414     * @return JSON information for the given handler
    417415     */
    418     public static String getHandlerInfoAsJSON(String cmd) {
    419         try (StringWriter w = new StringWriter()) {
    420             RequestHandler handler = null;
    421             try {
    422                 Class<?> c = handlers.get(cmd);
    423                 if (c == null) return null;
    424                 handler = handlers.get(cmd).getConstructor().newInstance();
    425             } catch (ReflectiveOperationException ex) {
    426                 Logging.error(ex);
    427                 return null;
    428             }
    429 
    430             try (PrintWriter r = new PrintWriter(w)) {
    431                 printJsonInfo(cmd, r, handler);
    432                 return w.toString();
    433             }
    434         } catch (IOException e) {
    435             Logging.error(e);
     416    public static JsonObject getHandlerInfoAsJSON(String cmd) {
     417        RequestHandler handler;
     418        try {
     419            Class<?> c = handlers.get(cmd);
     420            if (c == null) return null;
     421            handler = handlers.get(cmd).getConstructor().newInstance();
     422        } catch (ReflectiveOperationException ex) {
     423            Logging.warn("Unknown handler " + cmd);
     424            Logging.error(ex);
    436425            return null;
    437426        }
    438     }
    439 
    440     private static void printJsonInfo(String cmd, PrintWriter r, RequestHandler handler) {
    441         r.printf("{ \"request\" : \"%s\"", cmd);
     427        return getHandlerInfoAsJSON(cmd, handler);
     428    }
     429
     430    private static JsonObject getHandlerInfoAsJSON(String cmd, RequestHandler handler) {
     431        JsonObjectBuilder json = Json.createObjectBuilder();
     432        json.add("request", cmd);
    442433        if (handler.getUsage() != null) {
    443             r.printf(", \"usage\" : \"%s\"", handler.getUsage());
    444         }
    445         r.append(", \"parameters\" : [");
    446 
    447         String[] params = handler.getMandatoryParams();
    448         if (params != null) {
    449             for (int i = 0; i < params.length; i++) {
    450                 if (i == 0) {
    451                     r.append('\"');
    452                 } else {
    453                     r.append(", \"");
    454                 }
    455                 r.append(params[i]).append('\"');
    456             }
    457         }
    458         r.append("], \"optional\" : [");
    459         String[] optional = handler.getOptionalParams();
    460         if (optional != null) {
    461             for (int i = 0; i < optional.length; i++) {
    462                 if (i == 0) {
    463                     r.append('\"');
    464                 } else {
    465                     r.append(", \"");
    466                 }
    467                 r.append(optional[i]).append('\"');
    468             }
    469         }
    470 
    471         r.append("], \"examples\" : [");
    472         String[] examples = handler.getUsageExamples(cmd.substring(1));
    473         if (examples != null) {
    474             for (int i = 0; i < examples.length; i++) {
    475                 if (i == 0) {
    476                     r.append('\"');
    477                 } else {
    478                     r.append(", \"");
    479                 }
    480                 r.append(examples[i]).append('\"');
    481             }
    482         }
    483         r.append("]}");
     434            json.add("usage", handler.getUsage());
     435        }
     436        json.add("parameters", toJsonArray(handler.getMandatoryParams()));
     437        json.add("optional", toJsonArray(handler.getOptionalParams()));
     438        json.add("examples", toJsonArray(handler.getUsageExamples(cmd.substring(1))));
     439        return json.build();
     440    }
     441
     442    private static JsonArray toJsonArray(String[] strings) {
     443        return Arrays.stream(strings)
     444                .collect(Collectors.collectingAndThen(Collectors.toList(), Json::createArrayBuilder))
     445                .build();
    484446    }
    485447
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/FeaturesHandler.java

    r12620 r16550  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
     6import java.util.Arrays;
     7import java.util.Collection;
     8
    69import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
    710import org.openstreetmap.josm.io.remotecontrol.RequestProcessor;
    8 import org.openstreetmap.josm.tools.Logging;
    911
    1012/**
     
    2022
    2123    @Override
    22     protected void handleRequest() throws RequestHandlerErrorException,
    23             RequestHandlerBadRequestException {
    24         StringBuilder buf = new StringBuilder();
     24    protected void handleRequest() throws RequestHandlerErrorException, RequestHandlerBadRequestException {
    2525        String q = args.get("q");
    26         if (q != null) {
    27             buf.append('[');
    28             boolean first = true;
    29             for (String s: q.split("[,\\s]+")) {
    30                if (first) {
    31                    first = false;
    32                } else {
    33                    buf.append(", ");
    34                }
    35                String info = RequestProcessor.getHandlerInfoAsJSON('/'+s);
    36                if (info != null) {
    37                    buf.append(info);
    38                } else {
    39                    Logging.warn("Unknown handler {0} passed to /features request", s);
    40                }
    41             }
    42             buf.append(']');
    43         } else {
    44             buf.append(RequestProcessor.getHandlersInfoAsJSON());
    45         }
    46 
    47         content = buf.toString();
     26        Collection<String> handlers = q == null ? null : Arrays.asList(q.split("[,\\s]+"));
     27        content = RequestProcessor.getHandlersInfoAsJSON(handlers).toString();
    4828        contentType = "application/json";
    4929        if (args.containsKey("jsonp")) {
Note: See TracChangeset for help on using the changeset viewer.