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 2007/09/18 00:27:59 UTC

svn commit: r576612 [1/2] - in /geronimo/sandbox/gshell/trunk/gshell-remote: gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/ gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/ gshell-remote-common/src/mai...

Author: jdillon
Date: Mon Sep 17 15:27:55 2007
New Revision: 576612

URL: http://svn.apache.org/viewvc?rev=576612&view=rev
Log:
Refactored to abstract the transport impl

Added:
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClientFactory.java
      - copied, changed from r575934, geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClient.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/filter/
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/filter/AuthenticationFilter.java   (contents, props changed)
      - copied, changed from r575934, geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-server/src/main/java/org/apache/geronimo/gshell/remote/server/AuthenticationFilter.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/filter/LoggingFilter.java   (with props)
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/Transport.java
      - copied, changed from r575934, geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/RshProtocolHandlerSupport.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportFactory.java   (with props)
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportFactoryLocator.java   (with props)
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportServer.java   (with props)
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/package-info.java   (with props)
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransport.java   (with props)
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransportFactory.java   (with props)
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransportServer.java   (with props)
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/package-info.java   (with props)
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpClientMessageVisitor.java
      - copied, changed from r575934, geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClientMessageVisitor.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpProtocolHandler.java
      - copied, changed from r575934, geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/RshProtocolHandlerSupport.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpServerMessageVisitor.java
      - copied, changed from r575934, geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-server/src/main/java/org/apache/geronimo/gshell/remote/server/RshServerMessageVisitor.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransport.java   (with props)
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransportFactory.java   (with props)
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransportServer.java   (with props)
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/package-info.java   (with props)
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-server/src/main/java/org/apache/geronimo/gshell/remote/server/RshServerFactory.java   (with props)
Removed:
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClientMessageVisitor.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClientProtocolHandler.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/RshProtocolHandlerSupport.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-server/src/main/java/org/apache/geronimo/gshell/remote/server/AuthenticationFilter.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-server/src/main/java/org/apache/geronimo/gshell/remote/server/RshServerMessageVisitor.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-server/src/main/java/org/apache/geronimo/gshell/remote/server/RshServerProtocolHandler.java
Modified:
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClient.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshCommand.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-server/src/main/java/org/apache/geronimo/gshell/remote/server/RshServer.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-server/src/main/java/org/apache/geronimo/gshell/remote/server/RshServerCommand.java

Modified: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClient.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClient.java?rev=576612&r1=576611&r2=576612&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClient.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClient.java Mon Sep 17 15:27:55 2007
@@ -21,34 +21,13 @@
 
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.net.InetSocketAddress;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
+import java.net.URI;
 
-import org.apache.geronimo.gshell.remote.RshProtocolHandlerSupport;
 import org.apache.geronimo.gshell.remote.message.EchoMessage;
 import org.apache.geronimo.gshell.remote.message.HandShakeMessage;
 import org.apache.geronimo.gshell.remote.message.Message;
-import org.apache.geronimo.gshell.remote.message.MessageCodecFactory;
-import org.apache.geronimo.gshell.remote.ssl.BogusSSLContextFactory;
-import org.apache.mina.common.ConnectFuture;
-import org.apache.mina.common.DefaultIoFilterChainBuilder;
-import org.apache.mina.common.IoEventType;
-import org.apache.mina.common.IoHandler;
-import org.apache.mina.common.IoSession;
-import org.apache.mina.common.WriteFuture;
-import org.apache.mina.filter.codec.ProtocolCodecFilter;
-import org.apache.mina.filter.logging.LoggingFilter;
-import org.apache.mina.filter.reqres.Request;
-import org.apache.mina.filter.reqres.RequestResponseFilter;
-import org.apache.mina.filter.reqres.Response;
-import org.apache.mina.filter.ssl.SSLFilter;
-import org.apache.mina.transport.socket.nio.SocketConnector;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.InstantiationStrategy;
-import org.codehaus.plexus.component.annotations.Requirement;
+import org.apache.geronimo.gshell.remote.transport.Transport;
+import org.apache.geronimo.gshell.remote.transport.TransportFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -57,156 +36,44 @@
  *
  * @version $Rev$ $Date$
  */
