[jboss-cvs] JBoss Messaging SVN: r3705 - in trunk: src/main/org/jboss/jms/client/api and 26 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Feb 12 09:07:49 EST 2008


Author: jmesnil
Date: 2008-02-12 09:07:49 -0500 (Tue, 12 Feb 2008)
New Revision: 3705

Added:
   trunk/src/main/org/jboss/messaging/core/remoting/codec/PingCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/codec/PongCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FailureNotifier.java
   trunk/src/main/org/jboss/messaging/util/RemotingException.java
   trunk/tests/src/org/jboss/messaging/core/remoting/impl/SessionTestBase.java
   trunk/tests/src/org/jboss/messaging/core/remoting/impl/invm/test/unit/INVMSessionTest.java
   trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaKeepAliveFactoryTest.java
   trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaSessionTest.java
   trunk/tests/src/org/jboss/test/messaging/jms/SerializedClientSupport.java
   trunk/tests/src/org/jboss/test/messaging/jms/crash/CrashClient.java
   trunk/tests/src/org/jboss/test/messaging/jms/server/ConnectionManagerTest.java
Removed:
   trunk/src/main/org/jboss/messaging/core/remoting/Client.java
   trunk/src/main/org/jboss/messaging/core/remoting/ConnectionExceptionListener.java
   trunk/src/main/org/jboss/messaging/core/remoting/codec/SessionSetIDMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/ClientImpl.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ConnectionExceptionNotifier.java
   trunk/src/main/org/jboss/messaging/core/remoting/wireformat/SessionSetIDMessage.java
   trunk/tests/src/org/jboss/messaging/core/remoting/impl/ClientTestBase.java
   trunk/tests/src/org/jboss/messaging/core/remoting/impl/invm/test/unit/INVMClientTest.java
   trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaClientTest.java
   trunk/tests/src/org/jboss/messaging/core/remoting/test/unit/ClientTest.java
   trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateClientOnServerCommand.java
   trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateHangingConsumerCommand.java
   trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateTwoClientOnServerCommand.java
Modified:
   trunk/src/main/org/jboss/jms/client/JBossConnection.java
   trunk/src/main/org/jboss/jms/client/api/ClientConnection.java
   trunk/src/main/org/jboss/jms/client/impl/ClientConnectionImpl.java
   trunk/src/main/org/jboss/jms/client/remoting/MessagingRemotingConnection.java
   trunk/src/main/org/jboss/jms/server/ConnectionManager.java
   trunk/src/main/org/jboss/jms/server/connectionmanager/SimpleConnectionManager.java
   trunk/src/main/org/jboss/jms/server/endpoint/MessagingServerPacketHandler.java
   trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionEndpoint.java
   trunk/src/main/org/jboss/jms/server/endpoint/ServerConsumerEndpoint.java
   trunk/src/main/org/jboss/jms/server/endpoint/ServerSessionEndpoint.java
   trunk/src/main/org/jboss/messaging/core/impl/server/MessagingServerImpl.java
   trunk/src/main/org/jboss/messaging/core/remoting/ConnectorRegistry.java
   trunk/src/main/org/jboss/messaging/core/remoting/KeepAliveFactory.java
   trunk/src/main/org/jboss/messaging/core/remoting/PacketDispatcher.java
   trunk/src/main/org/jboss/messaging/core/remoting/RemotingService.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/invm/INVMSession.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ClientKeepAliveFactory.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FilterChainSupport.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaConnector.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaHandler.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaKeepAliveFactory.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaService.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/PacketCodecFactory.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ServerKeepAliveFactory.java
   trunk/src/main/org/jboss/messaging/core/remoting/wireformat/AbstractPacket.java
   trunk/src/main/org/jboss/messaging/core/remoting/wireformat/PacketType.java
   trunk/src/main/org/jboss/messaging/core/remoting/wireformat/Ping.java
   trunk/src/main/org/jboss/messaging/core/remoting/wireformat/Pong.java
   trunk/tests/build.xml
   trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/ClientKeepAliveTest.java
   trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/FilterChainSupportTest.java
   trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/ServerKeepAliveTest.java
   trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/TestSupport.java
   trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/stress/PacketStressTest.java
   trunk/tests/src/org/jboss/messaging/core/remoting/wireformat/test/unit/PacketTypeTest.java
   trunk/tests/src/org/jboss/test/messaging/JBMServerTestCase.java
   trunk/tests/src/org/jboss/test/messaging/jms/ClientExitTest.java
   trunk/tests/src/org/jboss/test/messaging/jms/crash/ClientCrashTest.java
   trunk/tests/src/org/jboss/test/messaging/jms/message/MessageTestBase.java
   trunk/tests/src/org/jboss/test/messaging/jms/network/ClientNetworkFailureTest.java
Log:
* remoting refactoring + clean up
  - simplified ConnectionManager interface and SimpleConnectionManager implementation
  - unified failure handling and merged ConnectionExceptionListener & FailureListener
  - merged ClientImpl code into MessagingRemotingConnection

Modified: trunk/src/main/org/jboss/jms/client/JBossConnection.java
===================================================================
--- trunk/src/main/org/jboss/jms/client/JBossConnection.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/client/JBossConnection.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -337,11 +337,6 @@
       return ((ClientConnectionInternal)connection).getServerID();
    }
    
-   public String getRemotingClientSessionID()
-   {
-      return ((ClientConnectionInternal)connection).getRemotingConnection().getSessionID();
-   }
-
    // Package protected ----------------------------------------------------------------------------
 
    // Protected ------------------------------------------------------------------------------------

Modified: trunk/src/main/org/jboss/jms/client/api/ClientConnection.java
===================================================================
--- trunk/src/main/org/jboss/jms/client/api/ClientConnection.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/client/api/ClientConnection.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -22,8 +22,6 @@
 
    void stop() throws MessagingException;
 
-   FailureListener getFailureListener() throws MessagingException;
-   
    void setFailureListener(FailureListener listener) throws MessagingException;
   
    void close() throws MessagingException;

Modified: trunk/src/main/org/jboss/jms/client/impl/ClientConnectionImpl.java
===================================================================
--- trunk/src/main/org/jboss/jms/client/impl/ClientConnectionImpl.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/client/impl/ClientConnectionImpl.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -118,13 +118,6 @@
       
       remotingConnection.send(id, new ConnectionStopMessage());
    }
-   
-   public FailureListener getFailureListener() throws MessagingException
-   {
-      checkClosed();
-      
-      return remotingConnection.getFailureListener();
-   }
 
    public void setFailureListener(FailureListener listener) throws MessagingException
    {
@@ -148,8 +141,6 @@
       }
       finally
       {
-         remotingConnection.setFailureListener(null);
-         
          // Finished with the connection - we need to shutdown callback server
          remotingConnection.stop();
 

Modified: trunk/src/main/org/jboss/jms/client/remoting/MessagingRemotingConnection.java
===================================================================
--- trunk/src/main/org/jboss/jms/client/remoting/MessagingRemotingConnection.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/client/remoting/MessagingRemotingConnection.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -21,13 +21,13 @@
   */
 package org.jboss.jms.client.remoting;
 
+import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.jboss.messaging.core.remoting.ConnectorRegistrySingleton.REGISTRY;
 
 import org.jboss.jms.client.api.FailureListener;
-import org.jboss.messaging.core.remoting.Client;
 import org.jboss.messaging.core.remoting.NIOConnector;
+import org.jboss.messaging.core.remoting.NIOSession;
 import org.jboss.messaging.core.remoting.RemotingConfiguration;
-import org.jboss.messaging.core.remoting.impl.ClientImpl;
 import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
 import org.jboss.messaging.core.remoting.wireformat.MessagingExceptionMessage;
 import org.jboss.messaging.util.Logger;
@@ -35,7 +35,6 @@
 
 /**
  * 
- * TODO: This class should disappear in favor of Connection/Client
  * Encapsulates the state and behaviour from MINA needed for a JMS connection.
  * 
  * Each JMS connection maintains a single Client instance for invoking on the server.
@@ -58,7 +57,11 @@
 
    private RemotingConfiguration remotingConfig;
 
-   private Client client;
+   private NIOConnector connector;
+   
+   private NIOSession session;
+   
+   private FailureListener listener;
 
    // Constructors ---------------------------------------------------------------------------------
 
@@ -75,14 +78,11 @@
 
    public void start() throws Throwable
    {
-      if (log.isTraceEnabled()) { log.trace(this + " created client"); }
+      if (log.isTraceEnabled()) { log.trace(this + " started remoting connection"); }
 
-      //callbackManager = new CallbackManager();
+      connector = REGISTRY.getConnector(remotingConfig);
+      session = connector.connect();
 
-      NIOConnector connector = REGISTRY.getConnector(remotingConfig);
-      client = new ClientImpl(connector, remotingConfig);
-      client.connect();
-
       if (log.isDebugEnabled())
          log.debug("Using " + connector + " to connect to " + remotingConfig);
 
@@ -95,24 +95,32 @@
 
       try
       {
-         client.disconnect();
-         NIOConnector connector = REGISTRY.removeConnector(remotingConfig);
          if (connector != null)
-            connector.disconnect();
+         { 
+            if (listener != null)
+               connector.removeFailureListener(listener);
+            NIOConnector connectorFromRegistry = REGISTRY.removeConnector(remotingConfig);
+            if (connectorFromRegistry != null)
+               connectorFromRegistry.disconnect();
+         }
       }
       catch (Throwable ignore)
       {        
          log.trace(this + " failed to disconnect the new client", ignore);
       }
-
-      client = null;
-
+      
+      connector = null;
+      
       log.trace(this + " closed");
    }
    
    public String getSessionID()
    {
-      return client.getSessionID();
+      if (session == null || !session.isConnected())
+      {
+         return null;
+      }
+      return session.getID();
    }
  
    /**
@@ -133,7 +141,7 @@
       
       try
       {      
-         response = (AbstractPacket) client.send(packet, oneWay);
+         response = (AbstractPacket) send(packet, oneWay);
       }
       catch (Exception e)
       {
@@ -159,24 +167,22 @@
       } 
    }
    
-   public synchronized void setFailureListener(FailureListener listener)
+   public synchronized void setFailureListener(FailureListener newListener)
    {
-      if (client != null)
+      if (listener != null && newListener != null)
       {
-         client.setFailureListener(listener);
+         throw new IllegalStateException("FailureListener already set to " + listener);
       }
-   }
 
-   public synchronized FailureListener getFailureListener()
-   {
-      if (client != null)
+      if (newListener != null)
       {
-         return client.getFailureListener();
+         connector.addFailureListener(newListener);
       }
-      else
+      else 
       {
-         return null;
+         connector.removeFailureListener(listener);
       }
+      this.listener = newListener;
    }
 
    // Package protected ----------------------------------------------------------------------------
@@ -184,7 +190,36 @@
    // Protected ------------------------------------------------------------------------------------
 
    // Private --------------------------------------------------------------------------------------
-   
-   // Inner classes --------------------------------------------------------------------------------
 
+   private AbstractPacket send(AbstractPacket packet, boolean oneWay)
+   throws Exception
+   {
+      assert packet != null;
+      checkConnected();
+      packet.setOneWay(oneWay);
+
+      if (oneWay)
+      {
+         session.write(packet);
+         return null;
+      } else 
+      {
+         AbstractPacket response = (AbstractPacket) session.writeAndBlock(packet, 
+               remotingConfig.getTimeout(), SECONDS);
+         return response;
+      }
+   }
+
+   private void checkConnected() throws MessagingException
+   {
+      if (session == null)
+      {
+         throw new IllegalStateException("Client " + this
+               + " is not connected.");
+      }
+      if (!session.isConnected())
+      {
+         throw new MessagingException(MessagingException.NOT_CONNECTED);
+      }
+   }
 }

Modified: trunk/src/main/org/jboss/jms/server/ConnectionManager.java
===================================================================
--- trunk/src/main/org/jboss/jms/server/ConnectionManager.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/server/ConnectionManager.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -25,7 +25,6 @@
 
 import org.jboss.jms.server.endpoint.ServerConnectionEndpoint;
 import org.jboss.messaging.core.MessagingComponent;
-import org.jboss.messaging.core.remoting.PacketSender;
 
 
 /**
@@ -34,43 +33,29 @@
  *
  * @author <a href="mailto:ovidiu at feodorov.com">Ovidiu Feodorov</a>
  * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * 
  * @version <tt>$Revision$</tt>
  *
  * $Id$
  */
 public interface ConnectionManager extends MessagingComponent
 {
-   void registerConnection(String jmsClientVMId,
-                           String remotingClientSessionID,
-                           ServerConnectionEndpoint endpoint);
+   void registerConnection(String clientVMID,
+                           String remotingClientSessionID, ServerConnectionEndpoint endpoint);
 
    /**
+    * @param serverConnectionEndpoint 
     * @return null if there is no such connection.
     */
-   ServerConnectionEndpoint unregisterConnection(String jmsClientVMID, String remotingClientSessionID);
+   ServerConnectionEndpoint unregisterConnection(String remotingClientSessionID, ServerConnectionEndpoint serverConnectionEndpoint);
    
-   boolean containsRemotingSession(String remotingClientSessionID);
-
    /**
     * Returns a list of active connection endpoints currently maintained by an instance of this
     * manager. The implementation should make a copy of the list to avoid
     * ConcurrentModificationException. The list could be empty, but never null.
     *
-    * @return List<ConnectionEndpoint>
+    * @return List<ServerConnectionEndpoint>
     */
-   List getActiveConnections();
-
-   void addConnectionFactoryCallback(String uniqueName, String VMID,
-         String remotingSessionID, PacketSender sender);
-
-   void removeConnectionFactoryCallback(String uniqueName, String vmid, PacketSender sender);
-
-   PacketSender[] getConnectionFactorySenders(String uniqueName);
-
-   /**
-    * @param clientToServer - true if the failure has been detected on a direct connection from
-    *        client to this server, false if the failure has been detected while trying to send a
-    *        callback from this server to the client.
-    */
-   void handleClientFailure(String remotingSessionID, boolean clientToServer);
+   List<ServerConnectionEndpoint> getActiveConnections();
 }

Modified: trunk/src/main/org/jboss/jms/server/connectionmanager/SimpleConnectionManager.java
===================================================================
--- trunk/src/main/org/jboss/jms/server/connectionmanager/SimpleConnectionManager.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/server/connectionmanager/SimpleConnectionManager.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -22,31 +22,32 @@
 package org.jboss.jms.server.connectionmanager;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.Map.Entry;
 
+import org.jboss.jms.client.api.FailureListener;
+import org.jboss.jms.client.impl.JMSClientVMIdentifier;
 import org.jboss.jms.server.ConnectionManager;
 import org.jboss.jms.server.endpoint.ServerConnectionEndpoint;
-import org.jboss.messaging.core.remoting.ConnectionExceptionListener;
-import org.jboss.messaging.core.remoting.PacketSender;
-import org.jboss.messaging.util.ConcurrentHashSet;
 import org.jboss.messaging.util.Logger;
+import org.jboss.messaging.util.MessagingException;
+import org.jboss.messaging.util.RemotingException;
 import org.jboss.messaging.util.Util;
 
 /**
  * @author <a href="tim.fox at jboss.com">Tim Fox</a>
  * @author <a href="ovidiu at feodorov.com">Ovidiu Feodorov</a>
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * 
  * @version <tt>$Revision$</tt>
  *
  * $Id$
  */
-public class SimpleConnectionManager implements ConnectionManager, ConnectionExceptionListener
+public class SimpleConnectionManager implements ConnectionManager, FailureListener
 {
    // Constants ------------------------------------------------------------------------------------
 
@@ -54,136 +55,83 @@
 
    // Static ---------------------------------------------------------------------------------------
 
-   private static boolean trace = log.isTraceEnabled();
-
    // Attributes -----------------------------------------------------------------------------------
 
-   private Map</** VMID */String, Map</** RemoteSessionID */String, ServerConnectionEndpoint>> jmsClients;
+   private Map<String /* remoting session ID */, List<ServerConnectionEndpoint>> endpoints;
 
-   // Map<remotingClientSessionID<String> - jmsClientVMID<String>
-   private Map<String, String> remotingSessions;
-
-   // Set<ServerConnectionEndpoint>
    private Set<ServerConnectionEndpoint> activeServerConnectionEndpoints;
 
-   private Map</** CFUniqueName*/ String, ConnectionFactoryCallbackInformation> cfCallbackInfo;
+   // the clients maps is for information only: to better identify the clients of
+   // jboss messaging using their VM ID
+   private Map<String /* remoting session id */, String /* client vm id */> clients;
    
    // Constructors ---------------------------------------------------------------------------------
 
    public SimpleConnectionManager()
    {
-      jmsClients = new HashMap<String, Map<String, ServerConnectionEndpoint>>();
-      remotingSessions = new HashMap<String, String>();
+      endpoints = new HashMap<String, List<ServerConnectionEndpoint>>();
       activeServerConnectionEndpoints = new HashSet<ServerConnectionEndpoint>();
-      cfCallbackInfo = new ConcurrentHashMap<String, ConnectionFactoryCallbackInformation>();
+      clients = new HashMap<String, String>();
    }
 
    // ConnectionManager implementation -------------------------------------------------------------
 
-   
-   
-   public synchronized void registerConnection(String jmsClientVMID,
-                                               String remotingClientSessionID,
-                                               ServerConnectionEndpoint endpoint)
+   public synchronized void registerConnection(String clientVMID, String remotingClientSessionID,
+         ServerConnectionEndpoint endpoint)
    {    
-      Map<String, ServerConnectionEndpoint> endpoints = jmsClients.get(jmsClientVMID);
-      
-      if (endpoints == null)
+      List<ServerConnectionEndpoint> connectionEndpoints = endpoints.get(remotingClientSessionID);
+
+      if (connectionEndpoints == null)
       {
-         endpoints = new HashMap<String, ServerConnectionEndpoint>();
-         
-         jmsClients.put(jmsClientVMID, endpoints);
+         connectionEndpoints = new ArrayList<ServerConnectionEndpoint>();
+         endpoints.put(remotingClientSessionID, connectionEndpoints);
       }
-      
-      endpoints.put(remotingClientSessionID, endpoint);
-      
-      remotingSessions.put(remotingClientSessionID, jmsClientVMID);
 
+      connectionEndpoints.add(endpoint);
+
       activeServerConnectionEndpoints.add(endpoint);
-      
+
+      clients.put(remotingClientSessionID, clientVMID);
+
       log.debug("registered connection " + endpoint + " as " +
-                Util.guidToString(remotingClientSessionID));
+            Util.guidToString(remotingClientSessionID));
    }
-
-   public synchronized ServerConnectionEndpoint unregisterConnection(String jmsClientVMId,
-                                                               String remotingClientSessionID)
+   
+   public synchronized ServerConnectionEndpoint unregisterConnection(String remotingClientSessionID,
+         ServerConnectionEndpoint endpoint)
    {
-      Map<String, ServerConnectionEndpoint> endpoints = jmsClients.get(jmsClientVMId);
-      
-      if (endpoints != null)
+      List<ServerConnectionEndpoint> connectionEndpoints = endpoints.get(remotingClientSessionID);
+
+      if (connectionEndpoints != null)
       {
-         ServerConnectionEndpoint e = endpoints.remove(remotingClientSessionID);
+         boolean removed = connectionEndpoints.remove(endpoint);
 
-         if (e != null)
+         if (removed)
          {
-            endpoints.remove(e);
-            activeServerConnectionEndpoints.remove(e);
+            activeServerConnectionEndpoints.remove(endpoint);
          }
 
-         log.debug("unregistered connection " + e + " with remoting session ID " +
-               Util.guidToString(remotingClientSessionID));
-         
-         if (endpoints.isEmpty())
+         log.debug("unregistered connection " + endpoint + " with remoting session ID " + remotingClientSessionID);
+
+         if (connectionEndpoints.isEmpty())
          {
-            jmsClients.remove(jmsClientVMId);
+            endpoints.remove(remotingClientSessionID);           
+            clients.remove(remotingClientSessionID);
          }
-         
-         remotingSessions.remove(remotingClientSessionID);
-         
-         return e;
+
+         return endpoint;
       }
       return null;
    }
    
-   public synchronized List getActiveConnections()
+   public synchronized List<ServerConnectionEndpoint> getActiveConnections()
    {
       // I will make a copy to avoid ConcurrentModification
       List<ServerConnectionEndpoint> list = new ArrayList<ServerConnectionEndpoint>();
       list.addAll(activeServerConnectionEndpoints);
       return list;
-   }
+   }      
       
-   public synchronized void handleClientFailure(String remotingSessionID, boolean clientToServer)
-   {
-      String jmsClientID = (String)remotingSessions.get(remotingSessionID);
-
-      if (jmsClientID == null)
-      {
-         log.warn(this + " cannot look up remoting session ID " + remotingSessionID);
-      }
-
-      log.warn("A problem has been detected " +
-         (clientToServer ?
-            "with the connection to remote client ":
-            "trying to send a message to remote client ") +
-         remotingSessionID + ", jmsClientID=" + jmsClientID + ". It is possible the client has exited without closing " +
-         "its connection(s) or the network has failed. All connection resources " +
-         "corresponding to that client process will now be removed.");
-
-      closeConsumersForClientVMID(jmsClientID);
-   }
-   
-   /** Synchronized is not really needed.. just to be safe as this is not supposed to be highly contended */
-   public void addConnectionFactoryCallback(String uniqueName, String vmID,
-         String remotingSessionID, PacketSender sender)
-   {
-      remotingSessions.put(remotingSessionID, vmID);
-      getCFInfo(uniqueName).addClient(vmID, sender);      
-   }
-   /** Synchronized is not really needed.. just to be safe as this is not supposed to be highly contended */
-   public synchronized void removeConnectionFactoryCallback(String uniqueName, String vmid,
-         PacketSender sender)
-   {
-      getCFInfo(uniqueName).removeSender(vmid, sender);   
-   }
-   
-   /** Synchronized is not really needed.. just to be safe as this is not supposed to be highly contended */
-   public synchronized PacketSender[] getConnectionFactorySenders(String uniqueName)
-   {
-      return getCFInfo(uniqueName).getAllSenders();
-   }
-
-   
    // MessagingComponent implementation ------------------------------------------------------------
    
    public void start() throws Exception
@@ -196,31 +144,19 @@
       //NOOP
    }
 
-   // ConnectionExceptionListener ------------------------------------------------------------------
+   // FailureListener implementation --------------------------------------------------------------
    
-   public void handleConnectionException(Throwable t, String clientSessionID)
+   public void onFailure(MessagingException me)
    {
-      handleClientFailure(clientSessionID , true);
+      if (me instanceof RemotingException)
+      {
+         RemotingException re = (RemotingException) me;
+         handleClientFailure(re.getSessionID(), true);
+      }
    }
    
    // Public ---------------------------------------------------------------------------------------
 
