[jboss-cvs] JBoss Messaging SVN: r4058 - in trunk: src/main/org/jboss/messaging/core/remoting/impl/mina and 1 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Apr 15 09:12:38 EDT 2008


Author: timfox
Date: 2008-04-15 09:12:37 -0400 (Tue, 15 Apr 2008)
New Revision: 4058

Removed:
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/DecoderStatus.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaDecoder.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaEncoder.java
Modified:
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/AbstractPacketCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/BytesPacketCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ConnectionCreateSessionMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ConnectionCreateSessionResponseMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ConsumerDeliverMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ConsumerFlowTokenMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/CreateConnectionMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/CreateConnectionResponseMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/MessagingExceptionMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/PingCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/PongCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ProducerReceiveTokensMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ProducerSendMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/RemotingBuffer.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionAcknowledgeMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionAddDestinationMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBindingQueryMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBindingQueryResponseMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBrowserHasNextMessageResponseMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBrowserNextMessageBlockMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBrowserNextMessageBlockResponseMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBrowserNextMessageResponseMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCancelMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateBrowserMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateBrowserResponseMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateConsumerMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateConsumerResponseMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateProducerMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateProducerResponseMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateQueueMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionDeleteQueueMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionQueueQueryMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionQueueQueryResponseMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionRemoveDestinationMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXACommitMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAEndMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAForgetMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAGetInDoubtXidsResponseMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAGetTimeoutResponseMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAJoinMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAPrepareMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAResponseMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAResumeMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXARollbackMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXASetTimeoutMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXASetTimeoutResponseMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAStartMessageCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/TextPacketCodec.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/BufferWrapper.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FilterChainSupport.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/PacketCodecFactory.java
   trunk/tests/src/org/jboss/messaging/tests/unit/core/remoting/impl/wireformat/PacketTypeTest.java
Log:
Fix remoting layer to use protocol encoder / decoder


Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/AbstractPacketCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/AbstractPacketCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/AbstractPacketCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -6,21 +6,20 @@
  */
 package org.jboss.messaging.core.remoting.impl.codec;
 
-import static org.jboss.messaging.core.remoting.impl.codec.DecoderStatus.NEED_DATA;
-import static org.jboss.messaging.core.remoting.impl.codec.DecoderStatus.NOT_OK;
-import static org.jboss.messaging.core.remoting.impl.codec.DecoderStatus.OK;
-
-import java.nio.charset.CharacterCodingException;
-
 import javax.transaction.xa.Xid;
 
+import org.apache.mina.common.IoBuffer;
+import org.apache.mina.filter.codec.ProtocolDecoderOutput;
+import org.apache.mina.filter.codec.ProtocolEncoderOutput;
 import org.jboss.messaging.core.logging.Logger;
 import org.jboss.messaging.core.remoting.Packet;
+import org.jboss.messaging.core.remoting.impl.mina.BufferWrapper;
 import org.jboss.messaging.core.remoting.impl.wireformat.PacketType;
 import org.jboss.messaging.core.transaction.impl.XidImpl;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
 public abstract class AbstractPacketCodec<P extends Packet>
 {
@@ -31,6 +30,8 @@
    public static final byte FALSE = (byte) 1;
 
    public static final int BOOLEAN_LENGTH = 1;
+   
+   public static final int BYTE_LENGTH = 1;
 
    public static final int INT_LENGTH = 4;
 
@@ -38,7 +39,8 @@
 
    public static final int LONG_LENGTH = 8;
    
-   private static final int HEADER_LENGTH = LONG_LENGTH + LONG_LENGTH + LONG_LENGTH + BOOLEAN_LENGTH;
+   public static final int HEADER_LENGTH =
+   	BYTE_LENGTH + LONG_LENGTH + LONG_LENGTH + LONG_LENGTH + BOOLEAN_LENGTH;
    
    private static final Logger log = Logger.getLogger(AbstractPacketCodec.class);
 
@@ -59,12 +61,23 @@
 
    // Public --------------------------------------------------------
 
-   public void encode(P packet, RemotingBuffer buf) throws Exception
+   public void encode(final P packet, final ProtocolEncoderOutput out) throws Exception
    {
       long correlationID = packet.getCorrelationID();
       long targetID = packet.getTargetID();
       long executorID = packet.getExecutorID();
-
+      
+      IoBuffer iobuf = IoBuffer.allocate(1024, false);
+      iobuf.setAutoExpand(true);
+      
+      RemotingBuffer buf = new BufferWrapper(iobuf);
+      
+      int messageLength = getBodyLength(packet) + HEADER_LENGTH;
+      
+      log.info("Message length is " + messageLength);
+      
+      //The standard header fields
+      buf.putInt(messageLength);
       buf.put(packet.getType().byteValue());
       buf.putLong(correlationID);
       buf.putLong(targetID);
@@ -72,9 +85,13 @@
       buf.putBoolean(packet.isOneWay());
 
       encodeBody(packet, buf);
+      
+      //for now
+      iobuf.flip();
+      out.write(iobuf);
    }
 
-   public static int sizeof(String nullableString)
+   public static int sizeof(final String nullableString)
    {
       if (nullableString == null)
       {
@@ -87,63 +104,44 @@
       }
    }
    
-   public static int getXidLength(Xid xid)
+   public static int getXidLength(final Xid xid)
    {
       return 1 + 1 + xid.getBranchQualifier().length + 1 + xid.getGlobalTransactionId().length;
    }
 
-   // MessageDecoder implementation ---------------------------------
-
-   public DecoderStatus decodable(RemotingBuffer buffer)
-   {
-   	if (buffer.remaining() < HEADER_LENGTH + INT_LENGTH)
-   	{
-   		return NEED_DATA;
-   	}
-   	
-   	buffer.getLong();
-   	buffer.getLong();
-   	buffer.getLong();
-   	buffer.getBoolean();
-   	int bodyLength = buffer.getInt();
-   	if (buffer.remaining() < bodyLength)
-   	{
-   		return NEED_DATA;
-   	}
-   	return OK;   	
-   }
-
-   public Packet decode(RemotingBuffer wrapper) throws Exception
-   {
-      wrapper.get(); // skip message type
-      long correlationID = wrapper.getLong();
-      long targetID = wrapper.getLong();
-      long executorID = wrapper.getLong();
-      boolean oneWay = wrapper.getBoolean();
+   public boolean decode(final RemotingBuffer buffer, final ProtocolDecoderOutput out) throws Exception
+   {        	   	
+      long correlationID = buffer.getLong();
+      long targetID = buffer.getLong();
+      long executorID = buffer.getLong();
+      boolean oneWay = buffer.getBoolean();
       
-      Packet packet = decodeBody(wrapper);
+      Packet packet = decodeBody(buffer);
 
-      if (packet == null)
-      {
-         return null;
-      }
-      
       packet.setCorrelationID(correlationID);
       packet.setTargetID(targetID);
       packet.setExecutorID(executorID);            
       packet.setOneWay(oneWay);
+      
+      out.write(packet);
 
-      return packet;
+      return false;
    }   
    
+   public PacketType getType()
+   {
+   	return type;
+   }
+   
    // Protected -----------------------------------------------------
 
-   protected abstract void encodeBody(P packet, RemotingBuffer buf)
-         throws Exception;
+   protected abstract int getBodyLength(P packet) throws Exception;
+   
+   protected abstract void encodeBody(P packet, RemotingBuffer buf) throws Exception;
 
    protected abstract Packet decodeBody(RemotingBuffer buffer) throws Exception;
 
-   protected static void encodeXid(Xid xid, RemotingBuffer out)
+   protected static void encodeXid(final Xid xid, final RemotingBuffer out)
    {
       out.putInt(xid.getFormatId());
       out.putInt(xid.getBranchQualifier().length);
@@ -152,7 +150,7 @@
       out.put(xid.getGlobalTransactionId());
    }
    
-   protected static Xid decodeXid(RemotingBuffer in)
+   protected static Xid decodeXid(final RemotingBuffer in)
    {
       int formatID = in.getInt();
       byte[] bq = new byte[in.getInt()];
@@ -162,9 +160,7 @@
       Xid xid = new XidImpl(bq, formatID, gtxid);      
       return xid;
    }
-   
-   
-
+     
    // Private -------------------------------------------------------
 
    // Inner classes -------------------------------------------------

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/BytesPacketCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/BytesPacketCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/BytesPacketCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -11,7 +11,8 @@
 import org.jboss.messaging.core.remoting.impl.wireformat.BytesPacket;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
 public class BytesPacketCodec extends AbstractPacketCodec<BytesPacket>
 {
@@ -33,30 +34,28 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final BytesPacket packet)
+   {
+   	return INT_LENGTH + packet.getBytes().length;
+   }
+   
    @Override
-   protected void encodeBody(BytesPacket packet, RemotingBuffer out)
-         throws Exception
+   protected void encodeBody(final BytesPacket packet, final RemotingBuffer out) throws Exception
    {
       byte[] bytes = packet.getBytes();
       
-      int bodyLength = INT_LENGTH + bytes.length;
-      
-      out.putInt(bodyLength);
       out.putInt(bytes.length);
+      
       out.put(bytes);
    }
 
    @Override
-   protected BytesPacket decodeBody(RemotingBuffer in)
-         throws Exception
+   protected BytesPacket decodeBody(final RemotingBuffer in) throws Exception
    {
-      int bodyLength = in.getInt();
-      if (bodyLength > in.remaining())
-      {
-         return null;
-      }
       int byteLength = in.getInt();
+      
       byte[] bytes = new byte[byteLength];
+      
       in.get(bytes);
 
       return new BytesPacket(bytes);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ConnectionCreateSessionMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ConnectionCreateSessionMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ConnectionCreateSessionMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -11,7 +11,8 @@
 import org.jboss.messaging.core.remoting.impl.wireformat.ConnectionCreateSessionMessage;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
 public class ConnectionCreateSessionMessageCodec extends
       AbstractPacketCodec<ConnectionCreateSessionMessage>
@@ -33,39 +34,23 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final ConnectionCreateSessionMessage packet)
+   {
+   	return 3 * BOOLEAN_LENGTH;
+   }
+   
    @Override
-   protected void encodeBody(ConnectionCreateSessionMessage request, RemotingBuffer out) throws Exception
+   protected void encodeBody(final ConnectionCreateSessionMessage request, final RemotingBuffer out) throws Exception
    {
-      boolean xa = request.isXA();
-      boolean autoCommitSends = request.isAutoCommitSends();
-      boolean autoCommitAcks = request.isAutoCommitAcks();
-      
-
-      int bodyLength = 3;
-
-      out.putInt(bodyLength);
-
-      out.putBoolean(xa);
-      out.putBoolean(autoCommitSends);
-      out.putBoolean(autoCommitAcks);
-      
+      out.putBoolean(request.isXA());
+      out.putBoolean(request.isAutoCommitSends());
+      out.putBoolean(request.isAutoCommitAcks());      
    }
 
    @Override
-   protected ConnectionCreateSessionMessage decodeBody(RemotingBuffer in)
-         throws Exception
+   protected ConnectionCreateSessionMessage decodeBody(final RemotingBuffer in) throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
-      boolean xa = in.getBoolean();
-      boolean autoCommitSends = in.getBoolean();
-      boolean autoCommitAcks = in.getBoolean();
-
-      return new ConnectionCreateSessionMessage(xa, autoCommitSends, autoCommitAcks);
+      return new ConnectionCreateSessionMessage(in.getBoolean(), in.getBoolean(), in.getBoolean());
    }
 
    // Package protected ---------------------------------------------

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ConnectionCreateSessionResponseMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ConnectionCreateSessionResponseMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ConnectionCreateSessionResponseMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -10,7 +10,8 @@
 import org.jboss.messaging.core.remoting.impl.wireformat.PacketType;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
 public class ConnectionCreateSessionResponseMessageCodec extends
       AbstractPacketCodec<ConnectionCreateSessionResponseMessage>
@@ -32,29 +33,22 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final ConnectionCreateSessionResponseMessage packet)
+   {
+   	return LONG_LENGTH;
+   }
+   
    @Override
-   protected void encodeBody(ConnectionCreateSessionResponseMessage response, RemotingBuffer out) throws Exception
+   protected void encodeBody(final ConnectionCreateSessionResponseMessage response, final RemotingBuffer out) throws Exception
    {
-      long sessionID = response.getSessionID();
-
-      out.putInt(LONG_LENGTH);
-      
-      out.putLong(sessionID);
+      out.putLong(response.getSessionID());
    }
 
    @Override
-   protected ConnectionCreateSessionResponseMessage decodeBody(RemotingBuffer in)
+   protected ConnectionCreateSessionResponseMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
-      long sessionID = in.getLong();
-
-      return new ConnectionCreateSessionResponseMessage(sessionID);
+      return new ConnectionCreateSessionResponseMessage(in.getLong());
    }
 
    // Package protected ---------------------------------------------

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ConsumerDeliverMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ConsumerDeliverMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ConsumerDeliverMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -14,7 +14,8 @@
 import org.jboss.messaging.util.StreamUtils;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
 public class ConsumerDeliverMessageCodec extends AbstractPacketCodec<ConsumerDeliverMessage>
 {
@@ -35,31 +36,29 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   //TODO - remove this when in next stage of refactoring
+   private byte[] encodedMsg;
+   
+   protected int getBodyLength(final ConsumerDeliverMessage packet) throws Exception
+   {
+   	encodedMsg = StreamUtils.toBytes(packet.getMessage());
+   	
+   	return INT_LENGTH + encodedMsg.length + LONG_LENGTH; 
+   }
+   
    @Override
-   protected void encodeBody(ConsumerDeliverMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final ConsumerDeliverMessage message, final RemotingBuffer out) throws Exception
    {
-      byte[] encodedMsg = StreamUtils.toBytes(message.getMessage());
-      long deliveryID = message.getDeliveryID();
-
-      int bodyLength = encodedMsg.length
-            + LONG_LENGTH + INT_LENGTH;
-      out.putInt(bodyLength);
-
       out.putInt(encodedMsg.length);
       out.put(encodedMsg);
-      out.putLong(deliveryID);
+      out.putLong(message.getDeliveryID());
+      encodedMsg = null;
    }
 
    @Override
-   protected ConsumerDeliverMessage decodeBody(RemotingBuffer in)
+   protected ConsumerDeliverMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       int msgLength = in.getInt();
       byte[] encodedMsg = new byte[msgLength];
       in.get(encodedMsg);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ConsumerFlowTokenMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ConsumerFlowTokenMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ConsumerFlowTokenMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -32,24 +32,21 @@
    // Public --------------------------------------------------------
 
    // AbstractPacketCodec overrides ---------------------------------
+   
+   protected int getBodyLength(final ConsumerFlowTokenMessage packet) throws Exception
+   {
+   	return INT_LENGTH;
+   }
 
    @Override
-   protected void encodeBody(ConsumerFlowTokenMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final ConsumerFlowTokenMessage message, final RemotingBuffer out) throws Exception
    {
-      out.putInt(INT_LENGTH);
       out.putInt(message.getTokens());
    }
 
    @Override
-   protected ConsumerFlowTokenMessage decodeBody(RemotingBuffer in)
-         throws Exception
+   protected ConsumerFlowTokenMessage decodeBody(final RemotingBuffer in) throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       return new ConsumerFlowTokenMessage(in.getInt());
    }
 

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/CreateConnectionMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/CreateConnectionMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/CreateConnectionMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -11,10 +11,10 @@
 import org.jboss.messaging.core.remoting.impl.wireformat.CreateConnectionRequest;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
-public class CreateConnectionMessageCodec extends
-      AbstractPacketCodec<CreateConnectionRequest>
+public class CreateConnectionMessageCodec extends  AbstractPacketCodec<CreateConnectionRequest>
 {
    // Constants -----------------------------------------------------
 
@@ -33,9 +33,18 @@
 
    // AbstractPackedCodec overrides----------------------------------
 
+   protected int getBodyLength(final CreateConnectionRequest packet) throws Exception
+   {
+      int bodyLength = INT_LENGTH // version
+            + LONG_LENGTH +
+            + sizeof(packet.getClientVMID())
+            + sizeof(packet.getUsername()) 
+            + sizeof(packet.getPassword());
+      return bodyLength;
+   }
+   
    @Override
-   protected void encodeBody(CreateConnectionRequest request,
-         RemotingBuffer out)
+   protected void encodeBody(final CreateConnectionRequest request, final RemotingBuffer out)
          throws Exception
    {
       int version = request.getVersion();
@@ -44,13 +53,6 @@
       String username = request.getUsername();
       String password = request.getPassword();
 
-      int bodyLength = INT_LENGTH // version
-            + LONG_LENGTH +
-            + sizeof(clientVMID)
-            + sizeof(username) 
-            + sizeof(password);
-
-      out.putInt(bodyLength);
       out.putInt(version);
       out.putLong(remotingSessionID);
       out.putNullableString(clientVMID);
@@ -59,14 +61,8 @@
    }
 
    @Override
-   protected CreateConnectionRequest decodeBody(
-         RemotingBuffer in) throws Exception
+   protected CreateConnectionRequest decodeBody(final RemotingBuffer in) throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
       int version = in.getInt();
       long remotingSessionID = in.getLong();
       String clientVMID = in.getNullableString();

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/CreateConnectionResponseMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/CreateConnectionResponseMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/CreateConnectionResponseMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -11,10 +11,10 @@
 import org.jboss.messaging.core.remoting.impl.wireformat.CreateConnectionResponse;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
-public class CreateConnectionResponseMessageCodec extends
-      AbstractPacketCodec<CreateConnectionResponse>
+public class CreateConnectionResponseMessageCodec extends AbstractPacketCodec<CreateConnectionResponse>
 {
    // Constants -----------------------------------------------------
 
@@ -32,30 +32,23 @@
    }
 
    // AbstractPackedCodec overrides----------------------------------
+   
+   protected int getBodyLength(final CreateConnectionResponse packet) throws Exception
+   {
+   	return LONG_LENGTH;
+   }
 
    @Override
-   protected void encodeBody(CreateConnectionResponse response,
-         RemotingBuffer out)
+   protected void encodeBody(final CreateConnectionResponse response, final RemotingBuffer out)
          throws Exception
    {
-      long id = response.getConnectionTargetID();
-
-      out.putInt(LONG_LENGTH);
-      out.putLong(id);
+      out.putLong(response.getConnectionTargetID());
    }
 
    @Override
-   protected CreateConnectionResponse decodeBody(
-         RemotingBuffer in) throws Exception
+   protected CreateConnectionResponse decodeBody(final RemotingBuffer in) throws Exception
    {
-      int bodyLength = in.getInt();
-      if (bodyLength > in.remaining())
-      {
-         return null;
-      }
-      long id = in.getLong();
-
-      return new CreateConnectionResponse(id);
+      return new CreateConnectionResponse(in.getLong());
    }
 
    // Package protected ---------------------------------------------

Deleted: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/DecoderStatus.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/DecoderStatus.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/DecoderStatus.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -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.impl.codec;
-
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
- * 
- * @version <tt>$Revision$</tt>
- * 
- */
-public enum DecoderStatus
-{
-   OK, NOT_OK, NEED_DATA
-}

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/MessagingExceptionMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/MessagingExceptionMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/MessagingExceptionMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -12,7 +12,8 @@
 import org.jboss.messaging.core.remoting.impl.wireformat.MessagingExceptionMessage;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
 public class MessagingExceptionMessageCodec extends AbstractPacketCodec<MessagingExceptionMessage>
 {
@@ -33,29 +34,21 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final MessagingExceptionMessage packet) throws Exception
+   {
+   	return INT_LENGTH + sizeof(packet.getException().getMessage());
+   }
+   
    @Override
-   protected void encodeBody(MessagingExceptionMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final MessagingExceptionMessage message, final RemotingBuffer out) throws Exception
    {
-      int code = message.getException().getCode();
-      String msg = message.getException().getMessage();
-
-      int bodyLength = INT_LENGTH + sizeof(msg);
-      
-      out.putInt(bodyLength);
-      out.putInt(code);
-      out.putNullableString(msg);
+      out.putInt(message.getException().getCode());
+      out.putNullableString(message.getException().getMessage());
    }
 
    @Override
-   protected MessagingExceptionMessage decodeBody(RemotingBuffer in)
-         throws Exception
+   protected MessagingExceptionMessage decodeBody(final RemotingBuffer in) throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       int code = in.getInt();
       String msg = in.getNullableString();
 

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/PingCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/PingCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/PingCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -11,7 +11,8 @@
 import org.jboss.messaging.core.remoting.impl.wireformat.Ping;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
 public class PingCodec extends AbstractPacketCodec<Ping>
 {
@@ -33,25 +34,22 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final Ping packet) throws Exception
+   {
+   	return LONG_LENGTH;
+   }
+   
    @Override
-   protected void encodeBody(Ping packet, RemotingBuffer out)
-         throws Exception
+   protected void encodeBody(final Ping packet, final RemotingBuffer out) throws Exception
    {
       long clientSessionID = packet.getSessionID();
 
-      out.putInt(LONG_LENGTH);
       out.putLong(clientSessionID);
    }
 
    @Override
-   protected Ping decodeBody(RemotingBuffer in)
-         throws Exception
+   protected Ping decodeBody(final RemotingBuffer in) throws Exception
    {
-      int bodyLength = in.getInt();
-      if (bodyLength > in.remaining())
-      {
-         return null;
-      }
       long clientSessionID = in.getLong();
 
       return new Ping(clientSessionID);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/PongCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/PongCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/PongCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -11,7 +11,8 @@
 import org.jboss.messaging.core.remoting.impl.wireformat.Pong;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
 public class PongCodec extends AbstractPacketCodec<Pong>
 {
@@ -32,28 +33,25 @@
    // Public --------------------------------------------------------
 
    // AbstractPacketCodec overrides ---------------------------------
+   
+   protected int getBodyLength(final Pong packet) throws Exception
+   {
+   	return LONG_LENGTH + BOOLEAN_LENGTH;
+   }
 
    @Override
-   protected void encodeBody(Pong packet, RemotingBuffer out) throws Exception
+   protected void encodeBody(final Pong packet, final RemotingBuffer out) throws Exception
    {
       long sessionID = packet.getSessionID();
       boolean sessionFailed = packet.isSessionFailed();
 
-      int bodyLength = LONG_LENGTH + BOOLEAN_LENGTH;
-
-      out.putInt(bodyLength);
       out.putLong(sessionID);
       out.putBoolean(sessionFailed);
    }
 
    @Override
-   protected Pong decodeBody(RemotingBuffer in) throws Exception
+   protected Pong decodeBody(final RemotingBuffer in) throws Exception
    {
-      int bodyLength = in.getInt();
-      if (bodyLength > in.remaining())
-      {
-         return null;
-      }
       long sessionID = in.getLong();
       boolean sessionFailed = in.getBoolean();
       return new Pong(sessionID, sessionFailed);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ProducerReceiveTokensMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ProducerReceiveTokensMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ProducerReceiveTokensMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -36,23 +36,21 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final ProducerReceiveTokensMessage packet) throws Exception
+   {
+   	return INT_LENGTH;
+   }
+   
    @Override
-   protected void encodeBody(ProducerReceiveTokensMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final ProducerReceiveTokensMessage message, final RemotingBuffer out) throws Exception
    {
-      out.putInt(INT_LENGTH);
       out.putInt(message.getTokens());
    }
 
    @Override
-   protected ProducerReceiveTokensMessage decodeBody(RemotingBuffer in)
+   protected ProducerReceiveTokensMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       return new ProducerReceiveTokensMessage(in.getInt());
    }
 

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ProducerSendMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ProducerSendMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/ProducerSendMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -38,30 +38,32 @@
    // Public --------------------------------------------------------
 
    // AbstractPacketCodec overrides ---------------------------------
+   
+   //TOD remove this in next stage of refactoring
+   private byte[] encodedMsg;
+   
+   protected int getBodyLength(final ProducerSendMessage packet) throws Exception
+   {
+   	encodedMsg = StreamUtils.toBytes(packet.getMessage());   
 
+      int bodyLength = sizeof(packet.getAddress()) + INT_LENGTH + encodedMsg.length;
+      
+      return bodyLength;
+   }
+
    @Override
-   protected void encodeBody(ProducerSendMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final ProducerSendMessage message, final RemotingBuffer out) throws Exception
    {
-      byte[] encodedMsg = StreamUtils.toBytes(message.getMessage());   
-
-      int bodyLength = INT_LENGTH + sizeof(message.getAddress()) + encodedMsg.length;
-
-      out.putInt(bodyLength);
       out.putNullableString(message.getAddress());
       out.putInt(encodedMsg.length);
       out.put(encodedMsg);
+      encodedMsg = null;
    }
 
    @Override
-   protected ProducerSendMessage decodeBody(RemotingBuffer in)
+   protected ProducerSendMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       String address = in.getNullableString();
       int msgLength = in.getInt();
       byte[] encodedMsg = new byte[msgLength];

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/RemotingBuffer.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/RemotingBuffer.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/RemotingBuffer.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -46,5 +46,7 @@
          throws CharacterCodingException;
 
    String getNullableString() throws CharacterCodingException;
+   
+   void rewind();
 
 }

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionAcknowledgeMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionAcknowledgeMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionAcknowledgeMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -7,13 +7,16 @@
 package org.jboss.messaging.core.remoting.impl.codec;
 
 import org.jboss.messaging.core.remoting.impl.wireformat.PacketType;
+import org.jboss.messaging.core.remoting.impl.wireformat.ProducerSendMessage;
 import org.jboss.messaging.core.remoting.impl.wireformat.SessionAcknowledgeMessage;
+import org.jboss.messaging.util.StreamUtils;
 
 /**
  * 
  * A SessionAcknowledgeMessageCodec
  * 
  * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  *
  */
 public class SessionAcknowledgeMessageCodec extends AbstractPacketCodec<SessionAcknowledgeMessage>
@@ -35,26 +38,22 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionAcknowledgeMessage packet) throws Exception
+   {
+      return LONG_LENGTH + 1;
+   }
+   
    @Override