-@Component(role=RshClient.class, instantiationStrategy=InstantiationStrategy.PER_LOOKUP)
 public class RshClient
 {
-    public static final int CONNECT_TIMEOUT = 3000;
-    
-    private Logger log = LoggerFactory.getLogger(getClass());
+    private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Requirement(role=IoHandler.class, hint="rsh-client")
-    private RshClientProtocolHandler handler;
+    private final Transport transport;
 
-    private boolean ssl = true;
-    
-    private InetSocketAddress address;
+    public RshClient(final URI location, final TransportFactory factory) throws Exception {
+        assert location != null;
+        assert factory != null;
 
-    private SocketConnector connector;
-
-    private IoSession session;
-
-    private boolean connected = false;
-
-    public void connect(final String hostname, final int port) throws Exception {
-        if (connected) {
-            throw new IllegalStateException("Already connected");
-        }
-
-        address = new InetSocketAddress(hostname, port);
-
-        handler.setVisitor(new RshClientMessageVisitor());
-
-        ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1);
-        connector = new SocketConnector(Runtime.getRuntime().availableProcessors(), executor);
-        
-        connector.setConnectTimeout(30);
-        connector.setHandler(handler);
-
-        DefaultIoFilterChainBuilder filterChain = connector.getFilterChain();
-
-        LoggingFilter loggingFilter = new LoggingFilter();
-        loggingFilter.setLogLevel(IoEventType.EXCEPTION_CAUGHT, LoggingFilter.WARN);
-        loggingFilter.setLogLevel(IoEventType.WRITE, LoggingFilter.TRACE);
-        loggingFilter.setLogLevel(IoEventType.MESSAGE_RECEIVED, LoggingFilter.TRACE);
-        loggingFilter.setLogLevel(IoEventType.MESSAGE_SENT, LoggingFilter.TRACE);
-        loggingFilter.setLogLevel(IoEventType.SESSION_CLOSED, LoggingFilter.DEBUG);
-        loggingFilter.setLogLevel(IoEventType.SESSION_CREATED, LoggingFilter.DEBUG);
-        loggingFilter.setLogLevel(IoEventType.SESSION_IDLE, LoggingFilter.DEBUG);
-        loggingFilter.setLogLevel(IoEventType.SESSION_OPENED, LoggingFilter.DEBUG);
-        filterChain.addLast("logger", loggingFilter);
-
-        filterChain.addLast("protocol", new ProtocolCodecFilter(new MessageCodecFactory()));
-
-        ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors());
-
-        filterChain.addLast("reqres", new RequestResponseFilter(handler.getResponseInspector(), scheduler));
-
-        if (ssl) {
-            SSLFilter sslFilter = new SSLFilter(BogusSSLContextFactory.getInstance(false));
-            sslFilter.setUseClientMode(true);
-            
-            filterChain.addFirst("ssl", sslFilter);
-        }
-
-        log.info("Connecting to: {}", address);
-
-        ConnectFuture cf = connector.connect(address);
-        if (cf.awaitUninterruptibly(CONNECT_TIMEOUT)) {
-             session = cf.getSession();
-        }
-        else {
-            throw new RuntimeException("Failed to connect");
-        }
-
-        log.info("Connected");
-        
-        connected = true;
-    }
-
-    public boolean isConnected() {
-        return connected;
-    }
-    
-    private void ensureConnected() {
-        if (!connected) {
-            throw new IllegalStateException("Not connected");
-        }
-
-        if (!session.isConnected()) {
-            throw new IllegalStateException("Session not connected");
-        }
-
-        if (session.isClosing()) {
-            throw new IllegalStateException("Session is closing");
-        }
+        transport = factory.connect(location);
     }
 
-    public void echo(final String text) {
-        ensureConnected();
-
+    public void echo(final String text) throws Exception {
         log.debug("Echoing: {}", text);
 
-        WriteFuture wf = session.write(new EchoMessage(text));
-
-        wf.awaitUninterruptibly();
-
-        if (!wf.isWritten()) {
-            log.error("Failed to send request; session did not fully write the message");
-        }
-    }
-
-    protected Response request(final Message msg, final long timeout, final TimeUnit unit) throws InterruptedException {
-        Request req = new Request(msg.getId(), msg, timeout, unit);
-
-        WriteFuture wf = session.write(req);
-        wf.awaitUninterruptibly();
-
-        if (!wf.isWritten()) {
-            log.error("Failed to send request; session did not fully write the message");
-        }
-
-        return req.awaitResponse();
+        transport.send(new EchoMessage(text));
     }
 
     public void handshake() throws Exception {
-        ensureConnected();
-
         log.info("Starting handshake");
-        
-        HandShakeMessage msg = new HandShakeMessage();
 
-        Response resp = request(msg, 5, TimeUnit.SECONDS);
+        Message resp = transport.request(new HandShakeMessage());
 
-        log.info("Response: {}", resp.getMessage());
+        log.info("Response: {}", resp);
     }
 
     public InputStream getInputStream() {
-        return (InputStream) session.getAttribute(RshProtocolHandlerSupport.INPUT_STREAM);
+        return transport.getInputStream();
     }
 
     public OutputStream getOutputStream() {
-        return (OutputStream) session.getAttribute(RshProtocolHandlerSupport.OUTPUT_STREAM);
+        return transport.getOutputStream();
     }
 
     public void close() {
-        if (isConnected()) {
-            session.close().awaitUninterruptibly();
-            
-            session = null;
-            connector = null;
-            address = null;
-            
-            connected = false;
-        }
+        transport.close();
+
+        log.debug("Closed");
     }
 }

Copied: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClientFactory.java (from r575934, geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClient.java)
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClientFactory.java?p2=geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClientFactory.java&p1=geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClient.java&r1=575934&r2=576612&rev=576612&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClient.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClientFactory.java Mon Sep 17 15:27:55 2007
@@ -19,194 +19,27 @@
 
 package org.apache.geronimo.gshell.remote.client;
 
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetSocketAddress;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
+import java.net.URI;
 
-import org.apache.geronimo.gshell.remote.RshProtocolHandlerSupport;
-import org.apache.geronimo.gshell.remote.message.EchoMessage;
-import org.apache.geronimo.gshell.remote.message.HandShakeMessage;
-import org.apache.geronimo.gshell.remote.message.Message;
-import org.apache.geronimo.gshell.remote.message.MessageCodecFactory;
-import org.apache.geronimo.gshell.remote.ssl.BogusSSLContextFactory;
-import org.apache.mina.common.ConnectFuture;
-import org.apache.mina.common.DefaultIoFilterChainBuilder;
-import org.apache.mina.common.IoEventType;
-import org.apache.mina.common.IoHandler;
-import org.apache.mina.common.IoSession;
-import org.apache.mina.common.WriteFuture;
-import org.apache.mina.filter.codec.ProtocolCodecFilter;
-import org.apache.mina.filter.logging.LoggingFilter;
-import org.apache.mina.filter.reqres.Request;
-import org.apache.mina.filter.reqres.RequestResponseFilter;
-import org.apache.mina.filter.reqres.Response;
-import org.apache.mina.filter.ssl.SSLFilter;
-import org.apache.mina.transport.socket.nio.SocketConnector;
+import org.apache.geronimo.gshell.remote.transport.TransportFactory;
+import org.apache.geronimo.gshell.remote.transport.TransportFactoryLocator;
 import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.InstantiationStrategy;
 import org.codehaus.plexus.component.annotations.Requirement;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * ???
  *
  * @version $Rev$ $Date$
  */
