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/18 20:03:26 UTC

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

Author: rmannibucau
Date: Wed Jan 18 19:03:26 2012
New Revision: 1233000

URL: http://svn.apache.org/viewvc?rev=1233000&view=rev
Log:
some few refactoring to get a command pattern in openejb-common-cli

Added:
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/StreamManager.java
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/
    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/GroovyCommand.java
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/GroovyFileCommand.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
Modified:
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/CliRunnable.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=1233000&r1=1232999&r2=1233000&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 Wed Jan 18 19:03:26 2012
@@ -1,32 +1,38 @@
 package org.apache.openejb.server.cli;
 
 import jline.ConsoleReader;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
+import jline.FileNameCompletor;
 import org.apache.openejb.assembler.classic.OpenEjbConfiguration;
 import org.apache.openejb.assembler.classic.cmd.Info2Properties;
 import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.server.cli.command.AbstractCommand;
+import org.apache.openejb.server.cli.command.GroovyCommand;
+import org.apache.openejb.server.cli.command.GroovyFileCommand;
+import org.apache.openejb.server.cli.command.ListCommand;
+import org.apache.openejb.server.cli.command.PropertiesCommand;
 import org.apache.openejb.server.groovy.OpenEJBGroovyShell;
 import org.apache.openejb.util.helper.CommandHelper;
+import org.apache.xbean.recipe.ObjectRecipe;
+import org.apache.xbean.recipe.Option;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.io.OutputStreamWriter;
 import java.io.PrintStream;
