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/22 05:31:47 UTC

svn commit: r578361 - in /geronimo/sandbox/gshell/trunk: gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/request/ gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/stream/ gshell-remot...

Author: jdillon
Date: Fri Sep 21 20:31:46 2007
New Revision: 578361

URL: http://svn.apache.org/viewvc?rev=578361&view=rev
Log:
Added helper for nested IO exceptions
Adding helper for session attribute binding
Cleaned up some threading muck and tidy up logging fluff

Added:
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/util/
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/util/SessionAttributeBinder.java   (with props)
    geronimo/sandbox/gshell/trunk/gshell-support/gshell-common/src/main/java/org/apache/geronimo/gshell/common/NestedIOException.java
      - copied, changed from r578321, geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/request/RequestException.java
Modified:
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/request/RequestManager.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/request/RequestResponseFilter.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/stream/SessionInputStream.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/stream/SessionOutputStream.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/stream/SessionStreamFilter.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransport.java
    geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-server/src/main/java/org/apache/geronimo/gshell/remote/server/RshServerMessageVisitor.java

Modified: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/request/RequestManager.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/request/RequestManager.java?rev=578361&r1=578360&r2=578361&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/request/RequestManager.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/request/RequestManager.java Fri Sep 21 20:31:46 2007
@@ -26,7 +26,7 @@
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 
-import org.apache.mina.common.IoSession;
+import org.apache.geronimo.gshell.remote.util.SessionAttributeBinder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -37,7 +37,9 @@
  */
 public class RequestManager
 {
-    private static final Logger log = LoggerFactory.getLogger(RequestManager.class);
+    public static final SessionAttributeBinder<RequestManager> BINDER = new SessionAttributeBinder<RequestManager>(RequestManager.class);
+
+    private transient final Logger log = LoggerFactory.getLogger(getClass());
 
     private transient final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors() + 1);
 
@@ -46,7 +48,7 @@
     private final Map<Request,TimeoutTask> timeouts = Collections.synchronizedMap(new HashMap<Request,TimeoutTask>());
     
     //
-    // TODO: Lock on Request.getMutex()
+    // TODO: Lock on Request.getMutex(), and/or change the mutex to a read/write lock?
     //
 
     /**
@@ -265,46 +267,5 @@
         public ScheduledFuture<?> getTimeoutFuture() {
             return timeoutFuture;
         }
-    }
-
-    //
-    // Session Access
-    //
-    
-    public static RequestManager lookup(final IoSession session) {
-        assert session != null;
-
-        RequestManager manager = (RequestManager) session.getAttribute(RequestManager.class.getName());
-
-        if (manager == null) {
-            throw new IllegalStateException("Request manager not bound");
-        }
-
-        log.trace("Looked up: {}", manager);
-        
-        return manager;
-    }
-
-    public static void bind(final IoSession session, final RequestManager manager) {
-        assert session != null;
-        assert manager != null;
-
-        if (session.containsAttribute(RequestManager.class.getName())) {
-            throw new IllegalStateException("Request manager already bound");
-        }
-        
-        session.setAttribute(RequestManager.class.getName(), manager);
-
-        log.trace("Bound: {}", manager);
-    }
-
-    public static RequestManager unbind(final IoSession session) {
-        assert session != null;
-
-        RequestManager manager = (RequestManager) session.removeAttribute(RequestManager.class.getName());
-
-        log.trace("Unbound: {}", manager);
-
-        return manager;
     }
 }

Modified: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/request/RequestResponseFilter.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/request/RequestResponseFilter.java?rev=578361&r1=578360&r2=578361&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/request/RequestResponseFilter.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/request/RequestResponseFilter.java Fri Sep 21 20:31:46 2007
@@ -19,9 +19,6 @@
 
 package org.apache.geronimo.gshell.remote.request;
 
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
 import org.apache.geronimo.gshell.remote.message.Message;
 import org.apache.mina.common.IoFilterAdapter;
 import org.apache.mina.common.IoSession;
@@ -39,26 +36,11 @@
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     /**
-     * Executor used to queue request signal operations.
-     */
-    private final ExecutorService executor;
-
-    public RequestResponseFilter(final ExecutorService executor) {
-        assert executor != null;
-
-        this.executor = executor;
-    }
-
-    public RequestResponseFilter() {
-        this(Executors.newCachedThreadPool());
-    }
-
-    /**
      * Set up the request manager instance for the session.
      */
     @Override
     public void sessionCreated(final NextFilter nextFilter, final IoSession session) throws Exception {
-        RequestManager.bind(session, new RequestManager());
+        RequestManager.BINDER.bind(session, new RequestManager());
 
         nextFilter.sessionCreated(session);
     }
