1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.util;
19
20 import java.io.IOException;
21 import java.util.ArrayList;
22 import java.util.List;
23
24 import org.apache.hadoop.ipc.RemoteException;
25 import org.apache.hadoop.hbase.classification.InterfaceAudience;
26 import org.apache.hadoop.hbase.classification.InterfaceStability;
27 import org.apache.hadoop.hbase.protobuf.generated.ErrorHandlingProtos.ForeignExceptionMessage;
28 import org.apache.hadoop.hbase.protobuf.generated.ErrorHandlingProtos.GenericExceptionMessage;
29 import org.apache.hadoop.hbase.protobuf.generated.ErrorHandlingProtos.StackTraceElementMessage;
30
31
32
33
34
35 @InterfaceAudience.Private
36 @InterfaceStability.Evolving
37 public final class ForeignExceptionUtil {
38 private ForeignExceptionUtil() { }
39
40 public static IOException toIOException(final ForeignExceptionMessage eem) {
41 GenericExceptionMessage gem = eem.getGenericException();
42 StackTraceElement[] trace = toStackTrace(gem.getTraceList());
43 RemoteException re = new RemoteException(gem.getClassName(), gem.getMessage());
44 re.setStackTrace(trace);
45 return re.unwrapRemoteException();
46 }
47
48 public static ForeignExceptionMessage toProtoForeignException(String source, Throwable t) {
49 GenericExceptionMessage.Builder gemBuilder = GenericExceptionMessage.newBuilder();
50 gemBuilder.setClassName(t.getClass().getName());
51 if (t.getMessage() != null) {
52 gemBuilder.setMessage(t.getMessage());
53 }
54
55 List<StackTraceElementMessage> stack = toProtoStackTraceElement(t.getStackTrace());
56 if (stack != null) {
57 gemBuilder.addAllTrace(stack);
58 }
59 GenericExceptionMessage payload = gemBuilder.build();
60 ForeignExceptionMessage.Builder exception = ForeignExceptionMessage.newBuilder();
61 exception.setGenericException(payload).setSource(source);
62 return exception.build();
63 }
64
65
66
67
68
69
70 public static List<StackTraceElementMessage> toProtoStackTraceElement(StackTraceElement[] trace) {
71
72 if (trace == null) return null;
73
74 List<StackTraceElementMessage> pbTrace = new ArrayList<StackTraceElementMessage>(trace.length);
75 for (StackTraceElement elem : trace) {
76 StackTraceElementMessage.Builder stackBuilder = StackTraceElementMessage.newBuilder();
77 stackBuilder.setDeclaringClass(elem.getClassName());
78 if (elem.getFileName() != null) {
79 stackBuilder.setFileName(elem.getFileName());
80 }
81 stackBuilder.setLineNumber(elem.getLineNumber());
82 stackBuilder.setMethodName(elem.getMethodName());
83 pbTrace.add(stackBuilder.build());
84 }
85 return pbTrace;
86 }
87
88
89
90
91
92
93
94
95 public static StackTraceElement[] toStackTrace(List<StackTraceElementMessage> traceList) {
96 if (traceList == null || traceList.size() == 0) {
97 return new StackTraceElement[0];
98 }
99 StackTraceElement[] trace = new StackTraceElement[traceList.size()];
100 for (int i = 0; i < traceList.size(); i++) {
101 StackTraceElementMessage elem = traceList.get(i);
102 trace[i] = new StackTraceElement(
103 elem.getDeclaringClass(), elem.getMethodName(),
104 elem.hasFileName() ? elem.getFileName() : null,
105 elem.getLineNumber());
106 }
107 return trace;
108 }
109 }