-   protected void encodeBody(SessionAcknowledgeMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionAcknowledgeMessage message, final RemotingBuffer out) throws Exception
    {
-      int bodyLength = LONG_LENGTH + 1;
-
-      out.putInt(bodyLength);
       out.putLong(message.getDeliveryID());
       out.putBoolean(message.isAllUpTo());
    }
 
    @Override
-   protected SessionAcknowledgeMessage decodeBody(RemotingBuffer in)
+   protected SessionAcknowledgeMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-      
       long deliveryID = in.getLong();
       boolean isAllUpTo = in.getBoolean();
      

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionAddDestinationMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionAddDestinationMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionAddDestinationMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -36,31 +36,24 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionAddDestinationMessage packet) throws Exception
+   {
+      return sizeof(packet.getAddress()) + BOOLEAN_LENGTH;
+   }
+   
    @Override
-   protected void encodeBody(SessionAddDestinationMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionAddDestinationMessage message, final RemotingBuffer out) throws Exception
    {
-      String address = message.getAddress();
-     
-      int bodyLength = sizeof(address);
-
-      out.putInt(bodyLength);
-      out.putNullableString(address);
+      out.putNullableString(message.getAddress());
       out.putBoolean(message.isTemporary());
    }
 
    @Override
-   protected SessionAddDestinationMessage decodeBody(RemotingBuffer in)
+   protected SessionAddDestinationMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       String address = in.getNullableString();
-      boolean temp = in.getBoolean();
-    
+      boolean temp = in.getBoolean();    
       return new SessionAddDestinationMessage(address, temp);
    }
 

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBindingQueryMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBindingQueryMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBindingQueryMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -36,27 +36,23 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionBindingQueryMessage packet) throws Exception
+   {
+      return sizeof(packet.getAddress());
+   }
+   
    @Override
-   protected void encodeBody(SessionBindingQueryMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionBindingQueryMessage message, final RemotingBuffer out) throws Exception
    {
       String address = message.getAddress();
      
-      int bodyLength = sizeof(address);
-
-      out.putInt(bodyLength);
       out.putNullableString(address);
    }
 
    @Override
-   protected SessionBindingQueryMessage decodeBody(RemotingBuffer in)
+   protected SessionBindingQueryMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       String address = in.getNullableString();
     
       return new SessionBindingQueryMessage(address);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBindingQueryResponseMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBindingQueryResponseMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBindingQueryResponseMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -39,21 +39,26 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionBindingQueryResponseMessage packet) throws Exception
+   {   	
+      List<String> queueNames = packet.getQueueNames();
 
-   @Override
-   protected void encodeBody(SessionBindingQueryResponseMessage message, RemotingBuffer out) throws Exception
-   {
-      boolean exists = message.isExists();
-      List<String> queueNames = message.getQueueNames();
-
-      int bodyLength = 1 + INT_LENGTH;
+      int bodyLength = BOOLEAN_LENGTH + INT_LENGTH;
       
       for (String queueName: queueNames)
       {
          bodyLength += sizeof(queueName);
       }
       
-      out.putInt(bodyLength);
+      return bodyLength;
+   }
+
+   @Override
+   protected void encodeBody(final SessionBindingQueryResponseMessage message, final RemotingBuffer out) throws Exception
+   {
+      boolean exists = message.isExists();
+      List<String> queueNames = message.getQueueNames();
+
       out.putBoolean(exists);
       out.putInt(queueNames.size());
       
@@ -64,15 +69,9 @@
    }
 
    @Override
-   protected SessionBindingQueryResponseMessage decodeBody(RemotingBuffer in)
+   protected SessionBindingQueryResponseMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       boolean exists = in.getBoolean();
       
       int numQueues = in.getInt();

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBrowserHasNextMessageResponseMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBrowserHasNextMessageResponseMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBrowserHasNextMessageResponseMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -11,7 +11,8 @@
 import org.jboss.messaging.core.remoting.impl.wireformat.SessionBrowserHasNextMessageResponseMessage;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
 public class SessionBrowserHasNextMessageResponseMessageCodec extends
       AbstractPacketCodec<SessionBrowserHasNextMessageResponseMessage>
@@ -33,23 +34,21 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionBrowserHasNextMessageResponseMessage packet) throws Exception
+   {   	
+      return BOOLEAN_LENGTH;
+   }
+   
    @Override
-   protected void encodeBody(SessionBrowserHasNextMessageResponseMessage response,
-         RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionBrowserHasNextMessageResponseMessage response,
+         final RemotingBuffer out) throws Exception
    {
-      out.putInt(1); //body length
       out.putBoolean(response.hasNext());
    }
 
    @Override
-   protected SessionBrowserHasNextMessageResponseMessage decodeBody(RemotingBuffer in) throws Exception
+   protected SessionBrowserHasNextMessageResponseMessage decodeBody(final RemotingBuffer in) throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       boolean hasNext = in.getBoolean();
 
       return new SessionBrowserHasNextMessageResponseMessage(hasNext);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBrowserNextMessageBlockMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBrowserNextMessageBlockMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBrowserNextMessageBlockMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -11,7 +11,8 @@
 import org.jboss.messaging.core.remoting.impl.wireformat.SessionBrowserNextMessageBlockMessage;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
 public class SessionBrowserNextMessageBlockMessageCodec extends AbstractPacketCodec<SessionBrowserNextMessageBlockMessage>
 {
@@ -32,23 +33,21 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionBrowserNextMessageBlockMessage packet) throws Exception
+   {   	
+      return LONG_LENGTH;
+   }
+   
    @Override
-   protected void encodeBody(SessionBrowserNextMessageBlockMessage request, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionBrowserNextMessageBlockMessage request, final RemotingBuffer out) throws Exception
    {
-      out.putInt(LONG_LENGTH);
       out.putLong(request.getMaxMessages());
    }
 
    @Override
-   protected SessionBrowserNextMessageBlockMessage decodeBody(RemotingBuffer in)
+   protected SessionBrowserNextMessageBlockMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       long maxMessages = in.getLong();
       
       return new SessionBrowserNextMessageBlockMessage(maxMessages);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBrowserNextMessageBlockResponseMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBrowserNextMessageBlockResponseMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBrowserNextMessageBlockResponseMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -18,7 +18,8 @@
 import org.jboss.messaging.core.remoting.impl.wireformat.SessionBrowserNextMessageBlockResponseMessage;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
 public class SessionBrowserNextMessageBlockResponseMessageCodec extends AbstractPacketCodec<SessionBrowserNextMessageBlockResponseMessage>
 {
@@ -28,11 +29,13 @@
 
    // Static --------------------------------------------------------
 
-   public static byte[] encode(Message[] messages) throws Exception
+   public static byte[] encode(final Message[] messages) throws Exception
    {
       ByteArrayOutputStream baos = new ByteArrayOutputStream();
       DataOutputStream daos = new DataOutputStream(baos);
       
+      daos.writeInt(messages.length);
+      
       for (int i = 0; i < messages.length; i++)
       {
          Message message = messages[i];
@@ -52,36 +55,36 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   //TODO remove this in next refactoring
+   private byte[] encodedMsgs;
+   
+   protected int getBodyLength(final SessionBrowserNextMessageBlockResponseMessage packet) throws Exception
+   {   	
+   	Message[] messages = packet.getMessages();
+      
+      encodedMsgs = encode(messages);
+
+      int bodyLength = INT_LENGTH + encodedMsgs.length;
+      
+      return bodyLength;
+   }
+   
    @Override
    protected void encodeBody(SessionBrowserNextMessageBlockResponseMessage response, RemotingBuffer out) throws Exception
    {
-      Message[] messages = response.getMessages();
-      
-      byte[] encodedMessages = encode(messages);
-
-      int bodyLength = INT_LENGTH + INT_LENGTH + encodedMessages.length;
-
-      out.putInt(bodyLength);
-      out.putInt(messages.length);
-      out.putInt(encodedMessages.length);
-      out.put(encodedMessages);
+      out.putInt(encodedMsgs.length);
+      out.put(encodedMsgs);
+      encodedMsgs = null;
    }
 
    @Override
-   protected SessionBrowserNextMessageBlockResponseMessage decodeBody(RemotingBuffer in)
+   protected SessionBrowserNextMessageBlockResponseMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
-      int numOfMessages = in.getInt();
       int encodedMessagesLength = in.getInt();
       byte[] encodedMessages = new byte[encodedMessagesLength];
       in.get(encodedMessages);
-      Message[] messages = decode(numOfMessages, encodedMessages);
+      Message[] messages = decode(encodedMessages);
 
       return new SessionBrowserNextMessageBlockResponseMessage(messages);
    }
@@ -92,12 +95,15 @@
 
    // Private ----------------------------------------------------
 
-   private Message[] decode(int numOfMessages, byte[] encodedMessages) throws Exception
+   private Message[] decode(final byte[] encodedMessages) throws Exception
    {
-      Message[] messages = new Message[numOfMessages];
+      
       ByteArrayInputStream bais = new ByteArrayInputStream(encodedMessages);
       DataInputStream dais = new DataInputStream(bais);
       
+      int numOfMessages = dais.readInt();
+      Message[] messages = new Message[numOfMessages];
+      
       for (int i = 0; i < messages.length; i++)
       {
          Message message = new MessageImpl();

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBrowserNextMessageResponseMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBrowserNextMessageResponseMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionBrowserNextMessageResponseMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -14,7 +14,8 @@
 import org.jboss.messaging.util.StreamUtils;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
 public class SessionBrowserNextMessageResponseMessageCodec extends AbstractPacketCodec<SessionBrowserNextMessageResponseMessage>
 {
@@ -35,28 +36,30 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
-   @Override
-   protected void encodeBody(SessionBrowserNextMessageResponseMessage response, RemotingBuffer out) throws Exception
-   {      
-      byte[] encodedMsg = StreamUtils.toBytes(response.getMessage());
+   //TODO remove this in next refactoring
+   private byte[] encodedMsg;
+   
+   protected int getBodyLength(final SessionBrowserNextMessageResponseMessage packet) throws Exception
+   {   	
+   	byte[] encodedMsg = StreamUtils.toBytes(packet.getMessage());
 
       int bodyLength = INT_LENGTH + encodedMsg.length;
-
-      out.putInt(bodyLength);      
+      
+      return bodyLength;
+   }
+   
+   @Override
+   protected void encodeBody(final SessionBrowserNextMessageResponseMessage response, final RemotingBuffer out) throws Exception
+   {         
       out.putInt(encodedMsg.length);
       out.put(encodedMsg);
+      encodedMsg = null;
    }
 
    @Override
-   protected SessionBrowserNextMessageResponseMessage decodeBody(RemotingBuffer in)
+   protected SessionBrowserNextMessageResponseMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       int msgLength = in.getInt();
       byte[] encodedMsg = new byte[msgLength];
       in.get(encodedMsg);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCancelMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCancelMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCancelMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -35,26 +35,22 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionCancelMessage packet) throws Exception
+   {   	
+      return LONG_LENGTH + 1;
+   }
+   
    @Override
-   protected void encodeBody(SessionCancelMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionCancelMessage message, final RemotingBuffer out) throws Exception
    {
-      int bodyLength = LONG_LENGTH + 1;
-
-      out.putInt(bodyLength);
       out.putLong(message.getDeliveryID());
       out.putBoolean(message.isExpired());
    }
 
    @Override
-   protected SessionCancelMessage decodeBody(RemotingBuffer in)
+   protected SessionCancelMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-      
       long deliveryID = in.getLong();
       boolean expired = in.getBoolean();
      

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateBrowserMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateBrowserMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateBrowserMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -11,7 +11,8 @@
 import org.jboss.messaging.core.remoting.impl.wireformat.SessionCreateBrowserMessage;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
 public class SessionCreateBrowserMessageCodec extends
       AbstractPacketCodec<SessionCreateBrowserMessage>
@@ -33,29 +34,30 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionCreateBrowserMessage packet) throws Exception
+   {   	
+   	String queueName = packet.getQueueName();
+      String filterString = packet.getFilterString();
+
+      int bodyLength = sizeof(queueName) + sizeof(filterString);
+      
+      return bodyLength;
+   }
+   
    @Override
-   protected void encodeBody(SessionCreateBrowserMessage request, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionCreateBrowserMessage request, final RemotingBuffer out) throws Exception
    {
       String queueName = request.getQueueName();
       String filterString = request.getFilterString();
 
-      int bodyLength = sizeof(queueName) + sizeof(filterString);
-
-      out.putInt(bodyLength);
       out.putNullableString(queueName);
       out.putNullableString(filterString);
    }
 
    @Override
-   protected SessionCreateBrowserMessage decodeBody(RemotingBuffer in)
+   protected SessionCreateBrowserMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       String queueName = in.getNullableString();
       String filterString = in.getNullableString();
 

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateBrowserResponseMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateBrowserResponseMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateBrowserResponseMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -11,7 +11,8 @@
 import org.jboss.messaging.core.remoting.impl.wireformat.SessionCreateBrowserResponseMessage;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
 public class SessionCreateBrowserResponseMessageCodec extends
       AbstractPacketCodec<SessionCreateBrowserResponseMessage>
@@ -33,26 +34,24 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionCreateBrowserResponseMessage packet) throws Exception
+   {   	
+      return LONG_LENGTH;
+   }
+   
    @Override
-   protected void encodeBody(SessionCreateBrowserResponseMessage response,
-         RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionCreateBrowserResponseMessage response,
+         final RemotingBuffer out) throws Exception
    {
       long browserID = response.getBrowserTargetID();
 
-      out.putInt(LONG_LENGTH);
       out.putLong(browserID);
    }
 
    @Override
-   protected SessionCreateBrowserResponseMessage decodeBody(RemotingBuffer in)
+   protected SessionCreateBrowserResponseMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       long browserID = in.getLong();
 
       return new SessionCreateBrowserResponseMessage(browserID);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateConsumerMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateConsumerMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateConsumerMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -11,7 +11,8 @@
 import org.jboss.messaging.core.remoting.impl.wireformat.SessionCreateConsumerMessage;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
 public class SessionCreateConsumerMessageCodec extends
       AbstractPacketCodec<SessionCreateConsumerMessage>
@@ -33,8 +34,16 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionCreateConsumerMessage packet) throws Exception
+   {   	
+   	int bodyLength = sizeof(packet.getQueueName()) +
+   	   sizeof(packet.getFilterString()) + 2 * BOOLEAN_LENGTH + 2 * INT_LENGTH;
+   	
+   	return bodyLength;
+   }
+   
    @Override
-   protected void encodeBody(SessionCreateConsumerMessage request, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionCreateConsumerMessage request, final RemotingBuffer out) throws Exception
    {
       String queueName = request.getQueueName();
       String filterString = request.getFilterString();
@@ -43,9 +52,6 @@
       int windowSize = request.getWindowSize();
       int maxRate = request.getMaxRate();
 
-      int bodyLength = sizeof(queueName) + sizeof(filterString) + 2 + 2 * INT_LENGTH;
-
-      out.putInt(bodyLength);
       out.putNullableString(queueName);
       out.putNullableString(filterString);
       out.putBoolean(noLocal);
@@ -55,15 +61,9 @@
    }
 
    @Override
-   protected SessionCreateConsumerMessage decodeBody(RemotingBuffer in)
+   protected SessionCreateConsumerMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       String queueName = in.getNullableString();
       String filterString = in.getNullableString();
       boolean noLocal = in.getBoolean();

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateConsumerResponseMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateConsumerResponseMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateConsumerResponseMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -11,7 +11,8 @@
 import org.jboss.messaging.core.remoting.impl.wireformat.SessionCreateConsumerResponseMessage;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
 public class SessionCreateConsumerResponseMessageCodec extends
       AbstractPacketCodec<SessionCreateConsumerResponseMessage>
@@ -33,31 +34,27 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionCreateConsumerResponseMessage packet) throws Exception
+   {   	
+   	return LONG_LENGTH + INT_LENGTH;
+   }
+   
    @Override
-   protected void encodeBody(SessionCreateConsumerResponseMessage response,
-         RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionCreateConsumerResponseMessage response,
+         final RemotingBuffer out) throws Exception
    {
       long consumerID = response.getConsumerTargetID();
       
       int windowSize = response.getWindowSize();
 
-      int bodyLength = LONG_LENGTH + INT_LENGTH;
-       
-      out.putInt(bodyLength);
       out.putLong(consumerID);
       out.putInt(windowSize);
    }
 
    @Override
-   protected SessionCreateConsumerResponseMessage decodeBody(RemotingBuffer in)
+   protected SessionCreateConsumerResponseMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       long consumerID = in.getLong();
       int windowSize = in.getInt();
 

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateProducerMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateProducerMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateProducerMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -37,29 +37,29 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionCreateProducerMessage packet) throws Exception
+   {   	
+   	String address = packet.getAddress();
+      
+      int bodyLength = sizeof(address) + 2 * INT_LENGTH;
+      
+      return bodyLength;
+   }
+   
    @Override
-   protected void encodeBody(SessionCreateProducerMessage request, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionCreateProducerMessage request, final RemotingBuffer out) throws Exception
    {
       String address = request.getAddress();
      
-      int bodyLength = sizeof(address) + 2 * INT_LENGTH;
-
-      out.putInt(bodyLength);
       out.putNullableString(address);
       out.putInt(request.getWindowSize());
       out.putInt(request.getMaxRate());
    }
 
    @Override
-   protected SessionCreateProducerMessage decodeBody(RemotingBuffer in)
+   protected SessionCreateProducerMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       String address = in.getNullableString();
       
       int windowSize = in.getInt();

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateProducerResponseMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateProducerResponseMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateProducerResponseMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -37,30 +37,26 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionCreateProducerResponseMessage packet) throws Exception
+   {   	
+      return LONG_LENGTH + 2 * INT_LENGTH;
+   }
+   
    @Override
-   protected void encodeBody(SessionCreateProducerResponseMessage response,
-                             RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionCreateProducerResponseMessage response,
+                             final RemotingBuffer out) throws Exception
    {
       long producerID = response.getProducerTargetID();
 
-      int bodyLength = LONG_LENGTH + 2 * INT_LENGTH;
-       
-      out.putInt(bodyLength);
       out.putLong(producerID);
       out.putInt(response.getWindowSize());
       out.putInt(response.getMaxRate());
    }
 
    @Override
-   protected SessionCreateProducerResponseMessage decodeBody(RemotingBuffer in)
+   protected SessionCreateProducerResponseMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       long producerID = in.getLong();
       int windowSize = in.getInt();
       int maxRate = in.getInt();

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateQueueMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateQueueMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionCreateQueueMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -36,8 +36,17 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionCreateQueueMessage packet) throws Exception
+   {   	
+   	String address = packet.getAddress();
+      String queueName = packet.getQueueName();
+      String filterString = packet.getFilterString();
+   	int bodyLength = sizeof(address) + sizeof(queueName) + sizeof(filterString) + 2;
+   	return bodyLength;
+   }
+   
    @Override
-   protected void encodeBody(SessionCreateQueueMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionCreateQueueMessage message, final RemotingBuffer out) throws Exception
    {
       String address = message.getAddress();
       String queueName = message.getQueueName();
@@ -45,9 +54,6 @@
       boolean durable = message.isDurable();
       boolean temporary = message.isTemporary();
      
-      int bodyLength = sizeof(address) + sizeof(queueName) + sizeof(filterString) + 2;
-
-      out.putInt(bodyLength);
       out.putNullableString(address);
       out.putNullableString(queueName);
       out.putNullableString(filterString);
@@ -56,15 +62,9 @@
    }
 
    @Override
-   protected SessionCreateQueueMessage decodeBody(RemotingBuffer in)
+   protected SessionCreateQueueMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       String address = in.getNullableString();
       String queueName = in.getNullableString();
       String filterString = in.getNullableString();

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionDeleteQueueMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionDeleteQueueMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionDeleteQueueMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -36,27 +36,24 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionDeleteQueueMessage packet) throws Exception
+   {   	
+   	String queueName = packet.getQueueName();      
+      int bodyLength = sizeof(queueName);
+   	return bodyLength;
+   }
+   
    @Override
-   protected void encodeBody(SessionDeleteQueueMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionDeleteQueueMessage message, final RemotingBuffer out) throws Exception
    {
-      String queueName = message.getQueueName();
-     
-      int bodyLength = sizeof(queueName);
-
-      out.putInt(bodyLength);
+      String queueName = message.getQueueName();   
       out.putNullableString(queueName);
    }
 
    @Override
-   protected SessionDeleteQueueMessage decodeBody(RemotingBuffer in)
+   protected SessionDeleteQueueMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       String queueName = in.getNullableString();
     
       return new SessionDeleteQueueMessage(queueName);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionQueueQueryMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionQueueQueryMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionQueueQueryMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -36,29 +36,25 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionQueueQueryMessage packet) throws Exception
+   {   	
+   	String queueName = packet.getQueueName();       
+      int bodyLength = sizeof(queueName);
+   	return bodyLength;
+   }
+   
    @Override
-   protected void encodeBody(SessionQueueQueryMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionQueueQueryMessage message, final RemotingBuffer out) throws Exception
    {
       String queueName = message.getQueueName();
-     
-      int bodyLength = sizeof(queueName);
-
-      out.putInt(bodyLength);
       out.putNullableString(queueName);
    }
 
    @Override
