mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-02-16 10:30:42 +00:00
remove AddonRegistry
This commit is contained in:
@@ -1,114 +0,0 @@
|
||||
package com.dfsek.terra.registry.master;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.logging.LogManager;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.dfsek.terra.addon.AddonClassLoader;
|
||||
import com.dfsek.terra.addon.AddonPool;
|
||||
import com.dfsek.terra.addon.PreLoadAddon;
|
||||
import com.dfsek.terra.addon.exception.AddonLoadException;
|
||||
import com.dfsek.terra.api.Platform;
|
||||
import com.dfsek.terra.api.addon.TerraAddon;
|
||||
import com.dfsek.terra.api.inject.exception.InjectionException;
|
||||
import com.dfsek.terra.api.inject.impl.InjectorImpl;
|
||||
import com.dfsek.terra.api.registry.exception.DuplicateEntryException;
|
||||
import com.dfsek.terra.registry.OpenRegistryImpl;
|
||||
|
||||
|
||||
public class AddonRegistry extends OpenRegistryImpl<TerraAddon> {
|
||||
private final Platform platform;
|
||||
|
||||
public AddonRegistry(Platform platform) {
|
||||
this.platform = platform;
|
||||
}
|
||||
|
||||
public AddonRegistry(TerraAddon addon, Platform platform) {
|
||||
this.platform = platform;
|
||||
register(addon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean register(String identifier, TerraAddon addon) {
|
||||
if(contains(identifier)) throw new IllegalArgumentException("Addon " + identifier + " is already registered.");
|
||||
addon.initialize();
|
||||
platform.logger().info("Loaded addon " + addon.getName() + " v" + addon.getVersion() + ", by " + addon.getAuthor());
|
||||
return super.register(identifier, addon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public boolean register(TerraAddon addon) {
|
||||
return register(addon.getName(), addon);
|
||||
}
|
||||
|
||||
public boolean loadAll(ClassLoader parent) {
|
||||
InjectorImpl<Platform> pluginInjector = new InjectorImpl<>(platform);
|
||||
pluginInjector.addExplicitTarget(Platform.class);
|
||||
|
||||
boolean valid = true;
|
||||
File addonsFolder = new File(platform.getDataFolder(), "addons");
|
||||
addonsFolder.mkdirs();
|
||||
|
||||
AddonPool pool = new AddonPool();
|
||||
|
||||
try {
|
||||
for(File jar : addonsFolder.listFiles(file -> file.getName().endsWith(".jar"))) {
|
||||
platform.logger().info("Loading Addon(s) from: " + jar.getName());
|
||||
for(Class<? extends TerraAddon> addonClass : AddonClassLoader.fetchAddonClasses(jar, parent)) {
|
||||
pool.add(new PreLoadAddon(addonClass, jar));
|
||||
}
|
||||
}
|
||||
|
||||
pool.buildAll();
|
||||
|
||||
for(PreLoadAddon addon : pool.getAddons()) {
|
||||
Class<? extends TerraAddon> addonClass = addon.getAddonClass();
|
||||
Constructor<? extends TerraAddon> constructor;
|
||||
|
||||
String logPrefix = "Terra:" + addon.getId();
|
||||
Logger addonLogger = Logger.getLogger(logPrefix);
|
||||
|
||||
if(!LogManager.getLogManager().addLogger(addonLogger)) {
|
||||
addonLogger = LogManager.getLogManager().getLogger(logPrefix);
|
||||
}
|
||||
|
||||
InjectorImpl<Logger> loggerInjector = new InjectorImpl<>(addonLogger);
|
||||
loggerInjector.addExplicitTarget(Logger.class);
|
||||
|
||||
try {
|
||||
constructor = addonClass.getConstructor();
|
||||
} catch(NoSuchMethodException e) {
|
||||
throw new AddonLoadException("Addon class has no valid constructor: " + addonClass.getCanonicalName(), e);
|
||||
}
|
||||
TerraAddon loadedAddon;
|
||||
try {
|
||||
loadedAddon = constructor.newInstance();
|
||||
pluginInjector.inject(loadedAddon);
|
||||
loggerInjector.inject(loadedAddon);
|
||||
} catch(InstantiationException | IllegalAccessException | InvocationTargetException | InjectionException e) {
|
||||
throw new AddonLoadException("Failed to load com.dfsek.terra.addon \" + " + addon.getId() + "\": ", e);
|
||||
}
|
||||
try {
|
||||
registerChecked(loadedAddon.getName(), loadedAddon);
|
||||
} catch(DuplicateEntryException e) {
|
||||
valid = false;
|
||||
platform.logger().severe("Duplicate addon ID; addon with ID " + loadedAddon.getName() + " is already loaded.");
|
||||
platform.logger().severe("Existing addon class: " + get(loadedAddon.getName()).getClass().getCanonicalName());
|
||||
platform.logger().severe("Duplicate addon class: " + addonClass.getCanonicalName());
|
||||
}
|
||||
}
|
||||
} catch(AddonLoadException | IOException e) {
|
||||
e.printStackTrace();
|
||||
valid = false;
|
||||
}
|
||||
|
||||
return valid;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user