diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddon.java b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddon.java index 89c93f709..cc5c6e782 100644 --- a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddon.java +++ b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddon.java @@ -1,14 +1,26 @@ package com.dfsek.terra.addons.manifest.impl; +import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.impl.config.AddonManifest; +import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; +import com.dfsek.terra.api.inject.Injector; +import com.dfsek.terra.api.inject.annotations.Inject; + +import java.util.List; public class ManifestAddon implements BaseAddon { private final AddonManifest manifest; - public ManifestAddon(AddonManifest manifest) { + private final List initializers; + + @Inject + private Platform platform; + + public ManifestAddon(AddonManifest manifest, List initializers) { this.manifest = manifest; + this.initializers = initializers; } @Override @@ -17,6 +29,18 @@ public class ManifestAddon implements BaseAddon { } public void initialize() { - + Injector addonInjector = Injector.get(this); + addonInjector.addExplicitTarget(BaseAddon.class); + + Injector platformInjector = Injector.get(platform); + platformInjector.addExplicitTarget(Platform.class); + + platform.logger().info("Initializing addon " + getID()); + + initializers.forEach(initializer -> { + addonInjector.inject(initializer); + platformInjector.inject(initializer); + initializer.initialize(); + }); } } diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonLoader.java b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonLoader.java index bc69abfbb..9f606e401 100644 --- a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonLoader.java +++ b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonLoader.java @@ -45,7 +45,7 @@ public class ManifestAddonLoader implements BootstrapBaseAddon { try { return Files.walk(addonsFolder, 1) .filter(path -> path.toFile().isFile() && path.toString().endsWith(".jar")) - .flatMap(path -> { + .map(path -> { try { platform.getDebugLogger().info("Loading addon from JAR " + path); JarFile jar = new JarFile(path.toFile()); @@ -66,14 +66,14 @@ public class ManifestAddonLoader implements BootstrapBaseAddon { ManifestAddonClassLoader loader = new ManifestAddonClassLoader(new URL[]{ path.toUri().toURL() }, getClass().getClassLoader()); - - return manifest.getEntryPoints().stream().map(entryPoint -> { + + return new ManifestAddon(manifest, manifest.getEntryPoints().stream().map(entryPoint -> { try { Object in = loader.loadClass(entryPoint).getConstructor().newInstance(); if(!(in instanceof AddonInitializer)) { throw new AddonException(in.getClass() + " does not extend " + AddonInitializer.class); } - return new ManifestAddon(manifest); + return (AddonInitializer) in; } catch(InvocationTargetException e) { throw new AddonException("Exception occurred while instantiating addon: ", e); } catch(NoSuchMethodException | IllegalAccessException | InstantiationException e) { @@ -81,7 +81,7 @@ public class ManifestAddonLoader implements BootstrapBaseAddon { } catch(ClassNotFoundException e) { throw new AddonException("Entry point " + entryPoint + " not found in JAR."); } - }); + }).collect(Collectors.toList())); } catch(LoadException e) { throw new ManifestException("Failed to load addon manifest", e);