-   /*
-    * Used in testing only
-    */
-   public synchronized boolean containsRemotingSession(String remotingClientSessionID)
-   {
-      return remotingSessions.containsKey(remotingClientSessionID);
-   }
-
-   /*
-    * Used in testing only
-    */
-   public synchronized Map getClients()
-   {
-      return Collections.unmodifiableMap(jmsClients);
-   }
-   
    public String toString()
    {
       return "ConnectionManager[" + Integer.toHexString(hashCode()) + "]";
@@ -232,152 +168,96 @@
 
    // Private --------------------------------------------------------------------------------------
 
-   private ConnectionFactoryCallbackInformation getCFInfo(String uniqueName)
+   /**
+    * @param clientToServer - true if the failure has been detected on a direct connection from
+    *        client to this server, false if the failure has been detected while trying to send a
+    *        callback from this server to the client.
+    */
+   private synchronized void handleClientFailure(String remotingSessionID, boolean clientToServer)
    {
-      ConnectionFactoryCallbackInformation callback = cfCallbackInfo.get(uniqueName);
-      if (callback == null)
-      {
-         callback = new ConnectionFactoryCallbackInformation(uniqueName);
-         cfCallbackInfo.put(uniqueName, callback);
-         callback = cfCallbackInfo.get(uniqueName);
-      }
-      return callback;
-   }
+      String clientVMID = clients.get(remotingSessionID);
 
-
-   private synchronized void closeConsumersForClientVMID(String jmsClientID)
-   {
-      if (jmsClientID == null)
+      if (clientVMID == null)
       {
          return;
       }
-      // Remoting only provides one pinger per invoker, not per connection therefore when the pinger
-      // dies we must close ALL connections corresponding to that jms client ID.
-
-      Map<String, ServerConnectionEndpoint> endpoints = jmsClients.get(jmsClientID);
-
-      if (endpoints != null)
-      {
-         List<ServerConnectionEndpoint> sces = new ArrayList<ServerConnectionEndpoint>();
-
-         for (Map.Entry<String, ServerConnectionEndpoint> entry: endpoints.entrySet())
-         {
-            ServerConnectionEndpoint sce = entry.getValue();
-            sces.add(sce);
-         }
-
-         // Now close the end points - this will result in a callback into unregisterConnection
-         // to remove the data from the jmsClients and sessions maps.
-         // Note we do this outside the loop to prevent ConcurrentModificationException
-
-         for(ServerConnectionEndpoint sce: sces )
-         {
-            try
-            {
-      			log.debug("clearing up state for connection " + sce);
-               sce.close();
-               log.debug("cleared up state for connection " + sce);
-            }
-            catch (Exception e)
-            {
-               log.error("Failed to close connection", e);
-            }          
-         }
-      }
       
-      for (ConnectionFactoryCallbackInformation cfInfo: cfCallbackInfo.values())
-      {
-         PacketSender[] senders = cfInfo.getAllSenders(jmsClientID);
-         for (PacketSender sender: senders)
-         {
-            cfInfo.removeSender(jmsClientID, sender);
-         }
+      log.warn("A problem has been detected " +
+         (clientToServer ?
+            "with the connection to remote client ":
+            "trying to send a message to remote client ") +
+         remotingSessionID + ", client VM ID=" + clientVMID + ". It is possible the client has exited without closing " +
+         "its connection(s) or the network has failed. All connection resources " +
+         "corresponding to that client process will now be removed.");
 
-      }
-
+      closeConsumers(remotingSessionID);
+      
+      dump();
    }
 
-   // Inner classes --------------------------------------------------------------------------------
-
-   /** Class used to organize Callbacks on ClusteredConnectionFactories */
-   static class ConnectionFactoryCallbackInformation
+   private synchronized void closeConsumers(String remotingClientSessionID)
    {
-
-      // We keep two lists, one containing all clients a CF will have to maintain and another
-      //   organized by JVMId as we will need that organization when cleaning up dead clients
-      String uniqueName;
-      Map</**VMID */ String , /** Active clients*/ConcurrentHashSet<PacketSender>> clientSendersByVM;
-      ConcurrentHashSet<PacketSender> clientSenders;
-
-
-      public ConnectionFactoryCallbackInformation(String uniqueName)
-      {
-         this.uniqueName = uniqueName;
-         this.clientSendersByVM = new ConcurrentHashMap<String, ConcurrentHashSet<PacketSender>>();
-         this.clientSenders = new ConcurrentHashSet<PacketSender>();
-      }
-
-      public void addClient(String vmID, PacketSender sender)
-      {
-         clientSenders.add(sender);
-         getSendersList(vmID).add(sender);
-      }
+      assert remotingClientSessionID != null;
       
-      public PacketSender[] getAllSenders(String vmID)
+      List<ServerConnectionEndpoint> connectionEndpoints = endpoints.get(remotingClientSessionID);
+      // the connection endpoints are copied in a new list to avoid concurrent modification exception
+      List<ServerConnectionEndpoint> copy;
+      if (connectionEndpoints != null)
+         copy = new ArrayList<ServerConnectionEndpoint>(connectionEndpoints);
+      else
+         copy = new ArrayList<ServerConnectionEndpoint>();
+         
+      for (ServerConnectionEndpoint sce : copy)
       {
-         Set<PacketSender> list = getSendersList(vmID);
-         return (PacketSender[]) list.toArray(new PacketSender[list.size()]);
-      }
-
-      public PacketSender[] getAllSenders()
-      {
-         return (PacketSender[]) clientSenders.toArray(new PacketSender[clientSenders.size()]);
-      }
-
-      public void removeSender(String vmID, PacketSender sender)
-      {
-         clientSenders.remove(sender);
-         getSendersList(vmID).remove(sender);
-      }
-      
-      private ConcurrentHashSet<PacketSender> getSendersList(String vmID)
-      {
-         ConcurrentHashSet<PacketSender> perVMList = clientSendersByVM.get(vmID);
-         if (perVMList == null)
+         try
          {
-            perVMList = new ConcurrentHashSet<PacketSender>();
-            clientSendersByVM.put(vmID, perVMList);
-            perVMList = clientSendersByVM.get(vmID);
+            log.debug("clearing up state for connection " + sce);
+            sce.close();
+            log.debug("cleared up state for connection " + sce);
          }
-         return perVMList;
+         catch (Exception e)
+         {
+            log.error("Failed to close connection", e);
+         }          
       }
    }
    
    private void dump()
    {
-   	log.debug("***********Dumping conn map");
-   	for (Iterator iter = jmsClients.entrySet().iterator(); iter.hasNext(); )
-   	{
-   		Map.Entry entry = (Map.Entry)iter.next();
-   		
-   		String jmsClientVMID = (String)entry.getKey();
-   		
-   		Map endpoints = (Map)entry.getValue();
-   		
-   		log.debug(jmsClientVMID + "----->");
-   		
-   		for (Iterator iter2 = endpoints.entrySet().iterator(); iter2.hasNext(); )
-      	{
-   			Map.Entry entry2 = (Map.Entry)iter2.next();
-   			
-   			String sessionID = (String)entry2.getKey();
-   			
-   			ServerConnectionEndpoint endpoint = (ServerConnectionEndpoint)entry2.getValue();
-   			
-   			log.debug("            " + sessionID + "------>" + System.identityHashCode(endpoint));
-      	}
-   	}
-   	log.debug("*** Dumped conn map");
+      if (log.isDebugEnabled())
+      {
+         StringBuffer buff = new StringBuffer("*********** Dumping connections\n");
+         buff.append("this client VM ID: ").append(JMSClientVMIdentifier.instance).append("\n");
+         buff.append("remoting session ID <----> client VM ID:\n");
+         if (clients.size() == 0)
+         {
+            buff.append("    No registered sessions\n");
+         }
+         for (Entry<String, String> client : clients.entrySet())
+         {
+            String remotingSessionID = client.getKey();
+            String clientVMID = client.getValue();
+            buff.append("    ").append(remotingSessionID).append(" <----> ").append(clientVMID).append("\n");
+         }
+         buff.append("remoting session ID -----> server connection endpoints:\n");
+         if (endpoints.size() == 0)
+         {
+            buff.append("    No registered endpoints\n");
+         }
+         for (Entry<String, List<ServerConnectionEndpoint>> entry : endpoints.entrySet())
+         {
+            List<ServerConnectionEndpoint> connectionEndpoints = entry.getValue();
+            buff.append("    "  + entry.getKey() + "----->\n");
+            for (ServerConnectionEndpoint sce : connectionEndpoints)
+            {
+               buff.append("        " + sce + " (" + System.identityHashCode(sce) + ")\n");
+            }
+         }
+         buff.append("*** Dumped connections");
+         log.debug(buff);
+      }
    }
+   
+   // Inner classes --------------------------------------------------------------------------------
 
 }

Modified: trunk/src/main/org/jboss/jms/server/endpoint/MessagingServerPacketHandler.java
===================================================================
--- trunk/src/main/org/jboss/jms/server/endpoint/MessagingServerPacketHandler.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/server/endpoint/MessagingServerPacketHandler.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -135,19 +135,4 @@
 
       return new CreateConnectionResponse(connectionID);
    }
-   
-   public void addSender(String VMID, String remotingSessionID,
-         PacketSender sender) throws Exception
-   {
-      log.debug("Adding PacketSender on ConnectionFactory");
-      messagingServer.getConnectionManager().addConnectionFactoryCallback(getID(), VMID, remotingSessionID, sender);
-   }
-
-   public void removeSender(String VMID, String remotingSessionID,
-         PacketSender sender) throws Exception
-   {
-      log.debug("Removing PacketSender on ConnectionFactory");
-      messagingServer.getConnectionManager().removeConnectionFactoryCallback(getID(), VMID, sender);
-   }
-
 }

Modified: trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionEndpoint.java
===================================================================
--- trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionEndpoint.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionEndpoint.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -138,7 +138,7 @@
       String sessionID = UUID.randomUUID().toString();
  
       ServerSessionEndpoint ep =
-         new ServerSessionEndpoint(sessionID, this, autoCommitSends, autoCommitAcks, xa, messagingServer.getResourceManager());            
+         new ServerSessionEndpoint(sessionID, this, autoCommitSends, autoCommitAcks, xa, sender, messagingServer.getResourceManager());            
 
       synchronized (sessions)
       {
@@ -189,7 +189,7 @@
 
       temporaryQueues.clear();      
 
-      cm.unregisterConnection(jmsClientVMID, remotingClientSessionID);
+      cm.unregisterConnection(remotingClientSessionID, this);
 
       messagingServer.getRemotingService().getDispatcher().unregister(id);
    }

Modified: trunk/src/main/org/jboss/jms/server/endpoint/ServerConsumerEndpoint.java
===================================================================
--- trunk/src/main/org/jboss/jms/server/endpoint/ServerConsumerEndpoint.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/server/endpoint/ServerConsumerEndpoint.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -178,7 +178,7 @@
                    
          try
          {
-         	sessionEndpoint.handleDelivery(ref, this, replier);
+         	sessionEndpoint.handleDelivery(ref, this);
          }
          catch (Exception e)
          {
@@ -303,15 +303,6 @@
       sessionEndpoint.promptDelivery(messageQueue);
    }
 
-   private PacketSender replier;
-
-   //FIXME - this is a hack - we shouldn't have to wait for a change rate message before we can send
-   //a message to the client
-   private void setReplier(PacketSender replier)
-   {
-      this.replier = replier;
-   }
-
    // Inner classes --------------------------------------------------------------------------------
    
    private class ServerConsumerEndpointPacketHandler extends ServerPacketHandlerSupport
@@ -330,8 +321,6 @@
          
          if (type == CONS_FLOWTOKEN)
          {
-            setReplier(sender);
-
             ConsumerFlowTokenMessage message = (ConsumerFlowTokenMessage) packet;
             
             receiveTokens(message.getTokens());
@@ -339,8 +328,6 @@
          else if (type == CLOSE)
          {
             close();
-            
-            setReplier(null);
          }
          else
          {

Modified: trunk/src/main/org/jboss/jms/server/endpoint/ServerSessionEndpoint.java
===================================================================
--- trunk/src/main/org/jboss/jms/server/endpoint/ServerSessionEndpoint.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/jms/server/endpoint/ServerSessionEndpoint.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -170,12 +170,14 @@
 
    private final ResourceManager resourceManager;
 
+   private PacketSender sender;
+
    // Constructors
    // ---------------------------------------------------------------------------------
 
    ServerSessionEndpoint(String sessionID,
          ServerConnectionEndpoint connectionEndpoint, boolean autoCommitSends,
-         boolean autoCommitAcks, boolean xa, ResourceManager resourceManager)
+         boolean autoCommitAcks, boolean xa, PacketSender sender, ResourceManager resourceManager)
          throws Exception
    {
       this.id = sessionID;
@@ -194,6 +196,8 @@
       this.autoCommitSends = autoCommitSends;
 
       this.autoCommitAcks = autoCommitAcks;
+      
+      this.sender = sender;
 
       this.resourceManager = resourceManager;
    }
@@ -230,11 +234,8 @@
       }
    }
 
-   synchronized void handleDelivery(MessageReference ref, ServerConsumerEndpoint consumer, PacketSender sender) throws Exception
+   synchronized void handleDelivery(MessageReference ref, ServerConsumerEndpoint consumer) throws Exception
    {
-      // FIXME - we shouldn't have to pass in the packet Sender - this should be
-      // creatable
-      // without the consumer having to call change rate first
       Delivery delivery = new DeliveryImpl(ref, consumer.getID(),
             deliveryIDSequence++, sender);
 

Modified: trunk/src/main/org/jboss/messaging/core/impl/server/MessagingServerImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/impl/server/MessagingServerImpl.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/impl/server/MessagingServerImpl.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -189,7 +189,7 @@
          securityDeployer.start();
          queueSettingsDeployer.start();
          connectionManager.start();
-         remotingService.addConnectionExceptionListener(connectionManager);
+         remotingService.addFailureListener(connectionManager);
          memoryManager.start();
          postOffice.start();
          MessagingServerPacketHandler serverPacketHandler =  new MessagingServerPacketHandler(this);
@@ -236,7 +236,7 @@
          securityDeployer.stop();
          queueSettingsDeployer.stop();
          connectionManager.stop();
-         remotingService.removeConnectionExceptionListener(connectionManager);
+         remotingService.removeFailureListener(connectionManager);
          connectionManager = null;
          memoryManager.stop();
          memoryManager = null;

Deleted: trunk/src/main/org/jboss/messaging/core/remoting/Client.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/Client.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/Client.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,58 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting;
-
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
-
-import org.jboss.jms.client.api.FailureListener;
-import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
-import org.jboss.messaging.util.MessagingException;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
- * 
- * @version <tt>$Revision$</tt>
- * 
- */
-public interface Client
-{
-
-   void connect() throws Exception;
-
-   boolean disconnect() throws Exception;
-
-   boolean isConnected();
-
-   String getURI();
-
-   String getSessionID();
-
-   /**
-    * @param packet
-    *           The packet which is sent
-    * @param oneWay
-    *           if the packet must be sent one-way (i.e. do not wait for a
-    *           response)
-    * @return an {@link AbstractPacket} (if <code>oneWay</code> was set to
-    *         <code>false</code>) or <code>null</code> (if
-    *         <code>oneWay</code> was set to <code>true</code>)
-    * 
-    * @throws MessagingException
-    *            if an exception has occured on the server
-    * @throws IOException
-    *            if an exception has occured on the network
-    */
-   AbstractPacket send(AbstractPacket packet, boolean oneWay)
-         throws Exception;
-
-   void setBlockingRequestTimeout(int timeout, TimeUnit unit);
-
-   void setFailureListener(final FailureListener listener);
-   
-   FailureListener getFailureListener();
-}
\ No newline at end of file

Deleted: trunk/src/main/org/jboss/messaging/core/remoting/ConnectionExceptionListener.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/ConnectionExceptionListener.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/ConnectionExceptionListener.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,19 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
- *
- * @version <tt>$Revision$</tt>
- *
- */
-public interface ConnectionExceptionListener
-{
-   void handleConnectionException(Throwable t, String sessionID);
-
-}

Modified: trunk/src/main/org/jboss/messaging/core/remoting/ConnectorRegistry.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/ConnectorRegistry.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/ConnectorRegistry.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -6,7 +6,6 @@
  */
 package org.jboss.messaging.core.remoting;
 
-import org.jboss.messaging.core.remoting.impl.ClientImpl;
 import org.jboss.messaging.core.remoting.impl.invm.INVMConnector;
 import org.jboss.messaging.core.remoting.impl.mina.MinaService;
 

Modified: trunk/src/main/org/jboss/messaging/core/remoting/KeepAliveFactory.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/KeepAliveFactory.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/KeepAliveFactory.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -18,7 +18,9 @@
 public interface KeepAliveFactory
 {
 
-   Ping ping();
+   Ping ping(String sessionID);
    
-   Pong pong();
+   Pong pong(String sessionID, Ping ping);
+
+   boolean isPing(String sessionID, Object message);
 }

Modified: trunk/src/main/org/jboss/messaging/core/remoting/PacketDispatcher.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/PacketDispatcher.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/PacketDispatcher.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -14,7 +14,6 @@
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.jboss.messaging.core.remoting.wireformat.Packet;
-import org.jboss.messaging.core.remoting.wireformat.SessionSetIDMessage;
 import org.jboss.messaging.util.Logger;
 
 /**
@@ -36,7 +35,6 @@
    // Static --------------------------------------------------------
 
    public static final PacketDispatcher client = new PacketDispatcher();
-   public static final Map<String, String> sessions = new ConcurrentHashMap<String, String>();
 
    // Constructors --------------------------------------------------
 
@@ -89,18 +87,6 @@
    
    public void dispatch(Packet packet, PacketSender sender) throws Exception
    {
-      //FIXME better separation between client and server PacketDispatchers
-      if (this != client)
-      {
-         if (packet instanceof SessionSetIDMessage)
-         {
-            String clientSessionID = ((SessionSetIDMessage)packet).getSessionID();
-            if (log.isDebugEnabled())
-               log.debug("associated server session " + sender.getSessionID() + " to client " + clientSessionID);
-            sessions.put(sender.getSessionID(), clientSessionID);
-            return;
-         }
-      }
       String targetID = packet.getTargetID();
       if (NO_ID_SET.equals(targetID))
       {

Modified: trunk/src/main/org/jboss/messaging/core/remoting/RemotingService.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/RemotingService.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/RemotingService.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -6,6 +6,7 @@
  */
 package org.jboss.messaging.core.remoting;
 
+import org.jboss.jms.client.api.FailureListener;
 import org.jboss.messaging.core.MessagingComponent;
 
 /**
@@ -24,7 +25,7 @@
 
    void removeInterceptor(Interceptor interceptor);
 
-   void addConnectionExceptionListener(ConnectionExceptionListener listener);
+   void addFailureListener(FailureListener listener);
 
-   void removeConnectionExceptionListener(ConnectionExceptionListener listener);  
+   void removeFailureListener(FailureListener listener);  
 }

Added: trunk/src/main/org/jboss/messaging/core/remoting/codec/PingCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/codec/PingCodec.java	                        (rev 0)
+++ trunk/src/main/org/jboss/messaging/core/remoting/codec/PingCodec.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,67 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.messaging.core.remoting.codec;
+
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.PING;
+
+import org.jboss.messaging.core.remoting.wireformat.Ping;
+
+/**
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ */
+public class PingCodec extends AbstractPacketCodec<Ping>
+{
+
+   // Constants -----------------------------------------------------
+
+   // Attributes ----------------------------------------------------
+
+   // Static --------------------------------------------------------
+
+   // Constructors --------------------------------------------------
+
+   public PingCodec()
+   {
+      super(PING);
+   }
+
+   // Public --------------------------------------------------------
+
+   // AbstractPacketCodec overrides ---------------------------------
+
+   @Override
+   protected void encodeBody(Ping packet, RemotingBuffer out)
+         throws Exception
+   {
+      String clientSessionID = packet.getSessionID();
+
+      out.putInt(sizeof(clientSessionID));
+      out.putNullableString(clientSessionID);
+   }
+
+   @Override
+   protected Ping decodeBody(RemotingBuffer in)
+         throws Exception
+   {
+      int bodyLength = in.getInt();
+      if (bodyLength > in.remaining())
+      {
+         return null;
+      }
+      String clientSessionID = in.getNullableString();
+
+      return new Ping(clientSessionID);
+   }
+
+   // Package protected ---------------------------------------------
+
+   // Protected -----------------------------------------------------
+
+   // Private -------------------------------------------------------
+
+   // Inner classes -------------------------------------------------
+}

Added: trunk/src/main/org/jboss/messaging/core/remoting/codec/PongCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/codec/PongCodec.java	                        (rev 0)
+++ trunk/src/main/org/jboss/messaging/core/remoting/codec/PongCodec.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,69 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.messaging.core.remoting.codec;
+
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.PONG;
+
+import org.jboss.messaging.core.remoting.wireformat.Pong;
+
+/**
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ */
+public class PongCodec extends AbstractPacketCodec<Pong>
+{
+
+   // Constants -----------------------------------------------------
+
+   // Attributes ----------------------------------------------------
+
+   // Static --------------------------------------------------------
+
+   // Constructors --------------------------------------------------
+
+   public PongCodec()
+   {
+      super(PONG);
+   }
+
+   // Public --------------------------------------------------------
+
+   // AbstractPacketCodec overrides ---------------------------------
+
+   @Override
+   protected void encodeBody(Pong packet, RemotingBuffer out) throws Exception
+   {
+      String sessionID = packet.getSessionID();
+      boolean sessionFailed = packet.isSessionFailed();
+
+      int bodyLength = sizeof(sessionID) + BOOLEAN_LENGTH;
+
+      out.putInt(bodyLength);
+      out.putNullableString(sessionID);
+      out.putBoolean(sessionFailed);
+   }
+
+   @Override
+   protected Pong decodeBody(RemotingBuffer in) throws Exception
+   {
+      int bodyLength = in.getInt();
+      if (bodyLength > in.remaining())
+      {
+         return null;
+      }
+      String sessionID = in.getNullableString();
+      boolean sessionFailed = in.getBoolean();
+      return new Pong(sessionID, sessionFailed);
+   }
+
+   // Package protected ---------------------------------------------
+
+   // Protected -----------------------------------------------------
+
+   // Private -------------------------------------------------------
+
+   // Inner classes -------------------------------------------------
+}

Deleted: trunk/src/main/org/jboss/messaging/core/remoting/codec/SessionSetIDMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/codec/SessionSetIDMessageCodec.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/codec/SessionSetIDMessageCodec.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,67 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting.codec;
-
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_SETID;
-
-import org.jboss.messaging.core.remoting.wireformat.SessionSetIDMessage;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
- */
-public class SessionSetIDMessageCodec extends
-      AbstractPacketCodec<SessionSetIDMessage>
-{
-
-   // Constants -----------------------------------------------------
-
-   // Attributes ----------------------------------------------------
-
-   // Static --------------------------------------------------------
-
-   // Constructors --------------------------------------------------
-
-   public SessionSetIDMessageCodec()
-   {
-      super(SESS_SETID);
-   }
-
-   // Public --------------------------------------------------------
-
-   // AbstractPacketCodec overrides ---------------------------------
-
-   @Override
-   protected void encodeBody(SessionSetIDMessage message, RemotingBuffer out)
-         throws Exception
-   {
-      String sessionID = message.getSessionID();
-
-      out.putInt(sizeof(sessionID));
-      out.putNullableString(sessionID);
-   }
-
-   @Override
-   protected SessionSetIDMessage decodeBody(RemotingBuffer in) throws Exception
-   {
-      int bodyLength = in.getInt();
-      if (bodyLength > in.remaining())
-      {
-         return null;
-      }
-      String sessionID = in.getNullableString();
-
-      return new SessionSetIDMessage(sessionID);
-   }
-
-   // Package protected ---------------------------------------------
-
-   // Protected -----------------------------------------------------
-
-   // Private -------------------------------------------------------
-
-   // Inner classes -------------------------------------------------
-}
\ No newline at end of file

Deleted: trunk/src/main/org/jboss/messaging/core/remoting/impl/ClientImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/ClientImpl.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/ClientImpl.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,202 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting.impl;
-
-import static java.util.concurrent.TimeUnit.SECONDS;
-
-import java.util.concurrent.TimeUnit;
-
-import org.jboss.jms.client.api.FailureListener;
-import org.jboss.messaging.core.remoting.Client;
-import org.jboss.messaging.core.remoting.NIOConnector;
-import org.jboss.messaging.core.remoting.NIOSession;
-import org.jboss.messaging.core.remoting.RemotingConfiguration;
-import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
-import org.jboss.messaging.util.Logger;
-import org.jboss.messaging.util.MessagingException;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
- * 
- * @version <tt>$Revision$</tt>
- */
-public class ClientImpl implements Client
-{
-   // Constants -----------------------------------------------------
-
-   private final Logger log = Logger.getLogger(ClientImpl.class);
-
-   // Attributes ----------------------------------------------------
-
-   private final NIOConnector connector;
-
-   private NIOSession session;
-
-   // By default, a blocking request will timeout after 5 seconds
-   private int blockingRequestTimeout = 5;
-   
-   private TimeUnit blockingRequestTimeUnit = SECONDS;
-   
-   private FailureListener failureListener;
-   
-   // Static --------------------------------------------------------
-
-   // Constructors --------------------------------------------------
-
-   public ClientImpl(NIOConnector connector, RemotingConfiguration remotingConfig)
-   {
-      assert connector != null;
-      assert remotingConfig != null;
-      
-      this.connector = connector;
-      setBlockingRequestTimeout(remotingConfig.getTimeout(), SECONDS);
-   }
-
-   // Public --------------------------------------------------------
-
-   /* (non-Javadoc)
-    * @see org.jboss.messaging.core.remoting.Client#connect()
-    */
-   public void connect() throws Exception
-   {
-      this.session = connector.connect();
-   }
-
-   /* (non-Javadoc)
-    * @see org.jboss.messaging.core.remoting.Client#disconnect()
-    */
-   public boolean disconnect() throws Exception
-   {
-      if (session == null)
-      {
-         return false;         
-      }
-      session = null;
-      return true;
-   }
-
-   /* (non-Javadoc)
-    * @see org.jboss.messaging.core.remoting.Client#getSessionID()
-    */
-   public String getSessionID()
-   {
-      if (session == null || !session.isConnected())
-      {
-         return null;
-      }
-      return session.getID();
-   }
-
-   public AbstractPacket send(AbstractPacket packet, boolean oneWay)
-         throws Exception
-   {
-      assert packet != null;
-      checkConnected();
-      packet.setOneWay(oneWay);
-
-      if (oneWay)
-      {
-         sendOneWay(packet);
-         return null;
-      } else 
-      {
-         return sendBlocking(packet);
-      }
-   }
-
-   /* (non-Javadoc)
-    * @see org.jboss.messaging.core.remoting.Client#setBlockingRequestTimeout(int, java.util.concurrent.TimeUnit)
-    */
-   public void setBlockingRequestTimeout(int timeout, TimeUnit unit)
-   {
-      this.blockingRequestTimeout = timeout;
-      this.blockingRequestTimeUnit = unit;
-   }
-
-   public void setFailureListener(final FailureListener listener)
-   {
-      if (listener == null && failureListener != null)
-      {
-         connector.removeFailureListener(failureListener);
-         
-         failureListener = null;
-      }
-      else
-      {
-         if (failureListener != null)
-         {
-            throw new IllegalStateException("Cannot set FailureListener - already has one set");
-         }
-         connector.addFailureListener(listener);
-         
-         failureListener = listener;
-      }
-   }
-
-   public FailureListener getFailureListener()
-   {
-      return failureListener;
-   }
-
-   /* (non-Javadoc)
-    * @see org.jboss.messaging.core.remoting.Client#isConnected()
-    */
-   public boolean isConnected()
-   {
-      if (session == null)
-         return false;
-      else
-         return session.isConnected();
-   }
-
-   /* (non-Javadoc)
-    * @see org.jboss.messaging.core.remoting.Client#getURI()
-    */
-   public String getURI()
-   {
-      return connector.getServerURI();
-   }
-
-   @Override
-   public String toString()
-   {
-      return "Client[session=" + session + "]";
-   }
-
-   // Package protected ---------------------------------------------
-
-   // Protected -----------------------------------------------------
-
-   // Private -------------------------------------------------------
-
-   private void checkConnected() throws MessagingException
-   {
-      if (session == null)
-      {
-         throw new IllegalStateException("Client " + this
-               + " is not connected.");
-      }
-      if (!session.isConnected())
-      {
-         throw new MessagingException(MessagingException.NOT_CONNECTED);
-      }
-   }
-   
-   private void sendOneWay(AbstractPacket packet) throws Exception
-   {
-      session.write(packet);
-   }
-
-   private AbstractPacket sendBlocking(AbstractPacket packet) throws Exception
-   {
-      AbstractPacket response = (AbstractPacket) session.writeAndBlock(packet, 
-                                               blockingRequestTimeout, blockingRequestTimeUnit);
-      return response;
-   }
-
-   // Inner classes -------------------------------------------------
-}

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/invm/INVMSession.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/invm/INVMSession.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/invm/INVMSession.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -10,7 +10,6 @@
 
 import java.util.concurrent.TimeUnit;
 
-import org.jboss.jms.exception.JMSExceptionHelper;
 import org.jboss.messaging.core.remoting.NIOSession;
 import org.jboss.messaging.core.remoting.PacketDispatcher;
 import org.jboss.messaging.core.remoting.PacketSender;
@@ -33,7 +32,8 @@
    private String id;
    private long correlationCounter;
    private PacketDispatcher serverDispatcher;
-
+   private boolean connected;
+   
    // Static --------------------------------------------------------
    private static final Logger log = Logger.getLogger(INVMSession.class);
 
@@ -46,12 +46,14 @@
       this.id = randomUUID().toString();
       this.correlationCounter = 0;
       this.serverDispatcher = serverDispatcher;
+      connected = true;
    }
 
    // Public --------------------------------------------------------
 
    public boolean close()
    {
+      connected = false;
       return true;
    }
 