@@ -68,7 +50,7 @@
      */
     @Override
     public void sessionClosed(final NextFilter nextFilter, final IoSession session) throws Exception {
-        RequestManager manager = RequestManager.unbind(session);
+        RequestManager manager = RequestManager.BINDER.unbind(session);
 
         manager.close();
         
@@ -86,7 +68,7 @@
             // Register the request with the manager
             Request request = (Request) message;
 
-            RequestManager manager = RequestManager.lookup(session);
+            RequestManager manager = RequestManager.BINDER.lookup(session);
             manager.add(request);
         }
 
@@ -110,24 +92,15 @@
 
         // If we have a correlation id, then we can process the response
         if (id != null) {
-            RequestManager manager = RequestManager.lookup(session);
-
-            final Request request = manager.get(id);
+            RequestManager manager = RequestManager.BINDER.lookup(session);
+            Request request = manager.get(id);
 
             // Cancel the timeout
             manager.cancel(request);
 
             // Setup the response and signal the request
-            final Response response = new Response(request, msg, Response.Type.WHOLE);
-
-            // Signal could block so queue it
-            Runnable task = new Runnable() {
-                public void run() {
-                    request.signal(response);
-                }
-            };
-
-            executor.execute(task);
+            Response response = new Response(request, msg, Response.Type.WHOLE);
+            request.signal(response);
 
             // Do not pass on the response
         }
@@ -144,7 +117,7 @@
         if (message instanceof Request) {
             Request request = (Request) message;
 
-            RequestManager manager = RequestManager.lookup(session);
+            RequestManager manager = RequestManager.BINDER.lookup(session);
 
             manager.schedule(request);
         }

Modified: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/stream/SessionInputStream.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/stream/SessionInputStream.java?rev=578361&r1=578360&r2=578361&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/stream/SessionInputStream.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/stream/SessionInputStream.java Fri Sep 21 20:31:46 2007
@@ -26,10 +26,11 @@
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.apache.geronimo.gshell.common.NestedIOException;
 import org.apache.geronimo.gshell.common.tostring.ReflectionToStringBuilder;
 import org.apache.geronimo.gshell.common.tostring.ToStringStyle;
+import org.apache.geronimo.gshell.remote.util.SessionAttributeBinder;
 import org.apache.mina.common.ByteBuffer;
-import org.apache.mina.common.IoSession;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -41,8 +42,10 @@
 public class SessionInputStream
     extends InputStream
 {
-    private static final Logger log = LoggerFactory.getLogger(SessionInputStream.class);
-    
+    public static final SessionAttributeBinder<SessionInputStream> BINDER = new SessionAttributeBinder<SessionInputStream>(SessionInputStream.class);
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
     private final Object mutex = new Object();
 
     private final ByteBuffer buff;
@@ -130,9 +133,7 @@
                     mutex.wait();
                 }
                 catch (InterruptedException e) {
-                    IOException n = new IOException("Interrupted while waiting for more data");
-                    n.initCause(e);
-                    throw n;
+                    throw new NestedIOException("Interrupted while waiting for more data");
                 }
             }
         }