-@Component(role=RshClient.class, instantiationStrategy=InstantiationStrategy.PER_LOOKUP)
-public class RshClient
+@Component(role=RshClientFactory.class)
+public class RshClientFactory
 {
-    public static final int CONNECT_TIMEOUT = 3000;
-    
-    private Logger log = LoggerFactory.getLogger(getClass());
+    @Requirement
+    private TransportFactoryLocator locator;
 
-    @Requirement(role=IoHandler.class, hint="rsh-client")
-    private RshClientProtocolHandler handler;
+    public RshClient connect(final URI location) throws Exception {
+        TransportFactory factory = locator.locate(location);
 
-    private boolean ssl = true;
-    
-    private InetSocketAddress address;
-
-    private SocketConnector connector;
-
-    private IoSession session;
-
-    private boolean connected = false;
-
-    public void connect(final String hostname, final int port) throws Exception {
-        if (connected) {
-            throw new IllegalStateException("Already connected");
-        }
-
-        address = new InetSocketAddress(hostname, port);
-
-        handler.setVisitor(new RshClientMessageVisitor());
-
-        ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1);
-        connector = new SocketConnector(Runtime.getRuntime().availableProcessors(), executor);
-        
-        connector.setConnectTimeout(30);
-        connector.setHandler(handler);
-
-        DefaultIoFilterChainBuilder filterChain = connector.getFilterChain();
-
-        LoggingFilter loggingFilter = new LoggingFilter();
-        loggingFilter.setLogLevel(IoEventType.EXCEPTION_CAUGHT, LoggingFilter.WARN);
-        loggingFilter.setLogLevel(IoEventType.WRITE, LoggingFilter.TRACE);
-        loggingFilter.setLogLevel(IoEventType.MESSAGE_RECEIVED, LoggingFilter.TRACE);
-        loggingFilter.setLogLevel(IoEventType.MESSAGE_SENT, LoggingFilter.TRACE);
-        loggingFilter.setLogLevel(IoEventType.SESSION_CLOSED, LoggingFilter.DEBUG);
-        loggingFilter.setLogLevel(IoEventType.SESSION_CREATED, LoggingFilter.DEBUG);
-        loggingFilter.setLogLevel(IoEventType.SESSION_IDLE, LoggingFilter.DEBUG);
-        loggingFilter.setLogLevel(IoEventType.SESSION_OPENED, LoggingFilter.DEBUG);
-        filterChain.addLast("logger", loggingFilter);
-
-        filterChain.addLast("protocol", new ProtocolCodecFilter(new MessageCodecFactory()));
-
-        ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors());
-
-        filterChain.addLast("reqres", new RequestResponseFilter(handler.getResponseInspector(), scheduler));
-
-        if (ssl) {
-            SSLFilter sslFilter = new SSLFilter(BogusSSLContextFactory.getInstance(false));
-            sslFilter.setUseClientMode(true);
-            
-            filterChain.addFirst("ssl", sslFilter);
-        }
-
-        log.info("Connecting to: {}", address);
-
-        ConnectFuture cf = connector.connect(address);
-        if (cf.awaitUninterruptibly(CONNECT_TIMEOUT)) {
-             session = cf.getSession();
-        }
-        else {
-            throw new RuntimeException("Failed to connect");
-        }
-
-        log.info("Connected");
-        
-        connected = true;
-    }
-
-    public boolean isConnected() {
-        return connected;
-    }
-    
-    private void ensureConnected() {
-        if (!connected) {
-            throw new IllegalStateException("Not connected");
-        }
-
-        if (!session.isConnected()) {
-            throw new IllegalStateException("Session not connected");
-        }
-
-        if (session.isClosing()) {
-            throw new IllegalStateException("Session is closing");
-        }
-    }
-
-    public void echo(final String text) {
-        ensureConnected();
-
-        log.debug("Echoing: {}", text);
-
-        WriteFuture wf = session.write(new EchoMessage(text));
-
-        wf.awaitUninterruptibly();
-
-        if (!wf.isWritten()) {
-            log.error("Failed to send request; session did not fully write the message");
-        }
-    }
-
-    protected Response request(final Message msg, final long timeout, final TimeUnit unit) throws InterruptedException {
-        Request req = new Request(msg.getId(), msg, timeout, unit);
-
-        WriteFuture wf = session.write(req);
-        wf.awaitUninterruptibly();
-
-        if (!wf.isWritten()) {
-            log.error("Failed to send request; session did not fully write the message");
-        }
-
-        return req.awaitResponse();
-    }
-
-    public void handshake() throws Exception {
-        ensureConnected();
-
-        log.info("Starting handshake");
-        
-        HandShakeMessage msg = new HandShakeMessage();
-
-        Response resp = request(msg, 5, TimeUnit.SECONDS);
-
-        log.info("Response: {}", resp.getMessage());
-    }
-
-    public InputStream getInputStream() {
-        return (InputStream) session.getAttribute(RshProtocolHandlerSupport.INPUT_STREAM);
-    }
-
-    public OutputStream getOutputStream() {
-        return (OutputStream) session.getAttribute(RshProtocolHandlerSupport.OUTPUT_STREAM);
-    }
-
-    public void close() {
-        if (isConnected()) {
-            session.close().awaitUninterruptibly();
-            
-            session = null;
-            connector = null;
-            address = null;
-            
-            connected = false;
-        }
+        return new RshClient(location, factory);
     }
 }

Modified: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshCommand.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshCommand.java?rev=576612&r1=576611&r2=576612&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshCommand.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshCommand.java Mon Sep 17 15:27:55 2007
@@ -24,6 +24,7 @@
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.PrintWriter;
+import java.net.URI;
 import java.util.Date;
 
 import org.apache.geronimo.gshell.command.CommandSupport;