@@ -64,7 +66,7 @@
 
    public boolean isConnected()
    {
-      return true;
+      return connected;
    }
 
    public void write(final Object object) throws Exception
@@ -95,10 +97,26 @@
       serverDispatcher.dispatch(request,
             new PacketSender()
             {
-               public void send(Packet response) throws Exception
+               public void send(Packet response)
                {
-                  serverDispatcher.callFilters(response);
-                  responses[0] = response;
+                  try
+                  {
+                     serverDispatcher.callFilters(response);
+                     // 1st response is used to reply to the blocking request
+                     if (responses[0] == null)
+                     {
+                        responses[0] = response;
+                     } else 
+                     // other later responses are dispatched directly to the client
+                     {
+                        PacketDispatcher.client.dispatch(response, null);
+                     }
+                  }
+                  catch (Exception e)
+                  {
+                     log.warn("An interceptor throwed an exception what caused the packet " + response + " to be ignored", e);
+                     responses[0] = null;
+                  }
                }
 
                public String getSessionID()

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ClientKeepAliveFactory.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ClientKeepAliveFactory.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ClientKeepAliveFactory.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -21,7 +21,7 @@
    // Constants -----------------------------------------------------
 
    // Attributes ----------------------------------------------------
-
+   
    // Static --------------------------------------------------------
 
    // Constructors --------------------------------------------------
@@ -30,16 +30,21 @@
 
    // KeepAliveFactory implementation -------------------------------
    
-   public Ping ping()
+   public Ping ping(String clientSessionID)
    {
-      return new Ping();
+      return new Ping(clientSessionID);
    }
 
-   public Pong pong()
+   public boolean isPing(String sessionID, Object message)
    {
-      return new Pong();
+      return (message instanceof Ping);
    }
 
+   public Pong pong(String sessionID, Ping ping)
+   {
+      return new Pong(sessionID, false);
+   }
+
    // Package protected ---------------------------------------------
 
    // Protected -----------------------------------------------------

Deleted: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ConnectionExceptionNotifier.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ConnectionExceptionNotifier.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ConnectionExceptionNotifier.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,20 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting.impl.mina;
-
-
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
- *
- * @version <tt>$Revision$</tt>
- *
- */
-public interface ConnectionExceptionNotifier
-{
-   public abstract void fireConnectionException(Throwable t, String remoteSessionID);
-}
\ No newline at end of file

Copied: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FailureNotifier.java (from rev 3699, trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ConnectionExceptionNotifier.java)
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FailureNotifier.java	                        (rev 0)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FailureNotifier.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,22 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.messaging.core.remoting.impl.mina;
+
+import org.jboss.messaging.util.MessagingException;
+
+
+
+/**
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ *
+ * @version <tt>$Revision$</tt>
+ *
+ */
+public interface FailureNotifier
+{
+   public abstract void fireFailure(MessagingException e);
+}
\ No newline at end of file

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FilterChainSupport.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FilterChainSupport.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FilterChainSupport.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -41,11 +41,12 @@
    // Public --------------------------------------------------------
 
    public static void addKeepAliveFilter(DefaultIoFilterChainBuilder filterChain,
-         KeepAliveFactory factory, int keepAliveInterval, int keepAliveTimeout)
+         KeepAliveFactory factory, int keepAliveInterval, int keepAliveTimeout, FailureNotifier notifier)
    {
       assert filterChain != null;
       assert factory != null;
-      
+      assert notifier != null; 
+     
       if (keepAliveTimeout > keepAliveInterval)
       {
          throw new IllegalArgumentException("timeout must be greater than the interval: "
@@ -54,7 +55,7 @@
       }
 
       filterChain.addLast("keep-alive", new KeepAliveFilter(
-            new MinaKeepAliveFactory(factory), EXCEPTION, keepAliveInterval,
+            new MinaKeepAliveFactory(factory, notifier), EXCEPTION, keepAliveInterval,
             keepAliveTimeout));
    }
 

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaConnector.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaConnector.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaConnector.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -15,8 +15,8 @@
 
 import java.io.IOException;
 import java.net.InetSocketAddress;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.ScheduledExecutorService;
 
 import org.apache.mina.common.CloseFuture;
@@ -28,16 +28,16 @@
 import org.apache.mina.common.IoSession;
 import org.apache.mina.transport.socket.nio.NioSocketConnector;
 import org.jboss.jms.client.api.FailureListener;
-import org.jboss.messaging.core.remoting.ConnectionExceptionListener;
 import org.jboss.messaging.core.remoting.KeepAliveFactory;
 import org.jboss.messaging.core.remoting.NIOConnector;
 import org.jboss.messaging.core.remoting.NIOSession;
 import org.jboss.messaging.core.remoting.PacketDispatcher;
 import org.jboss.messaging.core.remoting.RemotingConfiguration;
 import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
-import org.jboss.messaging.core.remoting.wireformat.SessionSetIDMessage;
+import org.jboss.messaging.core.remoting.wireformat.Ping;
 import org.jboss.messaging.util.Logger;
 import org.jboss.messaging.util.MessagingException;
+import org.jboss.messaging.util.RemotingException;
 
 /**
  * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
@@ -45,7 +45,7 @@
  * @version <tt>$Revision$</tt>
  * 
  */
-public class MinaConnector implements NIOConnector, ConnectionExceptionNotifier
+public class MinaConnector implements NIOConnector, FailureNotifier
 {
    // Constants -----------------------------------------------------
 
@@ -61,9 +61,8 @@
 
    private IoSession session;
 
-   // FIXME clean up this listener mess
-   private Map<FailureListener, IoServiceListener> listeners = new HashMap<FailureListener, IoServiceListener>();
-   private ConnectionExceptionListener listener;
+   private List<FailureListener> listeners = new ArrayList<FailureListener>();
+   private IoServiceListenerAdapter ioListener;
 
    // Static --------------------------------------------------------
 
@@ -91,7 +90,7 @@
       addLoggingFilter(filterChain);
       blockingScheduler = addBlockingRequestResponseFilter(filterChain);
       addKeepAliveFilter(filterChain, keepAliveFactory, configuration.getKeepAliveInterval(),
-            configuration.getKeepAliveTimeout());
+            configuration.getKeepAliveTimeout(), this);
       addExecutorFilter(filterChain);
 
       connector.setHandler(new MinaHandler(PacketDispatcher.client, this));
@@ -110,6 +109,8 @@
       InetSocketAddress address = new InetSocketAddress(configuration.getHost(), configuration.getPort());
       ConnectFuture future = connector.connect(address);
       connector.setDefaultRemoteAddress(address);
+      ioListener = new IoServiceListenerAdapter();
+      connector.addListener(ioListener);
 
       future.awaitUninterruptibly();
       if (!future.isConnected())
@@ -117,8 +118,7 @@
          throw new IOException("Cannot connect to " + address.toString());
       }
       this.session = future.getSession();
-      AbstractPacket packet = new SessionSetIDMessage(Long.toString(session
-            .getId()));
+      AbstractPacket packet = new Ping(Long.toString(session.getId()));
       session.write(packet);
 
       return new MinaSession(session);
@@ -134,6 +134,7 @@
       CloseFuture closeFuture = session.close().awaitUninterruptibly();
       boolean closed = closeFuture.isClosed();
 
+      connector.removeListener(ioListener);
       connector.dispose();
       blockingScheduler.shutdown();
 
@@ -144,25 +145,22 @@
       return closed;
    }
 
-   public void addFailureListener(final FailureListener listener)
+   public synchronized void addFailureListener(final FailureListener listener)
    {
       assert listener != null;
       assert connector != null;
 
-      IoServiceListener ioListener = new IoServiceListenerAdapter(listener);
-      connector.addListener(ioListener);
-      listeners.put(listener, ioListener);
+      listeners.add(listener);
 
       if (log.isTraceEnabled())
          log.trace("added listener " + listener + " to " + this);
    }
 
-   public void removeFailureListener(FailureListener listener)
+   public synchronized void removeFailureListener(FailureListener listener)
    {
       assert listener != null;
       assert connector != null;
 
-      connector.removeListener(listeners.get(listener));
       listeners.remove(listener);
 
       if (log.isTraceEnabled())
@@ -173,25 +171,13 @@
    { 
       return configuration.getURI();
    }
-
-   public void setConnectionExceptionListener(ConnectionExceptionListener listener)
-   {
-      assert listener != null;
-      
-      this.listener = listener;
-   }
    
-   // ConnectionExceptionNotifier implementation -------------------------------
+   // FailureNotifier implementation -------------------------------
    
-   public void fireConnectionException(Throwable cause, String remoteSessionID)
+   public synchronized void fireFailure(MessagingException me)
    {
-      if (listener != null)
-         listener.handleConnectionException(cause, remoteSessionID);
-      
-      for (FailureListener listener: listeners.keySet())
+      for (FailureListener listener: listeners)
       {
-         MessagingException me = new MessagingException(MessagingException.CONNECTION_TIMEDOUT, "Timed out");
-         
          listener.onFailure(me);
       }
    }
@@ -216,11 +202,8 @@
       private final Logger log = Logger
             .getLogger(IoServiceListenerAdapter.class);
 
-      private final FailureListener listener;
-
-      private IoServiceListenerAdapter(FailureListener listener)
+      private IoServiceListenerAdapter()
       {
-         this.listener = listener;
       }
 
       public void serviceActivated(IoService service)
@@ -250,11 +233,9 @@
       public void sessionDestroyed(IoSession session)
       {
          log.warn("destroyed session " + session);
-
-         MessagingException me =
-            new MessagingException(MessagingException.INTERNAL_ERROR, "MINA session has been destroyed");
-         if (listener != null)
-            listener.onFailure(me);
+         RemotingException re =
+            new RemotingException(MessagingException.INTERNAL_ERROR, "MINA session has been destroyed", Long.toString(session.getId()));
+         fireFailure(re);
       }
    }
 }

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaHandler.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaHandler.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaHandler.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -6,20 +6,17 @@
  */
 package org.jboss.messaging.core.remoting.impl.mina;
 
-import java.io.IOException;
-import java.util.concurrent.TimeoutException;
-
 import org.apache.mina.common.IoHandlerAdapter;
 import org.apache.mina.common.IoSession;
-import org.apache.mina.filter.keepalive.KeepAliveTimeoutException;
 import org.apache.mina.filter.reqres.Response;
-import org.jboss.jms.exception.JMSExceptionHelper;
 import org.jboss.messaging.core.remoting.PacketDispatcher;
 import org.jboss.messaging.core.remoting.PacketSender;
 import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
 import org.jboss.messaging.core.remoting.wireformat.Packet;
 import org.jboss.messaging.core.remoting.wireformat.Ping;
 import org.jboss.messaging.util.Logger;
+import org.jboss.messaging.util.MessagingException;
+import org.jboss.messaging.util.RemotingException;
 
 /**
  * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
@@ -37,16 +34,16 @@
 
    private final PacketDispatcher dispatcher;
 
-   private ConnectionExceptionNotifier connectionExceptionNotifier;
+   private FailureNotifier failureNotifier;
 
    // Static --------------------------------------------------------
 
    // Constructors --------------------------------------------------
    
-   public MinaHandler(PacketDispatcher dispatcher, ConnectionExceptionNotifier keepAliveNotifier)
+   public MinaHandler(PacketDispatcher dispatcher, FailureNotifier failureNotifier)
    {
       this.dispatcher = dispatcher;
-      this.connectionExceptionNotifier = keepAliveNotifier;
+      this.failureNotifier = failureNotifier;
    }
 
    // Public --------------------------------------------------------
@@ -57,10 +54,14 @@
    public void exceptionCaught(IoSession session, Throwable cause)
          throws Exception
    {
-      if (connectionExceptionNotifier != null)
+      log.error("caught exception " + cause + " for session " + session);
+      
+      if (failureNotifier != null)
       {
          String serverSessionID = Long.toString(session.getId());
-         connectionExceptionNotifier.fireConnectionException(cause, serverSessionID);
+         RemotingException re = new RemotingException(MessagingException.INTERNAL_ERROR, "unexpected exception", serverSessionID);
+         re.initCause(cause);
+         failureNotifier.fireFailure(re);
       }
       // FIXME ugly way to know we're on the server side
       // close session only on the server side

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaKeepAliveFactory.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaKeepAliveFactory.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaKeepAliveFactory.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -11,54 +11,81 @@
 import org.jboss.messaging.core.remoting.KeepAliveFactory;
 import org.jboss.messaging.core.remoting.wireformat.Ping;
 import org.jboss.messaging.core.remoting.wireformat.Pong;
+import org.jboss.messaging.util.Logger;
+import org.jboss.messaging.util.MessagingException;
+import org.jboss.messaging.util.RemotingException;
 
 /**
  * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
- *
+ * 
  * @version <tt>$Revision$</tt>
- *
+ * 
  */
 public class MinaKeepAliveFactory implements KeepAliveMessageFactory
 {
-   // Constants -----------------------------------------------------
+   // Constant ------------------------------------------------------
 
+   private static final Logger log = Logger
+         .getLogger(MinaKeepAliveFactory.class);
+
    // Attributes ----------------------------------------------------
 
    private KeepAliveFactory innerFactory;
 
+   private FailureNotifier notifier;
+
    // Static --------------------------------------------------------
 
    // Constructors --------------------------------------------------
 
-   public MinaKeepAliveFactory(KeepAliveFactory factory)
+   public MinaKeepAliveFactory(KeepAliveFactory factory,
+         FailureNotifier notifier)
    {
       assert factory != null;
-      
+
+      this.notifier = notifier;
       this.innerFactory = factory;
    }
 
    // Public --------------------------------------------------------
 
    // KeepAliveMessageFactory implementation ------------------------
-   
+
    public Object getRequest(IoSession session)
    {
-      return innerFactory.ping();
+      return innerFactory.ping(Long.toString(session.getId()));
    }
 
    public Object getResponse(IoSession session, Object request)
    {
-      return innerFactory.pong();
+      assert request instanceof Ping;
+
+      return innerFactory.pong(Long.toString(session.getId()), (Ping) request);
    }
 
    public boolean isRequest(IoSession session, Object request)
    {
-      return (request instanceof Ping);
+      return innerFactory.isPing(Long.toString(session.getId()), request);
    }
 
    public boolean isResponse(IoSession session, Object response)
    {
-      return (response instanceof Pong);
+      if (response instanceof Pong)
+      {
+         Pong pong = (Pong) response;
+         if (pong.isSessionFailed() && notifier != null)
+         {
+            // FIXME better error code
+            notifier.fireFailure(new RemotingException(
+                  MessagingException.CONNECTION_TIMEDOUT,
+                  "Session has failed on the server", Long.toString(session
+                        .getId())));
+         }
+         return true;
+      } else
+      {
+         return false;
+      }
    }
 
    // Package protected ---------------------------------------------

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaService.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaService.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaService.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -19,16 +19,21 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.apache.mina.common.DefaultIoFilterChainBuilder;
+import org.apache.mina.common.IdleStatus;
+import org.apache.mina.common.IoService;
+import org.apache.mina.common.IoServiceListener;
+import org.apache.mina.common.IoSession;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 import org.jboss.beans.metadata.api.annotations.Install;
 import org.jboss.beans.metadata.api.annotations.Uninstall;
-import org.jboss.messaging.core.remoting.ConnectionExceptionListener;
+import org.jboss.jms.client.api.FailureListener;
 import org.jboss.messaging.core.remoting.Interceptor;
-import org.jboss.messaging.core.remoting.KeepAliveFactory;
 import org.jboss.messaging.core.remoting.PacketDispatcher;
 import org.jboss.messaging.core.remoting.RemotingConfiguration;
 import org.jboss.messaging.core.remoting.RemotingService;
 import org.jboss.messaging.util.Logger;
+import org.jboss.messaging.util.MessagingException;
+import org.jboss.messaging.util.RemotingException;
 
 /**
  * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
@@ -36,7 +41,7 @@
  * @version <tt>$Revision$</tt>
  * 
  */
-public class MinaService implements RemotingService, ConnectionExceptionNotifier
+public class MinaService implements RemotingService, FailureNotifier
 {
    // Constants -----------------------------------------------------
 
@@ -50,11 +55,13 @@
    
    private NioSocketAcceptor acceptor;
 
+   private IoServiceListener acceptorListener;
+
    private PacketDispatcher dispatcher;
 
-   private List<ConnectionExceptionListener> listeners = new ArrayList<ConnectionExceptionListener>();
+   private List<FailureListener> listeners = new ArrayList<FailureListener>();
 
-   private KeepAliveFactory factory;
+   private ServerKeepAliveFactory factory;
    
    private List<Interceptor> filters = new CopyOnWriteArrayList<Interceptor>();
 
@@ -67,7 +74,7 @@
       this(remotingConfig, new ServerKeepAliveFactory());
    }
 
-   public MinaService(RemotingConfiguration remotingConfig, KeepAliveFactory factory)
+   public MinaService(RemotingConfiguration remotingConfig, ServerKeepAliveFactory factory)
    {
       assert remotingConfig != null;
       assert factory != null;
@@ -89,14 +96,14 @@
       this.filters.remove(filter);
    }
 
-   public void addConnectionExceptionListener(ConnectionExceptionListener listener)
+   public void addFailureListener(FailureListener listener)
    {
       assert listener != null;
 
       listeners.add(listener);
    }
 
-   public void removeConnectionExceptionListener(ConnectionExceptionListener listener)
+   public void removeFailureListener(FailureListener listener)
    {
       assert listener != null;
 
@@ -119,7 +126,7 @@
          addCodecFilter(filterChain);
          addLoggingFilter(filterChain);
          addKeepAliveFilter(filterChain, factory,
-               remotingConfig.getKeepAliveInterval(), remotingConfig.getKeepAliveTimeout());
+               remotingConfig.getKeepAliveInterval(), remotingConfig.getKeepAliveTimeout(), this);
          addExecutorFilter(filterChain);
 
          // Bind
@@ -131,7 +138,9 @@
 
          acceptor.setHandler(new MinaHandler(dispatcher, this));
          acceptor.bind();
-
+         acceptorListener = new MinaSessionListener();
+         acceptor.addListener(acceptorListener);
+         
          boolean disableInvm = remotingConfig.isInvmDisabled();
          if (log.isDebugEnabled())
             log.debug("invm optimization for remoting is " + (disableInvm ? "disabled" : "enabled"));
@@ -146,6 +155,9 @@
    {
       if (acceptor != null)
       {
+         // remove the listener before disposing the acceptor
+         // so that we're not notified when the sessions are destroyed
+         acceptor.removeListener(acceptorListener);
          acceptor.unbind();
          acceptor.dispose();
          acceptor = null;
@@ -174,20 +186,26 @@
       return acceptor.getFilterChain();
    }
 
-   // ConnectionExceptionNotifier implementation -------------------------------
+   // FailureNotifier implementation -------------------------------
 
-   public void fireConnectionException(Throwable t, String remoteSessionID)
+   public void fireFailure(MessagingException me)
    {
-      for (ConnectionExceptionListener listener : listeners)
+      if (me instanceof RemotingException)
       {
-         String clientSessionID = PacketDispatcher.sessions.get(remoteSessionID);
-         listener.handleConnectionException(t, clientSessionID);
-      }
+         RemotingException re = (RemotingException) me;
+         String sessionID = re.getSessionID();
+         String clientSessionID = factory.getSessions().get(sessionID);
+         for (FailureListener listener : listeners)
+         {
+            listener.onFailure(new RemotingException(re.getCode(), re.getMessage(), clientSessionID));
+         }
+         factory.getSessions().remove(sessionID);  
+      }      
    }
 
    // Public --------------------------------------------------------
 
-   public void setKeepAliveFactory(KeepAliveFactory factory)
+   public void setKeepAliveFactory(ServerKeepAliveFactory factory)
    {
       assert factory != null;
       
@@ -208,4 +226,32 @@
    // Private -------------------------------------------------------
 
    // Inner classes -------------------------------------------------
-}
+
+   private final class MinaSessionListener implements IoServiceListener {
+
+      public void serviceActivated(IoService service)
+      {
+      }
+
+      public void serviceDeactivated(IoService service)
+      {
+      }
+
+      public void serviceIdle(IoService service, IdleStatus idleStatus)
+      {
+      }
+
+      public void sessionCreated(IoSession session)
+      {
+      }
+
+      public void sessionDestroyed(IoSession session)
+      {
+         String sessionID = Long.toString(session.getId());
+         if (factory.getSessions().containsKey(sessionID))
+         {
+            fireFailure(new RemotingException(MessagingException.INTERNAL_ERROR, "MINA session destroyed", sessionID));
+         }
+      }
+   }
+}
\ No newline at end of file

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/PacketCodecFactory.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/PacketCodecFactory.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/PacketCodecFactory.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -7,8 +7,6 @@
 package org.jboss.messaging.core.remoting.impl.mina;
 
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.NULL;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.PING;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.PONG;
 
 import org.apache.mina.filter.codec.demux.DemuxingProtocolCodecFactory;
 import org.jboss.messaging.core.remoting.codec.AbstractPacketCodec;
