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 }