/**
* Copyright 2016-2017 Sixt GmbH & Co. Autovermietung KG
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain a
* copy of the License at http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package com.sixt.service.framework.json;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.sixt.service.framework.rpc.RpcCallException;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import javax.servlet.http.HttpServletResponse;
public class JsonRpcResponse {
public final static String ID_FIELD = "id";
public final static String ERROR_FIELD = "error";
public final static String RESULT_FIELD = "result";
private JsonElement id;
private JsonElement result;
private JsonElement error;
// HTTP status code, not part of the JSON-RPC spec, used for internal purposes only
private int statusCode;
public JsonRpcResponse(JsonElement id, JsonElement result, JsonElement error, int statusCode) {
setId(id);
setResult(result);
setError(error);
setStatusCode(statusCode);
}
public JsonObject toJson() {
JsonObject retval = new JsonObject();
retval.add(ID_FIELD, id);
retval.add(ERROR_FIELD, error);
retval.add(RESULT_FIELD, result);
return retval;
}
@Override
public String toString() {
ToStringBuilder builder = new ToStringBuilder(this);
builder.append(ID_FIELD, getId());
builder.append(RESULT_FIELD, getResult());
builder.append(ERROR_FIELD, getError());
return builder.toString();
}
public static JsonRpcResponse fromString(String rawResponse) {
JsonParser parser = new JsonParser();
JsonObject response = parser.parse(rawResponse).getAsJsonObject();
JsonElement id = response.get("id");
JsonElement errorElement = response.get("error");
int responseStatus = HttpServletResponse.SC_OK;
String error;
if (! (errorElement instanceof JsonNull)) {
if (errorElement instanceof JsonObject) {
error = errorElement.toString();
// try parsing it into RpcCallException to get the HttpStatus from there
RpcCallException rpcEx = RpcCallException.fromJson(error);
if (rpcEx != null) {
responseStatus = rpcEx.getCategory().getHttpStatus();
JsonElement resultElement = response.get("result");
return new JsonRpcResponse(id, resultElement == null ? JsonNull.INSTANCE : resultElement,
errorElement, responseStatus);
}
}
error = errorElement.getAsString();
if (StringUtils.isNotBlank(error)) {
responseStatus = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
}
}
JsonElement resultElement = response.get("result");
return new JsonRpcResponse(id, resultElement == null ? JsonNull.INSTANCE : resultElement,
errorElement, responseStatus);
}
public JsonElement getId() {
return id;
}
public void setId(JsonElement id) {
this.id = id;
}
public JsonElement getResult() {
return result;
}
public void setResult(JsonElement result) {
this.result = result;
}
public JsonElement getError() {
return error;
}
public void setError(JsonElement error) {
this.error = error;
}
public int getStatusCode() { return statusCode; }
public void setStatusCode(int statusCode) { this.statusCode = statusCode; }
}