@@ -20,6 +18,8 @@
 import org.jboss.messaging.core.remoting.codec.CreateConnectionResponseMessageCodec;
 import org.jboss.messaging.core.remoting.codec.DeliverMessageCodec;
 import org.jboss.messaging.core.remoting.codec.MessagingExceptionMessageCodec;
+import org.jboss.messaging.core.remoting.codec.PingCodec;
+import org.jboss.messaging.core.remoting.codec.PongCodec;
 import org.jboss.messaging.core.remoting.codec.RemotingBuffer;
 import org.jboss.messaging.core.remoting.codec.SessionAcknowledgeMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionAddAddressMessageCodec;
@@ -40,7 +40,6 @@
 import org.jboss.messaging.core.remoting.codec.SessionQueueQueryResponseMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionRemoveAddressMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionSendMessageCodec;
-import org.jboss.messaging.core.remoting.codec.SessionSetIDMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionXACommitMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionXAEndMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionXAForgetMessageCodec;
@@ -96,7 +95,6 @@
 import org.jboss.messaging.core.remoting.wireformat.SessionRemoveAddressMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionRollbackMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionSendMessage;
-import org.jboss.messaging.core.remoting.wireformat.SessionSetIDMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionXACommitMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionXAEndMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionXAForgetMessage;
@@ -140,9 +138,8 @@
       addCodec(TextPacket.class, TextPacketCodec.class);
       addCodec(BytesPacket.class, BytesPacketCodec.class);
 
-      addCodecForEmptyPacket(PING, Ping.class);
-      addCodecForEmptyPacket(PONG, Pong.class);
-      addCodec(SessionSetIDMessage.class, SessionSetIDMessageCodec.class);
+      addCodec(Ping.class, PingCodec.class);
+      addCodec(Pong.class, PongCodec.class);
       
       addCodec(MessagingExceptionMessage.class, MessagingExceptionMessageCodec.class);
 

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ServerKeepAliveFactory.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ServerKeepAliveFactory.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/ServerKeepAliveFactory.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -6,22 +6,36 @@
  */
 package org.jboss.messaging.core.remoting.impl.mina;
 
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 import org.jboss.messaging.core.remoting.KeepAliveFactory;
 import org.jboss.messaging.core.remoting.wireformat.Ping;
 import org.jboss.messaging.core.remoting.wireformat.Pong;
