From e48b75b6fc6d57c9d16e63dd29e88b9bcdfa692c Mon Sep 17 00:00:00 2001 From: Dueris <122416109+Dueris@users.noreply.github.com> Date: Thu, 6 Jun 2024 17:24:14 +0000 Subject: [PATCH] Classloader edge cases, better calio util holders --- .../main/java/me/dueris/calio/CraftCalio.java | 15 +++++--- .../dueris/calio/data/FactoryDataDefiner.java | 34 ++++++++++++------- .../dueris/calio/util/holders/QuadPair.java | 14 +------- ...{TriBoolean.java => StateableBoolean.java} | 4 +-- .../me/dueris/calio/util/holders/TriPair.java | 20 ++++++----- .../genesismc/util/AsyncUpgradeTracker.java | 10 +++--- 6 files changed, 52 insertions(+), 45 deletions(-) rename calio/src/main/java/me/dueris/calio/util/holders/{TriBoolean.java => StateableBoolean.java} (89%) diff --git a/calio/src/main/java/me/dueris/calio/CraftCalio.java b/calio/src/main/java/me/dueris/calio/CraftCalio.java index 5f7150e58..9edc09042 100644 --- a/calio/src/main/java/me/dueris/calio/CraftCalio.java +++ b/calio/src/main/java/me/dueris/calio/CraftCalio.java @@ -144,6 +144,8 @@ public void register(Class holder) { RequiresPlugin aN = holder.getAnnotation(RequiresPlugin.class); if (!org.bukkit.Bukkit.getPluginManager().isPluginEnabled(aN.pluginName())) return; } + ClassLoader classLoader = CraftCalio.class.getClassLoader(); + classLoader.loadClass(holder.getName()); // Preload class Method rC = holder.getDeclaredMethod("registerComponents", FactoryData.class); if (rC == null) throw new IllegalArgumentException("FactoryHolder doesn't have registerComponents method in it or its superclasses!"); @@ -152,22 +154,27 @@ public void register(Class holder) { if (identifier == null) throw new IllegalArgumentException("Type identifier was not provided! FactoryHolder will not be loaded : " + holder.getSimpleName()); this.types.put(identifier, new Pair<>(data, holder)); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ea) { + } catch (ClassNotFoundException ea) { + throw new RuntimeException("Unable to resolve class during registration!", ea); + } catch (Throwable ea) { if (ea instanceof NoSuchMethodException) return; + if (ea instanceof IllegalArgumentException) { + getLogger().severe("Type provider was not provided! FactoryHolder will not be loaded. : " + holder.getSimpleName()); + } ea.printStackTrace(); throw new RuntimeException("An exception occured when registering FactoryHolder", ea); } } public void registerAccessor(String directory, int priority, boolean useTypeDefiner, Class typeOf, RegistryKey registryKey, String defaultType) { - keys.add(new AccessorKey(directory, priority, useTypeDefiner, registryKey, typeOf, defaultType)); + keys.add(new AccessorKey(directory, priority, useTypeDefiner, registryKey, typeOf, defaultType)); } public void registerAccessor(String directory, int priority, boolean useTypeDefiner, Class typeOf, RegistryKey registryKey) { - keys.add(new AccessorKey(directory, priority, useTypeDefiner, registryKey, typeOf, null)); + keys.add(new AccessorKey(directory, priority, useTypeDefiner, registryKey, typeOf, null)); } public void registerAccessor(String directory, int priority, boolean useTypeDefiner, RegistryKey registryKey) { - keys.add(new AccessorKey(directory, priority, useTypeDefiner, registryKey, null, null)); + keys.add(new AccessorKey(directory, priority, useTypeDefiner, registryKey, null, null)); } } diff --git a/calio/src/main/java/me/dueris/calio/data/FactoryDataDefiner.java b/calio/src/main/java/me/dueris/calio/data/FactoryDataDefiner.java index 701bac40d..30cf4417c 100644 --- a/calio/src/main/java/me/dueris/calio/data/FactoryDataDefiner.java +++ b/calio/src/main/java/me/dueris/calio/data/FactoryDataDefiner.java @@ -2,30 +2,40 @@ import me.dueris.calio.data.types.OptionalInstance; import me.dueris.calio.data.types.RequiredInstance; -import me.dueris.calio.util.holders.TriPair; -public class FactoryDataDefiner extends TriPair { - public FactoryDataDefiner(String objName, Class type, T defaultVal) { - super(objName, type, defaultVal); +/** + * Implementation of a TriPair object + */ +public class FactoryDataDefiner { + private String key; + private Class type; + private Object defaultVal; + + public FactoryDataDefiner(String objName, Class type, T defaultVal) { + this.key = objName; + this.type = type; + this.defaultVal = defaultVal; } - public FactoryDataDefiner(String objName, Class type, RequiredInstance defaultVal) { - super(objName, type, defaultVal); + public FactoryDataDefiner(String objName, Class type, RequiredInstance defaultVal) { + this(objName, type, (T) null); + this.defaultVal = defaultVal; } - public FactoryDataDefiner(String objName, Class type, OptionalInstance defaultVal) { - super(objName, type, defaultVal); + public FactoryDataDefiner(String objName, Class type, OptionalInstance defaultVal) { + this(objName, type, (T) null); + this.defaultVal = defaultVal; } - public Class getType() { - return (Class) this.second; + public Class getType() { + return (Class) this.type; } public String getObjName() { - return (String) this.first; + return this.key; } public Object getDefaultValue() { - return this.third; + return this.defaultVal; } } diff --git a/calio/src/main/java/me/dueris/calio/util/holders/QuadPair.java b/calio/src/main/java/me/dueris/calio/util/holders/QuadPair.java index 1b15f89fc..34e1e9e70 100644 --- a/calio/src/main/java/me/dueris/calio/util/holders/QuadPair.java +++ b/calio/src/main/java/me/dueris/calio/util/holders/QuadPair.java @@ -1,15 +1,3 @@ package me.dueris.calio.util.holders; -public class QuadPair { - public Object first; - public Object second; - public Object third; - public Object fourth; - - public QuadPair(Object first, Object second, Object third, Object fourth) { - this.first = first; - this.second = second; - this.third = third; - this.fourth = fourth; - } -} +public record QuadPair(A a, B b, C c, D d) { } diff --git a/calio/src/main/java/me/dueris/calio/util/holders/TriBoolean.java b/calio/src/main/java/me/dueris/calio/util/holders/StateableBoolean.java similarity index 89% rename from calio/src/main/java/me/dueris/calio/util/holders/TriBoolean.java rename to calio/src/main/java/me/dueris/calio/util/holders/StateableBoolean.java index c07036348..b9c1bba8a 100644 --- a/calio/src/main/java/me/dueris/calio/util/holders/TriBoolean.java +++ b/calio/src/main/java/me/dueris/calio/util/holders/StateableBoolean.java @@ -2,10 +2,10 @@ import java.util.Optional; -public class TriBoolean { +public class StateableBoolean { private Boolean bool; - public TriBoolean(State state) { + public StateableBoolean(State state) { switch (state) { case TRUE -> { bool = Boolean.TRUE; diff --git a/calio/src/main/java/me/dueris/calio/util/holders/TriPair.java b/calio/src/main/java/me/dueris/calio/util/holders/TriPair.java index 4b5bddf97..6ab629245 100644 --- a/calio/src/main/java/me/dueris/calio/util/holders/TriPair.java +++ b/calio/src/main/java/me/dueris/calio/util/holders/TriPair.java @@ -1,14 +1,16 @@ package me.dueris.calio.util.holders; -public class TriPair { - public T first; - public S second; - public B third; - - public TriPair(T first, S second, B third) { - this.first = first; - this.second = second; - this.third = third; +public record TriPair(A a, B b, C c) { + + public A first() { + return a(); + } + + public B second() { + return b(); } + public C third() { + return c(); + } } diff --git a/origins/src/main/java/me/dueris/genesismc/util/AsyncUpgradeTracker.java b/origins/src/main/java/me/dueris/genesismc/util/AsyncUpgradeTracker.java index 7e257518a..af00f37ac 100644 --- a/origins/src/main/java/me/dueris/genesismc/util/AsyncUpgradeTracker.java +++ b/origins/src/main/java/me/dueris/genesismc/util/AsyncUpgradeTracker.java @@ -24,7 +24,7 @@ import java.util.concurrent.ConcurrentHashMap; public class AsyncUpgradeTracker implements Listener { - public static ConcurrentHashMap upgrades = new ConcurrentHashMap<>(); + public static ConcurrentHashMap/*String advancement, NamespacedKey identifier, String announcement*/> upgrades = new ConcurrentHashMap<>(); public static String NO_ANNOUNCEMENT = "no_announcement_found"; @EventHandler @@ -33,13 +33,13 @@ public void startEvent(ServerLoadEvent e) { @Override public void run() { MinecraftServer server = GenesisMC.server; - for (Map.Entry entry : upgrades.entrySet()) { + for (Map.Entry> entry : upgrades.entrySet()) { for (CraftPlayer player : ((CraftServer) Bukkit.getServer()).getOnlinePlayers()) { for (Layer layer : CraftApoli.getLayersFromRegistry()) { if (PowerHolderComponent.getOrigin(player, layer).equals(entry.getKey())) { - String advancement = (String) entry.getValue().first; - NamespacedKey originToSet = (NamespacedKey) entry.getValue().second; - String announcement = (String) entry.getValue().third; + String advancement = entry.getValue().a(); + NamespacedKey originToSet = entry.getValue().b(); + String announcement = entry.getValue().c(); AdvancementHolder advancementHolder = server.getAdvancements().get(CraftNamespacedKey.toMinecraft(NamespacedKey.fromString(advancement))); if (advancementHolder == null) {