On 7/26/07, Germán Borbolla Flores <[EMAIL PROTECTED]> wrote:
Hi Trustin,

I've just read the tutorial and I don't understand how to correctly
transform a Write request.

I have the following filterWrite implementation:

   public void filterWrite(NextFilter nextFilter, IoSession session,
WriteRequest writeRequest) throws Exception
   {
       Object message = writeRequest.getMessage();
       if (message instanceof ByteBuffer)
       {
           nextFilter.filterWrite(session, writeRequest);
       }
       else
       {
           if (message instanceof Byte)
           {
               ByteBuffer outBuffer = ByteBuffer.allocate(1);
               outBuffer.put((Byte)message);
               outBuffer.flip();
               nextFilter.filterWrite(session, new
WriteRequest(outBuffer, writeRequest.getFuture(),
writeRequest.getDestination()));
           }
           else if (message instanceof Integer)
           {
               ByteBuffer outBuffer = ByteBuffer.allocate(4);
               outBuffer.putInt((Integer)message);
               outBuffer.flip();
               nextFilter.filterWrite(session, new
WriteRequest(outBuffer, writeRequest.getFuture(),
writeRequest.getDestination()));
           }
           else if (message instanceof Long)
           {
               ByteBuffer outBuffer = ByteBuffer.allocate(8);
               outBuffer.putLong((Long)message);
               outBuffer.flip();
               nextFilter.filterWrite(session, new
WriteRequest(outBuffer, writeRequest.getFuture(),
writeRequest.getDestination()));
           }
           else if (message instanceof byte[])
           {
               byte[] byteArray = (byte[])message;
               ByteBuffer outBuffer = ByteBuffer.allocate(4 +
byteArray.length);
               outBuffer.putInt(byteArray.length);
               outBuffer.put(byteArray);
               outBuffer.flip();
               nextFilter.filterWrite(session, new
WriteRequest(outBuffer, writeRequest.getFuture(),
writeRequest.getDestination()));
           }
       }
   }

Can you give me some pointers of how the messageSent should look like.

You will have to create a new ByteBuffer subtype:

private static class MyByteBuffer extends ByteBufferProxy {
   private final Object value;
   private ByteByteBuffer(Object value, ByteBuffer encodedValue) {
       super(encodedValue);
   }
   public Object getValue() { return value; }
}

now in your messageSent implementation:

public void messageSent(NextFilter nextFilter, IoSession session, Object msg) {
   if (msg instanceof MyByteBuffer) {
       nextFilter.messageSent(session, ((MyByteBuffer) msg).getValue());
   } else {
       nextFilter.messageSent(session, msg);
   }
}

You also need to pass a new MyByteBuffer in filterWrite:

nextFilter.filterWrite(session, new WriteRequest(new MyBuffer(message,
outBuffer), ...);

HTH,
Trustin
--
what we call human nature is actually human habit
--
http://gleamynode.net/
--
PGP Key ID: 0x0255ECA6

Reply via email to