From 71b053bee6be69bb6d61f5342d3da5afb2edb863 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 17 Nov 2021 08:35:00 -0700 Subject: [PATCH] implement addon loading --- common/addons/manifest-addon-loader | 2 +- .../com/dfsek/terra/api/addon/BaseAddon.java | 1 + .../com/dfsek/terra/AbstractPlatform.java | 59 +++++++++++-------- 3 files changed, 36 insertions(+), 26 deletions(-) diff --git a/common/addons/manifest-addon-loader b/common/addons/manifest-addon-loader index c7385fc3b..3df70cd54 160000 --- a/common/addons/manifest-addon-loader +++ b/common/addons/manifest-addon-loader @@ -1 +1 @@ -Subproject commit c7385fc3bdb2de4e2783e95d67401c7149142db6 +Subproject commit 3df70cd54fb151c06dcc97d5e92cc12396d35f88 diff --git a/common/api/addons/src/main/java/com/dfsek/terra/api/addon/BaseAddon.java b/common/api/addons/src/main/java/com/dfsek/terra/api/addon/BaseAddon.java index 5ba13d4cf..6e5ff82d1 100644 --- a/common/api/addons/src/main/java/com/dfsek/terra/api/addon/BaseAddon.java +++ b/common/api/addons/src/main/java/com/dfsek/terra/api/addon/BaseAddon.java @@ -4,4 +4,5 @@ import com.dfsek.terra.api.util.StringIdentifiable; public interface BaseAddon extends StringIdentifiable { + default void initialize() {} } diff --git a/common/implementation/src/main/java/com/dfsek/terra/AbstractPlatform.java b/common/implementation/src/main/java/com/dfsek/terra/AbstractPlatform.java index 32007dd67..853f1200b 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/AbstractPlatform.java +++ b/common/implementation/src/main/java/com/dfsek/terra/AbstractPlatform.java @@ -1,17 +1,6 @@ package com.dfsek.terra; import com.dfsek.tectonic.loading.TypeRegistry; - -import com.dfsek.terra.addon.BootstrapAddonLoader; -import com.dfsek.terra.api.Platform; - -import com.dfsek.terra.api.addon.BaseAddon; - -import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; -import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.registry.LockedRegistryImpl; -import com.dfsek.terra.registry.OpenRegistryImpl; - import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.yaml.snakeyaml.Yaml; @@ -23,21 +12,27 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.UncheckedIOException; import java.nio.charset.StandardCharsets; +import java.nio.file.Path; import java.util.List; import java.util.Map; import java.util.Optional; -import com.dfsek.terra.api.util.Logger; -import com.dfsek.terra.api.addon.TerraAddon; +import com.dfsek.terra.addon.BootstrapAddonLoader; +import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.command.CommandManager; import com.dfsek.terra.api.command.exception.MalformedCommandException; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.PluginConfig; import com.dfsek.terra.api.event.EventManager; +import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; +import com.dfsek.terra.api.event.functional.FunctionalEventHandler; +import com.dfsek.terra.api.inject.Injector; import com.dfsek.terra.api.lang.Language; import com.dfsek.terra.api.profiler.Profiler; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.Registry; +import com.dfsek.terra.api.util.Logger; import com.dfsek.terra.api.util.generic.Lazy; import com.dfsek.terra.api.util.mutable.MutableBoolean; import com.dfsek.terra.commands.CommandUtil; @@ -46,8 +41,11 @@ import com.dfsek.terra.config.GenericLoaders; import com.dfsek.terra.config.PluginConfigImpl; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.event.EventManagerImpl; +import com.dfsek.terra.inject.InjectorImpl; import com.dfsek.terra.profiler.ProfilerImpl; import com.dfsek.terra.registry.CheckedRegistryImpl; +import com.dfsek.terra.registry.LockedRegistryImpl; +import com.dfsek.terra.registry.OpenRegistryImpl; import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.util.logging.DebugLogger; @@ -191,24 +189,35 @@ public abstract class AbstractPlatform implements Platform { } InternalAddon internalAddon = new InternalAddon(); - + addonRegistry.register(internalAddon.getID(), internalAddon); BootstrapAddonLoader bootstrapAddonLoader = new BootstrapAddonLoader(); + Path addonsFolder = getDataFolder().toPath().resolve("addons"); + + Injector platformInjector = new InjectorImpl<>(this); + platformInjector.addExplicitTarget(Platform.class); + + bootstrapAddonLoader.loadAddons(addonsFolder, getClass().getClassLoader()) + .forEach(bootstrap -> bootstrap.loadAddons(addonsFolder, getClass().getClassLoader()) + .forEach(addon -> { + platformInjector.inject(addon); + addon.initialize(); + addonRegistry.register(addon.getID(), addon); + })); eventManager - .getHandler(FunctionalEventHandler.class) - .register(internalAddon, PlatformInitializationEvent.class) - .then(event -> { - logger().info("Loading config packs..."); - getRawConfigRegistry().loadAll(this); - logger().info("Loaded packs."); - }) - .global(); - - - + .getHandler(FunctionalEventHandler.class) + .register(internalAddon, PlatformInitializationEvent.class) + .then(event -> { + logger().info("Loading config packs..."); + getRawConfigRegistry().loadAll(this); + logger().info("Loaded packs."); + }) + .global(); + + logger().info("Loaded addons."); try {