@@ -161,10 +162,6 @@
     }
 
     public void write(final WriteStreamMessage msg) {
-        assert msg != null;
-
-        log.debug("Writing...");
-
         synchronized (mutex) {
             if (closed) {
                 return;
@@ -172,11 +169,9 @@
 
             ByteBuffer src = msg.getBuffer();
 
-            log.debug("Filling {} byte(s) into stream from: {}", src.remaining(), src);
+            log.debug("Writing {} bytes", src.remaining());
 
             if (buff.hasRemaining()) {
-                log.debug("Buffer has remaining: {} byte(s)", buff.remaining());
-
                 buff.compact();
                 buff.put(src);
                 buff.flip();
@@ -189,8 +184,6 @@
                 mutex.notifyAll();
             }
         }
-
-        log.debug("Done");
     }
 
     public void throwException(final IOException e) {
@@ -201,42 +194,5 @@
                 mutex.notifyAll();
             }
         }
-    }
-
-    //
-    // Session Access
-    //
-
-    public static SessionInputStream lookup(final IoSession session) {
-        assert session != null;
-
-        SessionInputStream in = (SessionInputStream) session.getAttribute(SessionInputStream.class.getName());
-
-        if (in == null) {
-            throw new IllegalStateException("Input stream not bound");
-        }
-
-        return in;
-    }
-
-    public static void bind(final IoSession session, final SessionInputStream in) {
-        assert session != null;
-        assert in != null;
-
-        Object obj = session.getAttribute(SessionInputStream.class.getName());
-
-        if (obj != null) {
-            throw new IllegalStateException("Input stream already bound");
-        }
-
-        session.setAttribute(SessionInputStream.class.getName(), in);
-
-        log.trace("Bound input stream: {}", in);
-    }
-
-    public static SessionInputStream unbind(final IoSession session) {
-        assert session != null;
-
-        return (SessionInputStream) session.removeAttribute(SessionInputStream.class.getName());
     }
 }

Modified: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/stream/SessionOutputStream.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/stream/SessionOutputStream.java?rev=578361&r1=578360&r2=578361&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/stream/SessionOutputStream.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/stream/SessionOutputStream.java Fri Sep 21 20:31:46 2007
@@ -29,10 +29,10 @@
 import org.apache.geronimo.gshell.common.tostring.ReflectionToStringBuilder;
 import org.apache.geronimo.gshell.common.tostring.ToStringStyle;
 import org.apache.geronimo.gshell.remote.message.Message;
+import org.apache.geronimo.gshell.remote.util.SessionAttributeBinder;
 import org.apache.mina.common.ByteBuffer;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.WriteFuture;
-import org.apache.mina.util.NewThreadExecutor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,10 +44,10 @@
 public class SessionOutputStream
     extends OutputStream
 {
-    private static final Logger log = LoggerFactory.getLogger(SessionOutputStream.class);
-
-    private final Object mutex = new Object();
+    public static final SessionAttributeBinder<SessionOutputStream> BINDER = new SessionAttributeBinder<SessionOutputStream>(SessionOutputStream.class);
 
+    private final Logger log = LoggerFactory.getLogger(getClass());
+    
     private final IoSession session;
 
     private WriteFuture lastWriteFuture;
@@ -87,9 +87,7 @@
 
     public void write(final int b) throws IOException {
         ByteBuffer buff = ByteBuffer.allocate(1);
-
         buff.put((byte) b);
-
         buff.flip();
 
         write(buff);
@@ -100,95 +98,33 @@
             throw new IOException("The session has been closed.");
         }
     }
