From 0526b70a9281a64acaece170a0eca8f6ec1a61bc Mon Sep 17 00:00:00 2001 From: Geolykt Date: Sun, 31 Oct 2021 20:19:48 +0100 Subject: [PATCH] Apply checkstyle and nullabillity crackdowns Minestom was a pretty different codebase to ours --- .../launcher/DigestCalculationRunnable.java | 2 +- .../launcher/KillTaskQueueTask.java | 3 +- .../geolykt/starloader/launcher/Launcher.java | 1 + .../launcher/LauncherConfiguration.java | 4 +- .../de/geolykt/starloader/launcher/Utils.java | 14 +-- .../launcher/components/PatchesTab.java | 1 - .../launcher/components/StarloaderTab.java | 4 +- .../launcher/service/package-info.java | 2 +- .../starloader/mod/DiscoveredExtension.java | 18 ++- .../de/geolykt/starloader/mod/Extension.java | 39 ++----- .../starloader/mod/ExtensionManager.java | 103 +++++++++--------- .../mod/ExtensionPrototypeList.java | 2 +- .../geolykt/starloader/mod/package-info.java | 4 +- .../de/geolykt/starloader/util/JarFilter.java | 2 +- .../de/geolykt/starloader/util/Version.java | 4 +- .../extras/selfmodification/CodeModifier.java | 5 +- .../HierarchyClassLoader.java | 15 ++- .../MinestomExtensionClassLoader.java | 12 +- .../MinestomRootClassLoader.java | 78 ++++++++----- .../mixins/GlobalPropertyServiceMinestom.java | 12 +- 20 files changed, 166 insertions(+), 159 deletions(-) diff --git a/src/main/java/de/geolykt/starloader/launcher/DigestCalculationRunnable.java b/src/main/java/de/geolykt/starloader/launcher/DigestCalculationRunnable.java index 6901c0d..9911d16 100644 --- a/src/main/java/de/geolykt/starloader/launcher/DigestCalculationRunnable.java +++ b/src/main/java/de/geolykt/starloader/launcher/DigestCalculationRunnable.java @@ -129,4 +129,4 @@ public void setRunAfter(Runnable r) { public Version getDirectly() { return hash; } -} \ No newline at end of file +} diff --git a/src/main/java/de/geolykt/starloader/launcher/KillTaskQueueTask.java b/src/main/java/de/geolykt/starloader/launcher/KillTaskQueueTask.java index bff35ab..1f6cf98 100644 --- a/src/main/java/de/geolykt/starloader/launcher/KillTaskQueueTask.java +++ b/src/main/java/de/geolykt/starloader/launcher/KillTaskQueueTask.java @@ -4,11 +4,10 @@ * If an instance of this runnable is processed by the main task queue, then the main tasks queue will be stopped and the main thread exits. * This however does not mean that the VM exits, as other threads will be still happily around. */ -public class KillTaskQueueTask implements Runnable { +final class KillTaskQueueTask implements Runnable { @Override public void run() { // Do nothing; it isn't really intended to be used as such } - } diff --git a/src/main/java/de/geolykt/starloader/launcher/Launcher.java b/src/main/java/de/geolykt/starloader/launcher/Launcher.java index 1e30692..a85a930 100644 --- a/src/main/java/de/geolykt/starloader/launcher/Launcher.java +++ b/src/main/java/de/geolykt/starloader/launcher/Launcher.java @@ -114,6 +114,7 @@ public static void main(String[] args) { r.run(); } } catch (InterruptedException e) { + continue; } catch (Throwable e) { e.printStackTrace(); System.exit(1); diff --git a/src/main/java/de/geolykt/starloader/launcher/LauncherConfiguration.java b/src/main/java/de/geolykt/starloader/launcher/LauncherConfiguration.java index 70bee62..80b11fa 100644 --- a/src/main/java/de/geolykt/starloader/launcher/LauncherConfiguration.java +++ b/src/main/java/de/geolykt/starloader/launcher/LauncherConfiguration.java @@ -65,7 +65,7 @@ public File getPatchesFolder() { } /** - * Obtains the file where the configuration will be saved to + * Obtains the file where the configuration will be saved to. * * @return The file */ @@ -200,7 +200,7 @@ public void setStorageFile(File file) { } /** - * Sets the jar that should be loaded when the "Play" button is pressed + * Sets the jar that should be loaded when the "Play" button is pressed. * * @param selected The java archive file to load */ diff --git a/src/main/java/de/geolykt/starloader/launcher/Utils.java b/src/main/java/de/geolykt/starloader/launcher/Utils.java index 85eb587..161970e 100644 --- a/src/main/java/de/geolykt/starloader/launcher/Utils.java +++ b/src/main/java/de/geolykt/starloader/launcher/Utils.java @@ -21,11 +21,12 @@ import org.spongepowered.asm.mixin.MixinEnvironment.Phase; import org.spongepowered.asm.mixin.Mixins; +import net.minestom.server.extras.selfmodification.MinestomRootClassLoader; + import de.geolykt.starloader.UnlikelyEventException; import de.geolykt.starloader.launcher.service.SLMixinService; import de.geolykt.starloader.util.Version; import de.geolykt.starloader.util.Version.Stabillity; -import net.minestom.server.extras.selfmodification.MinestomRootClassLoader; /** * Collection of static utility methods. @@ -59,18 +60,17 @@ private Utils() { * @return registry value or null if not found * @author Oleg Ryaboy, based on work by Miguel Enriquez; Made blocking by Geolykt */ - public static final String readWindowsRegistry(String location, String key){ + public static final String readWindowsRegistry(String location, String key) { try { // Run reg query, then read output with StreamReader (internal class) - Process process = Runtime.getRuntime().exec("reg query " + - '"'+ location + "\" /v " + key); + Process process = Runtime.getRuntime().exec("reg query " + '"' + location + "\" /v " + key); process.waitFor(); InputStream is = process.getInputStream(); String output = new String(is.readAllBytes(), StandardCharsets.UTF_8); is.close(); - if(!output.contains(location) ||!output.contains(key)){ + if (!output.contains(location) || !output.contains(key)) { return null; } @@ -83,7 +83,6 @@ public static final String readWindowsRegistry(String location, String key){ e.printStackTrace(); return null; } - } public static final File getSteamExecutableDir() { @@ -117,8 +116,7 @@ public static File getGameDir(String game) { File steamExec = getSteamExecutableDir(); if (steamExec == null || !steamExec.exists()) { if (OPERATING_SYSTEM.toLowerCase(Locale.ROOT).startsWith("win")) { - steamExec = getOneOfExistingFiles("C:\\Steam\\", "C:\\Program Files (x86)\\Steam\\", - "C:\\Program Files\\Steam\\", "D:\\Steam\\", "C:\\Programmes\\Steam\\", "D:\\Programmes\\Steam\\"); + steamExec = getOneOfExistingFiles("C:\\Steam\\", "C:\\Program Files (x86)\\Steam\\", "C:\\Program Files\\Steam\\", "D:\\Steam\\", "C:\\Programmes\\Steam\\", "D:\\Programmes\\Steam\\"); } else { // Assuming my install String homeDir = System.getProperty("user.home"); diff --git a/src/main/java/de/geolykt/starloader/launcher/components/PatchesTab.java b/src/main/java/de/geolykt/starloader/launcher/components/PatchesTab.java index 4c130c7..11da186 100644 --- a/src/main/java/de/geolykt/starloader/launcher/components/PatchesTab.java +++ b/src/main/java/de/geolykt/starloader/launcher/components/PatchesTab.java @@ -28,5 +28,4 @@ public void onClose(JFrame parent) { e.printStackTrace(); } } - } diff --git a/src/main/java/de/geolykt/starloader/launcher/components/StarloaderTab.java b/src/main/java/de/geolykt/starloader/launcher/components/StarloaderTab.java index 26d44fd..e45bc8b 100644 --- a/src/main/java/de/geolykt/starloader/launcher/components/StarloaderTab.java +++ b/src/main/java/de/geolykt/starloader/launcher/components/StarloaderTab.java @@ -16,7 +16,5 @@ public interface StarloaderTab { * * @param parent The parent JFrame */ - public default void onOpen(JFrame parent) { - - } + public default void onOpen(JFrame parent) { } } diff --git a/src/main/java/de/geolykt/starloader/launcher/service/package-info.java b/src/main/java/de/geolykt/starloader/launcher/service/package-info.java index 35ca018..65661a0 100644 --- a/src/main/java/de/geolykt/starloader/launcher/service/package-info.java +++ b/src/main/java/de/geolykt/starloader/launcher/service/package-info.java @@ -1,6 +1,6 @@ /** * Services used by the SLL bootstrap. Most of those are required to get basic functionallity working. - * + * * @author Geolykt * */ diff --git a/src/main/java/de/geolykt/starloader/mod/DiscoveredExtension.java b/src/main/java/de/geolykt/starloader/mod/DiscoveredExtension.java index 03ce1f5..4edf675 100644 --- a/src/main/java/de/geolykt/starloader/mod/DiscoveredExtension.java +++ b/src/main/java/de/geolykt/starloader/mod/DiscoveredExtension.java @@ -1,18 +1,18 @@ package de.geolykt.starloader.mod; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.File; import java.net.URL; import java.util.LinkedList; import java.util.List; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public final class DiscoveredExtension { - public final static Logger LOGGER = LoggerFactory.getLogger(DiscoveredExtension.class); + private static final Logger LOGGER = LoggerFactory.getLogger(DiscoveredExtension.class); public static final String NAME_REGEX = "[A-Za-z][_A-Za-z0-9]+"; private String name; @@ -26,7 +26,7 @@ public final class DiscoveredExtension { private ExternalDependencies externalDependencies; public transient List files = new LinkedList<>(); public transient LoadStatus loadStatus = LoadStatus.LOAD_SUCCESS; - transient private File originalJar; + private transient File originalJar; @SuppressWarnings("null") @NotNull @@ -150,7 +150,6 @@ public static void verifyIntegrity(@NotNull DiscoveredExtension extension) { if (extension.externalDependencies == null) { extension.externalDependencies = new ExternalDependencies(); } - } public enum LoadStatus { @@ -159,8 +158,7 @@ public enum LoadStatus { INVALID_NAME("Invalid name."), NO_ENTRYPOINT("No entrypoint specified."), FAILED_TO_SETUP_CLASSLOADER("Extension classloader could not be setup."), - LOAD_FAILED("Load failed. See logs for more information."), - ; + LOAD_FAILED("Load failed. See logs for more information."); @NotNull private final String message; diff --git a/src/main/java/de/geolykt/starloader/mod/Extension.java b/src/main/java/de/geolykt/starloader/mod/Extension.java index 88a3b9e..ef51575 100644 --- a/src/main/java/de/geolykt/starloader/mod/Extension.java +++ b/src/main/java/de/geolykt/starloader/mod/Extension.java @@ -1,11 +1,11 @@ package de.geolykt.starloader.mod; -import org.jetbrains.annotations.NotNull; -import org.slf4j.Logger; - import java.util.ArrayList; import java.util.List; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; + public abstract class Extension { // Set by reflection // FIXME issue: null within the constructor @@ -14,21 +14,13 @@ public abstract class Extension { // FIXME issue: null within the constructor private Logger logger; - protected Extension() { + protected Extension() { } - } - - public void preInitialize() { - - } - - public void initialize() { + public void preInitialize() { } - } + public void initialize() { } - public void postInitialize() { - - } + public void postInitialize() { } /** * @deprecated This method is a boilerplate solution, for more info see below @@ -41,9 +33,7 @@ public void postInitialize() { * Other extension libraries might offer similar alternatives that are a lot more safer to use. */ @Deprecated(forRemoval = false) - public void preTerminate() { - - } + public void preTerminate() { } /** * @deprecated This method is a boilerplate solution, for more info see below @@ -56,9 +46,7 @@ public void preTerminate() { * Other extension libraries might offer similar alternatives that are a lot more safer to use. */ @Deprecated(forRemoval = false) - public void terminate() { - - } + public void terminate() { } /** * @deprecated This method is a boilerplate solution, for more info see below @@ -71,9 +59,7 @@ public void terminate() { * Other extension libraries might offer similar alternatives that are a lot more safer to use. */ @Deprecated(forRemoval = false) - public void postTerminate() { - - } + public void postTerminate() { } /** * @deprecated This method is a boilerplate solution, for more info see below @@ -89,9 +75,7 @@ public void postTerminate() { * become unusable. */ @Deprecated(forRemoval = false) - public void unload() { - - } + public void unload() { } @NotNull public final ExtensionDescription getDescription() { @@ -111,7 +95,6 @@ public final Logger getLogger() { return logger; } - public static class ExtensionDescription { @NotNull diff --git a/src/main/java/de/geolykt/starloader/mod/ExtensionManager.java b/src/main/java/de/geolykt/starloader/mod/ExtensionManager.java index 3616bfc..5893449 100644 --- a/src/main/java/de/geolykt/starloader/mod/ExtensionManager.java +++ b/src/main/java/de/geolykt/starloader/mod/ExtensionManager.java @@ -1,35 +1,46 @@ package de.geolykt.starloader.mod; -import com.google.gson.Gson; - -import net.fabricmc.accesswidener.AccessWidener; -import net.fabricmc.accesswidener.AccessWidenerReader; -import net.minestom.server.extras.selfmodification.MinestomExtensionClassLoader; -import net.minestom.server.extras.selfmodification.MinestomRootClassLoader; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.spongepowered.asm.mixin.Mixins; - -import java.io.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.net.URLClassLoader; -import java.util.*; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.stream.Collectors; import java.util.zip.ZipFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.spongepowered.asm.mixin.Mixins; + +import com.google.gson.Gson; + +import net.fabricmc.accesswidener.AccessWidener; +import net.fabricmc.accesswidener.AccessWidenerReader; +import net.minestom.server.extras.selfmodification.MinestomExtensionClassLoader; +import net.minestom.server.extras.selfmodification.MinestomRootClassLoader; + public class ExtensionManager { - public final static Logger LOGGER = LoggerFactory.getLogger(ExtensionManager.class); + public static final Logger LOGGER = LoggerFactory.getLogger(ExtensionManager.class); - private final static Gson GSON = new Gson(); + private static final Gson GSON = new Gson(); private final Map extensionLoaders = new HashMap<>(); private final Map extensions = new HashMap<>(); @@ -39,6 +50,7 @@ public class ExtensionManager { @NotNull private final List extensionList = new CopyOnWriteArrayList<>(); + @SuppressWarnings("null") @NotNull private final List immutableExtensionListView = Collections.unmodifiableList(extensionList); @@ -50,8 +62,8 @@ public ExtensionManager() { /** * Gets if the extensions should be loaded during startup. - *

- * Default value is 'true'. + * + *

Default value is 'true'. * */ public boolean shouldLoadOnStartup() { @@ -59,9 +71,9 @@ public boolean shouldLoadOnStartup() { } /** - * Used to specify if you want extensions to be loaded and initialized during startup. - *

- * Only useful before the server start. + * Used to specify if you want extensions to be loaded and initialised during startup. + * + *

Only useful before the server start. * * @param loadOnStartup true to load extensions on startup, false to do nothing */ @@ -121,6 +133,7 @@ private void setupClassLoader(@NotNull DiscoveredExtension discoveredExtension) final String extensionName = discoveredExtension.getName(); final URL[] urls = discoveredExtension.files.toArray(new URL[0]); + @SuppressWarnings("null") final MinestomExtensionClassLoader loader = newClassLoader(discoveredExtension, urls); extensionLoaders.put(extensionName.toLowerCase(), loader); @@ -180,11 +193,7 @@ private Extension attemptSingleLoad(@NotNull DiscoveredExtension discoveredExten } catch (IllegalAccessException ignored) { // We made it accessible, should not occur } catch (InvocationTargetException e) { - LOGGER.error( - "While instantiating the main class '{}' in '{}' an exception was thrown.", - mainClass, - extensionName, - e.getTargetException() + LOGGER.error("While instantiating the main class '{}' in '{}' an exception was thrown.", mainClass, extensionName, e.getTargetException() ); return null; } @@ -246,17 +255,18 @@ private List discoverExtensions(ExtensionPrototypeList exte } private DiscoveredExtension discoverFromJar(File file) { - try (ZipFile f = new ZipFile(file); - InputStreamReader reader = new InputStreamReader(f.getInputStream(f.getEntry("extension.json")))) { - - DiscoveredExtension extension = GSON.fromJson(reader, DiscoveredExtension.class); - extension.setOriginalJar(file); - extension.files.add(file.toURI().toURL()); + try (ZipFile f = new ZipFile(file)) { + try (InputStreamReader reader = new InputStreamReader(f.getInputStream(f.getEntry("extension.json")))) { + @SuppressWarnings("null") + DiscoveredExtension extension = GSON.fromJson(reader, DiscoveredExtension.class); + extension.setOriginalJar(file); + extension.files.add(file.toURI().toURL()); - // Verify integrity and ensure defaults - DiscoveredExtension.verifyIntegrity(extension); + // Verify integrity and ensure defaults + DiscoveredExtension.verifyIntegrity(extension); - return extension; + return extension; + } } catch (IOException e) { e.printStackTrace(); return null; @@ -273,6 +283,7 @@ private List generateLoadOrder(@NotNull List dependencies = Arrays.stream(discoveredExtension.getDependencies()) .map(dependencyName -> { DiscoveredExtension dependencyExtension = extensionMap.get(dependencyName.toLowerCase()); @@ -306,10 +317,7 @@ private List generateLoadOrder(@NotNull List>> loadableExtensions; // While there are entries with no more elements (no more dependencies) - while (!( - loadableExtensions = dependencyMap.entrySet().stream().filter(entry -> areAllDependenciesLoaded(entry.getValue())).collect(Collectors.toList()) - ).isEmpty() - ) { + while (!(loadableExtensions = dependencyMap.entrySet().stream().filter(entry -> areAllDependenciesLoaded(entry.getValue())).collect(Collectors.toList())).isEmpty()) { // Get all "loadable" (not actually being loaded!) extensions and put them in the sorted list. for (Map.Entry> entry : loadableExtensions) { // Add to sorted list. @@ -331,13 +339,12 @@ private List generateLoadOrder(@NotNull List dependencies) { + private boolean areAllDependenciesLoaded(List dependencies) { return dependencies.isEmpty() || dependencies.stream().allMatch(ext -> extensions.containsKey(ext.getName().toLowerCase())); } @@ -397,7 +404,7 @@ public Map getExtensionLoaders() { @SuppressWarnings("resource") private void setupAccessWideners(List extensionsToLoad) { - MinestomRootClassLoader.getInstance().widener = accessWidener; + MinestomRootClassLoader.getInstance().setWidener(accessWidener, this); AccessWidenerReader accessReader = new AccessWidenerReader(accessWidener); for (DiscoveredExtension extension : extensionsToLoad) { if (extension.getAccessWidener().equals("")) { @@ -454,8 +461,8 @@ private void setupCodeModifiers(@NotNull List extensions) { } } catch (Exception e) { e.printStackTrace(); - LOGGER.error("Failed to load code modifier for extension in files: " + - extension.files + LOGGER.error("Failed to load code modifier for extension in files: " + + extension.files .stream() .map(URL::toExternalForm) .collect(Collectors.joining(", ")), e); @@ -553,6 +560,9 @@ public boolean loadDynamicExtension(File jarFile) throws FileNotFoundException { LOGGER.info("Discover dynamic extension from jar {}", jarFile.getAbsolutePath()); DiscoveredExtension discoveredExtension = discoverFromJar(jarFile); List extensionsToLoad = Collections.singletonList(discoveredExtension); + if (extensionsToLoad == null) { + throw new InternalError(); + } return loadExtensionList(extensionsToLoad); } @@ -626,9 +636,4 @@ public void unloadExtension(String extensionName) { public void shutdown() { this.extensionList.forEach(this::unload); } - - @NotNull - public AccessWidener getAccessWidener() { - return accessWidener; - } } diff --git a/src/main/java/de/geolykt/starloader/mod/ExtensionPrototypeList.java b/src/main/java/de/geolykt/starloader/mod/ExtensionPrototypeList.java index 813da36..26cf0fd 100644 --- a/src/main/java/de/geolykt/starloader/mod/ExtensionPrototypeList.java +++ b/src/main/java/de/geolykt/starloader/mod/ExtensionPrototypeList.java @@ -19,7 +19,7 @@ public class ExtensionPrototypeList { - public final static Logger LOGGER = LoggerFactory.getLogger(ExtensionPrototypeList.class); + private static final Logger LOGGER = LoggerFactory.getLogger(ExtensionPrototypeList.class); private final File extensionFolder; private final List extensions; diff --git a/src/main/java/de/geolykt/starloader/mod/package-info.java b/src/main/java/de/geolykt/starloader/mod/package-info.java index 9914d2a..6e361d1 100644 --- a/src/main/java/de/geolykt/starloader/mod/package-info.java +++ b/src/main/java/de/geolykt/starloader/mod/package-info.java @@ -3,6 +3,6 @@ * Most classes here were originally developed by minestom contributors but are maintained by us (Starloader contributors) * this means that you should not ask for help in any minestom-related medias. * - * Minestom is covered under the Apache 2.0 license, just like us, + *

Minestom is covered under the Apache 2.0 license, just like us, */ -package de.geolykt.starloader.mod; \ No newline at end of file +package de.geolykt.starloader.mod; diff --git a/src/main/java/de/geolykt/starloader/util/JarFilter.java b/src/main/java/de/geolykt/starloader/util/JarFilter.java index 1e6fa02..bbddc45 100644 --- a/src/main/java/de/geolykt/starloader/util/JarFilter.java +++ b/src/main/java/de/geolykt/starloader/util/JarFilter.java @@ -7,7 +7,7 @@ public class JarFilter implements FileFilter { public static final JarFilter INSTANCE = new JarFilter(); - private JarFilter() {} + private JarFilter() { } @Override public boolean accept(File pathname) { diff --git a/src/main/java/de/geolykt/starloader/util/Version.java b/src/main/java/de/geolykt/starloader/util/Version.java index 3fa2d8c..ac1d63b 100644 --- a/src/main/java/de/geolykt/starloader/util/Version.java +++ b/src/main/java/de/geolykt/starloader/util/Version.java @@ -33,9 +33,9 @@ public Version(int major, int minor, int patch, String target, String notes, Sta @Override public String toString() { if (notes == null) { - return String.format("%d.%d-%s.%d-%s", major, minor, stabillity.toString(), patch , target); + return String.format("%d.%d-%s.%d-%s", major, minor, stabillity.toString(), patch, target); } else { - return String.format("%d.%d-%s.%d-%s (%s)", major, minor, stabillity.toString(), patch , target, notes); + return String.format("%d.%d-%s.%d-%s (%s)", major, minor, stabillity.toString(), patch, target, notes); } } diff --git a/src/main/java/net/minestom/server/extras/selfmodification/CodeModifier.java b/src/main/java/net/minestom/server/extras/selfmodification/CodeModifier.java index 76a2d34..81fffa4 100644 --- a/src/main/java/net/minestom/server/extras/selfmodification/CodeModifier.java +++ b/src/main/java/net/minestom/server/extras/selfmodification/CodeModifier.java @@ -7,14 +7,15 @@ import de.geolykt.starloader.transformers.ASMTransformer; /** - * Will be called by {@link MinestomRootClassLoader} to transform classes at load-time + * Will be called by {@link MinestomRootClassLoader} to transform classes at load-time. * * @deprecated Replaced with {@link ASMTransformer}. */ @Deprecated(forRemoval = true, since = "2.1.0") public abstract class CodeModifier extends ASMTransformer { + /** - * Must return true iif the class node has been modified + * Must return true iif the class node has been modified. * * @param source The source node * @return True if the node has been modified. diff --git a/src/main/java/net/minestom/server/extras/selfmodification/HierarchyClassLoader.java b/src/main/java/net/minestom/server/extras/selfmodification/HierarchyClassLoader.java index 97ea340..2c76e12 100644 --- a/src/main/java/net/minestom/server/extras/selfmodification/HierarchyClassLoader.java +++ b/src/main/java/net/minestom/server/extras/selfmodification/HierarchyClassLoader.java @@ -1,15 +1,15 @@ package net.minestom.server.extras.selfmodification; -import org.jetbrains.annotations.NotNull; - import java.io.InputStream; import java.net.URL; import java.net.URLClassLoader; import java.util.LinkedList; import java.util.List; +import org.jetbrains.annotations.NotNull; + /** - * Classloader part of a hierarchy of classloader + * Classloader part of a hierarchy of classloader. */ public abstract class HierarchyClassLoader extends URLClassLoader { protected final List children = new LinkedList<>(); @@ -24,12 +24,15 @@ public void addChild(@NotNull MinestomExtensionClassLoader loader) { public InputStream getResourceAsStreamWithChildren(String name) { InputStream in = getResourceAsStream(name); - if(in != null) return in; + if (in != null) { + return in; + } - for(MinestomExtensionClassLoader child : children) { + for (MinestomExtensionClassLoader child : children) { InputStream childInput = child.getResourceAsStreamWithChildren(name); - if(childInput != null) + if (childInput != null) { return childInput; + } } return null; } diff --git a/src/main/java/net/minestom/server/extras/selfmodification/MinestomExtensionClassLoader.java b/src/main/java/net/minestom/server/extras/selfmodification/MinestomExtensionClassLoader.java index 2241944..ad0d0fe 100644 --- a/src/main/java/net/minestom/server/extras/selfmodification/MinestomExtensionClassLoader.java +++ b/src/main/java/net/minestom/server/extras/selfmodification/MinestomExtensionClassLoader.java @@ -4,8 +4,9 @@ import java.net.URL; public class MinestomExtensionClassLoader extends HierarchyClassLoader { + /** - * Root ClassLoader, everything goes through it before any attempt at loading is done inside this classloader + * Root ClassLoader, everything goes through it before any attempt at loading is done inside this classloader. */ private final MinestomRootClassLoader root; @@ -25,14 +26,15 @@ protected Class loadClass(String name, boolean resolve) throws ClassNotFoundE } /** - * Assumes the name is not null, nor it does represent a protected class + * Assumes the name is not null, nor it does represent a protected class. + * * @param name * @return The loaded class * @throws ClassNotFoundException if the class is not found inside this classloader */ public Class loadClassAsChild(String name, boolean resolve) throws ClassNotFoundException { Class loadedClass = findLoadedClass(name); - if(loadedClass != null) { + if (loadedClass != null) { return loadedClass; } @@ -55,7 +57,7 @@ public Class loadClassAsChild(String name, boolean resolve) throws ClassNotFo throw new ClassNotFoundException("Could not load class " + name, e); } } catch (ClassNotFoundException e) { - for(MinestomExtensionClassLoader child : children) { + for (MinestomExtensionClassLoader child : children) { try { Class loaded = child.loadClassAsChild(name, resolve); return loaded; @@ -72,6 +74,6 @@ public Class loadClassAsChild(String name, boolean resolve) throws ClassNotFo @Deprecated(forRemoval = false, since = "9") protected void finalize() throws Throwable { super.finalize(); - System.err.println("Class loader "+getName()+" finalized."); + System.err.println("Class loader " + getName() + " finalized."); } } diff --git a/src/main/java/net/minestom/server/extras/selfmodification/MinestomRootClassLoader.java b/src/main/java/net/minestom/server/extras/selfmodification/MinestomRootClassLoader.java index 8d331ab..b3317bc 100644 --- a/src/main/java/net/minestom/server/extras/selfmodification/MinestomRootClassLoader.java +++ b/src/main/java/net/minestom/server/extras/selfmodification/MinestomRootClassLoader.java @@ -1,18 +1,5 @@ package net.minestom.server.extras.selfmodification; -import org.jetbrains.annotations.NotNull; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.tree.ClassNode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import de.geolykt.starloader.transformers.ASMTransformer; -import net.fabricmc.accesswidener.AccessWidener; -import net.fabricmc.accesswidener.AccessWidenerVisitor; - import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -25,18 +12,34 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Objects; import java.util.Set; +import org.jetbrains.annotations.NotNull; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.ClassNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.fabricmc.accesswidener.AccessWidener; +import net.fabricmc.accesswidener.AccessWidenerVisitor; + +import de.geolykt.starloader.mod.ExtensionManager; +import de.geolykt.starloader.transformers.ASMTransformer; + /** - * Class Loader that can modify class bytecode when they are loaded + * Class Loader that can modify class bytecode when they are loaded. */ public class MinestomRootClassLoader extends HierarchyClassLoader { - public final static Logger LOGGER = LoggerFactory.getLogger(MinestomRootClassLoader.class); + private static final Logger LOGGER = LoggerFactory.getLogger(MinestomRootClassLoader.class); private static MinestomRootClassLoader INSTANCE; - public AccessWidener widener; + private AccessWidener widener; /** * Classes that cannot be loaded/modified by this classloader. @@ -72,7 +75,7 @@ public class MinestomRootClassLoader extends HierarchyClassLoader { /** * Used to let ASM find out common super types, without actually committing to loading them - * Otherwise ASM would accidentally load classes we might want to modify + * Otherwise ASM would accidentally load classes we might want to modify. */ private final URLClassLoader asmClassLoader; @@ -85,7 +88,7 @@ public class MinestomRootClassLoader extends HierarchyClassLoader { private MinestomRootClassLoader(ClassLoader parent) { super("Starloader Root ClassLoader", extractURLsFromClasspath(), parent); - asmClassLoader = newChild(new URL[0]); + asmClassLoader = newChild(); } public static MinestomRootClassLoader getInstance() { @@ -123,8 +126,9 @@ private static URL[] extractURLsFromClasspath() { @Override public Class loadClass(String name, boolean resolve) throws ClassNotFoundException { Class loadedClass = findLoadedClass(name); - if (loadedClass != null) + if (loadedClass != null) { return loadedClass; + } try { // we do not load system classes by ourselves @@ -151,8 +155,9 @@ public Class loadClass(String name, boolean resolve) throws ClassNotFoundExce private boolean isProtected(String name) { if (!protectedClasses.contains(name)) { for (String start : protectedPackages) { - if (name.startsWith(start)) + if (name.startsWith(start)) { return true; + } } return false; } @@ -194,8 +199,9 @@ private Class define(String name, boolean resolve) throws IOException, ClassN * @throws ClassNotFoundException */ public byte[] loadBytes(String name, boolean transform) throws IOException, ClassNotFoundException { - if (name == null) + if (name == null) { throw new ClassNotFoundException(); + } String path = name.replace(".", "/") + ".class"; InputStream input = getResourceAsStream(path); if (input == null) { @@ -210,8 +216,9 @@ public byte[] loadBytes(String name, boolean transform) throws IOException, Clas } public byte[] loadBytesWithChildren(String name, boolean transform) throws IOException, ClassNotFoundException { - if (name == null) + if (name == null) { throw new ClassNotFoundException(); + } String path = name.replace(".", "/") + ".class"; InputStream input = getResourceAsStreamWithChildren(path); if (input == null) { @@ -286,15 +293,23 @@ public Class findClass(String name) throws ClassNotFoundException { } @NotNull - public URLClassLoader newChild(@NotNull URL[] urls) { - return URLClassLoader.newInstance(urls, this); + public URLClassLoader newChild(@NotNull URL... urls) { + URLClassLoader instance = URLClassLoader.newInstance(urls, this); + if (instance == null) { + throw new IllegalStateException(); + } + return instance; } public void loadModifier(File[] originFiles, String codeModifierClass) { - URL[] urls = new URL[originFiles.length]; + @NotNull URL[] urls = new @NotNull URL[originFiles.length]; try { for (int i = 0; i < originFiles.length; i++) { - urls[i] = originFiles[i].toURI().toURL(); + URL url = originFiles[i].toURI().toURL(); + if (url == null) { + throw new InternalError(); + } + urls[i] = url; } @SuppressWarnings("resource") URLClassLoader loader = newChild(urls); @@ -312,7 +327,7 @@ public void loadModifier(File[] originFiles, String codeModifierClass) { } /** - * Adds a transformer to the transformer pool + * Adds a transformer to the transformer pool. * * @param transformer The transformer to add * @since 2.1.0 @@ -324,7 +339,7 @@ public void addTransformer(ASMTransformer transformer) { } /** - * Adds a modifier to the modifier pool + * Adds a modifier to the modifier pool. * * @param modifier The modifier to add * @deprecated {@link CodeModifier} is getting phased out, use {@link ASMTransformer} instead. Replaced by {@link #addTransformer(ASMTransformer)}. @@ -360,4 +375,11 @@ public List getModifiers() { public List getTransformers() { return new ArrayList<>(modifiers); } + + public void setWidener(@SuppressWarnings("exports") @NotNull AccessWidener accessWidener, @NotNull ExtensionManager extensionManager) { + if (Objects.isNull(extensionManager)) { + throw new NullPointerException(); + } + this.widener = accessWidener; + } } diff --git a/src/main/java/net/minestom/server/extras/selfmodification/mixins/GlobalPropertyServiceMinestom.java b/src/main/java/net/minestom/server/extras/selfmodification/mixins/GlobalPropertyServiceMinestom.java index e3effc4..059b0f0 100644 --- a/src/main/java/net/minestom/server/extras/selfmodification/mixins/GlobalPropertyServiceMinestom.java +++ b/src/main/java/net/minestom/server/extras/selfmodification/mixins/GlobalPropertyServiceMinestom.java @@ -1,14 +1,14 @@ package net.minestom.server.extras.selfmodification.mixins; -import org.spongepowered.asm.service.IGlobalPropertyService; -import org.spongepowered.asm.service.IPropertyKey; - import java.util.HashMap; import java.util.Map; import java.util.Objects; +import org.spongepowered.asm.service.IGlobalPropertyService; +import org.spongepowered.asm.service.IPropertyKey; + /** - * Global properties service for Mixin + * Global properties service for Mixin. */ public class GlobalPropertyServiceMinestom implements IGlobalPropertyService { @@ -35,9 +35,7 @@ public int hashCode() { @Override public String toString() { - return "BasicProperty{" + - "name='" + name + '\'' + - '}'; + return String.format("BasicProperty{name='%s'}", name); } }