-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathResponseParser.java
More file actions
77 lines (69 loc) · 3.27 KB
/
Copy pathResponseParser.java
File metadata and controls
77 lines (69 loc) · 3.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package com.gocardless.http;
import com.gocardless.errors.ApiErrorResponse;
import com.gocardless.errors.GoCardlessApiException;
import com.gocardless.errors.GoCardlessErrorMapper;
import com.gocardless.errors.MalformedResponseException;
import com.google.common.collect.ImmutableList;
import com.google.gson.*;
import com.google.gson.reflect.TypeToken;
import java.util.List;
final class ResponseParser {
private final Gson gson;
ResponseParser(Gson gson) {
this.gson = gson;
}
<T> T parseSingle(String responseBody, String envelope, Class<T> clazz) {
JsonElement json;
try {
json = new JsonParser().parse(responseBody);
} catch (JsonSyntaxException e) {
throw new MalformedResponseException(responseBody);
}
JsonObject object = json.getAsJsonObject().getAsJsonObject(envelope);
return gson.fromJson(object, clazz);
}
<T> ImmutableList<T> parseMultiple(String responseBody, String envelope,
TypeToken<List<T>> clazz) {
JsonObject json = new JsonParser().parse(responseBody).getAsJsonObject();
JsonArray array = json.getAsJsonArray(envelope);
List<T> items = gson.fromJson(array, clazz.getType());
return ImmutableList.copyOf(items);
}
<T> ImmutableList<T> parseMultiple(JsonObject json, String envelope, TypeToken<List<T>> clazz) {
JsonArray array = json.getAsJsonArray(envelope);
List<T> items = gson.fromJson(array, clazz.getType());
return ImmutableList.copyOf(items);
}
<T> ListResponse<T> parsePage(String responseBody, String envelope, TypeToken<List<T>> clazz) {
JsonObject json = new JsonParser().parse(responseBody).getAsJsonObject();
List<T> items = parseMultiple(json, envelope, clazz);
JsonObject metaJson = json.getAsJsonObject("meta");
ListResponse.Meta meta = gson.fromJson(metaJson, ListResponse.Meta.class);
JsonObject linkedJson = json.getAsJsonObject("linked");
ListResponse.Linked linked = gson.fromJson(linkedJson, ListResponse.Linked.class);
return new ListResponse<>(ImmutableList.copyOf(items), meta, linked);
}
GoCardlessApiException parseError(String responseBody, int statusCode) {
JsonElement json;
try {
json = new JsonParser().parse(responseBody);
} catch (JsonSyntaxException e) {
throw new MalformedResponseException(statusCode, responseBody);
}
try {
JsonElement errorElement = json.getAsJsonObject().get("error");
if (errorElement == null || errorElement.isJsonNull()) {
throw new MalformedResponseException(statusCode, responseBody);
}
if (errorElement.isJsonPrimitive()) {
ApiErrorResponse error =
ApiErrorResponse.fromMessage(errorElement.getAsString(), statusCode);
return GoCardlessErrorMapper.toException(error);
}
ApiErrorResponse error = gson.fromJson(errorElement, ApiErrorResponse.class);
return GoCardlessErrorMapper.toException(error);
} catch (IllegalStateException | ClassCastException | JsonSyntaxException e) {
throw new MalformedResponseException(statusCode, responseBody);
}
}
}