You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by gn...@apache.org on 2011/07/01 09:50:08 UTC

svn commit: r1141856 - in /mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd: common/Session.java common/SessionListener.java common/session/AbstractSession.java server/session/SessionFactory.java

Author: gnodet
Date: Fri Jul  1 07:50:07 2011
New Revision: 1141856

URL: http://svn.apache.org/viewvc?rev=1141856&view=rev
Log:
[SSHD-114] Session Listener
Patch provided by Cédric Chantepie

Added:
    mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/SessionListener.java
      - copied, changed from r1141851, mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/session/SessionFactory.java
Modified:
    mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/Session.java
    mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java
    mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/session/SessionFactory.java

Modified: mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/Session.java
URL: http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/Session.java?rev=1141856&r1=1141855&r2=1141856&view=diff
==============================================================================
--- mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/Session.java (original)
+++ mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/Session.java Fri Jul  1 07:50:07 2011
@@ -120,6 +120,20 @@ public interface Session {
     void unregisterChannel(Channel channel);
 
     /**
+     * Add a session |listener|.
+     *
+     * @param listener the session listener to add
+     */
+    void addListener(SessionListener listener);
+
+    /**
+     * Remove a session |listener|.
+     *
+     * @param listener the session listener to remove
+     */
+    void removeListener(SessionListener listener);
+
+    /**
      * Type safe key for storage within the user attributes of {@link org.apache.sshd.common.session.AbstractSession}.
      * Typically it is used as a static variable that is shared between the producer
      * and the consumer. To further restrict access the setting or getting it from

Copied: mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/SessionListener.java (from r1141851, mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/session/SessionFactory.java)
URL: http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/SessionListener.java?p2=mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/SessionListener.java&p1=mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/session/SessionFactory.java&r1=1141851&r2=1141856&rev=1141856&view=diff
==============================================================================
--- mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/session/SessionFactory.java (original)
+++ mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/SessionListener.java Fri Jul  1 07:50:07 2011
@@ -16,32 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sshd.server.session;
-
-import org.apache.mina.core.session.IoSession;
-import org.apache.sshd.SshServer;
-import org.apache.sshd.common.AbstractSessionIoHandler;
-import org.apache.sshd.common.session.AbstractSession;
-import org.apache.sshd.server.session.ServerSession;
+package org.apache.sshd.common;
 
 /**
- * A factory of server sessions.
- * This class can be used as a way to customize the creation of server sessions.
- *
- * @see SshServer#setSessionFactory(SessionFactory) 
+ * Represents an interface receiving Session events.
  *
  * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
  */
-public class SessionFactory extends AbstractSessionIoHandler {
-
-    protected SshServer server;
+public interface SessionListener {
 
-    public void setServer(SshServer server) {
-        this.server = server;
-    }
+    void sessionCreated(Session session);
 
-    protected AbstractSession createSession(IoSession ioSession) throws Exception {
-        return new ServerSession(server, ioSession);
-    }
+    void sessionClosed(Session s);
 
 }

Modified: mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java
URL: http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java?rev=1141856&r1=1141855&r2=1141856&view=diff
==============================================================================
--- mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java (original)
+++ mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/session/AbstractSession.java Fri Jul  1 07:50:07 2011
@@ -19,6 +19,8 @@
 package org.apache.sshd.common.session;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -39,6 +41,7 @@ import org.apache.sshd.common.Mac;
 import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.Random;
 import org.apache.sshd.common.Session;
+import org.apache.sshd.common.SessionListener;
 import org.apache.sshd.common.SshConstants;
 import org.apache.sshd.common.SshException;
 import org.apache.sshd.common.future.CloseFuture;
@@ -94,6 +97,9 @@ public abstract class AbstractSession im
     /** Next channel identifier */
     protected int nextChannelId;
 
+    /** Session listener */
+    protected final List<SessionListener> listeners = new ArrayList<SessionListener>();
+
     //
     // Key exchange support
     //
@@ -272,6 +278,7 @@ public abstract class AbstractSession im
      * The call will not block until the mina session is actually closed.
      */
     public CloseFuture close(final boolean immediately) {
+	    final Session s = this;
         class IoSessionCloser implements IoFutureListener {
             public void operationComplete(IoFuture future) {
                 synchronized (lock) {
@@ -279,14 +286,22 @@ public abstract class AbstractSession im
                     closeFuture.setClosed();
                     lock.notifyAll();
                 }
+
+                // Fire 'close' event
+                final ArrayList<SessionListener> l =
+                        new ArrayList<SessionListener>(listeners);
+
+                for (SessionListener sl : l) {
+                    sl.sessionClosed(s);
+                }
             }
-        };
+        }
         synchronized (lock) {
             if (!closing) {
                 try {
                     closing = true;
                     log.info("Closing session");
-                    Channel[] channelToClose = channels.values().toArray(new Channel[0]);
+                    Channel[] channelToClose = channels.values().toArray(new Channel[channels.values().size()]);
                     if (channelToClose.length > 0) {
                         final AtomicInteger latch = new AtomicInteger(channelToClose.length);
                         for (Channel channel : channelToClose) {
@@ -1074,4 +1089,26 @@ public abstract class AbstractSession im
     public String getUsername() {
         return username;
     }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void addListener(SessionListener listener) {
+        if (listener == null) {
+            throw new IllegalArgumentException();
+        }
+
+        synchronized (this.listeners) {
+            this.listeners.add(listener);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void removeListener(SessionListener listener) {
+        synchronized (this.listeners) {
+            this.listeners.remove(listener);
+        }
+    }
 }

Modified: mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/session/SessionFactory.java
URL: http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/session/SessionFactory.java?rev=1141856&r1=1141855&r2=1141856&view=diff
==============================================================================
--- mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/session/SessionFactory.java (original)
+++ mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/session/SessionFactory.java Fri Jul  1 07:50:07 2011
@@ -18,11 +18,14 @@
  */
 package org.apache.sshd.server.session;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.mina.core.session.IoSession;
 import org.apache.sshd.SshServer;
 import org.apache.sshd.common.AbstractSessionIoHandler;
+import org.apache.sshd.common.SessionListener;
 import org.apache.sshd.common.session.AbstractSession;
-import org.apache.sshd.server.session.ServerSession;
 
 /**
  * A factory of server sessions.
@@ -35,13 +38,48 @@ import org.apache.sshd.server.session.Se
 public class SessionFactory extends AbstractSessionIoHandler {
 
     protected SshServer server;
+    protected final List<SessionListener> listeners = new ArrayList<SessionListener>();
 
     public void setServer(SshServer server) {
         this.server = server;
     }
 
     protected AbstractSession createSession(IoSession ioSession) throws Exception {
-        return new ServerSession(server, ioSession);
+        ServerSession session = new ServerSession(server, ioSession);
+        List<SessionListener> sl = new ArrayList<SessionListener>(this.listeners);
+
+        for (SessionListener l : sl) {
+            l.sessionCreated(session);
+            session.addListener(l);
+        }
+
+        return session;
+    }
+
+    /**
+     * Add a session |listener|.
+     *
+     * @param listener the session listener to add
+     */
+    public void addListener(SessionListener listener) {
+        if (listener == null) {
+            throw new IllegalArgumentException();
+        }
+
+        synchronized (this.listeners) {
+            this.listeners.add(listener);
+        }
+    }
+
+    /**
+     * Remove a session |listener|.
+     *
+     * @param listener the session listener to remove
+     */
+    public void removeListener(SessionListener listener) {
+        synchronized (this.listeners) {
+            this.listeners.remove(listener);
+        }
     }
 
 }