You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by jd...@apache.org on 2006/06/01 07:53:43 UTC

svn commit: r410770 - in /geronimo/sandbox/gshell/trunk: gshell-cli/src/main/java/org/apache/geronimo/gshell/cli/ gshell-commands/standard-commands/src/main/java/org/apache/geronimo/gshell/commands/standard/ gshell-core/src/main/java/org/apache/geronim...

Author: jdillon
Date: Wed May 31 22:53:41 2006
New Revision: 410770

URL: http://svn.apache.org/viewvc?rev=410770&view=rev
Log:
Use ExitNotification to signal the shell to exit instead of System.exit()
Generalized the socket server daemon

Added:
    geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/ExitNotification.java   (with props)
    geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/SocketServerDaemon.java   (contents, props changed)
      - copied, changed from r410734, geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/GShellDaemon.java
Removed:
    geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/GShellDaemon.java
Modified:
    geronimo/sandbox/gshell/trunk/gshell-cli/src/main/java/org/apache/geronimo/gshell/cli/Main.java
    geronimo/sandbox/gshell/trunk/gshell-commands/standard-commands/src/main/java/org/apache/geronimo/gshell/commands/standard/ExitCommand.java
    geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/GShell.java
    geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/InteractiveGShell.java
    geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/command/CommandSupport.java
    geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/util/Arguments.java
    geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/GShellServer.java
    geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/ServerCommand.java

