Skip to content

Commit

Permalink
Classloader edge cases, better calio util holders
Browse files Browse the repository at this point in the history
  • Loading branch information
Dueris committed Jun 6, 2024
1 parent fa78116 commit e48b75b
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 45 deletions.
15 changes: 11 additions & 4 deletions calio/src/main/java/me/dueris/calio/CraftCalio.java
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ public void register(Class<? extends FactoryHolder> 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!");
Expand All @@ -152,22 +154,27 @@ public void register(Class<? extends FactoryHolder> 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 <T extends Registrable> void registerAccessor(String directory, int priority, boolean useTypeDefiner, Class<? extends FactoryHolder> typeOf, RegistryKey<T> registryKey, String defaultType) {
keys.add(new AccessorKey(directory, priority, useTypeDefiner, registryKey, typeOf, defaultType));
keys.add(new AccessorKey<T>(directory, priority, useTypeDefiner, registryKey, typeOf, defaultType));
}

public <T extends Registrable> void registerAccessor(String directory, int priority, boolean useTypeDefiner, Class<? extends FactoryHolder> typeOf, RegistryKey<T> registryKey) {
keys.add(new AccessorKey(directory, priority, useTypeDefiner, registryKey, typeOf, null));
keys.add(new AccessorKey<T>(directory, priority, useTypeDefiner, registryKey, typeOf, null));
}

public <T extends Registrable> void registerAccessor(String directory, int priority, boolean useTypeDefiner, RegistryKey<T> registryKey) {
keys.add(new AccessorKey(directory, priority, useTypeDefiner, registryKey, null, null));
keys.add(new AccessorKey<T>(directory, priority, useTypeDefiner, registryKey, null, null));
}
}
34 changes: 22 additions & 12 deletions calio/src/main/java/me/dueris/calio/data/FactoryDataDefiner.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 <T> FactoryDataDefiner(String objName, Class<T> type, T defaultVal) {
super(objName, type, defaultVal);
/**
* Implementation of a TriPair object
*/
public class FactoryDataDefiner<T> {
private String key;
private Class<T> type;
private Object defaultVal;

public FactoryDataDefiner(String objName, Class<T> type, T defaultVal) {
this.key = objName;
this.type = type;
this.defaultVal = defaultVal;
}

public <T> FactoryDataDefiner(String objName, Class<T> type, RequiredInstance defaultVal) {
super(objName, type, defaultVal);
public FactoryDataDefiner(String objName, Class<T> type, RequiredInstance defaultVal) {
this(objName, type, (T) null);
this.defaultVal = defaultVal;
}

public <T> FactoryDataDefiner(String objName, Class<T> type, OptionalInstance defaultVal) {
super(objName, type, defaultVal);
public FactoryDataDefiner(String objName, Class<T> type, OptionalInstance defaultVal) {
this(objName, type, (T) null);
this.defaultVal = defaultVal;
}

public Class<?> getType() {
return (Class<?>) this.second;
public Class<T> getType() {
return (Class<T>) this.type;
}

public String getObjName() {
return (String) this.first;
return this.key;
}

public Object getDefaultValue() {
return this.third;
return this.defaultVal;
}
}
14 changes: 1 addition & 13 deletions calio/src/main/java/me/dueris/calio/util/holders/QuadPair.java
Original file line number Diff line number Diff line change
@@ -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, B, C, D>(A a, B b, C c, D d) { }
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
20 changes: 11 additions & 9 deletions calio/src/main/java/me/dueris/calio/util/holders/TriPair.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
package me.dueris.calio.util.holders;

public class TriPair<T, S, B> {
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, B, C>(A a, B b, C c) {

public A first() {
return a();
}

public B second() {
return b();
}

public C third() {
return c();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
import java.util.concurrent.ConcurrentHashMap;

public class AsyncUpgradeTracker implements Listener {
public static ConcurrentHashMap<Origin, TriPair/*String advancement, NamespacedKey identifier, String announcement*/> upgrades = new ConcurrentHashMap<>();
public static ConcurrentHashMap<Origin, TriPair<String, NamespacedKey, String>/*String advancement, NamespacedKey identifier, String announcement*/> upgrades = new ConcurrentHashMap<>();
public static String NO_ANNOUNCEMENT = "no_announcement_found";

@EventHandler
Expand All @@ -33,13 +33,13 @@ public void startEvent(ServerLoadEvent e) {
@Override
public void run() {
MinecraftServer server = GenesisMC.server;
for (Map.Entry<Origin, TriPair> entry : upgrades.entrySet()) {
for (Map.Entry<Origin, TriPair<String, NamespacedKey, String>> 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) {
Expand Down

0 comments on commit e48b75b

Please sign in to comment.