From 846668594c62889f6750dc7e138e49ecc41b14fa Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 7 Oct 2012 21:24:03 +1100 Subject: Use annotations to register commands --- .../src/net/ess3/extra/EssentialsExtra.java | 49 ++++++++++++++++++---- 1 file changed, 41 insertions(+), 8 deletions(-) (limited to 'EssentialsExtra/src/net') diff --git a/EssentialsExtra/src/net/ess3/extra/EssentialsExtra.java b/EssentialsExtra/src/net/ess3/extra/EssentialsExtra.java index ae8964775..53339bde2 100644 --- a/EssentialsExtra/src/net/ess3/extra/EssentialsExtra.java +++ b/EssentialsExtra/src/net/ess3/extra/EssentialsExtra.java @@ -2,11 +2,12 @@ package net.ess3.extra; import java.io.File; import java.io.FileOutputStream; -import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.lang.reflect.Field; import java.net.URL; import java.net.URLClassLoader; +import java.util.Arrays; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -15,8 +16,12 @@ import net.ess3.api.ICommandHandler; import net.ess3.api.IEssentials; import net.ess3.bukkit.BukkitPlugin; import net.ess3.commands.EssentialsCommandHandler; +import org.bukkit.Bukkit; import org.bukkit.command.Command; +import org.bukkit.command.CommandMap; import org.bukkit.command.CommandSender; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.SimplePluginManager; import org.bukkit.plugin.java.JavaPlugin; @@ -24,6 +29,8 @@ public class EssentialsExtra extends JavaPlugin { private IEssentials ess; private ICommandHandler handler; + private CommandMap commandMap; + private ClassLoader loader; @Override public void onEnable() @@ -35,6 +42,11 @@ public class EssentialsExtra extends JavaPlugin URL[] urls = null; try { + PluginManager pm = Bukkit.getServer().getPluginManager(); + Field f = SimplePluginManager.class.getDeclaredField("commandMap"); + f.setAccessible(true); + CommandMap map = (CommandMap)f.get(pm); + JarFile jar = new JarFile(getFile()); Enumeration entries = jar.entries(); while (entries.hasMoreElements()) @@ -64,28 +76,49 @@ public class EssentialsExtra extends JavaPlugin commandDir.toURI().toURL() }; } - catch (IOException ex) + catch (Exception ex) { - getLogger().log(Level.SEVERE, "Could not get extra command dir", ex); + getLogger().log(Level.SEVERE, "Enable " + getName(), ex); getServer().getPluginManager().disablePlugin(this); } + loader = new URLClassLoader(urls, getClassLoader()); + for (File file : commandDir.listFiles()) { String name = file.getName(); if (name.startsWith("Command") && name.endsWith(".class")) { - getLogger().info("Loaded command " + name.substring(0, name.length() - 7)); + try + { + registerCommand(name); + getLogger().info("Loaded command " + name.substring(0, name.length() - 7)); + } + catch (Exception ex) + { + getLogger().log(Level.SEVERE, "Could not register " + name, ex); + } } } - ClassLoader loader = new URLClassLoader(urls, getClassLoader()); handler = new EssentialsCommandHandler(loader, "Command", "essentials.", ess); } - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) + private void registerCommand(String name) throws ClassNotFoundException, IllegalAccessException, IllegalArgumentException, NoSuchFieldException, SecurityException { - return handler.handleCommand(sender, command, label, args); + + AnnotatedCommand anot = Class.forName(name).getAnnotation(AnnotatedCommand.class); + if (anot == null) + { + throw new IllegalArgumentException("Command class is not annotated with AnnotatedCommand.class"); + } + commandMap.register("Essentials", new Command(name.substring(0, name.length() - 7), anot.description(), anot.usage(), Arrays.asList(anot.aliases())) + { + @Override + public boolean execute(CommandSender cs, String label, String[] args) + { + return handler.handleCommand(cs, this, label, args); + } + }); } } -- cgit v1.2.3