-   protected SessionQueueQueryMessage decodeBody(RemotingBuffer in)
+   protected SessionQueueQueryMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
-      String queueName = in.getNullableString();
-    
+      String queueName = in.getNullableString();    
       return new SessionQueueQueryMessage(queueName);
    }
 

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionQueueQueryResponseMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionQueueQueryResponseMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionQueueQueryResponseMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -36,8 +36,16 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionQueueQueryResponseMessage packet) throws Exception
+   {   	
+   	String filterString  = packet.getFilterString();
+      String address = packet.getAddress();
+   	int bodyLength = 3 * BOOLEAN_LENGTH + 3 * INT_LENGTH + sizeof(filterString) + sizeof(address);
+   	return bodyLength;
+   }
+   
    @Override
-   protected void encodeBody(SessionQueueQueryResponseMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionQueueQueryResponseMessage message, final RemotingBuffer out) throws Exception
    {
       boolean exists = message.isExists();
       boolean durable = message.isDurable();
@@ -48,9 +56,6 @@
       String filterString  = message.getFilterString();
       String address = message.getAddress();
      
-      int bodyLength = 1 + 1 + 1 + INT_LENGTH + INT_LENGTH + INT_LENGTH + sizeof(filterString) + sizeof(address);
-
-      out.putInt(bodyLength);
       out.putBoolean(exists);
       out.putBoolean(durable);
       out.putBoolean(temporary);
@@ -62,15 +67,9 @@
    }
 
    @Override
-   protected SessionQueueQueryResponseMessage decodeBody(RemotingBuffer in)
+   protected SessionQueueQueryResponseMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       boolean exists = in.getBoolean();
       boolean durable = in.getBoolean();
       boolean temporary = in.getBoolean();

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionRemoveDestinationMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionRemoveDestinationMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionRemoveDestinationMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -36,28 +36,26 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionRemoveDestinationMessage packet) throws Exception
+   {   	
+   	String address = packet.getAddress();      
+      int bodyLength = sizeof(address) + BOOLEAN_LENGTH;
+   	return bodyLength;
+   }
+   
    @Override
-   protected void encodeBody(SessionRemoveDestinationMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionRemoveDestinationMessage message, final RemotingBuffer out) throws Exception
    {
       String address = message.getAddress();
      
-      int bodyLength = sizeof(address);
-
-      out.putInt(bodyLength);
       out.putNullableString(address);
       out.putBoolean(message.isTemporary());
    }
 
    @Override
-   protected SessionRemoveDestinationMessage decodeBody(RemotingBuffer in)
+   protected SessionRemoveDestinationMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-
       String address = in.getNullableString();
     
       return new SessionRemoveDestinationMessage(address, in.getBoolean());

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXACommitMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXACommitMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXACommitMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -37,31 +37,23 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionXACommitMessage packet) throws Exception
+   {   	
+   	int bodyLength = BOOLEAN_LENGTH + getXidLength(packet.getXid());
+   	return bodyLength;
+   }
+   
    @Override
-   protected void encodeBody(SessionXACommitMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionXACommitMessage message, final RemotingBuffer out) throws Exception
    {      
-      Xid xid = message.getXid();
-      
-      int bodyLength = 1 + getXidLength(xid);
-      
-      out.putInt(bodyLength);
-      
-      out.putBoolean(message.isOnePhase());
-      
-      encodeXid(xid, out);      
+      out.putBoolean(message.isOnePhase());      
+      encodeXid(message.getXid(), out);      
    }
 
    @Override
-   protected SessionXACommitMessage decodeBody(RemotingBuffer in)
+   protected SessionXACommitMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-      
       boolean onePhase = in.getBoolean();
             
       Xid xid = decodeXid(in);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAEndMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAEndMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAEndMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -37,31 +37,25 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionXAEndMessage packet) throws Exception
+   {   	
+   	int bodyLength = BOOLEAN_LENGTH + getXidLength(packet.getXid());
+   	return bodyLength;
+   }
+   
    @Override
-   protected void encodeBody(SessionXAEndMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionXAEndMessage message, final RemotingBuffer out) throws Exception
    {      
       Xid xid = message.getXid();      
       
-      int bodyLength = 1 + getXidLength(xid);
-      
-      out.putInt(bodyLength);
-      
       out.putBoolean(message.isFailed());
       
       encodeXid(xid, out);            
    }
 
    @Override
-   protected SessionXAEndMessage decodeBody(RemotingBuffer in)
-         throws Exception
+   protected SessionXAEndMessage decodeBody(final RemotingBuffer in) throws Exception
    {
-      int bodyLength = in.getInt();
-      
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-      
       boolean failed = in.getBoolean();
                   
       Xid xid = decodeXid(in);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAForgetMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAForgetMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAForgetMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -37,29 +37,24 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionXAForgetMessage packet) throws Exception
+   {   	
+   	int bodyLength = getXidLength(packet.getXid());
+   	return bodyLength;
+   }
+   
    @Override
-   protected void encodeBody(SessionXAForgetMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionXAForgetMessage message, final RemotingBuffer out) throws Exception
    {      
       Xid xid = message.getXid();
       
-      int bodyLength = getXidLength(xid);
-      
-      out.putInt(bodyLength);
-      
       encodeXid(xid, out);
    }
 
    @Override
-   protected SessionXAForgetMessage decodeBody(RemotingBuffer in)
+   protected SessionXAForgetMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-      
       Xid xid = decodeXid(in);
       
       return new SessionXAForgetMessage(xid);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAGetInDoubtXidsResponseMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAGetInDoubtXidsResponseMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAGetInDoubtXidsResponseMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -41,38 +41,32 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
-   @Override
-   protected void encodeBody(SessionXAGetInDoubtXidsResponseMessage message, RemotingBuffer out) throws Exception
-   {      
-      int bodyLength = 1;
+   protected int getBodyLength(final SessionXAGetInDoubtXidsResponseMessage packet) throws Exception
+   {   	
+      int bodyLength = INT_LENGTH;
       
-      for (Xid xid: message.getXids())
+      for (Xid xid: packet.getXids())
       {
          bodyLength += getXidLength(xid);
       }
-       
-      out.putInt(bodyLength);
-      
+   	return bodyLength;
+   }
+   
+   @Override
+   protected void encodeBody(final SessionXAGetInDoubtXidsResponseMessage message, final RemotingBuffer out) throws Exception
+   {      
       out.putInt(message.getXids().size());
       
       for (Xid xid: message.getXids())
       {
         encodeXid(xid, out);
-      }
-      
+      }      
    }
 
    @Override
-   protected SessionXAGetInDoubtXidsResponseMessage decodeBody(RemotingBuffer in)
+   protected SessionXAGetInDoubtXidsResponseMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-      
       int size = in.getInt();
       
       List<Xid> xids = new ArrayList<Xid>(size);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAGetTimeoutResponseMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAGetTimeoutResponseMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAGetTimeoutResponseMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -36,27 +36,21 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionXAGetTimeoutResponseMessage packet) throws Exception
+   {   	
+   	return INT_LENGTH;
+   }
+   
    @Override
-   protected void encodeBody(SessionXAGetTimeoutResponseMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionXAGetTimeoutResponseMessage message, final RemotingBuffer out) throws Exception
    {      
-      int bodyLength = INT_LENGTH;
-      
-      out.putInt(bodyLength);
-      
       out.putInt(message.getTimeoutSeconds());
    }
 
    @Override
-   protected SessionXAGetTimeoutResponseMessage decodeBody(RemotingBuffer in)
+   protected SessionXAGetTimeoutResponseMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-      
       int timeout = in.getInt();
       
       return new SessionXAGetTimeoutResponseMessage(timeout);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAJoinMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAJoinMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAJoinMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -37,29 +37,27 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionXAJoinMessage packet) throws Exception
+   {   	
+   	Xid xid = packet.getXid();
+      
+      int bodyLength = getXidLength(xid);
+      
+      return bodyLength;
+   }
+   
    @Override
-   protected void encodeBody(SessionXAJoinMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionXAJoinMessage message, final RemotingBuffer out) throws Exception
    {      
       Xid xid = message.getXid();
       
-      int bodyLength = getXidLength(xid);
-      
-      out.putInt(bodyLength);
-      
       encodeXid(xid, out);
    }
 
    @Override
-   protected SessionXAJoinMessage decodeBody(RemotingBuffer in)
+   protected SessionXAJoinMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-      
       Xid xid = decodeXid(in);
       
       return new SessionXAJoinMessage(xid);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAPrepareMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAPrepareMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAPrepareMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -37,29 +37,27 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionXAPrepareMessage packet) throws Exception
+   {   	
+   	Xid xid = packet.getXid();
+      
+      int bodyLength = getXidLength(xid);
+      
+      return bodyLength;
+   }
+   
    @Override
-   protected void encodeBody(SessionXAPrepareMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionXAPrepareMessage message, final RemotingBuffer out) throws Exception
    {      
       Xid xid = message.getXid();
       
-      int bodyLength = getXidLength(xid);
-      
-      out.putInt(bodyLength);
-      
       encodeXid(xid, out);
    }
 
    @Override
-   protected SessionXAPrepareMessage decodeBody(RemotingBuffer in)
+   protected SessionXAPrepareMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-      
       Xid xid = decodeXid(in);
       
       return new SessionXAPrepareMessage(xid);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAResponseMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAResponseMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAResponseMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -36,13 +36,16 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionXAResponseMessage packet) throws Exception
+   {   	
+   	int bodyLength = BOOLEAN_LENGTH + INT_LENGTH + sizeof(packet.getMessage());
+   	
+   	return bodyLength;
+   }
+   
    @Override
-   protected void encodeBody(SessionXAResponseMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionXAResponseMessage message, final RemotingBuffer out) throws Exception
    {      
-      int bodyLength = 1 + INT_LENGTH + sizeof(message.getMessage());
-      
-      out.putInt(bodyLength);
-      
       out.putBoolean(message.isError());
       
       out.putInt(message.getResponseCode());
@@ -51,16 +54,9 @@
    }
 
    @Override
-   protected SessionXAResponseMessage decodeBody(RemotingBuffer in)
+   protected SessionXAResponseMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-      
       boolean isError = in.getBoolean();
       
       int responseCode = in.getInt();

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAResumeMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAResumeMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAResumeMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -37,29 +37,27 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionXAResumeMessage packet) throws Exception
+   {   	
+   	Xid xid = packet.getXid();
+      
+      int bodyLength = getXidLength(xid);
+      
+      return bodyLength;
+   }
+   
    @Override
-   protected void encodeBody(SessionXAResumeMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionXAResumeMessage message, final RemotingBuffer out) throws Exception
    {      
       Xid xid = message.getXid();
       
-      int bodyLength = getXidLength(xid);
-      
-      out.putInt(bodyLength);
-      
       encodeXid(xid, out);
    }
 
    @Override
-   protected SessionXAResumeMessage decodeBody(RemotingBuffer in)
+   protected SessionXAResumeMessage decodeBody(final RemotingBuffer in)
          throws Exception
-   {
-      int bodyLength = in.getInt();
-      
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-      
+   {           
       Xid xid = decodeXid(in);
       
       return new SessionXAResumeMessage(xid);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXARollbackMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXARollbackMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXARollbackMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -30,29 +30,27 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionXARollbackMessage packet) throws Exception
+   {   	
+   	Xid xid = packet.getXid();
+      
+      int bodyLength = getXidLength(xid);
+      
+      return bodyLength;
+   }
+   
    @Override
-   protected void encodeBody(SessionXARollbackMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionXARollbackMessage message, final RemotingBuffer out) throws Exception
    {      
       Xid xid = message.getXid();
       
-      int bodyLength = getXidLength(xid);
-      
-      out.putInt(bodyLength);
-      
       encodeXid(xid, out);
    }
 
    @Override
-   protected SessionXARollbackMessage decodeBody(RemotingBuffer in)
+   protected SessionXARollbackMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-      
       Xid xid = decodeXid(in);
       
       return new SessionXARollbackMessage(xid);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXASetTimeoutMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXASetTimeoutMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXASetTimeoutMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -35,27 +35,21 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionXASetTimeoutMessage packet) throws Exception
+   {   	
+      return INT_LENGTH;
+   }
+   
    @Override
-   protected void encodeBody(SessionXASetTimeoutMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionXASetTimeoutMessage message, final RemotingBuffer out) throws Exception
    {                 
-      int bodyLength = INT_LENGTH;
-      
-      out.putInt(bodyLength);
-      
       out.putInt(message.getTimeoutSeconds());
    }
 
    @Override
-   protected SessionXASetTimeoutMessage decodeBody(RemotingBuffer in)
+   protected SessionXASetTimeoutMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-      
       int timeout = in.getInt();
       
       return new SessionXASetTimeoutMessage(timeout);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXASetTimeoutResponseMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXASetTimeoutResponseMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXASetTimeoutResponseMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -35,27 +35,21 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionXASetTimeoutResponseMessage packet) throws Exception
+   {   	
+      return BOOLEAN_LENGTH;
+   }
+   
    @Override
-   protected void encodeBody(SessionXASetTimeoutResponseMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionXASetTimeoutResponseMessage message, final RemotingBuffer out) throws Exception
    {                 
-      int bodyLength = 1;
-      
-      out.putInt(bodyLength);
-      
       out.putBoolean(message.isOK());
    }
 
    @Override
-   protected SessionXASetTimeoutResponseMessage decodeBody(RemotingBuffer in)
+   protected SessionXASetTimeoutResponseMessage decodeBody(final RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-      
       boolean ok = in.getBoolean();
       
       return new SessionXASetTimeoutResponseMessage(ok);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAStartMessageCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAStartMessageCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/SessionXAStartMessageCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -37,29 +37,27 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final SessionXAStartMessage packet) throws Exception
+   {   	
+   	Xid xid = packet.getXid();
+      
+      int bodyLength = getXidLength(xid);
+      
+      return bodyLength;
+   }
+   
    @Override
-   protected void encodeBody(SessionXAStartMessage message, RemotingBuffer out) throws Exception
+   protected void encodeBody(final SessionXAStartMessage message, final RemotingBuffer out) throws Exception
    {      
       Xid xid = message.getXid();      
       
-      int bodyLength = getXidLength(xid);
-      
-      out.putInt(bodyLength);
-      
       encodeXid(xid, out);
    }
 
    @Override
-   protected SessionXAStartMessage decodeBody(RemotingBuffer in)
+   protected SessionXAStartMessage decodeBody(final RemotingBuffer in)
          throws Exception