+    
+    private synchronized void write(final ByteBuffer buff) throws IOException {
+        ensureOpened();
 
-    private void write(final ByteBuffer buff) throws IOException {
-        synchronized (mutex) {
-            ensureOpened();
-
-            log.debug("Writing: {}", buff);
-
-            Message msg = new WriteStreamMessage(buff);
-
-            //
-            // TODO: See if we should hold on to each of the write futures what we go through before flushing?
-            //
-            
-            final WriteFuture wf = session.write(msg);
-
-            lastWriteFuture = wf;
-
-            log.debug("Done");
-            
-            new NewThreadExecutor().execute(new Runnable() {
-                public void run() {
-                    log.debug("Waiting for full write");
-
-                    wf.join();
-
-                    log.debug("Completed; written: {}", wf.isWritten());
-                }
-            });
-        }
-    }
-
-    public void flush() throws IOException {
-        synchronized (mutex) {
-            ensureOpened();
-
-            if (lastWriteFuture == null) {
-                return;
-            }
+        log.debug("Writing {} bytes", buff.remaining());
 
-            log.debug("Flushing");
+        Message msg = new WriteStreamMessage(buff);
 
-            // Process the last write future and clear it
-            WriteFuture wf = lastWriteFuture;
-            lastWriteFuture = null;
+        WriteFuture wf = session.write(msg);
 
-            wf.join();
+        lastWriteFuture = wf;
 
-            if (!wf.isWritten()) {
-                throw new IOException("Failed to fully write bytes to the session");
-            }
-
-            log.debug("Flushed");
-        }
+        wf.join();
     }
 
-    //
-    // Session Access
-    //
+    public synchronized void flush() throws IOException {
+        ensureOpened();
 
-    public static SessionOutputStream lookup(final IoSession session) {
-        assert session != null;
-
-        SessionOutputStream out = (SessionOutputStream) session.getAttribute(SessionOutputStream.class.getName());
-
-        if (out == null) {
-            throw new IllegalStateException("Output stream not bound");
+        if (lastWriteFuture == null) {
+            return;
         }
+        
+        // Process the last write future and clear it
+        lastWriteFuture.join();
 
-        return out;
-    }
-
-    public static void bind(final IoSession session, final SessionOutputStream out) {
-        assert session != null;
-        assert out != null;
-
-        Object obj = session.getAttribute(SessionOutputStream.class.getName());
-
-        if (obj != null) {
-            throw new IllegalStateException("Output stream already bound");
+        if (!lastWriteFuture.isWritten()) {
+            throw new IOException("Failed to fully write bytes to the session");
         }
-
-        session.setAttribute(SessionOutputStream.class.getName(), out);
-
-        log.trace("Bound output stream: {}", out);
-    }
-
-    public static SessionOutputStream unbind(final IoSession session) {
-        assert session != null;
-
-        return (SessionOutputStream) session.removeAttribute(SessionOutputStream.class.getName());
     }
 }

Modified: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/stream/SessionStreamFilter.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/stream/SessionStreamFilter.java?rev=578361&r1=578360&r2=578361&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/stream/SessionStreamFilter.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/stream/SessionStreamFilter.java Fri Sep 21 20:31:46 2007
@@ -19,10 +19,6 @@
 
 package org.apache.geronimo.gshell.remote.stream;
 
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-import org.apache.mina.common.IdleStatus;
 import org.apache.mina.common.IoFilterAdapter;
 import org.apache.mina.common.IoSession;
 import org.codehaus.plexus.util.IOUtil;
@@ -30,7 +26,7 @@
 import org.slf4j.LoggerFactory;
 
 /**
- * ???
+ * Provides stream I/O handling.
  *
  * @version $Rev$ $Date$
  */
@@ -39,96 +35,44 @@
 {
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private final ExecutorService executor;
-
-    public SessionStreamFilter(final ExecutorService executor) {
-        assert executor != null;
-
-        this.executor = executor;
-    }
-
-    public SessionStreamFilter() {
-        this(Executors.newCachedThreadPool());
-    }
-
-    //
-    // TODO: See if we need to put the executor into the session context
-    //
-
-    @Override
-    public void sessionCreated(NextFilter nextFilter, IoSession session) throws Exception {
-        log.debug("Binding session streams");
-
-        SessionInputStream.bind(session, new SessionInputStream());
-
-        SessionOutputStream.bind(session, new SessionOutputStream(session));
+    /**
+     * Setup the input and output streams for the session.
+     */
+    @Override
+    public void sessionCreated(final NextFilter nextFilter, final IoSession session) throws Exception {
+        SessionInputStream.BINDER.bind(session, new SessionInputStream());
+        SessionOutputStream.BINDER.bind(session, new SessionOutputStream(session));
 
         nextFilter.sessionCreated(session);
     }
 
-    @Override
-    public void sessionClosed(NextFilter nextFilter, IoSession session) throws Exception {
-        log.debug("Unbinding session streams");
-
-        IOUtil.close(SessionInputStream.unbind(session));
-        
-        IOUtil.close(SessionOutputStream.unbind(session));
+    /**
+     * Close the input and output streams for the session.
+     */
+    @Override
+    public void sessionClosed(final NextFilter nextFilter, final IoSession session) throws Exception {
+        IOUtil.close(SessionInputStream.BINDER.unbind(session));
+        IOUtil.close(SessionOutputStream.BINDER.unbind(session));
 
         nextFilter.sessionClosed(session);
     }
 
-    @Override
-    public void sessionIdle(NextFilter nextFilter, IoSession session, IdleStatus status) throws Exception {
-        log.debug("Session idle: {}, status: {}", session, status);
-
-        nextFilter.sessionIdle(session, status);
-    }
-
-    @Override
-    public void exceptionCaught(NextFilter nextFilter, IoSession session, Throwable cause) throws Exception {
-        log.debug("Exception caught: " + session + ", cause: " + cause, cause);
-
-        nextFilter.exceptionCaught(session, cause);
-    }
-
+    /**
+     * Handles write stream messages.
+     */
     @Override
     public void messageReceived(final NextFilter nextFilter, final IoSession session, final Object message) throws Exception {
         if (message instanceof WriteStreamMessage) {
-            final WriteStreamMessage msg = (WriteStreamMessage) message;
-
-            final SessionInputStream in = SessionInputStream.lookup(session);
-
-            Runnable task = new Runnable() {
-                public void run() {
-                    log.debug("Writing stream...");
-
-                    in.write(msg);
+            WriteStreamMessage msg = (WriteStreamMessage) message;
 
-                    log.debug("Done");
-                }
-            };
+            SessionInputStream in = SessionInputStream.BINDER.lookup(session);
 
-            task.run();
-
-            // executor.execute(task);
+            in.write(msg);
 
             // There is no need to pass on this message to any other filters, they have no use for it...
         }
         else {
             nextFilter.messageReceived(session, message);
         }
-    }
-
-    @Override
-    public void messageSent(NextFilter nextFilter, IoSession session, Object message) throws Exception {
-        if (message instanceof WriteStreamMessage) {
-            log.debug("Message sent: {}, msg: {}", session, message);
-
-            //
-            // TODO: Check the future's status?
-            //
-        }
-
-        nextFilter.messageSent(session, message);
     }
 }

Modified: 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=578361&r1=578360&r2=578361&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransport.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/transport/tcp/TcpTransport.java Fri Sep 21 20:31:46 2007
@@ -52,8 +52,6 @@
     extends TransportCommon
     implements Transport
 {
-    private static final int CONNECT_TIMEOUT = 5;
-
     protected final URI remoteLocation;
 
     protected final SocketAddress remoteAddress;
@@ -181,10 +179,10 @@
     }
     
     public InputStream getInputStream() {
-        return SessionInputStream.lookup(session);
+        return SessionInputStream.BINDER.lookup(session);
     }
 
     public OutputStream getOutputStream() {
-        return SessionOutputStream.lookup(session);
+        return SessionOutputStream.BINDER.lookup(session);
     }
 }

Added: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/util/SessionAttributeBinder.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/util/SessionAttributeBinder.java?rev=578361&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/util/SessionAttributeBinder.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/util/SessionAttributeBinder.java Fri Sep 21 20:31:46 2007
@@ -0,0 +1,79 @@
+/*
+ * 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.util;
+
+import org.apache.mina.common.IoSession;
+
+/**
+ * Helper to manage binding operations for typed session attribute objects.
+ *
+ * @version $Rev$ $Date$
+ */
+public class SessionAttributeBinder<T>
+{
+    private final String key;
+
+    public SessionAttributeBinder(final String key) {
+        assert key != null;
+        
+        this.key = key;
+    }
+
+    public SessionAttributeBinder(final Class type) {
+        this(type.getName());
+    }
+
+    public SessionAttributeBinder(final Class type, final String suffix) {
+        this(type.getName() + "." + suffix);
+    }
+    
+    @SuppressWarnings({"unchecked"})
+    public T lookup(final IoSession session) {
+        assert session != null;
+
+        T obj = (T) session.getAttribute(key);
+
+        if (obj == null) {
+            throw new IllegalStateException(key + " not bound");
+        }
+
+        return obj;
+    }
+
+    public void bind(final IoSession session, final T obj) {
+        assert session != null;
+        assert obj != null;
+
+        Object prev = session.getAttribute(key);
+
+        if (prev != null) {
+            throw new IllegalStateException(key + " already bound");
+        }
+
+        session.setAttribute(key, obj);
+    }
+
+    @SuppressWarnings({"unchecked"})
+    public T unbind(final IoSession session) {
+        assert session != null;
+
+        return (T) session.removeAttribute(key);
+    }
+}
\ No newline at end of file

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

Propchange: geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/util/SessionAttributeBinder.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/util/SessionAttributeBinder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 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-server/src/main/java/org/apache/geronimo/gshell/remote/server/RshServerMessageVisitor.java?rev=578361&r1=578360&r2=578361&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-server/src/main/java/org/apache/geronimo/gshell/remote/server/RshServerMessageVisitor.java Fri Sep 21 20:31:46 2007
@@ -81,7 +81,7 @@
         session.setAttribute(PlexusContainer.class.getName(), container);
 
         // Setup the I/O context (w/o auto-flushing)
-        IO io = new IO(SessionInputStream.lookup(session), SessionOutputStream.lookup(session), false);
+        IO io = new IO(SessionInputStream.BINDER.lookup(session), SessionOutputStream.BINDER.lookup(session), false);
 
         //
         // FIXME: We need to set the verbosity of this I/O context as specified by the client
@@ -162,7 +162,7 @@
             log.info("Making noise...");
             
             final IoSession session = msg.getSession();
-            final PrintWriter out = new PrintWriter(SessionOutputStream.lookup(session), false);
+            final PrintWriter out = new PrintWriter(SessionOutputStream.BINDER.lookup(session), false);
 
             new Thread("NOISE MAKER") {
                 public void run() {
@@ -172,7 +172,8 @@
                         
                         try {
                             Thread.sleep(5000);
-                        } catch (InterruptedException e) {
+                        }
+                        catch (InterruptedException e) {
                             e.printStackTrace();
                         }
                     }

Copied: geronimo/sandbox/gshell/trunk/gshell-support/gshell-common/src/main/java/org/apache/geronimo/gshell/common/NestedIOException.java (from r578321, geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/request/RequestException.java)
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-support/gshell-common/src/main/java/org/apache/geronimo/gshell/common/NestedIOException.java?p2=geronimo/sandbox/gshell/trunk/gshell-support/gshell-common/src/main/java/org/apache/geronimo/gshell/common/NestedIOException.java&p1=geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/request/RequestException.java&r1=578321&r2=578361&rev=578361&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-remote/gshell-remote-common/src/main/java/org/apache/geronimo/gshell/remote/request/RequestException.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-support/gshell-common/src/main/java/org/apache/geronimo/gshell/common/NestedIOException.java Fri Sep 21 20:31:46 2007
@@ -17,31 +17,35 @@
  * under the License.
  */
 
-package org.apache.geronimo.gshell.remote.request;
+package org.apache.geronimo.gshell.common;
+
+import java.io.IOException;
 
 /**
- * Thrown to indicate a request operation failed.
+ * Nested {@link IOException}.
  *
- * @version $Rev$ $Date$
+ * @version $Rev: 577545 $ $Date: 2007-09-19 21:55:19 -0700 (Wed, 19 Sep 2007) $
  */
-public class RequestException
-    extends RuntimeException
+public class NestedIOException
+    extends IOException
 {
     private static final long serialVersionUID = 1;
 
-    public RequestException(final String msg, final Throwable cause) {
-        super(msg, cause);
+    public NestedIOException(final String msg, final Throwable cause) {
+        super(msg);
+
+        initCause(cause);
     }
 
-    public RequestException(final String msg) {
+    public NestedIOException(final String msg) {
         super(msg);
     }
 
-    public RequestException(final Throwable cause) {
-        super(cause);
+    public NestedIOException(final Throwable cause) {
+        initCause(cause);
     }
 
-    public RequestException() {
+    public NestedIOException() {
         super();
     }
 }