com.javonet.utils.exceptions.ExceptionSerializer Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of javonet-java-sdk Show documentation
Show all versions of javonet-java-sdk Show documentation
Javonet allows you to reference and use modules or packages written in (Java/Kotlin/Groovy/Clojure, C#/VB.NET, Ruby, Perl, Python, JavaScript/TypeScript) like they were created in your technology.
It works on Linux/Windows and MacOS for applications created in JVM, CLR/Netcore, Perl, Python, Ruby, NodeJS, C++ or GoLang and gives you unparalleled freedom and flexibility with native performance in building your mixed-technologies products.
Let it be accessing best AI or cryptography libraries, devices SDKs, legacy client modules, internal custom packages or anything from public repositories available on NPM, Nuget, PyPI, Maven/Gradle, RubyGems or GitHub. Get free from programming languages barriers today!
For more information check out our guides at https://www.javonet.com/guides/v2/
package com.javonet.utils.exceptions;
import com.javonet.utils.ExceptionType;
import com.javonet.utils.Command;
import com.javonet.utils.CommandType;
import java.util.Arrays;
import java.util.Optional;
public class ExceptionSerializer {
public static Command serializeException(Throwable exception, Command command) {
Command exceptionCommand = new Command(command.getRuntimeName(),
CommandType.EXCEPTION, new Object[]{});
//TODO: Create Debug mode flag for commands
boolean isDebug = false;
StringBuilder stackClasses = new StringBuilder();
StringBuilder stackMethods = new StringBuilder();
StringBuilder stackLines = new StringBuilder();
StringBuilder stackFiles = new StringBuilder();
StackTraceElement[] stackTraceElements;
if (isDebug) {
stackTraceElements = exception.getStackTrace();
}
else {
stackTraceElements = getStackTraceAfterReflection(exception.getStackTrace());
}
serializeStackTrace(stackTraceElements, stackClasses, stackMethods, stackLines, stackFiles);
exceptionCommand = exceptionCommand.addArgToPayload(getExceptionCode(exception));
exceptionCommand = exceptionCommand.addArgToPayload(command.toString());
exceptionCommand = exceptionCommand.addArgToPayload(exception.getClass().getName());
exceptionCommand = exceptionCommand.addArgToPayload(exception.getMessage());
exceptionCommand = exceptionCommand.addArgToPayload(stackClasses.toString());
exceptionCommand = exceptionCommand.addArgToPayload(stackMethods.toString());
exceptionCommand = exceptionCommand.addArgToPayload(stackLines.toString());
exceptionCommand = exceptionCommand.addArgToPayload(stackFiles.toString());
return exceptionCommand;
}
private static void serializeStackTrace(
StackTraceElement[] stackTraceElements,
StringBuilder stackClasses,
StringBuilder stackMethods,
StringBuilder stackLines,
StringBuilder stackFiles) {
for (StackTraceElement stackTraceElement : stackTraceElements) {
stackClasses.append(Optional.of(stackTraceElement.getClassName()).orElse("undefined")).append("|");
stackMethods.append(Optional.of(stackTraceElement.getMethodName()).orElse("undefined")).append("|");
stackLines.append(Optional.of(stackTraceElement.getLineNumber()).orElse(0)).append("|");
stackFiles.append(Optional.ofNullable(stackTraceElement.getFileName()).orElse("undefined")).append("|");
}
}
private static StackTraceElement[] getStackTraceAfterReflection(StackTraceElement[] stackTrace) {
int index = 0;
for (StackTraceElement element : stackTrace) {
if (element.getClassName().contains("javonet") || element.getClassName().contains("reflect")) {
break;
}
index++;
}
return Arrays.copyOfRange(stackTrace, 0, index);
}
private static Object getExceptionCode(Throwable exception){
switch (exception.getClass().getSimpleName()){
case "IOException":
return ExceptionType.IO_EXCEPTION.ordinal();
case "FileNotFoundException":
return ExceptionType.FILE_NOT_FOUND_EXCEPTION.ordinal();
case "RuntimeException":
return ExceptionType.RUNTIME_EXCEPTION.ordinal();
case "ArithmeticException":
return ExceptionType.ARITHMETIC_EXCEPTION.ordinal();
case "IllegalArgumentException":
return ExceptionType.ILLEGAL_ARGUMENT_EXCEPTION.ordinal();
case "IndexOutOfBoundsException":
case "StringIndexOutOfBoundsException":
case "ArrayIndexOutOfBoundsException":
return ExceptionType.INDEX_OUT_OF_BOUNDS_EXCEPTION.ordinal();
case "NullPointerException":
return ExceptionType.NULL_POINTER_EXCEPTION.ordinal();
default:
return ExceptionType.EXCEPTION.ordinal();
}
}
}