/** * Convert a stack trace to list of {@link StackTraceElement}. * @param trace the stack trace to convert to protobuf message * @return <tt>null</tt> if the passed stack is <tt>null</tt>. */ private static List<StackTraceElementMessage> toStackTraceElementMessages( StackTraceElement[] trace) { // if there is no stack trace, ignore it and just return the message if (trace == null) return null; // build the stack trace for the message List<StackTraceElementMessage> pbTrace = new ArrayList<StackTraceElementMessage>(trace.length); for (StackTraceElement elem : trace) { StackTraceElementMessage.Builder stackBuilder = StackTraceElementMessage.newBuilder(); stackBuilder.setDeclaringClass(elem.getClassName()); stackBuilder.setFileName(elem.getFileName()); stackBuilder.setLineNumber(elem.getLineNumber()); stackBuilder.setMethodName(elem.getMethodName()); pbTrace.add(stackBuilder.build()); } return pbTrace; }
/** * Converts a ForeignException to an array of bytes. * @param source the name of the external exception source * @param t the "local" external exception (local) * @return protobuf serialized version of ForeignException */ public static byte[] serialize(String source, Throwable t) { GenericExceptionMessage.Builder gemBuilder = GenericExceptionMessage.newBuilder(); gemBuilder.setClassName(t.getClass().getName()); if (t.getMessage() != null) { gemBuilder.setMessage(t.getMessage()); } // set the stack trace, if there is one List<StackTraceElementMessage> stack = ForeignException.toStackTraceElementMessages(t.getStackTrace()); if (stack != null) { gemBuilder.addAllTrace(stack); } GenericExceptionMessage payload = gemBuilder.build(); ForeignExceptionMessage.Builder exception = ForeignExceptionMessage.newBuilder(); exception.setGenericException(payload).setSource(source); ForeignExceptionMessage eem = exception.build(); return eem.toByteArray(); }
public static ForeignExceptionMessage toProtoForeignException(String source, Throwable t) { GenericExceptionMessage.Builder gemBuilder = GenericExceptionMessage.newBuilder(); gemBuilder.setClassName(t.getClass().getName()); if (t.getMessage() != null) { gemBuilder.setMessage(t.getMessage()); } // set the stack trace, if there is one List<StackTraceElementMessage> stack = toProtoStackTraceElement(t.getStackTrace()); if (stack != null) { gemBuilder.addAllTrace(stack); } GenericExceptionMessage payload = gemBuilder.build(); ForeignExceptionMessage.Builder exception = ForeignExceptionMessage.newBuilder(); exception.setGenericException(payload).setSource(source); return exception.build(); }
/** * Convert a stack trace to list of {@link StackTraceElement}. * @param trace the stack trace to convert to protobuf message * @return <tt>null</tt> if the passed stack is <tt>null</tt>. */ public static List<StackTraceElementMessage> toProtoStackTraceElement(StackTraceElement[] trace) { // if there is no stack trace, ignore it and just return the message if (trace == null) return null; // build the stack trace for the message List<StackTraceElementMessage> pbTrace = new ArrayList<StackTraceElementMessage>(trace.length); for (StackTraceElement elem : trace) { StackTraceElementMessage.Builder stackBuilder = StackTraceElementMessage.newBuilder(); stackBuilder.setDeclaringClass(elem.getClassName()); if (elem.getFileName() != null) { stackBuilder.setFileName(elem.getFileName()); } stackBuilder.setLineNumber(elem.getLineNumber()); stackBuilder.setMethodName(elem.getMethodName()); pbTrace.add(stackBuilder.build()); } return pbTrace; }
/** * Unwind a serialized array of {@link StackTraceElementMessage}s to a * {@link StackTraceElement}s. * @param traceList list that was serialized * @return the deserialized list or <tt>null</tt> if it couldn't be unwound (e.g. wasn't set on * the sender). */ private static StackTraceElement[] toStackTrace(List<StackTraceElementMessage> traceList) { if (traceList == null || traceList.size() == 0) { return new StackTraceElement[0]; // empty array } StackTraceElement[] trace = new StackTraceElement[traceList.size()]; for (int i = 0; i < traceList.size(); i++) { StackTraceElementMessage elem = traceList.get(i); trace[i] = new StackTraceElement( elem.getDeclaringClass(), elem.getMethodName(), elem.getFileName(), elem.getLineNumber()); } return trace; }
/** * Unwind a serialized array of {@link StackTraceElementMessage}s to a * {@link StackTraceElement}s. * @param traceList list that was serialized * @return the deserialized list or <tt>null</tt> if it couldn't be unwound (e.g. wasn't set on * the sender). */ public static StackTraceElement[] toStackTrace(List<StackTraceElementMessage> traceList) { if (traceList == null || traceList.size() == 0) { return new StackTraceElement[0]; // empty array } StackTraceElement[] trace = new StackTraceElement[traceList.size()]; for (int i = 0; i < traceList.size(); i++) { StackTraceElementMessage elem = traceList.get(i); trace[i] = new StackTraceElement( elem.getDeclaringClass(), elem.getMethodName(), elem.hasFileName() ? elem.getFileName() : null, elem.getLineNumber()); } return trace; }