diff --git a/.github/HOW_USE_DI.md b/.github/HOW_USE_TO_DI.md similarity index 95% rename from .github/HOW_USE_DI.md rename to .github/HOW_USE_TO_DI.md index 8b50f5537..99c46f168 100644 --- a/.github/HOW_USE_DI.md +++ b/.github/HOW_USE_TO_DI.md @@ -109,7 +109,7 @@ public class UserCommand { #### 7. Subscriber ```java @Controller // <- marks a class that will be registered as an event subscriber. -public class UserSubscriber implements Subscriber { +public class UserSubscriber { private final UserService exampleService; @@ -126,12 +126,12 @@ public class UserSubscriber implements Subscriber { } ``` -#### 8. BeanSetup -BeanSetup is a class that allows you to register beans in the bean container. +#### 8. Setup +Setup is an annotation that allows you to register beans in the bean container. It is used to register dependencies that are cannot be registered in the bean container using annotations. e.g. MiniMessage, AdventureProvider, HikariDataSource, etc. ```java -@BeanSetup // <- marks a class that will be registered as a bean holder. +@Setup // <- marks a class that will be registered as a bean holder. public class UserBeanSetup { @Bean // <- marks a method that will be registered as a bean. (dependency) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 307a2a83a..6369f9276 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -1,7 +1,7 @@ object Versions { - const val SPIGOT_API = "1.19.4-R0.1-SNAPSHOT" - const val PAPER_API = "1.19.4-R0.1-SNAPSHOT" + const val SPIGOT_API = "1.21.3-R0.1-SNAPSHOT" + const val PAPER_API = "1.21.3-R0.1-SNAPSHOT" const val ETERNALCODE_COMMONS = "1.1.5" const val MULTIFICATION = "1.2.1" @@ -36,7 +36,6 @@ object Versions { const val TRIUMPH_GUI = "3.1.10" const val BSTATS = "3.1.0" - const val PIXEL_WIDTH = "1.1.0" const val CAFFEINE = "3.1.8" diff --git a/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts b/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts index 7fb2380ea..101a7aaab 100644 --- a/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts +++ b/buildSrc/src/main/kotlin/eternalcode-java.gradle.kts @@ -35,5 +35,5 @@ java { tasks.withType() { options.compilerArgs = listOf("-Xlint:deprecation", "-parameters") options.encoding = "UTF-8" - options.release = 17 + options.release = 21 } diff --git a/eternalcore-api-example/src/main/java/com/eternalcode/example/feature/home/ApiHomeListener.java b/eternalcore-api-example/src/main/java/com/eternalcode/example/feature/home/ApiHomeListener.java index 8122cf66d..880629c5c 100644 --- a/eternalcore-api-example/src/main/java/com/eternalcode/example/feature/home/ApiHomeListener.java +++ b/eternalcore-api-example/src/main/java/com/eternalcode/example/feature/home/ApiHomeListener.java @@ -100,7 +100,7 @@ void onHomeTeleport(HomeTeleportEvent event) { player.sendMessage("Teleporting to home..."); - if (player.hasPotionEffect(PotionEffectType.SLOW)) { + if (player.hasPotionEffect(PotionEffectType.SLOWNESS)) { player.sendMessage("You are slowed down!"); player.teleport(player.getWorld().getSpawnLocation()); } diff --git a/eternalcore-api/src/main/java/com/eternalcode/core/delay/Delay.java b/eternalcore-api/src/main/java/com/eternalcode/core/delay/Delay.java index 9bc19e46b..8d30ad07c 100644 --- a/eternalcore-api/src/main/java/com/eternalcode/core/delay/Delay.java +++ b/eternalcore-api/src/main/java/com/eternalcode/core/delay/Delay.java @@ -13,11 +13,6 @@ public class Delay { private final Supplier delaySettings; - @Deprecated - public Delay(DelaySettings delaySettings) { - this((Supplier) () -> delaySettings.delay()); - } - public Delay(Supplier delayProvider) { this.delaySettings = delayProvider; diff --git a/eternalcore-api/src/main/java/com/eternalcode/core/delay/DelaySettings.java b/eternalcore-api/src/main/java/com/eternalcode/core/delay/DelaySettings.java deleted file mode 100644 index 95c2241f6..000000000 --- a/eternalcore-api/src/main/java/com/eternalcode/core/delay/DelaySettings.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.eternalcode.core.delay; - -import java.time.Duration; - -@Deprecated -public interface DelaySettings { - - Duration delay(); - -} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/EternalCore.java b/eternalcore-core/src/main/java/com/eternalcode/core/EternalCore.java index 7b8c20fd8..c65ad7aeb 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/EternalCore.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/EternalCore.java @@ -1,27 +1,35 @@ package com.eternalcode.core; -import com.eternalcode.core.configuration.ReloadableConfig; +import com.eternalcode.core.compatibility.CompatibilityService; import com.eternalcode.core.injector.DependencyInjector; +import com.eternalcode.core.injector.annotations.component.Component; +import com.eternalcode.core.injector.annotations.component.ConfigurationFile; +import com.eternalcode.core.injector.annotations.component.Controller; +import com.eternalcode.core.injector.annotations.component.Repository; +import com.eternalcode.core.injector.annotations.component.Service; +import com.eternalcode.core.injector.annotations.component.Setup; +import com.eternalcode.core.injector.annotations.component.Task; +import com.eternalcode.core.injector.annotations.lite.LiteArgument; +import com.eternalcode.core.injector.annotations.lite.LiteCommandEditor; +import com.eternalcode.core.injector.annotations.lite.LiteContextual; +import com.eternalcode.core.injector.annotations.lite.LiteHandler; import com.eternalcode.core.injector.bean.BeanCandidate; import com.eternalcode.core.injector.bean.BeanFactory; -import com.eternalcode.core.injector.bean.BeanHolder; -import com.eternalcode.core.injector.bean.LazyFieldBeanCandidate; +import com.eternalcode.core.injector.bean.BeanCandidatePriorityProvider; import com.eternalcode.core.injector.bean.processor.BeanProcessor; import com.eternalcode.core.injector.bean.processor.BeanProcessorFactory; import com.eternalcode.core.injector.scan.DependencyScanner; -import com.eternalcode.core.injector.scan.DependencyScannerFactory; import com.eternalcode.core.publish.Publisher; import com.eternalcode.core.publish.event.EternalInitializeEvent; import com.eternalcode.core.publish.event.EternalShutdownEvent; -import net.dzikoysk.cdn.entity.Contextual; +import dev.rollczi.litecommands.annotations.command.Command; +import dev.rollczi.litecommands.annotations.command.RootCommand; import org.bukkit.Server; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.PluginManager; import java.io.File; -import java.lang.reflect.Field; -import java.util.List; import java.util.logging.Logger; class EternalCore { @@ -32,6 +40,7 @@ class EternalCore { public EternalCore(Plugin plugin) { this.eternalCoreEnvironment = new EternalCoreEnvironment(plugin.getLogger()); + CompatibilityService compatibilityService = new CompatibilityService(); BeanProcessor beanProcessor = BeanProcessorFactory.defaultProcessors(plugin); BeanFactory beanFactory = new BeanFactory(beanProcessor) .withCandidateSelf() @@ -40,19 +49,35 @@ public EternalCore(Plugin plugin) { .addCandidate(Logger.class, () -> plugin.getLogger()) .addCandidate(PluginDescriptionFile.class, () -> plugin.getDescription()) .addCandidate(File.class, () -> plugin.getDataFolder()) - .addCandidate(PluginManager.class, () -> plugin.getServer().getPluginManager()); - - DependencyInjector dependencyInjector = new DependencyInjector(beanFactory); - DependencyScanner scanner = DependencyScannerFactory.createDefault(dependencyInjector); - - beanFactory.addCandidate(DependencyInjector.class, () -> dependencyInjector); + .addCandidate(PluginManager.class, () -> plugin.getServer().getPluginManager()) + .priorityProvider(new BeanCandidatePriorityProvider()); + + DependencyInjector injector = new DependencyInjector(beanFactory); + DependencyScanner scanner = new DependencyScanner(injector) + .includeType(type -> compatibilityService.isCompatible(type)) + .includeAnnotations( + Component.class, + Service.class, + Repository.class, + Task.class, + Controller.class, + ConfigurationFile.class, + Setup.class, + + Command.class, + RootCommand.class, + LiteArgument.class, + LiteHandler.class, + LiteContextual.class, + LiteCommandEditor.class + ); + + beanFactory.addCandidate(DependencyInjector.class, () -> injector); for (BeanCandidate beanCandidate : scanner.scan(EternalCore.class.getPackage())) { beanFactory.addCandidate(beanCandidate); } - this.loadConfigContextual(beanFactory); - beanFactory.initializeCandidates(); this.publisher = beanFactory.getDependency(Publisher.class); @@ -67,22 +92,4 @@ public void disable() { EternalCoreApiProvider.deinitialize(); } - private void loadConfigContextual(BeanFactory beanFactory) { - List> beans = beanFactory - .initializeCandidates(ReloadableConfig.class) - .getBeans(ReloadableConfig.class); - - for (BeanHolder bean : beans) { - ReloadableConfig config = bean.get(); - - for (Field field : config.getClass().getDeclaredFields()) { - if (!field.getType().isAnnotationPresent(Contextual.class)) { - continue; - } - - beanFactory.addCandidate(new LazyFieldBeanCandidate(config, field)); - } - } - } - } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/BridgeManagerInitializer.java b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/BridgeManagerInitializer.java index eae498739..ff40dafae 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/BridgeManagerInitializer.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/BridgeManagerInitializer.java @@ -1,13 +1,13 @@ package com.eternalcode.core.bridge; import com.eternalcode.core.injector.annotations.Bean; -import com.eternalcode.core.injector.annotations.component.BeanSetup; +import com.eternalcode.core.injector.annotations.component.Setup; import com.eternalcode.core.placeholder.PlaceholderRegistry; import java.util.logging.Logger; import org.bukkit.Server; import org.bukkit.plugin.PluginDescriptionFile; -@BeanSetup +@Setup class BridgeManagerInitializer { @Bean diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/adventure/AdventureSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/adventure/AdventureSetup.java index 22257dd69..a8e241e0e 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/adventure/AdventureSetup.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/adventure/AdventureSetup.java @@ -4,13 +4,13 @@ import com.eternalcode.commons.adventure.AdventureLegacyColorPreProcessor; import com.eternalcode.commons.adventure.AdventureUrlPostProcessor; import com.eternalcode.core.injector.annotations.Bean; -import com.eternalcode.core.injector.annotations.component.BeanSetup; +import com.eternalcode.core.injector.annotations.component.Setup; import net.kyori.adventure.platform.AudienceProvider; import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.plugin.Plugin; -@BeanSetup +@Setup class AdventureSetup { @Bean diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/LiteCommandsSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/LiteCommandsSetup.java index acaf81d73..547f01350 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/LiteCommandsSetup.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/LiteCommandsSetup.java @@ -1,11 +1,10 @@ package com.eternalcode.core.bridge.litecommand; import com.eternalcode.core.injector.annotations.Bean; -import com.eternalcode.core.injector.annotations.component.BeanSetup; +import com.eternalcode.core.injector.annotations.component.Setup; import com.eternalcode.core.injector.bean.BeanFactory; import com.eternalcode.core.notice.NoticeService; import com.eternalcode.core.publish.Subscribe; -import com.eternalcode.core.publish.Subscriber; import com.eternalcode.core.publish.event.EternalInitializeEvent; import com.eternalcode.core.publish.event.EternalShutdownEvent; import dev.rollczi.litecommands.LiteCommands; @@ -20,8 +19,8 @@ import org.bukkit.command.CommandSender; import org.bukkit.plugin.Plugin; -@BeanSetup -class LiteCommandsSetup implements Subscriber { +@Setup +class LiteCommandsSetup { @Bean public LiteCommandsBuilder liteCommandsBuilder( diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/configurator/config/CommandConfiguration.java b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/configurator/config/CommandConfiguration.java index 157c54c99..e73cad8ac 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/configurator/config/CommandConfiguration.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/litecommand/configurator/config/CommandConfiguration.java @@ -2,6 +2,7 @@ import com.eternalcode.core.configuration.ReloadableConfig; import com.eternalcode.core.feature.essentials.gamemode.GameModeArgumentSettings; +import com.eternalcode.core.injector.annotations.Bean; import com.eternalcode.core.injector.annotations.component.ConfigurationFile; import net.dzikoysk.cdn.entity.Contextual; import net.dzikoysk.cdn.entity.Description; @@ -19,6 +20,7 @@ @ConfigurationFile public class CommandConfiguration implements ReloadableConfig { + @Bean public Argument argument = new Argument(); @Contextual diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/metrics/BStatsMetricsSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/metrics/BStatsMetricsSetup.java index ae52bf3b5..7ddb64574 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/metrics/BStatsMetricsSetup.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/metrics/BStatsMetricsSetup.java @@ -1,14 +1,13 @@ package com.eternalcode.core.bridge.metrics; import com.eternalcode.core.injector.annotations.component.Controller; -import com.eternalcode.core.publish.Subscriber; import com.eternalcode.core.publish.event.EternalInitializeEvent; import com.eternalcode.core.publish.Subscribe; import org.bstats.bukkit.Metrics; import org.bukkit.plugin.java.JavaPlugin; @Controller -class BStatsMetricsSetup implements Subscriber { +class BStatsMetricsSetup { @Subscribe(EternalInitializeEvent.class) public void onInitialize(JavaPlugin javaPlugin) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/skullapi/SkullAPISetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/skullapi/SkullAPISetup.java index 64463e1e7..b3631b206 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/bridge/skullapi/SkullAPISetup.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/bridge/skullapi/SkullAPISetup.java @@ -1,16 +1,15 @@ package com.eternalcode.core.bridge.skullapi; -import com.eternalcode.core.publish.Subscriber; import com.eternalcode.core.publish.event.EternalShutdownEvent; import com.eternalcode.core.injector.annotations.Bean; -import com.eternalcode.core.injector.annotations.component.BeanSetup; +import com.eternalcode.core.injector.annotations.component.Setup; import com.eternalcode.core.publish.Subscribe; import dev.rollczi.liteskullapi.LiteSkullFactory; import dev.rollczi.liteskullapi.SkullAPI; import org.bukkit.plugin.Plugin; -@BeanSetup -class SkullAPISetup implements Subscriber { +@Setup +class SkullAPISetup { @Bean public SkullAPI skullAPI(Plugin plugin) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/Compatibility.java b/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/Compatibility.java new file mode 100644 index 000000000..95ff556b9 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/Compatibility.java @@ -0,0 +1,16 @@ +package com.eternalcode.core.compatibility; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface Compatibility { + + Version from() default @Version(minor = Integer.MIN_VALUE, patch = Integer.MIN_VALUE); + + Version to() default @Version(minor = Integer.MAX_VALUE, patch = Integer.MAX_VALUE); + +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/CompatibilityService.java b/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/CompatibilityService.java new file mode 100644 index 000000000..9c3c63b26 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/CompatibilityService.java @@ -0,0 +1,31 @@ +package com.eternalcode.core.compatibility; + +import io.papermc.lib.PaperLib; + +public class CompatibilityService { + + public boolean isCompatible(Class type) { + Compatibility compatibility = type.getAnnotation(Compatibility.class); + if (compatibility == null) { + return true; + } + + Version from = compatibility.from(); + Version to = compatibility.to(); + + int minor = PaperLib.getMinecraftVersion(); + int patch = PaperLib.getMinecraftPatchVersion(); + + return isCompatibleFrom(from, minor, patch) && isCompatibleTo(to, minor, patch); + } + + private boolean isCompatibleTo(Version to, int minor, int patch) { + return minor < to.minor() || minor == to.minor() && patch <= to.patch(); + } + + private boolean isCompatibleFrom(Version from, int minor, int patch) { + return minor > from.minor() || minor == from.minor() && patch >= from.patch(); + } + +} + diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/Version.java b/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/Version.java new file mode 100644 index 000000000..6a6d8429d --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/compatibility/Version.java @@ -0,0 +1,15 @@ +package com.eternalcode.core.compatibility; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Version { + + int minor(); + int patch(); + +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/ConfigurationManager.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/ConfigurationManager.java index ae974a502..c6919bbdb 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/ConfigurationManager.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/ConfigurationManager.java @@ -3,12 +3,12 @@ import com.eternalcode.commons.bukkit.position.Position; import com.eternalcode.core.configuration.composer.DurationComposer; import com.eternalcode.core.configuration.composer.LanguageComposer; -import com.eternalcode.core.configuration.composer.MaterialComposer; import com.eternalcode.core.configuration.composer.PositionComposer; import com.eternalcode.core.configuration.composer.SetComposer; import com.eternalcode.core.feature.language.Language; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.component.Service; +import com.eternalcode.core.publish.Publisher; import com.eternalcode.multification.cdn.MultificationNoticeCdnComposer; import com.eternalcode.multification.notice.Notice; import com.eternalcode.multification.notice.resolver.NoticeResolverRegistry; @@ -19,8 +19,9 @@ import java.util.Set; import net.dzikoysk.cdn.Cdn; import net.dzikoysk.cdn.CdnFactory; +import net.dzikoysk.cdn.CdnSettings; import net.dzikoysk.cdn.reflect.Visibility; -import org.bukkit.Material; +import org.bukkit.Sound; @Service public class ConfigurationManager { @@ -36,12 +37,16 @@ public class ConfigurationManager { public ConfigurationManager( ConfigurationBackupService configurationBackupService, NoticeResolverRegistry resolverRegistry, + Publisher publisher, File dataFolder ) { this.configurationBackupService = configurationBackupService; this.dataFolder = dataFolder; + this.cdn = createCdn(publisher, resolverRegistry); + } - this.cdn = CdnFactory + private static Cdn createCdn(Publisher publisher, NoticeResolverRegistry resolverRegistry) { + CdnSettings cdnSettings = CdnFactory .createYamlLike() .getSettings() .withComposer(Duration.class, new DurationComposer()) @@ -49,8 +54,11 @@ public ConfigurationManager( .withComposer(Language.class, new LanguageComposer()) .withComposer(Position.class, new PositionComposer()) .withComposer(Notice.class, new MultificationNoticeCdnComposer(resolverRegistry)) - .withComposer(Material.class, new MaterialComposer()) - .withMemberResolver(Visibility.PACKAGE_PRIVATE) + .withMemberResolver(Visibility.PACKAGE_PRIVATE); + + ConfigurationSettingsSetupEvent event = publisher.publish(new ConfigurationSettingsSetupEvent(cdnSettings)); + + return event.getSettings() .build(); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/ConfigurationSettingsSetupEvent.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/ConfigurationSettingsSetupEvent.java new file mode 100644 index 000000000..714bd0668 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/ConfigurationSettingsSetupEvent.java @@ -0,0 +1,22 @@ +package com.eternalcode.core.configuration; + +import com.eternalcode.core.publish.event.EternalCoreEvent; +import net.dzikoysk.cdn.CdnSettings; + +public class ConfigurationSettingsSetupEvent implements EternalCoreEvent { + + private CdnSettings cdnSettings; + + public ConfigurationSettingsSetupEvent(CdnSettings cdnSettings) { + this.cdnSettings = cdnSettings; + } + + public CdnSettings getSettings() { + return cdnSettings; + } + + public void setSettings(CdnSettings cdnSettings) { + this.cdnSettings = cdnSettings; + } + +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/compatibility/ConfigurationCompatibilityV21_2.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/compatibility/ConfigurationCompatibilityV21_2.java new file mode 100644 index 000000000..3bb32900d --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/compatibility/ConfigurationCompatibilityV21_2.java @@ -0,0 +1,20 @@ +package com.eternalcode.core.configuration.compatibility; + +import com.eternalcode.core.compatibility.Version; +import com.eternalcode.core.configuration.ConfigurationSettingsSetupEvent; +import com.eternalcode.core.configuration.composer.OldEnumComposer; +import com.eternalcode.core.compatibility.Compatibility; +import com.eternalcode.core.injector.annotations.component.Controller; +import com.eternalcode.core.publish.Subscribe; + +@Controller +@Compatibility(from = @Version(minor = 21, patch = 2)) +class ConfigurationCompatibilityV21_2 { + + @Subscribe + void onConfigSettingsSetup(ConfigurationSettingsSetupEvent event) { + event.getSettings() + .withDynamicComposer(OldEnumComposer.IS_OLD_ENUM, new OldEnumComposer()); + } + +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/DurationComposer.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/DurationComposer.java index 326c34638..a6c417e0a 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/DurationComposer.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/DurationComposer.java @@ -1,5 +1,6 @@ package com.eternalcode.core.configuration.composer; +import dev.rollczi.litecommands.time.DurationParser; import panda.std.Result; import java.time.Duration; @@ -10,12 +11,12 @@ public class DurationComposer implements SimpleComposer { @Override public Result deserialize(String source) { - return Result.supplyThrowing(DateTimeParseException.class, () -> Duration.parse("PT" + source.toUpperCase(Locale.ROOT))); + return Result.supplyThrowing(DateTimeParseException.class, () -> DurationParser.TIME_UNITS.parse(source)); } @Override public Result serialize(Duration entity) { - return Result.ok(entity.toString().substring(2).toLowerCase(Locale.ROOT)); + return Result.ok(DurationParser.TIME_UNITS.format(entity)); } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/MaterialComposer.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/MaterialComposer.java deleted file mode 100644 index 48a56ceab..000000000 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/MaterialComposer.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.eternalcode.core.configuration.composer; - -import org.bukkit.Material; -import panda.std.Result; - -public class MaterialComposer implements SimpleComposer { - - @Override - public Result deserialize(String source) { - return Result.supplyThrowing(IllegalArgumentException.class, () -> Material.valueOf(source.toUpperCase())); - } - - @Override - public Result serialize(Material entity) { - return Result.ok(entity.name().toLowerCase()); - } - -} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/OldEnumComposer.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/OldEnumComposer.java new file mode 100644 index 000000000..93142f2a6 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/composer/OldEnumComposer.java @@ -0,0 +1,54 @@ +package com.eternalcode.core.configuration.composer; + +import dev.rollczi.litecommands.reflect.ReflectUtil; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Predicate; +import net.dzikoysk.cdn.CdnSettings; +import net.dzikoysk.cdn.model.Element; +import net.dzikoysk.cdn.model.Entry; +import net.dzikoysk.cdn.model.Piece; +import net.dzikoysk.cdn.reflect.TargetType; +import net.dzikoysk.cdn.serdes.Composer; +import net.dzikoysk.cdn.serdes.SimpleDeserializer; +import org.bukkit.util.OldEnum; +import panda.std.Result; + +public class OldEnumComposer implements Composer>, SimpleDeserializer> { + + public static final Predicate> IS_OLD_ENUM = type -> OldEnum.class.isAssignableFrom(type); + + private static final Map, Method> VALUE_OF_METHODS = new HashMap<>(); + + @Override + public Result, Exception> deserialize(String source) { + throw new UnsupportedOperationException("Enum deserializer requires enum class"); + } + + @Override + public Result, Exception> deserialize(TargetType type, String source) { + try { + Method valueOfMethod = VALUE_OF_METHODS.computeIfAbsent(type.getType(), key -> findValueOfMethod(key)); + OldEnum oldEnum = ReflectUtil.invokeStaticMethod(valueOfMethod, source); + + return Result.ok(oldEnum); + } + catch (IllegalArgumentException argumentException) { + return Result.error(argumentException); + } + } + + private Method findValueOfMethod(Class type) { + Method valueOfMethod = ReflectUtil.getMethod(type, "valueOf", String.class); + valueOfMethod.setAccessible(true); + return valueOfMethod; + } + + @Override + public Result, ? extends Exception> serialize(CdnSettings settings, List description, String key, TargetType type, OldEnum oldEnum) { + return Result.ok(key.isEmpty() ? new Piece(oldEnum.name()) : new Entry(description, key, oldEnum.name())); + } + +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java index 11cf299f2..cce6e1b29 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java @@ -2,7 +2,6 @@ import com.eternalcode.core.configuration.ReloadableConfig; import com.eternalcode.core.database.DatabaseType; -import com.eternalcode.core.delay.DelaySettings; import com.eternalcode.core.feature.afk.AfkSettings; import com.eternalcode.core.feature.automessage.AutoMessageSettings; import com.eternalcode.core.feature.chat.ChatSettings; @@ -10,6 +9,7 @@ import com.eternalcode.core.feature.helpop.HelpOpSettings; import com.eternalcode.core.feature.randomteleport.RandomTeleportSettingsImpl; import com.eternalcode.core.feature.spawn.SpawnSettings; +import com.eternalcode.core.injector.annotations.Bean; import com.eternalcode.core.injector.annotations.component.ConfigurationFile; import com.eternalcode.core.feature.teleportrequest.TeleportRequestSettings; import java.util.LinkedHashMap; @@ -78,6 +78,8 @@ public static class Join { } + + @Bean @Description({ " ", "# Teleport request section" }) public TeleportAsk teleportAsk = new TeleportAsk(); @@ -100,6 +102,7 @@ public Duration teleportTime() { } } + @Bean @Description({ " ", "# Teleport section" }) public Teleport teleport = new Teleport(); @@ -123,9 +126,11 @@ public Duration teleportationTimeToSpawn() { } } + @Bean @Description({ "", "# Random Teleport Section" }) public RandomTeleportSettingsImpl randomTeleport = new RandomTeleportSettingsImpl(); + @Bean @Description({ " ", "# Homes Section" }) public Homes homes = new Homes(); @@ -172,6 +177,7 @@ public static class Sounds { } + @Bean @Description({ " ", "# Chat Section" }) public Chat chat = new Chat(); @@ -240,13 +246,12 @@ public Duration getHelpOpDelay() { public Repair repair = new Repair(); @Contextual - public static class Repair implements DelaySettings { + public static class Repair { @Description({ "# Repair command cooldown" }) public Duration repairDelay = Duration.ofSeconds(5); - @Override - public Duration delay() { + public Duration repairDelay() { return this.repairDelay; } } @@ -259,6 +264,7 @@ public static class Format { public String separator = "&7, "; } + @Bean @Description({ " ", "# AFK Section" }) public Afk afk = new Afk(); @@ -358,6 +364,7 @@ public static class Butcher { public int safeChunkNumber = 5; } + @Bean @Description({ " ", "# AutoMessage Section" }) public AutoMessage autoMessage = new AutoMessage(); @@ -391,6 +398,7 @@ public DrawMode drawMode() { } } + @Bean @Description({ " ", "# Jail Section" }) public Jail jail = new Jail(); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migration/MigrationController.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migration/MigrationController.java index 67dbe8f3e..aac912cfa 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migration/MigrationController.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migration/MigrationController.java @@ -5,12 +5,11 @@ import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.component.Controller; import com.eternalcode.core.publish.Subscribe; -import com.eternalcode.core.publish.Subscriber; import com.eternalcode.core.publish.event.EternalInitializeEvent; import java.util.logging.Logger; @Controller -class MigrationController implements Subscriber { +class MigrationController { private final MigrationService migrationService; private final ConfigurationManager configurationManager; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/database/DatabaseManagerSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/database/DatabaseManagerSetup.java index 3e77f542c..fd45bc32e 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/database/DatabaseManagerSetup.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/database/DatabaseManagerSetup.java @@ -1,18 +1,17 @@ package com.eternalcode.core.database; import com.eternalcode.core.configuration.implementation.PluginConfiguration; -import com.eternalcode.core.publish.Subscriber; import com.eternalcode.core.publish.event.EternalShutdownEvent; import com.eternalcode.core.injector.annotations.Bean; -import com.eternalcode.core.injector.annotations.component.BeanSetup; +import com.eternalcode.core.injector.annotations.component.Setup; import com.eternalcode.core.publish.Subscribe; import java.io.File; import java.sql.SQLException; import java.util.logging.Logger; -@BeanSetup -class DatabaseManagerSetup implements Subscriber { +@Setup +class DatabaseManagerSetup { @Bean DatabaseManager databaseManager(PluginConfiguration pluginConfiguration, Logger logger, File dataFolder) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkCommand.java index fc6d60dad..dad13df6d 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkCommand.java @@ -34,7 +34,7 @@ class AfkCommand { this.noticeService = noticeService; this.pluginConfiguration = pluginConfiguration; this.afkService = afkService; - this.delay = new Delay<>(this.pluginConfiguration.afk); + this.delay = new Delay<>(() -> this.pluginConfiguration.afk.getAfkDelay()); } @Execute @@ -61,6 +61,6 @@ void execute(@Context Player player) { return; } - this.delay.markDelay(uuid, this.pluginConfiguration.afk.delay()); + this.delay.markDelay(uuid, this.pluginConfiguration.afk.getAfkDelay()); } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkSettings.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkSettings.java index f2c2817a8..caecd9250 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkSettings.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AfkSettings.java @@ -1,10 +1,8 @@ package com.eternalcode.core.feature.afk; -import com.eternalcode.core.delay.DelaySettings; - import java.time.Duration; -public interface AfkSettings extends DelaySettings { +public interface AfkSettings { boolean autoAfk(); @@ -14,9 +12,4 @@ public interface AfkSettings extends DelaySettings { Duration getAfkInactivityTime(); - @Override - default Duration delay() { - return this.getAfkDelay(); - } - } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AftPlaceholderSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AftPlaceholderSetup.java index 1398d5647..c01fc695a 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AftPlaceholderSetup.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/afk/AftPlaceholderSetup.java @@ -5,7 +5,6 @@ import com.eternalcode.core.placeholder.PlaceholderRegistry; import com.eternalcode.core.placeholder.PlaceholderReplacer; import com.eternalcode.core.publish.Subscribe; -import com.eternalcode.core.publish.Subscriber; import com.eternalcode.core.publish.event.EternalInitializeEvent; import com.eternalcode.core.translation.Translation; import com.eternalcode.core.translation.TranslationManager; @@ -16,7 +15,7 @@ import java.util.Optional; @Controller -class AftPlaceholderSetup implements Subscriber { +class AftPlaceholderSetup { private final TranslationManager translationManager; private final ViewerService viewerService; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatboyController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatboyController.java index 41aee9785..253922a27 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatboyController.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/catboy/CatboyController.java @@ -12,8 +12,8 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDismountEvent; import org.bukkit.event.player.PlayerQuitEvent; -import org.spigotmc.event.entity.EntityDismountEvent; import java.time.Duration; import java.util.Optional; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/chat/ChatSettings.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/chat/ChatSettings.java index 691c920ca..78c4bac6c 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/chat/ChatSettings.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/chat/ChatSettings.java @@ -1,10 +1,8 @@ package com.eternalcode.core.feature.chat; -import com.eternalcode.core.delay.DelaySettings; - import java.time.Duration; -public interface ChatSettings extends DelaySettings { +public interface ChatSettings { boolean isChatEnabled(); @@ -16,9 +14,4 @@ public interface ChatSettings extends DelaySettings { int linesToClear(); - @Override - default Duration delay() { - return this.getChatDelay(); - } - } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/RepairCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/RepairCommand.java index 8c94da25f..23812c6a5 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/RepairCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/RepairCommand.java @@ -12,6 +12,7 @@ import dev.rollczi.litecommands.annotations.permission.Permission; import java.time.Duration; import java.util.UUID; +import java.util.function.Supplier; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; @@ -30,7 +31,7 @@ class RepairCommand { RepairCommand(NoticeService noticeService, PluginConfiguration config) { this.noticeService = noticeService; this.config = config; - this.delay = new Delay<>(this.config.repair); + this.delay = new Delay<>(() -> this.config.repair.repairDelay()); } @Execute @@ -74,7 +75,7 @@ void repair(@Context Player player) { .player(player.getUniqueId()) .send(); - this.delay.markDelay(uuid, this.config.repair.delay()); + this.delay.markDelay(uuid, this.config.repair.repairDelay()); } @Execute(name = "all") @@ -100,8 +101,6 @@ void repairAll(@Context Player player) { exists = true; this.repairItem(itemStack); - - this.delay.markDelay(uuid, this.config.repair.delay()); } if (!exists) { @@ -120,7 +119,7 @@ void repairAll(@Context Player player) { .player(player.getUniqueId()) .send(); - this.delay.markDelay(uuid, this.config.repair.delay()); + this.delay.markDelay(uuid, this.config.repair.repairDelay()); } @Execute(name = "armor") @@ -164,7 +163,7 @@ void repairArmor(@Context Player player) { .player(player.getUniqueId()) .send(); - this.delay.markDelay(uuid, this.config.repair.delay()); + this.delay.markDelay(uuid, this.config.repair.repairDelay()); } private boolean hasRepairDelay(UUID uuid) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/helpop/HelpOpCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/helpop/HelpOpCommand.java index 3de4382a8..89d895292 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/helpop/HelpOpCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/helpop/HelpOpCommand.java @@ -36,7 +36,7 @@ class HelpOpCommand { this.config = config; this.eventCaller = eventCaller; this.server = server; - this.delay = new Delay<>(this.config.helpOp); + this.delay = new Delay<>(() -> this.config.helpOp.getHelpOpDelay()); } @Execute diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/helpop/HelpOpSettings.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/helpop/HelpOpSettings.java index f6309c17c..dcf8663f7 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/helpop/HelpOpSettings.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/helpop/HelpOpSettings.java @@ -1,15 +1,9 @@ package com.eternalcode.core.feature.helpop; -import com.eternalcode.core.delay.DelaySettings; import java.time.Duration; -public interface HelpOpSettings extends DelaySettings { +public interface HelpOpSettings { Duration getHelpOpDelay(); - @Override - default Duration delay() { - return this.getHelpOpDelay(); - } - } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/HomePlaceholderSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/HomePlaceholderSetup.java index a0b70869d..599f11999 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/HomePlaceholderSetup.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/HomePlaceholderSetup.java @@ -6,7 +6,6 @@ import com.eternalcode.core.placeholder.PlaceholderRegistry; import com.eternalcode.core.placeholder.PlaceholderReplacer; import com.eternalcode.core.publish.Subscribe; -import com.eternalcode.core.publish.Subscriber; import com.eternalcode.core.publish.event.EternalInitializeEvent; import com.eternalcode.core.translation.Translation; import com.eternalcode.core.translation.TranslationManager; @@ -18,7 +17,7 @@ import org.bukkit.entity.Player; @Controller -class HomePlaceholderSetup implements Subscriber { +class HomePlaceholderSetup { private final HomeService homeService; private final UserManager userManager; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportCommand.java index 6a0df9d5e..6a2f0fb67 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportCommand.java @@ -42,7 +42,7 @@ class RandomTeleportCommand { this.randomTeleportService = randomTeleportService; this.randomTeleportTaskService = randomTeleportTaskService; this.config = config; - this.cooldown = new Delay<>((Supplier) () -> this.config.randomTeleport.cooldown()); + this.cooldown = new Delay<>(() -> this.config.randomTeleport.cooldown()); } @Execute diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportSettingsImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportSettingsImpl.java index df4e10eae..381aecf0d 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportSettingsImpl.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportSettingsImpl.java @@ -76,7 +76,7 @@ public class RandomTeleportSettingsImpl implements RandomTeleportSettings, Migra public Set airBlocks = EnumSet.of( Material.AIR, Material.CAVE_AIR, - Material.GRASS, + Material.SHORT_GRASS, Material.TALL_GRASS, Material.VINE, Material.STRUCTURE_VOID, @@ -98,6 +98,7 @@ public class RandomTeleportSettingsImpl implements RandomTeleportSettings, Migra Material.ROSE_BUSH, Material.PEONY, Material.LARGE_FERN, + Material.LEGACY_GRASS, Material.LEGACY_LONG_GRASS, Material.LEGACY_DEAD_BUSH, Material.RAIL, diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/Bean.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/Bean.java index ce33c24d2..b3f1bdf0a 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/Bean.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/Bean.java @@ -6,7 +6,7 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) +@Target({ElementType.METHOD, ElementType.FIELD}) public @interface Bean { String value() default ""; diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Component.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Component.java index d1770b0d8..d4c21152a 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Component.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Component.java @@ -14,7 +14,7 @@ * @see Task * @see Controller * @see ConfigurationFile - * @see BeanSetup + * @see Setup */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/ConfigurationFile.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/ConfigurationFile.java index fb7064157..514182fb7 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/ConfigurationFile.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/ConfigurationFile.java @@ -14,7 +14,7 @@ * @see Repository * @see Task * @see Controller - * @see BeanSetup + * @see Setup */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Controller.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Controller.java index 775503a64..c9e0d0e64 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Controller.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Controller.java @@ -14,7 +14,7 @@ * @see Repository * @see Task * @see ConfigurationFile - * @see BeanSetup + * @see Setup */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Repository.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Repository.java index 8b9796a81..a9c7c581d 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Repository.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Repository.java @@ -14,7 +14,7 @@ * @see Task * @see Controller * @see ConfigurationFile - * @see BeanSetup + * @see Setup */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Service.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Service.java index e3c8727f2..6a455d3d8 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Service.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Service.java @@ -14,7 +14,7 @@ * @see Task * @see Controller * @see ConfigurationFile - * @see BeanSetup + * @see Setup */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/BeanSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Setup.java similarity index 94% rename from eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/BeanSetup.java rename to eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Setup.java index c6179403b..1311e5194 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/BeanSetup.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Setup.java @@ -17,6 +17,6 @@ */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) -public @interface BeanSetup { +public @interface Setup { } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Task.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Task.java index 087aabcbe..c595d5cb5 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Task.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/annotations/component/Task.java @@ -15,7 +15,7 @@ * @see Repository * @see Controller * @see ConfigurationFile - * @see BeanSetup + * @see Setup */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidate.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidate.java index 8984d5995..284d0db33 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidate.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidate.java @@ -1,13 +1,22 @@ package com.eternalcode.core.injector.bean; +import dev.rollczi.litecommands.priority.Prioritized; +import dev.rollczi.litecommands.priority.PriorityLevel; import java.util.function.Supplier; -public interface BeanCandidate { +public interface BeanCandidate extends Prioritized { boolean isCandidate(Class clazz); + Class getType(); + BeanHolder createBean(Class clazz); + @Override + default PriorityLevel getPriority() { + return PriorityLevel.NORMAL; + } + static BeanCandidate of(String name, Class type, Supplier instance) { return new SimpleBeanCandidate(name, type, instance); } @@ -16,4 +25,8 @@ static BeanCandidate of(Class type, Supplier instance) { return new SimpleBeanCandidate(BeanHolder.DEFAULT_NAME, type, instance); } + static BeanCandidate prioritized(BeanCandidate candidate, PriorityLevel priorityLevel) { + return new PrioritizedBeanCandidate(candidate, priorityLevel); + } + } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidateContainer.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidateContainer.java index 4e11d8d94..0ab8557b0 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidateContainer.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidateContainer.java @@ -1,17 +1,28 @@ package com.eternalcode.core.injector.bean; +import dev.rollczi.litecommands.priority.MutablePrioritizedList; +import dev.rollczi.litecommands.priority.Prioritized; +import dev.rollczi.litecommands.priority.PrioritizedList; +import dev.rollczi.litecommands.priority.PriorityLevel; import java.util.HashSet; import java.util.Iterator; import java.util.Set; +import java.util.function.Function; import javax.annotation.Nullable; class BeanCandidateContainer { private final Object lock = new Object(); - private final Set candidates = new HashSet<>(); + private final MutablePrioritizedList candidates = new MutablePrioritizedList<>(); + private Function priorityProvider = beanCandidate -> PriorityLevel.NORMAL; void addCandidate(BeanCandidate candidate) { + PriorityLevel priorityLevel = this.priorityProvider.apply(candidate); + if (!priorityLevel.equals(candidate.getPriority())) { + candidate = BeanCandidate.prioritized(candidate, priorityLevel); + } + synchronized (this.lock) { this.candidates.add(candidate); } @@ -23,6 +34,10 @@ void removeCandidate(BeanCandidate candidate) { } } + void setPriorityProvider(Function priorityProvider) { + this.priorityProvider = priorityProvider; + } + @Nullable BeanCandidate nextCandidate(Class type) { synchronized (this.lock) { @@ -42,14 +57,12 @@ BeanCandidate nextCandidate(Class type) { @Nullable BeanCandidate nextCandidate() { synchronized (this.lock) { - Iterator iterator = this.candidates.iterator(); - - if (!iterator.hasNext()) { + if (this.candidates.isEmpty()) { return null; } - BeanCandidate candidate = iterator.next(); - iterator.remove(); + BeanCandidate candidate = this.candidates.first(); + this.candidates.remove(candidate); return candidate; } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidatePriorityProvider.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidatePriorityProvider.java new file mode 100644 index 000000000..b7c9a9a32 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanCandidatePriorityProvider.java @@ -0,0 +1,16 @@ +package com.eternalcode.core.injector.bean; + +import com.eternalcode.core.publish.SubscriberUtil; +import dev.rollczi.litecommands.priority.PriorityLevel; +import java.util.function.Function; + +public class BeanCandidatePriorityProvider implements Function { + @Override + public PriorityLevel apply(BeanCandidate candidate) { + if (SubscriberUtil.isSubscriber(candidate.getType())) { + return PriorityLevel.HIGH; + } + + return PriorityLevel.NORMAL; + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanFactory.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanFactory.java index fbfaf0365..c3921387f 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanFactory.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/BeanFactory.java @@ -3,9 +3,11 @@ import com.eternalcode.core.injector.DependencyProvider; import com.eternalcode.core.injector.bean.processor.BeanProcessor; +import dev.rollczi.litecommands.priority.PriorityLevel; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -26,6 +28,11 @@ public T getDependency(Class clazz) { return this.getSingletonBean(clazz).get(); } + public BeanFactory priorityProvider(Function priorityProvider) { + this.candidateContainer.setPriorityProvider(priorityProvider); + return this; + } + private BeanHolder getSingletonBean(Class type) { List> stacktrace = dependencyStacktrace.get(); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/LazyBeanCandidate.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/LazyBeanCandidate.java index a5de3eb85..6ed6f1af0 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/LazyBeanCandidate.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/LazyBeanCandidate.java @@ -4,10 +4,12 @@ public class LazyBeanCandidate implements BeanCandidate { + private final String name; private final Supplier instanceSupplier; private Object instance; - public LazyBeanCandidate(Supplier instanceSupplier) { + public LazyBeanCandidate(String name, Supplier instanceSupplier) { + this.name = name; this.instanceSupplier = instanceSupplier; } @@ -18,13 +20,18 @@ public boolean isCandidate(Class clazz) { return clazz.isAssignableFrom(type); } + @Override + public Class getType() { + return this.getInstance().getClass(); + } + @Override public BeanHolder createBean(Class clazz) { if (!this.isCandidate(clazz)) { throw new IllegalArgumentException("Class " + clazz.getName() + " is not a candidate for " + this.getInstance().getClass().getName()); } - return BeanHolder.of(clazz.cast(this.getInstance())); + return BeanHolder.of(name, clazz.cast(this.getInstance())); } private Object getInstance() { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/LazyFieldBeanCandidate.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/LazyFieldBeanCandidate.java index 2db597b2e..dded5caef 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/LazyFieldBeanCandidate.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/LazyFieldBeanCandidate.java @@ -1,25 +1,39 @@ package com.eternalcode.core.injector.bean; +import com.eternalcode.core.injector.DependencyInjector; +import com.eternalcode.core.injector.annotations.Bean; import java.lang.reflect.Field; +import java.util.function.Supplier; public class LazyFieldBeanCandidate extends LazyBeanCandidate { - private final Object instance; + private final Supplier instance; private final Field field; + private final Class instanceType; - public LazyFieldBeanCandidate(Object instance, Field field) { - super(() -> { + public LazyFieldBeanCandidate(Supplier instance, Field field, Bean bean) { + super(bean.value(), () -> { try { field.setAccessible(true); - return field.get(instance); + return field.get(instance.get()); } catch (IllegalAccessException exception) { - throw new BeanException("Cannot access field " + field.getName() + " of " + instance.getClass().getName(), exception, field.getType()); + throw new BeanException("Cannot access field " + field.getName() + " of " + field.getType().getName(), exception, field.getType()); } }); this.field = field; this.instance = instance; + this.instanceType = field.getType(); + } + + public LazyFieldBeanCandidate(DependencyInjector dependencyInjector, Class componentClass, Field field, Bean bean) { + this(() -> dependencyInjector.newInstance(componentClass), field, bean); + } + + @Override + public Class getType() { + return this.instanceType; } @Override diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/PrioritizedBeanCandidate.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/PrioritizedBeanCandidate.java new file mode 100644 index 000000000..f35a5b435 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/PrioritizedBeanCandidate.java @@ -0,0 +1,34 @@ +package com.eternalcode.core.injector.bean; + +import dev.rollczi.litecommands.priority.PriorityLevel; + +class PrioritizedBeanCandidate implements BeanCandidate { + + private final BeanCandidate candidate; + private final PriorityLevel priorityLevel; + + PrioritizedBeanCandidate(BeanCandidate candidate, PriorityLevel priorityLevel) { + this.candidate = candidate; + this.priorityLevel = priorityLevel; + } + + @Override + public boolean isCandidate(Class clazz) { + return this.candidate.isCandidate(clazz); + } + + @Override + public Class getType() { + return this.candidate.getType(); + } + + @Override + public BeanHolder createBean(Class clazz) { + return this.candidate.createBean(clazz); + } + + @Override + public PriorityLevel getPriority() { + return this.priorityLevel; + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/SimpleBeanCandidate.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/SimpleBeanCandidate.java index c99afe88d..c6def21f1 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/SimpleBeanCandidate.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/SimpleBeanCandidate.java @@ -19,6 +19,11 @@ public boolean isCandidate(Class clazz) { return clazz.isAssignableFrom(this.type); } + @Override + public Class getType() { + return this.type; + } + @Override public BeanHolder createBean(Class clazz) { if (!this.isCandidate(clazz)) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/processor/BeanProcessorFactory.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/processor/BeanProcessorFactory.java index bc85f46c2..f09f4b525 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/processor/BeanProcessorFactory.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/bean/processor/BeanProcessorFactory.java @@ -9,13 +9,11 @@ import com.eternalcode.core.injector.annotations.lite.LiteContextual; import com.eternalcode.core.injector.annotations.lite.LiteHandler; import com.eternalcode.core.publish.Publisher; -import com.eternalcode.core.publish.Subscribe; -import com.eternalcode.core.publish.Subscriber; +import com.eternalcode.core.publish.SubscriberUtil; import dev.rollczi.litecommands.LiteCommandsBuilder; import dev.rollczi.litecommands.annotations.LiteCommandsAnnotations; import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.command.RootCommand; -import java.lang.reflect.Method; import dev.rollczi.litecommands.argument.ArgumentKey; import dev.rollczi.litecommands.argument.resolver.MultipleArgumentResolver; @@ -58,20 +56,12 @@ public static BeanProcessor defaultProcessors(Plugin plugin) { .onProcess(Listener.class, (provider, listener, none) -> { pluginManager.registerEvents(listener, plugin); }) - .onProcess(Subscriber.class, (provider, potentialSubscriber, none) -> { - Publisher publisher = provider.getDependency(Publisher.class); - publisher.subscribe(potentialSubscriber); - }) - .onProcess(Object.class, (dependencyProvider, instance, none) -> { - if (instance instanceof Subscriber) { + .onProcess(Object.class, (provider, potentialSubscriber, none) -> { + if (!SubscriberUtil.isSubscriber(potentialSubscriber.getClass())) { return; } - - for (Method method : instance.getClass().getDeclaredMethods()) { - if (method.isAnnotationPresent(Subscribe.class)) { - throw new IllegalStateException("Missing 'implements Subscriber' in declaration of class " + instance.getClass()); - } - } + Publisher publisher = provider.getDependency(Publisher.class); + publisher.subscribe(potentialSubscriber); }) .onProcess(ReloadableConfig.class, (provider, config, configurationFile) -> { ConfigurationManager configurationManager = provider.getDependency(ConfigurationManager.class); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/ComponentBeanCandidateImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/ComponentBeanCandidateImpl.java index 67cd0228c..7dc4aab59 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/ComponentBeanCandidateImpl.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/ComponentBeanCandidateImpl.java @@ -26,6 +26,11 @@ public boolean isCandidate(Class clazz) { return clazz.isAssignableFrom(this.componentClass); } + @Override + public Class getType() { + return this.componentClass; + } + @Override public BeanHolder createBean(Class clazz) { Class typed = this.toTypedCandidate(clazz); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/ComponentNameProvider.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/ComponentNameProvider.java index 3e17dec1d..0f2703562 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/ComponentNameProvider.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/ComponentNameProvider.java @@ -3,7 +3,7 @@ import java.lang.annotation.Annotation; @FunctionalInterface -interface ComponentNameProvider { +public interface ComponentNameProvider { String getName(COMPONENT component); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/DependencyScanner.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/DependencyScanner.java index 002e5c89d..420e65acd 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/DependencyScanner.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/DependencyScanner.java @@ -4,40 +4,50 @@ import com.eternalcode.core.injector.annotations.Bean; import com.eternalcode.core.injector.bean.BeanCandidate; import com.eternalcode.core.injector.bean.BeanHolder; +import com.eternalcode.core.injector.bean.LazyFieldBeanCandidate; import com.eternalcode.core.util.ReflectUtil; import java.lang.annotation.Annotation; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Predicate; +import org.jetbrains.annotations.Nullable; public class DependencyScanner { private final DependencyInjector dependencyInjector; private final Map, ComponentNameProvider> annotations = new HashMap<>(); + private final List>> includedTypes = new ArrayList<>(); public DependencyScanner(DependencyInjector dependencyInjector) { this.dependencyInjector = dependencyInjector; } @SafeVarargs - final DependencyScanner onAnnotations(Class... annotationTypes) { + public final DependencyScanner includeAnnotations(Class... annotationTypes) { for (Class annotationType : annotationTypes) { - this.onAnnotation(annotationType); + this.includeAnnotation(annotationType); } return this; } - private DependencyScanner onAnnotation(Class annotationType) { + public DependencyScanner includeType(Predicate> predicate) { + this.includedTypes.add(predicate); + return this; + } + + private DependencyScanner includeAnnotation(Class annotationType) { this.annotations.put(annotationType, annotation -> BeanHolder.DEFAULT_NAME); return this; } - DependencyScanner onAnnotation(Class annotationType, ComponentNameProvider componentNameProvider) { + public DependencyScanner includeAnnotation(Class annotationType, ComponentNameProvider componentNameProvider) { this.annotations.put(annotationType, componentNameProvider); return this; } @@ -56,6 +66,11 @@ public List scan(String... packageNames) { List beanCandidates = new ArrayList<>(); for (Class clazz : classes) { + boolean isIncluded = this.includedTypes.stream().allMatch(filter -> filter.test(clazz)); + if (!isIncluded) { + continue; + } + beanCandidates.addAll(this.createBeanCandidates(clazz)); } @@ -69,8 +84,8 @@ private List createBeanCandidates(Class clazz) { if (beanCandidate != null) { beanCandidates.add(beanCandidate); - List methodBeanCandidates = this.getMethodBeanCandidates(clazz); - beanCandidates.addAll(methodBeanCandidates); + List otherCandidates = this.getFieldAndMethodCandidates(clazz); + beanCandidates.addAll(otherCandidates); } return beanCandidates; @@ -98,7 +113,7 @@ private BeanCandidate createBeanCandidate(Class clazz, return new ComponentBeanCandidateImpl<>(this.dependencyInjector, clazz, annotation, componentNameProvider); } - private List getMethodBeanCandidates(Class componentClass) { + private List getFieldAndMethodCandidates(Class componentClass) { List beanCandidates = new ArrayList<>(); for (Method method : componentClass.getDeclaredMethods()) { @@ -112,10 +127,22 @@ private List getMethodBeanCandidates(Class componentClass) { beanCandidates.add(beanCandidate); } + for (Field field : ReflectUtil.getAllSuperFields(componentClass)) { + if (!field.isAnnotationPresent(Bean.class)) { + continue; + } + + Bean bean = field.getAnnotation(Bean.class); + BeanCandidate beanCandidate = new LazyFieldBeanCandidate(this.dependencyInjector, componentClass, field, bean); + + beanCandidates.add(beanCandidate); + } + return beanCandidates; } @SuppressWarnings("unchecked") + @Nullable private ComponentNameProvider getComponentNameProvider(A annotation) { return (ComponentNameProvider) this.annotations.get(annotation.annotationType()); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/DependencyScannerFactory.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/DependencyScannerFactory.java deleted file mode 100644 index 9efca0dd0..000000000 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/DependencyScannerFactory.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.eternalcode.core.injector.scan; - -import com.eternalcode.core.injector.DependencyInjector; -import com.eternalcode.core.injector.annotations.component.BeanSetup; -import com.eternalcode.core.injector.annotations.component.Component; -import com.eternalcode.core.injector.annotations.component.ConfigurationFile; -import com.eternalcode.core.injector.annotations.component.Controller; -import com.eternalcode.core.injector.annotations.component.Repository; -import com.eternalcode.core.injector.annotations.component.Service; -import com.eternalcode.core.injector.annotations.component.Task; -import com.eternalcode.core.injector.annotations.lite.LiteArgument; -import com.eternalcode.core.injector.annotations.lite.LiteCommandEditor; -import com.eternalcode.core.injector.annotations.lite.LiteContextual; -import com.eternalcode.core.injector.annotations.lite.LiteHandler; -import dev.rollczi.litecommands.annotations.command.Command; -import dev.rollczi.litecommands.annotations.command.RootCommand; - -public final class DependencyScannerFactory { - - private DependencyScannerFactory() { - } - - public static DependencyScanner createDefault(DependencyInjector injector) { - return new DependencyScanner(injector) - .onAnnotations( - Component.class, - Service.class, - Repository.class, - Task.class, - Controller.class, - ConfigurationFile.class, - BeanSetup.class, - - Command.class, - RootCommand.class, - LiteArgument.class, - LiteHandler.class, - LiteContextual.class, - LiteCommandEditor.class - ); - } - - -} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/MethodBeanCandidate.java b/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/MethodBeanCandidate.java index 125ca060f..d4896ef23 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/MethodBeanCandidate.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/injector/scan/MethodBeanCandidate.java @@ -28,6 +28,11 @@ public boolean isCandidate(Class clazz) { return clazz.isAssignableFrom(returnType); } + @Override + public Class getType() { + return this.method.getReturnType(); + } + @Override public BeanHolder createBean(Class clazz) { if (!this.isCandidate(clazz)) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/notice/EternalCoreNoticeBukkitResolver.java b/eternalcore-core/src/main/java/com/eternalcode/core/notice/EternalCoreNoticeBukkitResolver.java index 08ed5ad89..8f1eeeff9 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/notice/EternalCoreNoticeBukkitResolver.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/notice/EternalCoreNoticeBukkitResolver.java @@ -1,21 +1,12 @@ package com.eternalcode.core.notice; import com.eternalcode.core.injector.annotations.Bean; -import com.eternalcode.core.injector.annotations.component.BeanSetup; +import com.eternalcode.core.injector.annotations.component.Setup; import com.eternalcode.multification.bukkit.notice.resolver.sound.SoundBukkitResolver; import com.eternalcode.multification.notice.resolver.NoticeResolverDefaults; import com.eternalcode.multification.notice.resolver.NoticeResolverRegistry; -import com.eternalcode.multification.notice.resolver.actionbar.ActionbarResolver; -import com.eternalcode.multification.notice.resolver.chat.ChatResolver; -import com.eternalcode.multification.notice.resolver.sound.SoundAdventureResolver; -import com.eternalcode.multification.notice.resolver.title.SubtitleResolver; -import com.eternalcode.multification.notice.resolver.title.SubtitleWithEmptyTitleResolver; -import com.eternalcode.multification.notice.resolver.title.TimesResolver; -import com.eternalcode.multification.notice.resolver.title.TitleHideResolver; -import com.eternalcode.multification.notice.resolver.title.TitleResolver; -import com.eternalcode.multification.notice.resolver.title.TitleWithEmptySubtitleResolver; -@BeanSetup +@Setup public class EternalCoreNoticeBukkitResolver { @Bean diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/placeholder/PlaceholdersSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/placeholder/PlaceholdersSetup.java index 2159e816c..0ae46f863 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/placeholder/PlaceholdersSetup.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/placeholder/PlaceholdersSetup.java @@ -2,13 +2,12 @@ import com.eternalcode.core.configuration.implementation.PlaceholdersConfiguration; import com.eternalcode.core.injector.annotations.component.Controller; -import com.eternalcode.core.publish.Subscriber; import com.eternalcode.core.publish.event.EternalInitializeEvent; import com.eternalcode.core.publish.Subscribe; import org.bukkit.Server; @Controller -class PlaceholdersSetup implements Subscriber { +class PlaceholdersSetup { @Subscribe(EternalInitializeEvent.class) void setUp(PlaceholderRegistry placeholderRegistry, PlaceholdersConfiguration placeholdersConfiguration) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/publish/LocalPublisher.java b/eternalcore-core/src/main/java/com/eternalcode/core/publish/LocalPublisher.java index ec7e1cfe9..f951987d5 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/publish/LocalPublisher.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/publish/LocalPublisher.java @@ -60,11 +60,11 @@ private Class getTypeOfEvent(Method method, Subscribe subscribe) { } @Override - public void publish(PublishEvent publishEvent) { + public E publish(E publishEvent) { Set nativeSubscribers = this.subscribersByType.get(publishEvent.getClass()); if (nativeSubscribers == null) { - return; + return publishEvent; } for (NativeSubscriber nativeSubscriber : nativeSubscribers) { @@ -73,6 +73,8 @@ public void publish(PublishEvent publishEvent) { this.dependencyInjector.invokeMethod(instance, method, publishEvent); } + + return publishEvent; } private record NativeSubscriber(Object subscriber, Method method) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/publish/Publisher.java b/eternalcore-core/src/main/java/com/eternalcode/core/publish/Publisher.java index 5b6550a21..ae229d859 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/publish/Publisher.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/publish/Publisher.java @@ -4,6 +4,6 @@ public interface Publisher { void subscribe(Object subscriber); - void publish(PublishEvent publishEvent); + E publish(E publishEvent); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/publish/Subscriber.java b/eternalcore-core/src/main/java/com/eternalcode/core/publish/Subscriber.java deleted file mode 100644 index 3638eeb9d..000000000 --- a/eternalcore-core/src/main/java/com/eternalcode/core/publish/Subscriber.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.eternalcode.core.publish; - -public interface Subscriber { -} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/publish/SubscriberUtil.java b/eternalcore-core/src/main/java/com/eternalcode/core/publish/SubscriberUtil.java new file mode 100644 index 000000000..669ca252f --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/publish/SubscriberUtil.java @@ -0,0 +1,24 @@ +package com.eternalcode.core.publish; + +import java.lang.reflect.Method; + +public final class SubscriberUtil { + + private SubscriberUtil() { + } + + public static boolean isSubscriber(Class subscriberCanditate) { + for (Method method : subscriberCanditate.getDeclaredMethods()) { + Subscribe subscribe = method.getAnnotation(Subscribe.class); + + if (subscribe == null) { + continue; + } + + return true; + } + + return false; + } + +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/scheduler/SchedulerSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/scheduler/SchedulerSetup.java index e5a76e1f0..2089c5f68 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/scheduler/SchedulerSetup.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/scheduler/SchedulerSetup.java @@ -3,12 +3,11 @@ import com.eternalcode.commons.bukkit.scheduler.BukkitSchedulerImpl; import com.eternalcode.commons.scheduler.Scheduler; import com.eternalcode.core.injector.annotations.Bean; -import com.eternalcode.core.injector.annotations.component.BeanSetup; -import com.eternalcode.core.publish.Subscriber; +import com.eternalcode.core.injector.annotations.component.Setup; import org.bukkit.plugin.Plugin; -@BeanSetup -public class SchedulerSetup implements Subscriber { +@Setup +public class SchedulerSetup { @Bean public Scheduler scheduler(Plugin plugin) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/translation/TranslationManagerSetup.java b/eternalcore-core/src/main/java/com/eternalcode/core/translation/TranslationManagerSetup.java index dea508bce..aa1e51182 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/translation/TranslationManagerSetup.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/translation/TranslationManagerSetup.java @@ -2,13 +2,13 @@ import com.eternalcode.core.configuration.ConfigurationManager; import com.eternalcode.core.injector.annotations.Bean; -import com.eternalcode.core.injector.annotations.component.BeanSetup; +import com.eternalcode.core.injector.annotations.component.Setup; import com.eternalcode.core.feature.language.config.LanguageConfiguration; import com.eternalcode.core.translation.implementation.TranslationFactory; import java.util.List; import panda.std.stream.PandaStream; -@BeanSetup +@Setup class TranslationManagerSetup { @Bean diff --git a/eternalcore-plugin/build.gradle.kts b/eternalcore-plugin/build.gradle.kts index d0368b708..9ac557482 100644 --- a/eternalcore-plugin/build.gradle.kts +++ b/eternalcore-plugin/build.gradle.kts @@ -38,6 +38,6 @@ dependencies { tasks { runServer { - minecraftVersion("1.21.1") + minecraftVersion("1.21.4") } }