Home | History | Annotate | Download | only in jsonrpc
      1 /*
      2  * Copyright (C) 2018 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.googlecode.android_scripting.jsonrpc;
     18 
     19 import com.googlecode.android_scripting.Sl4aErrors;
     20 import com.googlecode.android_scripting.Sl4aException;
     21 
     22 import org.json.JSONException;
     23 import org.json.JSONObject;
     24 
     25 /**
     26  * Represents a JSON RPC result.
     27  *
     28  * @see http://json-rpc.org/wiki/specification
     29  */
     30 public class JsonRpcResult {
     31 
     32     private JsonRpcResult() {
     33         // Utility class.
     34     }
     35 
     36     /**
     37      * Returns a JSON-RPC 1.0 formatted request response.
     38      *
     39      * @param id   the id given by the request
     40      * @param data the data to pass into the result field
     41      * @return a JSON-RPC 1.0 formatted request response
     42      * @throws JSONException if JsonBuilder.build() cannot correctly convert the object into JSON
     43      */
     44     public static JSONObject result(Object id, Object data) throws JSONException {
     45         JSONObject response = new JSONObject();
     46         response.put("id", id);
     47         response.put("result", JsonBuilder.build(data));
     48         response.put("error", JSONObject.NULL);
     49         return response;
     50     }
     51 
     52     /**
     53      * Returns a JSON-RPC 2.0 formatted error response.
     54      *
     55      * @param id      the id given by the request
     56      * @param message the error message to send
     57      * @return a JSON-RPC 2.0 formatted request response
     58      * @throws JSONException if the world is ending
     59      */
     60     public static JSONObject error(Object id, Object message) throws JSONException {
     61         JSONObject response = new JSONObject();
     62         if (id == null) {
     63             id = JSONObject.NULL;
     64         }
     65         response.put("id", id);
     66         response.put("result", JSONObject.NULL);
     67         response.put("error", message.toString());
     68         return response;
     69     }
     70 
     71     /**
     72      * Returns a JSON-RPC 2.0 formatted error response.
     73      *
     74      * @param id            the id given by the request
     75      * @param sl4aException the Sl4aException to send over JSON-RPC
     76      * @return a JSON-RPC 2.0 formatted error response
     77      * @throws JSONException if the world is ending
     78      */
     79     public static JSONObject error(Object id, Sl4aException sl4aException) throws JSONException {
     80         JSONObject response = new JSONObject();
     81         if (id == null) {
     82             id = JSONObject.NULL;
     83         }
     84         response.put("id", id);
     85         response.put("result", JSONObject.NULL);
     86         JSONObject error = new JSONObject();
     87         error.put("code", sl4aException.getErrorCode());
     88         error.put("message", sl4aException.getErrorMessage());
     89         response.put("error", error);
     90         return response;
     91     }
     92 
     93     /**
     94      * Returns a JSON-RPC 2.0 formatted error response.
     95      *
     96      * @param id        the id given by the request
     97      * @param sl4aError the Sl4aErrors object to send over JSON-RPC
     98      * @param details   additional data associated with the error
     99      * @return a JSON-RPC 1.0 formatted error response
    100      * @throws JSONException if details cannot be converted to JSON
    101      */
    102     public static JSONObject error(Object id, Sl4aErrors sl4aError, Object details)
    103             throws JSONException {
    104         return error(id, sl4aError.getError(), details);
    105     }
    106 
    107 
    108     /**
    109      * Returns a JSON-RPC 2.0 formatted error response.
    110      *
    111      * @param id            the id given by the request
    112      * @param sl4aException the Sl4aException to send over JSON-RPC
    113      * @param details       additional data associated with the error
    114      * @return a JSON-RPC 2.0 formatted error response
    115      * @throws JSONException if the world is ending
    116      */
    117     public static JSONObject error(Object id, Sl4aException sl4aException, Object details)
    118             throws JSONException {
    119         JSONObject returnValue = error(id, sl4aException);
    120         returnValue.getJSONObject("error").put("data", details);
    121         return returnValue;
    122     }
    123 
    124     /**
    125      * A function that returns a valid JSON-RPC error as a string when all else has failed.
    126      *
    127      * @return a String representation of {@see Sl4aErrors.JSON_RPC_UNKNOWN_EXCEPTION} in JSON
    128      */
    129     public static String wtf() {
    130         Sl4aException exception = Sl4aErrors.JSON_RPC_UNKNOWN_EXCEPTION.getError();
    131         return "{\"id\":null,"
    132                 + "\"error\":{"
    133                 + "\"code\":" + exception.getErrorCode() + ","
    134                 + "\"message\":\"" + exception.getErrorMessage() + "\"}}";
    135     }
    136 }
    137