From f2ca9a6b319ad0ade04837f6830e682bc86c01a2 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sat, 5 Nov 2022 17:14:12 +0000 Subject: [PATCH] Revert switch to JUL for better colours Signed-off-by: TheKodeToad --- libraries/launcher/CMakeLists.txt | 2 + .../org/prismlauncher/EntryPoint.java | 30 ++-- .../launcher/impl/legacy/LegacyFrame.java | 16 +-- .../launcher/impl/legacy/LegacyLauncher.java | 12 +- .../prismlauncher/utils/ReflectionUtils.java | 17 +-- .../prismlauncher/utils/logging/Level.java | 54 +++++++ .../org/prismlauncher/utils/logging/Log.java | 134 ++++++++++++++++++ 7 files changed, 223 insertions(+), 42 deletions(-) create mode 100644 libraries/launcher/org/prismlauncher/utils/logging/Level.java create mode 100644 libraries/launcher/org/prismlauncher/utils/logging/Log.java diff --git a/libraries/launcher/CMakeLists.txt b/libraries/launcher/CMakeLists.txt index d176b1d4..90adcd3d 100644 --- a/libraries/launcher/CMakeLists.txt +++ b/libraries/launcher/CMakeLists.txt @@ -18,6 +18,8 @@ set(SRC org/prismlauncher/utils/Parameters.java org/prismlauncher/utils/ReflectionUtils.java org/prismlauncher/utils/StringUtils.java + org/prismlauncher/utils/logging/Level.java + org/prismlauncher/utils/logging/Log.java net/minecraft/Launcher.java ) add_jar(NewLaunch ${SRC}) diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index 512b01a9..34e65672 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -55,24 +55,21 @@ package org.prismlauncher; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; + import org.prismlauncher.exception.ParseException; import org.prismlauncher.launcher.Launcher; import org.prismlauncher.launcher.impl.StandardLauncher; import org.prismlauncher.launcher.impl.legacy.LegacyLauncher; import org.prismlauncher.utils.Parameters; import org.prismlauncher.utils.StringUtils; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.logging.Level; -import java.util.logging.Logger; +import org.prismlauncher.utils.logging.Log; public final class EntryPoint { - private static final Logger LOGGER = Logger.getLogger("EntryPoint"); - private EntryPoint() { } @@ -80,7 +77,7 @@ public final class EntryPoint { ExitCode exitCode = listen(); if (exitCode != ExitCode.NORMAL) { - LOGGER.warning("Exiting with " + exitCode); + Log.fatal("Exiting with " + exitCode); System.exit(exitCode.numericalCode); } @@ -123,14 +120,14 @@ public final class EntryPoint { preLaunchAction = PreLaunchAction.ABORT; } } catch (IOException | ParseException e) { - LOGGER.log(Level.SEVERE, "Launcher abort due to exception", e); + Log.fatal("Launcher abort due to exception", e); return ExitCode.ILLEGAL_ARGUMENT; } // Main loop if (preLaunchAction == PreLaunchAction.ABORT) { - LOGGER.info("Launch aborted by the launcher"); + Log.fatal("Launch aborted by the launcher"); return ExitCode.ABORT; } @@ -150,19 +147,22 @@ public final class EntryPoint { throw new IllegalArgumentException("Invalid launcher type: " + type); } + Log.launcher("Using " + type + " launcher"); + Log.blankLine(); + launcher.launch(); return ExitCode.NORMAL; } catch (IllegalArgumentException e) { - LOGGER.log(Level.SEVERE, "Wrong argument", e); + Log.fatal("Wrong argument", e); return ExitCode.ILLEGAL_ARGUMENT; } catch (ReflectiveOperationException e) { - LOGGER.log(Level.SEVERE, "Caught reflection exception from launcher", e); + Log.fatal("Caught reflection exception from launcher", e); return ExitCode.ERROR; } catch (Throwable e) { - LOGGER.log(Level.SEVERE, "Exception caught from launcher", e); + Log.fatal("Exception caught from launcher", e); return ExitCode.ERROR; } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java index eafc984a..8ff64ced 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java @@ -60,6 +60,8 @@ import net.minecraft.Launcher; import javax.imageio.ImageIO; import javax.swing.JFrame; +import org.prismlauncher.utils.logging.Log; + import java.applet.Applet; import java.awt.Dimension; import java.awt.event.WindowAdapter; @@ -72,12 +74,9 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; public final class LegacyFrame extends JFrame { - private static final Logger LOGGER = Logger.getLogger("LegacyFrame"); private static final long serialVersionUID = 1L; private final Launcher launcher; @@ -92,7 +91,7 @@ public final class LegacyFrame extends JFrame { try { this.setIconImage(ImageIO.read(new File("icon.png"))); } catch (IOException e) { - LOGGER.log(Level.WARNING, "Unable to read Minecraft icon", e); + Log.error("Unable to read Minecraft icon", e); } this.addWindowListener(new ForceExitHandler()); @@ -116,7 +115,7 @@ public final class LegacyFrame extends JFrame { if (lines.size() < 3) { Files.move(mpticketFile, mpticketFileCorrupt, StandardCopyOption.REPLACE_EXISTING); - LOGGER.warning("Mpticket file is corrupted!"); + Log.warning("Mpticket file is corrupted!"); } else { // Assumes parameters are valid and in the correct order this.launcher.setParameter("server", lines.get(0)); @@ -124,7 +123,7 @@ public final class LegacyFrame extends JFrame { this.launcher.setParameter("mppass", lines.get(2)); } } catch (IOException e) { - LOGGER.log(Level.WARNING, "Unable to read mpticket file!", e); + Log.error("Unable to read mpticket file", e); } } @@ -170,11 +169,10 @@ public final class LegacyFrame extends JFrame { try { Thread.sleep(30000L); } catch (InterruptedException e) { - LOGGER.log(Level.SEVERE, "Thread interrupted", e); + Log.error("Thread interrupted", e); } - LOGGER.info("Forcing exit!"); - + Log.warning("Forcing exit"); System.exit(0); } }).start(); diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java index 9f76944f..5ffa9ec5 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java @@ -59,22 +59,19 @@ package org.prismlauncher.launcher.impl.legacy; import org.prismlauncher.launcher.impl.AbstractLauncher; import org.prismlauncher.utils.Parameters; import org.prismlauncher.utils.ReflectionUtils; +import org.prismlauncher.utils.logging.Log; import java.io.File; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; import java.util.Collections; import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; /** * Used to launch old versions that support applets. */ public final class LegacyLauncher extends AbstractLauncher { - private static final Logger LOGGER = Logger.getLogger("LegacyLauncher"); - private final String user, session; private final String title; private final String appletClass; @@ -101,24 +98,23 @@ public final class LegacyLauncher extends AbstractLauncher { Field gameDirField = ReflectionUtils.getMinecraftGameDirField(main); if (gameDirField == null) - LOGGER.warning("Could not find Minecraft path field"); + Log.warning("Could not find Minecraft path field"); else { gameDirField.setAccessible(true); gameDirField.set(null /* field is static, so instance is null */, new File(this.cwd)); } if (this.usesApplet) { - LOGGER.info("Launching legacy minecraft using applet wrapper..."); + Log.launcher("Launching with applet wrapper..."); try { LegacyFrame window = new LegacyFrame(this.title, ReflectionUtils.createAppletClass(this.appletClass)); window.start(this.user, this.session, this.width, this.height, this.maximize, this.serverAddress, this.serverPort, this.mcParams.contains("--demo")); - return; } catch (Throwable e) { - LOGGER.log(Level.SEVERE, "Running applet wrapper failed with exception; falling back to main class", e); + Log.error("Running applet wrapper failed with exception; falling back to main class", e); } } diff --git a/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java b/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java index 1d2383a4..3b299615 100644 --- a/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java +++ b/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java @@ -62,13 +62,11 @@ import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.lang.reflect.Field; import java.lang.reflect.Modifier; -import java.util.logging.Level; -import java.util.logging.Logger; + +import org.prismlauncher.utils.logging.Log; public final class ReflectionUtils { - private static final Logger LOGGER = Logger.getLogger("ReflectionUtils"); - private ReflectionUtils() { } @@ -101,7 +99,7 @@ public final class ReflectionUtils { * @return The found field. */ public static Field getMinecraftGameDirField(Class minecraftMainClass) { - LOGGER.fine("Resolving minecraft game directory field"); + Log.debug("Resolving minecraft game directory field"); // Field we're looking for is always // private static File obfuscatedName = null; for (Field field : minecraftMainClass.getDeclaredFields()) { @@ -114,24 +112,23 @@ public final class ReflectionUtils { // Must be static if (!Modifier.isStatic(fieldModifiers)) { - LOGGER.log(Level.FINE, "Rejecting field {0} because it is not static", field.getName()); + Log.debug("Rejecting field " + field.getName() + " because it is not static"); continue; } // Must be private if (!Modifier.isPrivate(fieldModifiers)) { - LOGGER.log(Level.FINE, "Rejecting field {0} because it is not private", field.getName()); + Log.debug("Rejecting field " + field.getName() + " because it is not private"); continue; } // Must not be final if (Modifier.isFinal(fieldModifiers)) { - LOGGER.log(Level.FINE, "Rejecting field {0} because it is final", field.getName()); + Log.debug("Rejecting field " + field.getName() + " because it is final"); continue; } - LOGGER.log(Level.FINE, "Identified field {0} to match conditions for minecraft game directory field", - field.getName()); + Log.debug("Identified field " + field.getName() + " to match conditions for minecraft game directory field"); return field; } diff --git a/libraries/launcher/org/prismlauncher/utils/logging/Level.java b/libraries/launcher/org/prismlauncher/utils/logging/Level.java new file mode 100644 index 00000000..330cec28 --- /dev/null +++ b/libraries/launcher/org/prismlauncher/utils/logging/Level.java @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * PolyMC - Minecraft Launcher + * Copyright (C) 2022 TheKodeToad + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * 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 General Public License for more details. + * + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.prismlauncher.utils.logging; + +public enum Level { + LAUNCHER("Launcher"), DEBUG("Debug"), INFO("Info"), MESSAGE("Message"), + WARNING("Warning"), ERROR("Error", true), FATAL("Fatal", true); + + String name; + boolean stderr; + + Level(String name) { + this(name, false); + } + + Level(String name, boolean stderr) { + this.name = name; + this.stderr = stderr; + } + +} diff --git a/libraries/launcher/org/prismlauncher/utils/logging/Log.java b/libraries/launcher/org/prismlauncher/utils/logging/Log.java new file mode 100644 index 00000000..e1961991 --- /dev/null +++ b/libraries/launcher/org/prismlauncher/utils/logging/Log.java @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * PolyMC - Minecraft Launcher + * Copyright (C) 2022 TheKodeToad + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * 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 General Public License for more details. + * + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.prismlauncher.utils.logging; + +import java.io.PrintStream; + +/** + * Used to print messages with different levels used to colourise the output. + * Used instead of a logging framework, as the launcher knows how to parse these + * messages. + */ +public final class Log { + + private static final PrintStream ERROR_PREFIX = new PrintStream(System.err) { + @Override + public void println(String x) { + error(x); + } + + @Override + public void println(Object x) { + error(String.valueOf(x)); + } + }, FATAL_PREFIX = new PrintStream(System.err) { + @Override + public void println(String x) { + fatal(x); + } + + @Override + public void println(Object x) { + fatal(String.valueOf(x)); + } + }; + + private static final boolean DEBUG = Boolean.getBoolean("org.prismlauncher.debug"); + + private Log() { + } + + public static void blankLine() { + System.out.println(); + } + + public static void launcher(String message) { + log(message, Level.LAUNCHER); + } + + public static void error(String message) { + log(message, Level.ERROR); + } + + public static void debug(String message) { + if (!DEBUG) + return; + + log(message, Level.DEBUG); + } + + public static void info(String message) { + log(message, Level.INFO); + } + + public static void warning(String message) { + log(message, Level.WARNING); + } + + public static void error(String message, Throwable e) { + error(message); + e.printStackTrace(ERROR_PREFIX); + } + + public static void fatal(String message) { + log(message, Level.FATAL); + } + + public static void fatal(String message, Throwable e) { + fatal(message); + e.printStackTrace(FATAL_PREFIX); + } + + /** + * Logs a message with the prefix !![LEVEL]!. + * + * @param message The message + * @param level The level + */ + public static void log(String message, Level level) { + String prefix = "!![" + level.name + "]!"; + // prefix first line + message = prefix + message; + // prefix subsequent lines + message = message.replace("\n", "\n" + prefix); + + if (level.stderr) + System.err.println(message); + else + System.out.println(message); + } + +}