Modified: geronimo/sandbox/gshell/trunk/gshell-cli/src/main/java/org/apache/geronimo/gshell/cli/Main.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-cli/src/main/java/org/apache/geronimo/gshell/cli/Main.java?rev=410770&r1=410769&r2=410770&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-cli/src/main/java/org/apache/geronimo/gshell/cli/Main.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-cli/src/main/java/org/apache/geronimo/gshell/cli/Main.java Wed May 31 22:53:41 2006
@@ -74,15 +74,15 @@
 
     private void setPropertyFrom(final String namevalue) {
         String name, value;
-        int j = namevalue.indexOf("=");
+        int i = namevalue.indexOf("=");
 
-        if (j == -1) {
+        if (i == -1) {
             name = namevalue;
-            value = "true";
+            value = Boolean.TRUE.toString();
         }
         else {
-            name = namevalue.substring(0, j);
-            value = namevalue.substring(j + 1, namevalue.length());
+            name = namevalue.substring(0, i);
+            value = namevalue.substring(i + 1, namevalue.length());
         }
         name = name.trim();
 
@@ -138,7 +138,7 @@
             formatter.printHelp(
                 io.out,
                 80, // width
-                "gshell [options] <command> [args]",
+                System.getProperty("program.name", "gshell") + " [options] <command> [args]",
                 "",
                 options,
                 4, // left pad
@@ -207,12 +207,6 @@
         // TEMP: Log some info about the terminal
         //
 
-        if (debug) {
-            log.debug("Using STDIN: " + System.in);
-            log.debug("Using STDOUT: " + System.out);
-            log.debug("Using STDERR: " + System.err);
-        }
-
         Terminal term = Terminal.getTerminal();
 
         if (debug) {
@@ -228,6 +222,8 @@
             log.debug("Started in " + watch);
         }
 
+        int status = 0;
+
         if (interactive) {
             InteractiveGShell interp = new InteractiveGShell(io, gshell);
 
@@ -239,19 +235,19 @@
             interp.run();
         }
         else {
-            int status = gshell.execute(args);
-
-            if (debug) {
-                log.debug("Ran for " + watch);
-            }
-
-            System.exit(status);
+            status = gshell.execute(args);
         }
 
         if (debug) {
             log.debug("Ran for " + watch);
         }
+
+        System.exit(status);
     }
+
+    //
+    // Bootstrap
+    //
 
     public static void main(final String[] args, final ClassWorld world) throws Exception {
         assert args != null;

Modified: geronimo/sandbox/gshell/trunk/gshell-commands/standard-commands/src/main/java/org/apache/geronimo/gshell/commands/standard/ExitCommand.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-commands/standard-commands/src/main/java/org/apache/geronimo/gshell/commands/standard/ExitCommand.java?rev=410770&r1=410769&r2=410770&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-commands/standard-commands/src/main/java/org/apache/geronimo/gshell/commands/standard/ExitCommand.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-commands/standard-commands/src/main/java/org/apache/geronimo/gshell/commands/standard/ExitCommand.java Wed May 31 22:53:41 2006
@@ -25,9 +25,11 @@
 import org.apache.geronimo.gshell.command.Command;
 import org.apache.geronimo.gshell.command.CommandSupport;
 import org.apache.geronimo.gshell.console.IO;
+import org.apache.geronimo.gshell.ExitNotification;
+import org.apache.geronimo.gshell.util.Arguments;
 
 /**
- * Exit the virtual machine.
+ * Exit the current shell.
  *
  * @version $Id$
  */
@@ -53,23 +55,18 @@
             .withDescription("Display this help message")
             .create('h'));
 
-        options.addOption(OptionBuilder.withLongOpt("code")
-            .withDescription("Use the given exit code")
-            .hasArg()
-            .create('c'));
-
         CommandLineParser parser = new PosixParser();
         CommandLine line = parser.parse(options, args);
 
         if (line.hasOption('h')) {
-            io.out.println(getName() + " -- exit the virtual machine");
+            io.out.println(getName() + " -- exit the current shell");
             io.out.println();
 
             HelpFormatter formatter = new HelpFormatter();
             formatter.printHelp(
                 io.out,
                 80, // width (FIXME: Should pull from gshell.columns variable)
-                getName() + " [options]",
+                getName() + " [options] [code]",
                 "",
                 options,
                 4, // left pad
@@ -82,14 +79,7 @@
             return Command.SUCCESS;
         }
 
-        // Get the status code to exit with
-        int exitCode = 0;
-        if (line.hasOption('c')) {
-            String value = line.getOptionValue('c');
-            exitCode = Integer.parseInt(value);
-        }
-
-        exit(exitCode);
+        exit(line.getArgs());
 
         // Should never get this far
         assert false;
@@ -97,14 +87,26 @@
         return Command.FAILURE;
     }
 
+    private void exit(final String[] args) {
+        int exitCode = 0;
+
+        if (args.length > 1) {
+            getIO().err.println("Unexpected arguments: " + Arguments.asString(args));
+        }
+        if (args.length == 1) {
+            exitCode = Integer.parseInt(args[0]);
+        }
+
+        exit(exitCode);
+    }
+
     private void exit(final int exitCode) {
+        log.info("Exiting w/code: " + exitCode);
+
         //
-        // TODO: Need to implement this with an exception notification
-        //       To allow sub-shell or sever shells to function w/o
-        //       killing the entire JVM :-(
+        // DO NOT Call System.exit() !!!
         //
 
-        log.info("Exiting w/code: " + exitCode);
-        System.exit(exitCode);
+        throw new ExitNotification(exitCode);
     }
 }

Added: geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/ExitNotification.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/ExitNotification.java?rev=410770&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/ExitNotification.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/ExitNotification.java Wed May 31 22:53:41 2006
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geronimo.gshell;
+
+import org.apache.geronimo.gshell.console.InteractiveConsole;
+import org.apache.geronimo.gshell.console.JLineConsole;
+import org.apache.geronimo.gshell.console.IO;
+
+import java.io.IOException;
+
+/**
+ * Thrown to indicate that the current shell should exit.
+ *
+ * <p>
+ * Commands should use this instead of {@link System#exit}.
+ *
+ * @version $Id$
+ */
+public class ExitNotification
+    extends Error
+{
+    private final int code;
+
+    public ExitNotification(final int code) {
+        this.code = code;
+    }
+
+    public ExitNotification() {
+        this(0);
+    }
+
+    public int getCode() {
+        return code;
+    }
+}

Propchange: geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/ExitNotification.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/ExitNotification.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/ExitNotification.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/GShell.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/GShell.java?rev=410770&r1=410769&r2=410770&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/GShell.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/GShell.java Wed May 31 22:53:41 2006
@@ -26,6 +26,7 @@
 import org.apache.geronimo.gshell.command.CommandContext;
 import org.apache.geronimo.gshell.command.Variables;
 import org.apache.geronimo.gshell.command.VariablesMap;
+import org.apache.geronimo.gshell.command.CommandException;
 import org.apache.geronimo.gshell.commandline.CommandLineBuilder;
 import org.apache.geronimo.gshell.commandline.CommandLine;
 import org.apache.geronimo.gshell.util.Arguments;
@@ -42,15 +43,23 @@
 
     private final IO io;
 
-    public GShell(final IO io) {
+    private final CommandManager commandManager;
+
+    public GShell(final IO io) throws CommandException {
         if (io == null) {
             throw new IllegalArgumentException("IO is null");
         }
 
         this.io = io;
+        
+        //
+        // HACK: DI CommandManager...  Maybe need to setup the top-level container here
+        //
+
+        this.commandManager = new CommandManager();
     }
     
-    public GShell() {
+    public GShell() throws CommandException {
         this(new IO());
     }
 
@@ -81,17 +90,13 @@
 
         boolean debug = log.isDebugEnabled();
 
-        log.info("Executing (" + commandName + "): " + java.util.Arrays.asList(args));
+        log.info("Executing (" + commandName + "): " + Arguments.asString(args));
 
         //
         // HACK: Just get something working right now
         //
 
-        //
-        // HACK: DI CommandManager...
-        //
-
-        Command cmd = new CommandManager().getCommand(commandName);
+        Command cmd = commandManager.getCommand(commandName);
 
         cmd.init(new CommandContext() {
             Variables vars = new VariablesMap();
@@ -132,7 +137,7 @@
         assert args != null;
         assert args.length > 1;
 
-        log.info("Executing (String[]): " + java.util.Arrays.asList(args));
+        log.info("Executing (String[]): " + Arguments.asString(args));
 
         return execute(args[0], Arguments.shift(args));
     }

Modified: geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/InteractiveGShell.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/InteractiveGShell.java?rev=410770&r1=410769&r2=410770&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/InteractiveGShell.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/InteractiveGShell.java Wed May 31 22:53:41 2006
@@ -23,7 +23,7 @@
 import java.io.IOException;
 
 /**
- * ???
+ * Provides the user-interaction bits for GShell.
  *
  * @version $Id$
  */
@@ -39,7 +39,12 @@
 
                     // Execute unless the line is just blank
                     if (!line.trim().equals("")) {
-                        gshell.execute(line);
+                        try {
+                            gshell.execute(line);
+                        }
+                        catch (ExitNotification n) {
+                            return Result.STOP;
+                        }
                     }
 
                     return Result.CONTINUE;

Modified: geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/command/CommandSupport.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/command/CommandSupport.java?rev=410770&r1=410769&r2=410770&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/command/CommandSupport.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/command/CommandSupport.java Wed May 31 22:53:41 2006
@@ -19,6 +19,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.geronimo.gshell.console.IO;
+import org.apache.geronimo.gshell.util.Arguments;
 
 /**
  * Provides support for {@link Command} implemenations.
@@ -29,19 +30,19 @@
     implements Command
 {
     protected Log log;
-    
+
     private String name;
 
     private CommandContext context;
-    
+
     protected CommandSupport(final String name) {
         setName(name);
     }
-    
+
     protected CommandSupport() {
         // Sub-class must call setName()
     }
-    
+
     public void setName(final String name) {
         if (name == null) {
             throw new IllegalArgumentException("Name is null");
@@ -49,10 +50,10 @@
         if (name.trim().length() == 0) {
             throw new IllegalArgumentException("Name is empty");
         }
-        
+
         this.name = name;
     }
-    
+
     public String getName() {
         if (name == null) {
             throw new IllegalStateException("Name was not set");
@@ -60,101 +61,105 @@
 
         return name;
     }
-    
+
     //
     // Life-cycle
     //
-    
+
     public final void init(final CommandContext context) {
         if (this.context != null) {
             throw new IllegalStateException("Command already initalized");
         }
-        
+
         // Initialize logging with command name
         log = LogFactory.getLog(this.getClass().getName() + "." + getName());
-        
+
         log.debug("Initializing");
-        
+
         this.context = context;
-        
+
         doInit();
     }
-    
+
     protected void doInit() {
         // Sub-class should override to provide custom initialization
     }
-    
+
     private void ensureInitialized() {
         if (context == null) {
             throw new IllegalStateException("Command has not been initialized");
         }
     }
-    
+
     public final void destroy() {
         if (this.context == null) {
             throw new IllegalStateException("Command already destroyed (or never initialized)");
         }
-        
+
         log.debug("Destroying");
-        
+
         doDestroy();
-        
+
         this.context = null;
     }
-    
+
     protected void doDestroy() {
         // Sub-class should override to provide custom cleanup
     }
-    
+
     public void abort() {
         // Sub-calss should override to allow for custom abort functionality
     }
-    
+
     //
     // Context Helpers
     //
-    
+
     protected CommandContext getCommandContext() {
         assert context != null;
-        
+
         return context;
     }
-    
+
     protected Variables getVariables() {
         return getCommandContext().getVariables();
     }
-    
+
     protected IO getIO() {
         return getCommandContext().getIO();
     }
-    
+
     //
     // Execute Helpers
     //
-    
+
     public int execute(final String... args) throws Exception {
         assert args != null;
-        
+
         // Make sure that we have been initialized before we go any further
         ensureInitialized();
 
-        log.info("Executing w/arguments: " + java.util.Arrays.asList(args));
+        log.info("Executing w/arguments: " + Arguments.asString(args));
 
         int status;
-        
+
         try {
             status = doExecute(args);
         }
         catch (Exception e) {
-            //
-            // TODO: Handle Errors here too
-            //
-            
             log.error(e.getMessage());
             if (log.isDebugEnabled()) {
-                log.debug("Failure details", e);
+                log.debug("Exception details", e);
             }
-            
+
+            status = Command.FAILURE;
+        }
+        catch (Error e) {
+            log.error(e.getMessage());
+            if (log.isDebugEnabled()) {
+                log.debug("Error details", e);
+            }
+
             status = Command.FAILURE;
         }
         finally {
@@ -166,10 +171,10 @@
 
         return status;
     }
-    
+
     protected int doExecute(final String[] args) throws Exception {
         // Sub-class should override to perform custom execution
-        
+
         return Command.FAILURE;
     }
 }

Modified: geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/util/Arguments.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/util/Arguments.java?rev=410770&r1=410769&r2=410770&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/util/Arguments.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/util/Arguments.java Wed May 31 22:53:41 2006
@@ -28,10 +28,26 @@
     }
 
     public static String[] shift(final String[] args, int pos) {
+        assert args != null;
         assert args.length >= pos;
 
         String[] _args = new String[args.length - pos];
         System.arraycopy(args, pos, _args, 0, _args.length);
         return _args;
+    }
+
+    public static String asString(final String[] args) {
+        assert args != null;
+
+        StringBuffer buff = new StringBuffer();
+
+        for (int i=0; i<args.length; i++ ) {
+            buff.append(args[i]);
+            if (i + 1 < args.length) {
+                buff.append(", ");
+            }
+        }
+
+        return buff.toString();
     }
 }

Modified: geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/GShellServer.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/GShellServer.java?rev=410770&r1=410769&r2=410770&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/GShellServer.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/GShellServer.java Wed May 31 22:53:41 2006
@@ -82,6 +82,10 @@
             // TODO: Abstract Telnet specifics; support other protocols (ie. SSH)
             //
 
+            //
+            // TODO: Need access to the Terminal... NVT4J
+            //
+
             io = new IO(new TelnetInputStream(in, out), new TelnetPrintStream(out));
             GShell shell = new GShell(io);
 

Modified: geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/ServerCommand.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/ServerCommand.java?rev=410770&r1=410769&r2=410770&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/ServerCommand.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/ServerCommand.java Wed May 31 22:53:41 2006
@@ -25,6 +25,10 @@
 import org.apache.geronimo.gshell.command.Command;
 import org.apache.geronimo.gshell.command.CommandSupport;
 import org.apache.geronimo.gshell.console.IO;
+import org.apache.geronimo.gshell.server.SocketServerDaemon.SocketHandler;
+
+import java.net.Socket;
+import java.io.IOException;
 
 /**
  * Starts a GShell server.
@@ -34,9 +38,7 @@
 public class ServerCommand
     extends CommandSupport
 {
-    private int port = GShellDaemon.DEFAULT_PORT;
-
-    private boolean background = false;
+    private int port = 5057;
 
     public ServerCommand() {
         super("server");
@@ -62,10 +64,6 @@
             .hasArg()
             .create('p'));
 
-        options.addOption(OptionBuilder.withLongOpt("background")
-            .withDescription("Run as a daemon in the background")
-            .create('b'));
-
         CommandLineParser parser = new PosixParser();
         CommandLine line = parser.parse(options, args);
 
@@ -95,22 +93,23 @@
             port = Integer.parseInt(tmp);
         }
 
-        if (line.hasOption('b')) {
-            background = true;
-        }
-
         server();
 
         return Command.SUCCESS;
     }
 
     private void server() throws Exception {
-        GShellDaemon daemon = new GShellDaemon(port, background);
+        SocketHandler handler = new SocketHandler() {
+            GShellServer server = new GShellServer();
 
-        //
-        // NOTE: Spit this out before hand, since if not --background
-        //       start() will not return right away
-        //
+            public void handle(final Socket socket) throws IOException {
+                assert socket != null;
+
+                server.service(socket);
+            }
+        };
+
+        SocketServerDaemon daemon = new SocketServerDaemon(port, handler);
 
         IO io = getIO();
         io.out.println("Listening for connections on port: " + port);

Copied: geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/SocketServerDaemon.java (from r410734, geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/GShellDaemon.java)
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/SocketServerDaemon.java?p2=geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/SocketServerDaemon.java&p1=geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/GShellDaemon.java&r1=410734&r2=410770&rev=410770&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/GShellDaemon.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/SocketServerDaemon.java Wed May 31 22:53:41 2006
@@ -22,46 +22,39 @@
 import java.net.Socket;
 import java.net.ServerSocket;
 
+import java.io.IOException;
+
 //
 // NOTE: Some bits lifted from XBean Telnet module
 //
 
 /**
- * Daemon service which listens for socket connections and
- * spawns client shells via {@link GShellServer}.
+ * Daemon service which listens for socket connections and spawns client threads.
  *
  * @version $Id$
  */
-public class GShellDaemon
+public class SocketServerDaemon
     implements Runnable
 {
-    public static final int DEFAULT_PORT = 5057;
-
-    private static final Log log = LogFactory.getLog(GShellDaemon.class);
+    private static final Log log = LogFactory.getLog(SocketServerDaemon.class);
 
-    private final GShellServer server;
+    private final SocketHandler handler;
 
     private final int port;
 
-    private boolean background;
-
     private ServerSocket serverSocket;
 
-    private boolean running = false;
+    private ThreadGroup threads = new ThreadGroup("SocketServerDaemon");
 
-    public GShellDaemon(final int port, final boolean background) {
-        this.port = port;
-        this.background = background;
-
-        this.server = new GShellServer();
-    }
+    private boolean running;
 
-    public GShellDaemon(final int port) {
-        this(port, true);
-    }
+    public SocketServerDaemon(final int port, final SocketHandler handler) {
+        if (handler == null) {
+            throw new IllegalArgumentException("Socket handler is null");
+        }
 
-    public GShellDaemon() {
-        this(DEFAULT_PORT);
+        this.port = port;
+        this.handler = handler;
     }
 
     public void start() throws Exception {
@@ -75,26 +68,21 @@
 
         serverSocket = new ServerSocket(port, 20);
         Thread d = new Thread(this);
-        d.setName("GShell Daemon@" + d.hashCode());
+        d.setName("SocketServerDaemon@" + d.hashCode());
         d.setDaemon(true);
         d.start();
 
         log.info("Started");
-
-        //
-        // FIXME: This is broken... not what I had wanted at all :-(
-        //
-
-        // Wait for one client session and then return
-        if (!background) {
-            log.debug("Waiting for job to finish");
-
-            running = false;
-            d.join();
-        }
     }
 
     public void stop() throws Exception {
+        if (!running) {
+            throw new IllegalStateException("Not started");
+        }
+
+        serverSocket.close();
+        serverSocket = null;
+
         running = false;
     }
 
@@ -105,10 +93,14 @@
 
         log.info("Starting new thread for client: " + socket);
 
-        Thread d = new Thread(new Runnable() {
+        //
+        // TODO: Maybe use a thread-pool here?
+        //
+
+        Thread d = new Thread(threads, new Runnable() {
             public void run() {
                 try {
-                    server.service(socket);
+                    handler.handle(socket);
                 }
                 catch (Throwable e) {
                     log.error("Service failure", e);
@@ -126,11 +118,15 @@
             }
         });
 
-        d.setName("GShell@" + d.hashCode());
+        d.setName("SocketHandler@" + d.hashCode());
         d.setDaemon(true);
         d.start();
     }
 
+    //
+    // Runnable
+    //
+
     public void run() {
         log.info("Listening for connections on port: " + port);
 
@@ -147,5 +143,24 @@
                 log.error("Unexpected; ignoring", t);
             }
         }
+    }
+
+    //
+    // SocketHandler
+    //
+
+    /**
+     * Allows custom processing for client socket connections.
+     */
+    public static interface SocketHandler
+    {
+        /**
+         * Handle the client socket.
+         *
+         * @param socket    The client socket; never null
+         *
+         * @throws IOException
+         */
+        void handle(Socket socket) throws IOException;
     }
 }

Propchange: geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/SocketServerDaemon.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/SocketServerDaemon.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-server/src/main/java/org/apache/geronimo/gshell/server/SocketServerDaemon.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain