You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2012/01/22 22:34:13 UTC

svn commit: r1234619 - in /openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli: ./ command/

Author: rmannibucau
Date: Sun Jan 22 21:34:12 2012
New Revision: 1234619

URL: http://svn.apache.org/viewvc?rev=1234619&view=rev
Log:
using @Command on cli commands

Added:
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/Command.java
Modified:
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/CliRunnable.java
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/AbstractCommand.java
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/Deploy.java
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ExitCommand.java
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/HelpCommand.java
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ListCommand.java
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/PropertiesCommand.java
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptCommand.java
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptFileCommand.java
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/Undeploy.java

Modified: openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/CliRunnable.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/CliRunnable.java?rev=1234619&r1=1234618&r2=1234619&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/CliRunnable.java (original)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/CliRunnable.java Sun Jan 22 21:34:12 2012
@@ -20,24 +20,17 @@ import jline.ConsoleReader;
 import jline.FileNameCompletor;
 import jline.SimpleCompletor;
 import org.apache.openejb.server.cli.command.AbstractCommand;
-import org.apache.openejb.server.cli.command.Deploy;
-import org.apache.openejb.server.cli.command.ExitCommand;
-import org.apache.openejb.server.cli.command.HelpCommand;
-import org.apache.openejb.server.cli.command.ListCommand;
-import org.apache.openejb.server.cli.command.PropertiesCommand;
-import org.apache.openejb.server.cli.command.ScriptCommand;
-import org.apache.openejb.server.cli.command.ScriptFileCommand;
-import org.apache.openejb.server.cli.command.Undeploy;
+import org.apache.openejb.server.cli.command.Command;
 import org.apache.openejb.util.OpenEjbVersion;
+import org.apache.xbean.finder.Annotated;
+import org.apache.xbean.finder.ClassFinder;
 import org.apache.xbean.recipe.ObjectRecipe;
 import org.apache.xbean.recipe.Option;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.Arrays;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 
@@ -56,14 +49,11 @@ public class CliRunnable implements Runn
     private static final String NAME;
     private static final String PROMPT;
     private static final String PROMPT_SUFFIX = "> ";
-    private static final List<Class<? extends AbstractCommand>> COMMAND_CLASSES
-            = Arrays.asList(ScriptFileCommand.class, ScriptCommand.class,
-                ListCommand.class, PropertiesCommand.class,
-                Deploy.class, Undeploy.class,
-                HelpCommand.class, ExitCommand.class);
 
     private static final Properties PROPERTIES = new Properties();
     private static final boolean tomee;
+    private static Map<String, Class<?>> COMMANDS = new HashMap<String, Class<?>>();
+    private static final OpenEJBScripter scripter = new OpenEJBScripter();
 
     static {
         String name = OPENEJB_NAME;
@@ -82,19 +72,30 @@ public class CliRunnable implements Runn
         } catch (IOException e) {
             // no-op
         }
+
+        try {
+            final ClassFinder finder = new ClassFinder(CliRunnable.class.getClassLoader());
+            for (Annotated<Class<?>> cmd : finder.findMetaAnnotatedClasses(Command.class)) {
+                try {
+                    final Command annotation = cmd.getAnnotation(Command.class);
+                    COMMANDS.put(annotation.name(), cmd.get());
+                } catch (Exception e) {
+                    // command ignored
+                }
+            }
+        } catch (Exception e) {
+            // ignored
+        }
     }
 
     public String lineSep;
 
-    private OpenEJBScripter scripter;
     private OutputStream err;
     private OutputStream out;
     private InputStream sin;
     private String username;
     private String bind;
     private int port;
-    private Map<String, Class<?>> commands;
-
 
     public CliRunnable(String bind, int port) {
         this(bind, port, PROMPT, null);
@@ -136,33 +137,11 @@ public class CliRunnable implements Runn
     }
 
     public void start() throws IOException {
-        scripter = new OpenEJBScripter();
-        initializeCommands();
         new Thread(this, "OpenEJB Cli").start();
     }
 
