diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 01a8d92..b51eb70 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -36,11 +36,19 @@ jobs: packages: write steps: - uses: actions/checkout@v2 + - uses: actions-ecosystem/action-get-latest-tag@v1 + id: latest-tag + - uses: jungwinter/split@v2 + id: version + with: + msg: ${{ steps.latest-tag.outputs.tag }} + separator: '.' - uses: actions/setup-java@v2 with: java-version: '18' distribution: 'adopt' - name: Publish package run: mvn --batch-mode deploy + if: ${{ steps.version.outputs.length == 3 }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 0c06eaf..6ff1331 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -1,5 +1,8 @@ name: Verify Process +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + on: pull_request: branches: [ master ] diff --git a/ELDependenci-plugin/pom.xml b/ELDependenci-plugin/pom.xml index 672e6e0..e6e5bb1 100644 --- a/ELDependenci-plugin/pom.xml +++ b/ELDependenci-plugin/pom.xml @@ -5,7 +5,7 @@ eldependenci org.eldependenci - 0.1.7 + 0.1.8-SNAPSHOT 4.0.0 diff --git a/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/ELDTypeListener.java b/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/ELDTypeListener.java index ca0068c..c38f40b 100644 --- a/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/ELDTypeListener.java +++ b/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/ELDTypeListener.java @@ -6,26 +6,32 @@ import com.ericlam.mc.eld.configurations.GroupConfig; import com.ericlam.mc.eld.configurations.GroupLang; import com.ericlam.mc.eld.services.ConfigPoolService; +import com.google.common.collect.Lists; import com.google.inject.MembersInjector; import com.google.inject.TypeLiteral; import com.google.inject.spi.TypeEncounter; import com.google.inject.spi.TypeListener; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; +import java.util.List; @SuppressWarnings("unchecked") public final class ELDTypeListener implements TypeListener { private final ConfigPoolService configPoolService; + private final ReflectionService reflectionService; - public ELDTypeListener(ConfigPoolService configPoolService) { + public ELDTypeListener(ConfigPoolService configPoolService, ReflectionService reflectionService) { this.configPoolService = configPoolService; + this.reflectionService = reflectionService; } @Override public void hear(TypeLiteral typeLiteral, TypeEncounter typeEncounter) { - for (Field field : typeLiteral.getRawType().getDeclaredFields()) { + for (Field field : reflectionService.getDeclaredFieldsUpTo(typeLiteral.getRawType(), null)) { if (!field.isAnnotationPresent(InjectPool.class)) continue; if (!(field.getGenericType() instanceof ParameterizedType)) continue; if (field.getType() == GroupConfig.class) { diff --git a/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/ELDependenci.java b/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/ELDependenci.java index a21e95f..bd7eae0 100644 --- a/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/ELDependenci.java +++ b/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/ELDependenci.java @@ -15,6 +15,7 @@ import com.ericlam.mc.eld.module.ELDLoggingModule; import com.ericlam.mc.eld.services.ArgParserService; import com.ericlam.mc.eld.services.ELDConfigPoolService; +import com.ericlam.mc.eld.services.ELDReflectionService; import com.ericlam.mc.eld.services.logging.ELDLoggingService; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.inject.Guice; @@ -70,7 +71,7 @@ public void onLoad() { groupConfigService = new ELDConfigPoolService(eldConfig); this.module.setDefaultSingleton(eldConfig.defaultSingleton); this.sharePluginInstance = eldConfig.sharePluginInstance; - this.module.addModule(new ELDConfigModule(groupConfigService)); + this.module.addModule(new ELDConfigModule(groupConfigService, new ELDReflectionService())); this.module.addModule(new ELDLoggingModule(new ELDLoggingService(eldConfig))); } diff --git a/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/commands/ELDCommandHandler.java b/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/commands/ELDCommandHandler.java index 910d28d..30099e7 100644 --- a/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/commands/ELDCommandHandler.java +++ b/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/commands/ELDCommandHandler.java @@ -8,6 +8,7 @@ import com.ericlam.mc.eld.bukkit.ELDMessageConfig; import com.ericlam.mc.eld.components.CommandNode; import com.ericlam.mc.eld.exceptions.ArgumentParseException; +import com.ericlam.mc.eld.services.ELDReflectionService; import com.google.inject.Injector; import org.bukkit.command.*; import org.bukkit.entity.Player; @@ -29,7 +30,7 @@ public final class ELDCommandHandler implements CommandExecutor, TabCompleter { private static Field[] getDeclaredFieldsForNodes(Class node){ if (nodePlaceholders.containsKey(node)) return nodePlaceholders.get(node); - var fields = node.getDeclaredFields(); + var fields = ELDReflectionService.getDeclaredFieldsUpToStatic(node, null).toArray(Field[]::new); nodePlaceholders.put(node, fields); return fields; } diff --git a/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/configurations/ELDConfigManager.java b/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/configurations/ELDConfigManager.java index cb7e2ee..f9d94a6 100644 --- a/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/configurations/ELDConfigManager.java +++ b/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/configurations/ELDConfigManager.java @@ -148,7 +148,7 @@ class FileControllerImpl implements FileController { private final Field[] fields; public FileControllerImpl() { - this.fields = config.getDeclaredFields(); + this.fields = config.getFields(); } @Override diff --git a/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/module/ELDConfigModule.java b/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/module/ELDConfigModule.java index 4abe719..5275230 100644 --- a/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/module/ELDConfigModule.java +++ b/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/module/ELDConfigModule.java @@ -1,9 +1,11 @@ package com.ericlam.mc.eld.module; import com.ericlam.mc.eld.ELDTypeListener; +import com.ericlam.mc.eld.ReflectionService; import com.ericlam.mc.eld.configurations.ELDConfigManager; import com.ericlam.mc.eld.services.ConfigPoolService; import com.ericlam.mc.eld.services.ELDConfigPoolService; +import com.ericlam.mc.eld.services.ELDReflectionService; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.inject.AbstractModule; import com.google.inject.matcher.Matchers; @@ -12,9 +14,11 @@ public final class ELDConfigModule extends AbstractModule { private final ELDConfigPoolService groupConfigService; + private final ELDReflectionService reflectionService; - public ELDConfigModule(ELDConfigPoolService groupConfigService) { + public ELDConfigModule(ELDConfigPoolService groupConfigService, ELDReflectionService reflectionService) { this.groupConfigService = groupConfigService; + this.reflectionService = reflectionService; } @Override @@ -22,6 +26,7 @@ protected void configure() { bind(ObjectMapper.class).annotatedWith(Names.named("eld-yaml")).toInstance(ELDConfigManager.YAML_MAPPER); bind(ObjectMapper.class).annotatedWith(Names.named("eld-json")).toInstance(ELDConfigManager.JSON_MAPPER); bind(ConfigPoolService.class).toInstance(groupConfigService); - bindListener(Matchers.any(), new ELDTypeListener(groupConfigService)); + bind(ReflectionService.class).toInstance(reflectionService); + bindListener(Matchers.any(), new ELDTypeListener(groupConfigService, reflectionService)); } } diff --git a/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/services/ELDReflectionService.java b/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/services/ELDReflectionService.java new file mode 100644 index 0000000..9c4ca00 --- /dev/null +++ b/ELDependenci-plugin/src/main/java/com/ericlam/mc/eld/services/ELDReflectionService.java @@ -0,0 +1,50 @@ +package com.ericlam.mc.eld.services; + +import com.ericlam.mc.eld.ReflectionService; +import com.google.common.collect.Lists; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.List; + +public class ELDReflectionService implements ReflectionService { + + @Override + public List getDeclaredFieldsUpTo(@NotNull Class startClass, @Nullable Class exclusiveParent) { + return getDeclaredFieldsUpToStatic(startClass, exclusiveParent); + } + + @Override + public List getDeclaredMethodsUpTo(@NotNull Class startClass, @Nullable Class exclusiveParent) { + return getDeclaredMethodsUpToStatic(startClass, exclusiveParent); + } + + public static List getDeclaredFieldsUpToStatic(@NotNull Class startClass, @Nullable Class exclusiveParent) { + List currentClassFields = Lists.newArrayList(startClass.getDeclaredFields()); + Class parentClass = startClass.getSuperclass(); + + if (parentClass != null && !(parentClass.equals(exclusiveParent))) { + List parentClassFields = + (List) getDeclaredFieldsUpToStatic(parentClass, exclusiveParent); + currentClassFields.addAll(parentClassFields); + } + + return currentClassFields; + } + + public List getDeclaredMethodsUpToStatic(@NotNull Class startClass, @Nullable Class exclusiveParent) { + List currentClassMethods = Lists.newArrayList(startClass.getDeclaredMethods()); + Class parentClass = startClass.getSuperclass(); + + if (parentClass != null && !(parentClass.equals(exclusiveParent))) { + List parentClassFields = + (List) getDeclaredMethodsUpToStatic(parentClass, exclusiveParent); + currentClassMethods.addAll(parentClassFields); + } + + return currentClassMethods; + } + +} diff --git a/eldependenci-addon/pom.xml b/eldependenci-addon/pom.xml index fbfa929..2d85725 100644 --- a/eldependenci-addon/pom.xml +++ b/eldependenci-addon/pom.xml @@ -5,7 +5,7 @@ eldependenci org.eldependenci - 0.1.7 + 0.1.8-SNAPSHOT 4.0.0 diff --git a/eldependenci-addon/src/main/java/com/ericlam/mc/eld/ReflectionService.java b/eldependenci-addon/src/main/java/com/ericlam/mc/eld/ReflectionService.java new file mode 100644 index 0000000..040cb05 --- /dev/null +++ b/eldependenci-addon/src/main/java/com/ericlam/mc/eld/ReflectionService.java @@ -0,0 +1,32 @@ +package com.ericlam.mc.eld; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.List; + +/** + * 反射工具服務 + */ +public interface ReflectionService { + + /** + * 取得整個 class 上下關係的 declared fields + * + * @param startClass 開始類別 + * @param exclusiveParent 到此父類別停止 + * @return 整個 class 上下關係的 declared fields + */ + List getDeclaredFieldsUpTo(@Nonnull Class startClass, @Nullable Class exclusiveParent); + + /** + * 取得整個 class 上下關係的 declared methods + * + * @param startClass 開始類別 + * @param exclusiveParent 到此父類別停止 + * @return 整個 class 上下關係的 declared methods + */ + List getDeclaredMethodsUpTo(@Nonnull Class startClass, @Nullable Class exclusiveParent); + +} diff --git a/eldependenci-framework/pom.xml b/eldependenci-framework/pom.xml index 1bf1df0..912cf2f 100644 --- a/eldependenci-framework/pom.xml +++ b/eldependenci-framework/pom.xml @@ -5,7 +5,7 @@ eldependenci org.eldependenci - 0.1.7 + 0.1.8-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 83b7608..273bcaf 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ org.eldependenci eldependenci pom - 0.1.7 + 0.1.8-SNAPSHOT eldependenci-framework eldependenci-addon @@ -243,8 +243,13 @@ github Github ELDependenci Apache Maven Packages https://maven.pkg.github.com/ELDependenci/eldependenci - false + + github + Github ELDependenci Apache Maven Packages + https://maven.pkg.github.com/ELDependenci/eldependenci + true + \ No newline at end of file