You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by gn...@apache.org on 2008/10/24 15:52:59 UTC

svn commit: r707633 - in /geronimo/gshell/trunk: gshell-api/src/main/java/org/apache/geronimo/gshell/commandline/ gshell-parser/src/main/java/org/apache/geronimo/gshell/parser/visitor/ gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/...

Author: gnodet
Date: Fri Oct 24 06:52:59 2008
New Revision: 707633

URL: http://svn.apache.org/viewvc?rev=707633&view=rev
Log:
Move the pipe logic from CommandLineExecutorImpl to ExecutingVisitor and avoid creating threads when running simple commands with no pipes.

Modified:
    geronimo/gshell/trunk/gshell-api/src/main/java/org/apache/geronimo/gshell/commandline/CommandLineExecutor.java
    geronimo/gshell/trunk/gshell-parser/src/main/java/org/apache/geronimo/gshell/parser/visitor/ExecutingVisitor.java
    geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/shell/CommandLineExecutorImpl.java

Modified: geronimo/gshell/trunk/gshell-api/src/main/java/org/apache/geronimo/gshell/commandline/CommandLineExecutor.java
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-api/src/main/java/org/apache/geronimo/gshell/commandline/CommandLineExecutor.java?rev=707633&r1=707632&r2=707633&view=diff
==============================================================================
--- geronimo/gshell/trunk/gshell-api/src/main/java/org/apache/geronimo/gshell/commandline/CommandLineExecutor.java (original)
+++ geronimo/gshell/trunk/gshell-api/src/main/java/org/apache/geronimo/gshell/commandline/CommandLineExecutor.java Fri Oct 24 06:52:59 2008
@@ -62,14 +62,4 @@
      */
     Object execute(ShellContext context, Object... args) throws Exception;
 
-    /**
-     * Execute a piped-command-line.
-     *
-     * @param context   The executing shell's context.
-     * @param commands  Command arguments.
-     * @return          Command execution result.
-     *
-     * @throws Exception    Command-line execution failed.
-     */
-    Object execute(ShellContext context, Object[][] commands) throws Exception;
 }
\ No newline at end of file

Modified: geronimo/gshell/trunk/gshell-parser/src/main/java/org/apache/geronimo/gshell/parser/visitor/ExecutingVisitor.java
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-parser/src/main/java/org/apache/geronimo/gshell/parser/visitor/ExecutingVisitor.java?rev=707633&r1=707632&r2=707633&view=diff
==============================================================================
--- geronimo/gshell/trunk/gshell-parser/src/main/java/org/apache/geronimo/gshell/parser/visitor/ExecutingVisitor.java (original)
+++ geronimo/gshell/trunk/gshell-parser/src/main/java/org/apache/geronimo/gshell/parser/visitor/ExecutingVisitor.java Fri Oct 24 06:52:59 2008
@@ -20,7 +20,9 @@
 package org.apache.geronimo.gshell.parser.visitor;
 
 import org.apache.geronimo.gshell.commandline.CommandLineExecutor;
+import org.apache.geronimo.gshell.commandline.CommandLineExecutionFailed;
 import org.apache.geronimo.gshell.notification.ErrorNotification;
+import org.apache.geronimo.gshell.notification.Notification;
 import org.apache.geronimo.gshell.parser.ASTCommandLine;
 import org.apache.geronimo.gshell.parser.ASTExpression;
 import org.apache.geronimo.gshell.parser.ASTOpaqueString;
@@ -30,13 +32,26 @@
 import org.apache.geronimo.gshell.parser.CommandLineParserVisitor;
 import org.apache.geronimo.gshell.parser.SimpleNode;
 import org.apache.geronimo.gshell.command.Arguments;
+import org.apache.geronimo.gshell.command.Variables;
 import org.apache.geronimo.gshell.interpolation.VariableInterpolator;
 import org.apache.geronimo.gshell.shell.ShellContext;