-import java.util.Collection;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 public class CliRunnable implements Runnable {
-    public static final String EXIT_COMMAND = "exit";
-    private static final String GROOVY_PREFIX = "groovy ";
-    private static final String GROOVY_FILE_PREFIX = "groovy_file ";
-    private static final String LIST_CMD = "list";
-    private static final String PROPERTIES_CMD = "properties";
+    private static final String EXIT_COMMAND = "exit";
     private static final String WELCOME = "Welcome on your $bind:$port $name server";
-    public static final String OS_LINE_SEP = System.getProperty("line.separator");
+    private static final String OS_LINE_SEP = System.getProperty("line.separator");
     private static final String NAME;
-    public static final String PROMPT = "openejb> ";
+    private static final String PROMPT = "openejb> ";
+    private static final List<Class<? extends AbstractCommand>> COMMAND_CLASSES
+            = Arrays.asList(GroovyCommand.class, GroovyFileCommand.class,
+            ListCommand.class, PropertiesCommand.class);
 
     static {
         String name = "OpenEJB";
@@ -42,12 +48,12 @@ public class CliRunnable implements Runn
     public String lineSep;
 
     private OpenEJBGroovyShell shell;
-    private OutputStreamWriter serr;
-    private OutputStreamWriter sout;
+    private OutputStream err;
     private OutputStream out;
     private InputStream sin;
     private String bind;
     private int port;
+    private Map<String, Class<?>> commands;
 
 
     public CliRunnable(String bind, int port) {
@@ -82,29 +88,45 @@ public class CliRunnable implements Runn
 
     public void setOutputStream(OutputStream out) {
         this.out = out;
-        sout = new OutputStreamWriter(out);
     }
 
     public void setErrorStream(OutputStream err) {
-        serr = new OutputStreamWriter(err);
+        this.err = err;
     }
 
     public void start() throws IOException {
         shell = new OpenEJBGroovyShell();
+        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() {
         shell.resetLoadedClasses();
+        commands.clear();
     }
 
     public void run() {
         try {
-            final ConsoleReader reader = new ConsoleReader(sin, sout);
+            final StreamManager streamManager = new StreamManager(out, err, lineSep);
+
+            final ConsoleReader reader = new ConsoleReader(sin, streamManager.getSout());
+            reader.addCompletor(new FileNameCompletor());
             // TODO : add completers with method names...?
 
             String line;
-            write(sout, WELCOME // simple replace for now, if it is mandatory we could bring velocity to do it
+            streamManager.writeOut(WELCOME // simple replace for now, if it is mandatory we could bring velocity to do it
                     .replace("$bind", bind)
                     .replace("$port", Integer.toString(port))
                     .replace("$name", NAME));
@@ -113,24 +135,32 @@ public class CliRunnable implements Runn
                     break;
                 }
 
-                if (line.startsWith(GROOVY_PREFIX)) {
-                    try {
-                        write(sout, asString(shell.evaluate(line.substring(GROOVY_PREFIX.length()))));
-                    } catch (Exception e) {
-                        write(e);
+                Class<?> cmdClass = null;
+                for (Map.Entry<String, Class<?>> cmd : commands.entrySet()) {
+                    if (line.startsWith(cmd.getKey())) {
+                        cmdClass = cmd.getValue();
+                        break;
                     }
-                } else if (GROOVY_FILE_PREFIX.equals(line)) {
+                }
+
+                if (cmdClass != null) {
+                    ObjectRecipe recipe = new ObjectRecipe(cmdClass);
+                    recipe.setProperty("streamManager", streamManager);
+                    recipe.setProperty("command", line);
+                    recipe.setProperty("shell", shell);
+
+                    recipe.allow(Option.CASE_INSENSITIVE_PROPERTIES);
+                    recipe.allow(Option.IGNORE_MISSING_PROPERTIES);
+                    recipe.allow(Option.NAMED_PARAMETERS);
+
                     try {
-                        write(sout, asString(shell.evaluate(new File(line.substring(GROOVY_PREFIX.length())))));
+                        final AbstractCommand cmdInstance = (AbstractCommand) recipe.create();
+                        cmdInstance.execute(line);
                     } catch (Exception e) {
-                        write(e);
+                        streamManager.writeErr(e);
                     }
-                } else if (LIST_CMD.equals(line)) {
-                    list();
-                } else if (PROPERTIES_CMD.equals(line)) {
-                    properties();
                 } else {
-                    write(sout, "sorry i don't understand '" + line + "'");
+                    streamManager.writeOut("sorry i don't understand '" + line + "'");
                 }
             }
         } catch (IOException e) {
@@ -143,73 +173,12 @@ public class CliRunnable implements Runn
         Info2Properties.printConfig(config, new PrintStream(out), lineSep);
     }
 
-    private void list() {
+    private void list(final StreamManager streamManager) {
         try {
             CommandHelper.listEJBs(lineSep).print(new PrintStream(out));
         } catch (Exception e) {
-            write(e);
-        }
-    }
-
-    private void write(final OutputStreamWriter writer, final String s) {
-        for (String l : s.split(lineSep)) {
-            try {
-                writer.write(l);
-                writer.write(lineSep);
-                writer.flush();
-            } catch (IOException e) {
-                // ignored
-            }
-        }
-    }
-
-    private void write(Exception e) {
-        if (e.getStackTrace() == null) {
-            write(serr, e.getMessage());
-        } else {
-            final StringBuilder error = new StringBuilder();
-            for (StackTraceElement elt : e.getStackTrace()) {
-                error.append(elt.toString()).append(lineSep);
-            }
-            write(serr, error.toString());
-        }
-    }
-
-    private String asString(Object out) {
-        if (out == null) {
-            return "null";
-        }
-        if (out instanceof Collection) {
-            final StringBuilder builder = new StringBuilder();
-            for (Object o : (Collection) out) {
-                builder.append(string(o)).append(lineSep);
-            }
-            return builder.toString();
+            streamManager.writeErr(e);
         }
-        return string(out);
-    }
-
-    private static String string(Object out) {
-        if (!out.getClass().getName().startsWith("java")) {
-            return ToStringBuilder.reflectionToString(out, ToStringStyle.SHORT_PREFIX_STYLE);
-        }
-        return out.toString();
-    }
-
-    public OutputStream getOut() {
-        return out;
-    }
-
-    public OutputStreamWriter getSerr() {
-        return serr;
-    }
-
-    public OutputStreamWriter getSout() {
-        return sout;
-    }
-
-    public InputStream getSin() {
-        return sin;
     }
 
     public String getBind() {

Added: openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/StreamManager.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/StreamManager.java?rev=1233000&view=auto
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/StreamManager.java (added)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/StreamManager.java Wed Jan 18 19:03:26 2012
@@ -0,0 +1,94 @@
+package org.apache.openejb.server.cli;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.util.Collection;
+
+public class StreamManager {
+    private String lineSep;
+    private OutputStreamWriter serr;
+    private OutputStreamWriter sout;
+    private OutputStream out;
+    private OutputStream err;
+
+    public StreamManager(OutputStream out, OutputStream err, String lineSep) {
+        this.lineSep = lineSep;
+        this.out = out;
+        this.err = err;
+        this.sout = new OutputStreamWriter(out);
+        this.serr= new OutputStreamWriter(err);
+    }
+
+    private void write(final OutputStreamWriter writer, final String s) {
+        for (String l : s.split(lineSep)) {
+            try {
+                writer.write(l);
+                writer.write(lineSep);
+                writer.flush();
+            } catch (IOException e) {
+                // ignored
+            }
+        }
+    }
+
+    public void writeOut(final String s) {
+        write(sout, s);
+    }
+
+    public void writeErr(Exception e) {
+        if (e.getStackTrace() == null) {
+            write(serr, e.getMessage());
+        } else {
+            final StringBuilder error = new StringBuilder();
+            for (StackTraceElement elt : e.getStackTrace()) {
+                error.append(elt.toString()).append(lineSep);
+            }
+            write(serr, error.toString());
+        }
+    }
+
+    public String asString(Object out) {
+        if (out == null) {
+            return "null";
+        }
+        if (out instanceof Collection) {
+            final StringBuilder builder = new StringBuilder();
+            for (Object o : (Collection) out) {
+                builder.append(string(o)).append(lineSep);
+            }
+            return builder.toString();
+        }
+        return string(out);
+    }
+
+    private static String string(Object out) {
+        if (!out.getClass().getName().startsWith("java")) {
+            return ToStringBuilder.reflectionToString(out, ToStringStyle.SHORT_PREFIX_STYLE);
+        }
+        return out.toString();
+    }
+
+    public OutputStream getOut() {
+        return out;
+    }
+
+    public OutputStream getErr() {
+        return err;
+    }
+
+    public OutputStreamWriter getSerr() {
+        return serr;
+    }
+
+    public OutputStreamWriter getSout() {
+        return sout;
+    }
+
+    public String getLineSep() {
+        return lineSep;
+    }
+}

Added: 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=1233000&view=auto
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/AbstractCommand.java (added)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/AbstractCommand.java Wed Jan 18 19:03:26 2012
@@ -0,0 +1,23 @@
+package org.apache.openejb.server.cli.command;
+
+import org.apache.openejb.server.cli.StreamManager;
+
+public abstract class AbstractCommand {
+    protected StreamManager streamManager;
+    protected  String command;
+
+    public abstract String name();
+    public abstract Runnable executable(final String cmd);
+
+    public void setStreamManager(StreamManager streamManager) {
+        this.streamManager = streamManager;
+    }
+
+    public void setCommand(String command) {
+        this.command = command;
+    }
+
+    public void execute(String line) {
+        executable(line).run();
+    }
+}

Added: openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/GroovyCommand.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/GroovyCommand.java?rev=1233000&view=auto
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/GroovyCommand.java (added)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/GroovyCommand.java Wed Jan 18 19:03:26 2012
@@ -0,0 +1,30 @@
+package org.apache.openejb.server.cli.command;
+
+import org.apache.openejb.server.groovy.OpenEJBGroovyShell;
+
+public class GroovyCommand extends AbstractCommand {
+    private OpenEJBGroovyShell shell;
+
+    @Override
+    public String name() {
+        return "groovy";
+    }
+
+    @Override
+    public Runnable executable(final String cmd) {
+        return new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    streamManager.writeOut(streamManager.asString(shell.evaluate(cmd.substring(name().length() + 1))));
+                } catch (Exception e) {
+                    streamManager.writeErr(e);
+                }
+            }
+        };
+    }
+
+    public void setShell(OpenEJBGroovyShell shell) {
+        this.shell = shell;
+    }
+}

Added: openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/GroovyFileCommand.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/GroovyFileCommand.java?rev=1233000&view=auto
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/GroovyFileCommand.java (added)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/GroovyFileCommand.java Wed Jan 18 19:03:26 2012
@@ -0,0 +1,33 @@
+package org.apache.openejb.server.cli.command;
+
+import org.apache.openejb.server.cli.StreamManager;
+import org.apache.openejb.server.groovy.OpenEJBGroovyShell;
+
+import java.io.File;
+
+public class GroovyFileCommand extends AbstractCommand {
+    private OpenEJBGroovyShell shell;
+
+    @Override
+    public String name() {
+        return "groovy file";
+    }
+
+    @Override
+    public Runnable executable(final String cmd) {
+        return new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    streamManager.writeOut(streamManager.asString(shell.evaluate(new File(cmd.substring(name().length() + 1)))));
+                } catch (Exception e) {
+                    streamManager.writeErr(e);
+                }
+            }
+        };
+    }
+
+    public void setShell(OpenEJBGroovyShell shell) {
+        this.shell = shell;
+    }
+}

Added: 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=1233000&view=auto
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ListCommand.java (added)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ListCommand.java Wed Jan 18 19:03:26 2012
@@ -0,0 +1,26 @@
+package org.apache.openejb.server.cli.command;
+
+import org.apache.openejb.util.helper.CommandHelper;
+
+import java.io.PrintStream;
+
+public class ListCommand extends AbstractCommand {
+    @Override
+    public String name() {
+        return "list";
+    }
+
+    @Override
+    public Runnable executable(String cmd) {
+        return new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    CommandHelper.listEJBs(streamManager.getLineSep()).print(new PrintStream(streamManager.getOut()));
+                } catch (Exception e) {
+                    streamManager.writeErr(e);
+                }
+            }
+        };
+    }
+}

Added: 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=1233000&view=auto
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/PropertiesCommand.java (added)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/PropertiesCommand.java Wed Jan 18 19:03:26 2012
@@ -0,0 +1,25 @@
+package org.apache.openejb.server.cli.command;
+
+import org.apache.openejb.assembler.classic.OpenEjbConfiguration;
+import org.apache.openejb.assembler.classic.cmd.Info2Properties;
+import org.apache.openejb.loader.SystemInstance;
+
+import java.io.PrintStream;
+
+public class PropertiesCommand extends AbstractCommand {
+    @Override
+    public String name() {
+        return "properties";
+    }
+
+    @Override
+    public Runnable executable(String cmd) {
+        return new Runnable() {
+            @Override
+            public void run() {
+                final OpenEjbConfiguration config = SystemInstance.get().getComponent(OpenEjbConfiguration.class);
+                Info2Properties.printConfig(config, new PrintStream(streamManager.getOut()), streamManager.getLineSep());
+            }
+        };
+    }
+}