From 11934bfcdc02f012c99229f3371fcad292783708 Mon Sep 17 00:00:00 2001 From: Meredith Espinosa Date: Wed, 15 Aug 2018 23:35:23 -0700 Subject: [PATCH 1/6] add version and dependencies to ModInfo --- src/main/java/org/dimdev/riftloader/ModInfo.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/dimdev/riftloader/ModInfo.java b/src/main/java/org/dimdev/riftloader/ModInfo.java index 07e341f..12518a8 100644 --- a/src/main/java/org/dimdev/riftloader/ModInfo.java +++ b/src/main/java/org/dimdev/riftloader/ModInfo.java @@ -9,6 +9,8 @@ public class ModInfo { public String id; public String name; + public String version; + public List dependencies = new ArrayList<>(); public List authors = new ArrayList<>(); public List listeners = new ArrayList<>(); } From 400b1c25c5e2a061cb407df21f4b1887e6c69413 Mon Sep 17 00:00:00 2001 From: Meredith Espinosa Date: Thu, 16 Aug 2018 00:14:52 -0700 Subject: [PATCH 2/6] Add versions and starter dependency handling --- build.gradle | 1 + .../MissingDependencyException.java | 7 ++++ .../java/org/dimdev/riftloader/ModInfo.java | 4 ++- .../org/dimdev/riftloader/RiftLoader.java | 34 +++++++++++++++++++ 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/dimdev/riftloader/MissingDependencyException.java diff --git a/build.gradle b/build.gradle index 89a7b24..7fb722b 100644 --- a/build.gradle +++ b/build.gradle @@ -40,6 +40,7 @@ dependencies { implementation('net.minecraft:launchwrapper:1.12') { transitive = false } implementation 'org.ow2.asm:asm:6.2' implementation 'org.ow2.asm:asm-commons:6.2' + compile 'com.vdurmont:semver4j:2.2.0' } minecraft { diff --git a/src/main/java/org/dimdev/riftloader/MissingDependencyException.java b/src/main/java/org/dimdev/riftloader/MissingDependencyException.java new file mode 100644 index 0000000..1fdafe5 --- /dev/null +++ b/src/main/java/org/dimdev/riftloader/MissingDependencyException.java @@ -0,0 +1,7 @@ +package org.dimdev.riftloader; + +public class MissingDependencyException extends RuntimeException { + public MissingDependencyException(String s) { + super(s); + } +} diff --git a/src/main/java/org/dimdev/riftloader/ModInfo.java b/src/main/java/org/dimdev/riftloader/ModInfo.java index 12518a8..516910f 100644 --- a/src/main/java/org/dimdev/riftloader/ModInfo.java +++ b/src/main/java/org/dimdev/riftloader/ModInfo.java @@ -2,7 +2,9 @@ import java.io.File; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class ModInfo { public File source; @@ -10,7 +12,7 @@ public class ModInfo { public String id; public String name; public String version; - public List dependencies = new ArrayList<>(); + public Map dependencies = new HashMap<>(); public List authors = new ArrayList<>(); public List listeners = new ArrayList<>(); } diff --git a/src/main/java/org/dimdev/riftloader/RiftLoader.java b/src/main/java/org/dimdev/riftloader/RiftLoader.java index 07e3929..1a7dc06 100644 --- a/src/main/java/org/dimdev/riftloader/RiftLoader.java +++ b/src/main/java/org/dimdev/riftloader/RiftLoader.java @@ -2,6 +2,8 @@ import com.google.gson.Gson; import com.google.gson.JsonParseException; +import com.vdurmont.semver4j.Semver; +import com.vdurmont.semver4j.SemverException; import net.minecraft.launchwrapper.Launch; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -76,6 +78,7 @@ public void findMods(File modsDir) { mod.source = file; mod.id = "optifine"; mod.name = "Optifine"; + mod.version = "1.13"; mod.authors.add("sp614x"); mod.listeners.add("org.dimdev.riftloader.OptifineLoader"); modInfoMap.put("optifine", mod); @@ -136,6 +139,20 @@ private void loadModFromJson(InputStream in, File source) { throw new ModConflictException("Duplicate mod '" + modInfo.id + "': " + modInfoMap.get(modInfo.id).source + ", " + modInfo.source); } + // Make sure the version is proper SemVer + if (modInfo.version == null) { + log.error("Mod file " + modInfo.source + "'s riftmod.json is missing a 'version' field"); + return; + } else { + try { + Semver version = new Semver(modInfo.version); + } catch (SemverException t) { + log.error("Mod file " + modInfo.source + "'s riftmod.json has a malformed 'version' field"); + log.error("SemVer error: " + t.getMessage()); + return; + } + } + // Add the mod to the 'id -> mod info' map modInfoMap.put(modInfo.id, modInfo); log.info("Loaded mod '" + modInfo.id + "'"); @@ -159,6 +176,23 @@ public void initMods() { } } + // Check dependencies + for (ModInfo modInfo : modInfoMap.values()) { + if (modInfo.dependencies != null) { + for (String name : modInfo.dependencies.values()) { + if (!modInfoMap.containsKey(name)) { + throw new MissingDependencyException("Mod " + modInfo.source + " is missing dependency " + name + ":" + modInfo.dependencies.get(name)); + } + ModInfo dependency = modInfoMap.get(name); + Semver neededVersion = new Semver(modInfo.dependencies.get(name)); + Semver trueVersion = new Semver(dependency.version); + if (trueVersion.isLowerThan(neededVersion)) { + throw new MissingDependencyException("Mod " + modInfo.source + " has outdated dependency " + name + ": must be at least " + neededVersion); + } + } + } + } + // Load the listener classes for (ModInfo modInfo : modInfoMap.values()) { if (modInfo.listeners != null) { From 79e976a0194c3b693efcb7db400b23dfbf866754 Mon Sep 17 00:00:00 2001 From: Meredith Espinosa Date: Thu, 16 Aug 2018 00:23:52 -0700 Subject: [PATCH 3/6] be nicer with the SemVer --- .../java/org/dimdev/riftloader/RiftLoader.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/dimdev/riftloader/RiftLoader.java b/src/main/java/org/dimdev/riftloader/RiftLoader.java index 1a7dc06..ec64f24 100644 --- a/src/main/java/org/dimdev/riftloader/RiftLoader.java +++ b/src/main/java/org/dimdev/riftloader/RiftLoader.java @@ -145,7 +145,7 @@ private void loadModFromJson(InputStream in, File source) { return; } else { try { - Semver version = new Semver(modInfo.version); + Semver version = new Semver(modInfo.version, Semver.SemverType.LOOSE); } catch (SemverException t) { log.error("Mod file " + modInfo.source + "'s riftmod.json has a malformed 'version' field"); log.error("SemVer error: " + t.getMessage()); @@ -184,11 +184,16 @@ public void initMods() { throw new MissingDependencyException("Mod " + modInfo.source + " is missing dependency " + name + ":" + modInfo.dependencies.get(name)); } ModInfo dependency = modInfoMap.get(name); - Semver neededVersion = new Semver(modInfo.dependencies.get(name)); - Semver trueVersion = new Semver(dependency.version); - if (trueVersion.isLowerThan(neededVersion)) { - throw new MissingDependencyException("Mod " + modInfo.source + " has outdated dependency " + name + ": must be at least " + neededVersion); + try { + Semver neededVersion = new Semver(modInfo.dependencies.get(name), Semver.SemverType.LOOSE); + Semver trueVersion = new Semver(dependency.version, Semver.SemverType.LOOSE); + if (trueVersion.isLowerThan(neededVersion)) { + throw new MissingDependencyException("Mod " + modInfo.source + " has outdated dependency " + name + ": must be at least " + neededVersion); + } + } catch (SemverException t) { + throw new MissingDependencyException("Mod " + modInfo.source + " has malformed dependency " + name + ": SemVer error " + t.getMessage()); } + } } } From e17be7b08b3dc0b68b5d553de10a70cd159a8b4b Mon Sep 17 00:00:00 2001 From: Meredith Espinosa Date: Thu, 16 Aug 2018 00:55:28 -0700 Subject: [PATCH 4/6] map entries! --- .../java/org/dimdev/riftloader/ModInfo.java | 2 +- .../org/dimdev/riftloader/RiftLoader.java | 26 ++++++++++++------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/dimdev/riftloader/ModInfo.java b/src/main/java/org/dimdev/riftloader/ModInfo.java index 516910f..71715a7 100644 --- a/src/main/java/org/dimdev/riftloader/ModInfo.java +++ b/src/main/java/org/dimdev/riftloader/ModInfo.java @@ -12,7 +12,7 @@ public class ModInfo { public String id; public String name; public String version; - public Map dependencies = new HashMap<>(); + public Map> dependencies = new HashMap<>(); public List authors = new ArrayList<>(); public List listeners = new ArrayList<>(); } diff --git a/src/main/java/org/dimdev/riftloader/RiftLoader.java b/src/main/java/org/dimdev/riftloader/RiftLoader.java index ec64f24..d7273f1 100644 --- a/src/main/java/org/dimdev/riftloader/RiftLoader.java +++ b/src/main/java/org/dimdev/riftloader/RiftLoader.java @@ -179,19 +179,27 @@ public void initMods() { // Check dependencies for (ModInfo modInfo : modInfoMap.values()) { if (modInfo.dependencies != null) { - for (String name : modInfo.dependencies.values()) { - if (!modInfoMap.containsKey(name)) { - throw new MissingDependencyException("Mod " + modInfo.source + " is missing dependency " + name + ":" + modInfo.dependencies.get(name)); + for (String id : modInfo.dependencies.keySet()) { + if (!modInfoMap.containsKey(id)) { + throw new MissingDependencyException("Mod " + modInfo.source + " is missing dependency " + id + ":" + modInfo.dependencies.get(id)); } - ModInfo dependency = modInfoMap.get(name); + ModInfo dependency = modInfoMap.get(id); + Semver trueVersion = new Semver(dependency.version, Semver.SemverType.LOOSE); + Map.Entry versions = modInfo.dependencies.get(id); try { - Semver neededVersion = new Semver(modInfo.dependencies.get(name), Semver.SemverType.LOOSE); - Semver trueVersion = new Semver(dependency.version, Semver.SemverType.LOOSE); - if (trueVersion.isLowerThan(neededVersion)) { - throw new MissingDependencyException("Mod " + modInfo.source + " has outdated dependency " + name + ": must be at least " + neededVersion); + Semver lowestVersion = new Semver(versions.getKey(), Semver.SemverType.LOOSE); + + if (trueVersion.isLowerThan(lowestVersion)) { + throw new MissingDependencyException("Mod " + modInfo.source + " has outdated dependency: " + id + " must be at least " + lowestVersion); + } + if (versions.getValue() != null) { + Semver highestVersion = new Semver(versions.getValue(), Semver.SemverType.LOOSE); + if (trueVersion.isGreaterThan(highestVersion)) { + throw new MissingDependencyException("Mod " + modInfo.source + " has misdated dependency: " + id + " must be at most " + highestVersion); + } } } catch (SemverException t) { - throw new MissingDependencyException("Mod " + modInfo.source + " has malformed dependency " + name + ": SemVer error " + t.getMessage()); + throw new MissingDependencyException("Mod " + modInfo.source + " has malformed dependency in " + id + ": SemVer error " + t.getMessage()); } } From dffcf56f1388e7d5833162ed47fa55d6d819fbe3 Mon Sep 17 00:00:00 2001 From: Meredith Espinosa Date: Thu, 16 Aug 2018 03:05:03 -0700 Subject: [PATCH 5/6] simplify some things --- src/main/java/org/dimdev/riftloader/ModInfo.java | 2 +- src/main/java/org/dimdev/riftloader/RiftLoader.java | 11 +++-------- src/main/resources/riftmod.json | 1 + 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/dimdev/riftloader/ModInfo.java b/src/main/java/org/dimdev/riftloader/ModInfo.java index 71715a7..516910f 100644 --- a/src/main/java/org/dimdev/riftloader/ModInfo.java +++ b/src/main/java/org/dimdev/riftloader/ModInfo.java @@ -12,7 +12,7 @@ public class ModInfo { public String id; public String name; public String version; - public Map> dependencies = new HashMap<>(); + public Map dependencies = new HashMap<>(); public List authors = new ArrayList<>(); public List listeners = new ArrayList<>(); } diff --git a/src/main/java/org/dimdev/riftloader/RiftLoader.java b/src/main/java/org/dimdev/riftloader/RiftLoader.java index d7273f1..6f4cc6f 100644 --- a/src/main/java/org/dimdev/riftloader/RiftLoader.java +++ b/src/main/java/org/dimdev/riftloader/RiftLoader.java @@ -131,6 +131,8 @@ private void loadModFromJson(InputStream in, File source) { ModInfo modInfo = GSON.fromJson(new InputStreamReader(in), ModInfo.class); modInfo.source = source; + + // Make sure the id isn't null and there aren't any duplicates if (modInfo.id == null) { log.error("Mod file " + modInfo.source + "'s riftmod.json is missing a 'id' field"); @@ -185,19 +187,12 @@ public void initMods() { } ModInfo dependency = modInfoMap.get(id); Semver trueVersion = new Semver(dependency.version, Semver.SemverType.LOOSE); - Map.Entry versions = modInfo.dependencies.get(id); try { - Semver lowestVersion = new Semver(versions.getKey(), Semver.SemverType.LOOSE); + Semver lowestVersion = new Semver(modInfo.dependencies.get(id), Semver.SemverType.LOOSE); if (trueVersion.isLowerThan(lowestVersion)) { throw new MissingDependencyException("Mod " + modInfo.source + " has outdated dependency: " + id + " must be at least " + lowestVersion); } - if (versions.getValue() != null) { - Semver highestVersion = new Semver(versions.getValue(), Semver.SemverType.LOOSE); - if (trueVersion.isGreaterThan(highestVersion)) { - throw new MissingDependencyException("Mod " + modInfo.source + " has misdated dependency: " + id + " must be at most " + highestVersion); - } - } } catch (SemverException t) { throw new MissingDependencyException("Mod " + modInfo.source + " has malformed dependency in " + id + ": SemVer error " + t.getMessage()); } diff --git a/src/main/resources/riftmod.json b/src/main/resources/riftmod.json index 192688c..7e689fe 100644 --- a/src/main/resources/riftmod.json +++ b/src/main/resources/riftmod.json @@ -1,6 +1,7 @@ { "id": "rift", "name": "Rift", + "version": "1.0.3-SNAPSHOT", "authors": [ "Runemoro" ], From 6a415300246158696163fe5068f60b26c06b2144 Mon Sep 17 00:00:00 2001 From: Meredith Espinosa Date: Thu, 16 Aug 2018 15:26:02 -0700 Subject: [PATCH 6/6] add more Dependency information --- .../org/dimdev/riftloader/Dependency.java | 11 ++++ .../java/org/dimdev/riftloader/ModInfo.java | 4 +- .../org/dimdev/riftloader/RiftLoader.java | 65 +++++++++++-------- 3 files changed, 50 insertions(+), 30 deletions(-) create mode 100644 src/main/java/org/dimdev/riftloader/Dependency.java diff --git a/src/main/java/org/dimdev/riftloader/Dependency.java b/src/main/java/org/dimdev/riftloader/Dependency.java new file mode 100644 index 0000000..43349f5 --- /dev/null +++ b/src/main/java/org/dimdev/riftloader/Dependency.java @@ -0,0 +1,11 @@ +package org.dimdev.riftloader; + +public class Dependency { + + public String id; + public String type; + public String load; + public String mavenId; + public String minVersion; + public String maxVersion; +} diff --git a/src/main/java/org/dimdev/riftloader/ModInfo.java b/src/main/java/org/dimdev/riftloader/ModInfo.java index 516910f..d64c845 100644 --- a/src/main/java/org/dimdev/riftloader/ModInfo.java +++ b/src/main/java/org/dimdev/riftloader/ModInfo.java @@ -2,9 +2,7 @@ import java.io.File; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; public class ModInfo { public File source; @@ -12,7 +10,7 @@ public class ModInfo { public String id; public String name; public String version; - public Map dependencies = new HashMap<>(); + public List dependencies = new ArrayList<>(); public List authors = new ArrayList<>(); public List listeners = new ArrayList<>(); } diff --git a/src/main/java/org/dimdev/riftloader/RiftLoader.java b/src/main/java/org/dimdev/riftloader/RiftLoader.java index 6f4cc6f..19dcd7b 100644 --- a/src/main/java/org/dimdev/riftloader/RiftLoader.java +++ b/src/main/java/org/dimdev/riftloader/RiftLoader.java @@ -78,7 +78,7 @@ public void findMods(File modsDir) { mod.source = file; mod.id = "optifine"; mod.name = "Optifine"; - mod.version = "1.13"; + mod.version = "1.13-alpha8"; mod.authors.add("sp614x"); mod.listeners.add("org.dimdev.riftloader.OptifineLoader"); modInfoMap.put("optifine", mod); @@ -131,8 +131,6 @@ private void loadModFromJson(InputStream in, File source) { ModInfo modInfo = GSON.fromJson(new InputStreamReader(in), ModInfo.class); modInfo.source = source; - - // Make sure the id isn't null and there aren't any duplicates if (modInfo.id == null) { log.error("Mod file " + modInfo.source + "'s riftmod.json is missing a 'id' field"); @@ -143,15 +141,13 @@ private void loadModFromJson(InputStream in, File source) { // Make sure the version is proper SemVer if (modInfo.version == null) { - log.error("Mod file " + modInfo.source + "'s riftmod.json is missing a 'version' field"); - return; + log.warn("Mod file " + modInfo.source + "'s riftmod.json is missing a 'version' field. This may affect dependencies!"); } else { try { Semver version = new Semver(modInfo.version, Semver.SemverType.LOOSE); } catch (SemverException t) { - log.error("Mod file " + modInfo.source + "'s riftmod.json has a malformed 'version' field"); - log.error("SemVer error: " + t.getMessage()); - return; + log.warn("Mod file " + modInfo.source + "'s riftmod.json has a malformed 'version' field. This may affect dependencies!"); + log.warn("SemVer error: " + t.getMessage()); } } @@ -169,35 +165,50 @@ public void sortMods() { public void initMods() { log.info("Initializing mods"); - // Load all the mod jars - for (ModInfo modInfo : modInfoMap.values()) { - try { - addURLToClasspath(modInfo.source.toURI().toURL()); - } catch (MalformedURLException e) { - throw new RuntimeException(e); - } - } // Check dependencies for (ModInfo modInfo : modInfoMap.values()) { - if (modInfo.dependencies != null) { - for (String id : modInfo.dependencies.keySet()) { - if (!modInfoMap.containsKey(id)) { - throw new MissingDependencyException("Mod " + modInfo.source + " is missing dependency " + id + ":" + modInfo.dependencies.get(id)); + if (!modInfo.dependencies.isEmpty()) { + log.info("Found dependency list for " + modInfo.id); + for (Dependency dependency : modInfo.dependencies) { + log.info(dependency.id); + log.info(dependency.minVersion); + log.info(dependency.load); + if (!modInfoMap.containsKey(dependency.id)) { + if (dependency.type.equals("hard")) throw new MissingDependencyException("Mod " + modInfo.source + " is missing hard dependency " + dependency.id + ":" + dependency.minVersion); + else log.error("Mod " + modInfo.source + " is missing soft dependency " + dependency.id + ":" + dependency.minVersion + ". This may impact gameplay!"); } - ModInfo dependency = modInfoMap.get(id); - Semver trueVersion = new Semver(dependency.version, Semver.SemverType.LOOSE); + ModInfo depInfo = modInfoMap.get(dependency.id); + Semver trueVersion = new Semver(depInfo.version, Semver.SemverType.LOOSE); try { - Semver lowestVersion = new Semver(modInfo.dependencies.get(id), Semver.SemverType.LOOSE); - + Semver lowestVersion = new Semver(dependency.minVersion, Semver.SemverType.LOOSE); if (trueVersion.isLowerThan(lowestVersion)) { - throw new MissingDependencyException("Mod " + modInfo.source + " has outdated dependency: " + id + " must be at least " + lowestVersion); + if (dependency.type.equals("hard")) throw new MissingDependencyException("Mod " + modInfo.source + " has outdated hard dependency: " + dependency.id + " must be at least " + lowestVersion); + else log.error("Mod " + modInfo.source + " has outdated soft dependency: " + dependency.id + " must be at least " + lowestVersion); + } + + if (dependency.maxVersion != null) { + Semver highestVersion = new Semver(dependency.maxVersion, Semver.SemverType.LOOSE); + if (trueVersion.isGreaterThan(highestVersion)) { + if (dependency.type.equals("hard")) throw new MissingDependencyException("Mod " + modInfo.source + " has outdated hard dependency: " + dependency.id + " must be at most " + highestVersion); + else log.error("Mod " + modInfo.source + " has outdated soft dependency: " + dependency.id + " must be at most " + highestVersion); } } } catch (SemverException t) { - throw new MissingDependencyException("Mod " + modInfo.source + " has malformed dependency in " + id + ": SemVer error " + t.getMessage()); + if (dependency.type.equals("hard")) throw new MissingDependencyException("Mod " + modInfo.source + " has malformed hard dependency in " + dependency.id + ": SemVer error " + t.getMessage()); + else log.error("Mod " + modInfo.source + " has malformed soft dependency in " + dependency.id + ": SemVer error " + t.getMessage()); } - } + } else { + log.info("Found no dependencies for " + modInfo.id); + } + } + + // Load all the mod jars + for (ModInfo modInfo : modInfoMap.values()) { + try { + addURLToClasspath(modInfo.source.toURI().toURL()); + } catch (MalformedURLException e) { + throw new RuntimeException(e); } }