1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.linecorp.centraldogma.server.internal.thrift;
18
19 import com.linecorp.armeria.common.CompletableRpcResponse;
20 import com.linecorp.armeria.common.RpcRequest;
21 import com.linecorp.armeria.common.RpcResponse;
22 import com.linecorp.armeria.server.RpcService;
23 import com.linecorp.armeria.server.ServiceRequestContext;
24 import com.linecorp.armeria.server.SimpleDecoratingRpcService;
25 import com.linecorp.centraldogma.internal.thrift.CentralDogmaException;
26
27 public final class CentralDogmaExceptionTranslator extends SimpleDecoratingRpcService {
28
29 public CentralDogmaExceptionTranslator(RpcService delegate) {
30 super(delegate);
31 }
32
33 @Override
34 public RpcResponse serve(ServiceRequestContext ctx, RpcRequest req) throws Exception {
35 final CompletableRpcResponse newRes = new CompletableRpcResponse();
36 try {
37 final RpcResponse oldRes = unwrap().serve(ctx, req);
38 oldRes.handle((res, cause) -> {
39 if (cause != null) {
40 handleException(req, newRes, cause);
41 } else {
42 newRes.complete(res);
43 }
44 return null;
45 });
46 } catch (Throwable cause) {
47 handleException(req, newRes, cause);
48 }
49 return newRes;
50 }
51
52 private static void handleException(RpcRequest req, CompletableRpcResponse res, Throwable cause) {
53 final CentralDogmaException convertedCause = Converter.convert(cause);
54 CentralDogmaExceptions.log(req.method(), convertedCause);
55 res.completeExceptionally(convertedCause);
56 }
57 }