+import org.jboss.messaging.util.Logger;
 
 /**
  * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
- *
+ * 
  * @version <tt>$Revision$</tt>
- *
+ * 
  */
 public class ServerKeepAliveFactory implements KeepAliveFactory
 {
    // Constants -----------------------------------------------------
 
+   private static final Logger log = Logger
+         .getLogger(ServerKeepAliveFactory.class);
+
    // Attributes ----------------------------------------------------
 
+   // FIXME session mapping must be cleaned when the server session is closed:
+   // either normally or exceptionally
+   /**
+    * Key = server session ID Value = client session ID
+    */
+   private Map<String, String> sessions = new ConcurrentHashMap<String, String>();
+
    // Static --------------------------------------------------------
 
    // Constructors --------------------------------------------------
@@ -29,17 +43,46 @@
    // Public --------------------------------------------------------
 
    // KeepAliveFactory implementation -------------------------------
-   
-   public Ping ping()
+
+   public Ping ping(String sessionID)
    {
-      return new Ping();
+      return new Ping(sessionID);
    }
 
-   public Pong pong()
+   public boolean isPing(String sessionID, Object message)
    {
-      return new Pong();
+      if (!(message instanceof Ping))
+      {
+         return false;
+      } else
+      {
+         Ping ping = (Ping) message;
+         String clientSessionID = ping.getSessionID();
+         if (clientSessionID.equals(sessionID))
+         {
+            return false;
+         } else
+         {
+            if (log.isDebugEnabled())
+               log.debug("associated server session " + sessionID
+                     + " to client " + clientSessionID);
+            sessions.put(sessionID, clientSessionID);
+            return true;
+         }
+      }
    }
 
+   public Pong pong(String sessionID, Ping ping)
+   {
+      String clientSessionID = ping.getSessionID();
+      return new Pong(sessionID, sessions.containsKey(clientSessionID));
+   }
+
+   public Map<String, String> getSessions()
+   {
+      return sessions;
+   }
+
    // Package protected ---------------------------------------------
 
    // Protected -----------------------------------------------------

Modified: trunk/src/main/org/jboss/messaging/core/remoting/wireformat/AbstractPacket.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/wireformat/AbstractPacket.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/wireformat/AbstractPacket.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -8,7 +8,7 @@
 
 import static org.jboss.messaging.core.remoting.Assert.assertValidID;
 
-import org.jboss.messaging.core.remoting.Client;
+import org.jboss.jms.client.remoting.MessagingRemotingConnection;
 
 /**
  * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
@@ -37,7 +37,7 @@
     * <code>oneWay</code> is <code>true</code> when the packet is sent "one way"
     * by the client which does not expect any response to it.
     * 
-    * @see Client#sendOneWay(AbstractPacket)
+    * @see MessagingRemotingConnection#sendOneWay(AbstractPacket)
     */
    private boolean oneWay = false;
    

Modified: trunk/src/main/org/jboss/messaging/core/remoting/wireformat/PacketType.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/wireformat/PacketType.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/wireformat/PacketType.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -35,7 +35,6 @@
    CONN_STOP                           ((byte)33),
 
    // Session   
-   SESS_SETID                          ((byte)40),   
    SESS_CREATECONSUMER                 ((byte)41),
    SESS_CREATECONSUMER_RESP            ((byte)42),   
    SESS_CREATEBROWSER                  ((byte)43),

Modified: trunk/src/main/org/jboss/messaging/core/remoting/wireformat/Ping.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/wireformat/Ping.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/wireformat/Ping.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -6,6 +6,7 @@
  */
 package org.jboss.messaging.core.remoting.wireformat;
 
+import static org.jboss.messaging.core.remoting.Assert.assertValidID;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.PING;
 
 /**
@@ -20,17 +21,34 @@
 
    // Attributes ----------------------------------------------------
 
+   private final String sessionID;
+
    // Static --------------------------------------------------------
 
    // Constructors --------------------------------------------------
 
-   public Ping()
+   public Ping(String sessionID)
    {
       super(PING);
+      
+      assertValidID(sessionID);
+      
+      this.sessionID = sessionID;
    }
    
    // Public --------------------------------------------------------
+   
+   public String getSessionID()
+   {
+      return sessionID;
+   }
 
+   @Override
+   public String toString()
+   {
+      return getParentString() + ", sessionID=" + sessionID + "]";
+   }
+   
    // Package protected ---------------------------------------------
 
    // Protected -----------------------------------------------------

Modified: trunk/src/main/org/jboss/messaging/core/remoting/wireformat/Pong.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/wireformat/Pong.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/wireformat/Pong.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -6,6 +6,7 @@
  */
 package org.jboss.messaging.core.remoting.wireformat;
 
+import static org.jboss.messaging.core.remoting.Assert.assertValidID;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.PONG;
 
 /**
@@ -20,17 +21,42 @@
 
    // Attributes ----------------------------------------------------
 
+   private final String sessionID;
+
+   private final boolean sessionFailed;
+
    // Static --------------------------------------------------------
 
    // Constructors --------------------------------------------------
 
-   public Pong()
+   public Pong(String sessionID, boolean sessionFailed)
    {
       super(PONG);
+
+      assertValidID(sessionID);
+
+      this.sessionID = sessionID;
+      this.sessionFailed = sessionFailed;
    }
-   
+
    // Public --------------------------------------------------------
 
+   public String getSessionID()
+   {
+      return sessionID;
+   }
+
+   public boolean isSessionFailed()
+   {
+      return sessionFailed;
+   }
+
+   @Override
+   public String toString()
+   {
+      return getParentString() + ", sessionID=" + sessionID + ", sessionFailed=" + sessionFailed + "]";
+   }
+   
    // Package protected ---------------------------------------------
 
    // Protected -----------------------------------------------------

Deleted: trunk/src/main/org/jboss/messaging/core/remoting/wireformat/SessionSetIDMessage.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/wireformat/SessionSetIDMessage.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/src/main/org/jboss/messaging/core/remoting/wireformat/SessionSetIDMessage.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,57 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting.wireformat;
-
-import static org.jboss.messaging.core.remoting.Assert.assertValidID;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_SETID;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
- * 
- * @version <tt>$Revision$</tt>
- */
-public class SessionSetIDMessage extends AbstractPacket
-{
-   // Constants -----------------------------------------------------
-
-   // Attributes ----------------------------------------------------
-
-   private final String sessionID;
-
-   // Static --------------------------------------------------------
-
-   // Constructors --------------------------------------------------
-
-   public SessionSetIDMessage(String sessionID)
-   {
-      super(SESS_SETID);
-
-      assertValidID(sessionID);
-      this.sessionID = sessionID;
-   }
-
-   // Public --------------------------------------------------------
-
-   public String getSessionID()
-   {
-      return sessionID;
-   }
-
-   @Override
-   public String toString()
-   {
-      return getParentString() + ", sessionID=" + sessionID + "]";
-   }
-
-   // Package protected ---------------------------------------------
-
-   // Protected -----------------------------------------------------
-
-   // Private -------------------------------------------------------
-
-   // Inner classes -------------------------------------------------
-}
\ No newline at end of file

Added: trunk/src/main/org/jboss/messaging/util/RemotingException.java
===================================================================
--- trunk/src/main/org/jboss/messaging/util/RemotingException.java	                        (rev 0)
+++ trunk/src/main/org/jboss/messaging/util/RemotingException.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.messaging.util;
+
+/**
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ *
+ * @version <tt>$Revision$</tt>
+ *
+ */
+public class RemotingException extends MessagingException
+{
+
+   // Constants -----------------------------------------------------
+
+   private static final long serialVersionUID = -6849945921631932738L;
+
+   // Attributes ----------------------------------------------------
+
+   private String sessionID;
+
+   // Static --------------------------------------------------------
+
+   // Constructors --------------------------------------------------
+
+   public RemotingException(int code, String message, String sessionID)
+   {
+      super(code, message);
+      this.sessionID = sessionID;
+   }
+
+   // Public --------------------------------------------------------
+
+   public String getSessionID()
+   {
+      return sessionID;
+   }
+   
+   // Package protected ---------------------------------------------
+
+   // Protected -----------------------------------------------------
+
+   // Private -------------------------------------------------------
+
+   // Inner classes -------------------------------------------------
+}

Modified: trunk/tests/build.xml
===================================================================
--- trunk/tests/build.xml	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/build.xml	2008-02-12 14:07:49 UTC (rev 3705)
@@ -491,6 +491,7 @@
          <sysproperty key="objectstore.dir" value="${objectstore.dir}"/>
          <jvmarg value="-Xmx512M"/>
          <!--<jvmarg line="-Xmx512M -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"/>-->
+         <!--<jvmarg value="-ea"/>-->
          <classpath refid="test.execution.classpath"/>
          <formatter type="xml" usefile="${junit.formatter.usefile}"/>
          <batchtest todir="${junit.batchtest.todir}"
@@ -505,14 +506,12 @@
 	       <exclude name="**/jms/XARecoveryTest.class"/>
 	       <exclude name="**/jms/XAResourceRecoveryTest.class"/>
 	       <exclude name="**/jms/XATest.class"/>
-	       <exclude name="**/jms/ClientExitTest.class"/>
 	       <exclude name="**/jms/ConnectionConsumerTest.class"/>
 	       
                <include name="**/messaging/util/**/${test-mask}.class"/>
                <exclude name="**/jms/MemLeakTest.class"/>
                <exclude name="**/jms/RemotingConnectionConfigurationTest.class"/>
                <exclude name="**/jms/stress/**"/>
-               <exclude name="**/jms/crash/ClientCrashTest.class"/>
                <exclude name="**/jms/bridge/**"/>
                <exclude name="**/jms/manual/**"/>
                <exclude name="**/jms/clustering/**"/>

Deleted: trunk/tests/src/org/jboss/messaging/core/remoting/impl/ClientTestBase.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/ClientTestBase.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/ClientTestBase.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,225 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting.impl;
-
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.MANY_MESSAGES;
-import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.reverse;
-
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.jboss.messaging.core.remoting.Client;
-import org.jboss.messaging.core.remoting.NIOConnector;
-import org.jboss.messaging.core.remoting.PacketDispatcher;
-import org.jboss.messaging.core.remoting.PacketSender;
-import org.jboss.messaging.core.remoting.RemotingConfiguration;
-import org.jboss.messaging.core.remoting.impl.mina.integration.test.ReversePacketHandler;
-import org.jboss.messaging.core.remoting.test.unit.TestPacketHandler;
-import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
-import org.jboss.messaging.core.remoting.wireformat.TextPacket;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
- * 
- * @version <tt>$Revision$</tt>
- */
-public abstract class ClientTestBase extends TestCase
-{
-   // Constants -----------------------------------------------------
-
-   // Attributes ----------------------------------------------------
-
-   protected Client client;
- 
-   protected ReversePacketHandler serverPacketHandler;
-
-   protected PacketDispatcher serverDispatcher;
-
-   private NIOConnector connector;
-
-   // Static --------------------------------------------------------
-
-   // Constructors --------------------------------------------------
-
-   // Public --------------------------------------------------------
-
-   public void testConnected() throws Exception
-   {
-      NIOConnector connector = createNIOConnector();
-      Client client = new ClientImpl(connector, createRemotingConfiguration());
-      
-      assertFalse(client.isConnected());
-
-      client.connect();
-      assertTrue(client.isConnected());
-
-      assertTrue(client.disconnect());
-      assertFalse(client.isConnected());
-      assertFalse(client.disconnect());
-      
-      connector.disconnect();
-   }    
-      
-   public void testSendOneWay() throws Exception
-   {
-      serverPacketHandler.expectMessage(1);
-
-      TextPacket packet = new TextPacket("testSendOneWay");
-      packet.setTargetID(serverPacketHandler.getID());
-      client.send(packet, true);
-
-      assertTrue(serverPacketHandler.await(2, SECONDS));
-
-      List<TextPacket> messages = serverPacketHandler.getPackets();
-      assertEquals(1, messages.size());
-      String response = ((TextPacket) messages.get(0)).getText();
-      assertEquals(packet.getText(), response);
-   }
-
-   public void testSendManyOneWay() throws Exception
-   {
-      serverPacketHandler.expectMessage(MANY_MESSAGES);
-
-      TextPacket[] packets = new TextPacket[MANY_MESSAGES];
-      for (int i = 0; i < MANY_MESSAGES; i++)
-      {
-         packets[i] = new TextPacket("testSendManyOneWay " + i);
-         packets[i].setTargetID(serverPacketHandler.getID());
-         client.send(packets[i], true);
-      }
-
-      assertTrue(serverPacketHandler.await(10, SECONDS));
-
-      List<TextPacket> receivedPackets = serverPacketHandler.getPackets();
-      assertEquals(MANY_MESSAGES, receivedPackets.size());
-      for (int i = 0; i < MANY_MESSAGES; i++)
-      {
-         TextPacket receivedPacket = (TextPacket) receivedPackets.get(i);
-         assertEquals(packets[i].getText(), receivedPacket.getText());
-      }
-   }
-
-   public void testSendOneWayWithCallbackHandler() throws Exception
-   {
-      TestPacketHandler callbackHandler = new TestPacketHandler();
-      callbackHandler.expectMessage(1);
-
-      PacketDispatcher.client.register(callbackHandler);
-
-      TextPacket packet = new TextPacket("testSendOneWayWithCallbackHandler");
-      packet.setTargetID(serverPacketHandler.getID());
-      packet.setCallbackID(callbackHandler.getID());
-
-      client.send(packet, true);
-
-      assertTrue(callbackHandler.await(5, SECONDS));
-
-      assertEquals(1, callbackHandler.getPackets().size());
-      String response = callbackHandler.getPackets().get(0).getText();
-      assertEquals(reverse(packet.getText()), response);
-   }
-
-   public void testSendBlocking() throws Exception
-   {
-      TextPacket request = new TextPacket("testSendBlocking");
-      request.setTargetID(serverPacketHandler.getID());
-
-      AbstractPacket receivedPacket = client.send(request, false);
-
-      assertNotNull(receivedPacket);
-      assertTrue(receivedPacket instanceof TextPacket);
-      TextPacket response = (TextPacket) receivedPacket;
-      assertEquals(reverse(request.getText()), response.getText());
-   }
-   
-   public void testCorrelationCounter() throws Exception
-   {
-      TextPacket request = new TextPacket("testSendBlocking");
-      request.setTargetID(serverPacketHandler.getID());
-
-      AbstractPacket receivedPacket = client.send(request, false);
-      long correlationID = request.getCorrelationID();
-      
-      assertNotNull(receivedPacket);      
-      assertEquals(request.getCorrelationID(), receivedPacket.getCorrelationID());
-      
-      receivedPacket = client.send(request, false);
-      assertEquals(correlationID + 1, request.getCorrelationID());
-      assertEquals(correlationID + 1, receivedPacket.getCorrelationID());      
-   }
-
-   public void testClientHandlePacketSentByServer() throws Exception
-   {
-      TestPacketHandler clientHandler = new TestPacketHandler();
-      PacketDispatcher.client.register(clientHandler);
-
-      serverPacketHandler.expectMessage(1);
-      clientHandler.expectMessage(1);
-
-      TextPacket packet = new TextPacket(
-            "testClientHandlePacketSentByServer from client");
-      packet.setTargetID(serverPacketHandler.getID());
-      // send a packet to create a sender when the server
-      // handles the packet
-      client.send(packet, true);
-
-      assertTrue(serverPacketHandler.await(2, SECONDS));
-
-      assertNotNull(serverPacketHandler.getLastSender());
-      PacketSender sender = serverPacketHandler.getLastSender();
-      TextPacket packetFromServer = new TextPacket(
-            "testClientHandlePacketSentByServer from server");
-      packetFromServer.setTargetID(clientHandler.getID());
-      sender.send(packetFromServer);
-
-      assertTrue(clientHandler.await(2, SECONDS));
-
-      List<TextPacket> packets = clientHandler.getPackets();
-      assertEquals(1, packets.size());
-      TextPacket packetReceivedByClient = (TextPacket) packets.get(0);
-      assertEquals(packetFromServer.getText(), packetReceivedByClient.getText());
-   }
-   
-   // Protected -----------------------------------------------------
-
-   @Override
-   protected void setUp() throws Exception
-   {
-      serverDispatcher = startServer();
-      
-      RemotingConfiguration remotingConfig = createRemotingConfiguration();
-      connector = createNIOConnector();
-      client = new ClientImpl(connector, remotingConfig);
-      client.connect();
-      
-      serverPacketHandler = new ReversePacketHandler();
-      serverDispatcher.register(serverPacketHandler);
-   }
-
-   @Override
-   protected void tearDown() throws Exception
-   {
-      serverDispatcher.unregister(serverPacketHandler.getID());
-
-      connector.disconnect();
-      client.disconnect();
-      stopServer();
-      
-      client = null;
-      serverDispatcher = null;
-   }
-   
-   protected abstract RemotingConfiguration createRemotingConfiguration();
-   
-   protected abstract NIOConnector createNIOConnector();
-
-   protected abstract PacketDispatcher startServer() throws Exception;
-   
-   protected abstract void stopServer();
-}

Copied: trunk/tests/src/org/jboss/messaging/core/remoting/impl/SessionTestBase.java (from rev 3699, trunk/tests/src/org/jboss/messaging/core/remoting/impl/ClientTestBase.java)
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/SessionTestBase.java	                        (rev 0)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/SessionTestBase.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,275 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.messaging.core.remoting.impl;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.MANY_MESSAGES;
+import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.REQRES_TIMEOUT;
+import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.reverse;
+import static org.jboss.messaging.test.unit.RandomUtil.randomString;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.jboss.messaging.core.remoting.NIOConnector;
+import org.jboss.messaging.core.remoting.NIOSession;
+import org.jboss.messaging.core.remoting.PacketDispatcher;
+import org.jboss.messaging.core.remoting.PacketHandler;
+import org.jboss.messaging.core.remoting.PacketSender;
+import org.jboss.messaging.core.remoting.RemotingConfiguration;
+import org.jboss.messaging.core.remoting.impl.mina.integration.test.ReversePacketHandler;
+import org.jboss.messaging.core.remoting.test.unit.TestPacketHandler;
+import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
+import org.jboss.messaging.core.remoting.wireformat.Packet;
+import org.jboss.messaging.core.remoting.wireformat.TextPacket;
+
+/**
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * 
+ * @version <tt>$Revision$</tt>
+ */
+public abstract class SessionTestBase extends TestCase
+{
+   // Constants -----------------------------------------------------
+
+   // Attributes ----------------------------------------------------
+
+   protected ReversePacketHandler serverPacketHandler;
+
+   protected PacketDispatcher serverDispatcher;
+
+   protected NIOConnector connector;
+
+   protected NIOSession session;
+
+   // Static --------------------------------------------------------
+
+   // Constructors --------------------------------------------------
+
+   // Public --------------------------------------------------------
+
+   public void testConnected() throws Exception
+   {
+      NIOConnector connector = createNIOConnector();
+      NIOSession session = connector.connect();
+
+      assertTrue(session.isConnected());
+      
+      assertTrue(connector.disconnect());
+      assertFalse(session.isConnected());
+      
+   }    
+      
+   public void testWrite() throws Exception
+   {
+      serverPacketHandler.expectMessage(1);
+
+      TextPacket packet = new TextPacket("testSendOneWay");
+      packet.setTargetID(serverPacketHandler.getID());
+      
+      session.write(packet);
+
+      assertTrue(serverPacketHandler.await(2, SECONDS));
+
+      List<TextPacket> messages = serverPacketHandler.getPackets();
+      assertEquals(1, messages.size());
+      String response = ((TextPacket) messages.get(0)).getText();
+      assertEquals(packet.getText(), response);
+   }
+
+   public void testWriteMany() throws Exception
+   {
+      serverPacketHandler.expectMessage(MANY_MESSAGES);
+
+      TextPacket[] packets = new TextPacket[MANY_MESSAGES];
+      for (int i = 0; i < MANY_MESSAGES; i++)
+      {
+         packets[i] = new TextPacket("testSendManyOneWay " + i);
+         packets[i].setTargetID(serverPacketHandler.getID());
+         session.write(packets[i]);
+      }
+
+      assertTrue(serverPacketHandler.await(10, SECONDS));
+
+      List<TextPacket> receivedPackets = serverPacketHandler.getPackets();
+      assertEquals(MANY_MESSAGES, receivedPackets.size());
+      for (int i = 0; i < MANY_MESSAGES; i++)
+      {
+         TextPacket receivedPacket = (TextPacket) receivedPackets.get(i);
+         assertEquals(packets[i].getText(), receivedPacket.getText());
+      }
+   }
+
+   public void testWriteWithCallbackHandler() throws Exception
+   {
+      TestPacketHandler callbackHandler = new TestPacketHandler();
+      callbackHandler.expectMessage(1);
+
+      PacketDispatcher.client.register(callbackHandler);
+
+      TextPacket packet = new TextPacket("testSendOneWayWithCallbackHandler");
+      packet.setTargetID(serverPacketHandler.getID());
+      packet.setCallbackID(callbackHandler.getID());
+
+      session.write(packet);
+
+      assertTrue(callbackHandler.await(5, SECONDS));
+
+      assertEquals(1, callbackHandler.getPackets().size());
+      String response = callbackHandler.getPackets().get(0).getText();
+      assertEquals(reverse(packet.getText()), response);
+   }
+   
+   public void testWriteAndBlockWithOneCallbackLater() throws Exception
+   {
+      final PacketSender[] serverSender = new PacketSender[1];
+      PacketHandler serverHandler = new PacketHandler() {
+         private final String id = randomString();
+         
+         public String getID()
+         {
+            return id;
+         }
+
+         public void handle(Packet packet, PacketSender sender)
+         {
+            serverSender[0] = sender;
+            // immediate reply
+            TextPacket response = new TextPacket("blockingResponse");
+            response.normalize(packet);
+            try
+            {
+               sender.send(packet);
+            } catch (Exception e)
+            {
+               fail(e.getMessage());
+            }
+         }
+      };
+      serverDispatcher.register(serverHandler);
+      
+      TestPacketHandler callbackHandler = new TestPacketHandler();
+      callbackHandler.expectMessage(1);
+      PacketDispatcher.client.register(callbackHandler);
+
+      TextPacket packet = new TextPacket("testSendOneWayWith2Callbacks");
+      packet.setTargetID(serverHandler.getID());
+      packet.setCallbackID(callbackHandler.getID());
+
+      AbstractPacket blockingResponse = (AbstractPacket) session.writeAndBlock(packet, REQRES_TIMEOUT, SECONDS);
+      assertNotNull(blockingResponse);
+      
+      assertEquals(0, callbackHandler.getPackets().size());
+      
+      assertNotNull(serverSender[0]);
+      TextPacket callbackResponse = new TextPacket("callbackResponse");
+      callbackResponse.setTargetID(callbackHandler.getID());
+      serverSender[0].send(callbackResponse);
+
+      assertTrue(callbackHandler.await(REQRES_TIMEOUT, SECONDS));
+      
+      assertEquals(1, callbackHandler.getPackets().size());
+   }
+
+   public void testWriteAndBlock() throws Exception
+   {
+      TextPacket request = new TextPacket("testSendBlocking");
+      request.setTargetID(serverPacketHandler.getID());
+
+      AbstractPacket receivedPacket = (AbstractPacket) session.writeAndBlock(request, REQRES_TIMEOUT, SECONDS);
+
+      assertNotNull(receivedPacket);
+      assertTrue(receivedPacket instanceof TextPacket);
+      TextPacket response = (TextPacket) receivedPacket;
+      assertEquals(reverse(request.getText()), response.getText());
+   }
+   
+   public void testCorrelationCounter() throws Exception
+   {
+      TextPacket request = new TextPacket("testSendBlocking");
+      request.setTargetID(serverPacketHandler.getID());
+
+      AbstractPacket receivedPacket = (AbstractPacket) session.writeAndBlock(request, REQRES_TIMEOUT, SECONDS);
+      long correlationID = request.getCorrelationID();
+      
+      assertNotNull(receivedPacket);      
+      assertEquals(request.getCorrelationID(), receivedPacket.getCorrelationID());
+      
+      receivedPacket = (AbstractPacket) session.writeAndBlock(request, REQRES_TIMEOUT, SECONDS);
+      assertEquals(correlationID + 1, request.getCorrelationID());
+      assertEquals(correlationID + 1, receivedPacket.getCorrelationID());      
+   }
+
+   
+   public void testClientHandlePacketSentByServer() throws Exception
+   {
+      TestPacketHandler clientHandler = new TestPacketHandler();
+      PacketDispatcher.client.register(clientHandler);
+
+      serverPacketHandler.expectMessage(1);
+      clientHandler.expectMessage(1);
+
+      TextPacket packet = new TextPacket(
+            "testClientHandlePacketSentByServer from client");
+      packet.setTargetID(serverPacketHandler.getID());
+      // send a packet to create a sender when the server
+      // handles the packet
+      session.write(packet);
+
+      assertTrue(serverPacketHandler.await(2, SECONDS));
+
+      assertNotNull(serverPacketHandler.getLastSender());
+      PacketSender sender = serverPacketHandler.getLastSender();
+      TextPacket packetFromServer = new TextPacket(
+            "testClientHandlePacketSentByServer from server");
+      packetFromServer.setTargetID(clientHandler.getID());
+      sender.send(packetFromServer);
+
+      assertTrue(clientHandler.await(2, SECONDS));
+
+      List<TextPacket> packets = clientHandler.getPackets();
+      assertEquals(1, packets.size());
+      TextPacket packetReceivedByClient = (TextPacket) packets.get(0);
+      assertEquals(packetFromServer.getText(), packetReceivedByClient.getText());
+   }
+   
+   // Protected -----------------------------------------------------
+
+   @Override
+   protected void setUp() throws Exception
+   {
+      serverDispatcher = startServer();
+      
+      connector = createNIOConnector();
+      session = connector.connect();
+      
+      serverPacketHandler = new ReversePacketHandler();
+      serverDispatcher.register(serverPacketHandler);
+   }
+
+   @Override
+   protected void tearDown() throws Exception
+   {
+      serverDispatcher.unregister(serverPacketHandler.getID());
+
+      connector.disconnect();
+      stopServer();
+      
+      connector = null;
+      session = null;
+      serverDispatcher = null;
+   }
+   
+   protected abstract RemotingConfiguration createRemotingConfiguration();
+   
+   protected abstract NIOConnector createNIOConnector();
+
+   protected abstract PacketDispatcher startServer() throws Exception;
+   
+   protected abstract void stopServer();
+}

Deleted: trunk/tests/src/org/jboss/messaging/core/remoting/impl/invm/test/unit/INVMClientTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/invm/test/unit/INVMClientTest.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/invm/test/unit/INVMClientTest.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,70 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting.impl.invm.test.unit;
-
-import static org.jboss.messaging.core.remoting.TransportType.INVM;
-import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.PORT;
-
-import org.jboss.messaging.core.remoting.NIOConnector;
-import org.jboss.messaging.core.remoting.PacketDispatcher;
-import org.jboss.messaging.core.remoting.RemotingConfiguration;
-import org.jboss.messaging.core.remoting.impl.ClientTestBase;
-import org.jboss.messaging.core.remoting.impl.invm.INVMConnector;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
- *
- * @version <tt>$Revision$</tt>
- *
- */
-public class INVMClientTest extends ClientTestBase
-{
-   // Constants -----------------------------------------------------
-
-   // Attributes ----------------------------------------------------
-
-   PacketDispatcher dispatcher = new PacketDispatcher();
-   // Static --------------------------------------------------------
-
-   // Constructors --------------------------------------------------
-
-   // Public --------------------------------------------------------
-
-   // ClientTestBase overrides --------------------------------------
-   
-   @Override
-   protected NIOConnector createNIOConnector()
-   {
-      return new INVMConnector("localhost", PORT, dispatcher);
-   }
-   
-   @Override
-   protected RemotingConfiguration createRemotingConfiguration()
-   {
-      return new RemotingConfiguration(INVM, "localhost", PORT);
-   }
-   
-   @Override
-   protected PacketDispatcher startServer() throws Exception
-   {
-      return dispatcher;
-   }
-   
-   @Override
-   protected void stopServer()
-   {
-      dispatcher = null;
-   }
-
-   // Package protected ---------------------------------------------
-
-   // Protected -----------------------------------------------------
-
-   // Private -------------------------------------------------------
-
-   // Inner classes -------------------------------------------------
-}

Copied: trunk/tests/src/org/jboss/messaging/core/remoting/impl/invm/test/unit/INVMSessionTest.java (from rev 3699, trunk/tests/src/org/jboss/messaging/core/remoting/impl/invm/test/unit/INVMClientTest.java)
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/invm/test/unit/INVMSessionTest.java	                        (rev 0)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/invm/test/unit/INVMSessionTest.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,70 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.messaging.core.remoting.impl.invm.test.unit;
+
+import static org.jboss.messaging.core.remoting.TransportType.INVM;
+import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.PORT;
+
+import org.jboss.messaging.core.remoting.NIOConnector;
+import org.jboss.messaging.core.remoting.PacketDispatcher;
+import org.jboss.messaging.core.remoting.RemotingConfiguration;
+import org.jboss.messaging.core.remoting.impl.SessionTestBase;
+import org.jboss.messaging.core.remoting.impl.invm.INVMConnector;
+
+/**
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ *
+ * @version <tt>$Revision$</tt>
+ *
+ */
+public class INVMSessionTest extends SessionTestBase
+{
+   // Constants -----------------------------------------------------
+
+   // Attributes ----------------------------------------------------
+
+   PacketDispatcher dispatcher = new PacketDispatcher();
+   // Static --------------------------------------------------------
+
+   // Constructors --------------------------------------------------
+
+   // Public --------------------------------------------------------
+
+   // ClientTestBase overrides --------------------------------------
+   
+   @Override
+   protected NIOConnector createNIOConnector()
+   {
+      return new INVMConnector("localhost", PORT, dispatcher);
+   }
+   
+   @Override
+   protected RemotingConfiguration createRemotingConfiguration()
+   {
+      return new RemotingConfiguration(INVM, "localhost", PORT);
+   }
+   
+   @Override
+   protected PacketDispatcher startServer() throws Exception
+   {
+      return dispatcher;
+   }
+   
+   @Override
+   protected void stopServer()
+   {
+      dispatcher = null;
+   }
+
+   // Package protected ---------------------------------------------
+
+   // Protected -----------------------------------------------------
+
+   // Private -------------------------------------------------------
+
+   // Inner classes -------------------------------------------------
+}

Modified: trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/ClientKeepAliveTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/ClientKeepAliveTest.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/ClientKeepAliveTest.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -9,25 +9,30 @@
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.easymock.EasyMock.createMock;
 import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
 import static org.easymock.EasyMock.replay;
 import static org.easymock.EasyMock.verify;
 import static org.jboss.messaging.core.remoting.TransportType.TCP;
 import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.KEEP_ALIVE_INTERVAL;
 import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.KEEP_ALIVE_TIMEOUT;
 import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.PORT;
+import static org.jboss.messaging.test.unit.RandomUtil.randomString;
 
 import java.util.concurrent.CountDownLatch;
 
 import junit.framework.TestCase;
 
-import org.jboss.messaging.core.remoting.ConnectionExceptionListener;
+import org.jboss.jms.client.api.FailureListener;
 import org.jboss.messaging.core.remoting.KeepAliveFactory;
 import org.jboss.messaging.core.remoting.NIOSession;
 import org.jboss.messaging.core.remoting.RemotingConfiguration;
+import org.jboss.messaging.core.remoting.impl.mina.ClientKeepAliveFactory;
 import org.jboss.messaging.core.remoting.impl.mina.MinaConnector;
 import org.jboss.messaging.core.remoting.impl.mina.MinaService;
 import org.jboss.messaging.core.remoting.wireformat.Ping;
 import org.jboss.messaging.core.remoting.wireformat.Pong;
+import org.jboss.messaging.util.MessagingException;
+import org.jboss.messaging.util.RemotingException;
 
 /**
  * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
@@ -67,33 +72,38 @@
    }
 
    public void testKeepAliveWithClientOK() throws Exception
-   {
+   {  
       KeepAliveFactory factory = createMock(KeepAliveFactory.class);
 
       // client never send ping
-      expect(factory.ping()).andStubReturn(null);
+      expect(factory.ping(isA(String.class))).andStubReturn(null);
+      expect(factory.isPing(isA(String.class), isA(Ping.class))).andStubReturn(true);
+      expect(factory.isPing(isA(String.class), isA(Object.class))).andStubReturn(false);
       // client is responding
-      expect(factory.pong()).andReturn(new Pong()).atLeastOnce();
+      expect(factory.pong(isA(String.class), isA(Ping.class))).andReturn(new Pong(randomString(), false)).atLeastOnce();
 
       replay(factory);
 
       final CountDownLatch latch = new CountDownLatch(1);
 
-      service.addConnectionExceptionListener(new ConnectionExceptionListener()
-      {
-         public void handleConnectionException(Throwable e, String sessionID)
+      FailureListener listener = new FailureListener() {
+         public void onFailure(MessagingException me)
          {
+            assertTrue(me instanceof RemotingException);
+            RemotingException re = (RemotingException) me;
             latch.countDown();
          }
-      });
+      };
+      service.addFailureListener(listener);
 
       MinaConnector connector = new MinaConnector(service.getRemotingConfiguration(), factory);
       connector.connect();
 
       boolean firedKeepAliveNotification = latch.await(KEEP_ALIVE_INTERVAL
-            + KEEP_ALIVE_TIMEOUT + 1, SECONDS);
+            + KEEP_ALIVE_TIMEOUT + 2, SECONDS);
       assertFalse(firedKeepAliveNotification);
 
+      service.removeFailureListener(listener);
       connector.disconnect();
 
       verify(factory);
@@ -101,26 +111,21 @@
    
    public void testKeepAliveWithClientNotResponding() throws Exception
    {
-      KeepAliveFactory factory = createMock(KeepAliveFactory.class);
+      KeepAliveFactory factory = new ClientKeepAliveFactoryNotResponding();
 
-      // client never send ping
-      expect(factory.ping()).andStubReturn(null);
-      // no pong -> client is not responding
-      expect(factory.pong()).andReturn(null).atLeastOnce();
-
-      replay(factory);
-
       final String[] clientSessionIDNotResponding = new String[1];
       final CountDownLatch latch = new CountDownLatch(1);
 
-      service.addConnectionExceptionListener(new ConnectionExceptionListener()
-      {
-         public void handleConnectionException(Throwable t, String sessionID)
+      FailureListener listener = new FailureListener() {
+         public void onFailure(MessagingException me)
          {
-            clientSessionIDNotResponding[0] = sessionID;
+            assertTrue(me instanceof RemotingException);
+            RemotingException re = (RemotingException) me;
+            clientSessionIDNotResponding[0] = re.getSessionID();
             latch.countDown();
          }
-      });
+      };
+      service.addFailureListener(listener);
       
       MinaConnector connector = new MinaConnector(service.getRemotingConfiguration(), factory);
 
@@ -133,21 +138,25 @@
       assertNotNull(clientSessionIDNotResponding[0]);
       assertEquals(clientSessionID, clientSessionIDNotResponding[0]);
 
+      service.removeFailureListener(listener);
       connector.disconnect();
-
-      verify(factory);
    }
 
    public void testKeepAliveWithClientTooLongToRespond() throws Exception
    {
       KeepAliveFactory factory = new KeepAliveFactory()
       {
-         public Ping ping()
+         public Ping ping(String sessionID)
          {
             return null;
          }
+         
+         public boolean isPing(String sessionID, Object message)
+         {
+            return (message instanceof Ping);
+         }
 
-         public synchronized Pong pong()
+         public synchronized Pong pong(String sessionID, Ping ping)
          {
             // like a TCP timeout, there is no response in the next 2 hours
             try
@@ -157,8 +166,8 @@
             {
                e.printStackTrace();
             }
-            return new Pong();
-         }
+            return new Pong(randomString(), false);
+         }         
       };
 
       try
@@ -172,14 +181,16 @@
          final String[] clientSessionIDNotResponding = new String[1];
          final CountDownLatch latch = new CountDownLatch(1);
 
-         service.addConnectionExceptionListener(new ConnectionExceptionListener()
-         {
-            public void handleConnectionException(Throwable t, String sessionID)
+         FailureListener listener = new FailureListener() {
+            public void onFailure(MessagingException me)
             {
-               clientSessionIDNotResponding[0] = sessionID;
+               assertTrue(me instanceof RemotingException);
+               RemotingException re = (RemotingException) me;
+               clientSessionIDNotResponding[0] = re.getSessionID();
                latch.countDown();
             }
-         });
+         };
+         service.addFailureListener(listener);
 
          boolean firedKeepAliveNotification = latch.await(KEEP_ALIVE_INTERVAL
                + KEEP_ALIVE_TIMEOUT + 2, SECONDS);
@@ -187,6 +198,7 @@
          assertNotNull(clientSessionIDNotResponding[0]);
          assertEquals(clientSessionID, clientSessionIDNotResponding[0]);
 
+         service.removeFailureListener(listener);
          connector.disconnect();
 
       } finally
@@ -202,27 +214,22 @@
    public void testKeepAliveWithClientRespondingAndClientNotResponding()
          throws Exception
    {
-      KeepAliveFactory notRespondingfactory = createMock(KeepAliveFactory.class);
-      expect(notRespondingfactory.ping()).andStubReturn(null);
-      expect(notRespondingfactory.pong()).andReturn(null).atLeastOnce();
+      KeepAliveFactory notRespondingfactory = new ClientKeepAliveFactoryNotResponding();
+      KeepAliveFactory respondingfactory = new ClientKeepAliveFactory();
 
-      KeepAliveFactory respondingfactory = createMock(KeepAliveFactory.class);
-      expect(respondingfactory.ping()).andStubReturn(null);
-      expect(respondingfactory.pong()).andReturn(new Pong()).atLeastOnce();
-
-      replay(notRespondingfactory, respondingfactory);
-
       final String[] sessionIDNotResponding = new String[1];
       final CountDownLatch latch = new CountDownLatch(1);
 
-      service.addConnectionExceptionListener(new ConnectionExceptionListener()
-      {
-         public void handleConnectionException(Throwable t, String sessionID)
+      FailureListener listener = new FailureListener() {
+         public void onFailure(MessagingException me)
          {
-            sessionIDNotResponding[0] = sessionID;
+            assertTrue(me instanceof RemotingException);
+            RemotingException re = (RemotingException) me;
+            sessionIDNotResponding[0] = re.getSessionID();
             latch.countDown();
          }
-      });
+      };
+      service.addFailureListener(listener);
       
       MinaConnector connectorNotResponding = new MinaConnector(service
             .getRemotingConfiguration(), notRespondingfactory);
@@ -244,10 +251,9 @@
       assertEquals(clientSessionIDNotResponding, sessionIDNotResponding[0]);
       assertNotSame(clientSessionIDResponding, sessionIDNotResponding[0]);
 
+      service.removeFailureListener(listener);
       connectorNotResponding.disconnect();
       connectorResponding.disconnect();
-
-      verify(notRespondingfactory, respondingfactory);
    }
    
    // Package protected ---------------------------------------------
@@ -257,4 +263,19 @@
    // Private -------------------------------------------------------
 
    // Inner classes -------------------------------------------------
+   
+   private class ClientKeepAliveFactoryNotResponding extends ClientKeepAliveFactory
+   {
+      @Override
+      public Ping ping(String clientSessionID)
+      {
+         return null;
+      }
+
+      @Override
+      public Pong pong(String sessionID, Ping ping)
+      {
+         return null;
+      }
+   }
 }
\ No newline at end of file

Modified: trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/FilterChainSupportTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/FilterChainSupportTest.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/FilterChainSupportTest.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -7,10 +7,13 @@
 package org.jboss.messaging.core.remoting.impl.mina.integration.test;
 
 import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
 import junit.framework.TestCase;
 
 import org.apache.mina.common.DefaultIoFilterChainBuilder;
 import org.jboss.messaging.core.remoting.KeepAliveFactory;
+import org.jboss.messaging.core.remoting.impl.mina.FailureNotifier;
 import org.jboss.messaging.core.remoting.impl.mina.FilterChainSupport;
 
 /**
@@ -38,15 +41,20 @@
 
       DefaultIoFilterChainBuilder filterChain = new DefaultIoFilterChainBuilder();
       KeepAliveFactory factory = createMock(KeepAliveFactory.class);
+      FailureNotifier notifier = createMock(FailureNotifier.class);
+      
+      replay(factory, notifier);
 
       try
       {
          FilterChainSupport.addKeepAliveFilter(filterChain, factory,
-               keepAliveInterval, keepAliveTimeout);
+               keepAliveInterval, keepAliveTimeout,  notifier);
          fail("the interval must be greater than the timeout");
       } catch (IllegalArgumentException e)
       {
       }
+      
+      verify(factory, notifier);
    }
 
    // Package protected ---------------------------------------------

Deleted: trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaClientTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaClientTest.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaClientTest.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,95 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting.impl.mina.integration.test;
-
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static org.jboss.messaging.core.remoting.TransportType.TCP;
-import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.PORT;
-
-import org.jboss.messaging.core.remoting.NIOConnector;
-import org.jboss.messaging.core.remoting.PacketDispatcher;
-import org.jboss.messaging.core.remoting.RemotingConfiguration;
-import org.jboss.messaging.core.remoting.impl.ClientTestBase;
-import org.jboss.messaging.core.remoting.impl.mina.MinaConnector;
-import org.jboss.messaging.core.remoting.impl.mina.MinaService;
-import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
-import org.jboss.messaging.core.remoting.wireformat.TextPacket;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
- *
- * @version <tt>$Revision$</tt>
- *
- */
-public class MinaClientTest extends ClientTestBase
-{
-
-   private MinaService service;
-
-   // Constants -----------------------------------------------------
-
-   // Attributes ----------------------------------------------------
-
-   // Static --------------------------------------------------------
-
-   // Constructors --------------------------------------------------
-
-   // Public --------------------------------------------------------
-
-   public void testSendBlockingWithTimeout() throws Exception
-   {
-      client.setBlockingRequestTimeout(500, MILLISECONDS);
-      serverPacketHandler.setSleepTime(1000, MILLISECONDS);
-
-      AbstractPacket packet = new TextPacket("testSendBlockingWithTimeout");
-      packet.setTargetID(serverPacketHandler.getID());
-      
-      try
-      {
-         client.send(packet, false);
-         fail("a Throwable should be thrown");
-      } catch (Throwable t)
-      {
-      }
-   }
-   
-   // ClientTestBase overrides --------------------------------------
-   
-   @Override
-   protected NIOConnector createNIOConnector()
-   {
-      return new MinaConnector(createRemotingConfiguration());
-   }
-   
-   @Override
-   protected RemotingConfiguration createRemotingConfiguration()
-   {
-      return new RemotingConfiguration(TCP, "localhost", PORT);
-   }
-
-   @Override
-   protected PacketDispatcher startServer() throws Exception
-   {
-      service = new MinaService(createRemotingConfiguration());
-      service.start();
-      return service.getDispatcher();
-   }
-
-   @Override
-   protected void stopServer()
-   {
-      service.stop();
-   }
-   
-   // Package protected ---------------------------------------------
-
-   // Protected -----------------------------------------------------
-
-   // Private -------------------------------------------------------
-
-   // Inner classes -------------------------------------------------
-}

Added: trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaKeepAliveFactoryTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaKeepAliveFactoryTest.java	                        (rev 0)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaKeepAliveFactoryTest.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,100 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.messaging.core.remoting.impl.mina.integration.test;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.jboss.messaging.test.unit.RandomUtil.randomLong;
+import static org.jboss.messaging.test.unit.RandomUtil.randomString;
+import junit.framework.TestCase;
+
+import org.apache.mina.common.IoSession;
+import org.jboss.messaging.core.remoting.KeepAliveFactory;
+import org.jboss.messaging.core.remoting.impl.mina.FailureNotifier;
+import org.jboss.messaging.core.remoting.impl.mina.MinaKeepAliveFactory;
+import org.jboss.messaging.core.remoting.wireformat.Pong;
+import org.jboss.messaging.util.MessagingException;
+
+/**
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * 
+ * @version <tt>$Revision$</tt>
+ * 
+ */
+public class MinaKeepAliveFactoryTest extends TestCase
+{
+   // Constants -----------------------------------------------------
+
+   // Attributes ----------------------------------------------------
+
+   // Static --------------------------------------------------------
+
+   // Constructors --------------------------------------------------
+
+   // Public --------------------------------------------------------
+
+   public void testResponseIsNotAPong()
+   {
+      IoSession session = createMock(IoSession.class);
+      KeepAliveFactory factory = createMock(KeepAliveFactory.class);
+      FailureNotifier notifier = createMock(FailureNotifier.class);
+      replay(session, factory, notifier);
+
+      MinaKeepAliveFactory minaFactory = new MinaKeepAliveFactory(factory, notifier);
+
+      assertFalse(minaFactory.isResponse(session, new Object()));
+      
+      verify(session, factory, notifier);
+   }
+
+   public void testResponseIsAPongWithSessionNotFailed()
+   {
+      IoSession session = createMock(IoSession.class);
+      String sessionID = randomString();
+      Pong pong = new Pong(sessionID, false);
+      KeepAliveFactory factory = createMock(KeepAliveFactory.class);
+      FailureNotifier notifier = createMock(FailureNotifier.class);
+      replay(session, factory, notifier);
+
+      MinaKeepAliveFactory minaFactory = new MinaKeepAliveFactory(factory, notifier);
+
+      assertTrue(minaFactory.isResponse(session, pong));
+
+      verify(session, factory, notifier);
+   }
+
+   public void testResponseIsAPongWithSessionFailed()
+   {
+      IoSession session = createMock(IoSession.class);
+      String sessionID = Long.toString(randomLong());
+      expect(session.getId()).andStubReturn(Long.parseLong(sessionID));
+      Pong pong = new Pong(sessionID, true);
+      KeepAliveFactory factory = createMock(KeepAliveFactory.class);
+      FailureNotifier notifier = createMock(FailureNotifier.class);
+      notifier.fireFailure(isA(MessagingException.class));
+      expectLastCall().once();
+      replay(session, factory, notifier);
+
+      MinaKeepAliveFactory minaFactory = new MinaKeepAliveFactory(factory, notifier);
+
+      assertTrue(minaFactory.isResponse(session, pong));
+
+      verify(session, factory, notifier);
+   }
+
+   // Package protected ---------------------------------------------
+
+   // Protected -----------------------------------------------------
+
+   // Private -------------------------------------------------------
+
+   // Inner classes -------------------------------------------------
+}

Added: trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaSessionTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaSessionTest.java	                        (rev 0)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/MinaSessionTest.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,94 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.messaging.core.remoting.impl.mina.integration.test;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.jboss.messaging.core.remoting.TransportType.TCP;
+import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.PORT;
+
+import org.jboss.messaging.core.remoting.NIOConnector;
+import org.jboss.messaging.core.remoting.PacketDispatcher;
+import org.jboss.messaging.core.remoting.RemotingConfiguration;
+import org.jboss.messaging.core.remoting.impl.SessionTestBase;
+import org.jboss.messaging.core.remoting.impl.mina.MinaConnector;
+import org.jboss.messaging.core.remoting.impl.mina.MinaService;
+import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
+import org.jboss.messaging.core.remoting.wireformat.TextPacket;
+
+/**
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ *
+ * @version <tt>$Revision$</tt>
+ *
+ */
+public class MinaSessionTest extends SessionTestBase
+{
+
+   private MinaService service;
+
+   // Constants -----------------------------------------------------
+
+   // Attributes ----------------------------------------------------
+
+   // Static --------------------------------------------------------
+
+   // Constructors --------------------------------------------------
+
+   // Public --------------------------------------------------------
+
+   public void testWriteAndBlockWithTimeout() throws Exception
+   {
+      serverPacketHandler.setSleepTime(1000, MILLISECONDS);
+
+      AbstractPacket packet = new TextPacket("testSendBlockingWithTimeout");
+      packet.setTargetID(serverPacketHandler.getID());
+      
+      try
+      {
+         session.writeAndBlock(packet, 500, MILLISECONDS);
+         fail("a Throwable should be thrown");
+      } catch (Throwable t)
+      {
+      }
+   }
+   
+   // ClientTestBase overrides --------------------------------------
+   
+   @Override
+   protected NIOConnector createNIOConnector()
+   {
+      return new MinaConnector(createRemotingConfiguration());
+   }
+   
+   @Override
+   protected RemotingConfiguration createRemotingConfiguration()
+   {
+      return new RemotingConfiguration(TCP, "localhost", PORT);
+   }
+
+   @Override
+   protected PacketDispatcher startServer() throws Exception
+   {
+      service = new MinaService(createRemotingConfiguration());
+      service.start();
+      return service.getDispatcher();
+   }
+
+   @Override
+   protected void stopServer()
+   {
+      service.stop();
+   }
+   
+   // Package protected ---------------------------------------------
+
+   // Protected -----------------------------------------------------
+
+   // Private -------------------------------------------------------
+
+   // Inner classes -------------------------------------------------
+}

Modified: trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/ServerKeepAliveTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/ServerKeepAliveTest.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/ServerKeepAliveTest.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -7,10 +7,6 @@
 package org.jboss.messaging.core.remoting.impl.mina.integration.test;
 
 import static java.util.concurrent.TimeUnit.SECONDS;
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
 import static org.jboss.messaging.core.remoting.TransportType.TCP;
 import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.KEEP_ALIVE_INTERVAL;
 import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.KEEP_ALIVE_TIMEOUT;
@@ -20,12 +16,16 @@
 
 import junit.framework.TestCase;
 
-import org.jboss.messaging.core.remoting.ConnectionExceptionListener;
-import org.jboss.messaging.core.remoting.KeepAliveFactory;
+import org.jboss.jms.client.api.FailureListener;
 import org.jboss.messaging.core.remoting.NIOSession;
 import org.jboss.messaging.core.remoting.RemotingConfiguration;
 import org.jboss.messaging.core.remoting.impl.mina.MinaConnector;
 import org.jboss.messaging.core.remoting.impl.mina.MinaService;
+import org.jboss.messaging.core.remoting.impl.mina.ServerKeepAliveFactory;
+import org.jboss.messaging.core.remoting.wireformat.Ping;
+import org.jboss.messaging.core.remoting.wireformat.Pong;
+import org.jboss.messaging.util.MessagingException;
+import org.jboss.messaging.util.RemotingException;
 
 /**
  * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
@@ -61,46 +61,114 @@
 
    public void testKeepAliveWithServerNotResponding() throws Exception
    {
-      KeepAliveFactory factory = createMock(KeepAliveFactory.class);
+      ServerKeepAliveFactory factory = new ServerKeepAliveFactory()
+      {
+         // server does not send ping
+         @Override
+         public Ping ping(String sessionID)
+         {
+            return null;
+         }
 
-      // server does not send ping
-      expect(factory.ping()).andStubReturn(null);
-      // no pong -> server is not responding
-      expect(factory.pong()).andReturn(null).atLeastOnce();
+         @Override
+         public Pong pong(String sessionID, Ping ping)
+         {
+            // no pong -> server is not responding
+            super.pong(sessionID, ping);
+            return null;
+         }
+      };
 
-      replay(factory);
-      
-      RemotingConfiguration remotingConfig = new RemotingConfiguration(TCP, "localhost", PORT);
+      RemotingConfiguration remotingConfig = new RemotingConfiguration(TCP,
+            "localhost", PORT);
       remotingConfig.setKeepAliveInterval(KEEP_ALIVE_INTERVAL);
       remotingConfig.setKeepAliveTimeout(KEEP_ALIVE_TIMEOUT);
       service = new MinaService(remotingConfig, factory);
       service.start();
 
-      MinaConnector connector = new MinaConnector(service.getRemotingConfiguration());
+      MinaConnector connector = new MinaConnector(service
+            .getRemotingConfiguration());
       final String[] sessionIDNotResponding = new String[1];
       final CountDownLatch latch = new CountDownLatch(1);
- 
-      connector.setConnectionExceptionListener(new ConnectionExceptionListener()
+
+      FailureListener listener = new FailureListener()
       {
-         public void handleConnectionException(Throwable t, String sessionID)
+         public void onFailure(MessagingException me)
          {
-            sessionIDNotResponding[0] = sessionID;
+            assertTrue(me instanceof RemotingException);
+            RemotingException re = (RemotingException) me;
+            sessionIDNotResponding[0] = re.getSessionID();
             latch.countDown();
          }
-      });
-      
+      };
+      connector.addFailureListener(listener);
+
       NIOSession session = connector.connect();
 
       boolean firedKeepAliveNotification = latch.await(KEEP_ALIVE_INTERVAL
             + KEEP_ALIVE_TIMEOUT + 2, SECONDS);
       assertTrue(firedKeepAliveNotification);
       assertEquals(session.getID(), sessionIDNotResponding[0]);
-      
+
+      connector.removeFailureListener(listener);
       connector.disconnect();
-      
-      verify(factory);
    }
-   
+
+   public void testKeepAliveWithServerSessionFailed() throws Exception
+   {
+      ServerKeepAliveFactory factory = new ServerKeepAliveFactory()
+      {
+         // server does not send ping
+         @Override
+         public Ping ping(String sessionID)
+         {
+            return null;
+         }
+
+         @Override
+         public Pong pong(String sessionID, Ping ping)
+         {
+            // no pong -> server is not responding
+            super.pong(sessionID, ping);
+            return new Pong(sessionID, true);
+         }
+      };
+
+      RemotingConfiguration remotingConfig = new RemotingConfiguration(TCP,
+            "localhost", PORT);
+      remotingConfig.setKeepAliveInterval(KEEP_ALIVE_INTERVAL);
+      remotingConfig.setKeepAliveTimeout(KEEP_ALIVE_TIMEOUT);
+      service = new MinaService(remotingConfig, factory);
+      service.start();
+
+      MinaConnector connector = new MinaConnector(service
+            .getRemotingConfiguration());
+      final String[] sessionIDNotResponding = new String[1];
+      final CountDownLatch latch = new CountDownLatch(1);
+
+      FailureListener listener = new FailureListener()
+      {
+         public void onFailure(MessagingException me)
+         {
+            assertTrue(me instanceof RemotingException);
+            RemotingException re = (RemotingException) me;
+            sessionIDNotResponding[0] = re.getSessionID();
+            latch.countDown();
+         }
+      };
+      connector.addFailureListener(listener);
+
+      NIOSession session = connector.connect();
+
+      boolean firedKeepAliveNotification = latch.await(KEEP_ALIVE_INTERVAL
+            + KEEP_ALIVE_TIMEOUT + 2, SECONDS);
+      assertTrue(firedKeepAliveNotification);
+      assertEquals(session.getID(), sessionIDNotResponding[0]);
+
+      connector.removeFailureListener(listener);
+      connector.disconnect();
+   }
+
    // Package protected ---------------------------------------------
 
    // Protected -----------------------------------------------------

Modified: trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/TestSupport.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/TestSupport.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/integration/test/TestSupport.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -22,6 +22,8 @@
 
    public static final int KEEP_ALIVE_TIMEOUT = 1; // in seconds
 
+   public static final long REQRES_TIMEOUT = 2; // in seconds
+
    public static final int PORT = 9090;
 
    // Attributes ----------------------------------------------------

Modified: trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/stress/PacketStressTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/stress/PacketStressTest.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/impl/mina/stress/PacketStressTest.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -15,12 +15,11 @@
 
 import junit.framework.TestCase;
 
-import org.jboss.messaging.core.remoting.Client;
 import org.jboss.messaging.core.remoting.NIOConnector;
+import org.jboss.messaging.core.remoting.NIOSession;
 import org.jboss.messaging.core.remoting.PacketHandler;
 import org.jboss.messaging.core.remoting.PacketSender;
 import org.jboss.messaging.core.remoting.RemotingConfiguration;
-import org.jboss.messaging.core.remoting.impl.ClientImpl;
 import org.jboss.messaging.core.remoting.impl.mina.MinaConnector;
 import org.jboss.messaging.core.remoting.impl.mina.MinaService;
 import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
@@ -86,8 +85,7 @@
       CountDownLatch latch = new CountDownLatch(1);
       
       service.getDispatcher().register(new ServerHandler(handlerID, latch, spinner));
-      Client client = new ClientImpl(connector, service.getRemotingConfiguration());
-      client.connect();
+      NIOSession session = connector.connect();
       
       byte[] payloadBytes = generatePayload(PAYLOAD);
       AbstractPacket packet = new BytesPacket(payloadBytes);
@@ -96,7 +94,7 @@
       long start = System.currentTimeMillis();
       for (int i = 0; i < MANY_MESSAGES; i++)
       {
-       client.send(packet, true); 
+       session.write(packet); 
        if (i % spinner == 0)
           System.out.print('#');
       }

Deleted: trunk/tests/src/org/jboss/messaging/core/remoting/test/unit/ClientTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/test/unit/ClientTest.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/test/unit/ClientTest.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,183 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.messaging.core.remoting.test.unit;
-
-import static java.util.UUID.randomUUID;
-import static org.easymock.EasyMock.createStrictMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
-import static org.jboss.messaging.core.remoting.TransportType.TCP;
-import static org.jboss.messaging.core.remoting.impl.mina.integration.test.TestSupport.PORT;
-
-import java.io.IOException;
-
-import junit.framework.TestCase;
-
-import org.jboss.messaging.core.remoting.Client;
-import org.jboss.messaging.core.remoting.NIOConnector;
-import org.jboss.messaging.core.remoting.NIOSession;
-import org.jboss.messaging.core.remoting.RemotingConfiguration;
-import org.jboss.messaging.core.remoting.impl.ClientImpl;
-import org.jboss.messaging.core.remoting.wireformat.NullPacket;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
- * 
- * @version <tt>$Revision$</tt>
- */
-public class ClientTest extends TestCase
-{
-   // Constants -----------------------------------------------------
-
-   // Attributes ----------------------------------------------------
-
-   // Static --------------------------------------------------------
-
-   // Constructors --------------------------------------------------
-
-   // Public --------------------------------------------------------
-
-   private RemotingConfiguration remotingConfig;
-
-   public void testConnected() throws Exception
-   {
-      NIOConnector connector = createStrictMock(NIOConnector.class);
-      NIOSession session1 = createStrictMock(NIOSession.class);
-      NIOSession session2 = createStrictMock(NIOSession.class);
-      
-      expect(connector.connect()).andReturn(session1).andReturn(session2);
-      expect(session1.isConnected()).andReturn(true);
-      expect(session2.isConnected()).andReturn(true);
-      
-      replay(connector, session1, session2);
-
-      Client client = new ClientImpl(connector, remotingConfig);
-      client.connect();
-      assertTrue(client.isConnected());
-      assertTrue(client.disconnect());
-      assertFalse(client.isConnected());
-
-      client.connect();
-      assertTrue(client.isConnected());
-
-      assertTrue(client.disconnect());
-      assertFalse(client.isConnected());
-      assertFalse(client.disconnect());
-      
-      verify(connector, session1, session2);
-   }
-
-   public void testConnectionFailure() throws Exception
-   {
-      NIOConnector connector = createStrictMock(NIOConnector.class);
-      expect(connector.connect()).andThrow(new IOException("connection exception"));
-
-      replay(connector);
-
-      Client client = new ClientImpl(connector, remotingConfig);
-      
-      try
-      {
-         client.connect();
-         fail("connection must fail");
-      } catch (IOException e)
-      {
-      }
-      
-      verify(connector);
-   }
-
-   public void testSessionID() throws Exception
-   {
-      String sessionID = randomUUID().toString();
-      
-      NIOConnector connector = createStrictMock(NIOConnector.class);
-      NIOSession session = createStrictMock(NIOSession.class);
-      
-      expect(connector.connect()).andReturn(session);
-      expect(session.isConnected()).andReturn(true);
-      expect(session.getID()).andReturn(sessionID);
-      
-      replay(connector, session);
-      
-      Client client = new ClientImpl(connector, remotingConfig);
-      
-      assertNull(client.getSessionID());
-      client.connect();
-
-      String actualSessionID = client.getSessionID();
-      
-      assertNotNull(actualSessionID);
-      assertEquals(sessionID, actualSessionID);
-      client.disconnect();
-      assertNull(client.getSessionID());
-      
-      verify(connector, session);
-   }
-
-   public void testURI() throws Exception
-   {
-      NIOConnector connector = createStrictMock(NIOConnector.class);
-      NIOSession session = createStrictMock(NIOSession.class);
-      
-      expect(connector.getServerURI()).andReturn(null);
-      expect(connector.connect()).andReturn(session);
-      expect(connector.getServerURI()).andReturn("tcp://localhost:" + PORT);
-      expect(connector.getServerURI()).andReturn(null);
-      // no expectation for the session
-      
-      replay(connector, session);
-      
-      Client client = new ClientImpl(connector, remotingConfig);
-      
-      assertNull(client.getURI());
-      client.connect();
-      assertNotNull(client.getURI());
-      client.disconnect();
-      assertNull(client.getURI());
-
-      verify(connector, session);
-   }
-
-   public void testCanNotSendPacketIfNotConnected() throws Exception
-   {
-      NIOConnector connector = createStrictMock(NIOConnector.class);
-      
-      // connector is not expected to be called at all;
-      replay(connector);
-      
-      Client client = new ClientImpl(connector, remotingConfig);
-      try
-      {
-         client.send(new NullPacket(), true);
-         fail("can not send a packet if the dispatcher is not connected");
-      }
-      catch (IllegalStateException e)
-      {
-         //Ok
-      }
-      
-      verify(connector);
-   }
-   
-   @Override
-   protected void setUp() throws Exception
-   {
-      super.setUp();
-      
-      this.remotingConfig = new RemotingConfiguration(TCP, "localhost", PORT);
-   }
-   
-   @Override
-   protected void tearDown() throws Exception
-   {
-      remotingConfig = null;
-
-      super.tearDown();
-   }
-}

Modified: trunk/tests/src/org/jboss/messaging/core/remoting/wireformat/test/unit/PacketTypeTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/core/remoting/wireformat/test/unit/PacketTypeTest.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/messaging/core/remoting/wireformat/test/unit/PacketTypeTest.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -19,60 +19,59 @@
 import static org.jboss.messaging.core.remoting.impl.mina.MinaPacketCodec.UTF_8_ENCODER;
 import static org.jboss.messaging.core.remoting.wireformat.AbstractPacket.NO_ID_SET;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.BYTES;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.CLOSE;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONN_CREATESESSION;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONN_CREATESESSION_RESP;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONN_START;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONN_STOP;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONS_FLOWTOKEN;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.CREATECONNECTION;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.CREATECONNECTION_RESP;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.NULL;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.PING;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.PONG;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_ACKNOWLEDGE;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_ADD_ADDRESS;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BINDINGQUERY;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BINDINGQUERY_RESP;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_HASNEXTMESSAGE;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_HASNEXTMESSAGE_RESP;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGE;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGEBLOCK;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGEBLOCK_RESP;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGE_RESP;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_RESET;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CANCEL;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONS_FLOWTOKEN;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.CLOSE;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_COMMIT;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATEBROWSER;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATEBROWSER_RESP;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATECONSUMER;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATECONSUMER_RESP;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATEQUEUE;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_DELETE_QUEUE;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_DELIVER;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_QUEUEQUERY;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_QUEUEQUERY_RESP;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_RECOVER;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_REMOVE_ADDRESS;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_ROLLBACK;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_SEND;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_SETID;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONN_START;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONN_STOP;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_COMMIT;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_END;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_FORGET;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_GET_TIMEOUT;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_GET_TIMEOUT_RESP;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_INDOUBT_XIDS;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_INDOUBT_XIDS_RESP;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_JOIN;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_PREPARE;
+import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_RESP;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_RESUME;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_ROLLBACK;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_SET_TIMEOUT;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_SET_TIMEOUT_RESP;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_START;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_SUSPEND;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.NULL;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.PING;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.PONG;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BINDINGQUERY;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_HASNEXTMESSAGE;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGE;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGEBLOCK;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATEBROWSER;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.CREATECONNECTION;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATECONSUMER;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONN_CREATESESSION;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATEQUEUE;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_DELETE_QUEUE;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_QUEUEQUERY;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_INDOUBT_XIDS;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_PREPARE;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BINDINGQUERY_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_HASNEXTMESSAGE_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGE_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGEBLOCK_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATEBROWSER_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.CREATECONNECTION_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_CREATECONSUMER_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.CONN_CREATESESSION_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_QUEUEQUERY_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_RESP;
-import static org.jboss.messaging.core.remoting.wireformat.PacketType.SESS_XA_INDOUBT_XIDS_RESP;
 import static org.jboss.messaging.core.remoting.wireformat.PacketType.TEXT;
 import static org.jboss.messaging.core.remoting.wireformat.test.unit.CodecAssert.assertEqualsByteArrays;
 import static org.jboss.messaging.test.unit.RandomUtil.randomByte;
@@ -93,31 +92,33 @@
 import org.jboss.messaging.core.Message;
 import org.jboss.messaging.core.impl.MessageImpl;
 import org.jboss.messaging.core.remoting.codec.AbstractPacketCodec;
+import org.jboss.messaging.core.remoting.codec.BytesPacketCodec;
+import org.jboss.messaging.core.remoting.codec.ConnectionCreateSessionMessageCodec;
+import org.jboss.messaging.core.remoting.codec.ConnectionCreateSessionResponseMessageCodec;
+import org.jboss.messaging.core.remoting.codec.ConsumerFlowTokenMessageCodec;
+import org.jboss.messaging.core.remoting.codec.CreateConnectionMessageCodec;
+import org.jboss.messaging.core.remoting.codec.CreateConnectionResponseMessageCodec;
+import org.jboss.messaging.core.remoting.codec.DeliverMessageCodec;
+import org.jboss.messaging.core.remoting.codec.PingCodec;
+import org.jboss.messaging.core.remoting.codec.PongCodec;
+import org.jboss.messaging.core.remoting.codec.RemotingBuffer;
+import org.jboss.messaging.core.remoting.codec.SessionAcknowledgeMessageCodec;
+import org.jboss.messaging.core.remoting.codec.SessionAddAddressMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionBindingQueryMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionBindingQueryResponseMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionBrowserHasNextMessageResponseMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionBrowserNextMessageBlockMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionBrowserNextMessageBlockResponseMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionBrowserNextMessageResponseMessageCodec;
-import org.jboss.messaging.core.remoting.codec.BytesPacketCodec;
-import org.jboss.messaging.core.remoting.codec.CreateConnectionMessageCodec;
-import org.jboss.messaging.core.remoting.codec.CreateConnectionResponseMessageCodec;
-import org.jboss.messaging.core.remoting.codec.ConsumerFlowTokenMessageCodec;
+import org.jboss.messaging.core.remoting.codec.SessionCancelMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionCreateBrowserMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionCreateBrowserResponseMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionCreateConsumerMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionCreateConsumerResponseMessageCodec;
-import org.jboss.messaging.core.remoting.codec.ConnectionCreateSessionMessageCodec;
-import org.jboss.messaging.core.remoting.codec.ConnectionCreateSessionResponseMessageCodec;
+import org.jboss.messaging.core.remoting.codec.SessionCreateQueueMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionDeleteQueueMessageCodec;
-import org.jboss.messaging.core.remoting.codec.DeliverMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionQueueQueryMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionQueueQueryResponseMessageCodec;
-import org.jboss.messaging.core.remoting.codec.RemotingBuffer;
-import org.jboss.messaging.core.remoting.codec.SessionAcknowledgeMessageCodec;
-import org.jboss.messaging.core.remoting.codec.SessionAddAddressMessageCodec;
-import org.jboss.messaging.core.remoting.codec.SessionCancelMessageCodec;
-import org.jboss.messaging.core.remoting.codec.SessionCreateQueueMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionRemoveAddressMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionSendMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionXACommitMessageCodec;
@@ -133,11 +134,26 @@
 import org.jboss.messaging.core.remoting.codec.SessionXASetTimeoutMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionXASetTimeoutResponseMessageCodec;
 import org.jboss.messaging.core.remoting.codec.SessionXAStartMessageCodec;
-import org.jboss.messaging.core.remoting.codec.SessionSetIDMessageCodec;
 import org.jboss.messaging.core.remoting.codec.TextPacketCodec;
 import org.jboss.messaging.core.remoting.impl.mina.PacketCodecFactory;
 import org.jboss.messaging.core.remoting.impl.mina.MinaPacketCodec.BufferWrapper;
 import org.jboss.messaging.core.remoting.wireformat.AbstractPacket;
+import org.jboss.messaging.core.remoting.wireformat.BytesPacket;
+import org.jboss.messaging.core.remoting.wireformat.CloseMessage;
+import org.jboss.messaging.core.remoting.wireformat.ConnectionCreateSessionMessage;
+import org.jboss.messaging.core.remoting.wireformat.ConnectionCreateSessionResponseMessage;
+import org.jboss.messaging.core.remoting.wireformat.ConnectionStartMessage;
+import org.jboss.messaging.core.remoting.wireformat.ConnectionStopMessage;
+import org.jboss.messaging.core.remoting.wireformat.ConsumerFlowTokenMessage;
+import org.jboss.messaging.core.remoting.wireformat.CreateConnectionRequest;
+import org.jboss.messaging.core.remoting.wireformat.CreateConnectionResponse;
+import org.jboss.messaging.core.remoting.wireformat.DeliverMessage;
+import org.jboss.messaging.core.remoting.wireformat.NullPacket;
+import org.jboss.messaging.core.remoting.wireformat.PacketType;
+import org.jboss.messaging.core.remoting.wireformat.Ping;
+import org.jboss.messaging.core.remoting.wireformat.Pong;
+import org.jboss.messaging.core.remoting.wireformat.SessionAcknowledgeMessage;
+import org.jboss.messaging.core.remoting.wireformat.SessionAddAddressMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionBindingQueryMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionBindingQueryResponseMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionBrowserHasNextMessageMessage;
@@ -147,30 +163,16 @@
 import org.jboss.messaging.core.remoting.wireformat.SessionBrowserNextMessageMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionBrowserNextMessageResponseMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionBrowserResetMessage;
-import org.jboss.messaging.core.remoting.wireformat.BytesPacket;
-import org.jboss.messaging.core.remoting.wireformat.CloseMessage;
-import org.jboss.messaging.core.remoting.wireformat.ConsumerFlowTokenMessage;
+import org.jboss.messaging.core.remoting.wireformat.SessionCancelMessage;
+import org.jboss.messaging.core.remoting.wireformat.SessionCommitMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionCreateBrowserMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionCreateBrowserResponseMessage;
-import org.jboss.messaging.core.remoting.wireformat.CreateConnectionRequest;
-import org.jboss.messaging.core.remoting.wireformat.CreateConnectionResponse;
 import org.jboss.messaging.core.remoting.wireformat.SessionCreateConsumerMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionCreateConsumerResponseMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionCreateQueueMessage;
-import org.jboss.messaging.core.remoting.wireformat.ConnectionCreateSessionMessage;
-import org.jboss.messaging.core.remoting.wireformat.ConnectionCreateSessionResponseMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionDeleteQueueMessage;
-import org.jboss.messaging.core.remoting.wireformat.DeliverMessage;
-import org.jboss.messaging.core.remoting.wireformat.NullPacket;
-import org.jboss.messaging.core.remoting.wireformat.PacketType;
-import org.jboss.messaging.core.remoting.wireformat.Ping;
-import org.jboss.messaging.core.remoting.wireformat.Pong;
 import org.jboss.messaging.core.remoting.wireformat.SessionQueueQueryMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionQueueQueryResponseMessage;
-import org.jboss.messaging.core.remoting.wireformat.SessionAcknowledgeMessage;
-import org.jboss.messaging.core.remoting.wireformat.SessionAddAddressMessage;
-import org.jboss.messaging.core.remoting.wireformat.SessionCancelMessage;
-import org.jboss.messaging.core.remoting.wireformat.SessionCommitMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionRecoverMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionRemoveAddressMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionRollbackMessage;
@@ -191,9 +193,6 @@
 import org.jboss.messaging.core.remoting.wireformat.SessionXASetTimeoutResponseMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionXAStartMessage;
 import org.jboss.messaging.core.remoting.wireformat.SessionXASuspendMessage;
-import org.jboss.messaging.core.remoting.wireformat.SessionSetIDMessage;
-import org.jboss.messaging.core.remoting.wireformat.ConnectionStartMessage;
-import org.jboss.messaging.core.remoting.wireformat.ConnectionStopMessage;
 import org.jboss.messaging.core.remoting.wireformat.TextPacket;
 import org.jboss.messaging.test.unit.RandomUtil;
 import org.jboss.messaging.test.unit.UnitTestCase;
@@ -375,36 +374,39 @@
 
    public void testPing() throws Exception
    {
-      Ping packet = new Ping();
-      AbstractPacketCodec<AbstractPacket> codec = PacketCodecFactory
-            .createCodecForEmptyPacket(PING, Ping.class);
-
-      SimpleRemotingBuffer buffer = encode(packet, codec);
-      checkHeader(buffer, packet);
-      checkBodyIsEmpty(buffer);
+      Ping ping = new Ping(randomString());
+      AbstractPacketCodec<Ping> codec = new PingCodec();
+      
+      SimpleRemotingBuffer buffer = encode(ping, codec);
+      checkHeader(buffer, ping);
+      checkBody(buffer, ping.getSessionID());
       buffer.rewind();
 
       AbstractPacket decodedPacket = codec.decode(buffer);
 
       assertTrue(decodedPacket instanceof Ping);
-      assertEquals(PING, decodedPacket.getType());
+      Ping decodedPing = (Ping) decodedPacket;
+      assertEquals(PING, decodedPing.getType());
+      assertEquals(ping.getSessionID(), decodedPing.getSessionID());
    }
 
    public void testPong() throws Exception
    {
-      Pong packet = new Pong();
-      AbstractPacketCodec<AbstractPacket> codec = PacketCodecFactory
-            .createCodecForEmptyPacket(PONG, Pong.class);
-
-      SimpleRemotingBuffer buffer = encode(packet, codec);
-      checkHeader(buffer, packet);
-      checkBodyIsEmpty(buffer);
+      Pong pong = new Pong(randomString(), true);
+      AbstractPacketCodec<Pong> codec = new PongCodec();
+      
+      SimpleRemotingBuffer buffer = encode(pong, codec);
+      checkHeader(buffer, pong);
+      checkBody(buffer, pong.getSessionID(), pong.isSessionFailed());
       buffer.rewind();
 
       AbstractPacket decodedPacket = codec.decode(buffer);
 
       assertTrue(decodedPacket instanceof Pong);
-      assertEquals(PONG, decodedPacket.getType());
+      Pong decodedPong = (Pong) decodedPacket;
+      assertEquals(PONG, decodedPong.getType());
+      assertEquals(pong.getSessionID(), decodedPong.getSessionID());
+      assertEquals(pong.isSessionFailed(), decodedPong.isSessionFailed());
    }
 
    public void testTextPacket() throws Exception
@@ -444,24 +446,6 @@
       assertEquals(BYTES, p.getType());
       assertEqualsByteArrays(packet.getBytes(), p.getBytes());
    }