@@ -39,20 +40,20 @@
 public class RshCommand
     extends CommandSupport
 {
-    //
-    // TODO: Use a URI
-    //
-    
-    private String hostname = "localhost";
-
-    private int port = 9999;
-
     @Requirement
+    private RshClientFactory factory;
+
     private RshClient client;
 
     protected Object doExecute() throws Exception {
-        client.connect(hostname, port);
+        URI location = new URI("ssl://localhost:9999");
+
+        io.out.println("Connecting to: " + location);
+
+        client = factory.connect(location);
 
+        io.out.println("Connected");
+        
         client.echo("TESTING");
 
         client.handshake();

Copied: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/filter/AuthenticationFilter.java (from r575934, geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-server/src/main/java/org/apache/geronimo/gshell/remote/server/AuthenticationFilter.java)
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/filter/AuthenticationFilter.java?p2=geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/filter/AuthenticationFilter.java&p1=geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-server/src/main/java/org/apache/geronimo/gshell/remote/server/AuthenticationFilter.java&r1=575934&r2=576612&rev=576612&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-server/src/main/java/org/apache/geronimo/gshell/remote/server/AuthenticationFilter.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/filter/AuthenticationFilter.java Mon Sep 17 15:27:55 2007
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.geronimo.gshell.remote.server;
+package org.apache.geronimo.gshell.remote.filter;
 
 import org.apache.mina.common.IoFilterAdapter;
 import org.slf4j.Logger;

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/filter/AuthenticationFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/filter/AuthenticationFilter.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/filter/AuthenticationFilter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/filter/LoggingFilter.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/filter/LoggingFilter.java?rev=576612&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/filter/LoggingFilter.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/filter/LoggingFilter.java Mon Sep 17 15:27:55 2007
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.remote.filter;
+
+import java.net.URI;
+import java.io.IOException;
+
+import org.codehaus.plexus.component.annotations.Component;
+import org.apache.mina.common.IoEventType;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+public class LoggingFilter
+    extends org.apache.mina.filter.logging.LoggingFilter
+{
+    public LoggingFilter() {
+        setLogLevel(IoEventType.EXCEPTION_CAUGHT, org.apache.mina.filter.logging.LoggingFilter.WARN);
+        setLogLevel(IoEventType.WRITE, org.apache.mina.filter.logging.LoggingFilter.TRACE);
+        setLogLevel(IoEventType.MESSAGE_RECEIVED, org.apache.mina.filter.logging.LoggingFilter.TRACE);
+        setLogLevel(IoEventType.MESSAGE_SENT, org.apache.mina.filter.logging.LoggingFilter.TRACE);
+        setLogLevel(IoEventType.SESSION_CLOSED, org.apache.mina.filter.logging.LoggingFilter.DEBUG);
+        setLogLevel(IoEventType.SESSION_CREATED, org.apache.mina.filter.logging.LoggingFilter.DEBUG);
+        setLogLevel(IoEventType.SESSION_IDLE, org.apache.mina.filter.logging.LoggingFilter.DEBUG);
+        setLogLevel(IoEventType.SESSION_OPENED, org.apache.mina.filter.logging.LoggingFilter.DEBUG);
+    }
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/filter/LoggingFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/filter/LoggingFilter.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/filter/LoggingFilter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/Transport.java (from r575934, geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/RshProtocolHandlerSupport.java)
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/Transport.java?p2=geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/Transport.java&p1=geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/RshProtocolHandlerSupport.java&r1=575934&r2=576612&rev=576612&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/RshProtocolHandlerSupport.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/Transport.java Mon Sep 17 15:27:55 2007
@@ -17,143 +17,35 @@
  * under the License.
  */
 
-package org.apache.geronimo.gshell.remote;
+package org.apache.geronimo.gshell.remote.transport;
+
+import java.io.InputStream;
+import java.io.OutputStream;
 
 import org.apache.geronimo.gshell.remote.message.Message;
-import org.apache.geronimo.gshell.remote.message.MessageResponseInspector;
-import org.apache.geronimo.gshell.remote.message.MessageVisitor;
-import org.apache.geronimo.gshell.remote.stream.IoSessionInputStream;
-import org.apache.geronimo.gshell.remote.stream.IoSessionOutputStream;
-import org.apache.mina.common.IdleStatus;
-import org.apache.mina.common.IoHandler;
-import org.apache.mina.common.IoSession;
-import org.apache.mina.filter.reqres.Request;
-import org.apache.mina.filter.reqres.Response;
-import org.apache.mina.filter.reqres.ResponseInspector;
-import org.codehaus.plexus.util.IOUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * ???
  *
  * @version $Rev$ $Date$
  */
-public abstract class RshProtocolHandlerSupport
-    implements IoHandler
+public interface Transport
 {
-    public static final String STREAM_BASENAME = "org.apache.geronimo.gshell.remote.stream.";
-
-    public static final String INPUT_STREAM = STREAM_BASENAME + "IN";
-
-    public static final String OUTPUT_STREAM = STREAM_BASENAME + "OUT";
-
-    public static final String ERROR_STREAM = STREAM_BASENAME + "ERR";
-
-    protected Logger log = LoggerFactory.getLogger(getClass());
-
-    protected MessageVisitor visitor;
-
-    protected MessageResponseInspector responseInspector = new MessageResponseInspector(); 
-
-    public MessageVisitor getVisitor() {
-        return visitor;
-    }
-
-    public void setVisitor(final MessageVisitor visitor) {
-        this.visitor = visitor;
-    }
-
-    public MessageResponseInspector getResponseInspector() {
-        return responseInspector;
-    }
-    
-    public void messageReceived(final IoSession session, final Object message) throws Exception {
-        assert session != null;
-        assert message != null;
-
-        if (message instanceof Message) {
-            Message msg = (Message)message;
-
-            if (visitor != null) {
-                msg.setAttachment(session);
-                msg.process(visitor);
-            }
-        }
-        else if (message instanceof Response) {
-            Response resp = (Response)message;
-
-            Request req = resp.getRequest();
-
-            responseInspector.deregister(req);
-        }
-        else {
-            log.error("Unhandled message: {}", message);
-        }
-    }
-
-    //
-    // IoHandler
-    //
-
-    public void sessionCreated(final IoSession session) throws Exception {
-        log.info("Session created: {}", session);
-    }
-
-    public void sessionOpened(final IoSession session) throws Exception {
-        log.info("Session opened: {}", session);
-
-        IoSessionInputStream in = new IoSessionInputStream();
-        session.setAttribute(INPUT_STREAM, in);
-
-        IoSessionOutputStream out = new IoSessionOutputStream(session);
-        session.setAttribute(OUTPUT_STREAM, out);
-
-        //
-        // TODO: Add err
-        //
-    }
-
-    public void sessionClosed(final IoSession session) throws Exception {
-        log.info("Session closed: {}", session);
-
-        IoSessionInputStream in = (IoSessionInputStream) session.getAttribute(INPUT_STREAM);
-        IOUtil.close(in);
-
-        IoSessionOutputStream out = (IoSessionOutputStream) session.getAttribute(OUTPUT_STREAM);
-        IOUtil.close(out);
-
-        //
-        // TODO: Add err
-        //
-    }
+    String STREAM_BASENAME = "org.apache.geronimo.gshell.remote.stream.";
 
-    public void sessionIdle(final IoSession session, final IdleStatus status) throws Exception {
-        log.info("Session idle: {}, status: {}", session, status);
+    String INPUT_STREAM = STREAM_BASENAME + "IN";
 
-        /*
-        if (status == IdleStatus.READER_IDLE) {
-            throw new SocketTimeoutException("Read timeout");
-        }
-        */
-    }
+    String OUTPUT_STREAM = STREAM_BASENAME + "OUT";
 
-    public void exceptionCaught(final IoSession session, final Throwable cause) throws Exception {
-        assert session != null;
-        assert cause != null;
+    String ERROR_STREAM = STREAM_BASENAME + "ERR";
 
-        log.error("Unhandled error: " + cause, cause);
+    void send(Message msg) throws Exception;
 
-        session.close();
-    }
+    Message request(Message msg) throws Exception;
 
-    public void messageSent(final IoSession session, final Object message) throws Exception {
-        log.info("Message sent: {}", message);
+    InputStream getInputStream();
 
-        if (message instanceof Request) {
-            Request req = (Request) message;
+    OutputStream getOutputStream();
 
-            responseInspector.register(req);
-        }
-    }
+    void close();
 }

Added: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportFactory.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportFactory.java?rev=576612&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportFactory.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportFactory.java Mon Sep 17 15:27:55 2007
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.remote.transport;
+
+import java.net.URI;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+public interface TransportFactory
+{
+    Transport connect(final URI location) throws Exception;
+
+    TransportServer bind(final URI location) throws Exception;
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportFactory.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportFactory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportFactoryLocator.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportFactoryLocator.java?rev=576612&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportFactoryLocator.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportFactoryLocator.java Mon Sep 17 15:27:55 2007
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.remote.transport;
+
+import java.net.URI;
+
+import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.annotations.Requirement;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+@Component(role=TransportFactoryLocator.class)
+public class TransportFactoryLocator
+{
+    @Requirement
+    private PlexusContainer container;
+
+    public TransportFactory locate(final URI location) throws Exception {
+        assert location != null;
+
+        String scheme = location.getScheme();
+        if (scheme == null) {
+            throw new Exception("Invalid location; missing scheme: " + location);
+        }
+
+        TransportFactory factory = (TransportFactory) container.lookup(TransportFactory.class, scheme);
+
+        return factory;
+    }
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportFactoryLocator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportFactoryLocator.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportFactoryLocator.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportServer.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportServer.java?rev=576612&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportServer.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportServer.java Mon Sep 17 15:27:55 2007
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.remote.transport;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+public interface TransportServer
+{
+    void close();
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportServer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportServer.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/TransportServer.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/package-info.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/package-info.java?rev=576612&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/package-info.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/package-info.java Mon Sep 17 15:27:55 2007
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+package org.apache.geronimo.gshell.remote.transport;
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/package-info.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/package-info.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/package-info.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransport.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransport.java?rev=576612&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransport.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransport.java Mon Sep 17 15:27:55 2007
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.remote.transport.ssl;
+
+import java.net.URI;
+
+import org.apache.geronimo.gshell.remote.transport.tcp.TcpTransport;
+import org.apache.geronimo.gshell.remote.ssl.BogusSSLContextFactory;
+import org.apache.mina.common.DefaultIoFilterChainBuilder;
+import org.apache.mina.filter.ssl.SSLFilter;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+public class SslTransport
+    extends TcpTransport
+{
+    public SslTransport(final URI remote, final URI local) throws Exception {
+        super(remote, local);
+    }
+
+    protected void init() throws Exception {
+        super.init();
+
+        DefaultIoFilterChainBuilder filterChain = connector.getFilterChain();
+
+        //
+        // TODO: Get the SSL context factory injected
+        //
+        
+        SSLFilter sslFilter = new SSLFilter(BogusSSLContextFactory.getInstance(false));
+        sslFilter.setUseClientMode(true);
+
+        filterChain.addFirst("ssl", sslFilter);
+    }
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransport.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransport.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransport.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransportFactory.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransportFactory.java?rev=576612&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransportFactory.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransportFactory.java Mon Sep 17 15:27:55 2007
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.remote.transport.ssl;
+
+import java.net.URI;
+
+import org.apache.geronimo.gshell.remote.transport.TransportFactory;
+import org.apache.geronimo.gshell.remote.transport.tcp.TcpTransport;
+import org.apache.geronimo.gshell.remote.transport.tcp.TcpTransportFactory;
+import org.apache.geronimo.gshell.remote.transport.tcp.TcpTransportServer;
+import org.codehaus.plexus.component.annotations.Component;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+@Component(role=TransportFactory.class, hint="ssl")
+public class SslTransportFactory
+    extends TcpTransportFactory
+{
+    protected TcpTransport createTcpTransport(final URI location) throws Exception {
+        return new SslTransport(location, null);
+    }
+
+    protected TcpTransportServer createTransportServer(final URI location) throws Exception {
+        return new SslTransportServer(location);
+    }
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransportFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransportFactory.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransportFactory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransportServer.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransportServer.java?rev=576612&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransportServer.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransportServer.java Mon Sep 17 15:27:55 2007
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.remote.transport.ssl;
+
+import java.net.URI;
+
+import org.apache.geronimo.gshell.remote.transport.tcp.TcpTransportServer;
+import org.apache.geronimo.gshell.remote.ssl.BogusSSLContextFactory;
+import org.apache.mina.filter.ssl.SSLFilter;
+import org.apache.mina.common.DefaultIoFilterChainBuilder;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+public class SslTransportServer
+    extends TcpTransportServer
+{
+    public SslTransportServer(final URI location) throws Exception {
+        super(location);
+    }
+
+    protected void init() throws Exception {
+        super.init();
+        
+        DefaultIoFilterChainBuilder filterChain = acceptor.getFilterChain();
+
+        //
+        // TODO: Get the SSL context factory injected
+        //
+        
+        SSLFilter sslFilter = new SSLFilter(BogusSSLContextFactory.getInstance(true));
+        filterChain.addFirst("ssl", sslFilter);
+    }
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransportServer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransportServer.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/SslTransportServer.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/package-info.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/package-info.java?rev=576612&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/package-info.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/package-info.java Mon Sep 17 15:27:55 2007
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+package org.apache.geronimo.gshell.remote.transport.ssl;
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/package-info.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/package-info.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/ssl/package-info.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpClientMessageVisitor.java (from r575934, geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClientMessageVisitor.java)
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpClientMessageVisitor.java?p2=geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpClientMessageVisitor.java&p1=geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClientMessageVisitor.java&r1=575934&r2=576612&rev=576612&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-client/src/main/java/org/apache/geronimo/gshell/remote/client/RshClientMessageVisitor.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpClientMessageVisitor.java Mon Sep 17 15:27:55 2007
@@ -17,14 +17,15 @@
  * under the License.
  */
 
-package org.apache.geronimo.gshell.remote.client;
+package org.apache.geronimo.gshell.remote.transport.tcp;
 
-import org.apache.geronimo.gshell.remote.RshProtocolHandlerSupport;
 import org.apache.geronimo.gshell.remote.message.EchoMessage;
 import org.apache.geronimo.gshell.remote.message.MessageVisitorAdapter;
 import org.apache.geronimo.gshell.remote.message.WriteStreamMessage;
 import org.apache.geronimo.gshell.remote.stream.IoSessionInputStream;
+import org.apache.geronimo.gshell.remote.transport.Transport;
 import org.apache.mina.common.IoSession;
+import org.codehaus.plexus.component.annotations.Component;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -33,11 +34,12 @@
  *
  * @version $Rev$ $Date$
  */
-public class RshClientMessageVisitor
+@Component(role=TcpClientMessageVisitor.class)
+public class TcpClientMessageVisitor
     extends MessageVisitorAdapter
 {
     private Logger log = LoggerFactory.getLogger(getClass());
-    
+
     public void visitEcho(final EchoMessage msg) {
         assert msg != null;
 
@@ -51,7 +53,7 @@
         assert session != null;
 
         // Look up the bound stream in the session context
-        String key = RshProtocolHandlerSupport.STREAM_BASENAME + msg.getName();
+        String key = Transport.STREAM_BASENAME + msg.getName();
         Object stream = session.getAttribute(key);
 
         // For now lets not toss any exceptions or send back any fault messages

Copied: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpProtocolHandler.java (from r575934, geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/RshProtocolHandlerSupport.java)
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpProtocolHandler.java?p2=geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpProtocolHandler.java&p1=geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/RshProtocolHandlerSupport.java&r1=575934&r2=576612&rev=576612&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/RshProtocolHandlerSupport.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpProtocolHandler.java Mon Sep 17 15:27:55 2007
@@ -17,19 +17,20 @@
  * under the License.
  */
 
-package org.apache.geronimo.gshell.remote;
+package org.apache.geronimo.gshell.remote.transport.tcp;
 
 import org.apache.geronimo.gshell.remote.message.Message;
 import org.apache.geronimo.gshell.remote.message.MessageResponseInspector;
 import org.apache.geronimo.gshell.remote.message.MessageVisitor;
 import org.apache.geronimo.gshell.remote.stream.IoSessionInputStream;
 import org.apache.geronimo.gshell.remote.stream.IoSessionOutputStream;
+import org.apache.geronimo.gshell.remote.transport.Transport;
 import org.apache.mina.common.IdleStatus;
 import org.apache.mina.common.IoHandler;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.filter.reqres.Request;
 import org.apache.mina.filter.reqres.Response;
-import org.apache.mina.filter.reqres.ResponseInspector;
+import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.util.IOUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -39,22 +40,15 @@
  *
  * @version $Rev$ $Date$
  */
-public abstract class RshProtocolHandlerSupport
+@Component(role=TcpProtocolHandler.class)
+public class TcpProtocolHandler
     implements IoHandler
 {
-    public static final String STREAM_BASENAME = "org.apache.geronimo.gshell.remote.stream.";
-
-    public static final String INPUT_STREAM = STREAM_BASENAME + "IN";
-
-    public static final String OUTPUT_STREAM = STREAM_BASENAME + "OUT";
-
-    public static final String ERROR_STREAM = STREAM_BASENAME + "ERR";
-
     protected Logger log = LoggerFactory.getLogger(getClass());
 
     protected MessageVisitor visitor;
 
-    protected MessageResponseInspector responseInspector = new MessageResponseInspector(); 
+    protected MessageResponseInspector responseInspector = new MessageResponseInspector();
 
     public MessageVisitor getVisitor() {
         return visitor;
@@ -67,7 +61,7 @@
     public MessageResponseInspector getResponseInspector() {
         return responseInspector;
     }
-    
+
     public void messageReceived(final IoSession session, final Object message) throws Exception {
         assert session != null;
         assert message != null;
@@ -104,10 +98,10 @@
         log.info("Session opened: {}", session);
 
         IoSessionInputStream in = new IoSessionInputStream();
-        session.setAttribute(INPUT_STREAM, in);
+        session.setAttribute(Transport.INPUT_STREAM, in);
 
         IoSessionOutputStream out = new IoSessionOutputStream(session);
-        session.setAttribute(OUTPUT_STREAM, out);
+        session.setAttribute(Transport.OUTPUT_STREAM, out);
 
         //
         // TODO: Add err
@@ -117,10 +111,10 @@
     public void sessionClosed(final IoSession session) throws Exception {
         log.info("Session closed: {}", session);
 
-        IoSessionInputStream in = (IoSessionInputStream) session.getAttribute(INPUT_STREAM);
+        IoSessionInputStream in = (IoSessionInputStream) session.getAttribute(Transport.INPUT_STREAM);
         IOUtil.close(in);
 
-        IoSessionOutputStream out = (IoSessionOutputStream) session.getAttribute(OUTPUT_STREAM);
+        IoSessionOutputStream out = (IoSessionOutputStream) session.getAttribute(Transport.OUTPUT_STREAM);
         IOUtil.close(out);
 
         //

Copied: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpServerMessageVisitor.java (from r575934, geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-server/src/main/java/org/apache/geronimo/gshell/remote/server/RshServerMessageVisitor.java)
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpServerMessageVisitor.java?p2=geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpServerMessageVisitor.java&p1=geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-server/src/main/java/org/apache/geronimo/gshell/remote/server/RshServerMessageVisitor.java&r1=575934&r2=576612&rev=576612&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-server/src/main/java/org/apache/geronimo/gshell/remote/server/RshServerMessageVisitor.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpServerMessageVisitor.java Mon Sep 17 15:27:55 2007
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.geronimo.gshell.remote.server;
+package org.apache.geronimo.gshell.remote.transport.tcp;
 
 import java.io.BufferedReader;
 import java.io.InputStream;
@@ -26,14 +26,15 @@
 import java.io.PrintWriter;
 import java.util.Date;
 
-import org.apache.geronimo.gshell.remote.RshProtocolHandlerSupport;
 import org.apache.geronimo.gshell.remote.message.EchoMessage;
 import org.apache.geronimo.gshell.remote.message.HandShakeMessage;
 import org.apache.geronimo.gshell.remote.message.MessageVisitorAdapter;
 import org.apache.geronimo.gshell.remote.message.WriteStreamMessage;
 import org.apache.geronimo.gshell.remote.stream.IoSessionInputStream;
+import org.apache.geronimo.gshell.remote.transport.Transport;
 import org.apache.mina.common.ByteBuffer;
 import org.apache.mina.common.IoSession;
+import org.codehaus.plexus.component.annotations.Component;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -42,7 +43,8 @@
  *
  * @version $Rev$ $Date$
  */
-public class RshServerMessageVisitor
+@Component(role=TcpServerMessageVisitor.class)
+public class TcpServerMessageVisitor
     extends MessageVisitorAdapter
 {
     private Logger log = LoggerFactory.getLogger(getClass());
@@ -52,7 +54,7 @@
 
         final IoSession session = (IoSession) msg.getAttachment();
         assert session != null;
-        
+
         String text = msg.getText();
 
         //
@@ -60,10 +62,10 @@
         //
 
         if ("READ_STREAMS".equals(text)) {
-            OutputStream out = (OutputStream) session.getAttribute(RshProtocolHandlerSupport.OUTPUT_STREAM);
+            OutputStream out = (OutputStream) session.getAttribute(Transport.OUTPUT_STREAM);
             final PrintWriter writer = new PrintWriter(out);
 
-            InputStream in = (InputStream) session.getAttribute(RshProtocolHandlerSupport.INPUT_STREAM);
+            InputStream in = (InputStream) session.getAttribute(Transport.INPUT_STREAM);
             final BufferedReader reader = new BufferedReader(new InputStreamReader(in));
 
             Thread t = new Thread("Stream Consumer") {
@@ -75,7 +77,7 @@
                         while ((line = reader.readLine()) != null) {
                             System.err.println(line);
                         }
-                        
+
                         log.debug("Consumer stopped");
                     }
                     catch (Exception e) {
@@ -117,7 +119,7 @@
         assert msg != null;
 
         log.info("HANDSHAKE");
-        
+
         IoSession session = (IoSession) msg.getAttachment();
         assert session != null;
 
@@ -135,7 +137,7 @@
         assert session != null;
 
         // Look up the bound stream in the session context
-        String key = RshProtocolHandlerSupport.STREAM_BASENAME + msg.getName();
+        String key = Transport.STREAM_BASENAME + msg.getName();
         Object stream = session.getAttribute(key);
 
         // For now lets not toss any exceptions or send back any fault messages

Added: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransport.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransport.java?rev=576612&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransport.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransport.java Mon Sep 17 15:27:55 2007
@@ -0,0 +1,214 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.remote.transport.tcp;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.URI;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.geronimo.gshell.remote.filter.LoggingFilter;
+import org.apache.geronimo.gshell.remote.message.Message;
+import org.apache.geronimo.gshell.remote.message.MessageCodecFactory;
+import org.apache.geronimo.gshell.remote.transport.Transport;
+import org.apache.mina.common.CloseFuture;
+import org.apache.mina.common.ConnectFuture;
+import org.apache.mina.common.DefaultIoFilterChainBuilder;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.WriteFuture;
+import org.apache.mina.filter.codec.ProtocolCodecFilter;
+import org.apache.mina.filter.reqres.Request;
+import org.apache.mina.filter.reqres.RequestResponseFilter;
+import org.apache.mina.filter.reqres.Response;
+import org.apache.mina.transport.socket.nio.SocketConnector;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+public class TcpTransport
+    implements Transport
+{
+    private static final int CONNECT_TIMEOUT = 3000;
+
+    protected Logger log = LoggerFactory.getLogger(getClass());
+
+    protected TcpClientMessageVisitor messageVisitor;
+
+    protected TcpProtocolHandler protocolHandler;
+
+    protected URI remoteLocation;
+
+    protected InetSocketAddress remoteAddress;
+
+    protected URI localLocation;
+
+    protected InetSocketAddress localAddress;
+
+    protected SocketConnector connector;
+
+    protected IoSession session;
+
+    protected boolean connected;
+
+    public TcpTransport(final URI remote, final URI local) throws Exception {
+        assert remote != null;
+        // local may be null
+
+        this.remoteLocation = remote;
+        this.remoteAddress = new InetSocketAddress(InetAddress.getByName(remote.getHost()), remote.getPort());
+
+        if (local != null) {
+            this.localLocation = local;
+            this.localAddress = new InetSocketAddress(InetAddress.getByName(local.getHost()), local.getPort());
+        }
+    }
+
+    protected void init() throws Exception {
+        if (protocolHandler == null) {
+            throw new IllegalStateException("Protocol handler not injected");
+        }
+        if (messageVisitor == null) {
+            throw new IllegalStateException("Message visitor not injected");
+        }
+        
+        protocolHandler.setVisitor(messageVisitor);
+
+        ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1);
+
+        connector = new SocketConnector(Runtime.getRuntime().availableProcessors(), executor);
+        connector.setConnectTimeout(30);
+        connector.setHandler(protocolHandler);
+
+        DefaultIoFilterChainBuilder filterChain = connector.getFilterChain();
+
+        filterChain.addLast("logger", new LoggingFilter());
+
+        filterChain.addLast("protocol", new ProtocolCodecFilter(new MessageCodecFactory()));
+
+        ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors());
+
+        filterChain.addLast("reqres", new RequestResponseFilter(protocolHandler.getResponseInspector(), scheduler));
+    }
+
+    //
+    // NOTE: Setters exposed to support Plexus autowire()
+    //
+
+    public void setMessageVisitor(final TcpClientMessageVisitor messageVisitor) {
+        log.debug("Using message visitor: {}", messageVisitor);
+
+        this.messageVisitor = messageVisitor;
+    }
+
+    public void setProtocolHandler(final TcpProtocolHandler protocolHandler) {
+        log.debug("Using protocol handler: {}", protocolHandler);
+
+        this.protocolHandler = protocolHandler;
+    }
+
+    public void connect() throws Exception {
+        if (connected) {
+            throw new IllegalStateException("Already connected");
+        }
+        
+        init();
+
+        log.info("Connecting to: {}", remoteAddress);
+
+        ConnectFuture cf = connector.connect(remoteAddress, localAddress);
+
+        if (cf.awaitUninterruptibly(CONNECT_TIMEOUT)) {
+             session = cf.getSession();
+        }
+        else {
+            throw new Exception("Failed to connect");
+        }
+
+        connected = true;
+        
+        log.info("Connected");
+    }
+
+    public URI getRemoteLocation() {
+        return remoteLocation;
+    }
+
+    public URI getLocalLocation() {
+        return localLocation;
+    }
+
+    //
+    // Transport
+    //
+
+    private void doSend(final Object msg) throws Exception {
+        assert msg != null;
+
+        WriteFuture wf = session.write(msg);
+
+        wf.awaitUninterruptibly();
+
+        if (!wf.isWritten()) {
+            throw new IOException("Session did not fully write the message");
+        }
+    }
+
+    public void send(final Message msg) throws Exception {
+        assert msg != null;
+
+        doSend(msg);
+    }
+
+    public Message request(final Message msg) throws Exception {
+        assert msg != null;
+
+        Request req = new Request(msg.getId(), msg, 1, TimeUnit.SECONDS);
+
+        doSend(req);
+
+        Response resp = req.awaitResponse();
+
+        return (Message) resp.getMessage();
+    }
+
+    public InputStream getInputStream() {
+        return (InputStream) session.getAttribute(Transport.INPUT_STREAM);
+    }
+
+    public OutputStream getOutputStream() {
+        return (OutputStream) session.getAttribute(Transport.OUTPUT_STREAM);
+    }
+
+    public void close() {
+        CloseFuture cf = session.close();
+
+        cf.awaitUninterruptibly();
+    }
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransport.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransport.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransport.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransportFactory.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransportFactory.java?rev=576612&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransportFactory.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransportFactory.java Mon Sep 17 15:27:55 2007
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.remote.transport.tcp;
+
+import java.net.URI;
+
+import org.apache.geronimo.gshell.remote.transport.Transport;
+import org.apache.geronimo.gshell.remote.transport.TransportFactory;
+import org.apache.geronimo.gshell.remote.transport.TransportServer;
+import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.annotations.Requirement;
+
+/**
+ * ???
+ *
+ * @version $Rev$ $Date$
+ */
+@Component(role=TransportFactory.class, hint="tcp")
+public class TcpTransportFactory
+    implements TransportFactory
+{
+    @Requirement
+    private PlexusContainer container;
+
+    public Transport connect(final URI location) throws Exception {
+        assert location != null;
+
+        TcpTransport transport = createTcpTransport(location);
+
+        container.autowire(transport);
+
+        transport.connect();
+
+        return transport;
+    }
+
+    protected TcpTransport createTcpTransport(final URI location) throws Exception {
+        return new TcpTransport(location, null);
+    }
+
+    public TransportServer bind(final URI location) throws Exception {
+        assert location != null;
+
+        TcpTransportServer server = createTransportServer(location);
+
+        container.autowire(server);
+
+        server.bind();
+
+        return server;
+    }
+
+    protected TcpTransportServer createTransportServer(final URI location) throws Exception {
+        return new TcpTransportServer(location);
+    }
+}
\ No newline at end of file

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransportFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransportFactory.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransportFactory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain