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 --- EssentialsExtra/src/Commandkittycannon.java | 2 + .../src/net/ess3/extra/EssentialsExtra.java | 49 ++++++++++++++++++---- EssentialsExtra/src/plugin.yml | 4 -- pom.xml | 2 +- 4 files changed, 44 insertions(+), 13 deletions(-) diff --git a/EssentialsExtra/src/Commandkittycannon.java b/EssentialsExtra/src/Commandkittycannon.java index db9fa5fdf..a81bd26b4 100644 --- a/EssentialsExtra/src/Commandkittycannon.java +++ b/EssentialsExtra/src/Commandkittycannon.java @@ -2,11 +2,13 @@ import java.util.Random; import net.ess3.api.IUser; import net.ess3.commands.EssentialsCommand; +import net.ess3.extra.AnnotatedCommand; import org.bukkit.Location; import org.bukkit.entity.EntityType; import org.bukkit.entity.Ocelot; +@AnnotatedCommand(description = "Throw an exploding kitten at your opponent", usage = "/") public class Commandkittycannon extends EssentialsCommand { private static Random random = new Random(); 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); + } + }); } } diff --git a/EssentialsExtra/src/plugin.yml b/EssentialsExtra/src/plugin.yml index 9202b0fbd..8f641605f 100644 --- a/EssentialsExtra/src/plugin.yml +++ b/EssentialsExtra/src/plugin.yml @@ -7,7 +7,3 @@ website: http://tiny.cc/EssentialsWiki description: Provides extra commands for Essentials authors: [md_5] depend: [Essentials-3] -commands: - kittycannon: - description: Throw an exploding kitten at your opponent - usage: / diff --git a/pom.xml b/pom.xml index e9d579a67..5f6a6b90f 100644 --- a/pom.xml +++ b/pom.xml @@ -76,7 +76,7 @@ UTF-8 - 1.3.2-R0.1 + 1.3.2-R1.1-SNAPSHOT Unknown true 2 -- cgit v1.2.3