-
-   public void testSetSessionIDMessage() throws Exception
-   {
-      SessionSetIDMessage message = new SessionSetIDMessage(randomString());
-
-      AbstractPacketCodec codec = new SessionSetIDMessageCodec();
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      checkBody(buffer, message.getSessionID());
-      buffer.rewind();
-
-      AbstractPacket decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionSetIDMessage);
-      SessionSetIDMessage decodedMessage = (SessionSetIDMessage) decodedPacket;
-      assertEquals(SESS_SETID, decodedMessage.getType());
-      assertEquals(message.getSessionID(), decodedMessage.getSessionID());
-   }
    
    public void testCreateConnectionRequest() throws Exception
    {

Modified: trunk/tests/src/org/jboss/test/messaging/JBMServerTestCase.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/JBMServerTestCase.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/test/messaging/JBMServerTestCase.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -37,9 +37,11 @@
 import javax.transaction.TransactionManager;
 
 import org.jboss.jms.client.JBossConnectionFactory;
+import org.jboss.jms.server.ConnectionManager;
 import org.jboss.jms.server.security.Role;
 import org.jboss.messaging.core.MessagingServer;
 import org.jboss.messaging.core.MessagingServerManagement;
+import org.jboss.messaging.core.remoting.RemotingConfiguration;
 import org.jboss.messaging.microcontainer.JBMBootstrapServer;
 import org.jboss.test.messaging.tools.ServerManagement;
 import org.jboss.test.messaging.tools.container.DatabaseClearer;
@@ -719,12 +721,22 @@
 
    protected boolean assertRemainingMessages(int expected) throws Exception
    {
+      sleepIfRemoting(500);
+      
       Integer messageCount = servers.get(0).getMessageCountForQueue("Queue1");
 
       assertEquals(expected, messageCount.intValue());
       return expected == messageCount.intValue();
    }
 
+   protected static void assertActiveConnectionsOnTheServer(int expectedSize)
+   throws Exception
+   {
+      ConnectionManager cm = servers.get(0).getMessagingServer()
+      .getConnectionManager();
+      assertEquals(expectedSize, cm.getActiveConnections().size());
+   }
+
    public static void deployConnectionFactory(String clientId, String objectName,
                                               String[] jndiBindings)
            throws Exception
@@ -945,5 +957,24 @@
          log.info("server " + i + " killed and dead");
       }
    }
+   
 
+   /**
+    * Sleeps a little if invm optimization is disabled for remoting.
+    * 
+    * This little sleep is necessary due to the async behavior of our remoting code.
+    * If we send non-durable messages and checks immediately that 
+    * they've been received on the server, it may fail since these
+    * messages are sent asynchronously.
+    * 
+    * @param time sleep time in milliseconds
+    */
+   private void sleepIfRemoting(int time) throws Exception
+   {
+      RemotingConfiguration remotingConf = servers.get(0).getMessagingServer().getRemotingService().getRemotingConfiguration();
+      if (remotingConf.isInvmDisabled())
+      {
+         Thread.sleep(time);
+      }
+   }
 }

Modified: trunk/tests/src/org/jboss/test/messaging/jms/ClientExitTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/ClientExitTest.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/test/messaging/jms/ClientExitTest.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,203 +1,142 @@
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2005, JBoss Inc., and individual contributors as indicated
-* by the @authors tag. See the copyright.txt in the distribution for a
-* full listing of individual contributors.
-*
-* This is free software; you can redistribute it and/or modify it
-* under the terms of the GNU Lesser General Public License as
-* published by the Free Software Foundation; either version 2.1 of
-* the License, or (at your option) any later version.
-*
-* This software is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this software; if not, write to the Free
-* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-*/
-package org.jboss.test.messaging.jms;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.ObjectOutputStream;
-
-import javax.jms.Connection;
-import javax.jms.ConnectionFactory;
-import javax.jms.MessageConsumer;
-import javax.jms.Queue;
-import javax.jms.Session;
-import javax.jms.TextMessage;
-import javax.naming.InitialContext;
-
-import org.jboss.messaging.util.Logger;
-import org.jboss.test.messaging.JBMServerTestCase;
-
-/**
- * A test that makes sure that a Messaging client gracefully exists after the last connection is
- * closed. Test for http://jira.jboss.org/jira/browse/JBMESSAGING-417.
- *
- * This is not technically a crash test, but it uses the same type of topology as the crash tests
- * (local server, remote VM client).
- *
- * @author <a href="mailto:ovidiu at feodorov.com">Ovidiu Feodorov</a>
- * @version 1.1
- *
- * $Id$
- */
-public class ClientExitTest extends JBMServerTestCase
-{
-   // Constants ------------------------------------------------------------------------------------
-
-   public static final String SERIALIZED_CF_FILE_NAME = "CFandQueue.ser";
-   public static final String MESSAGE_TEXT = "kolowalu";
-
-   // Static ---------------------------------------------------------------------------------------
-
-   private static final Logger log = Logger.getLogger(ClientExitTest.class);
-
-   // Attributes -----------------------------------------------------------------------------------
-
-   // Constructors ---------------------------------------------------------------------------------
-
-   public ClientExitTest(String name)
-   {
-      super(name);
-   }
-
-   // Public ---------------------------------------------------------------------------------------
-
-   public void testGracefulClientExit() throws Exception
-   {
-      File serialized = null;
-      
-      Connection conn = null;
-
-      try
-      {
-
-         //localServer.start("all", true);
-         createQueue("Queue");
-
-         // lookup the connection factory and the queue which we'll send to the client VM via a
-         // serialized instances saved in file
-
-         InitialContext ic = getInitialContext();
-         ConnectionFactory cf = (ConnectionFactory)ic.lookup("/ConnectionFactory");
-         Queue queue = (Queue)ic.lookup("/queue/Queue");
-
-         serialized = writeToFile(cf, queue);
-
-         // spawn a JVM that creates a JMS client, which sends a test message
-
-         Process p = spawnVM(serialized);
-
-         // read the message from the queue
-
-         conn = cf.createConnection();
-         conn.start();
-         Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
-         MessageConsumer cons = sess.createConsumer(queue);
-         TextMessage tm = (TextMessage)cons.receive(15000);
-
-         assertNotNull(tm);
-         assertEquals(MESSAGE_TEXT, tm.getText());
-
-         // the client VM should exit by itself. If it doesn't, that means we have a problem
-         // and the test will timeout
-         log.info("waiting for the client VM to exit ...");
-         p.waitFor();
-
-         assertEquals(0, p.exitValue());
-      }
-      finally
-      {
-         try
-         {
-            if (conn != null)
-               conn.close();
-
-            // TODO delete the file
-            if (serialized != null)
-            {
-               serialized.delete();
-            }
-
-         }
-         catch (Throwable ignored)
-         {
-            log.warn("Exception ignored:" + ignored.toString(), ignored);
-         }
-      }
-   }
-
-   // Package protected ----------------------------------------------------------------------------
-
-   // Protected ------------------------------------------------------------------------------------
-
-
-
-   // Private --------------------------------------------------------------------------------------
-
-   private Process spawnVM(File serialized) throws Exception
-   {
-      StringBuffer sb = new StringBuffer();
-
-      sb.append("java").append(' ');
-
-      String classPath = System.getProperty("java.class.path");
-
-      if (System.getProperty("os.name").equals("Linux"))
-      {
-         sb.append("-cp").append(" ").append(classPath).append(" ");
-      }
-      else
-      {
-         sb.append("-cp").append(" \"").append(classPath).append("\" ");
-      }
-
-      sb.append("org.jboss.test.messaging.jms.GracefulClient ");
-
-      // the first argument
-      sb.append(serialized.getAbsolutePath());
-
-      String commandLine = sb.toString();
-
-      Process process = Runtime.getRuntime().exec(commandLine);
-
-      log.trace("process: " + process);
-
-      return process;
-   }
-
-   private File writeToFile(ConnectionFactory cf, Queue queue) throws Exception
-   {
-      String moduleOutput = System.getProperty("module.output");
-      if (moduleOutput == null)
-      {
-         throw new Exception("Can't find 'module.output'");
-      }
-      File dir = new File(moduleOutput);
-
-      if (!dir.isDirectory() || !dir.canWrite())
-      {
-         throw new Exception(dir + " is either not a directory or not writable");
-      }
-
-      File file = new File(dir, SERIALIZED_CF_FILE_NAME);
-
-      ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
-      oos.writeObject(cf);
-      oos.writeObject(queue);
-      oos.flush();
-      oos.close();
-
-      return file;
-   }
-
-   // Inner classes --------------------------------------------------------------------------------
-
-}
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.messaging.jms;
+
+import java.io.File;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.MessageConsumer;
+import javax.jms.Queue;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.naming.InitialContext;
+
+import org.jboss.messaging.util.Logger;
+import org.jboss.test.messaging.JBMServerTestCase;
+
+/**
+ * A test that makes sure that a Messaging client gracefully exists after the last connection is
+ * closed. Test for http://jira.jboss.org/jira/browse/JBMESSAGING-417.
+ *
+ * This is not technically a crash test, but it uses the same type of topology as the crash tests
+ * (local server, remote VM client).
+ *
+ * @author <a href="mailto:ovidiu at feodorov.com">Ovidiu Feodorov</a>
+ * @version 1.1
+ *
+ * $Id$
+ */
+public class ClientExitTest extends JBMServerTestCase
+{
+   // Constants ------------------------------------------------------------------------------------
+
+   public static final String SERIALIZED_CF_FILE_NAME = "CFandQueue.ser";
+   public static final String MESSAGE_TEXT = "kolowalu";
+
+   // Static ---------------------------------------------------------------------------------------
+
+   private static final Logger log = Logger.getLogger(ClientExitTest.class);
+
+   // Attributes -----------------------------------------------------------------------------------
+
+   // Constructors ---------------------------------------------------------------------------------
+
+   public ClientExitTest(String name)
+   {
+      super(name);
+   }
+
+   // Public ---------------------------------------------------------------------------------------
+
+   public void testGracefulClientExit() throws Exception
+   {
+      File serialized = null;
+      
+      Connection conn = null;
+
+      try
+      {
+
+         //localServer.start("all", true);
+         createQueue("Queue");
+
+         // lookup the connection factory and the queue which we'll send to the client VM via a
+         // serialized instances saved in file
+
+         InitialContext ic = getInitialContext();
+         ConnectionFactory cf = (ConnectionFactory)ic.lookup("/ConnectionFactory");
+         Queue queue = (Queue)ic.lookup("/queue/Queue");
+
+         serialized = SerializedClientSupport.writeToFile(SERIALIZED_CF_FILE_NAME, cf, queue);
+
+         // spawn a JVM that creates a JMS client, which sends a test message
+         Process p = SerializedClientSupport.spawnVM(GracefulClient.class.getName(), new String[] {serialized.getAbsolutePath()});
+
+         // read the message from the queue
+
+         conn = cf.createConnection();
+         conn.start();
+         Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
+         MessageConsumer cons = sess.createConsumer(queue);
+         TextMessage tm = (TextMessage)cons.receive(15000);
+
+         assertNotNull(tm);
+         assertEquals(MESSAGE_TEXT, tm.getText());
+
+         // the client VM should exit by itself. If it doesn't, that means we have a problem
+         // and the test will timeout
+         log.info("waiting for the client VM to exit ...");
+         p.waitFor();
+
+         assertEquals(0, p.exitValue());
+      }
+      finally
+      {
+         try
+         {
+            if (conn != null)
+               conn.close();
+
+            // TODO delete the file
+            if (serialized != null)
+            {
+               serialized.delete();
+            }
+
+         }
+         catch (Throwable ignored)
+         {
+            log.warn("Exception ignored:" + ignored.toString(), ignored);
+         }
+      }
+   }
+
+   // Package protected ----------------------------------------------------------------------------
+
+   // Protected ------------------------------------------------------------------------------------
+
+   // Private --------------------------------------------------------------------------------------
+
+   // Inner classes --------------------------------------------------------------------------------
+
+}

Added: trunk/tests/src/org/jboss/test/messaging/jms/SerializedClientSupport.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/SerializedClientSupport.java	                        (rev 0)
+++ trunk/tests/src/org/jboss/test/messaging/jms/SerializedClientSupport.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,105 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.test.messaging.jms;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.ObjectOutputStream;
+
+import javax.jms.ConnectionFactory;
+import javax.jms.Queue;
+
+import org.jboss.messaging.util.Logger;
+
+/**
+ * @author <a href="mailto:ovidiu at feodorov.com">Ovidiu Feodorov</a>
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ *
+ * @version <tt>$Revision$</tt>
+ *
+ */
+public class SerializedClientSupport
+{
+   // Constants -----------------------------------------------------
+
+   private static final Logger log = Logger.getLogger(ClientExitTest.class);
+
+   // Attributes ----------------------------------------------------
+
+   // Static --------------------------------------------------------
+
+   public static Process spawnVM(String className, String[] args) throws Exception
+   {
+      StringBuffer sb = new StringBuffer();
+
+      sb.append("java").append(' ');
+
+      String classPath = System.getProperty("java.class.path");
+
+      if (System.getProperty("os.name").equals("Linux"))
+      {
+         sb.append("-cp").append(" ").append(classPath).append(" ");
+      }
+      else
+      {
+         sb.append("-cp").append(" \"").append(classPath).append("\" ");
+      }
+
+      sb.append(className).append(' ');
+
+      // the first argument
+      for (int i = 0; i < args.length; i++)
+      {
+         sb.append(args[i]).append(' ');
+      }
+
+      String commandLine = sb.toString();
+
+      Process process = Runtime.getRuntime().exec(commandLine);
+
+      log.trace("process: " + process);
+
+      return process;
+   }
+
+   public static File writeToFile(String fileName, ConnectionFactory cf, Queue queue) throws Exception
+   {
+      String moduleOutput = System.getProperty("java.io.tmpdir");
+      if (moduleOutput == null)
+      {
+         throw new Exception("Can't find 'module.output'");
+      }
+      File dir = new File(moduleOutput);
+
+      if (!dir.isDirectory() || !dir.canWrite())
+      {
+         throw new Exception(dir + " is either not a directory or not writable");
+      }
+
+      File file = new File(dir, fileName);
+
+      ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
+      oos.writeObject(cf);
+      oos.writeObject(queue);
+      oos.flush();
+      oos.close();
+
+      return file;
+   }
+   
+   // Constructors --------------------------------------------------
+
+   // Public --------------------------------------------------------
+
+   // Package protected ---------------------------------------------
+
+   // Protected -----------------------------------------------------
+
+   // Private -------------------------------------------------------
+
+   // Inner classes -------------------------------------------------
+}

Modified: trunk/tests/src/org/jboss/test/messaging/jms/crash/ClientCrashTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/crash/ClientCrashTest.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/test/messaging/jms/crash/ClientCrashTest.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -21,43 +21,51 @@
   */
 package org.jboss.test.messaging.jms.crash;
 
+import java.io.File;
+
+import javax.jms.Connection;
 import javax.jms.ConnectionFactory;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
 import javax.jms.Queue;
-import javax.jms.Topic;
+import javax.jms.Session;
+import javax.jms.TextMessage;
 import javax.naming.InitialContext;
 
 import org.jboss.jms.server.ConnectionManager;
-import org.jboss.jms.server.connectionmanager.SimpleConnectionManager;
 import org.jboss.messaging.util.Logger;
 import org.jboss.test.messaging.JBMServerTestCase;
-import org.jboss.test.messaging.tools.ServerManagement;
-import org.jboss.test.messaging.tools.container.Server;
-import org.jboss.test.messaging.tools.container.ServiceContainer;
+import org.jboss.test.messaging.jms.SerializedClientSupport;
 
