blob: f845765a98e5221deeba58c09037637d0e9d1ba4 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package androidx.test.espresso.flutter.internal.jsonrpc.message;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.base.Strings.isNullOrEmpty;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.annotations.SerializedName;
import java.util.Objects;
/**
* JSON-RPC 2.0 response object.
*
* <p>See https://www.jsonrpc.org/specification for detailed specification.
*/
public final class JsonRpcResponse {
private static final Gson gson = new Gson();
private static final String JSON_RPC_VERSION = "2.0";
/** Specifying the version of the JSON-RPC protocol. Must be "2.0". */
@SerializedName("jsonrpc")
private final String version;
/**
* Required. Must be the same as the value of the id in the corresponding JsonRpcRequest object.
*/
private String id;
/** The result of the JSON-RPC call. Required on success. */
private JsonObject result;
/** Error occurred in the JSON-RPC call. Required on error. */
private ErrorObject error;
/**
* Deserializes the given Json string to a {@code JsonRpcResponse} object.
*
* @param jsonString the string from which the object is to be deserialized.
* @return the deserialized object.
*/
public static JsonRpcResponse fromJson(String jsonString) {
checkArgument(!isNullOrEmpty(jsonString), "Json string cannot be null or empty.");
JsonRpcResponse response = gson.fromJson(jsonString, JsonRpcResponse.class);
checkState(!isNullOrEmpty(response.getId()));
checkState(JSON_RPC_VERSION.equals(response.getVersion()), "JSON-RPC version must be 2.0.");
return response;
}
/**
* Constructs with the given id and. The JSON-RPC version will be defaulted to "2.0".
*
* @param id the id of this response. Should be the same as the corresponding request.
*/
public JsonRpcResponse(String id) {
this.version = JSON_RPC_VERSION;
setId(id);
}
/**
* Gets the JSON-RPC version.
*
* @return the JSON-RPC version. Should always be "2.0".
*/
public String getVersion() {
return version;
}
/** Gets the id of this JSON-RPC response. */
public String getId() {
return id;
}
/**
* Sets the id of this JSON-RPC response.
*
* @param id the id to be set. Cannot be null.
*/
public void setId(String id) {
this.id = checkNotNull(id);
}
/** Gets the result of this JSON-RPC response. Should be present on success. */
public JsonObject getResult() {
return result;
}
/**
* Sets the result of this JSON-RPC response.
*
* @param result
*/
public void setResult(JsonObject result) {
this.result = result;
}
/** Gets the error object of this JSON-RPC response. Should be present on error. */
public ErrorObject getError() {
return error;
}
/**
* Sets the error object of this JSON-RPC response.
*
* @param error the error to be set.
*/
public void setError(ErrorObject error) {
this.error = error;
}
/**
* Serializes this object to its equivalent Json representation.
*
* @return the Json representation of this object.
*/
public String toJson() {
return gson.toJson(this);
}
/**
* Equivalent to {@link #toJson()}.
*
* @return the Json representation of this object.
*/
@Override
public String toString() {
return toJson();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof JsonRpcResponse) {
JsonRpcResponse objResponse = (JsonRpcResponse) obj;
return Objects.equals(objResponse.id, this.id)
&& Objects.equals(objResponse.result, this.result)
&& Objects.equals(objResponse.error, this.error);
} else {
return false;
}
}
@Override
public int hashCode() {
int hash = Objects.hashCode(id);
hash = hash * 31 + Objects.hashCode(result);
hash = hash * 31 + Objects.hashCode(error);
return hash;
}
}