diff --git a/Home/src/main/java/com/ultikits/plugins/home/commands/HomeCommands.java b/Home/src/main/java/com/ultikits/plugins/home/commands/HomeCommands.java index ab48092..7c0c0ae 100644 --- a/Home/src/main/java/com/ultikits/plugins/home/commands/HomeCommands.java +++ b/Home/src/main/java/com/ultikits/plugins/home/commands/HomeCommands.java @@ -8,7 +8,6 @@ import com.ultikits.ultitools.annotations.command.*; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.springframework.beans.factory.annotation.Autowired; import java.util.ArrayList; import java.util.Arrays; @@ -17,9 +16,11 @@ import java.util.List; @CmdTarget(CmdTarget.CmdTargetType.PLAYER) @CmdExecutor(permission = "ultikits.home.command.all", description = "家功能", alias = {"home"}) public class HomeCommands extends AbstractCommendExecutor { - @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") - @Autowired - private HomeService homeService; + private final HomeService homeService; + + public HomeCommands(HomeService homeService) { + this.homeService = homeService; + } @CmdMapping(format = "list") public void openList(@CmdSender Player player) { diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EventListener.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EventListener.java index 9d44ac4..775c451 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EventListener.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EventListener.java @@ -1,11 +1,12 @@ package com.ultikits.ultitools.annotations; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import org.springframework.stereotype.Component; +import java.lang.annotation.*; + +@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) +@Component public @interface EventListener { } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/command/CmdExecutor.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/command/CmdExecutor.java index e36b4e2..ecb0b46 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/command/CmdExecutor.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/command/CmdExecutor.java @@ -1,5 +1,7 @@ package com.ultikits.ultitools.annotations.command; +import org.springframework.stereotype.Component; + import java.lang.annotation.*; /** @@ -11,6 +13,7 @@ import java.lang.annotation.*; @Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) +@Component public @interface CmdExecutor { /** diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/context/ContextConfig.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/context/ContextConfig.java index bf39f87..20f7c3b 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/context/ContextConfig.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/context/ContextConfig.java @@ -2,8 +2,11 @@ package com.ultikits.ultitools.context; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; @Configuration -@ComponentScan("com.ultikits.ultitools") +@ComponentScan(basePackages = "com.ultikits.ultitools", excludeFilters = { + @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com\\.ultikits\\.ultitools\\.commands\\..*") +}) public class ContextConfig { } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/CommandManager.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/CommandManager.java index cf9824a..1ca0c8a 100755 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/CommandManager.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/CommandManager.java @@ -6,6 +6,7 @@ import com.ultikits.ultitools.abstracts.UltiToolsPlugin; import com.ultikits.ultitools.annotations.command.CmdExecutor; import com.ultikits.ultitools.utils.PackageScanUtils; import org.bukkit.Bukkit; +import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandMap; import org.bukkit.command.PluginCommand; @@ -15,30 +16,38 @@ import org.bukkit.plugin.SimplePluginManager; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; -import java.util.Arrays; -import java.util.Objects; -import java.util.Set; +import java.util.*; public class CommandManager { + private final Map> commandListMap = new HashMap<>(); - public void register(CommandExecutor commandExecutor, String permission, String description, String... aliases) { + public void register (UltiToolsPlugin plugin, CommandExecutor commandExecutor, String permission, String description, String... aliases) { PluginCommand command = getCommand(aliases[0], UltiTools.getInstance()); - command.setAliases(Arrays.asList(aliases)); command.setPermission(permission); command.setDescription(description); getCommandMap().register(UltiTools.getInstance().getDescription().getName(), command); command.setExecutor(commandExecutor); + commandListMap.computeIfAbsent(plugin, k -> new ArrayList<>()); + List commands = commandListMap.get(plugin); + if (!commands.contains(command)) { + commands.add(command); + } } public void register(UltiToolsPlugin plugin, CommandExecutor commandExecutor) { - plugin.getContext().getAutowireCapableBeanFactory().autowireBean(commandExecutor); - register(commandExecutor); - } + Class clazz = commandExecutor.getClass(); - public void unregister(String name) { - PluginCommand command = getCommand(name, UltiTools.getInstance()); - command.unregister(getCommandMap()); + if (clazz.isAnnotationPresent(CmdExecutor.class)) { + CmdExecutor cmdExecutor = clazz.getAnnotation(CmdExecutor.class); + register(commandExecutor, cmdExecutor.permission(), cmdExecutor.description(), cmdExecutor.alias()); + } else { + Bukkit.getLogger().warning("CommandExecutor " + clazz.getName() + " is not annotated with @CmdExecutor, please use legacy method to register command."); + } + if (plugin.getContext().getBeanNamesForType(CommandExecutor.class).length == 0) { + plugin.getContext().getAutowireCapableBeanFactory().autowireBean(commandExecutor); + } + register(commandExecutor); } public void registerAll(UltiToolsPlugin plugin, String packageName) { @@ -60,6 +69,38 @@ public class CommandManager { } } + public void registerAll(UltiToolsPlugin plugin) { + for(String cmdBean : plugin.getContext().getBeanNamesForType(CommandExecutor.class)) { + CommandExecutor commandExecutor = plugin.getContext().getBean(cmdBean, CommandExecutor.class); + register(plugin, commandExecutor); + } + } + + public void unregister(String name) { + PluginCommand command = getCommand(name, UltiTools.getInstance()); + command.unregister(getCommandMap()); + } + + public void unregisterAll(UltiToolsPlugin plugin) { + List commands = commandListMap.get(plugin); + if (commands == null) return; + for (Command command : commands) { + unregister(command.getName()); + } + } + + @Deprecated + public void register(CommandExecutor commandExecutor, String permission, String description, String... aliases) { + PluginCommand command = getCommand(aliases[0], UltiTools.getInstance()); + + command.setAliases(Arrays.asList(aliases)); + command.setPermission(permission); + command.setDescription(description); + getCommandMap().register(UltiTools.getInstance().getDescription().getName(), command); + command.setExecutor(commandExecutor); + } + + @Deprecated public void register(CommandExecutor commandExecutor) { Class clazz = commandExecutor.getClass(); diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/ListenerManager.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/ListenerManager.java index 5f2200b..f7d3840 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/ListenerManager.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/ListenerManager.java @@ -42,6 +42,13 @@ public class ListenerManager { } } + public void registerAll(UltiToolsPlugin plugin) { + for (String listenerBean : plugin.getContext().getBeanNamesForType(Listener.class)) { + Listener listener = plugin.getContext().getBean(listenerBean, Listener.class); + register(plugin, listener); + } + } + public void unregister(Listener listener) { HandlerList.unregisterAll(listener); } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/PluginManager.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/PluginManager.java index 842bdb8..88274bf 100755 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/PluginManager.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/PluginManager.java @@ -14,7 +14,11 @@ import org.springframework.core.annotation.AnnotationUtils; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.net.*; +import java.security.CodeSource; +import java.security.ProtectionDomain; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; @@ -81,7 +85,7 @@ public class PluginManager { } boolean result = invokeRegisterSelf(plugin); if (result) { - registerBukkit(plugin); + registerBukkit(plugin, true); } return result; } @@ -95,6 +99,19 @@ public class PluginManager { int minUltiToolsVersion, String mainClass ) { + URLClassLoader urlClassLoader = (URLClassLoader) pluginClass.getClassLoader(); + Method method; + try { + method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + method.setAccessible(true); + try { + method.invoke(urlClassLoader, getServerJar()); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } UltiToolsPlugin plugin; try { plugin = initializePlugin( @@ -109,7 +126,7 @@ public class PluginManager { } boolean result = invokeRegisterSelf(plugin); if (result) { - registerBukkit(plugin); + registerBukkit(plugin, false); } return result; } @@ -139,7 +156,7 @@ public class PluginManager { } boolean result = invokeRegisterSelf(plugin); if (result) { - registerBukkit(plugin); + registerBukkit(plugin, false); } return result; } @@ -175,7 +192,10 @@ public class PluginManager { try { @SuppressWarnings("resource") URLClassLoader classLoader = new URLClassLoader( - new URL[]{new URL(URLDecoder.decode(pluginJar.toURI().toASCIIString(), "UTF-8"))}, + new URL[]{ + new URL(URLDecoder.decode(pluginJar.toURI().toASCIIString(), "UTF-8")), + getServerJar() + }, UltiTools.getInstance().getPluginClassLoader() ); try (JarFile jarFile = new JarFile(pluginJar)) { @@ -237,7 +257,6 @@ public class PluginManager { } try { boolean registerSelf = plugin.registerSelf(); - registerBukkit(plugin); if (registerSelf) { pluginList.add(plugin); Bukkit.getLogger().log( @@ -273,7 +292,7 @@ public class PluginManager { return plugin; } - private void registerBukkit(UltiToolsPlugin plugin) { + private void registerBukkit(UltiToolsPlugin plugin, boolean flag) { EnableAutoRegister annotation = AnnotationUtils.findAnnotation(plugin.getClass(), EnableAutoRegister.class); if (annotation == null) { return; @@ -281,11 +300,28 @@ public class PluginManager { String[] packages = CommonUtils.getPluginPackages(plugin); for (String packageName : packages) { if (annotation.cmdExecutor()) { - UltiTools.getInstance().getCommandManager().registerAll(plugin, packageName); + if (flag) { + UltiTools.getInstance().getCommandManager().registerAll(plugin); + } else { + UltiTools.getInstance().getCommandManager().registerAll(plugin, packageName); + } } if (annotation.eventListener()) { - UltiTools.getInstance().getListenerManager().registerAll(plugin, packageName); + if (flag) { + UltiTools.getInstance().getListenerManager().registerAll(plugin); + } else { + UltiTools.getInstance().getListenerManager().registerAll(plugin, packageName); + } } } } + + private URL getServerJar() { + ProtectionDomain protectionDomain = Bukkit.class.getProtectionDomain(); + CodeSource codeSource = protectionDomain.getCodeSource(); + if (codeSource == null) { + return null; + } + return codeSource.getLocation(); + } }