|
15 | 15 |
|
16 | 16 | import com.lancedb.lance.namespace.client.apache.ApiException; |
17 | 17 | import com.lancedb.lance.namespace.model.ErrorResponse; |
| 18 | +import com.lancedb.lance.namespace.util.JsonUtil; |
| 19 | + |
| 20 | +import com.fasterxml.jackson.core.JsonProcessingException; |
| 21 | +import org.slf4j.Logger; |
| 22 | +import org.slf4j.LoggerFactory; |
| 23 | + |
| 24 | +import java.util.Optional; |
18 | 25 |
|
19 | 26 | public class LanceNamespaceException extends RuntimeException { |
| 27 | + private static final Logger LOG = LoggerFactory.getLogger(LanceNamespaceException.class); |
20 | 28 |
|
21 | | - private final ErrorResponse errorResponse; |
| 29 | + private final int code; |
| 30 | + private final String responseBody; |
| 31 | + private final Optional<ErrorResponse> errorResponse; |
| 32 | + |
| 33 | + public LanceNamespaceException(int code, String responseBody) { |
| 34 | + this.code = code; |
| 35 | + this.responseBody = responseBody; |
| 36 | + this.errorResponse = Optional.empty(); |
| 37 | + } |
22 | 38 |
|
23 | 39 | public LanceNamespaceException(ApiException e) { |
24 | | - // TODO: properly parse into ErrorResponse model |
25 | 40 | super(e.getResponseBody(), e); |
26 | 41 |
|
27 | | - this.errorResponse = new ErrorResponse(); |
28 | | - errorResponse.setStatus(e.getCode()); |
29 | | - errorResponse.type("/errors/api-exception"); |
30 | | - errorResponse.setTitle("Api Exception"); |
31 | | - errorResponse.setInstance("/v1/namespaces"); |
32 | | - errorResponse.setDetail(e.getResponseBody()); |
| 42 | + ErrorResponse eResp = parse(e); |
| 43 | + if (eResp != null) { |
| 44 | + this.code = 0; |
| 45 | + this.responseBody = null; |
| 46 | + this.errorResponse = Optional.of(eResp); |
| 47 | + } else { |
| 48 | + this.code = e.getCode(); |
| 49 | + this.responseBody = e.getResponseBody(); |
| 50 | + this.errorResponse = Optional.empty(); |
| 51 | + } |
33 | 52 | } |
34 | 53 |
|
35 | 54 | public LanceNamespaceException(ErrorResponse errorResponse) { |
36 | | - this.errorResponse = errorResponse; |
| 55 | + super(errorResponse.getType()); |
| 56 | + |
| 57 | + this.code = 0; |
| 58 | + this.responseBody = null; |
| 59 | + this.errorResponse = Optional.of(errorResponse); |
| 60 | + } |
| 61 | + |
| 62 | + private static ErrorResponse parse(ApiException e) { |
| 63 | + if (e.getResponseBody() != null) { |
| 64 | + try { |
| 65 | + return JsonUtil.INSTANCE.readValue(e.getResponseBody(), ErrorResponse.class); |
| 66 | + } catch (JsonProcessingException ex) { |
| 67 | + LOG.warn("Response body in wrong format. body={}", e.getResponseBody(), ex); |
| 68 | + } |
| 69 | + } |
| 70 | + |
| 71 | + return null; |
37 | 72 | } |
38 | 73 |
|
39 | 74 | public int getCode() { |
40 | | - return errorResponse.getStatus(); |
| 75 | + return errorResponse.isPresent() ? errorResponse.get().getStatus() : code; |
| 76 | + } |
| 77 | + |
| 78 | + public String getResponseBody() { |
| 79 | + return responseBody; |
41 | 80 | } |
42 | 81 |
|
43 | | - public ErrorResponse getErrorResponse() { |
| 82 | + public Optional<ErrorResponse> getErrorResponse() { |
44 | 83 | return errorResponse; |
45 | 84 | } |
46 | 85 |
|
47 | | - public static LanceNamespaceException badRequest(String detail) { |
| 86 | + public static LanceNamespaceException badRequest( |
| 87 | + String type, String title, String instance, String detail) { |
48 | 88 | ErrorResponse errorResponse = new ErrorResponse(); |
49 | | - errorResponse.type("/errors/bad-request"); |
50 | | - errorResponse.setTitle("Malformed request"); |
| 89 | + errorResponse.type(type); |
| 90 | + errorResponse.setTitle(title); |
51 | 91 | errorResponse.setStatus(400); |
52 | 92 | errorResponse.setDetail(detail); |
53 | | - errorResponse.setInstance("/v1/namespaces"); |
| 93 | + errorResponse.setInstance(instance); |
54 | 94 | return new LanceNamespaceException(errorResponse); |
55 | 95 | } |
56 | 96 |
|
57 | | - public static LanceNamespaceException unauthorized(String detail) { |
| 97 | + public static LanceNamespaceException unauthorized( |
| 98 | + String type, String title, String instance, String detail) { |
58 | 99 | ErrorResponse errorResponse = new ErrorResponse(); |
59 | | - errorResponse.type("/errors/unauthorized-request"); |
60 | | - errorResponse.setTitle("No valid authentication credentials for the operation"); |
| 100 | + errorResponse.type(type); |
| 101 | + errorResponse.setTitle(title); |
61 | 102 | errorResponse.setStatus(401); |
62 | 103 | errorResponse.setDetail(detail); |
63 | | - errorResponse.setInstance("/v1/namespaces"); |
| 104 | + errorResponse.setInstance(instance); |
64 | 105 | return new LanceNamespaceException(errorResponse); |
65 | 106 | } |
66 | 107 |
|
67 | | - public static LanceNamespaceException forbidden(String detail) { |
| 108 | + public static LanceNamespaceException forbidden( |
| 109 | + String type, String title, String instance, String detail) { |
68 | 110 | ErrorResponse errorResponse = new ErrorResponse(); |
69 | | - errorResponse.type("/errors/forbidden-request"); |
70 | | - errorResponse.setTitle("Not authorized to make this request"); |
| 111 | + errorResponse.type(type); |
| 112 | + errorResponse.setTitle(title); |
71 | 113 | errorResponse.setStatus(403); |
72 | 114 | errorResponse.setDetail(detail); |
73 | | - errorResponse.setInstance("/v1/namespaces"); |
| 115 | + errorResponse.setInstance(instance); |
74 | 116 | return new LanceNamespaceException(errorResponse); |
75 | 117 | } |
76 | 118 |
|
77 | | - public static LanceNamespaceException notFound(String detail) { |
| 119 | + public static LanceNamespaceException notFound( |
| 120 | + String type, String title, String instance, String detail) { |
78 | 121 | ErrorResponse errorResponse = new ErrorResponse(); |
79 | | - errorResponse.type("/errors/not-found-error"); |
80 | | - errorResponse.setTitle("Not found Error"); |
| 122 | + errorResponse.type(type); |
| 123 | + errorResponse.setTitle(title); |
81 | 124 | errorResponse.setStatus(404); |
82 | 125 | errorResponse.setDetail(detail); |
83 | | - errorResponse.setInstance("/v1/namespaces"); |
| 126 | + errorResponse.setInstance(instance); |
84 | 127 | return new LanceNamespaceException(errorResponse); |
85 | 128 | } |
86 | 129 |
|
87 | | - public static LanceNamespaceException unsupportedOperation(String detail) { |
| 130 | + public static LanceNamespaceException unsupportedOperation( |
| 131 | + String type, String title, String instance, String detail) { |
88 | 132 | ErrorResponse errorResponse = new ErrorResponse(); |
89 | | - errorResponse.type("/errors/unsupported-operation"); |
90 | | - errorResponse.setTitle("The server does not support this operation"); |
| 133 | + errorResponse.type(type); |
| 134 | + errorResponse.setTitle(title); |
91 | 135 | errorResponse.setStatus(406); |
92 | 136 | errorResponse.setDetail(detail); |
93 | | - errorResponse.setInstance("/v1/namespaces"); |
| 137 | + errorResponse.setInstance(instance); |
94 | 138 | return new LanceNamespaceException(errorResponse); |
95 | 139 | } |
96 | 140 |
|
97 | | - public static LanceNamespaceException conflict(String ns, String detail) { |
| 141 | + public static LanceNamespaceException conflict( |
| 142 | + String type, String title, String instance, String detail) { |
98 | 143 | ErrorResponse errorResponse = new ErrorResponse(); |
99 | | - errorResponse.type("/errors/conflict"); |
100 | | - errorResponse.setTitle("The namespace has been concurrently modified"); |
| 144 | + errorResponse.type(type); |
| 145 | + errorResponse.setTitle(title); |
101 | 146 | errorResponse.setStatus(409); |
102 | 147 | errorResponse.setDetail(detail); |
103 | | - errorResponse.setInstance(String.format("/v1/namespaces/%s", ns)); |
| 148 | + errorResponse.setInstance(instance); |
104 | 149 | return new LanceNamespaceException(errorResponse); |
105 | 150 | } |
106 | 151 |
|
107 | | - public static LanceNamespaceException serviceUnavailable(String detail) { |
| 152 | + public static LanceNamespaceException serviceUnavailable( |
| 153 | + String type, String title, String instance, String detail) { |
108 | 154 | ErrorResponse errorResponse = new ErrorResponse(); |
109 | | - errorResponse.type("/errors/service-unavailable"); |
110 | | - errorResponse.setTitle("Slow down"); |
| 155 | + errorResponse.type(type); |
| 156 | + errorResponse.setTitle(title); |
111 | 157 | errorResponse.setStatus(504); |
112 | 158 | errorResponse.setDetail(detail); |
113 | | - errorResponse.setInstance("/v1/namespaces"); |
| 159 | + errorResponse.setInstance(instance); |
114 | 160 | return new LanceNamespaceException(errorResponse); |
115 | 161 | } |
116 | 162 |
|
117 | | - public static LanceNamespaceException serverError(String detail) { |
| 163 | + public static LanceNamespaceException serverError( |
| 164 | + String type, String title, String instance, String detail) { |
118 | 165 | ErrorResponse errorResponse = new ErrorResponse(); |
119 | | - errorResponse.type("/errors/server-error"); |
120 | | - errorResponse.setTitle("Internal Server Error"); |
| 166 | + errorResponse.type(type); |
| 167 | + errorResponse.setTitle(title); |
121 | 168 | errorResponse.setStatus(500); |
122 | 169 | errorResponse.setDetail(detail); |
123 | | - errorResponse.setInstance("/v1/namespaces"); |
| 170 | + errorResponse.setInstance(instance); |
124 | 171 | return new LanceNamespaceException(errorResponse); |
125 | 172 | } |
126 | 173 | } |
0 commit comments