From 86205902df3776c537d159bb1d3fffdaee6365b7 Mon Sep 17 00:00:00 2001 From: FalsePattern <30945458+FalsePattern@users.noreply.github.com> Date: Fri, 6 May 2022 13:39:00 +0200 Subject: [PATCH] split dependency loader from FalsePatternLib main class --- .../com/falsepattern/lib/FalsePatternLib.java | 132 ++---------------- .../falsepattern/lib/api/ComplexVersion.java | 6 +- .../lib/api/DependencyLoader.java | 9 +- .../falsepattern/lib/api/SemanticVersion.java | 4 +- .../com/falsepattern/lib/api/Version.java | 4 +- .../ComplexVersion.java | 2 +- .../lib/dependencies/DependencyLoader.java | 127 +++++++++++++++++ .../SemanticVersion.java | 2 +- .../{version => dependencies}/Version.java | 2 +- 9 files changed, 151 insertions(+), 137 deletions(-) rename src/main/java/com/falsepattern/lib/{version => dependencies}/ComplexVersion.java (97%) create mode 100644 src/main/java/com/falsepattern/lib/dependencies/DependencyLoader.java rename src/main/java/com/falsepattern/lib/{version => dependencies}/SemanticVersion.java (98%) rename src/main/java/com/falsepattern/lib/{version => dependencies}/Version.java (88%) diff --git a/src/main/java/com/falsepattern/lib/FalsePatternLib.java b/src/main/java/com/falsepattern/lib/FalsePatternLib.java index c0d1fab..3c375f5 100644 --- a/src/main/java/com/falsepattern/lib/FalsePatternLib.java +++ b/src/main/java/com/falsepattern/lib/FalsePatternLib.java @@ -1,35 +1,30 @@ package com.falsepattern.lib; -import com.falsepattern.lib.version.Version; import com.google.common.eventbus.EventBus; import cpw.mods.fml.common.DummyModContainer; import cpw.mods.fml.common.LoadController; import cpw.mods.fml.common.ModMetadata; -import lombok.NonNull; +import lombok.Getter; import lombok.val; -import lombok.var; import net.minecraft.launchwrapper.Launch; -import net.minecraft.launchwrapper.LaunchClassLoader; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import javax.net.ssl.HttpsURLConnection; -import java.io.*; -import java.net.URL; -import java.util.*; - +import java.util.Arrays; +/** + * Utility class used by FalsePatternLib's internal code. This can change between versions without notice, so do not use this in your code! + */ public class FalsePatternLib extends DummyModContainer { - public static Logger libLog = LogManager.getLogger(ModInfo.MODNAME); - public static final boolean developerEnvironment = (boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); + @Getter + private static final Logger log = LogManager.getLogger(ModInfo.MODNAME); - private static final Map loadedLibraries = new HashMap<>(); - private static final Map loadedLibraryMods = new HashMap<>(); - private static final Set mavenRepositories = new HashSet<>(); + @Getter + private static final boolean developerEnvironment = (boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); public FalsePatternLib() { super(new ModMetadata()); - libLog.info("All your libraries are belong to us!"); + log.info("All your libraries are belong to us!"); val meta = getMetadata(); meta.modId = ModInfo.MODID; meta.name = ModInfo.MODNAME; @@ -46,111 +41,4 @@ public class FalsePatternLib extends DummyModContainer { public boolean registerBus(EventBus bus, LoadController controller) { return true; } - - public static void addMavenRepo(String url) { - mavenRepositories.add(url); - } - - @SuppressWarnings("ResultOfMethodCallIgnored") - public static void loadLibrary(String loadingModId, String groupId, String artifactId, @NonNull Version minVersion, Version maxVersion, @NonNull Version preferredVersion, String regularSuffix, String devSuffix) { - val suffix = developerEnvironment ? devSuffix : regularSuffix; - libLog.info("Adding library {}:{}:{}{}, requested by mod {}", groupId, artifactId, preferredVersion, suffix != null ? "-" + suffix : "", loadingModId); - var artifact = groupId + ":" + artifactId + ":" + suffix; - if (loadedLibraries.containsKey(artifact)) { - val currentVer = loadedLibraries.get(artifact); - if (currentVer.equals(preferredVersion)) return; - val rangeString = "(minimum: " + minVersion + (maxVersion == null ? "" : ", maximum: " + maxVersion) + ")"; - if (minVersion.compareTo(currentVer) > 0 || (maxVersion != null && maxVersion.compareTo(currentVer) < 0)) { - for (int i = 0; i < 16; i++) { - libLog.fatal("ALERT VVVVVVVVVVVV ALERT"); - } - libLog.fatal("Library {}:{}{} already loaded with version {}, " + - "but a version in the range {} was requested! Thing may go horribly wrong! " + - "Requested by mod: {}, previously loaded by mod: {}", - groupId, artifactId, suffix != null ? ":" + suffix : "", currentVer, - rangeString, - loadingModId, loadedLibraryMods.get(artifact)); - for (int i = 0; i < 16; i++) { - libLog.fatal("ALERT ^^^^^^^^^^^^ ALERT"); - } - } else { - libLog.info("Attempted loading of library {}:{}{} with preferred version {}, " + - "but version {} was already loaded, which matched the range {}. This is not an error. " + - "Requested by mod: {}, previously loaded by mod: {}", - groupId, artifactId, suffix != null ? ":" + suffix : "", preferredVersion, - currentVer, rangeString, - loadingModId, loadedLibraryMods.get(artifact)); - } - return; - } - val modsDir = new File(CoreLoadingPlugin.mcDir, "mods"); - val mavenJarName = String.format("%s-%s%s.jar", artifactId, preferredVersion, (suffix != null) ? ("-" + suffix) : ""); - val jarName = groupId + "-" + mavenJarName; - val libDir = new File(modsDir, "falsepattern"); - if (!libDir.exists()) { - libDir.mkdirs(); - } - val file = new File(libDir, jarName); - if (file.exists()) { - try { - addToClasspath(file); - loadedLibraries.put(artifact, preferredVersion); - libLog.info("Library {}:{}:{}{} successfully loaded from disk!", groupId, artifactId, preferredVersion, (suffix != null) ? ":" + suffix : ""); - return; - } catch (RuntimeException e) { - libLog.warn("Failed to load library {}:{}:{}{} from file! Redownloading...", groupId, artifactId, preferredVersion, (suffix != null) ? ":" + suffix : ""); - file.delete(); - } - } - for (var repo: mavenRepositories) { - try { - if (!repo.endsWith("/")) repo = repo + "/"; - val url = new URL(String.format("%s%s/%s/%s/%s", repo, groupId.replace('.', '/'), artifactId, preferredVersion, mavenJarName)); - - val connection = (HttpsURLConnection) url.openConnection(); - connection.setConnectTimeout(1500); - connection.setReadTimeout(1500); - connection.setRequestProperty("User-Agent", "FalsePatternLib Downloader"); - if (connection.getResponseCode() != 200) { - libLog.info("Artifact {}:{}:{}{} was not found on repo {}", groupId, artifactId, preferredVersion, (suffix != null) ? ":" + suffix : "", repo); - connection.disconnect(); - continue; - } - libLog.info("Downloading {}:{}:{}{} from {}", groupId, artifactId, preferredVersion, (suffix != null) ? ":" + suffix : "", repo); - download(connection.getInputStream(), file); - libLog.info("Downloaded {}:{}:{}{}", groupId, artifactId, preferredVersion, (suffix != null) ? ":" + suffix : ""); - loadedLibraries.put(artifact, preferredVersion); - loadedLibraryMods.put(artifact, loadingModId); - addToClasspath(file); - return; - } catch (IOException ignored) {} - } - val errorMessage = "Failed to download library " + groupId + ":" + artifactId + ":" + preferredVersion + ((suffix != null) ? ":" + suffix : "") + " from any repository! Requested by mod: " + loadingModId; - libLog.fatal(errorMessage); - throw new IllegalStateException(errorMessage); - } - - private static void addToClasspath(File file) { - try { - val cl = (LaunchClassLoader) FalsePatternLib.class.getClassLoader(); - cl.addURL(file.toURI().toURL()); - libLog.info("Injected file {} into classpath!", file.getPath()); - } catch (Exception e) { - throw new RuntimeException("Failed to add library to classpath: " + file.getAbsolutePath(), e); - } - } - - private static void download(InputStream is, File target) throws IOException { - if (target.exists()) return; - - var bytesRead = 0; - - val fileOutput = new BufferedOutputStream(new FileOutputStream(target)); - byte[] smallBuffer = new byte[4096]; - while ((bytesRead = is.read(smallBuffer)) >= 0) { - fileOutput.write(smallBuffer, 0, bytesRead); - } - fileOutput.close(); - is.close(); - } } diff --git a/src/main/java/com/falsepattern/lib/api/ComplexVersion.java b/src/main/java/com/falsepattern/lib/api/ComplexVersion.java index 91f0c99..3f5d761 100644 --- a/src/main/java/com/falsepattern/lib/api/ComplexVersion.java +++ b/src/main/java/com/falsepattern/lib/api/ComplexVersion.java @@ -1,14 +1,14 @@ package com.falsepattern.lib.api; -import com.falsepattern.lib.version.Version; +import com.falsepattern.lib.dependencies.Version; import lombok.NonNull; /** * Deprecated in 0.6.*, will be removed in 0.7.0. - * Moved to {@link com.falsepattern.lib.version.ComplexVersion}. + * Moved to {@link com.falsepattern.lib.dependencies.ComplexVersion}. */ @Deprecated -public class ComplexVersion extends com.falsepattern.lib.version.ComplexVersion { +public class ComplexVersion extends com.falsepattern.lib.dependencies.ComplexVersion { public ComplexVersion(@NonNull Version mainVersion, Version... subVersions) { super(mainVersion, subVersions); Deprecation.warn(); diff --git a/src/main/java/com/falsepattern/lib/api/DependencyLoader.java b/src/main/java/com/falsepattern/lib/api/DependencyLoader.java index dfff652..22af414 100644 --- a/src/main/java/com/falsepattern/lib/api/DependencyLoader.java +++ b/src/main/java/com/falsepattern/lib/api/DependencyLoader.java @@ -1,24 +1,23 @@ package com.falsepattern.lib.api; -import com.falsepattern.lib.FalsePatternLib; -import com.falsepattern.lib.version.Version; +import com.falsepattern.lib.dependencies.Version; import lombok.Builder; import lombok.NonNull; /** * Deprecated in 0.6.*, will be removed in 0.7.0. - * Outdated wrapper on top of the {@link FalsePatternLib} class. Use that one instead. + * Outdated wrapper on top of the {@link com.falsepattern.lib.dependencies.DependencyLoader} class. Use that one instead. */ @Deprecated public class DependencyLoader { @Builder public static void loadLibrary(String loadingModId, String groupId, String artifactId, @NonNull Version minVersion, Version maxVersion, @NonNull Version preferredVersion, String regularSuffix, String devSuffix) { - FalsePatternLib.loadLibrary(loadingModId, groupId, artifactId, minVersion, maxVersion, preferredVersion, regularSuffix, devSuffix); + com.falsepattern.lib.dependencies.DependencyLoader.loadLibrary(loadingModId, groupId, artifactId, minVersion, maxVersion, preferredVersion, regularSuffix, devSuffix); Deprecation.warn(); } public static void addMavenRepo(String url) { - FalsePatternLib.addMavenRepo(url); + com.falsepattern.lib.dependencies.DependencyLoader.addMavenRepo(url); Deprecation.warn(); } } diff --git a/src/main/java/com/falsepattern/lib/api/SemanticVersion.java b/src/main/java/com/falsepattern/lib/api/SemanticVersion.java index 2c30668..b1379f9 100644 --- a/src/main/java/com/falsepattern/lib/api/SemanticVersion.java +++ b/src/main/java/com/falsepattern/lib/api/SemanticVersion.java @@ -2,10 +2,10 @@ package com.falsepattern.lib.api; /** * Deprecated in 0.6.*, will be removed in 0.7.0. - * Moved to {@link com.falsepattern.lib.version.SemanticVersion}. + * Moved to {@link com.falsepattern.lib.dependencies.SemanticVersion}. */ @Deprecated -public class SemanticVersion extends com.falsepattern.lib.version.SemanticVersion { +public class SemanticVersion extends com.falsepattern.lib.dependencies.SemanticVersion { public SemanticVersion(int majorVersion, int minorVersion, int patchVersion, String preRelease, String build) { super(majorVersion, minorVersion, patchVersion, preRelease, build); Deprecation.warn(); diff --git a/src/main/java/com/falsepattern/lib/api/Version.java b/src/main/java/com/falsepattern/lib/api/Version.java index a279a09..cb97776 100644 --- a/src/main/java/com/falsepattern/lib/api/Version.java +++ b/src/main/java/com/falsepattern/lib/api/Version.java @@ -2,10 +2,10 @@ package com.falsepattern.lib.api; /** * Deprecated in 0.6.*, will be removed in 0.7.0. - * Moved to {@link com.falsepattern.lib.version.SemanticVersion}. + * Moved to {@link com.falsepattern.lib.dependencies.SemanticVersion}. */ @Deprecated -public abstract class Version extends com.falsepattern.lib.version.Version { +public abstract class Version extends com.falsepattern.lib.dependencies.Version { protected Version() { super(); Deprecation.warn(); diff --git a/src/main/java/com/falsepattern/lib/version/ComplexVersion.java b/src/main/java/com/falsepattern/lib/dependencies/ComplexVersion.java similarity index 97% rename from src/main/java/com/falsepattern/lib/version/ComplexVersion.java rename to src/main/java/com/falsepattern/lib/dependencies/ComplexVersion.java index 7779686..66504c5 100644 --- a/src/main/java/com/falsepattern/lib/version/ComplexVersion.java +++ b/src/main/java/com/falsepattern/lib/dependencies/ComplexVersion.java @@ -1,4 +1,4 @@ -package com.falsepattern.lib.version; +package com.falsepattern.lib.dependencies; import lombok.NonNull; import lombok.val; diff --git a/src/main/java/com/falsepattern/lib/dependencies/DependencyLoader.java b/src/main/java/com/falsepattern/lib/dependencies/DependencyLoader.java new file mode 100644 index 0000000..270ec20 --- /dev/null +++ b/src/main/java/com/falsepattern/lib/dependencies/DependencyLoader.java @@ -0,0 +1,127 @@ +package com.falsepattern.lib.dependencies; + +import com.falsepattern.lib.CoreLoadingPlugin; +import com.falsepattern.lib.FalsePatternLib; +import lombok.NonNull; +import lombok.val; +import lombok.var; +import net.minecraft.launchwrapper.LaunchClassLoader; + +import javax.net.ssl.HttpsURLConnection; +import java.io.*; +import java.net.URL; +import java.util.*; + + +public class DependencyLoader { + + private static final Map loadedLibraries = new HashMap<>(); + private static final Map loadedLibraryMods = new HashMap<>(); + private static final Set mavenRepositories = new HashSet<>(); + + public static void addMavenRepo(String url) { + mavenRepositories.add(url); + } + + public static void loadLibrary(String loadingModId, String groupId, String artifactId, @NonNull Version minVersion, Version maxVersion, @NonNull Version preferredVersion, String regularSuffix, String devSuffix) { + val suffix = FalsePatternLib.isDeveloperEnvironment() ? devSuffix : regularSuffix; + FalsePatternLib.getLog().info("Adding library {}:{}:{}{}, requested by mod {}", groupId, artifactId, preferredVersion, suffix != null ? "-" + suffix : "", loadingModId); + var artifact = groupId + ":" + artifactId + ":" + suffix; + if (loadedLibraries.containsKey(artifact)) { + val currentVer = loadedLibraries.get(artifact); + if (currentVer.equals(preferredVersion)) return; + val rangeString = "(minimum: " + minVersion + (maxVersion == null ? "" : ", maximum: " + maxVersion) + ")"; + if (minVersion.compareTo(currentVer) > 0 || (maxVersion != null && maxVersion.compareTo(currentVer) < 0)) { + for (int i = 0; i < 16; i++) { + FalsePatternLib.getLog().fatal("ALERT VVVVVVVVVVVV ALERT"); + } + FalsePatternLib.getLog().fatal("Library {}:{}{} already loaded with version {}, " + + "but a version in the range {} was requested! Thing may go horribly wrong! " + + "Requested by mod: {}, previously loaded by mod: {}", + groupId, artifactId, suffix != null ? ":" + suffix : "", currentVer, + rangeString, + loadingModId, loadedLibraryMods.get(artifact)); + for (int i = 0; i < 16; i++) { + FalsePatternLib.getLog().fatal("ALERT ^^^^^^^^^^^^ ALERT"); + } + } else { + FalsePatternLib.getLog().info("Attempted loading of library {}:{}{} with preferred version {}, " + + "but version {} was already loaded, which matched the range {}. This is not an error. " + + "Requested by mod: {}, previously loaded by mod: {}", + groupId, artifactId, suffix != null ? ":" + suffix : "", preferredVersion, + currentVer, rangeString, + loadingModId, loadedLibraryMods.get(artifact)); + } + return; + } + val modsDir = new File(CoreLoadingPlugin.mcDir, "mods"); + val mavenJarName = String.format("%s-%s%s.jar", artifactId, preferredVersion, (suffix != null) ? ("-" + suffix) : ""); + val jarName = groupId + "-" + mavenJarName; + val libDir = new File(modsDir, "falsepattern"); + if (!libDir.exists()) { + libDir.mkdirs(); + } + val file = new File(libDir, jarName); + if (file.exists()) { + try { + addToClasspath(file); + loadedLibraries.put(artifact, preferredVersion); + FalsePatternLib.getLog().info("Library {}:{}:{}{} successfully loaded from disk!", groupId, artifactId, preferredVersion, (suffix != null) ? ":" + suffix : ""); + return; + } catch (RuntimeException e) { + FalsePatternLib.getLog().warn("Failed to load library {}:{}:{}{} from file! Redownloading...", groupId, artifactId, preferredVersion, (suffix != null) ? ":" + suffix : ""); + file.delete(); + } + } + for (var repo: mavenRepositories) { + try { + if (!repo.endsWith("/")) repo = repo + "/"; + val url = new URL(String.format("%s%s/%s/%s/%s", repo, groupId.replace('.', '/'), artifactId, preferredVersion, mavenJarName)); + + val connection = (HttpsURLConnection) url.openConnection(); + connection.setConnectTimeout(1500); + connection.setReadTimeout(1500); + connection.setRequestProperty("User-Agent", "FalsePatternLib Downloader"); + if (connection.getResponseCode() != 200) { + FalsePatternLib.getLog().info("Artifact {}:{}:{}{} was not found on repo {}", groupId, artifactId, preferredVersion, (suffix != null) ? ":" + suffix : "", repo); + connection.disconnect(); + continue; + } + FalsePatternLib.getLog().info("Downloading {}:{}:{}{} from {}", groupId, artifactId, preferredVersion, (suffix != null) ? ":" + suffix : "", repo); + download(connection.getInputStream(), file); + FalsePatternLib.getLog().info("Downloaded {}:{}:{}{}", groupId, artifactId, preferredVersion, (suffix != null) ? ":" + suffix : ""); + loadedLibraries.put(artifact, preferredVersion); + loadedLibraryMods.put(artifact, loadingModId); + addToClasspath(file); + return; + } catch (IOException ignored) {} + } + val errorMessage = "Failed to download library " + groupId + ":" + artifactId + ":" + preferredVersion + ((suffix != null) ? ":" + suffix : "") + " from any repository! Requested by mod: " + loadingModId; + FalsePatternLib.getLog().fatal(errorMessage); + throw new IllegalStateException(errorMessage); + } + + private static void addToClasspath(File file) { + try { + val cl = (LaunchClassLoader) DependencyLoader.class.getClassLoader(); + cl.addURL(file.toURI().toURL()); + FalsePatternLib.getLog().info("Injected file {} into classpath!", file.getPath()); + } catch (Exception e) { + throw new RuntimeException("Failed to add library to classpath: " + file.getAbsolutePath(), e); + } + } + + private static void download(InputStream is, File target) throws IOException { + if (target.exists()) return; + + var bytesRead = 0; + + val fileOutput = new BufferedOutputStream(new FileOutputStream(target)); + byte[] smallBuffer = new byte[4096]; + while ((bytesRead = is.read(smallBuffer)) >= 0) { + fileOutput.write(smallBuffer, 0, bytesRead); + } + fileOutput.close(); + is.close(); + } +} diff --git a/src/main/java/com/falsepattern/lib/version/SemanticVersion.java b/src/main/java/com/falsepattern/lib/dependencies/SemanticVersion.java similarity index 98% rename from src/main/java/com/falsepattern/lib/version/SemanticVersion.java rename to src/main/java/com/falsepattern/lib/dependencies/SemanticVersion.java index 5456c60..1ebaffe 100644 --- a/src/main/java/com/falsepattern/lib/version/SemanticVersion.java +++ b/src/main/java/com/falsepattern/lib/dependencies/SemanticVersion.java @@ -1,4 +1,4 @@ -package com.falsepattern.lib.version; +package com.falsepattern.lib.dependencies; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/com/falsepattern/lib/version/Version.java b/src/main/java/com/falsepattern/lib/dependencies/Version.java similarity index 88% rename from src/main/java/com/falsepattern/lib/version/Version.java rename to src/main/java/com/falsepattern/lib/dependencies/Version.java index 411166b..1437121 100644 --- a/src/main/java/com/falsepattern/lib/version/Version.java +++ b/src/main/java/com/falsepattern/lib/dependencies/Version.java @@ -1,4 +1,4 @@ -package com.falsepattern.lib.version; +package com.falsepattern.lib.dependencies; public abstract class Version implements Comparable { protected Version(){}