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);
+ }
}
}