+
 /**
+ * A test that makes sure that a Messaging server cleans up the associated
+ * resources when one of its client crashes.
  * 
- * A ClientCrashTest.
- * 
  * @author <a href="tim.fox at jboss.com">Tim Fox</a>
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * 
  * @version <tt>$Revision$</tt>
- *
- * $Id$
  * 
  */
 public class ClientCrashTest extends JBMServerTestCase
 {
    // Constants -----------------------------------------------------
 
+   public static final String SERIALIZED_CF_FILE_NAME = "ClientCrashTest_CFandQueue.ser";
+   public static final String MESSAGE_TEXT_FROM_SERVER = "ClientCrashTest from server";
+   public static final String MESSAGE_TEXT_FROM_CLIENT = "ClientCrashTest from client";
+
    // Static --------------------------------------------------------
-   
+
    private static final Logger log = Logger.getLogger(ClientCrashTest.class);
-   
+
    // Attributes ----------------------------------------------------
-   
-   protected Server localServer;
-   
-   protected Server remoteServer;
 
+   private File serialized;
+   private ConnectionFactory cf;
+   private Queue queue;
+
    // Constructors --------------------------------------------------
 
    public ClientCrashTest(String name)
@@ -67,168 +75,114 @@
 
    // Public --------------------------------------------------------
 
-   // JIRA http://jira.jboss.org/jira/browse/JBMESSAGING-1196
-   // The tests have been disabled until a heartbeat is added to the
-   // new remoting code to check when client crashes
-   
-//   public void setUp() throws Exception
-//   {
-//   	//Server might have been left around by other tests
-//   	kill(1);
-//   	
-//      //stop();
-//      
-//      // Start the local server
-//      localServer = new LocalTestServer(1);
-//      localServer.start(getContainerConfig(), getConfiguration(), false);
-//      
-//      // Start all the services locally
-//      //localServer.start("all", true);
-//
-//      // This crash test is relying on a precise value of LeaseInterval, so we don't rely on
-//      // the default, whatever that is ...      
-//       
-//      localServer.deployQueue("Queue", null, false);
-//      
-//      localServer.deployTopic("Topic", null, false);
-//       
-//      // Connect to the remote server, but don't start a servicecontainer on it. We are only using
-//      // the remote server to open a client connection to the local server.
-//      //ServerManagement.create();
-//          
-//      remoteServer = servers.get(0);
-//
-//      super.setUp();
-//      
-//   }
-//
-//   public void tearDown() throws Exception
-//   {       
-//      localServer.stop();
-//      
-//      super.tearDown();
-//   }
-   
-   private void performCrash(long wait, boolean contains) throws Exception
+   public void testCrashClientWithOneConnection() throws Exception
    {
-   	InitialContext theIC = getInitialContext();
-      
-      ConnectionFactory cf = (ConnectionFactory)theIC.lookup("/ConnectionFactory");
-      
-      Queue queue = (Queue)theIC.lookup("/queue/Queue");
-      
-      CreateClientOnServerCommand command = new CreateClientOnServerCommand(cf, queue, true);
-      
-      String remotingSessionId = (String)remoteServer.executeCommand(command);
-      
-      ConnectionManager cm = localServer.getServerPeer().getConnectionManager();
-            
-      assertTrue(cm.containsRemotingSession(remotingSessionId));
-      
-      // Now we should have a client connection from the remote server to the local server
-      
-      ServerManagement.kill(0);
-
-      log.trace("killed remote server");
-      
-      //Wait for connection resources to be cleared up
-      Thread.sleep(wait);
-           
-      // See if we still have a connection with this id
-      assertEquals(contains, cm.containsRemotingSession(remotingSessionId));
+      crashClient(1);
    }
-      
-   public void testTestsAreNotRunUntilJBMESSAGING_1196_IsDone() throws Exception
+
+   public void testCrashClientWithTwoConnections() throws Exception
    {
-      
+      crashClient(2);
    }
-   
-   /**
-    * Test that when a remote jms client crashes, server side resources for connections are
-    * cleaned-up.
-    */
-   public void _testClientCrash() throws Exception
+
+   public void crashClient(int numberOfConnectionsOnTheClient) throws Exception
    {
-   	localServer.setAttribute(ServiceContainer.REMOTING_OBJECT_NAME, "LeasePeriod", "2000");
-   	
-      performCrash(8000, false);
+      Connection conn = null;
+
+      try
+      {
+         assertActiveConnections(0);
+
+         // spawn a JVM that creates a JMS client, which waits to receive a test
+         // message
+         Process p = SerializedClientSupport.spawnVM(CrashClient.class
+               .getName(), new String[] { serialized.getAbsolutePath(),
+               Integer.toString(numberOfConnectionsOnTheClient) });
+
+         // send the message to the queue
+         conn = cf.createConnection();
+         conn.start();
+         Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
+         MessageProducer producer = sess.createProducer(queue);
+         MessageConsumer consumer = sess.createConsumer(queue);
+
+         TextMessage messageFromClient = (TextMessage) consumer.receive(5000);
+         assertEquals(MESSAGE_TEXT_FROM_CLIENT, messageFromClient.getText());
+
+         // 1 local connection to the server
+         // + 1 per connection to the client
+         assertActiveConnections(1 + numberOfConnectionsOnTheClient);
+
+         producer.send(sess.createTextMessage(MESSAGE_TEXT_FROM_SERVER));
+
+         log.info("waiting for the client VM to crash ...");
+         p.waitFor();
+
+         assertEquals(9, p.exitValue());
+
+         Thread.sleep(2000);
+         // the crash must have been detected and the client resources cleaned
+         // up only the local connection remains
+         assertActiveConnections(1);
+
+         conn.close();
+
+         assertActiveConnections(0);
+      } finally
+      {
+         try
+         {
+            if (conn != null)
+               conn.close();
+         } catch (Throwable ignored)
+         {
+            log.warn("Exception ignored:" + ignored.toString(), ignored);
+         }
+      }
    }
-   
-   public void _testClientCrashLargeLease() throws Exception
+
+   // Package protected ---------------------------------------------
+
+   @Override
+   protected void setUp() throws Exception
    {
-      localServer.setAttribute(ServiceContainer.REMOTING_OBJECT_NAME, "LeasePeriod", "30000");      
-   	
-      performCrash(8000, true);
+      super.setUp();
+
+      createQueue("Queue");
+
+      InitialContext ic = getInitialContext();
+      cf = (ConnectionFactory) ic.lookup("/ConnectionFactory");
+      queue = (Queue) ic.lookup("/queue/Queue");
+
+      serialized = SerializedClientSupport.writeToFile(SERIALIZED_CF_FILE_NAME,
+            cf, queue);
    }
 
-   public void _testClientCrashNegativeLease() throws Exception
+   @Override
+   protected void tearDown() throws Exception
    {
-      //Set lease period to -1 --> this should disable leasing so the state won't be cleared up
-      
-      localServer.setAttribute(ServiceContainer.REMOTING_OBJECT_NAME, "LeasePeriod", "-1");       
-   	
-      performCrash(8000, true);
+      servers.get(0).destroyQueue("Queue", "/queue/Queue");
+
+      if (serialized != null)
+      {
+         serialized.delete();
+      }
+
+      super.tearDown();
    }
-   
-   public void _testClientCrashZeroLease() throws Exception
-   {
-      //Set lease period to 0 --> this should disable leasing so the state won't be cleared up
-      
-      localServer.setAttribute(ServiceContainer.REMOTING_OBJECT_NAME, "LeasePeriod", "0");     
-   	
-      performCrash(8000, true);
-   }
-   
-   public void _testClientCrashWithTwoConnections() throws Exception
-   {
-      localServer.setAttribute(ServiceContainer.REMOTING_OBJECT_NAME, "LeasePeriod", "2000");      
-   	
-      InitialContext ic = getInitialContext();
-      Topic topic = (Topic)ic.lookup("/topic/Topic");
-      
-      ConnectionFactory cf = (ConnectionFactory)ic.lookup("/ConnectionFactory");
-      
-      CreateTwoClientOnServerCommand command = new CreateTwoClientOnServerCommand(cf, topic, true);
-      
-      String remotingSessionId[] = (String[])remoteServer.executeCommand(command);
-      
-      ConnectionManager cm = localServer.getServerPeer().getConnectionManager();
-            
-      log.info("server(0) = " + remotingSessionId[0]);
-      log.info("server(1) = " + remotingSessionId[1]);
-      log.info("we have = " + ((SimpleConnectionManager)cm).getClients().size() + " clients registered on SimpleconnectionManager");
-      
-      assertFalse(cm.containsRemotingSession(remotingSessionId[0]));
-      assertTrue(cm.containsRemotingSession(remotingSessionId[1]));
-      
-      ServerManagement.kill(0);
-      
-      // Now we should have a client connection from the remote server to the local server
-      
-      log.info("killed remote server");
-        
-      // Wait for connection resources to be cleared up
-      Thread.sleep(8000);
-           
-      // See if we still have a connection with this id
-      
-      //Connection state should have been cleared up by now
-      assertFalse(cm.containsRemotingSession(remotingSessionId[0]));
-      assertFalse(cm.containsRemotingSession(remotingSessionId[1]));
-      
-      log.info("Servers = " + ((SimpleConnectionManager)cm).getClients().size());
-      
-      assertEquals(0,((SimpleConnectionManager)cm).getClients().size());
-   }
-   
-   
-   // Package protected ---------------------------------------------
-   
+
    // Protected -----------------------------------------------------
-   
+
    // Private -------------------------------------------------------
-   
-  
+
+   private static void assertActiveConnections(int expectedActiveConnections)
+         throws Exception
+   {
+      ConnectionManager cm = servers.get(0).getMessagingServer()
+            .getConnectionManager();
+      assertEquals(expectedActiveConnections, cm.getActiveConnections().size());
+   }
+
    // Inner classes -------------------------------------------------
 
 }

Added: trunk/tests/src/org/jboss/test/messaging/jms/crash/CrashClient.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/crash/CrashClient.java	                        (rev 0)
+++ trunk/tests/src/org/jboss/test/messaging/jms/crash/CrashClient.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,107 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.messaging.jms.crash;
+
+import java.io.FileInputStream;
+import java.io.ObjectInputStream;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+
+
+/**
+ * Code to be run in an external VM, via main().
+ * 
+ * This client will open a connection, receive a message and crash.
+ *
+ * @author <a href="mailto:ovidiu at feodorov.com">Ovidiu Feodorov</a>
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * 
+ * @version <tt>$Revision$</tt>
+ */
+public class CrashClient
+{
+   // Constants ------------------------------------------------------------------------------------
+
+   // Static ---------------------------------------------------------------------------------------
+
+   public static void main(String[] args) throws Exception
+   {
+
+      String serializedFileName = args[0];
+      int numberOfConnections = Integer.parseInt(args[1]);
+
+      // we don't want to mess with JNDI, read the connection factory and the queue from their
+      // serialized format, from disk
+      ObjectInputStream ois =
+         new ObjectInputStream(new FileInputStream(serializedFileName));
+      ConnectionFactory cf =(ConnectionFactory)ois.readObject();
+      Queue queue = (Queue)ois.readObject();
+
+      ois.close();
+      
+      // create one connection which is used
+      Connection conn = cf.createConnection();
+      Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
+      MessageConsumer cons = sess.createConsumer(queue);
+      MessageProducer prod = sess.createProducer(queue);
+
+      if (numberOfConnections > 1)
+      {
+         // create (num - 1) unused connections
+         for (int i = 0; i < numberOfConnections - 1; i++)
+         {
+            cf.createConnection();         
+         }
+      }
+      
+      prod.send(sess.createTextMessage(ClientCrashTest.MESSAGE_TEXT_FROM_CLIENT));
+
+      
+      conn.start();
+      cons.receive(5000);
+      
+      // crash
+      System.exit(9);
+   }
+
+   // Attributes -----------------------------------------------------------------------------------
+
+   // Constructors ---------------------------------------------------------------------------------
+
+   // Command implementation -----------------------------------------------------------------------
+
+   // Public ---------------------------------------------------------------------------------------
+
+   // Package protected ----------------------------------------------------------------------------
+
+   // Protected ------------------------------------------------------------------------------------
+
+   // Private --------------------------------------------------------------------------------------
+
+   // Inner classes --------------------------------------------------------------------------------
+
+}

Deleted: trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateClientOnServerCommand.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateClientOnServerCommand.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateClientOnServerCommand.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,98 +0,0 @@
-/*
-  * JBoss, Home of Professional Open Source
-  * Copyright 2005, JBoss Inc., and individual contributors as indicated
-  * by the @authors tag. See the copyright.txt in the distribution for a
-  * full listing of individual contributors.
-  *
-  * This is free software; you can redistribute it and/or modify it
-  * under the terms of the GNU Lesser General Public License as
-  * published by the Free Software Foundation; either version 2.1 of
-  * the License, or (at your option) any later version.
-  *
-  * This software is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  * Lesser General Public License for more details.
-  *
-  * You should have received a copy of the GNU Lesser General Public
-  * License along with this software; if not, write to the Free
-  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-  */
-package org.jboss.test.messaging.jms.crash;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.jms.Connection;
-import javax.jms.ConnectionFactory;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Queue;
-import javax.jms.Session;
-
-import org.jboss.jms.client.JBossConnection;
-import org.jboss.test.messaging.tools.container.Command;
-import org.jboss.test.messaging.tools.container.Server;
-
-/**
- * 
- * A CreateClientOnServerCommand.
- * 
- * @author <a href="tim.fox at jboss.com">Tim Fox</a>
- * @version <tt>$Revision$</tt>
- *
- * $Id$
- */
-public class CreateClientOnServerCommand implements Command
-{
-   private static final long serialVersionUID = -997724797145152821L;
-   
-   private ConnectionFactory cf;
-   
-   private Queue queue;
-   
-   private boolean retainReference;
-   
-   private static List commands = new ArrayList();
-   
-   public CreateClientOnServerCommand(ConnectionFactory cf, Queue queue, boolean retainReference)
-   {
-      this.cf = cf;
-      
-      this.queue = queue;
-      
-      this.retainReference = retainReference;
-   }
-   
-   /*
-    * Just create a connection, send and receive a message and leave the connection open.
-    */
-   public Object execute(Server server) throws Exception
-   {
-      if (retainReference)
-      {
-         commands.add(this);
-      }
-      
-      Connection conn = cf.createConnection();
-        
-      Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
-          
-      MessageProducer prod = sess.createProducer(queue);
-      
-      prod.send(sess.createMessage());
-         
-      MessageConsumer cons = sess.createConsumer(queue);
-      
-      conn.start();
-      
-      cons.receive();
-      
-      //Leave the connection unclosed
-      
-      //Return the remoting client session id for the connection
-      return ((JBossConnection)conn).getRemotingClientSessionID();
-   }
-
-}

Deleted: trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateHangingConsumerCommand.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateHangingConsumerCommand.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateHangingConsumerCommand.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,80 +0,0 @@
-/*
-  * JBoss, Home of Professional Open Source
-  * Copyright 2005, JBoss Inc., and individual contributors as indicated
-  * by the @authors tag. See the copyright.txt in the distribution for a
-  * full listing of individual contributors.
-  *
-  * This is free software; you can redistribute it and/or modify it
-  * under the terms of the GNU Lesser General Public License as
-  * published by the Free Software Foundation; either version 2.1 of
-  * the License, or (at your option) any later version.
-  *
-  * This software is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  * Lesser General Public License for more details.
-  *
-  * You should have received a copy of the GNU Lesser General Public
-  * License along with this software; if not, write to the Free
-  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-  */
-package org.jboss.test.messaging.jms.crash;
-
-import javax.jms.Connection;
-import javax.jms.ConnectionFactory;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageListener;
-import javax.jms.Queue;
-import javax.jms.Session;
-
-import org.jboss.jms.client.JBossConnection;
-import org.jboss.test.messaging.tools.container.Command;
-import org.jboss.test.messaging.tools.container.Server;
-
-/**
- * @author <a href="tim.fox at jboss.com">Tim Fox</a>
- * @version <tt>$Revision$</tt>
- *
- * $Id$
- */
-public class CreateHangingConsumerCommand implements Command
-{
-   private static final long serialVersionUID = -997724797145152821L;
-   
-   private ConnectionFactory cf;
-   private Queue queue;
-
-   public CreateHangingConsumerCommand(ConnectionFactory cf, Queue queue)
-   {
-      this.cf = cf;
-      this.queue = queue;
-   }
-   
-   public Object execute(Server server) throws Exception
-   {
-      Connection conn = cf.createConnection();
-          
-      Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
-       
-      conn.start();
-      
-      MessageConsumer cons = sess.createConsumer(queue);
-
-      cons.setMessageListener(new Listener());
-      
-      // leave the connection unclosed
-      
-      // return the remoting client session id for the connection
-      return ((JBossConnection)conn).getRemotingClientSessionID();      
-   }
-   
-   class Listener implements MessageListener
-   {
-      public void onMessage(Message m)
-      {
-      }
-   }
-
-}

Deleted: trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateTwoClientOnServerCommand.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateTwoClientOnServerCommand.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/test/messaging/jms/crash/CreateTwoClientOnServerCommand.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -1,96 +0,0 @@
-/*
-  * JBoss, Home of Professional Open Source
-  * Copyright 2005, JBoss Inc., and individual contributors as indicated
-  * by the @authors tag. See the copyright.txt in the distribution for a
-  * full listing of individual contributors.
-  *
-  * This is free software; you can redistribute it and/or modify it
-  * under the terms of the GNU Lesser General Public License as
-  * published by the Free Software Foundation; either version 2.1 of
-  * the License, or (at your option) any later version.
-  *
-  * This software is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  * Lesser General Public License for more details.
-  *
-  * You should have received a copy of the GNU Lesser General Public
-  * License along with this software; if not, write to the Free
-  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-  */
-package org.jboss.test.messaging.jms.crash;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.jms.Connection;
-import javax.jms.ConnectionFactory;
-import javax.jms.Topic;
-
-import org.jboss.jms.client.JBossConnection;
-import org.jboss.test.messaging.tools.container.Command;
-import org.jboss.test.messaging.tools.container.Server;
-
-/**
- * 
- * A CreateClientOnServerCommand.
- * 
- * @author <a href="tim.fox at jboss.com">Tim Fox</a>
- * @author <a href="clebert.suconic at jboss.com">Clebert Suconic</a>
- * @version <tt>$Revision$</tt>
- *
- * $Id$
- */
-public class CreateTwoClientOnServerCommand implements Command
-{
-   private static final long serialVersionUID = -997724797145152821L;
-   
-   private ConnectionFactory cf;
-   
-   private boolean retainReference;
-   
-   private static List commands = new ArrayList();
-   
-   Topic topic;
-   Connection conn1;
-   Connection conn2;
-   
-   public CreateTwoClientOnServerCommand(ConnectionFactory cf,  Topic topic, boolean retainReference)
-   {
-      this.cf = cf;
-      this.topic = topic;
-      
-      this.retainReference = retainReference;
-   }
-   
-   /*
-    * Just create a connection, send and receive a message and leave the connection open.
-    */
-   public Object execute(Server server) throws Exception
-   {
-      if (retainReference)
-      {
-         commands.add(this);
-      }
-      
-      conn1 = cf.createConnection();
-      conn1.setClientID("test1");
-      conn1.start();
-
-      conn2 = cf.createConnection();
-      conn2.setClientID("test2");
-      conn2.start();
-
-      String arrays[] = new String[2];
-      arrays[0] = ((JBossConnection)conn1).getRemotingClientSessionID();
-      arrays[1] = ((JBossConnection)conn2).getRemotingClientSessionID();
-      
-      conn1.close();
-      
-
-      // Return the remoting client session id for the connection
-      return arrays;      
-   }
-
-}

Modified: trunk/tests/src/org/jboss/test/messaging/jms/message/MessageTestBase.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/message/MessageTestBase.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/test/messaging/jms/message/MessageTestBase.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -195,7 +195,7 @@
       assertEquals(topic1, m.getJMSReplyTo());
       assertEquals("someArbitraryType", m.getJMSType());
       assertEquals(queue1, m.getJMSDestination());
-      assertTrue(m.getJMSRedelivered() == redelivered);
+      assertEquals("JMS Redelivered property", m.getJMSRedelivered(), redelivered);
       assertEquals(mode, m.getJMSDeliveryMode());
    }
 

Modified: trunk/tests/src/org/jboss/test/messaging/jms/network/ClientNetworkFailureTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/network/ClientNetworkFailureTest.java	2008-02-12 13:47:41 UTC (rev 3704)
+++ trunk/tests/src/org/jboss/test/messaging/jms/network/ClientNetworkFailureTest.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -32,10 +32,10 @@
 import javax.jms.JMSException;
 import javax.jms.QueueConnection;
 
-import org.jboss.jms.server.ConnectionManager;
-import org.jboss.messaging.core.remoting.ConnectionExceptionListener;
+import org.jboss.jms.client.api.FailureListener;
 import org.jboss.messaging.core.remoting.RemotingConfiguration;
 import org.jboss.messaging.core.remoting.impl.mina.MinaService;
+import org.jboss.messaging.util.MessagingException;
 import org.jboss.test.messaging.jms.JMSTestCase;
 
 /**
@@ -86,11 +86,15 @@
       networkFailureFilter = new NetworkFailureFilter();
       minaService.getFilterChain().addFirst("network-failure",
             networkFailureFilter);
+
+      assertActiveConnectionsOnTheServer(0);
    }
 
    @Override
    protected void tearDown() throws Exception
    {
+      assertActiveConnectionsOnTheServer(0);
+
       minaService.getFilterChain().remove("network-failure");
 
       minaService.stop();
@@ -119,9 +123,8 @@
             exceptionLatch.countDown();
          }
       });
-      ConnectionExceptionListener listener = new ListenerWithLatch(
-            exceptionLatch);
-      minaService.addConnectionExceptionListener(listener);
+      FailureListener listener = new FailureListenerWithLatch(exceptionLatch);
+      minaService.addFailureListener(listener);
 
       networkFailureFilter.messageSentThrowsException = new IOException(
             "Client is unreachable");
@@ -140,7 +143,7 @@
       {
       }
 
-      minaService.removeConnectionExceptionListener(listener);
+      minaService.removeFailureListener(listener);
    }
 
    public void testServerResourcesCleanUpWhenClientCommDropsPacket()
@@ -153,13 +156,13 @@
       {
          public void onException(JMSException e)
          {
+            log.warn("got expected exception on the client");
             exceptionLatch.countDown();
          }
       });
 
-      ConnectionExceptionListener listener = new ListenerWithLatch(
-            exceptionLatch);
-      minaService.addConnectionExceptionListener(listener);
+      FailureListener listener = new FailureListenerWithLatch(exceptionLatch);
+      minaService.addFailureListener(listener);
 
       assertActiveConnectionsOnTheServer(1);
 
@@ -167,7 +170,7 @@
       networkFailureFilter.messageReceivedDropsPacket = true;
 
       boolean gotExceptionsOnTheServerAndTheClient = exceptionLatch.await(
-            KEEP_ALIVE_INTERVAL + KEEP_ALIVE_TIMEOUT + 2, SECONDS);
+            KEEP_ALIVE_INTERVAL + KEEP_ALIVE_TIMEOUT + 3, SECONDS);
       assertTrue(gotExceptionsOnTheServerAndTheClient);
       assertActiveConnectionsOnTheServer(0);
 
@@ -186,27 +189,18 @@
 
    // Private -------------------------------------------------------
 
-   private static void assertActiveConnectionsOnTheServer(int expectedSize)
-         throws Exception
+   private final class FailureListenerWithLatch implements FailureListener
    {
-      ConnectionManager cm = servers.get(0).getMessagingServer()
-            .getConnectionManager();
-      assertEquals(expectedSize, cm.getActiveConnections().size());
-   }
-
-   // Inner classes -------------------------------------------------
-
-   private final class ListenerWithLatch implements ConnectionExceptionListener
-   {
       private final CountDownLatch exceptionLatch;
 
-      private ListenerWithLatch(CountDownLatch exceptionLatch)
+      private FailureListenerWithLatch(CountDownLatch exceptionLatch)
       {
          this.exceptionLatch = exceptionLatch;
       }
 
-      public void handleConnectionException(Throwable e, String sessionID)
+      public void onFailure(MessagingException me)
       {
+         log.warn("got expected exception on the server");
          exceptionLatch.countDown();
       }
    }

Added: trunk/tests/src/org/jboss/test/messaging/jms/server/ConnectionManagerTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/server/ConnectionManagerTest.java	                        (rev 0)
+++ trunk/tests/src/org/jboss/test/messaging/jms/server/ConnectionManagerTest.java	2008-02-12 14:07:49 UTC (rev 3705)
@@ -0,0 +1,77 @@
+/*
+  * JBoss, Home of Professional Open Source
+  * Copyright 2005, JBoss Inc., and individual contributors as indicated
+  * by the @authors tag. See the copyright.txt in the distribution for a
+  * full listing of individual contributors.
+  *
+  * This is free software; you can redistribute it and/or modify it
+  * under the terms of the GNU Lesser General Public License as
+  * published by the Free Software Foundation; either version 2.1 of
+  * the License, or (at your option) any later version.
+  *
+  * This software is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
+  * License along with this software; if not, write to the Free
+  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+  */
+package org.jboss.test.messaging.jms.server;
+
+import javax.jms.Connection;
+
+import org.jboss.test.messaging.JBMServerTestCase;
+
+/**
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * 
+ * @version <tt>$Revision$</tt>
+ * 
+ */
+public class ConnectionManagerTest extends JBMServerTestCase
+{
+   // Constants -----------------------------------------------------
+
+   // Static --------------------------------------------------------
+
+   // Attributes ----------------------------------------------------
+
+   // Constructors --------------------------------------------------
+
+   public ConnectionManagerTest(String name)
+   {
+      super(name);
+   }
+
+   // TestCase overrides -------------------------------------------
+
+   // Public --------------------------------------------------------
+   
+   public void testTwoConnectionsFromTheSameVM() throws Exception
+   {
+      
+      assertActiveConnectionsOnTheServer(0);
+      
+      Connection conn_1 = getConnectionFactory().createConnection();
+      
+      assertActiveConnectionsOnTheServer(1);
+      
+      Connection conn_2 = getConnectionFactory().createConnection();
+      
+      assertActiveConnectionsOnTheServer(2);
+      
+      assertFalse(conn_1.equals(conn_2));
+      
+      conn_1.close();
+      
+      assertActiveConnectionsOnTheServer(1);
+      
+      conn_2.close();
+      
+      assertActiveConnectionsOnTheServer(0);
+   }
+
+}




More information about the jboss-cvs-commits mailing list