+import org.apache.geronimo.gshell.shell.Shell;
+import org.apache.geronimo.gshell.io.IO;
+import org.apache.geronimo.gshell.io.Closer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicReference;
+import java.io.PipedOutputStream;
+import java.io.InputStream;
+import java.io.PipedInputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.io.IOException;
 
 /**
  * Visitor which will execute command-lines as parsed.
@@ -46,7 +61,7 @@
 public class ExecutingVisitor
     implements CommandLineParserVisitor
 {
-    private final Logger log = LoggerFactory.getLogger(getClass());
+    private final Logger MetaDataRegistryConfigurerTestlog = LoggerFactory.getLogger(getClass());
 
     private final ShellContext context;
 
@@ -97,7 +112,7 @@
         }
 
         try {
-            return executor.execute(context, commands);
+            return executePiped(commands);
         }
         catch (Exception e) {
             String s = Arguments.asString(commands[0]);
@@ -146,4 +161,98 @@
 
         return appendString(node.getValue(), data);
     }
+
+    protected Thread createThread(final Runnable task) {
+        return new Thread(task);
+    }
+
+    private Object executePiped(final Object[][] commands) throws CommandLineExecutionFailed, InterruptedException, IOException {
+        // Prepare IOs
+        final IO[] ios = new IO[commands.length];
+        PipedOutputStream pos = null;
+
+        IO io = this.context.getIo();
+
+        for (int i = 0; i < ios.length; i++) {
+            InputStream is = (i == 0) ? io.inputStream : new PipedInputStream(pos);
+            OutputStream os;
+
+            if (i == ios.length - 1) {
+                os = io.outputStream;
+            }
+            else {
+                os = pos = new PipedOutputStream();
+            }
+
+            ios[i] = new IO(is, new PrintStream(os), io.errorStream);
+        }
+
+        final List<Throwable> errors = new CopyOnWriteArrayList<Throwable>();
+        final AtomicReference<Object> ref = new AtomicReference<Object>();
+        final CountDownLatch latch = new CountDownLatch(commands.length);
+
+        for (int i = 0; i < commands.length; i++) {
+            final int idx = i;
+
+            Runnable r = new Runnable() {
+                public void run() {
+                    try {
+                        ShellContext pipedContext = new ShellContext() {
+                            public Shell getShell() {
+                                return ExecutingVisitor.this.context.getShell();
+                            }
+
+                            public IO getIo() {
+                                return ios[idx];
+                            }
+
+                            public Variables getVariables() {
+                                return ExecutingVisitor.this.context.getVariables();
+                            }
+                        };
+
+                        Object obj = executor.execute(pipedContext, String.valueOf(commands[idx][0]), Arguments.shift(commands[idx]));
+
+                        if (idx == commands.length - 1) {
+                            ref.set(obj);
+                        }
+                    }
+                    catch (Throwable t) {
+                        errors.add(t);
+                    }
+                    finally {
+                        if (idx > 0) {
+                            Closer.close(ios[idx].inputStream);
+                        }
+                        if (idx < commands.length - 1) {
+                            Closer.close(ios[idx].outputStream);
+                        }
+                        latch.countDown();
+                    }
+                }
+            };
+            if (idx != commands.length - 1) {
+                createThread(r).start();
+            } else {
+                r.run();
+            }
+        }
+
+        latch.await();
+
+        if (!errors.isEmpty()) {
+            Throwable t = errors.get(0);
+
+            // Always preserve the type of notication throwables, reguardless of the trace
+            if (t instanceof Notification) {
+                throw (Notification)t;
+            }
+
+            // Otherwise wrap to preserve the trace
+            throw new CommandLineExecutionFailed(t);
+        }
+
+        return ref.get();
+    }
+
 }

Modified: geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/shell/CommandLineExecutorImpl.java
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/shell/CommandLineExecutorImpl.java?rev=707633&r1=707632&r2=707633&view=diff
==============================================================================
--- geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/shell/CommandLineExecutorImpl.java (original)
+++ geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/shell/CommandLineExecutorImpl.java Fri Oct 24 06:52:59 2008
@@ -27,28 +27,15 @@
 import org.apache.geronimo.gshell.command.Variables;
 import org.apache.geronimo.gshell.commandline.CommandLine;
 import org.apache.geronimo.gshell.commandline.CommandLineBuilder;
-import org.apache.geronimo.gshell.commandline.CommandLineExecutionFailed;
 import org.apache.geronimo.gshell.commandline.CommandLineExecutor;
-import org.apache.geronimo.gshell.io.Closer;
 import org.apache.geronimo.gshell.io.IO;
 import org.apache.geronimo.gshell.io.SystemOutputHijacker;
 import org.apache.geronimo.gshell.notification.ErrorNotification;
-import org.apache.geronimo.gshell.notification.Notification;
 import org.apache.geronimo.gshell.registry.CommandResolver;
 import org.apache.geronimo.gshell.shell.ShellContext;
-import org.apache.geronimo.gshell.shell.Shell;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PipedInputStream;
-import java.io.PipedOutputStream;
-import java.io.PrintStream;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.atomic.AtomicReference;
-
 /**
  * The default {@link CommandLineExecutor} component.
  *
@@ -119,102 +106,6 @@
         return doExecute(context, path, args);
     }
 
-    public Object execute(final ShellContext context, final Object[][] commands) throws Exception {
-        assert context != null;
-        assert commands != null;
-
-        log.info("Executing (Object[][]): {}", Arguments.asString(commands));
-
-        // Prepare IOs
-        final IO[] ios = new IO[commands.length];
-        PipedOutputStream pos = null;
-
-        IO io = context.getIo();
-
-        for (int i = 0; i < ios.length; i++) {
-            InputStream is = (i == 0) ? io.inputStream : new PipedInputStream(pos);
-            OutputStream os;
-
-            if (i == ios.length - 1) {
-                os = io.outputStream;
-            }
-            else {
-                os = pos = new PipedOutputStream();
-            }
-
-            ios[i] = new IO(is, new PrintStream(os), io.errorStream);
-        }
-
-        Thread[] threads = new Thread[commands.length];
-        final List<Throwable> errors = new CopyOnWriteArrayList<Throwable>();
-        final AtomicReference<Object> ref = new AtomicReference<Object>();
-
-        for (int i = 0; i < commands.length; i++) {
-            final int idx = i;
-
-            threads[i] = createThread(new Runnable() {
-                public void run() {
-                    try {
-                        ShellContext pipedContext = new ShellContext() {
-                            public Shell getShell() {
-                                return context.getShell();
-                            }
-
-                            public IO getIo() {
-                                return ios[idx];
-                            }
-
-                            public Variables getVariables() {
-                                return context.getVariables();
-                            }
-                        };
-
-                        Object obj = execute(pipedContext, String.valueOf(commands[idx][0]), Arguments.shift(commands[idx]));
-
-                        if (idx == commands.length - 1) {
-                            ref.set(obj);
-                        }
-                    }
-                    catch (Throwable t) {
-                        errors.add(t);
-                    }
-                    finally {
-                        if (idx > 0) {
-                            Closer.close(ios[idx].inputStream);
-                        }
-                        if (idx < commands.length - 1) {
-                            Closer.close(ios[idx].outputStream);
-                        }
-                    }
-                }
-            });
-
-            threads[i].start();
-        }
-
-        for (int i = 0; i < commands.length; i++) {
-            threads[i].join();
-        }
-
-        if (!errors.isEmpty()) {
-            Throwable t = errors.get(0);
-
-            // Always preserve the type of notication throwables, reguardless of the trace
-            if (t instanceof Notification) {
-                throw (Notification)t;
-            }
-
-            // Otherwise wrap to preserve the trace
-            throw new CommandLineExecutionFailed(t);
-        }
-
-        return ref.get();
-    }
-
-    protected Thread createThread(final Runnable task) {
-        return new Thread(task);
-    }
-
     protected Object doExecute(final ShellContext context, final String path, final Object[] args) throws Exception {
         assert context != null;