diff --git a/base/src/main/java/de/staropensource/sosengine/base/internal/implementation/placeholder/crashhandler/Stacktrace.java b/base/src/main/java/de/staropensource/sosengine/base/internal/implementation/placeholder/crashhandler/Stacktrace.java index d33bde7..12d2082 100644 --- a/base/src/main/java/de/staropensource/sosengine/base/internal/implementation/placeholder/crashhandler/Stacktrace.java +++ b/base/src/main/java/de/staropensource/sosengine/base/internal/implementation/placeholder/crashhandler/Stacktrace.java @@ -19,9 +19,9 @@ package de.staropensource.sosengine.base.internal.implementation.placeholder.crashhandler; -import de.staropensource.sosengine.base.implementable.Placeholder; import de.staropensource.sosengine.base.exception.UnexpectedThrowableException; -import de.staropensource.sosengine.base.utility.StackTraceParser; +import de.staropensource.sosengine.base.implementable.Placeholder; +import de.staropensource.sosengine.base.utility.Miscellaneous; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -85,12 +85,10 @@ public final class Stacktrace implements Placeholder { stacktrace.append("\n"); // Append stack trace - StackTraceParser parser = new StackTraceParser(throwable); - stacktrace - .append(parser.getHeader()) + .append(Miscellaneous.getStackTraceHeader(throwable)) .append("\n") - .append(parser.getStackTrace()); + .append(Miscellaneous.getStackTraceAsString(throwable, true)); // Handle throwables which contain other throwables if (throwable instanceof UnexpectedThrowableException unexpectedThrowableException) diff --git a/base/src/main/java/de/staropensource/sosengine/base/internal/implementation/placeholder/crashhandler/StacktraceAll.java b/base/src/main/java/de/staropensource/sosengine/base/internal/implementation/placeholder/crashhandler/StacktraceAll.java index b6ee281..d897ae8 100644 --- a/base/src/main/java/de/staropensource/sosengine/base/internal/implementation/placeholder/crashhandler/StacktraceAll.java +++ b/base/src/main/java/de/staropensource/sosengine/base/internal/implementation/placeholder/crashhandler/StacktraceAll.java @@ -63,7 +63,7 @@ public final class StacktraceAll implements Placeholder { .append(thread.isDaemon()) .append(")") .append("\n") - .append(Miscellaneous.stringifyStackTrace(stacktraces.get(thread), false)); + .append(Miscellaneous.getStackTraceAsString(stacktraces.get(thread), false)); } return text.replace("%stacktrace_all%", output.toString().replace("<", "\\<")); diff --git a/base/src/main/java/de/staropensource/sosengine/base/utility/Miscellaneous.java b/base/src/main/java/de/staropensource/sosengine/base/utility/Miscellaneous.java index d445db0..e46d7f2 100644 --- a/base/src/main/java/de/staropensource/sosengine/base/utility/Miscellaneous.java +++ b/base/src/main/java/de/staropensource/sosengine/base/utility/Miscellaneous.java @@ -206,15 +206,25 @@ public final class Miscellaneous { return Thread.currentThread().threadId() == 1; } + /** + * Returns the {@code Caused by} message usually found when the JVM prints a throwable. + * + * @return stack trace header + * @since v1-alpha4 + */ + public static @NotNull String getStackTraceHeader(@NotNull Throwable throwable) { + return "Caused by: " + throwable.getClass().getName() + (throwable.getMessage() == null ? "" : ": " + throwable.getMessage()); + } + /** * Converts an array of {@link StackTraceElement}s into a regular string. * * @param stacktrace array of {@link StackTraceElement}s to convert * @param indent if all lines should be indented with a single {@code \t} character, like in regular stack traces * @return converted stacktrace string - * @since v1-alpha2 + * @since v1-alpha4 */ - public static @NotNull String stringifyStackTrace(@NotNull StackTraceElement[] stacktrace, boolean indent) { + public static @NotNull String getStackTraceAsString(@NotNull StackTraceElement[] stacktrace, boolean indent) { StringBuilder output = new StringBuilder(); for (StackTraceElement element : stacktrace) { @@ -228,4 +238,16 @@ public final class Miscellaneous { return output.toString(); } + + /** + * Converts the stacktrace of a throwable into a regular string. + * + * @param throwable throwable to derive the stacktrace from + * @param indent if all lines should be indented with a single {@code \t} character, like in regular stack traces + * @return converted stacktrace string + * @since v1-alpha4 + */ + public static @NotNull String getStackTraceAsString(@NotNull Throwable throwable, boolean indent) { + return getStackTraceAsString(throwable.getStackTrace(), indent); + } } diff --git a/base/src/main/java/de/staropensource/sosengine/base/utility/StackTraceParser.java b/base/src/main/java/de/staropensource/sosengine/base/utility/StackTraceParser.java deleted file mode 100644 index f5a79de..0000000 --- a/base/src/main/java/de/staropensource/sosengine/base/utility/StackTraceParser.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * STAROPENSOURCE ENGINE SOURCE FILE - * Copyright (c) 2024 The StarOpenSource Engine Authors - * Licensed under the GNU Affero General Public License v3 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.staropensource.sosengine.base.utility; - -import lombok.AccessLevel; -import lombok.Getter; -import org.jetbrains.annotations.NotNull; - -/** - * Parses the stacktrace of a {@link Throwable} for use in {@link String}s. - * - * @see Throwable - * @since v1-alpha0 - */ -// TODO deprecate """parser""" and move getHeader() to Miscellaneous class -public final class StackTraceParser { - /** - * Contains the {@link Throwable} to parse. - * - * @see Throwable - * @since v1-alpha0 - * -- GETTER -- - * Returns the {@link Throwable} to parse. - * - * @see Throwable - * @since v1-alpha0 - */ - @Getter(AccessLevel.PROTECTED) - private final @NotNull Throwable throwable; - - /** - * Constructs this class. - * - * @param throwable throwable to parse - * @since v1-alpha0 - */ - public StackTraceParser(@NotNull Throwable throwable) { - this.throwable = throwable; - } - - /** - * Returns the stack trace header. - * It looks like this: {@code Caused by java.lang.NullPointerThrowable: This application can crash!} - * - * @return stack trace header - * @since v1-alpha0 - */ - public @NotNull String getHeader() { - return "Caused by: " + throwable.getClass().getName() + (throwable.getMessage() == null ? "" : ": " + throwable.getMessage()); - } - - /** - * Returns the stack trace. - * - * @return stack trace - * @since v1-alpha0 - */ - public @NotNull String getStackTrace() { - return Miscellaneous.stringifyStackTrace(throwable.getStackTrace(), true); - } -} diff --git a/base/src/main/java/de/staropensource/sosengine/base/utility/information/EngineInformation.java b/base/src/main/java/de/staropensource/sosengine/base/utility/information/EngineInformation.java index c731c10..5516220 100644 --- a/base/src/main/java/de/staropensource/sosengine/base/utility/information/EngineInformation.java +++ b/base/src/main/java/de/staropensource/sosengine/base/utility/information/EngineInformation.java @@ -22,8 +22,8 @@ package de.staropensource.sosengine.base.utility.information; import de.staropensource.sosengine.base.Engine; import de.staropensource.sosengine.base.logging.LoggerInstance; import de.staropensource.sosengine.base.type.VersionType; +import de.staropensource.sosengine.base.utility.Miscellaneous; import de.staropensource.sosengine.base.utility.PropertiesReader; -import de.staropensource.sosengine.base.utility.StackTraceParser; import lombok.Getter; import org.jetbrains.annotations.NotNull; @@ -427,9 +427,8 @@ public final class EngineInformation { calendar.setTime(date); gitCommitTime = calendar.toZonedDateTime(); } catch (ParseException exception) { - StackTraceParser parser = new StackTraceParser(exception); System.out.println("Unable to load build information: Can't parse \"" + gitParser.getString("git.commit.time") + "\" using format \"yyyy-MM-dd'T'HH:mmZ\""); - System.out.println(parser.getHeader() + "\n" + parser.getStackTrace()); + System.out.println(Miscellaneous.getStackTraceHeader(exception) + "\n" + Miscellaneous.getStackTraceAsString(exception, true)); Engine.getInstance().shutdown(69); return; } diff --git a/base/src/test/java/de/staropensource/sosengine/base/srctests/utility/StackTraceParserTest.java b/base/src/test/java/de/staropensource/sosengine/base/srctests/utility/StackTraceParserTest.java deleted file mode 100644 index acf5b0d..0000000 --- a/base/src/test/java/de/staropensource/sosengine/base/srctests/utility/StackTraceParserTest.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * STAROPENSOURCE ENGINE SOURCE FILE - * Copyright (c) 2024 The StarOpenSource Engine Authors - * Licensed under the GNU Affero General Public License v3 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.staropensource.sosengine.base.srctests.utility; - -import de.staropensource.sosengine.base.srctests.TestBase; -import de.staropensource.sosengine.base.utility.StackTraceParser; -import org.jetbrains.annotations.NotNull; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** - * Tests the class {@link StackTraceParser}. - */ -@DisplayName("StackTraceParser") -class StackTraceParserTest extends TestBase { - /** - * Tests the method {@code getHeader}. - */ - @ParameterizedTest - @DisplayName("getHeader") - @ValueSource(strings = { - "", - "This is an example message", - "Some description here..." - }) - void testGetHeader(@NotNull String message) { - if (checkCondition()) return; - getLogger().testCall("testGetHeader", message); - - String output; - if (message.isEmpty()) - output = new StackTraceParser(new NumberFormatException()).getHeader(); - else - output = new StackTraceParser(new NumberFormatException(message)).getHeader(); - - String expected = "Caused by: " + NumberFormatException.class.getName(); - if (!message.isEmpty()) - expected += ": " + message; - assertEquals(expected, output, "Output \"" + output + "\" does not match expected output \"" + expected + "\""); - } -} diff --git a/testapp/src/main/java/de/staropensource/sosengine/testapp/Main.java b/testapp/src/main/java/de/staropensource/sosengine/testapp/Main.java index 974aad7..305dbe3 100644 --- a/testapp/src/main/java/de/staropensource/sosengine/testapp/Main.java +++ b/testapp/src/main/java/de/staropensource/sosengine/testapp/Main.java @@ -23,7 +23,7 @@ import de.staropensource.sosengine.base.Engine; import de.staropensource.sosengine.base.annotation.EventListener; import de.staropensource.sosengine.base.logging.LoggerInstance; import de.staropensource.sosengine.base.type.vector.Vec2i; -import de.staropensource.sosengine.base.utility.StackTraceParser; +import de.staropensource.sosengine.base.utility.Miscellaneous; import de.staropensource.sosengine.windowing.WindowingSubsystem; import de.staropensource.sosengine.windowing.event.InputEvent; import de.staropensource.sosengine.windowing.implementable.Window; @@ -148,18 +148,15 @@ public final class Main { StringBuilder message = new StringBuilder(); message.append("Render loop failed on some windows:\n"); - for (Window windowFailed : renderLoopFailures.keySet()) { - StackTraceParser parser = new StackTraceParser(renderLoopFailures.get(windowFailed)); - + for (Window windowFailed : renderLoopFailures.keySet()) message .append("-> ") .append(window) .append(": ") - .append(parser.getHeader()) + .append(Miscellaneous.getStackTraceHeader(renderLoopFailures.get(windowFailed))) .append("\n") - .append(parser.getStackTrace()) + .append(Miscellaneous.getStackTraceAsString(renderLoopFailures.get(windowFailed), true)) .append("\n"); - } logger.crash(message.toString()); } catch (Exception exception) {