[jboss-remoting-commits] JBoss Remoting SVN: r3884 - in remoting3/trunk: api/src/main/java/org/jboss/cx/remoting/spi/wrapper and 1 other directories.

jboss-remoting-commits at lists.jboss.org jboss-remoting-commits at lists.jboss.org
Thu Apr 3 16:19:31 EDT 2008


Author: david.lloyd at jboss.com
Date: 2008-04-03 16:19:31 -0400 (Thu, 03 Apr 2008)
New Revision: 3884

Added:
   remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/SessionListener.java
Modified:
   remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/Endpoint.java
   remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/spi/wrapper/EndpointWrapper.java
   remoting3/trunk/core/src/main/java/org/jboss/cx/remoting/core/CoreEndpoint.java
   remoting3/trunk/core/src/main/java/org/jboss/cx/remoting/core/CoreSession.java
Log:
JBREM-921 - notify listeners when a session is created or torn down

Modified: remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/Endpoint.java
===================================================================
--- remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/Endpoint.java	2008-04-03 20:03:49 UTC (rev 3883)
+++ remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/Endpoint.java	2008-04-03 20:19:31 UTC (rev 3884)
@@ -92,4 +92,18 @@
      * @return the context source
      */
     <I, O> ContextSource<I, O> createService(RequestListener<I, O> requestListener);
+
+    /**
+     * Add a listener that is notified when a session is created.
+     *
+     * @param sessionListener the session listener
+     */
+    void addSessionListener(SessionListener sessionListener);
+
+    /**
+     * Remove a previously added session listener.
+     *
+     * @param sessionListener the session listener
+     */
+    void removeSessionListener(SessionListener sessionListener);
 }

Added: remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/SessionListener.java
===================================================================
--- remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/SessionListener.java	                        (rev 0)
+++ remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/SessionListener.java	2008-04-03 20:19:31 UTC (rev 3884)
@@ -0,0 +1,10 @@
+package org.jboss.cx.remoting;
+
+/**
+ *
+ */
+public interface SessionListener {
+    void handleSessionOpened(Session session);
+
+    void handleSessionClosed(Session session);
+}

Modified: remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/spi/wrapper/EndpointWrapper.java
===================================================================
--- remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/spi/wrapper/EndpointWrapper.java	2008-04-03 20:03:49 UTC (rev 3883)
+++ remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/spi/wrapper/EndpointWrapper.java	2008-04-03 20:19:31 UTC (rev 3884)
@@ -9,6 +9,7 @@
 import org.jboss.cx.remoting.RemotingException;
 import org.jboss.cx.remoting.RequestListener;
 import org.jboss.cx.remoting.Session;
+import org.jboss.cx.remoting.SessionListener;
 import org.jboss.cx.remoting.spi.Registration;
 import org.jboss.cx.remoting.spi.protocol.ProtocolContext;
 import org.jboss.cx.remoting.spi.protocol.ProtocolHandler;
@@ -53,6 +54,14 @@
         return delegate.createService(requestListener);
     }
 
+    public void addSessionListener(final SessionListener sessionListener) {
+        delegate.addSessionListener(sessionListener);
+    }
+
+    public void removeSessionListener(final SessionListener sessionListener) {
+        delegate.removeSessionListener(sessionListener);
+    }
+
     public void close() throws RemotingException {
         delegate.close();
     }

Modified: remoting3/trunk/core/src/main/java/org/jboss/cx/remoting/core/CoreEndpoint.java
===================================================================
--- remoting3/trunk/core/src/main/java/org/jboss/cx/remoting/core/CoreEndpoint.java	2008-04-03 20:03:49 UTC (rev 3883)
+++ remoting3/trunk/core/src/main/java/org/jboss/cx/remoting/core/CoreEndpoint.java	2008-04-03 20:19:31 UTC (rev 3884)
@@ -3,6 +3,7 @@
 import java.io.IOException;
 import java.net.URI;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.ConcurrentMap;
@@ -16,6 +17,7 @@
 import org.jboss.cx.remoting.RemotingException;
 import org.jboss.cx.remoting.RequestListener;
 import org.jboss.cx.remoting.Session;
+import org.jboss.cx.remoting.SessionListener;
 import org.jboss.cx.remoting.core.util.OrderedExecutorFactory;
 import org.jboss.cx.remoting.log.Logger;
 import org.jboss.cx.remoting.spi.Registration;
@@ -42,6 +44,7 @@
     private final RequestListener<?, ?> rootListener;
     private final Endpoint userEndpoint = new UserEndpoint();
     private final AtomicStateMachine<State> state = AtomicStateMachine.start(State.INITIAL);
+    private final Set<SessionListener> sessionListeners = CollectionUtil.synchronizedSet(new LinkedHashSet<SessionListener>());
 
     private OrderedExecutorFactory orderedExecutorFactory;
     private Executor executor;
@@ -93,8 +96,20 @@
     }
 
     void removeSession(CoreSession coreSession) {
-        sessions.remove(coreSession);
-        sessions.notifyAll();
+        synchronized (sessions) {
+            if (!sessions.remove(coreSession)) {
+                return;
+            }
+            sessions.notifyAll();
+        }
+        final Session userSession = coreSession.getUserSession();
+        for (final SessionListener listener : sessionListeners) {
+            executor.execute(new Runnable() {
+                public void run() {
+                    listener.handleSessionClosed(userSession);
+                }
+            });
+        }
     }
 
     public void start() {
@@ -188,7 +203,15 @@
                     final CoreSession session = new CoreSession(CoreEndpoint.this);
                     session.initializeClient(factory, uri, attributeMap, createContext(rootListener));
                     sessions.add(session);
-                    return session.getUserSession();
+                    final Session userSession = session.getUserSession();
+                    for (final SessionListener listener : sessionListeners) {
+                        executor.execute(new Runnable() {
+                            public void run() {
+                                listener.handleSessionOpened(userSession);
+                            }
+                        });
+                    }
+                    return userSession;
                 } catch (IOException e) {
                     RemotingException rex = new RemotingException("Failed to create protocol handler: " + e.getMessage());
                     rex.setStackTrace(e.getStackTrace());
@@ -248,6 +271,16 @@
             return outbound.getUserContextSource();
         }
 
+        public void addSessionListener(final SessionListener sessionListener) {
+            // TODO security check
+            sessionListeners.add(sessionListener);
+        }
+
+        public void removeSessionListener(final SessionListener sessionListener) {
+            // TODO security check
+            sessionListeners.remove(sessionListener);
+        }
+
         public void close() throws RemotingException {
             if (state.transitionHold(State.UP, State.DOWN)) try {
                 Iterator<CloseHandler<Endpoint>> it = closeHandlers.iterator();

Modified: remoting3/trunk/core/src/main/java/org/jboss/cx/remoting/core/CoreSession.java
===================================================================
--- remoting3/trunk/core/src/main/java/org/jboss/cx/remoting/core/CoreSession.java	2008-04-03 20:03:49 UTC (rev 3883)
+++ remoting3/trunk/core/src/main/java/org/jboss/cx/remoting/core/CoreSession.java	2008-04-03 20:19:31 UTC (rev 3884)
@@ -248,6 +248,8 @@
                 protocolHandler.closeSession();
             } catch (IOException e) {
                 log.trace(e, "Protocol handler session close failed");
+            } finally {
+                endpoint.removeSession(this);
             }
         }
     }




More information about the jboss-remoting-commits mailing list