From c968c1be7892fbc1ba0571d30a03b20e3f8a5abc Mon Sep 17 00:00:00 2001 From: icelimetea Date: Sun, 24 Apr 2022 14:45:01 +0100 Subject: [PATCH 1/3] Refactor some parts of NewLaunch --- .../launcher/org/multimc/EntryPoint.java | 155 ++++++++---------- libraries/launcher/org/multimc/Launcher.java | 2 +- .../launcher/org/multimc/ParamBucket.java | 51 +++--- 3 files changed, 95 insertions(+), 113 deletions(-) diff --git a/libraries/launcher/org/multimc/EntryPoint.java b/libraries/launcher/org/multimc/EntryPoint.java index 0f904f5f..c923bbde 100644 --- a/libraries/launcher/org/multimc/EntryPoint.java +++ b/libraries/launcher/org/multimc/EntryPoint.java @@ -16,22 +16,24 @@ package org.multimc;/* import org.multimc.onesix.OneSixLauncher; -import java.io.*; -import java.nio.charset.Charset; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; public class EntryPoint { - private enum Action - { - Proceed, - Launch, - Abort - } + + private final ParamBucket params = new ParamBucket(); + + private org.multimc.Launcher launcher; public static void main(String[] args) { EntryPoint listener = new EntryPoint(); + int retCode = listener.listen(); + if (retCode != 0) { System.out.println("Exiting with " + retCode); @@ -41,111 +43,92 @@ public class EntryPoint private Action parseLine(String inData) throws ParseException { - String[] pair = inData.split(" ", 2); + String[] pair = inData.split("\\s+", 2); - if(pair.length == 1) - { - String command = pair[0]; - if (pair[0].equals("launch")) + if (pair.length == 0) + throw new ParseException("Unexpected empty string!"); + + switch (pair[0]) { + case "launch": { return Action.Launch; + } - else if (pair[0].equals("abort")) + case "abort": { return Action.Abort; + } - else throw new ParseException("Error while parsing:" + pair[0]); - } + case "launcher": { + if (pair.length != 2) + throw new ParseException("Expected 2 tokens, got 1!"); - if(pair.length != 2) - throw new ParseException("Pair length is not 2."); + if (pair[1].equals("onesix")) { + launcher = new OneSixLauncher(); - String command = pair[0]; - String param = pair[1]; + Utils.log("Using onesix launcher."); + + return Action.Proceed; + } else { + throw new ParseException("Invalid launcher type: " + pair[1]); + } + } + + default: { + if (pair.length != 2) + throw new ParseException("Error while parsing:" + pair[0]); + + params.add(pair[0], pair[1]); - if(command.equals("launcher")) - { - if(param.equals("onesix")) - { - m_launcher = new OneSixLauncher(); - Utils.log("Using onesix launcher."); - Utils.log(); return Action.Proceed; } - else - throw new ParseException("Invalid launcher type: " + param); } - - m_params.add(command, param); - //System.out.println(command + " : " + param); - return Action.Proceed; } public int listen() { - BufferedReader buffer; - try - { - buffer = new BufferedReader(new InputStreamReader(System.in, "UTF-8")); - } catch (UnsupportedEncodingException e) - { - System.err.println("For some reason, your java does not support UTF-8. Consider living in the current century."); + Action action = Action.Proceed; + + try (BufferedReader reader = new BufferedReader(new InputStreamReader( + System.in, + StandardCharsets.UTF_8 + ))) { + String line; + + while (action == Action.Proceed) { + if ((line = reader.readLine()) != null) { + action = parseLine(line); + } else { + action = Action.Abort; + } + } + } catch (IOException | ParseException e) { + Utils.log("Launcher ABORT due to exception:"); + e.printStackTrace(); + return 1; } - boolean isListening = true; - boolean isAborted = false; + // Main loop - while (isListening) - { - String inData; - try - { - // Read from the pipe one line at a time - inData = buffer.readLine(); - if (inData != null) - { - Action a = parseLine(inData); - if(a == Action.Abort) - { - isListening = false; - isAborted = true; - } - if(a == Action.Launch) - { - isListening = false; - } - } - else - { - isListening = false; - isAborted = true; - } - } - catch (IOException e) - { - System.err.println("Launcher ABORT due to IO exception:"); - e.printStackTrace(); - return 1; - } - catch (ParseException e) - { - System.err.println("Launcher ABORT due to PARSE exception:"); - e.printStackTrace(); - return 1; - } - } - if(isAborted) + if (action == Action.Abort) { System.err.println("Launch aborted by the launcher."); return 1; } - if(m_launcher != null) + + if (launcher != null) { - return m_launcher.launch(m_params); + return launcher.launch(params); } + System.err.println("No valid launcher implementation specified."); + return 1; } - private ParamBucket m_params = new ParamBucket(); - private org.multimc.Launcher m_launcher; + private enum Action { + Proceed, + Launch, + Abort + } + } diff --git a/libraries/launcher/org/multimc/Launcher.java b/libraries/launcher/org/multimc/Launcher.java index d8cb6d1b..c5e8fbc1 100644 --- a/libraries/launcher/org/multimc/Launcher.java +++ b/libraries/launcher/org/multimc/Launcher.java @@ -18,5 +18,5 @@ package org.multimc; public interface Launcher { - abstract int launch(ParamBucket params); + int launch(ParamBucket params); } diff --git a/libraries/launcher/org/multimc/ParamBucket.java b/libraries/launcher/org/multimc/ParamBucket.java index 2fde1329..8ff03ddc 100644 --- a/libraries/launcher/org/multimc/ParamBucket.java +++ b/libraries/launcher/org/multimc/ParamBucket.java @@ -19,62 +19,62 @@ package org.multimc; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; public class ParamBucket { + + private final Map> paramsMap = new HashMap<>(); + public void add(String key, String value) { - List coll = null; - if(!m_params.containsKey(key)) - { - coll = new ArrayList(); - m_params.put(key, coll); - } - else - { - coll = m_params.get(key); - } - coll.add(value); + paramsMap.computeIfAbsent(key, k -> new ArrayList<>()) + .add(value); } public List all(String key) throws NotFoundException { - if(!m_params.containsKey(key)) + List params = paramsMap.get(key); + + if (params == null) throw new NotFoundException(); - return m_params.get(key); + + return params; } public List allSafe(String key, List def) { - if(!m_params.containsKey(key) || m_params.get(key).size() < 1) - { + List params = paramsMap.get(key); + + if (params == null || params.isEmpty()) return def; - } - return m_params.get(key); + + return params; } public List allSafe(String key) { - return allSafe(key, new ArrayList()); + return allSafe(key, new ArrayList<>()); } public String first(String key) throws NotFoundException { List list = all(key); - if(list.size() < 1) - { + + if (list.isEmpty()) throw new NotFoundException(); - } + return list.get(0); } public String firstSafe(String key, String def) { - if(!m_params.containsKey(key) || m_params.get(key).size() < 1) - { + List params = paramsMap.get(key); + + if (params == null || params.isEmpty()) return def; - } - return m_params.get(key).get(0); + + return params.get(0); } public String firstSafe(String key) @@ -82,5 +82,4 @@ public class ParamBucket return firstSafe(key, ""); } - private HashMap> m_params = new HashMap>(); } From b0a469baab54c38a80607a4567b4c0f6eb825245 Mon Sep 17 00:00:00 2001 From: icelimetea Date: Sun, 24 Apr 2022 15:10:35 +0100 Subject: [PATCH 2/3] Use java.util.logging instead of custom logging --- .../launcher/org/multimc/EntryPoint.java | 18 +++++--- libraries/launcher/org/multimc/Utils.java | 33 ------------- .../org/multimc/onesix/OneSixLauncher.java | 46 +++++++++++-------- 3 files changed, 38 insertions(+), 59 deletions(-) diff --git a/libraries/launcher/org/multimc/EntryPoint.java b/libraries/launcher/org/multimc/EntryPoint.java index c923bbde..85cf3702 100644 --- a/libraries/launcher/org/multimc/EntryPoint.java +++ b/libraries/launcher/org/multimc/EntryPoint.java @@ -20,10 +20,14 @@ 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; public class EntryPoint { + private static final Logger LOGGER = Logger.getLogger("EntryPoint"); + private final ParamBucket params = new ParamBucket(); private org.multimc.Launcher launcher; @@ -36,7 +40,8 @@ public class EntryPoint if (retCode != 0) { - System.out.println("Exiting with " + retCode); + LOGGER.info("Exiting with " + retCode); + System.exit(retCode); } } @@ -64,7 +69,7 @@ public class EntryPoint if (pair[1].equals("onesix")) { launcher = new OneSixLauncher(); - Utils.log("Using onesix launcher."); + LOGGER.info("Using onesix launcher."); return Action.Proceed; } else { @@ -101,9 +106,7 @@ public class EntryPoint } } } catch (IOException | ParseException e) { - Utils.log("Launcher ABORT due to exception:"); - - e.printStackTrace(); + LOGGER.log(Level.SEVERE, "Launcher ABORT due to exception:", e); return 1; } @@ -111,7 +114,8 @@ public class EntryPoint // Main loop if (action == Action.Abort) { - System.err.println("Launch aborted by the launcher."); + LOGGER.info("Launch aborted by the launcher."); + return 1; } @@ -120,7 +124,7 @@ public class EntryPoint return launcher.launch(params); } - System.err.println("No valid launcher implementation specified."); + LOGGER.log(Level.SEVERE, "No valid launcher implementation specified."); return 1; } diff --git a/libraries/launcher/org/multimc/Utils.java b/libraries/launcher/org/multimc/Utils.java index 353af7d3..e48029c2 100644 --- a/libraries/launcher/org/multimc/Utils.java +++ b/libraries/launcher/org/multimc/Utils.java @@ -16,21 +16,10 @@ package org.multimc; -import java.io.*; import java.io.File; import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import java.net.URL; -import java.net.URLClassLoader; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.*; -import java.util.Arrays; -import java.util.Enumeration; import java.util.List; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; public class Utils { @@ -93,27 +82,5 @@ public class Utils return null; } - /** - * Log to the launcher console - * - * @param message A String containing the message - * @param level A String containing the level name. See MinecraftLauncher::getLevel() - */ - public static void log(String message, String level) - { - // Kinda dirty - String tag = "!![" + level + "]!"; - System.out.println(tag + message.replace("\n", "\n" + tag)); - } - - public static void log(String message) - { - log(message, "Launcher"); - } - - public static void log() - { - System.out.println(); - } } diff --git a/libraries/launcher/org/multimc/onesix/OneSixLauncher.java b/libraries/launcher/org/multimc/onesix/OneSixLauncher.java index ea445995..0058bd43 100644 --- a/libraries/launcher/org/multimc/onesix/OneSixLauncher.java +++ b/libraries/launcher/org/multimc/onesix/OneSixLauncher.java @@ -19,14 +19,18 @@ import org.multimc.*; import java.applet.Applet; import java.io.File; -import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; public class OneSixLauncher implements Launcher { + + private static final Logger LOGGER = Logger.getLogger("OneSixLauncher"); + // parameters, separated from ParamBucket private List libraries; private List mcparams; @@ -104,7 +108,7 @@ public class OneSixLauncher implements Launcher if (f == null) { - System.err.println("Could not find Minecraft path field."); + LOGGER.warning("Could not find Minecraft path field."); } else { @@ -113,8 +117,12 @@ public class OneSixLauncher implements Launcher } } catch (Exception e) { - System.err.println("Could not set base folder. Failed to find/access Minecraft main class:"); - e.printStackTrace(System.err); + LOGGER.log( + Level.SEVERE, + "Could not set base folder. Failed to find/access Minecraft main class:", + e + ); + return -1; } @@ -122,7 +130,7 @@ public class OneSixLauncher implements Launcher if(!traits.contains("noapplet")) { - Utils.log("Launching with applet wrapper..."); + LOGGER.info("Launching with applet wrapper..."); try { Class MCAppletClass = cl.loadClass(appletClass); @@ -132,10 +140,9 @@ public class OneSixLauncher implements Launcher return 0; } catch (Exception e) { - Utils.log("Applet wrapper failed:", "Error"); - e.printStackTrace(System.err); - Utils.log(); - Utils.log("Falling back to using main class."); + LOGGER.log(Level.SEVERE, "Applet wrapper failed:", e); + + LOGGER.warning("Falling back to using main class."); } } @@ -147,8 +154,8 @@ public class OneSixLauncher implements Launcher return 0; } catch (Exception e) { - Utils.log("Failed to invoke the Minecraft main class:", "Fatal"); - e.printStackTrace(System.err); + LOGGER.log(Level.SEVERE, "Failed to invoke the Minecraft main class:", e); + return -1; } } @@ -185,8 +192,8 @@ public class OneSixLauncher implements Launcher mc = cl.loadClass(mainClass); } catch (ClassNotFoundException e) { - System.err.println("Failed to find Minecraft main class:"); - e.printStackTrace(System.err); + LOGGER.log(Level.SEVERE, "Failed to find Minecraft main class:", e); + return -1; } @@ -197,8 +204,8 @@ public class OneSixLauncher implements Launcher meth = mc.getMethod("main", String[].class); } catch (NoSuchMethodException e) { - System.err.println("Failed to acquire the main method:"); - e.printStackTrace(System.err); + LOGGER.log(Level.SEVERE, "Failed to acquire the main method:", e); + return -1; } @@ -210,8 +217,8 @@ public class OneSixLauncher implements Launcher meth.invoke(null, (Object) paramsArray); } catch (Exception e) { - System.err.println("Failed to start Minecraft:"); - e.printStackTrace(System.err); + LOGGER.log(Level.SEVERE, "Failed to start Minecraft:", e); + return -1; } return 0; @@ -226,8 +233,8 @@ public class OneSixLauncher implements Launcher processParams(params); } catch (NotFoundException e) { - System.err.println("Not enough arguments."); - e.printStackTrace(System.err); + LOGGER.log(Level.SEVERE, "Not enough arguments!"); + return -1; } @@ -245,4 +252,5 @@ public class OneSixLauncher implements Launcher return launchWithMainClass(); } } + } From 884f7723624b68ffb23b0c30c8c3725a7e126b4a Mon Sep 17 00:00:00 2001 From: icelimetea Date: Mon, 25 Apr 2022 11:22:56 +0100 Subject: [PATCH 3/3] Clarify exception messages --- .../launcher/org/multimc/EntryPoint.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/libraries/launcher/org/multimc/EntryPoint.java b/libraries/launcher/org/multimc/EntryPoint.java index 85cf3702..b626d095 100644 --- a/libraries/launcher/org/multimc/EntryPoint.java +++ b/libraries/launcher/org/multimc/EntryPoint.java @@ -48,12 +48,12 @@ public class EntryPoint private Action parseLine(String inData) throws ParseException { - String[] pair = inData.split("\\s+", 2); + String[] tokens = inData.split("\\s+", 2); - if (pair.length == 0) + if (tokens.length == 0) throw new ParseException("Unexpected empty string!"); - switch (pair[0]) { + switch (tokens[0]) { case "launch": { return Action.Launch; } @@ -63,25 +63,25 @@ public class EntryPoint } case "launcher": { - if (pair.length != 2) - throw new ParseException("Expected 2 tokens, got 1!"); + if (tokens.length != 2) + throw new ParseException("Expected 2 tokens, got " + tokens.length); - if (pair[1].equals("onesix")) { + if (tokens[1].equals("onesix")) { launcher = new OneSixLauncher(); LOGGER.info("Using onesix launcher."); return Action.Proceed; } else { - throw new ParseException("Invalid launcher type: " + pair[1]); + throw new ParseException("Invalid launcher type: " + tokens[1]); } } default: { - if (pair.length != 2) - throw new ParseException("Error while parsing:" + pair[0]); + if (tokens.length != 2) + throw new ParseException("Error while parsing:" + inData); - params.add(pair[0], pair[1]); + params.add(tokens[0], tokens[1]); return Action.Proceed; }