-   {
-      int bodyLength = in.getInt();
-      
-      if (in.remaining() < bodyLength)
-      {
-         return null;
-      }
-            
+   { 
       Xid xid = decodeXid(in);
       
       return new SessionXAStartMessage(xid);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/TextPacketCodec.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/TextPacketCodec.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/codec/TextPacketCodec.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -11,7 +11,8 @@
 import org.jboss.messaging.core.remoting.impl.wireformat.TextPacket;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
 public class TextPacketCodec extends AbstractPacketCodec<TextPacket>
 {
@@ -33,13 +34,16 @@
 
    // AbstractPacketCodec overrides ---------------------------------
 
+   protected int getBodyLength(final TextPacket packet) throws Exception
+   {   	
+      return sizeof(packet.getText());
+   }
+   
    @Override
    protected void encodeBody(TextPacket packet, RemotingBuffer out)
          throws Exception
    {
       String text = packet.getText();
-
-      out.putInt(sizeof(text));
       out.putNullableString(text);
    }
 
@@ -47,11 +51,6 @@
    protected TextPacket decodeBody(RemotingBuffer in)
          throws Exception
    {
-      int bodyLength = in.getInt();
-      if (bodyLength > in.remaining())
-      {
-         return null;
-      }
       String text = in.getNullableString();
 
       return new TextPacket(text);

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/BufferWrapper.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/BufferWrapper.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/BufferWrapper.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -154,6 +154,11 @@
       }
    }
    
+   public void rewind()
+   {
+   	buffer.rewind();
+   }
+   
    // Package protected ---------------------------------------------
 
    // Protected -----------------------------------------------------

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-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FilterChainSupport.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -29,6 +29,7 @@
 
 /**
  * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  * 
  * @version <tt>$Revision$</tt>
  * 
@@ -47,16 +48,16 @@
 
    // Public --------------------------------------------------------
 
-   public static void addCodecFilter(DefaultIoFilterChainBuilder filterChain)
+   public static void addCodecFilter(final DefaultIoFilterChainBuilder filterChain)
    {
       assert filterChain != null;
 
-      filterChain.addLast("codec", new ProtocolCodecFilter(
-            new PacketCodecFactory()));
+      filterChain.addLast("codec", new ProtocolCodecFilter(new PacketCodecFactory()));
    }
    
-   public static void addKeepAliveFilter(DefaultIoFilterChainBuilder filterChain,
-         KeepAliveFactory factory, int keepAliveInterval, int keepAliveTimeout, FailureNotifier notifier)
+   public static void addKeepAliveFilter(final DefaultIoFilterChainBuilder filterChain,
+         final KeepAliveFactory factory, final int keepAliveInterval,
+         final int keepAliveTimeout, final FailureNotifier notifier)
    {
       assert filterChain != null;
       assert factory != null;
@@ -75,8 +76,9 @@
    }
 
    public static void addSSLFilter(
-         DefaultIoFilterChainBuilder filterChain, boolean client,
-         String keystorePath, String keystorePassword, String trustStorePath, String trustStorePassword) throws Exception
+         final DefaultIoFilterChainBuilder filterChain, final boolean client,
+         final String keystorePath, final String keystorePassword, final String trustStorePath,
+         final String trustStorePassword) throws Exception
    {
       SSLContext context = SSLSupport.getInstance(client, keystorePath, keystorePassword,
             trustStorePath, trustStorePassword);
@@ -93,7 +95,7 @@
    
    // Package protected ---------------------------------------------
 
-   static void addMDCFilter(DefaultIoFilterChainBuilder filterChain)
+   static void addMDCFilter(final DefaultIoFilterChainBuilder filterChain)
    {
       assert filterChain != null;
 
@@ -101,7 +103,7 @@
       filterChain.addLast("mdc", mdcInjectionFilter);
    }
 
-   static void addLoggingFilter(DefaultIoFilterChainBuilder filterChain)
+   static void addLoggingFilter(final DefaultIoFilterChainBuilder filterChain)
    {
       assert filterChain != null;
 
@@ -121,7 +123,7 @@
    }
 
    static ScheduledExecutorService addBlockingRequestResponseFilter(
-         DefaultIoFilterChainBuilder filterChain)
+         final DefaultIoFilterChainBuilder filterChain)
    {
       assert filterChain != null;
 

Deleted: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaDecoder.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaDecoder.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaDecoder.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -1,109 +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;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.mina.common.IoBuffer;
-import org.apache.mina.common.IoSession;
-import org.apache.mina.filter.codec.ProtocolDecoderOutput;
-import org.apache.mina.filter.codec.demux.MessageDecoder;
-import org.apache.mina.filter.codec.demux.MessageDecoderResult;
-import org.jboss.messaging.core.remoting.Packet;
-import org.jboss.messaging.core.remoting.impl.codec.AbstractPacketCodec;
-import org.jboss.messaging.core.remoting.impl.codec.DecoderStatus;
-import org.jboss.messaging.core.remoting.impl.codec.RemotingBuffer;
-import org.jboss.messaging.core.remoting.impl.wireformat.PacketType;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
- * 
- * @version <tt>$Revision$</tt>
- * 
- */
-public class MinaDecoder implements MessageDecoder
-{
-   // Constants -----------------------------------------------------
-
-   // Attributes ----------------------------------------------------
-
-   private final Map<PacketType, AbstractPacketCodec> codecs;
-
-   // Static --------------------------------------------------------
-
-   // Constructors --------------------------------------------------
-
-   public MinaDecoder()
-   {
-      codecs = new HashMap<PacketType, AbstractPacketCodec>();
-   }
-
-   // Public --------------------------------------------------------
-
-   public void put(PacketType type, AbstractPacketCodec codec)
-   {
-      codecs.put(type, codec);
-   }
-   
-   // MessageDecoder implementation ---------------------------------
-
-   public MessageDecoderResult decodable(IoSession session, IoBuffer in)
-   {
-      byte byteValue = in.get();
-      PacketType type = PacketType.from(byteValue);
-      if (!codecs.containsKey(type))
-         return MessageDecoderResult.NOT_OK;
-
-      AbstractPacketCodec codec = codecs.get(type);
-      RemotingBuffer wrapper = new BufferWrapper(in);
-
-      DecoderStatus status = codec.decodable(wrapper);
-      return convertToMina(status);
-   }
-
-   public MessageDecoderResult decode(IoSession session, IoBuffer in,
-         ProtocolDecoderOutput out) throws Exception
-   {
-      byte byteValue = in.get();
-      PacketType type = PacketType.from(byteValue);
-      AbstractPacketCodec codec = codecs.get(type);
-      // rewind from 1
-      in.position(in.position() -1);
-      Packet packet = codec.decode(new BufferWrapper(in));
-      if (packet == null)
-         return MessageDecoderResult.NEED_DATA;
-      
-      out.write(packet);
-      return MessageDecoderResult.OK;
-   }
-
-   public void finishDecode(IoSession session, ProtocolDecoderOutput out)
-         throws Exception
-   {
-   }
-
-   // Package protected ---------------------------------------------
-
-   // Protected -----------------------------------------------------
-
-   // Private -------------------------------------------------------
-
-   private MessageDecoderResult convertToMina(DecoderStatus status)
-   {
-      if (status == DecoderStatus.OK)
-      {
-         return MessageDecoderResult.OK;
-      }
-      if (status == DecoderStatus.NEED_DATA)
-      {
-         return MessageDecoderResult.NEED_DATA;
-      }
-      return MessageDecoderResult.NOT_OK;
-   }
-   // Inner classes -------------------------------------------------
-}

Deleted: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaEncoder.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaEncoder.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaEncoder.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -1,79 +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;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.mina.common.IoBuffer;
-import org.apache.mina.common.IoSession;
-import org.apache.mina.filter.codec.ProtocolEncoderOutput;
-import org.apache.mina.filter.codec.demux.MessageEncoder;
-import org.jboss.messaging.core.remoting.Packet;
-import org.jboss.messaging.core.remoting.impl.codec.AbstractPacketCodec;
-import org.jboss.messaging.core.remoting.impl.codec.RemotingBuffer;
-import org.jboss.messaging.core.remoting.impl.wireformat.PacketType;
-
-/**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
- * 
- * @version <tt>$Revision$</tt>
- * 
- */
-public class MinaEncoder implements MessageEncoder<Packet>
-{
-   // Constants -----------------------------------------------------
-
-   // Attributes ----------------------------------------------------
-
-   private final Map<PacketType, AbstractPacketCodec> codecs;
-
-   // Static --------------------------------------------------------
-
-   // Constructors --------------------------------------------------
-
-    MinaEncoder()
-   {
-      codecs = new HashMap<PacketType, AbstractPacketCodec>();
-   }
-   // Public --------------------------------------------------------
-
-   public void put(PacketType type, AbstractPacketCodec codec)
-   {
-      codecs.put(type, codec);
-   }
-   
-   // MessageEncoder implementation --------------------------------
-   
-   public void encode(IoSession session, Packet packet,
-         ProtocolEncoderOutput out) throws Exception
-   {
-      final IoBuffer buffer = IoBuffer.allocate(1024);
-      // Enable auto-expand for easier encoding
-      buffer.setAutoExpand(true);
-
-      RemotingBuffer wrapper = new BufferWrapper(buffer);
-
-      AbstractPacketCodec codec = codecs.get(packet.getType());
-      if (codec == null)
-      {
-         throw new IllegalStateException("no encoder has been registered for " + packet);
-      }
-      codec.encode(packet, wrapper);
-
-      buffer.flip();
-      out.write(buffer);
-   }
-
-   // Package protected ---------------------------------------------
-
-   // Protected -----------------------------------------------------
-
-   // Private -------------------------------------------------------
-
-   // Inner classes -------------------------------------------------
-}

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-04-15 09:54:15 UTC (rev 4057)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/PacketCodecFactory.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -66,7 +66,10 @@
 import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_XA_SUSPEND;
 import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.TEXT;
 
-import org.apache.mina.filter.codec.demux.DemuxingProtocolCodecFactory;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.filter.codec.ProtocolCodecFactory;
+import org.apache.mina.filter.codec.ProtocolDecoder;
+import org.apache.mina.filter.codec.ProtocolEncoder;
 import org.jboss.messaging.core.logging.Logger;
 import org.jboss.messaging.core.remoting.Packet;
 import org.jboss.messaging.core.remoting.impl.codec.AbstractPacketCodec;
@@ -77,12 +80,12 @@
 import org.jboss.messaging.core.remoting.impl.codec.ConsumerFlowTokenMessageCodec;
 import org.jboss.messaging.core.remoting.impl.codec.CreateConnectionMessageCodec;
 import org.jboss.messaging.core.remoting.impl.codec.CreateConnectionResponseMessageCodec;
+import org.jboss.messaging.core.remoting.impl.codec.EmptyPacketCodec;
 import org.jboss.messaging.core.remoting.impl.codec.MessagingExceptionMessageCodec;
 import org.jboss.messaging.core.remoting.impl.codec.PingCodec;
 import org.jboss.messaging.core.remoting.impl.codec.PongCodec;
 import org.jboss.messaging.core.remoting.impl.codec.ProducerReceiveTokensMessageCodec;
 import org.jboss.messaging.core.remoting.impl.codec.ProducerSendMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.RemotingBuffer;
 import org.jboss.messaging.core.remoting.impl.codec.SessionAcknowledgeMessageCodec;
 import org.jboss.messaging.core.remoting.impl.codec.SessionAddDestinationMessageCodec;
 import org.jboss.messaging.core.remoting.impl.codec.SessionBindingQueryMessageCodec;
@@ -117,19 +120,19 @@
 import org.jboss.messaging.core.remoting.impl.codec.SessionXASetTimeoutResponseMessageCodec;
 import org.jboss.messaging.core.remoting.impl.codec.SessionXAStartMessageCodec;
 import org.jboss.messaging.core.remoting.impl.codec.TextPacketCodec;
-import org.jboss.messaging.core.remoting.impl.wireformat.PacketImpl;
 import org.jboss.messaging.core.remoting.impl.wireformat.PacketType;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  */
-public class PacketCodecFactory extends DemuxingProtocolCodecFactory
+public class PacketCodecFactory implements ProtocolCodecFactory
 {
    // Constants -----------------------------------------------------
 
-   private final Logger log = Logger.getLogger(PacketCodecFactory.class);
-   private final MinaEncoder encoder;
-   private final MinaDecoder decoder;
+	private final Logger log = Logger.getLogger(PacketCodecFactory.class);
+	
+   private final MessagingCodec codec;
 
    // Attributes ----------------------------------------------------
 
@@ -140,174 +143,141 @@
    // FIXME: split encoder/decoder required only on client and/or server sides
    public PacketCodecFactory()
    {
+      codec = new MessagingCodec();
 
-       decoder = new MinaDecoder();
-       encoder = new MinaEncoder();
-       addMessageDecoder(decoder);
-       addMessageEncoder(Packet.class, encoder);
+      addCodecForEmptyPacket(NULL);
       
-      addCodecForEmptyPacket(encoder, decoder, NULL);
-      addCodec(encoder, decoder, PROD_SEND,
-            new ProducerSendMessageCodec());
-      addCodec(encoder, decoder, CONS_DELIVER,
-            new ConsumerDeliverMessageCodec());
+      addCodec(PROD_SEND, new ProducerSendMessageCodec());
+      
+      addCodec(CONS_DELIVER, new ConsumerDeliverMessageCodec());
 
       // TextPacket are for testing purpose only!
-      addCodec(encoder, decoder, TEXT, new TextPacketCodec());
-      addCodec(encoder, decoder, BYTES, new BytesPacketCodec());
+      addCodec(TEXT, new TextPacketCodec());
+      addCodec(BYTES, new BytesPacketCodec());
 
-      addCodec(encoder, decoder, PING, new PingCodec());
-      addCodec(encoder, decoder, PONG, new PongCodec());
+      addCodec(PING, new PingCodec());
+      addCodec(PONG, new PongCodec());
 
-      addCodec(encoder, decoder, EXCEPTION,
-            new MessagingExceptionMessageCodec());
+      addCodec(EXCEPTION, new MessagingExceptionMessageCodec());
 
-      addCodec(encoder, decoder, CREATECONNECTION,
-            new CreateConnectionMessageCodec());
+      addCodec(CREATECONNECTION, new CreateConnectionMessageCodec());
 
-      addCodec(encoder, decoder, CREATECONNECTION_RESP,
-            new CreateConnectionResponseMessageCodec());
+      addCodec(CREATECONNECTION_RESP, new CreateConnectionResponseMessageCodec());
 
-      addCodec(encoder, decoder, CONN_CREATESESSION,
-            new ConnectionCreateSessionMessageCodec());
+      addCodec(CONN_CREATESESSION,  new ConnectionCreateSessionMessageCodec());
 
-      addCodec(encoder, decoder, CONN_CREATESESSION_RESP,
-            new ConnectionCreateSessionResponseMessageCodec());
+      addCodec(CONN_CREATESESSION_RESP, new ConnectionCreateSessionResponseMessageCodec());
 
-      addCodec(encoder, decoder, SESS_CREATECONSUMER,
-            new SessionCreateConsumerMessageCodec());
+      addCodec(SESS_CREATECONSUMER, new SessionCreateConsumerMessageCodec());
 
-      addCodec(encoder, decoder, SESS_CREATECONSUMER_RESP,
-            new SessionCreateConsumerResponseMessageCodec());
+      addCodec(SESS_CREATECONSUMER_RESP, new SessionCreateConsumerResponseMessageCodec());
 
-      addCodec(encoder, decoder, SESS_CREATEPRODUCER,
-            new SessionCreateProducerMessageCodec());
+      addCodec(SESS_CREATEPRODUCER,  new SessionCreateProducerMessageCodec());
 
-      addCodec(encoder, decoder, SESS_CREATEPRODUCER_RESP,
-            new SessionCreateProducerResponseMessageCodec());
+      addCodec(SESS_CREATEPRODUCER_RESP, new SessionCreateProducerResponseMessageCodec());
 
-      addCodec(encoder, decoder, SESS_CREATEBROWSER,
-            new SessionCreateBrowserMessageCodec());
+      addCodec(SESS_CREATEBROWSER, new SessionCreateBrowserMessageCodec());
 
-      addCodec(encoder, decoder, SESS_CREATEBROWSER_RESP,
-            new SessionCreateBrowserResponseMessageCodec());
+      addCodec(SESS_CREATEBROWSER_RESP, new SessionCreateBrowserResponseMessageCodec());
 
-      addCodecForEmptyPacket(encoder, decoder, CONN_START);
+      addCodecForEmptyPacket(CONN_START);
 
-      addCodecForEmptyPacket(encoder, decoder, CONN_STOP);
+      addCodecForEmptyPacket(CONN_STOP);
 
-      addCodec(encoder, decoder, CONS_FLOWTOKEN,
-            new ConsumerFlowTokenMessageCodec());
+      addCodec(CONS_FLOWTOKEN, new ConsumerFlowTokenMessageCodec());
 
-      addCodec(encoder, decoder, SESS_ACKNOWLEDGE,
-            new SessionAcknowledgeMessageCodec());
+      addCodec(SESS_ACKNOWLEDGE, new SessionAcknowledgeMessageCodec());
 
-      addCodec(encoder, decoder, SESS_CANCEL, new SessionCancelMessageCodec());
+      addCodec(SESS_CANCEL, new SessionCancelMessageCodec());
 
-      addCodecForEmptyPacket(encoder, decoder, SESS_COMMIT);
+      addCodecForEmptyPacket(SESS_COMMIT);
 
-      addCodecForEmptyPacket(encoder, decoder, SESS_ROLLBACK);
+      addCodecForEmptyPacket(SESS_ROLLBACK);
 
-      addCodecForEmptyPacket(encoder, decoder, CLOSE);
+      addCodecForEmptyPacket(CLOSE);
 
-      addCodecForEmptyPacket(encoder, decoder, SESS_RECOVER);
+      addCodecForEmptyPacket(SESS_RECOVER);
 
-      addCodecForEmptyPacket(encoder, decoder, SESS_BROWSER_RESET);
+      addCodecForEmptyPacket(SESS_BROWSER_RESET);
 
-      addCodecForEmptyPacket(encoder, decoder, SESS_BROWSER_HASNEXTMESSAGE);
+      addCodecForEmptyPacket(SESS_BROWSER_HASNEXTMESSAGE);
 
-      addCodec(encoder, decoder, SESS_BROWSER_HASNEXTMESSAGE_RESP,
-            new SessionBrowserHasNextMessageResponseMessageCodec());
+      addCodec(SESS_BROWSER_HASNEXTMESSAGE_RESP, new SessionBrowserHasNextMessageResponseMessageCodec());
 
-      addCodecForEmptyPacket(encoder, decoder, SESS_BROWSER_NEXTMESSAGE);
+      addCodecForEmptyPacket(SESS_BROWSER_NEXTMESSAGE);
 
-      addCodec(encoder, decoder, SESS_BROWSER_NEXTMESSAGE_RESP,
-            new SessionBrowserNextMessageResponseMessageCodec());
+      addCodec(SESS_BROWSER_NEXTMESSAGE_RESP, new SessionBrowserNextMessageResponseMessageCodec());
 
-      addCodec(encoder, decoder, SESS_BROWSER_NEXTMESSAGEBLOCK,
-            new SessionBrowserNextMessageBlockMessageCodec());
+      addCodec(SESS_BROWSER_NEXTMESSAGEBLOCK, new SessionBrowserNextMessageBlockMessageCodec());
 
-      addCodec(encoder, decoder, SESS_BROWSER_NEXTMESSAGEBLOCK_RESP,
-            new SessionBrowserNextMessageBlockResponseMessageCodec());
+      addCodec(SESS_BROWSER_NEXTMESSAGEBLOCK_RESP, new SessionBrowserNextMessageBlockResponseMessageCodec());
 
-      addCodec(encoder, decoder, SESS_XA_COMMIT,
-            new SessionXACommitMessageCodec());
+      addCodec(SESS_XA_COMMIT, new SessionXACommitMessageCodec());
 
-      addCodec(encoder, decoder, SESS_XA_END, new SessionXAEndMessageCodec());
+      addCodec(SESS_XA_END, new SessionXAEndMessageCodec());
 
-      addCodec(encoder, decoder, SESS_XA_FORGET,
-            new SessionXAForgetMessageCodec());
+      addCodec(SESS_XA_FORGET, new SessionXAForgetMessageCodec());
 
-      addCodecForEmptyPacket(encoder, decoder, SESS_XA_INDOUBT_XIDS);
+      addCodecForEmptyPacket(SESS_XA_INDOUBT_XIDS);
 
-      addCodec(encoder, decoder, SESS_XA_INDOUBT_XIDS_RESP,
-            new SessionXAGetInDoubtXidsResponseMessageCodec());
+      addCodec(SESS_XA_INDOUBT_XIDS_RESP, new SessionXAGetInDoubtXidsResponseMessageCodec());
 
-      addCodecForEmptyPacket(encoder, decoder, SESS_XA_GET_TIMEOUT);
+      addCodecForEmptyPacket(SESS_XA_GET_TIMEOUT);
 
-      addCodec(encoder, decoder, SESS_XA_GET_TIMEOUT_RESP,
-            new SessionXAGetTimeoutResponseMessageCodec());
+      addCodec(SESS_XA_GET_TIMEOUT_RESP, new SessionXAGetTimeoutResponseMessageCodec());
 
-      addCodec(encoder, decoder, SESS_XA_JOIN, new SessionXAJoinMessageCodec());
+      addCodec(SESS_XA_JOIN, new SessionXAJoinMessageCodec());
 
-      addCodec(encoder, decoder, SESS_XA_PREPARE,
-            new SessionXAPrepareMessageCodec());
+      addCodec(SESS_XA_PREPARE, new SessionXAPrepareMessageCodec());
 
-      addCodec(encoder, decoder, SESS_XA_RESP,
-            new SessionXAResponseMessageCodec());
+      addCodec(SESS_XA_RESP, new SessionXAResponseMessageCodec());
 
-      addCodec(encoder, decoder, SESS_XA_RESUME,
-            new SessionXAResumeMessageCodec());
+      addCodec(SESS_XA_RESUME, new SessionXAResumeMessageCodec());
 
-      addCodec(encoder, decoder, SESS_XA_ROLLBACK,
-            new SessionXARollbackMessageCodec());
+      addCodec(SESS_XA_ROLLBACK, new SessionXARollbackMessageCodec());
 
-      addCodec(encoder, decoder, SESS_XA_SET_TIMEOUT,
-            new SessionXASetTimeoutMessageCodec());
+      addCodec(SESS_XA_SET_TIMEOUT, new SessionXASetTimeoutMessageCodec());
 
-      addCodec(encoder, decoder, SESS_XA_SET_TIMEOUT_RESP,
-            new SessionXASetTimeoutResponseMessageCodec());
+      addCodec(SESS_XA_SET_TIMEOUT_RESP, new SessionXASetTimeoutResponseMessageCodec());
 
-      addCodec(encoder, decoder, SESS_XA_START,
-            new SessionXAStartMessageCodec());
+      addCodec(SESS_XA_START, new SessionXAStartMessageCodec());
 
-      addCodecForEmptyPacket(encoder, decoder, SESS_XA_SUSPEND);
+      addCodecForEmptyPacket(SESS_XA_SUSPEND);
 
-      addCodec(encoder, decoder, SESS_REMOVE_DESTINATION,
-            new SessionRemoveDestinationMessageCodec());
+      addCodec(SESS_REMOVE_DESTINATION, new SessionRemoveDestinationMessageCodec());
 
-      addCodec(encoder, decoder, SESS_CREATEQUEUE,
-            new SessionCreateQueueMessageCodec());
+      addCodec(SESS_CREATEQUEUE, new SessionCreateQueueMessageCodec());
 
-      addCodec(encoder, decoder, SESS_QUEUEQUERY,
-            new SessionQueueQueryMessageCodec());
+      addCodec(SESS_QUEUEQUERY,  new SessionQueueQueryMessageCodec());
 
-      addCodec(encoder, decoder, SESS_QUEUEQUERY_RESP,
-            new SessionQueueQueryResponseMessageCodec());
+      addCodec(SESS_QUEUEQUERY_RESP, new SessionQueueQueryResponseMessageCodec());
 
-      addCodec(encoder, decoder, SESS_ADD_DESTINATION,
-            new SessionAddDestinationMessageCodec());
+      addCodec(SESS_ADD_DESTINATION, new SessionAddDestinationMessageCodec());
 
-      addCodec(encoder, decoder, SESS_BINDINGQUERY,
-            new SessionBindingQueryMessageCodec());
+      addCodec(SESS_BINDINGQUERY, new SessionBindingQueryMessageCodec());
 
-      addCodec(encoder, decoder, SESS_BINDINGQUERY_RESP,
-            new SessionBindingQueryResponseMessageCodec());
+      addCodec(SESS_BINDINGQUERY_RESP, new SessionBindingQueryResponseMessageCodec());
 
-      addCodec(encoder, decoder, SESS_DELETE_QUEUE,
-            new SessionDeleteQueueMessageCodec());
+      addCodec(SESS_DELETE_QUEUE, new SessionDeleteQueueMessageCodec());
 
-      addCodec(encoder, decoder, PROD_RECEIVETOKENS,
-            new ProducerReceiveTokensMessageCodec());
-
+      addCodec(PROD_RECEIVETOKENS, new ProducerReceiveTokensMessageCodec());
    }
+   
+   public ProtocolDecoder getDecoder(IoSession session) throws Exception
+	{
+		return codec;
+	}
 
+	public ProtocolEncoder getEncoder(IoSession session) throws Exception
+	{
+		return codec;
+	}
+
    // Public --------------------------------------------------------
 
-   public static AbstractPacketCodec<Packet> createCodecForEmptyPacket(
-         final PacketType type)
+   public static AbstractPacketCodec<?> createCodecForEmptyPacket(final PacketType type)
    {
-      return new CodecForEmptyPacket<Packet>(type);
+      return new EmptyPacketCodec(type);
    }
    
    // Package protected ---------------------------------------------
@@ -316,51 +286,15 @@
 
    // Private -------------------------------------------------------
 
-   // FIXME generics definition should be in term of <P>...
-   private void addCodec(MinaEncoder encoder, MinaDecoder decoder,
-         PacketType type, AbstractPacketCodec<? extends Packet> codec)
+   private void addCodec(final PacketType type, final AbstractPacketCodec<? extends Packet> c)
    {
-      try
-      {
-         decoder.put(type, codec);
-         encoder.put(type, codec);
-      } catch (Exception e)
-      {
-         log.error("Unable to add codec for packet " + type, e);
-      }
+      codec.put(type, c);
    }
    
-   private void addCodecForEmptyPacket(MinaEncoder encoder,
-         MinaDecoder decoder, PacketType type)
+   private void addCodecForEmptyPacket(final PacketType type)
    {
-      AbstractPacketCodec<Packet> codec = createCodecForEmptyPacket(
-            type);
-      addCodec(encoder, decoder, type, codec);
+      AbstractPacketCodec<?> c = createCodecForEmptyPacket(type);
+      addCodec(type, c);
    }
 
-   // Inner classes -------------------------------------------------
-
-   static class CodecForEmptyPacket<P extends Packet> extends
-         AbstractPacketCodec<P>
-   {
-
-      public CodecForEmptyPacket(PacketType type)
-      {
-         super(type);
-      }
-
-      @Override
-      protected void encodeBody(P packet, RemotingBuffer out) throws Exception
-      {
-         // no body
-         out.putInt(0);
-      }
-
-      @Override
-      protected Packet decodeBody(RemotingBuffer in) throws Exception
-      {
-         in.getInt(); // skip body length
-         return new PacketImpl(type);
-      }
-   }
 }

Modified: trunk/tests/src/org/jboss/messaging/tests/unit/core/remoting/impl/wireformat/PacketTypeTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/unit/core/remoting/impl/wireformat/PacketTypeTest.java	2008-04-15 09:54:15 UTC (rev 4057)
+++ trunk/tests/src/org/jboss/messaging/tests/unit/core/remoting/impl/wireformat/PacketTypeTest.java	2008-04-15 13:12:37 UTC (rev 4058)
@@ -7,189 +7,35 @@
 package org.jboss.messaging.tests.unit.core.remoting.impl.wireformat;
 
 import static org.jboss.messaging.core.remoting.impl.codec.AbstractPacketCodec.FALSE;
+import static org.jboss.messaging.core.remoting.impl.codec.AbstractPacketCodec.HEADER_LENGTH;
 import static org.jboss.messaging.core.remoting.impl.codec.AbstractPacketCodec.TRUE;
 import static org.jboss.messaging.core.remoting.impl.mina.BufferWrapper.NOT_NULL_STRING;
 import static org.jboss.messaging.core.remoting.impl.mina.BufferWrapper.NULL_BYTE;
 import static org.jboss.messaging.core.remoting.impl.mina.BufferWrapper.NULL_STRING;
 import static org.jboss.messaging.core.remoting.impl.mina.BufferWrapper.UTF_8_ENCODER;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.BYTES;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.CLOSE;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.CONN_CREATESESSION;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.CONN_CREATESESSION_RESP;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.CONN_START;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.CONN_STOP;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.CONS_DELIVER;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.CONS_FLOWTOKEN;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.CREATECONNECTION;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.CREATECONNECTION_RESP;
 import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.NULL;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.PING;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.PONG;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.PROD_SEND;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_ACKNOWLEDGE;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_ADD_DESTINATION;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_BINDINGQUERY;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_BINDINGQUERY_RESP;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_BROWSER_HASNEXTMESSAGE;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_BROWSER_HASNEXTMESSAGE_RESP;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGE;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGEBLOCK;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGEBLOCK_RESP;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_BROWSER_NEXTMESSAGE_RESP;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_BROWSER_RESET;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_CANCEL;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_COMMIT;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_CREATEBROWSER;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_CREATEBROWSER_RESP;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_CREATECONSUMER;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_CREATECONSUMER_RESP;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_CREATEPRODUCER;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_CREATEPRODUCER_RESP;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_CREATEQUEUE;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_DELETE_QUEUE;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_QUEUEQUERY;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_QUEUEQUERY_RESP;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_RECOVER;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_REMOVE_DESTINATION;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_ROLLBACK;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_XA_COMMIT;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_XA_END;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_XA_FORGET;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_XA_GET_TIMEOUT;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_XA_GET_TIMEOUT_RESP;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_XA_INDOUBT_XIDS;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_XA_INDOUBT_XIDS_RESP;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_XA_JOIN;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_XA_PREPARE;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_XA_RESP;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_XA_RESUME;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_XA_ROLLBACK;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_XA_SET_TIMEOUT;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_XA_SET_TIMEOUT_RESP;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_XA_START;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.SESS_XA_SUSPEND;
-import static org.jboss.messaging.core.remoting.impl.wireformat.PacketType.TEXT;
 import static org.jboss.messaging.tests.unit.core.remoting.impl.wireformat.CodecAssert.assertEqualsByteArrays;
-import static org.jboss.messaging.tests.util.RandomUtil.randomBytes;
-import static org.jboss.messaging.tests.util.RandomUtil.randomInt;
 import static org.jboss.messaging.tests.util.RandomUtil.randomLong;
-import static org.jboss.messaging.tests.util.RandomUtil.randomString;
 
-import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
-import java.util.ArrayList;
-import java.util.List;
 
-import javax.transaction.xa.Xid;
-
 import org.apache.mina.common.IoBuffer;
+import org.apache.mina.common.WriteFuture;
+import org.apache.mina.filter.codec.ProtocolDecoderOutput;
+import org.apache.mina.filter.codec.ProtocolEncoderOutput;
 import org.jboss.messaging.core.logging.Logger;
-import org.jboss.messaging.core.message.Message;
-import org.jboss.messaging.core.message.impl.MessageImpl;
 import org.jboss.messaging.core.remoting.Packet;
 import org.jboss.messaging.core.remoting.impl.codec.AbstractPacketCodec;
-import org.jboss.messaging.core.remoting.impl.codec.BytesPacketCodec;
-import org.jboss.messaging.core.remoting.impl.codec.ConnectionCreateSessionMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.ConnectionCreateSessionResponseMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.ConsumerDeliverMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.ConsumerFlowTokenMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.CreateConnectionMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.CreateConnectionResponseMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.PingCodec;
-import org.jboss.messaging.core.remoting.impl.codec.PongCodec;
-import org.jboss.messaging.core.remoting.impl.codec.ProducerReceiveTokensMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.ProducerSendMessageCodec;
 import org.jboss.messaging.core.remoting.impl.codec.RemotingBuffer;
-import org.jboss.messaging.core.remoting.impl.codec.SessionAcknowledgeMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionAddDestinationMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionBindingQueryMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionBindingQueryResponseMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionBrowserHasNextMessageResponseMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionBrowserNextMessageBlockMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionBrowserNextMessageBlockResponseMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionBrowserNextMessageResponseMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionCancelMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionCreateBrowserMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionCreateBrowserResponseMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionCreateConsumerMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionCreateConsumerResponseMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionCreateProducerMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionCreateProducerResponseMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionCreateQueueMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionDeleteQueueMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionQueueQueryMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionQueueQueryResponseMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionRemoveDestinationMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionXACommitMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionXAEndMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionXAForgetMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionXAGetInDoubtXidsResponseMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionXAGetTimeoutResponseMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionXAJoinMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionXAPrepareMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionXAResponseMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionXAResumeMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionXARollbackMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionXASetTimeoutMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionXASetTimeoutResponseMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.SessionXAStartMessageCodec;
-import org.jboss.messaging.core.remoting.impl.codec.TextPacketCodec;
 import org.jboss.messaging.core.remoting.impl.mina.BufferWrapper;
 import org.jboss.messaging.core.remoting.impl.mina.PacketCodecFactory;
 import org.jboss.messaging.core.remoting.impl.wireformat.PacketImpl;
-import org.jboss.messaging.core.remoting.impl.wireformat.BytesPacket;
-import org.jboss.messaging.core.remoting.impl.wireformat.ConnectionCreateSessionMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.ConnectionCreateSessionResponseMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.ConsumerDeliverMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.ConsumerFlowTokenMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.CreateConnectionRequest;
-import org.jboss.messaging.core.remoting.impl.wireformat.CreateConnectionResponse;
-import org.jboss.messaging.core.remoting.impl.wireformat.PacketType;
-import org.jboss.messaging.core.remoting.impl.wireformat.Ping;
-import org.jboss.messaging.core.remoting.impl.wireformat.Pong;
-import org.jboss.messaging.core.remoting.impl.wireformat.ProducerReceiveTokensMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.ProducerSendMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionAcknowledgeMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionAddDestinationMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionBindingQueryMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionBindingQueryResponseMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionBrowserHasNextMessageResponseMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionBrowserNextMessageBlockMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionBrowserNextMessageBlockResponseMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionBrowserNextMessageResponseMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionCancelMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionCreateBrowserMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionCreateBrowserResponseMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionCreateConsumerMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionCreateConsumerResponseMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionCreateProducerMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionCreateProducerResponseMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionCreateQueueMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionDeleteQueueMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionQueueQueryMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionQueueQueryResponseMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionRemoveDestinationMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionXACommitMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionXAEndMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionXAForgetMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionXAGetInDoubtXidsResponseMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionXAGetTimeoutResponseMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionXAJoinMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionXAPrepareMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionXAResponseMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionXAResumeMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionXARollbackMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionXASetTimeoutMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionXASetTimeoutResponseMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.SessionXAStartMessage;
-import org.jboss.messaging.core.remoting.impl.wireformat.TextPacket;
-import org.jboss.messaging.tests.util.RandomUtil;
 import org.jboss.messaging.tests.util.UnitTestCase;
-import org.jboss.messaging.util.StreamUtils;
 
 /**
- * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>.
+ * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
  * 
  * FIXME - tidy up tests so test names match the actual packets
  * 
@@ -262,9 +108,13 @@
       }
    }
 
-   private static void checkHeader(SimpleRemotingBuffer buffer,
-         PacketImpl packet) throws Exception
+   private static void checkHeader(final RemotingBuffer buffer,
+                                   final PacketImpl packet,
+                                   final int bodyLength) throws Exception
    {
+   	buffer.rewind();
+   	assertEquals(AbstractPacketCodec.HEADER_LENGTH + bodyLength, buffer.getInt());
+   	   	
       assertEquals(buffer.get(), packet.getType().byteValue());
 
       long correlationID = buffer.getLong();
@@ -280,8 +130,6 @@
 
    private static void checkBodyIsEmpty(RemotingBuffer buffer)
    {
-      assertEquals(0, buffer.getInt());
-      // check the buffer has been wholly read
       assertEquals(0, buffer.remaining());
    }
 
@@ -290,7 +138,7 @@
       byte[] actualBody = new byte[buffer.getInt()];
       buffer.get(actualBody);
       ByteBuffer expectedBody = encode(actualBody.length, bodyObjects);
-      CodecAssert.assertEqualsByteArrays(expectedBody.array(), actualBody);
+      assertEqualsByteArrays(expectedBody.array(), actualBody);
       // check the buffer has been wholly read
       assertEquals(0, buffer.remaining());
    }
@@ -302,1198 +150,1274 @@
    public void testNullPacket() throws Exception
    {
       PacketImpl packet = new PacketImpl(NULL);
-      packet.setCorrelationID(randomLong());
+      long cid = randomLong();
+      packet.setCorrelationID(cid);
       packet.setTargetID(randomLong());
       packet.setExecutorID(randomLong());
 
-      AbstractPacketCodec<Packet> codec = PacketCodecFactory
+      AbstractPacketCodec<?> codec = PacketCodecFactory
             .createCodecForEmptyPacket(NULL);
-      SimpleRemotingBuffer buffer = encode(packet, codec);
-      checkHeader(buffer, packet);
+      RemotingBuffer buffer = encode(packet, codec);
+      checkHeader(buffer, packet, 0);
       checkBodyIsEmpty(buffer);
       buffer.rewind();
 
-      Packet decodedPacket = codec.decode(buffer);
-
+      Packet decodedPacket = decode(buffer, codec, 0);
+      assertTrue(decodedPacket instanceof PacketImpl);
+      
       assertEquals(NULL, decodedPacket.getType());
       assertEquals(packet.getCorrelationID(), decodedPacket.getCorrelationID());
       assertEquals(packet.getTargetID(), decodedPacket.getTargetID());
+      assertEquals(packet.getExecutorID(), decodedPacket.getExecutorID());
    }
 
-   public void testPing() throws Exception
-   {
-      Ping ping = new Ping(randomLong());
-      AbstractPacketCodec<Ping> codec = new PingCodec();
-      
-      SimpleRemotingBuffer buffer = encode(ping, codec);
-      checkHeader(buffer, ping);
-      checkBody(buffer, ping.getSessionID());
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof Ping);
-      Ping decodedPing = (Ping) decodedPacket;
-      assertEquals(PING, decodedPing.getType());
-      assertEquals(ping.getSessionID(), decodedPing.getSessionID());
-   }
-
-   public void testPong() throws Exception
-   {
-      Pong pong = new Pong(randomLong(), true);
-      AbstractPacketCodec<Pong> codec = new PongCodec();
-      
-      SimpleRemotingBuffer buffer = encode(pong, codec);
-      checkHeader(buffer, pong);
-      checkBody(buffer, pong.getSessionID(), pong.isSessionFailed());
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof Pong);
-      Pong decodedPong = (Pong) decodedPacket;
-      assertEquals(PONG, decodedPong.getType());
-      assertEquals(pong.getSessionID(), decodedPong.getSessionID());
-      assertEquals(pong.isSessionFailed(), decodedPong.isSessionFailed());
-   }
-
-   public void testTextPacket() throws Exception
-   {
-      TextPacket packet = new TextPacket("testTextPacket");
-      AbstractPacketCodec<TextPacket> codec = new TextPacketCodec();
-
-      SimpleRemotingBuffer buffer = encode(packet, codec);
-      checkHeader(buffer, packet);
-      checkBody(buffer, packet.getText());
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof TextPacket);
-      TextPacket p = (TextPacket) decodedPacket;
-
-      assertEquals(TEXT, p.getType());
-      assertEquals(packet.getText(), p.getText());
-   }
+//   public void testPing() throws Exception
+//   {
+//      Ping ping = new Ping(randomLong());
+//      AbstractPacketCodec<Ping> codec = new PingCodec();
+//      
+//      RemotingBuffer buffer = encode(ping, codec);
+//      checkHeader(buffer, ping, AbstractPacketCodec.LONG_LENGTH);
+//      checkBody(buffer, ping.getSessionID());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = decode(buffer, codec, AbstractPacketCodec.LONG_LENGTH);
+//
+//      assertTrue(decodedPacket instanceof Ping);
+//      Ping decodedPing = (Ping) decodedPacket;
+//      assertEquals(PING, decodedPing.getType());
+//      assertEquals(ping.getCorrelationID(), decodedPacket.getCorrelationID());
+//      assertEquals(ping.getTargetID(), decodedPacket.getTargetID());
+//      assertEquals(ping.getExecutorID(), decodedPacket.getExecutorID());
+//   }
+//
+//   public void testPong() throws Exception
+//   {
+//      Pong pong = new Pong(randomLong(), true);
+//      AbstractPacketCodec<Pong> codec = new PongCodec();
+//      
+//      SimpleRemotingBuffer buffer = encode(pong, codec);
+//      checkHeader(buffer, pong);
+//      checkBody(buffer, pong.getSessionID(), pong.isSessionFailed());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof Pong);
+//      Pong decodedPong = (Pong) decodedPacket;
+//      assertEquals(PONG, decodedPong.getType());
+//      assertEquals(pong.getSessionID(), decodedPong.getSessionID());
+//      assertEquals(pong.isSessionFailed(), decodedPong.isSessionFailed());
+//   }
+//
+//   public void testTextPacket() throws Exception
+//   {
+//      TextPacket packet = new TextPacket("testTextPacket");
+//      AbstractPacketCodec<TextPacket> codec = new TextPacketCodec();
+//
+//      SimpleRemotingBuffer buffer = encode(packet, codec);
+//      checkHeader(buffer, packet);
+//      checkBody(buffer, packet.getText());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof TextPacket);
+//      TextPacket p = (TextPacket) decodedPacket;
+//
+//      assertEquals(TEXT, p.getType());
+//      assertEquals(packet.getText(), p.getText());
+//   }
+//   
+//   public void testBytesPacket() throws Exception
+//   {
+//      BytesPacket packet = new BytesPacket(randomBytes());
+//
+//      AbstractPacketCodec codec = new BytesPacketCodec();
+//      SimpleRemotingBuffer buffer = encode(packet, codec);
+//      checkHeader(buffer, packet);
+//      checkBody(buffer, packet.getBytes());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof BytesPacket);
+//      BytesPacket p = (BytesPacket) decodedPacket;
+//
+//      assertEquals(BYTES, p.getType());
+//      assertEqualsByteArrays(packet.getBytes(), p.getBytes());
+//   }
+//   
+//   public void testCreateConnectionRequest() throws Exception
+//   {
+//      int version = randomInt();
+//      long remotingSessionID = randomLong();
+//      String clientVMID = randomString();
+//      String username = null;
+//      String password = null;
+//
+//      CreateConnectionRequest request = new CreateConnectionRequest(version,
+//            remotingSessionID, clientVMID, username, password);
+//
+//      AbstractPacketCodec<CreateConnectionRequest> codec = new CreateConnectionMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(request, codec);
+//      checkHeader(buffer, request);
+//      checkBody(buffer, version, remotingSessionID, clientVMID, username, password);
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof CreateConnectionRequest);
+//      CreateConnectionRequest decodedRequest = (CreateConnectionRequest) decodedPacket;
+//
+//      assertEquals(CREATECONNECTION, decodedPacket.getType());
+//      assertEquals(request.getVersion(), decodedRequest.getVersion());
+//      assertEquals(request.getRemotingSessionID(), decodedRequest
+//            .getRemotingSessionID());
+//      assertEquals(request.getClientVMID(), decodedRequest.getClientVMID());
+//      assertEquals(request.getUsername(), decodedRequest.getUsername());
+//      assertEquals(request.getPassword(), decodedRequest.getPassword());
+//   }
+//
+//   public void testCreateConnectionResponse() throws Exception
+//   {
+//      CreateConnectionResponse response = new CreateConnectionResponse(randomLong());
+//
+//      AbstractPacketCodec<CreateConnectionResponse> codec = new CreateConnectionResponseMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(response, codec);
+//      checkHeader(buffer, response);
+//      checkBody(buffer, response.getConnectionTargetID());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof CreateConnectionResponse);
+//      CreateConnectionResponse decodedResponse = (CreateConnectionResponse) decodedPacket;
+//      assertEquals(CREATECONNECTION_RESP, decodedResponse.getType());
+//      assertEquals(response.getConnectionTargetID(), decodedResponse.getConnectionTargetID());
+//   }
+//
+//   public void testCreateSessionRequest() throws Exception
+//   {
+//      //TODO test this more thoroughly
+//      
+//      ConnectionCreateSessionMessage request = new ConnectionCreateSessionMessage(true, true, true);
+//
+//      AbstractPacketCodec codec = new ConnectionCreateSessionMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(request, codec);
+//      checkHeader(buffer, request);
+//      checkBody(buffer, request.isXA(), request.isAutoCommitSends(), request.isAutoCommitAcks());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof ConnectionCreateSessionMessage);
+//      ConnectionCreateSessionMessage decodedRequest = (ConnectionCreateSessionMessage) decodedPacket;
+//      assertEquals(CONN_CREATESESSION, decodedRequest.getType());
+//      assertEquals(request.isXA(), decodedRequest.isXA());
+//      assertEquals(request.isAutoCommitSends(), decodedRequest.isAutoCommitSends());
+//      assertEquals(request.isAutoCommitAcks(), decodedRequest.isAutoCommitAcks());
+//      assertEquals(request.isXA(), decodedRequest.isXA());
+//   }
+//
+//   public void testCreateSessionResponse() throws Exception
+//   {
+//      ConnectionCreateSessionResponseMessage response = new ConnectionCreateSessionResponseMessage(randomLong());
+//
+//      AbstractPacketCodec codec = new ConnectionCreateSessionResponseMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(response, codec);
+//      checkHeader(buffer, response);
+//      checkBody(buffer, response.getSessionID());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof ConnectionCreateSessionResponseMessage);
+//      ConnectionCreateSessionResponseMessage decodedResponse = (ConnectionCreateSessionResponseMessage) decodedPacket;
+//      assertEquals(CONN_CREATESESSION_RESP, decodedResponse.getType());
+//      assertEquals(response.getSessionID(), decodedResponse.getSessionID());
+//   }
+//
+//   public void testSendMessage() throws Exception
+//   {
+//      ProducerSendMessage packet = new ProducerSendMessage(randomString(), new MessageImpl());
+//
+//      AbstractPacketCodec codec = new ProducerSendMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(packet, codec);
+//      checkHeader(buffer, packet);
+//      checkBody(buffer, packet.getAddress(), StreamUtils.toBytes(packet.getMessage()));
+//      buffer.rewind();
+//
+//      Packet p = codec.decode(buffer);
+//
+//      assertTrue(p instanceof ProducerSendMessage);
+//      ProducerSendMessage decodedPacket = (ProducerSendMessage) p;
+//      assertEquals(PROD_SEND, decodedPacket.getType());
+//      assertEquals(packet.getAddress(), decodedPacket.getAddress());
+//      assertEquals(packet.getMessage().getMessageID(), decodedPacket
+//            .getMessage().getMessageID());
+//   }
+//
+//   public void testCreateConsumerRequest() throws Exception
+//   {      
+//      String destination = "queue.testCreateConsumerRequest";
+//      SessionCreateConsumerMessage request = new SessionCreateConsumerMessage(destination,
+//            "color = 'red'", false, false, randomInt(), randomInt());
+//
+//      AbstractPacketCodec codec = new SessionCreateConsumerMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(request, codec);
+//      checkHeader(buffer, request);
+//      checkBody(buffer, request.getQueueName(), request
+//            .getFilterString(), request.isNoLocal(), request.isAutoDeleteQueue(), request.getWindowSize(), request.getMaxRate());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionCreateConsumerMessage);
+//      SessionCreateConsumerMessage decodedRequest = (SessionCreateConsumerMessage) decodedPacket;
+//      assertEquals(SESS_CREATECONSUMER, decodedRequest.getType());
+//      assertEquals(request.getQueueName(), decodedRequest.getQueueName());
+//      assertEquals(request.getFilterString(), decodedRequest.getFilterString());
+//      assertEquals(request.isNoLocal(), decodedRequest.isNoLocal());
+//      assertEquals(request.isAutoDeleteQueue(), decodedRequest.isAutoDeleteQueue());
+//      assertEquals(request.getWindowSize(), decodedRequest.getWindowSize());
+//      assertEquals(request.getMaxRate(), decodedRequest.getMaxRate());
+//   }
+//
+//   public void testCreateConsumerResponse() throws Exception
+//   {
+//      SessionCreateConsumerResponseMessage response =
+//      	new SessionCreateConsumerResponseMessage(randomLong(), randomInt());
+//
+//      AbstractPacketCodec codec = new SessionCreateConsumerResponseMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(response, codec);
+//      checkHeader(buffer, response);
+//      checkBody(buffer, response.getConsumerTargetID(), response.getWindowSize());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionCreateConsumerResponseMessage);
+//      SessionCreateConsumerResponseMessage decodedResponse = (SessionCreateConsumerResponseMessage) decodedPacket;
+//      assertEquals(SESS_CREATECONSUMER_RESP, decodedResponse.getType());
+//      
+//      assertEquals(response.getConsumerTargetID(), decodedResponse.getConsumerTargetID());
+//      assertEquals(response.getWindowSize(), decodedResponse.getWindowSize());
+//   }
+//   
+//   public void testCreateProducerRequest() throws Exception
+//   {      
+//      String destination = "queue.testCreateProducerRequest";
+//      int windowSize = randomInt();
+//      int maxRate = randomInt();
+//      SessionCreateProducerMessage request = new SessionCreateProducerMessage(destination, windowSize, maxRate);
+//
+//      AbstractPacketCodec codec = new SessionCreateProducerMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(request, codec);
+//      checkHeader(buffer, request);
+//      checkBody(buffer, request.getAddress(), request.getWindowSize(), request.getMaxRate());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionCreateProducerMessage);
+//      SessionCreateProducerMessage decodedRequest = (SessionCreateProducerMessage) decodedPacket;
+//      assertEquals(SESS_CREATEPRODUCER, decodedRequest.getType());
+//      assertEquals(request.getAddress(), decodedRequest.getAddress());
+//      assertEquals(request.getWindowSize(), decodedRequest.getWindowSize());
+//      assertEquals(request.getMaxRate(), decodedRequest.getMaxRate());
+//   }
+//   
+//   public void testCreateProducerResponse() throws Exception
+//   {
+//      SessionCreateProducerResponseMessage response =
+//      	new SessionCreateProducerResponseMessage(randomLong(), randomInt(), randomInt());
+//
+//      AbstractPacketCodec codec = new SessionCreateProducerResponseMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(response, codec);
+//      checkHeader(buffer, response);
+//      checkBody(buffer, response.getProducerTargetID(), response.getWindowSize(), response.getMaxRate());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionCreateProducerResponseMessage);
+//      SessionCreateProducerResponseMessage decodedResponse = (SessionCreateProducerResponseMessage) decodedPacket;
+//      assertEquals(SESS_CREATEPRODUCER_RESP, decodedResponse.getType());
+//      assertEquals(response.getProducerTargetID(), decodedResponse.getProducerTargetID());
+//      assertEquals(response.getWindowSize(), decodedResponse.getWindowSize());
+//      assertEquals(response.getMaxRate(), decodedResponse.getMaxRate());
+//   }
+//
+//   public void testStartConnectionMessage() throws Exception
+//   {
+//      PacketImpl packet = new PacketImpl(CONN_START);
+//
+//      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
+//            CONN_START);
+//      SimpleRemotingBuffer buffer = encode(packet, codec);
+//      checkHeader(buffer, packet);
+//      checkBodyIsEmpty(buffer);
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertEquals(CONN_START, decodedPacket.getType());
+//   }
+//
+//   public void testStopConnectionMessage() throws Exception
+//   {
+//      PacketImpl packet = new PacketImpl(CONN_STOP);
+//
+//      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
+//            CONN_STOP);
+//      SimpleRemotingBuffer buffer = encode(packet, codec);
+//      checkHeader(buffer, packet);
+//      checkBodyIsEmpty(buffer);
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertEquals(CONN_STOP, decodedPacket.getType());
+//   }
+//
+//   public void testConsumerFlowTokenMessage() throws Exception
+//   {
+//      ConsumerFlowTokenMessage message = new ConsumerFlowTokenMessage(10);
+//      AbstractPacketCodec codec = new ConsumerFlowTokenMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      checkBody(buffer, message.getTokens());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof ConsumerFlowTokenMessage);
+//      ConsumerFlowTokenMessage decodedMessage = (ConsumerFlowTokenMessage) decodedPacket;
+//      assertEquals(CONS_FLOWTOKEN, decodedMessage.getType());
+//      assertEquals(message.getTokens(), decodedMessage.getTokens());
+//   }
+//   
+//   public void testProducerReceiveTokensMessage() throws Exception
+//   {
+//   	ProducerReceiveTokensMessage message = new ProducerReceiveTokensMessage(10);
+//      AbstractPacketCodec codec = new ProducerReceiveTokensMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      checkBody(buffer, message.getTokens());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof ProducerReceiveTokensMessage);
+//      ProducerReceiveTokensMessage decodedMessage = (ProducerReceiveTokensMessage) decodedPacket;
+//      assertEquals(PacketType.PROD_RECEIVETOKENS, decodedMessage.getType());
+//      assertEquals(message.getTokens(), decodedMessage.getTokens());
+//   }
+//
+//   public void testDeliverMessage() throws Exception
+//   {
+//      Message msg = new MessageImpl();
+//      ConsumerDeliverMessage message = new ConsumerDeliverMessage(msg, randomLong());
+//
+//      AbstractPacketCodec codec = new ConsumerDeliverMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      checkBody(buffer, StreamUtils.toBytes(msg), message.getDeliveryID());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof ConsumerDeliverMessage);
+//      ConsumerDeliverMessage decodedMessage = (ConsumerDeliverMessage) decodedPacket;
+//      assertEquals(CONS_DELIVER, decodedMessage.getType());
+//      assertEquals(message.getMessage().getMessageID(), decodedMessage
+//            .getMessage().getMessageID());
+//      assertEquals(message.getDeliveryID(), decodedMessage.getDeliveryID());
+//   }
+//
+//   public void testSessionAcknowledgeMessage() throws Exception
+//   {
+//      SessionAcknowledgeMessage message = new SessionAcknowledgeMessage(
+//            randomLong(), true);
+//
+//      AbstractPacketCodec codec = new SessionAcknowledgeMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      checkBody(buffer, message.getDeliveryID(), message.isAllUpTo());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionAcknowledgeMessage);
+//      SessionAcknowledgeMessage decodedMessage = (SessionAcknowledgeMessage) decodedPacket;
+//      assertEquals(SESS_ACKNOWLEDGE, decodedMessage.getType());
+//      assertEquals(message.getDeliveryID(), decodedMessage.getDeliveryID());
+//      assertEquals(message.isAllUpTo(), decodedMessage.isAllUpTo());
+//   }
+//
+//   public void testSessionCancelMessage() throws Exception
+//   {
+//      SessionCancelMessage message = new SessionCancelMessage(randomLong(),
+//            true);
+//
+//      AbstractPacketCodec codec = new SessionCancelMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      checkBody(buffer, message.getDeliveryID(), message.isExpired());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionCancelMessage);
+//      SessionCancelMessage decodedMessage = (SessionCancelMessage) decodedPacket;
+//      assertEquals(SESS_CANCEL, decodedMessage.getType());
+//      assertEquals(message.getDeliveryID(), decodedMessage.getDeliveryID());
+//      assertEquals(message.isExpired(), decodedMessage.isExpired());
+//   }
+//
+//   public void testSessionCommitMessage() throws Exception
+//   {
+//      PacketImpl message = new PacketImpl(SESS_COMMIT);
+//
+//      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
+//            SESS_COMMIT);
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      checkBodyIsEmpty(buffer);
+//
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertEquals(SESS_COMMIT, decodedPacket.getType());
+//   }
+//
+//   public void testSessionRollbackMessage() throws Exception
+//   {
+//      PacketImpl message = new PacketImpl(SESS_ROLLBACK);
+//
+//      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
+//            SESS_ROLLBACK);
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      checkBodyIsEmpty(buffer);
+//
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertEquals(SESS_ROLLBACK, decodedPacket.getType());
+//   }
+//   
+//   public void testSessionRecoverMessage() throws Exception
+//   {
+//      PacketImpl message = new PacketImpl(SESS_RECOVER);
+//
+//      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
+//            SESS_RECOVER);
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      checkBodyIsEmpty(buffer);
+//
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertEquals(SESS_RECOVER, decodedPacket.getType());
+//   }
+//
+//   public void testCloseMessage() throws Exception
+//   {
+//      PacketImpl message = new PacketImpl(CLOSE);
+//
+//      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
+//            CLOSE);
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      checkBodyIsEmpty(buffer);
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertEquals(CLOSE, decodedPacket.getType());
+//   }
+//
+//
+//   public void testCreateBrowserRequest() throws Exception
+//   {
+//      String destination = "queue.testCreateBrowserRequest";
+//      SessionCreateBrowserMessage request = new SessionCreateBrowserMessage(destination,
+//            "color = 'red'");
+//
+//      AbstractPacketCodec codec = new SessionCreateBrowserMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(request, codec);
+//      checkHeader(buffer, request);
+//      checkBody(buffer, request.getQueueName(), request.getFilterString());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionCreateBrowserMessage);
+//      SessionCreateBrowserMessage decodedRequest = (SessionCreateBrowserMessage) decodedPacket;
+//      assertEquals(SESS_CREATEBROWSER, decodedRequest.getType());
+//      assertEquals(request.getQueueName(), decodedRequest.getQueueName());
+//      assertEquals(request.getFilterString(), decodedRequest.getFilterString());
+//   }
+//
+//   public void testCreateBrowserResponse() throws Exception
+//   {
+//      SessionCreateBrowserResponseMessage response = new SessionCreateBrowserResponseMessage(randomLong());
+//
+//      AbstractPacketCodec codec = new SessionCreateBrowserResponseMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(response, codec);
+//      checkHeader(buffer, response);
+//      checkBody(buffer, response.getBrowserTargetID());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionCreateBrowserResponseMessage);
+//      SessionCreateBrowserResponseMessage decodedResponse = (SessionCreateBrowserResponseMessage) decodedPacket;
+//      assertEquals(SESS_CREATEBROWSER_RESP, decodedResponse.getType());
+//      assertEquals(response.getBrowserTargetID(), decodedResponse.getBrowserTargetID());
+//   }
+//
+//   public void testBrowserResetMessage() throws Exception
+//   {
+//      PacketImpl message = new PacketImpl(SESS_BROWSER_RESET);
+//
+//      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
+//            SESS_BROWSER_RESET);
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      checkBodyIsEmpty(buffer);
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertEquals(SESS_BROWSER_RESET, decodedPacket.getType());
+//   }
+//
+//   public void testBrowserHasNextMessageRequest() throws Exception
+//   {
+//      PacketImpl request = new PacketImpl(SESS_BROWSER_HASNEXTMESSAGE);
+//
+//      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
+//            SESS_BROWSER_HASNEXTMESSAGE);
+//      SimpleRemotingBuffer buffer = encode(request, codec);
+//      checkHeader(buffer, request);
+//      checkBodyIsEmpty(buffer);
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertEquals(SESS_BROWSER_HASNEXTMESSAGE, decodedPacket.getType());
+//   }
+//
+//   public void testBrowserHasNextMessageResponse() throws Exception
+//   {
+//      SessionBrowserHasNextMessageResponseMessage response = new SessionBrowserHasNextMessageResponseMessage(
+//            false);
+//      AbstractPacketCodec codec = new SessionBrowserHasNextMessageResponseMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(response, codec);
+//      checkHeader(buffer, response);
+//      checkBody(buffer, response.hasNext());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionBrowserHasNextMessageResponseMessage);
+//      SessionBrowserHasNextMessageResponseMessage decodedResponse = (SessionBrowserHasNextMessageResponseMessage) decodedPacket;
+//      assertEquals(SESS_BROWSER_HASNEXTMESSAGE_RESP, decodedResponse.getType());
+//      assertEquals(response.hasNext(), decodedResponse.hasNext());
+//   }
+//
+//   public void testBrowserNextMessageRequest() throws Exception
+//   {
+//      PacketImpl request = new PacketImpl(SESS_BROWSER_NEXTMESSAGE);
+//
+//      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
+//            SESS_BROWSER_NEXTMESSAGE);
+//      SimpleRemotingBuffer buffer = encode(request, codec);
+//      checkHeader(buffer, request);
+//      checkBodyIsEmpty(buffer);
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertEquals(SESS_BROWSER_NEXTMESSAGE, decodedPacket.getType());
+//   }
+//
+//   public void testBrowserNextMessageResponse() throws Exception
+//   {
+//      Message msg = new MessageImpl();
+//      SessionBrowserNextMessageResponseMessage response = new SessionBrowserNextMessageResponseMessage(msg);
+//
+//      AbstractPacketCodec codec = new SessionBrowserNextMessageResponseMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(response, codec);
+//      checkHeader(buffer, response);
+//      checkBody(buffer, StreamUtils.toBytes(msg));
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionBrowserNextMessageResponseMessage);
+//      SessionBrowserNextMessageResponseMessage decodedResponse = (SessionBrowserNextMessageResponseMessage) decodedPacket;
+//      assertEquals(SESS_BROWSER_NEXTMESSAGE_RESP, decodedResponse.getType());
+//      assertEquals(response.getMessage().getMessageID(), decodedResponse
+//            .getMessage().getMessageID());
+//   }
+//
+//   public void testBrowserNextMessageBlockRequest() throws Exception
+//   {
+//      SessionBrowserNextMessageBlockMessage request = new SessionBrowserNextMessageBlockMessage(
+//            randomLong());
+//
+//      AbstractPacketCodec codec = new SessionBrowserNextMessageBlockMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(request, codec);
+//      checkHeader(buffer, request);
+//      checkBody(buffer, request.getMaxMessages());
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionBrowserNextMessageBlockMessage);
+//      SessionBrowserNextMessageBlockMessage decodedRequest = (SessionBrowserNextMessageBlockMessage) decodedPacket;
+//      assertEquals(SESS_BROWSER_NEXTMESSAGEBLOCK, decodedPacket.getType());
+//      assertEquals(request.getMaxMessages(), decodedRequest.getMaxMessages());
+//   }
+//
+//   public void testBrowserNextMessageBlockResponse() throws Exception
+//   {
+//      Message[] messages = new Message[] { new MessageImpl(), new MessageImpl() };
+//      SessionBrowserNextMessageBlockResponseMessage response = new SessionBrowserNextMessageBlockResponseMessage(
+//            messages);
+//
+//      AbstractPacketCodec codec = new SessionBrowserNextMessageBlockResponseMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(response, codec);
+//      checkHeader(buffer, response);
+//      checkBody(buffer, messages.length, SessionBrowserNextMessageBlockResponseMessageCodec
+//            .encode(messages));
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionBrowserNextMessageBlockResponseMessage);
+//      SessionBrowserNextMessageBlockResponseMessage decodedResponse = (SessionBrowserNextMessageBlockResponseMessage) decodedPacket;
+//      assertEquals(SESS_BROWSER_NEXTMESSAGEBLOCK_RESP, decodedResponse.getType());
+//      assertEquals(response.getMessages()[0].getMessageID(), decodedResponse
+//            .getMessages()[0].getMessageID());
+//      assertEquals(response.getMessages()[1].getMessageID(), decodedResponse
+//            .getMessages()[1].getMessageID());
+//   }
+//
+//  
+//   public void testSesssionXACommitMessageOnePhase() throws Exception
+//   {
+//      this.testSessionXACommitMessage(true);
+//   }
+//   
+//   public void testSessionXACommitMessageNotOnePhase() throws Exception
+//   {
+//      this.testSessionXACommitMessage(false);
+//   }
+//   
+//   private void testSessionXACommitMessage(boolean onePhase) throws Exception
+//   {
+//      Xid xid = this.generateXid();
+//      SessionXACommitMessage message = new SessionXACommitMessage(xid, onePhase);
+//      AbstractPacketCodec codec = new SessionXACommitMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//      
+//      Packet decodedPacket = codec.decode(buffer);
+//      assertTrue(decodedPacket instanceof SessionXACommitMessage);
+//      SessionXACommitMessage decodedMessage = (SessionXACommitMessage)decodedPacket;
+//      assertEquals(SESS_XA_COMMIT, decodedMessage.getType());
+//      assertEquals(xid, decodedMessage.getXid());      
+//      assertEquals(onePhase, decodedMessage.isOnePhase());
+//   }
+//   
+//   public void testSessionXAEndMessageFailed() throws Exception
+//   {
+//      this.testSessionXAEndMessage(true);
+//   }
+//   
+//   public void testSessionXAEndMessageNotFailed() throws Exception
+//   {
+//      this.testSessionXACommitMessage(false);
+//   }
+//   
+//   private void testSessionXAEndMessage(boolean failed) throws Exception
+//   {
+//      Xid xid = this.generateXid();
+//      SessionXAEndMessage message = new SessionXAEndMessage(xid, failed);
+//      AbstractPacketCodec codec = new SessionXAEndMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//      
+//      Packet decodedPacket = codec.decode(buffer);
+//      assertTrue(decodedPacket instanceof SessionXAEndMessage);
+//      SessionXAEndMessage decodedMessage = (SessionXAEndMessage)decodedPacket;
+//      assertEquals(SESS_XA_END, decodedMessage.getType());
+//      assertEquals(xid, decodedMessage.getXid());      
+//      assertEquals(failed, decodedMessage.isFailed());
+//   }
+//   
+//   public void testSessionXAForgetMessage() throws Exception
+//   {
+//      Xid xid = this.generateXid();
+//      SessionXAForgetMessage message = new SessionXAForgetMessage(xid);
+//      AbstractPacketCodec codec = new SessionXAForgetMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//      
+//      Packet decodedPacket = codec.decode(buffer);
+//      assertTrue(decodedPacket instanceof SessionXAForgetMessage);
+//      SessionXAForgetMessage decodedMessage = (SessionXAForgetMessage)decodedPacket;
+//      assertEquals(SESS_XA_FORGET, decodedMessage.getType());
+//      assertEquals(xid, decodedMessage.getXid());      
+//   }
+//   
+//   public void testSessionXAGetInDoubtXidsMessage() throws Exception
+//   {
+//      PacketImpl request = new PacketImpl(SESS_XA_INDOUBT_XIDS);
+//
+//      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
+//            SESS_XA_INDOUBT_XIDS);
+//      SimpleRemotingBuffer buffer = encode(request, codec);
+//      checkHeader(buffer, request);
+//      checkBodyIsEmpty(buffer);
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertEquals(SESS_XA_INDOUBT_XIDS, decodedPacket.getType());            
+//   }
+//   
+//   public void testSessionGetInDoubtXidsResponse() throws Exception
+//   {
+//      final int numXids = 10;
+//      List<Xid> xids = new ArrayList<Xid>();
+//      for (int i = 0; i < numXids; i++)
+//      {
+//         xids.add(generateXid());
+//      }
+//      
+//      SessionXAGetInDoubtXidsResponseMessage message = new SessionXAGetInDoubtXidsResponseMessage(xids);
+//      AbstractPacketCodec codec = new SessionXAGetInDoubtXidsResponseMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//      
+//      Packet decodedPacket = codec.decode(buffer);
+//      assertTrue(decodedPacket instanceof SessionXAGetInDoubtXidsResponseMessage);
+//      SessionXAGetInDoubtXidsResponseMessage decodedMessage = (SessionXAGetInDoubtXidsResponseMessage)decodedPacket;
+//      assertEquals(SESS_XA_INDOUBT_XIDS_RESP, decodedMessage.getType());
+//           
+//      List<Xid> decodedXids = decodedMessage.getXids();
+//      assertNotNull(decodedXids);
+//      assertEquals(xids.size(), decodedXids.size());
+//      
+//      for (int i = 0; i < numXids; i++)
+//      {
+//         assertEquals(xids.get(i), decodedXids.get(i));
+//      }
+//   }
+//   
+//   public void testSessionXAGetTimeoutMessage() throws Exception
+//   {
+//      PacketImpl message = new PacketImpl(SESS_XA_GET_TIMEOUT);
+//
+//      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
+//            PacketType.SESS_XA_GET_TIMEOUT);
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      checkBodyIsEmpty(buffer);
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertEquals(SESS_XA_GET_TIMEOUT, decodedPacket.getType());     
+//   }
+//   
+//   public void testSessionXAGetTimeoutResponse() throws Exception
+//   {
+//      final int timeout = RandomUtil.randomInt();
+//      
+//      SessionXAGetTimeoutResponseMessage message = new SessionXAGetTimeoutResponseMessage(timeout);
+//      AbstractPacketCodec codec = new SessionXAGetTimeoutResponseMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//      
+//      Packet decodedPacket = codec.decode(buffer);
+//      assertTrue(decodedPacket instanceof SessionXAGetTimeoutResponseMessage);
+//      SessionXAGetTimeoutResponseMessage decodedMessage = (SessionXAGetTimeoutResponseMessage)decodedPacket;
+//      assertEquals(SESS_XA_GET_TIMEOUT_RESP, decodedMessage.getType());
+//           
+//      assertEquals(timeout, decodedMessage.getTimeoutSeconds());
+//   }
+//
+//   public void testSessionXAJoinMessage() throws Exception
+//   {
+//      Xid xid = this.generateXid();
+//      SessionXAJoinMessage message = new SessionXAJoinMessage(xid);
+//      AbstractPacketCodec codec = new SessionXAJoinMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//      
+//      Packet decodedPacket = codec.decode(buffer);
+//      assertTrue(decodedPacket instanceof SessionXAJoinMessage);
+//      SessionXAJoinMessage decodedMessage = (SessionXAJoinMessage)decodedPacket;
+//      assertEquals(SESS_XA_JOIN, decodedMessage.getType());
+//      assertEquals(xid, decodedMessage.getXid());      
+//   }
+//   
+//   public void testSessionXAPrepareMessage() throws Exception
+//   {
+//      Xid xid = this.generateXid();
+//      SessionXAPrepareMessage message = new SessionXAPrepareMessage(xid);
+//      AbstractPacketCodec codec = new SessionXAPrepareMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//      
+//      Packet decodedPacket = codec.decode(buffer);
+//      assertTrue(decodedPacket instanceof SessionXAPrepareMessage);
+//      SessionXAPrepareMessage decodedMessage = (SessionXAPrepareMessage)decodedPacket;
+//      assertEquals(SESS_XA_PREPARE, decodedMessage.getType());
+//      assertEquals(xid, decodedMessage.getXid());      
+//   }
+//   
+//   public void testSessionXAResponseErrorNullString() throws Exception
+//   {
+//      testSessionXAResponse(true, true);
+//   }
+//   
+//   public void testSessionXAResponseErrorNotNullString() throws Exception
+//   {
+//      testSessionXAResponse(true, false);
+//   }
+//   
+//   public void testSessionXAResponseNoErrorNullString() throws Exception
+//   {
+//      testSessionXAResponse(false, true);
+//   }
+//   
+//   public void testSessionXAResponseNoErrorNotNullString() throws Exception
+//   {
+//      testSessionXAResponse(false, false);
+//   }
+//   
+//   private void testSessionXAResponse(boolean error, boolean nullString) throws Exception
+//   {
+//      int responseCode = RandomUtil.randomInt();
+//      
+//      String str = nullString ? null : RandomUtil.randomString();
+//      
+//      SessionXAResponseMessage message = new SessionXAResponseMessage(error, responseCode, str);
+//      AbstractPacketCodec codec = new SessionXAResponseMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//      
+//      Packet decodedPacket = codec.decode(buffer);
+//      assertTrue(decodedPacket instanceof SessionXAResponseMessage);
+//      SessionXAResponseMessage decodedMessage = (SessionXAResponseMessage)decodedPacket;
+//      assertEquals(SESS_XA_RESP, decodedMessage.getType());
+//      assertEquals(error, decodedMessage.isError());
+//      assertEquals(responseCode, decodedMessage.getResponseCode());
+//      assertEquals(str, decodedMessage.getMessage());
+//   }
+//   
+//   public void testSessionXAResumeMessage() throws Exception
+//   {
+//      Xid xid = this.generateXid();
+//      SessionXAResumeMessage message = new SessionXAResumeMessage(xid);
+//      AbstractPacketCodec codec = new SessionXAResumeMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//      
+//      Packet decodedPacket = codec.decode(buffer);
+//      assertTrue(decodedPacket instanceof SessionXAResumeMessage);
+//      SessionXAResumeMessage decodedMessage = (SessionXAResumeMessage)decodedPacket;
+//      assertEquals(SESS_XA_RESUME, decodedMessage.getType());
+//      assertEquals(xid, decodedMessage.getXid());      
+//   }
+//   
+//   public void testSessionXARollbackMessage() throws Exception
+//   {
+//      Xid xid = this.generateXid();
+//      SessionXARollbackMessage message = new SessionXARollbackMessage(xid);
+//      AbstractPacketCodec codec = new SessionXARollbackMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//      
+//      Packet decodedPacket = codec.decode(buffer);
+//      assertTrue(decodedPacket instanceof SessionXARollbackMessage);
+//      SessionXARollbackMessage decodedMessage = (SessionXARollbackMessage)decodedPacket;
+//      assertEquals(SESS_XA_ROLLBACK, decodedMessage.getType());
+//      assertEquals(xid, decodedMessage.getXid());      
+//   }
+//   
+//   public void testSessionXASetTimeoutMessage() throws Exception
+//   {
+//      final int timeout = RandomUtil.randomInt();
+//      SessionXASetTimeoutMessage message = new SessionXASetTimeoutMessage(timeout);
+//      AbstractPacketCodec codec = new SessionXASetTimeoutMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//      
+//      Packet decodedPacket = codec.decode(buffer);
+//      assertTrue(decodedPacket instanceof SessionXASetTimeoutMessage);
+//      SessionXASetTimeoutMessage decodedMessage = (SessionXASetTimeoutMessage)decodedPacket;
+//      assertEquals(SESS_XA_SET_TIMEOUT, decodedMessage.getType());
+//      assertEquals(timeout, decodedMessage.getTimeoutSeconds());      
+//   }
+//   
+//   public void testSessionXASetTimeoutResponseMessageOK() throws Exception
+//   {
+//      testSessionXASetTimeoutResponseMessage(true);
+//   }
+//   
+//   public void testSessionXASetTimeoutResponseMessageNotOK() throws Exception
+//   {
+//      testSessionXASetTimeoutResponseMessage(false);
+//   }
+//   
+//   private void testSessionXASetTimeoutResponseMessage(boolean ok) throws Exception
+//   {
+//      final int timeout = RandomUtil.randomInt();
+//      SessionXASetTimeoutResponseMessage message = new SessionXASetTimeoutResponseMessage(ok);
+//      AbstractPacketCodec codec = new SessionXASetTimeoutResponseMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//      
+//      Packet decodedPacket = codec.decode(buffer);
+//      assertTrue(decodedPacket instanceof SessionXASetTimeoutResponseMessage);
+//      SessionXASetTimeoutResponseMessage decodedMessage = (SessionXASetTimeoutResponseMessage)decodedPacket;
+//      assertEquals(SESS_XA_SET_TIMEOUT_RESP, decodedMessage.getType());
+//      assertEquals(ok, decodedMessage.isOK());      
+//   }
+//   
+//   public void testSessionXAStartMessage() throws Exception
+//   {
+//      Xid xid = this.generateXid();
+//      SessionXAStartMessage message = new SessionXAStartMessage(xid);
+//      AbstractPacketCodec codec = new SessionXAStartMessageCodec();
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//      
+//      Packet decodedPacket = codec.decode(buffer);
+//      assertTrue(decodedPacket instanceof SessionXAStartMessage);
+//      SessionXAStartMessage decodedMessage = (SessionXAStartMessage)decodedPacket;
+//      assertEquals(SESS_XA_START, decodedMessage.getType());
+//      assertEquals(xid, decodedMessage.getXid());      
+//   }
+//   
+//   public void testSessionXASuspendMessage() throws Exception
+//   {
+//      PacketImpl message = new PacketImpl(SESS_XA_SUSPEND);
+//
+//      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
+//            PacketType.SESS_XA_SUSPEND);
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      checkBodyIsEmpty(buffer);
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertEquals(SESS_XA_SUSPEND, decodedPacket.getType());     
+//   }
+//   
+//   
+//   public void testSessionRemoveAddressMessage() throws Exception
+//   {
+//      SessionRemoveDestinationMessage message = new SessionRemoveDestinationMessage(randomString(), true);
+//
+//      AbstractPacketCodec codec = new SessionRemoveDestinationMessageCodec();
+//      
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionRemoveDestinationMessage);
+//      SessionRemoveDestinationMessage decodedMessage = (SessionRemoveDestinationMessage)decodedPacket;
+//      assertEquals(SESS_REMOVE_DESTINATION, decodedMessage.getType());
+//      
+//      assertEquals(message.getAddress(), decodedMessage.getAddress());
+//      assertEquals(message.isTemporary(), decodedMessage.isTemporary());
+//            
+//   }
+//   
+//   public void testSessionCreateQueueRequest() throws Exception
+//   {
+//      SessionCreateQueueMessage message = new SessionCreateQueueMessage(randomString(), randomString(), randomString(), true, true);
+//
+//      AbstractPacketCodec codec = new SessionCreateQueueMessageCodec();
+//      
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionCreateQueueMessage);
+//      SessionCreateQueueMessage decodedMessage = (SessionCreateQueueMessage)decodedPacket;
+//      assertEquals(SESS_CREATEQUEUE, decodedMessage.getType());
+//      
+//      assertEquals(message.getAddress(), decodedMessage.getAddress());
+//      assertEquals(message.getQueueName(), decodedMessage.getQueueName());
+//      assertEquals(message.getFilterString(), decodedMessage.getFilterString());
+//      assertEquals(message.isDurable(), decodedMessage.isDurable());
+//      assertEquals(message.isTemporary(), decodedMessage.isDurable());
+//            
+//   }
+//   
+//   public void testSessionQueueQueryRequest() throws Exception
+//   {
+//      SessionQueueQueryMessage message = new SessionQueueQueryMessage(randomString());
+//
+//      AbstractPacketCodec codec = new SessionQueueQueryMessageCodec();
+//      
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionQueueQueryMessage);
+//      SessionQueueQueryMessage decodedMessage = (SessionQueueQueryMessage)decodedPacket;
+//      assertEquals(SESS_QUEUEQUERY, decodedMessage.getType());
+//      
+//      assertEquals(message.getQueueName(), decodedMessage.getQueueName());            
+//   }
+//   
+//   public void testSessionQueueQueryResponse() throws Exception
+//   {
+//      SessionQueueQueryResponseMessage message = new SessionQueueQueryResponseMessage(true, true, randomInt(), randomInt(), randomInt(),
+//                                                          randomString(), randomString());
+//
+//      AbstractPacketCodec codec = new SessionQueueQueryResponseMessageCodec();
+//      
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionQueueQueryResponseMessage);
+//      SessionQueueQueryResponseMessage decodedMessage = (SessionQueueQueryResponseMessage)decodedPacket;
+//      assertEquals(SESS_QUEUEQUERY_RESP, decodedMessage.getType());
+//      
+//      assertEquals(message.isExists(), decodedMessage.isExists());
+//      assertEquals(message.isDurable(), decodedMessage.isDurable());
+//      assertEquals(message.isTemporary(), decodedMessage.isTemporary());
+//      assertEquals(message.getConsumerCount(), decodedMessage.getConsumerCount());
+//      assertEquals(message.getMessageCount(), decodedMessage.getMessageCount());
+//      assertEquals(message.getFilterString(), decodedMessage.getFilterString());
+//      assertEquals(message.getAddress(), decodedMessage.getAddress());         
+//   }
+//   
+//   public void testSessionAddAddressMessage() throws Exception
+//   {
+//      SessionAddDestinationMessage message = new SessionAddDestinationMessage(randomString(), true);
+//
+//      AbstractPacketCodec<SessionAddDestinationMessage> codec = new SessionAddDestinationMessageCodec();
+//      
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionAddDestinationMessage);
+//      SessionAddDestinationMessage decodedMessage = (SessionAddDestinationMessage)decodedPacket;
+//      assertEquals(SESS_ADD_DESTINATION, decodedMessage.getType());
+//      
+//      assertEquals(message.getAddress(), decodedMessage.getAddress());      
+//      assertEquals(message.isTemporary(), decodedMessage.isTemporary());
+//   }
+//   
+//   public void testSessionBindingQueryMessage() throws Exception
+//   {
+//      SessionBindingQueryMessage message = new SessionBindingQueryMessage(randomString());
+//
+//      AbstractPacketCodec codec = new SessionBindingQueryMessageCodec();
+//      
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionBindingQueryMessage);
+//      SessionBindingQueryMessage decodedMessage = (SessionBindingQueryMessage)decodedPacket;
+//      assertEquals(SESS_BINDINGQUERY, decodedMessage.getType());
+//      
+//      assertEquals(message.getAddress(), decodedMessage.getAddress());        
+//   }
+//   
+//   public void testSessionBindingQueryResponseMessage() throws Exception
+//   {
+//      boolean exists = true;
+//      List<String> queueNames = new ArrayList<String>();
+//      queueNames.add(randomString());
+//      queueNames.add(randomString());
+//      queueNames.add(randomString());
+//      SessionBindingQueryResponseMessage message = new SessionBindingQueryResponseMessage(exists, queueNames);
+//
+//      AbstractPacketCodec codec = new SessionBindingQueryResponseMessageCodec();
+//      
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionBindingQueryResponseMessage);
+//      SessionBindingQueryResponseMessage decodedMessage = (SessionBindingQueryResponseMessage)decodedPacket;
+//      assertEquals(SESS_BINDINGQUERY_RESP, decodedMessage.getType());
+//      
+//      assertEquals(message.isExists(), decodedMessage.isExists());
+//      
+//      List<String> decodedNames = decodedMessage.getQueueNames();
+//      assertEquals(queueNames.size(), decodedNames.size());
+//      for (int i = 0; i < queueNames.size(); i++)
+//      {
+//         assertEquals(queueNames.get(i), decodedNames.get(i));
+//      }
+//   }
+//   
+//   
+//   public void testDeleteQueueRequest() throws Exception
+//   {
+//      SessionDeleteQueueMessage message = new SessionDeleteQueueMessage(randomString());
+//
+//      AbstractPacketCodec codec = new SessionDeleteQueueMessageCodec();
+//      
+//      SimpleRemotingBuffer buffer = encode(message, codec);
+//      checkHeader(buffer, message);
+//      buffer.rewind();
+//
+//      Packet decodedPacket = codec.decode(buffer);
+//
+//      assertTrue(decodedPacket instanceof SessionDeleteQueueMessage);
+//      SessionDeleteQueueMessage decodedMessage = (SessionDeleteQueueMessage)decodedPacket;
+//      assertEquals(SESS_DELETE_QUEUE, decodedMessage.getType());
+//      
+//      assertEquals(message.getQueueName(), decodedMessage.getQueueName());        
+//   }
+//   
+//   
    
-   public void testBytesPacket() throws Exception
-   {
-      BytesPacket packet = new BytesPacket(randomBytes());
+   // Package protected ---------------------------------------------
 
-      AbstractPacketCodec codec = new BytesPacketCodec();
-      SimpleRemotingBuffer buffer = encode(packet, codec);
-      checkHeader(buffer, packet);
-      checkBody(buffer, packet.getBytes());
-      buffer.rewind();
+   // Protected -----------------------------------------------------
 
-      Packet decodedPacket = codec.decode(buffer);
+   // Private -------------------------------------------------------
 
-      assertTrue(decodedPacket instanceof BytesPacket);
-      BytesPacket p = (BytesPacket) decodedPacket;
-
-      assertEquals(BYTES, p.getType());
-      CodecAssert.assertEqualsByteArrays(packet.getBytes(), p.getBytes());
-   }
-   
-   public void testCreateConnectionRequest() throws Exception
+   private RemotingBuffer encode(final Packet packet, final AbstractPacketCodec codec) throws Exception
    {
-      int version = randomInt();
-      long remotingSessionID = randomLong();
-      String clientVMID = randomString();
-      String username = null;
-      String password = null;
-
-      CreateConnectionRequest request = new CreateConnectionRequest(version,
-            remotingSessionID, clientVMID, username, password);
-
-      AbstractPacketCodec<CreateConnectionRequest> codec = new CreateConnectionMessageCodec();
-      SimpleRemotingBuffer buffer = encode(request, codec);
-      checkHeader(buffer, request);
-      checkBody(buffer, version, remotingSessionID, clientVMID, username, password);
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof CreateConnectionRequest);
-      CreateConnectionRequest decodedRequest = (CreateConnectionRequest) decodedPacket;
-
-      assertEquals(CREATECONNECTION, decodedPacket.getType());
-      assertEquals(request.getVersion(), decodedRequest.getVersion());
-      assertEquals(request.getRemotingSessionID(), decodedRequest
-            .getRemotingSessionID());
-      assertEquals(request.getClientVMID(), decodedRequest.getClientVMID());
-      assertEquals(request.getUsername(), decodedRequest.getUsername());
-      assertEquals(request.getPassword(), decodedRequest.getPassword());
+   	SimpleProtocolEncoderOutput out = new SimpleProtocolEncoderOutput();
+   	
+   	codec.encode(packet, out);
+   	
+   	Object encodedMessage = out.getEncodedMessage();
+   	
+   	assertNotNull(encodedMessage);
+   	
+   	log.info("encoded message is " + encodedMessage);
+   	
+   	assertTrue(encodedMessage instanceof IoBuffer);
+   	
+   	RemotingBuffer buff = new BufferWrapper((IoBuffer)encodedMessage);
+   	
+   	return buff;
    }
-
-   public void testCreateConnectionResponse() throws Exception
-   {
-      CreateConnectionResponse response = new CreateConnectionResponse(randomLong());
-
-      AbstractPacketCodec<CreateConnectionResponse> codec = new CreateConnectionResponseMessageCodec();
-      SimpleRemotingBuffer buffer = encode(response, codec);
-      checkHeader(buffer, response);
-      checkBody(buffer, response.getConnectionTargetID());
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof CreateConnectionResponse);
-      CreateConnectionResponse decodedResponse = (CreateConnectionResponse) decodedPacket;
-      assertEquals(CREATECONNECTION_RESP, decodedResponse.getType());
-      assertEquals(response.getConnectionTargetID(), decodedResponse.getConnectionTargetID());
-   }
-
-   public void testCreateSessionRequest() throws Exception
-   {
-      //TODO test this more thoroughly
-      
-      ConnectionCreateSessionMessage request = new ConnectionCreateSessionMessage(true, true, true);
-
-      AbstractPacketCodec codec = new ConnectionCreateSessionMessageCodec();
-      SimpleRemotingBuffer buffer = encode(request, codec);
-      checkHeader(buffer, request);
-      checkBody(buffer, request.isXA(), request.isAutoCommitSends(), request.isAutoCommitAcks());
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof ConnectionCreateSessionMessage);
-      ConnectionCreateSessionMessage decodedRequest = (ConnectionCreateSessionMessage) decodedPacket;
-      assertEquals(CONN_CREATESESSION, decodedRequest.getType());
-      assertEquals(request.isXA(), decodedRequest.isXA());
-      assertEquals(request.isAutoCommitSends(), decodedRequest.isAutoCommitSends());
-      assertEquals(request.isAutoCommitAcks(), decodedRequest.isAutoCommitAcks());
-      assertEquals(request.isXA(), decodedRequest.isXA());
-   }
-
-   public void testCreateSessionResponse() throws Exception
-   {
-      ConnectionCreateSessionResponseMessage response = new ConnectionCreateSessionResponseMessage(randomLong());
-
-      AbstractPacketCodec codec = new ConnectionCreateSessionResponseMessageCodec();
-      SimpleRemotingBuffer buffer = encode(response, codec);
-      checkHeader(buffer, response);
-      checkBody(buffer, response.getSessionID());
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof ConnectionCreateSessionResponseMessage);
-      ConnectionCreateSessionResponseMessage decodedResponse = (ConnectionCreateSessionResponseMessage) decodedPacket;
-      assertEquals(CONN_CREATESESSION_RESP, decodedResponse.getType());
-      assertEquals(response.getSessionID(), decodedResponse.getSessionID());
-   }
-
-   public void testSendMessage() throws Exception
-   {
-      ProducerSendMessage packet = new ProducerSendMessage(randomString(), new MessageImpl());
-
-      AbstractPacketCodec codec = new ProducerSendMessageCodec();
-      SimpleRemotingBuffer buffer = encode(packet, codec);
-      checkHeader(buffer, packet);
-      checkBody(buffer, packet.getAddress(), StreamUtils.toBytes(packet.getMessage()));
-      buffer.rewind();
-
-      Packet p = codec.decode(buffer);
-
-      assertTrue(p instanceof ProducerSendMessage);
-      ProducerSendMessage decodedPacket = (ProducerSendMessage) p;
-      assertEquals(PROD_SEND, decodedPacket.getType());
-      assertEquals(packet.getAddress(), decodedPacket.getAddress());
-      assertEquals(packet.getMessage().getMessageID(), decodedPacket
-            .getMessage().getMessageID());
-   }
-
-   public void testCreateConsumerRequest() throws Exception
-   {      
-      String destination = "queue.testCreateConsumerRequest";
-      SessionCreateConsumerMessage request = new SessionCreateConsumerMessage(destination,
-            "color = 'red'", false, false, randomInt(), randomInt());
-
-      AbstractPacketCodec codec = new SessionCreateConsumerMessageCodec();
-      SimpleRemotingBuffer buffer = encode(request, codec);
-      checkHeader(buffer, request);
-      checkBody(buffer, request.getQueueName(), request
-            .getFilterString(), request.isNoLocal(), request.isAutoDeleteQueue(), request.getWindowSize(), request.getMaxRate());
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionCreateConsumerMessage);
-      SessionCreateConsumerMessage decodedRequest = (SessionCreateConsumerMessage) decodedPacket;
-      assertEquals(SESS_CREATECONSUMER, decodedRequest.getType());
-      assertEquals(request.getQueueName(), decodedRequest.getQueueName());
-      assertEquals(request.getFilterString(), decodedRequest.getFilterString());
-      assertEquals(request.isNoLocal(), decodedRequest.isNoLocal());
-      assertEquals(request.isAutoDeleteQueue(), decodedRequest.isAutoDeleteQueue());
-      assertEquals(request.getWindowSize(), decodedRequest.getWindowSize());
-      assertEquals(request.getMaxRate(), decodedRequest.getMaxRate());
-   }
-
-   public void testCreateConsumerResponse() throws Exception
-   {
-      SessionCreateConsumerResponseMessage response =
-      	new SessionCreateConsumerResponseMessage(randomLong(), randomInt());
-
-      AbstractPacketCodec codec = new SessionCreateConsumerResponseMessageCodec();
-      SimpleRemotingBuffer buffer = encode(response, codec);
-      checkHeader(buffer, response);
-      checkBody(buffer, response.getConsumerTargetID(), response.getWindowSize());
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionCreateConsumerResponseMessage);
-      SessionCreateConsumerResponseMessage decodedResponse = (SessionCreateConsumerResponseMessage) decodedPacket;
-      assertEquals(SESS_CREATECONSUMER_RESP, decodedResponse.getType());
-      
-      assertEquals(response.getConsumerTargetID(), decodedResponse.getConsumerTargetID());
-      assertEquals(response.getWindowSize(), decodedResponse.getWindowSize());
-   }
    
-   public void testCreateProducerRequest() throws Exception
-   {      
-      String destination = "queue.testCreateProducerRequest";
-      int windowSize = randomInt();
-      int maxRate = randomInt();
-      SessionCreateProducerMessage request = new SessionCreateProducerMessage(destination, windowSize, maxRate);
-
-      AbstractPacketCodec codec = new SessionCreateProducerMessageCodec();
-      SimpleRemotingBuffer buffer = encode(request, codec);
-      checkHeader(buffer, request);
-      checkBody(buffer, request.getAddress(), request.getWindowSize(), request.getMaxRate());
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionCreateProducerMessage);
-      SessionCreateProducerMessage decodedRequest = (SessionCreateProducerMessage) decodedPacket;
-      assertEquals(SESS_CREATEPRODUCER, decodedRequest.getType());
-      assertEquals(request.getAddress(), decodedRequest.getAddress());
-      assertEquals(request.getWindowSize(), decodedRequest.getWindowSize());
-      assertEquals(request.getMaxRate(), decodedRequest.getMaxRate());
-   }
-   
-   public void testCreateProducerResponse() throws Exception
+   private Packet decode(final RemotingBuffer buffer, final AbstractPacketCodec codec, final int len) throws Exception
    {
-      SessionCreateProducerResponseMessage response =
-      	new SessionCreateProducerResponseMessage(randomLong(), randomInt(), randomInt());
-
-      AbstractPacketCodec codec = new SessionCreateProducerResponseMessageCodec();
-      SimpleRemotingBuffer buffer = encode(response, codec);
-      checkHeader(buffer, response);
-      checkBody(buffer, response.getProducerTargetID(), response.getWindowSize(), response.getMaxRate());
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionCreateProducerResponseMessage);
-      SessionCreateProducerResponseMessage decodedResponse = (SessionCreateProducerResponseMessage) decodedPacket;
-      assertEquals(SESS_CREATEPRODUCER_RESP, decodedResponse.getType());
-      assertEquals(response.getProducerTargetID(), decodedResponse.getProducerTargetID());
-      assertEquals(response.getWindowSize(), decodedResponse.getWindowSize());
-      assertEquals(response.getMaxRate(), decodedResponse.getMaxRate());
+   	SimpleProtocolDencoderOutput out = new SimpleProtocolDencoderOutput();
+   	
+   	int length = buffer.getInt();
+   	
+   	assertEquals(len + HEADER_LENGTH, length);
+   	
+   	byte type = buffer.get();
+   	
+   	assertEquals(codec.getType().byteValue(), type);
+   	
+   	codec.decode(buffer, out);
+   	
+   	Object message = out.getMessage();
+   	
+   	assertNotNull(message);
+   	
+   	assertTrue(message instanceof Packet);
+   	
+   	return (Packet)message;	
    }
-
-   public void testStartConnectionMessage() throws Exception
-   {
-      PacketImpl packet = new PacketImpl(CONN_START);
-
-      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
-            CONN_START);
-      SimpleRemotingBuffer buffer = encode(packet, codec);
-      checkHeader(buffer, packet);
-      checkBodyIsEmpty(buffer);
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertEquals(CONN_START, decodedPacket.getType());
-   }
-
-   public void testStopConnectionMessage() throws Exception
-   {
-      PacketImpl packet = new PacketImpl(CONN_STOP);
-
-      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
-            CONN_STOP);
-      SimpleRemotingBuffer buffer = encode(packet, codec);
-      checkHeader(buffer, packet);
-      checkBodyIsEmpty(buffer);
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertEquals(CONN_STOP, decodedPacket.getType());
-   }
-
-   public void testConsumerFlowTokenMessage() throws Exception
-   {
-      ConsumerFlowTokenMessage message = new ConsumerFlowTokenMessage(10);
-      AbstractPacketCodec codec = new ConsumerFlowTokenMessageCodec();
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      checkBody(buffer, message.getTokens());
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof ConsumerFlowTokenMessage);
-      ConsumerFlowTokenMessage decodedMessage = (ConsumerFlowTokenMessage) decodedPacket;
-      assertEquals(CONS_FLOWTOKEN, decodedMessage.getType());
-      assertEquals(message.getTokens(), decodedMessage.getTokens());
-   }
    
-   public void testProducerReceiveTokensMessage() throws Exception
+   private class SimpleProtocolEncoderOutput implements ProtocolEncoderOutput
    {
-   	ProducerReceiveTokensMessage message = new ProducerReceiveTokensMessage(10);
-      AbstractPacketCodec codec = new ProducerReceiveTokensMessageCodec();
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      checkBody(buffer, message.getTokens());
-      buffer.rewind();
+   	private Object encodedMessage;
+   	
+		public WriteFuture flush()
+		{
+			return null;
+		}
 
-      Packet decodedPacket = codec.decode(buffer);
+		public void mergeAll()
+		{
+		}
 
-      assertTrue(decodedPacket instanceof ProducerReceiveTokensMessage);
-      ProducerReceiveTokensMessage decodedMessage = (ProducerReceiveTokensMessage) decodedPacket;
-      assertEquals(PacketType.PROD_RECEIVETOKENS, decodedMessage.getType());
-      assertEquals(message.getTokens(), decodedMessage.getTokens());
+		public void write(Object encodedMessage)
+		{
+			this.encodedMessage = encodedMessage;
+		}
+		
+		public Object getEncodedMessage()
+		{
+			return this.encodedMessage;
+		}
+   	
    }
-
-   public void testDeliverMessage() throws Exception
-   {
-      Message msg = new MessageImpl();
-      ConsumerDeliverMessage message = new ConsumerDeliverMessage(msg, randomLong());
-
-      AbstractPacketCodec codec = new ConsumerDeliverMessageCodec();
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      checkBody(buffer, StreamUtils.toBytes(msg), message.getDeliveryID());
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof ConsumerDeliverMessage);
-      ConsumerDeliverMessage decodedMessage = (ConsumerDeliverMessage) decodedPacket;
-      assertEquals(CONS_DELIVER, decodedMessage.getType());
-      assertEquals(message.getMessage().getMessageID(), decodedMessage
-            .getMessage().getMessageID());
-      assertEquals(message.getDeliveryID(), decodedMessage.getDeliveryID());
-   }
-
-   public void testSessionAcknowledgeMessage() throws Exception
-   {
-      SessionAcknowledgeMessage message = new SessionAcknowledgeMessage(
-            randomLong(), true);
-
-      AbstractPacketCodec codec = new SessionAcknowledgeMessageCodec();
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      checkBody(buffer, message.getDeliveryID(), message.isAllUpTo());
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionAcknowledgeMessage);
-      SessionAcknowledgeMessage decodedMessage = (SessionAcknowledgeMessage) decodedPacket;
-      assertEquals(SESS_ACKNOWLEDGE, decodedMessage.getType());
-      assertEquals(message.getDeliveryID(), decodedMessage.getDeliveryID());
-      assertEquals(message.isAllUpTo(), decodedMessage.isAllUpTo());
-   }
-
-   public void testSessionCancelMessage() throws Exception
-   {
-      SessionCancelMessage message = new SessionCancelMessage(randomLong(),
-            true);
-
-      AbstractPacketCodec codec = new SessionCancelMessageCodec();
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      checkBody(buffer, message.getDeliveryID(), message.isExpired());
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionCancelMessage);
-      SessionCancelMessage decodedMessage = (SessionCancelMessage) decodedPacket;
-      assertEquals(SESS_CANCEL, decodedMessage.getType());
-      assertEquals(message.getDeliveryID(), decodedMessage.getDeliveryID());
-      assertEquals(message.isExpired(), decodedMessage.isExpired());
-   }
-
-   public void testSessionCommitMessage() throws Exception
-   {
-      PacketImpl message = new PacketImpl(SESS_COMMIT);
-
-      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
-            SESS_COMMIT);
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      checkBodyIsEmpty(buffer);
-
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertEquals(SESS_COMMIT, decodedPacket.getType());
-   }
-
-   public void testSessionRollbackMessage() throws Exception
-   {
-      PacketImpl message = new PacketImpl(SESS_ROLLBACK);
-
-      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
-            SESS_ROLLBACK);
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      checkBodyIsEmpty(buffer);
-
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertEquals(SESS_ROLLBACK, decodedPacket.getType());
-   }
    
-   public void testSessionRecoverMessage() throws Exception
+   private class SimpleProtocolDencoderOutput implements ProtocolDecoderOutput
    {
-      PacketImpl message = new PacketImpl(SESS_RECOVER);
+   	private Object message;
 
-      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
-            SESS_RECOVER);
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      checkBodyIsEmpty(buffer);
+		public void flush()
+		{
+		}
 
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertEquals(SESS_RECOVER, decodedPacket.getType());
+		public void write(Object message)
+		{	
+			this.message = message;
+		}
+   	
+		public Object getMessage()
+		{
+			return message;
+		}
+   	
    }
 
-   public void testCloseMessage() throws Exception
-   {
-      PacketImpl message = new PacketImpl(CLOSE);
-
-      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
-            CLOSE);
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      checkBodyIsEmpty(buffer);
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertEquals(CLOSE, decodedPacket.getType());
-   }
-
-
-   public void testCreateBrowserRequest() throws Exception
-   {
-      String destination = "queue.testCreateBrowserRequest";
-      SessionCreateBrowserMessage request = new SessionCreateBrowserMessage(destination,
-            "color = 'red'");
-
-      AbstractPacketCodec codec = new SessionCreateBrowserMessageCodec();
-      SimpleRemotingBuffer buffer = encode(request, codec);
-      checkHeader(buffer, request);
-      checkBody(buffer, request.getQueueName(), request.getFilterString());
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionCreateBrowserMessage);
-      SessionCreateBrowserMessage decodedRequest = (SessionCreateBrowserMessage) decodedPacket;
-      assertEquals(SESS_CREATEBROWSER, decodedRequest.getType());
-      assertEquals(request.getQueueName(), decodedRequest.getQueueName());
-      assertEquals(request.getFilterString(), decodedRequest.getFilterString());
-   }
-
-   public void testCreateBrowserResponse() throws Exception
-   {
-      SessionCreateBrowserResponseMessage response = new SessionCreateBrowserResponseMessage(randomLong());
-
-      AbstractPacketCodec codec = new SessionCreateBrowserResponseMessageCodec();
-      SimpleRemotingBuffer buffer = encode(response, codec);
-      checkHeader(buffer, response);
-      checkBody(buffer, response.getBrowserTargetID());
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionCreateBrowserResponseMessage);
-      SessionCreateBrowserResponseMessage decodedResponse = (SessionCreateBrowserResponseMessage) decodedPacket;
-      assertEquals(SESS_CREATEBROWSER_RESP, decodedResponse.getType());
-      assertEquals(response.getBrowserTargetID(), decodedResponse.getBrowserTargetID());
-   }
-
-   public void testBrowserResetMessage() throws Exception
-   {
-      PacketImpl message = new PacketImpl(SESS_BROWSER_RESET);
-
-      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
-            SESS_BROWSER_RESET);
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      checkBodyIsEmpty(buffer);
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertEquals(SESS_BROWSER_RESET, decodedPacket.getType());
-   }
-
-   public void testBrowserHasNextMessageRequest() throws Exception
-   {
-      PacketImpl request = new PacketImpl(SESS_BROWSER_HASNEXTMESSAGE);
-
-      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
-            SESS_BROWSER_HASNEXTMESSAGE);
-      SimpleRemotingBuffer buffer = encode(request, codec);
-      checkHeader(buffer, request);
-      checkBodyIsEmpty(buffer);
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertEquals(SESS_BROWSER_HASNEXTMESSAGE, decodedPacket.getType());
-   }
-
-   public void testBrowserHasNextMessageResponse() throws Exception
-   {
-      SessionBrowserHasNextMessageResponseMessage response = new SessionBrowserHasNextMessageResponseMessage(
-            false);
-      AbstractPacketCodec codec = new SessionBrowserHasNextMessageResponseMessageCodec();
-      SimpleRemotingBuffer buffer = encode(response, codec);
-      checkHeader(buffer, response);
-      checkBody(buffer, response.hasNext());
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionBrowserHasNextMessageResponseMessage);
-      SessionBrowserHasNextMessageResponseMessage decodedResponse = (SessionBrowserHasNextMessageResponseMessage) decodedPacket;
-      assertEquals(SESS_BROWSER_HASNEXTMESSAGE_RESP, decodedResponse.getType());
-      assertEquals(response.hasNext(), decodedResponse.hasNext());
-   }
-
-   public void testBrowserNextMessageRequest() throws Exception
-   {
-      PacketImpl request = new PacketImpl(SESS_BROWSER_NEXTMESSAGE);
-
-      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
-            SESS_BROWSER_NEXTMESSAGE);
-      SimpleRemotingBuffer buffer = encode(request, codec);
-      checkHeader(buffer, request);
-      checkBodyIsEmpty(buffer);
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertEquals(SESS_BROWSER_NEXTMESSAGE, decodedPacket.getType());
-   }
-
-   public void testBrowserNextMessageResponse() throws Exception
-   {
-      Message msg = new MessageImpl();
-      SessionBrowserNextMessageResponseMessage response = new SessionBrowserNextMessageResponseMessage(msg);
-
-      AbstractPacketCodec codec = new SessionBrowserNextMessageResponseMessageCodec();
-      SimpleRemotingBuffer buffer = encode(response, codec);
-      checkHeader(buffer, response);
-      checkBody(buffer, StreamUtils.toBytes(msg));
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionBrowserNextMessageResponseMessage);
-      SessionBrowserNextMessageResponseMessage decodedResponse = (SessionBrowserNextMessageResponseMessage) decodedPacket;
-      assertEquals(SESS_BROWSER_NEXTMESSAGE_RESP, decodedResponse.getType());
-      assertEquals(response.getMessage().getMessageID(), decodedResponse
-            .getMessage().getMessageID());
-   }
-
-   public void testBrowserNextMessageBlockRequest() throws Exception
-   {
-      SessionBrowserNextMessageBlockMessage request = new SessionBrowserNextMessageBlockMessage(
-            randomLong());
-
-      AbstractPacketCodec codec = new SessionBrowserNextMessageBlockMessageCodec();
-      SimpleRemotingBuffer buffer = encode(request, codec);
-      checkHeader(buffer, request);
-      checkBody(buffer, request.getMaxMessages());
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionBrowserNextMessageBlockMessage);
-      SessionBrowserNextMessageBlockMessage decodedRequest = (SessionBrowserNextMessageBlockMessage) decodedPacket;
-      assertEquals(SESS_BROWSER_NEXTMESSAGEBLOCK, decodedPacket.getType());
-      assertEquals(request.getMaxMessages(), decodedRequest.getMaxMessages());
-   }
-
-   public void testBrowserNextMessageBlockResponse() throws Exception
-   {
-      Message[] messages = new Message[] { new MessageImpl(), new MessageImpl() };
-      SessionBrowserNextMessageBlockResponseMessage response = new SessionBrowserNextMessageBlockResponseMessage(
-            messages);
-
-      AbstractPacketCodec codec = new SessionBrowserNextMessageBlockResponseMessageCodec();
-      SimpleRemotingBuffer buffer = encode(response, codec);
-      checkHeader(buffer, response);
-      checkBody(buffer, messages.length, SessionBrowserNextMessageBlockResponseMessageCodec
-            .encode(messages));
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionBrowserNextMessageBlockResponseMessage);
-      SessionBrowserNextMessageBlockResponseMessage decodedResponse = (SessionBrowserNextMessageBlockResponseMessage) decodedPacket;
-      assertEquals(SESS_BROWSER_NEXTMESSAGEBLOCK_RESP, decodedResponse.getType());
-      assertEquals(response.getMessages()[0].getMessageID(), decodedResponse
-            .getMessages()[0].getMessageID());
-      assertEquals(response.getMessages()[1].getMessageID(), decodedResponse
-            .getMessages()[1].getMessageID());
-   }
-
-  
-   public void testSesssionXACommitMessageOnePhase() throws Exception
-   {
-      this.testSessionXACommitMessage(true);
-   }
-   
-   public void testSessionXACommitMessageNotOnePhase() throws Exception
-   {
-      this.testSessionXACommitMessage(false);
-   }
-   
-   private void testSessionXACommitMessage(boolean onePhase) throws Exception
-   {
-      Xid xid = this.generateXid();
-      SessionXACommitMessage message = new SessionXACommitMessage(xid, onePhase);
-      AbstractPacketCodec codec = new SessionXACommitMessageCodec();
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-      
-      Packet decodedPacket = codec.decode(buffer);
-      assertTrue(decodedPacket instanceof SessionXACommitMessage);
-      SessionXACommitMessage decodedMessage = (SessionXACommitMessage)decodedPacket;
-      assertEquals(SESS_XA_COMMIT, decodedMessage.getType());
-      assertEquals(xid, decodedMessage.getXid());      
-      assertEquals(onePhase, decodedMessage.isOnePhase());
-   }
-   
-   public void testSessionXAEndMessageFailed() throws Exception
-   {
-      this.testSessionXAEndMessage(true);
-   }
-   
-   public void testSessionXAEndMessageNotFailed() throws Exception
-   {
-      this.testSessionXACommitMessage(false);
-   }
-   
-   private void testSessionXAEndMessage(boolean failed) throws Exception
-   {
-      Xid xid = this.generateXid();
-      SessionXAEndMessage message = new SessionXAEndMessage(xid, failed);
-      AbstractPacketCodec codec = new SessionXAEndMessageCodec();
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-      
-      Packet decodedPacket = codec.decode(buffer);
-      assertTrue(decodedPacket instanceof SessionXAEndMessage);
-      SessionXAEndMessage decodedMessage = (SessionXAEndMessage)decodedPacket;
-      assertEquals(SESS_XA_END, decodedMessage.getType());
-      assertEquals(xid, decodedMessage.getXid());      
-      assertEquals(failed, decodedMessage.isFailed());
-   }
-   
-   public void testSessionXAForgetMessage() throws Exception
-   {
-      Xid xid = this.generateXid();
-      SessionXAForgetMessage message = new SessionXAForgetMessage(xid);
-      AbstractPacketCodec codec = new SessionXAForgetMessageCodec();
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-      
-      Packet decodedPacket = codec.decode(buffer);
-      assertTrue(decodedPacket instanceof SessionXAForgetMessage);
-      SessionXAForgetMessage decodedMessage = (SessionXAForgetMessage)decodedPacket;
-      assertEquals(SESS_XA_FORGET, decodedMessage.getType());
-      assertEquals(xid, decodedMessage.getXid());      
-   }
-   
-   public void testSessionXAGetInDoubtXidsMessage() throws Exception
-   {
-      PacketImpl request = new PacketImpl(SESS_XA_INDOUBT_XIDS);
-
-      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
-            SESS_XA_INDOUBT_XIDS);
-      SimpleRemotingBuffer buffer = encode(request, codec);
-      checkHeader(buffer, request);
-      checkBodyIsEmpty(buffer);
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertEquals(SESS_XA_INDOUBT_XIDS, decodedPacket.getType());            
-   }
-   
-   public void testSessionGetInDoubtXidsResponse() throws Exception
-   {
-      final int numXids = 10;
-      List<Xid> xids = new ArrayList<Xid>();
-      for (int i = 0; i < numXids; i++)
-      {
-         xids.add(generateXid());
-      }
-      
-      SessionXAGetInDoubtXidsResponseMessage message = new SessionXAGetInDoubtXidsResponseMessage(xids);
-      AbstractPacketCodec codec = new SessionXAGetInDoubtXidsResponseMessageCodec();
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-      
-      Packet decodedPacket = codec.decode(buffer);
-      assertTrue(decodedPacket instanceof SessionXAGetInDoubtXidsResponseMessage);
-      SessionXAGetInDoubtXidsResponseMessage decodedMessage = (SessionXAGetInDoubtXidsResponseMessage)decodedPacket;
-      assertEquals(SESS_XA_INDOUBT_XIDS_RESP, decodedMessage.getType());
-           
-      List<Xid> decodedXids = decodedMessage.getXids();
-      assertNotNull(decodedXids);
-      assertEquals(xids.size(), decodedXids.size());
-      
-      for (int i = 0; i < numXids; i++)
-      {
-         assertEquals(xids.get(i), decodedXids.get(i));
-      }
-   }
-   
-   public void testSessionXAGetTimeoutMessage() throws Exception
-   {
-      PacketImpl message = new PacketImpl(SESS_XA_GET_TIMEOUT);
-
-      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
-            PacketType.SESS_XA_GET_TIMEOUT);
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      checkBodyIsEmpty(buffer);
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertEquals(SESS_XA_GET_TIMEOUT, decodedPacket.getType());     
-   }
-   
-   public void testSessionXAGetTimeoutResponse() throws Exception
-   {
-      final int timeout = RandomUtil.randomInt();
-      
-      SessionXAGetTimeoutResponseMessage message = new SessionXAGetTimeoutResponseMessage(timeout);
-      AbstractPacketCodec codec = new SessionXAGetTimeoutResponseMessageCodec();
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-      
-      Packet decodedPacket = codec.decode(buffer);
-      assertTrue(decodedPacket instanceof SessionXAGetTimeoutResponseMessage);
-      SessionXAGetTimeoutResponseMessage decodedMessage = (SessionXAGetTimeoutResponseMessage)decodedPacket;
-      assertEquals(SESS_XA_GET_TIMEOUT_RESP, decodedMessage.getType());
-           
-      assertEquals(timeout, decodedMessage.getTimeoutSeconds());
-   }
-
-   public void testSessionXAJoinMessage() throws Exception
-   {
-      Xid xid = this.generateXid();
-      SessionXAJoinMessage message = new SessionXAJoinMessage(xid);
-      AbstractPacketCodec codec = new SessionXAJoinMessageCodec();
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-      
-      Packet decodedPacket = codec.decode(buffer);
-      assertTrue(decodedPacket instanceof SessionXAJoinMessage);
-      SessionXAJoinMessage decodedMessage = (SessionXAJoinMessage)decodedPacket;
-      assertEquals(SESS_XA_JOIN, decodedMessage.getType());
-      assertEquals(xid, decodedMessage.getXid());      
-   }
-   
-   public void testSessionXAPrepareMessage() throws Exception
-   {
-      Xid xid = this.generateXid();
-      SessionXAPrepareMessage message = new SessionXAPrepareMessage(xid);
-      AbstractPacketCodec codec = new SessionXAPrepareMessageCodec();
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-      
-      Packet decodedPacket = codec.decode(buffer);
-      assertTrue(decodedPacket instanceof SessionXAPrepareMessage);
-      SessionXAPrepareMessage decodedMessage = (SessionXAPrepareMessage)decodedPacket;
-      assertEquals(SESS_XA_PREPARE, decodedMessage.getType());
-      assertEquals(xid, decodedMessage.getXid());      
-   }
-   
-   public void testSessionXAResponseErrorNullString() throws Exception
-   {
-      testSessionXAResponse(true, true);
-   }
-   
-   public void testSessionXAResponseErrorNotNullString() throws Exception
-   {
-      testSessionXAResponse(true, false);
-   }
-   
-   public void testSessionXAResponseNoErrorNullString() throws Exception
-   {
-      testSessionXAResponse(false, true);
-   }
-   
-   public void testSessionXAResponseNoErrorNotNullString() throws Exception
-   {
-      testSessionXAResponse(false, false);
-   }
-   
-   private void testSessionXAResponse(boolean error, boolean nullString) throws Exception
-   {
-      int responseCode = RandomUtil.randomInt();
-      
-      String str = nullString ? null : RandomUtil.randomString();
-      
-      SessionXAResponseMessage message = new SessionXAResponseMessage(error, responseCode, str);
-      AbstractPacketCodec codec = new SessionXAResponseMessageCodec();
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-      
-      Packet decodedPacket = codec.decode(buffer);
-      assertTrue(decodedPacket instanceof SessionXAResponseMessage);
-      SessionXAResponseMessage decodedMessage = (SessionXAResponseMessage)decodedPacket;
-      assertEquals(SESS_XA_RESP, decodedMessage.getType());
-      assertEquals(error, decodedMessage.isError());
-      assertEquals(responseCode, decodedMessage.getResponseCode());
-      assertEquals(str, decodedMessage.getMessage());
-   }
-   
-   public void testSessionXAResumeMessage() throws Exception
-   {
-      Xid xid = this.generateXid();
-      SessionXAResumeMessage message = new SessionXAResumeMessage(xid);
-      AbstractPacketCodec codec = new SessionXAResumeMessageCodec();
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-      
-      Packet decodedPacket = codec.decode(buffer);
-      assertTrue(decodedPacket instanceof SessionXAResumeMessage);
-      SessionXAResumeMessage decodedMessage = (SessionXAResumeMessage)decodedPacket;
-      assertEquals(SESS_XA_RESUME, decodedMessage.getType());
-      assertEquals(xid, decodedMessage.getXid());      
-   }
-   
-   public void testSessionXARollbackMessage() throws Exception
-   {
-      Xid xid = this.generateXid();
-      SessionXARollbackMessage message = new SessionXARollbackMessage(xid);
-      AbstractPacketCodec codec = new SessionXARollbackMessageCodec();
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-      
-      Packet decodedPacket = codec.decode(buffer);
-      assertTrue(decodedPacket instanceof SessionXARollbackMessage);
-      SessionXARollbackMessage decodedMessage = (SessionXARollbackMessage)decodedPacket;
-      assertEquals(SESS_XA_ROLLBACK, decodedMessage.getType());
-      assertEquals(xid, decodedMessage.getXid());      
-   }
-   
-   public void testSessionXASetTimeoutMessage() throws Exception
-   {
-      final int timeout = RandomUtil.randomInt();
-      SessionXASetTimeoutMessage message = new SessionXASetTimeoutMessage(timeout);
-      AbstractPacketCodec codec = new SessionXASetTimeoutMessageCodec();
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-      
-      Packet decodedPacket = codec.decode(buffer);
-      assertTrue(decodedPacket instanceof SessionXASetTimeoutMessage);
-      SessionXASetTimeoutMessage decodedMessage = (SessionXASetTimeoutMessage)decodedPacket;
-      assertEquals(SESS_XA_SET_TIMEOUT, decodedMessage.getType());
-      assertEquals(timeout, decodedMessage.getTimeoutSeconds());      
-   }
-   
-   public void testSessionXASetTimeoutResponseMessageOK() throws Exception
-   {
-      testSessionXASetTimeoutResponseMessage(true);
-   }
-   
-   public void testSessionXASetTimeoutResponseMessageNotOK() throws Exception
-   {
-      testSessionXASetTimeoutResponseMessage(false);
-   }
-   
-   private void testSessionXASetTimeoutResponseMessage(boolean ok) throws Exception
-   {
-      final int timeout = RandomUtil.randomInt();
-      SessionXASetTimeoutResponseMessage message = new SessionXASetTimeoutResponseMessage(ok);
-      AbstractPacketCodec codec = new SessionXASetTimeoutResponseMessageCodec();
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-      
-      Packet decodedPacket = codec.decode(buffer);
-      assertTrue(decodedPacket instanceof SessionXASetTimeoutResponseMessage);
-      SessionXASetTimeoutResponseMessage decodedMessage = (SessionXASetTimeoutResponseMessage)decodedPacket;
-      assertEquals(SESS_XA_SET_TIMEOUT_RESP, decodedMessage.getType());
-      assertEquals(ok, decodedMessage.isOK());      
-   }
-   
-   public void testSessionXAStartMessage() throws Exception
-   {
-      Xid xid = this.generateXid();
-      SessionXAStartMessage message = new SessionXAStartMessage(xid);
-      AbstractPacketCodec codec = new SessionXAStartMessageCodec();
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-      
-      Packet decodedPacket = codec.decode(buffer);
-      assertTrue(decodedPacket instanceof SessionXAStartMessage);
-      SessionXAStartMessage decodedMessage = (SessionXAStartMessage)decodedPacket;
-      assertEquals(SESS_XA_START, decodedMessage.getType());
-      assertEquals(xid, decodedMessage.getXid());      
-   }
-   
-   public void testSessionXASuspendMessage() throws Exception
-   {
-      PacketImpl message = new PacketImpl(SESS_XA_SUSPEND);
-
-      AbstractPacketCodec codec = PacketCodecFactory.createCodecForEmptyPacket(
-            PacketType.SESS_XA_SUSPEND);
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      checkBodyIsEmpty(buffer);
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertEquals(SESS_XA_SUSPEND, decodedPacket.getType());     
-   }
-   
-   
-   public void testSessionRemoveAddressMessage() throws Exception
-   {
-      SessionRemoveDestinationMessage message = new SessionRemoveDestinationMessage(randomString(), true);
-
-      AbstractPacketCodec codec = new SessionRemoveDestinationMessageCodec();
-      
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionRemoveDestinationMessage);
-      SessionRemoveDestinationMessage decodedMessage = (SessionRemoveDestinationMessage)decodedPacket;
-      assertEquals(SESS_REMOVE_DESTINATION, decodedMessage.getType());
-      
-      assertEquals(message.getAddress(), decodedMessage.getAddress());
-      assertEquals(message.isTemporary(), decodedMessage.isTemporary());
-            
-   }
-   
-   public void testSessionCreateQueueRequest() throws Exception
-   {
-      SessionCreateQueueMessage message = new SessionCreateQueueMessage(randomString(), randomString(), randomString(), true, true);
-
-      AbstractPacketCodec codec = new SessionCreateQueueMessageCodec();
-      
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionCreateQueueMessage);
-      SessionCreateQueueMessage decodedMessage = (SessionCreateQueueMessage)decodedPacket;
-      assertEquals(SESS_CREATEQUEUE, decodedMessage.getType());
-      
-      assertEquals(message.getAddress(), decodedMessage.getAddress());
-      assertEquals(message.getQueueName(), decodedMessage.getQueueName());
-      assertEquals(message.getFilterString(), decodedMessage.getFilterString());
-      assertEquals(message.isDurable(), decodedMessage.isDurable());
-      assertEquals(message.isTemporary(), decodedMessage.isDurable());
-            
-   }
-   
-   public void testSessionQueueQueryRequest() throws Exception
-   {
-      SessionQueueQueryMessage message = new SessionQueueQueryMessage(randomString());
-
-      AbstractPacketCodec codec = new SessionQueueQueryMessageCodec();
-      
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionQueueQueryMessage);
-      SessionQueueQueryMessage decodedMessage = (SessionQueueQueryMessage)decodedPacket;
-      assertEquals(SESS_QUEUEQUERY, decodedMessage.getType());
-      
-      assertEquals(message.getQueueName(), decodedMessage.getQueueName());            
-   }
-   
-   public void testSessionQueueQueryResponse() throws Exception
-   {
-      SessionQueueQueryResponseMessage message = new SessionQueueQueryResponseMessage(true, true, randomInt(), randomInt(), randomInt(),
-                                                          randomString(), randomString());
-
-      AbstractPacketCodec codec = new SessionQueueQueryResponseMessageCodec();
-      
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionQueueQueryResponseMessage);
-      SessionQueueQueryResponseMessage decodedMessage = (SessionQueueQueryResponseMessage)decodedPacket;
-      assertEquals(SESS_QUEUEQUERY_RESP, decodedMessage.getType());
-      
-      assertEquals(message.isExists(), decodedMessage.isExists());
-      assertEquals(message.isDurable(), decodedMessage.isDurable());
-      assertEquals(message.isTemporary(), decodedMessage.isTemporary());
-      assertEquals(message.getConsumerCount(), decodedMessage.getConsumerCount());
-      assertEquals(message.getMessageCount(), decodedMessage.getMessageCount());
-      assertEquals(message.getFilterString(), decodedMessage.getFilterString());
-      assertEquals(message.getAddress(), decodedMessage.getAddress());         
-   }
-   
-   public void testSessionAddAddressMessage() throws Exception
-   {
-      SessionAddDestinationMessage message = new SessionAddDestinationMessage(randomString(), true);
-
-      AbstractPacketCodec<SessionAddDestinationMessage> codec = new SessionAddDestinationMessageCodec();
-      
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionAddDestinationMessage);
-      SessionAddDestinationMessage decodedMessage = (SessionAddDestinationMessage)decodedPacket;
-      assertEquals(SESS_ADD_DESTINATION, decodedMessage.getType());
-      
-      assertEquals(message.getAddress(), decodedMessage.getAddress());      
-      assertEquals(message.isTemporary(), decodedMessage.isTemporary());
-   }
-   
-   public void testSessionBindingQueryMessage() throws Exception
-   {
-      SessionBindingQueryMessage message = new SessionBindingQueryMessage(randomString());
-
-      AbstractPacketCodec codec = new SessionBindingQueryMessageCodec();
-      
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionBindingQueryMessage);
-      SessionBindingQueryMessage decodedMessage = (SessionBindingQueryMessage)decodedPacket;
-      assertEquals(SESS_BINDINGQUERY, decodedMessage.getType());
-      
-      assertEquals(message.getAddress(), decodedMessage.getAddress());        
-   }
-   
-   public void testSessionBindingQueryResponseMessage() throws Exception
-   {
-      boolean exists = true;
-      List<String> queueNames = new ArrayList<String>();
-      queueNames.add(randomString());
-      queueNames.add(randomString());
-      queueNames.add(randomString());
-      SessionBindingQueryResponseMessage message = new SessionBindingQueryResponseMessage(exists, queueNames);
-
-      AbstractPacketCodec codec = new SessionBindingQueryResponseMessageCodec();
-      
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionBindingQueryResponseMessage);
-      SessionBindingQueryResponseMessage decodedMessage = (SessionBindingQueryResponseMessage)decodedPacket;
-      assertEquals(SESS_BINDINGQUERY_RESP, decodedMessage.getType());
-      
-      assertEquals(message.isExists(), decodedMessage.isExists());
-      
-      List<String> decodedNames = decodedMessage.getQueueNames();
-      assertEquals(queueNames.size(), decodedNames.size());
-      for (int i = 0; i < queueNames.size(); i++)
-      {
-         assertEquals(queueNames.get(i), decodedNames.get(i));
-      }
-   }
-   
-   
-   public void testDeleteQueueRequest() throws Exception
-   {
-      SessionDeleteQueueMessage message = new SessionDeleteQueueMessage(randomString());
-
-      AbstractPacketCodec codec = new SessionDeleteQueueMessageCodec();
-      
-      SimpleRemotingBuffer buffer = encode(message, codec);
-      checkHeader(buffer, message);
-      buffer.rewind();
-
-      Packet decodedPacket = codec.decode(buffer);
-
-      assertTrue(decodedPacket instanceof SessionDeleteQueueMessage);
-      SessionDeleteQueueMessage decodedMessage = (SessionDeleteQueueMessage)decodedPacket;
-      assertEquals(SESS_DELETE_QUEUE, decodedMessage.getType());
-      
-      assertEquals(message.getQueueName(), decodedMessage.getQueueName());        
-   }
-   
-   
-   
-   // Package protected ---------------------------------------------
-
-   // Protected -----------------------------------------------------
-
-   // Private -------------------------------------------------------
-
-   private SimpleRemotingBuffer encode(PacketImpl packet,
-         AbstractPacketCodec codec) throws Exception
-   {
-      log.debug("encode " + packet);
-
-      IoBuffer b = IoBuffer.allocate(256);
-      b.setAutoExpand(true);
-
-      SimpleRemotingBuffer buf = new SimpleRemotingBuffer(b);
-
-      codec.encode(packet, buf);
-      buf.flip();
-
-      return buf;
-   }
-
    private final class SimpleRemotingBuffer extends BufferWrapper
    {
 
@@ -1512,7 +1436,7 @@
          buffer.flip();
       }
 
-      public void rewind() throws IOException
+      public void rewind()
       {
          buffer.rewind();
       }




More information about the jboss-cvs-commits mailing list