-    private void initializeCommands() {
-        commands = new HashMap<String, Class<?>>();
-
-        for (Class<? extends AbstractCommand> cmd : COMMAND_CLASSES) {
-            try {
-                commands.put(cmd.newInstance().name(), cmd);
-            } catch (Exception e) {
-                // command ignored
-            }
-        }
-    }
-
     public void destroy() {
-        if (scripter != null) {
-            try {
-                scripter.getClass().getDeclaredMethod("resetLoadedClasses")
-                        .invoke(scripter);
-            } catch (Exception e) {
-                // ignored
-            }
-        }
-        commands.clear();
+        // no-op
     }
 
     public void run() {
@@ -171,7 +150,7 @@ public class CliRunnable implements Runn
 
             final ConsoleReader reader = new ConsoleReader(sin, streamManager.getSout());
             reader.addCompletor(new FileNameCompletor());
-            reader.addCompletor(new SimpleCompletor(commands.keySet().toArray(new String[commands.size()])));
+            reader.addCompletor(new SimpleCompletor(COMMANDS.keySet().toArray(new String[COMMANDS.size()])));
             // TODO : add completers
 
             String line;
@@ -204,7 +183,7 @@ public class CliRunnable implements Runn
                 }
 
                 Class<?> cmdClass = null;
-                for (Map.Entry<String, Class<?>> cmd : commands.entrySet()) {
+                for (Map.Entry<String, Class<?>> cmd : COMMANDS.entrySet()) {
                     if (line.startsWith(cmd.getKey())) {
                         cmdClass = cmd.getValue();
                         break;
@@ -216,7 +195,7 @@ public class CliRunnable implements Runn
                     recipe.setProperty("streamManager", streamManager);
                     recipe.setProperty("command", line);
                     recipe.setProperty("scripter", scripter);
-                    recipe.setProperty("commands", commands);
+                    recipe.setProperty("commands", COMMANDS);
 
                     recipe.allow(Option.CASE_INSENSITIVE_PROPERTIES);
                     recipe.allow(Option.IGNORE_MISSING_PROPERTIES);

Modified: openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/AbstractCommand.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/AbstractCommand.java?rev=1234619&r1=1234618&r2=1234619&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/AbstractCommand.java (original)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/AbstractCommand.java Sun Jan 22 21:34:12 2012
@@ -28,13 +28,7 @@ public abstract class AbstractCommand {
     protected StreamManager streamManager;
     protected  String command;
 
-    public abstract String name();
     public abstract void execute(final String cmd);
-    public abstract String description();
-
-    public String usage() {
-        return name();
-    }
 
     public void setStreamManager(StreamManager streamManager) {
         this.streamManager = streamManager;

Added: openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/Command.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/Command.java?rev=1234619&view=auto
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/Command.java (added)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/Command.java Sun Jan 22 21:34:12 2012
@@ -0,0 +1,14 @@
+package org.apache.openejb.server.cli.command;
+
+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 Command {
+    String usage() default "";
+    String name() default "";
+    String description() default "";
+}

Modified: openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/Deploy.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/Deploy.java?rev=1234619&r1=1234618&r2=1234619&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/Deploy.java (original)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/Deploy.java Sun Jan 22 21:34:12 2012
@@ -19,28 +19,14 @@ package org.apache.openejb.server.cli.co
 
 import org.apache.openejb.assembler.Deployer;
 
+@Command(name = "deploy", usage = "deploy <location>", description = "deploy an application")
 public class Deploy extends AbstractCommand {
     @Override
-    public String name() {
-        return "deploy";
-    }
-
-    @Override
-    public String usage() {
-        return name() + "<location>";
-    }
-
-    @Override
     public void execute(String cmd) {
         try {
-            lookup(Deployer.class, "openejb/DeployerBusinessRemote").deploy(cmd.substring(name().length()).trim());
+            lookup(Deployer.class, "openejb/DeployerBusinessRemote").deploy(cmd.substring(6).trim());
         } catch (Exception e) {
             streamManager.writeErr(e);
         }
     }
-
-    @Override
-    public String description() {
-        return "deploy an application";
-    }
 }

Modified: openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ExitCommand.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ExitCommand.java?rev=1234619&r1=1234618&r2=1234619&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ExitCommand.java (original)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ExitCommand.java Sun Jan 22 21:34:12 2012
@@ -16,22 +16,11 @@
  */
 package org.apache.openejb.server.cli.command;
 
-import org.apache.openejb.server.cli.CliRunnable;
-
 // just to get it in the help
+@Command(name = "exit", usage = "exit", description = "exit from the cli")
 public class ExitCommand extends AbstractCommand {
     @Override
-    public String name() {
-        return CliRunnable.EXIT_COMMAND ;
-    }
-
-    @Override
     public void execute(String cmd) {
         throw new UnsupportedOperationException("shouldn't be called directly");
     }
-
-    @Override
-    public String description() {
-        return "let you exit";
-    }
 }

Modified: openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/HelpCommand.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/HelpCommand.java?rev=1234619&r1=1234618&r2=1234619&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/HelpCommand.java (original)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/HelpCommand.java Sun Jan 22 21:34:12 2012
@@ -18,26 +18,18 @@ package org.apache.openejb.server.cli.co
 
 import java.util.Map;
 
+@Command(name = "help", usage = "help", description = "print this help")
 public class HelpCommand extends AbstractCommand {
     private Map<String, Class<?>> commands;
 
     @Override
-    public String name() {
-        return "help";
-    }
-
-    @Override
-    public String description() {
-        return "print this help";
-    }
-
-    @Override
     public void execute(final String cmd) {
         for (Map.Entry<String, Class<?>> command : commands.entrySet()) {
             try {
-                final AbstractCommand instance = (AbstractCommand) command.getValue().newInstance();
-                streamManager.writeOut(instance.name() + ": " + instance.description());
-                streamManager.writeOut("\tUsage: " + instance.usage());
+                final Class<?> clazz = command.getValue();
+                final Command annotation = clazz.getAnnotation(Command.class);
+                streamManager.writeOut(annotation.name() + ": " + annotation.description());
+                streamManager.writeOut("\tUsage: " + annotation.usage());
             } catch (Exception e) {
                 // ignored = command not available
             }

Modified: openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ListCommand.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ListCommand.java?rev=1234619&r1=1234618&r2=1234619&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ListCommand.java (original)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ListCommand.java Sun Jan 22 21:34:12 2012
@@ -20,18 +20,9 @@ import org.apache.openejb.util.helper.Co
 
 import java.io.PrintStream;
 
+@Command(name = "list", usage = "list", description = "list available ejbs")
 public class ListCommand extends AbstractCommand {
     @Override
-    public String name() {
-        return "list";
-    }
-
-    @Override
-    public String description() {
-        return "list available ejbs";
-    }
-
-    @Override
     public void execute(final String cmd) {
         try {
             CommandHelper.listEJBs(streamManager.getLineSep()).print(new PrintStream(streamManager.getOut()));

Modified: openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/PropertiesCommand.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/PropertiesCommand.java?rev=1234619&r1=1234618&r2=1234619&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/PropertiesCommand.java (original)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/PropertiesCommand.java Sun Jan 22 21:34:12 2012
@@ -22,18 +22,9 @@ import org.apache.openejb.loader.SystemI
 
 import java.io.PrintStream;
 
+@Command(name = "properties", usage = "properties", description = "show OpenEJB container properties")
 public class PropertiesCommand extends AbstractCommand {
     @Override
-    public String name() {
-        return "properties";
-    }
-
-    @Override
-    public String description() {
-        return "show openejb container properties";
-    }
-
-    @Override
     public void execute(final String cmd) {
         final OpenEjbConfiguration config = SystemInstance.get().getComponent(OpenEjbConfiguration.class);
         Info2Properties.printConfig(config, new PrintStream(streamManager.getOut()), streamManager.getLineSep());

Modified: openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptCommand.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptCommand.java?rev=1234619&r1=1234618&r2=1234619&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptCommand.java (original)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptCommand.java Sun Jan 22 21:34:12 2012
@@ -18,29 +18,13 @@ package org.apache.openejb.server.cli.co
 
 import org.apache.openejb.server.cli.OpenEJBScripter;
 
+@Command(name = "script", usage = "script <code>", description = "execute script code in the specified language. ejb can be accessed through their ejb name in the script.")
 public class ScriptCommand extends AbstractCommand {
-    public static final String SCRIPT_CMD = "script"; // use it instead of name() because of inheritance
-
     protected OpenEJBScripter scripter;
     protected String language;
     protected String script;
 
     @Override
-    public String name() {
-        return SCRIPT_CMD;
-    }
-
-    @Override
-    public String usage() {
-        return name() + " <script code>";
-    }
-
-    @Override
-    public String description() {
-        return "execute script code in the specified language. ejb can be accessed through their ejb name in the script.";
-    }
-
-    @Override
     public void execute(final String cmd) {
         try {
             parse(cmd);
@@ -52,7 +36,7 @@ public class ScriptCommand extends Abstr
     }
 
     protected void parse(final String cmd) {
-        final String parseableCmd = cmd.substring(name().length() + 1);
+        final String parseableCmd = cmd.substring(7);
         final int spaceIdx = parseableCmd.indexOf(" ");
         if (spaceIdx < 0) {
             throw new IllegalArgumentException("bad syntax, see help");

Modified: openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptFileCommand.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptFileCommand.java?rev=1234619&r1=1234618&r2=1234619&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptFileCommand.java (original)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptFileCommand.java Sun Jan 22 21:34:12 2012
@@ -21,23 +21,9 @@ import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
 
+@Command(name = "script file", usage = "script file <path>", description = "execute script code contained in a file in the specifid language. ejb can be accessed through their ejb name in the script. The extension is used to detect the file format.")
 public class ScriptFileCommand extends ScriptCommand {
     @Override
-    public String name() {
-        return "script file";
-    }
-
-    @Override
-    public String usage() {
-        return name() + "<script file path>";
-    }
-
-    @Override
-    public String description() {
-        return "execute script code contained in a file in the specifid language. ejb can be accessed through their ejb name in the script. The extension is used to detect the file format.";
-    }
-
-    @Override
     public void execute(final String cmd) {
         try {
             parse(cmd);
@@ -53,7 +39,7 @@ public class ScriptFileCommand extends S
         }
 
         final StringBuilder builder = new StringBuilder(1024);
-        builder.append(super.name()).append(" ").append(language).append(" "); // we will run the parent command
+        builder.append("script ").append(language).append(" "); // we will run the parent command
 
         BufferedReader reader = null;
         try {
@@ -83,7 +69,7 @@ public class ScriptFileCommand extends S
 
     @Override
     protected void parse(final String cmd) {
-        final String parseableCmd = cmd.substring(name().length() + 1);
+        final String parseableCmd = cmd.substring(7);
         final int dotIdx = parseableCmd.lastIndexOf(".");
         if (dotIdx < 0) {
             throw new IllegalArgumentException("bad syntax, see help");

Modified: openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/Undeploy.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/Undeploy.java?rev=1234619&r1=1234618&r2=1234619&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/Undeploy.java (original)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/Undeploy.java Sun Jan 22 21:34:12 2012
@@ -19,28 +19,14 @@ package org.apache.openejb.server.cli.co
 
 import org.apache.openejb.assembler.Deployer;
 
+@Command(name = "undeploy", usage = "undeploy <location>", description = "undeploy an application. Note the location should be the same than for deploy")
 public class Undeploy extends AbstractCommand {
     @Override
-    public String name() {
-        return "undeploy";
-    }
-
-    @Override
-    public String usage() {
-        return name() + "<location>";
-    }
-
-    @Override
     public void execute(String cmd) {
         try {
-            lookup(Deployer.class, "openejb/DeployerBusinessRemote").undeploy(cmd.substring(name().length()).trim());
+            lookup(Deployer.class, "openejb/DeployerBusinessRemote").undeploy(cmd.substring(8).trim());
         } catch (Exception e) {
             streamManager.writeErr(e);
         }
     }
-
-    @Override
-    public String description() {
-        return "undeploy an application. Note the location should be the same than for deploy";
-    }
 }