package org.openamq.framing;
import org.apache.mina.common.ByteBuffer;
public class CompositeAMQDataBlock extends AMQDataBlock implements EncodableAMQDataBlock
{
private ByteBuffer _encodedBlock;
private AMQDataBlock[] _blocks;
public CompositeAMQDataBlock(AMQDataBlock[] blocks)
{
_blocks = blocks;
}
/**
* The encoded block will be logically first before the AMQDataBlocks which are encoded
* into the buffer afterwards.
* @param encodedBlock already-encoded data
* @param blocks some blocks to be encoded.
*/
public CompositeAMQDataBlock(ByteBuffer encodedBlock, AMQDataBlock[] blocks)
{
this(blocks);
_encodedBlock = encodedBlock;
}
public AMQDataBlock[] getBlocks()
{
return _blocks;
}
public ByteBuffer getEncodedBlock()
{
return _encodedBlock;
}
public long getSize()
{
long frameSize = 0;
for (int i = 0; i < _blocks.length; i++)
{
frameSize += _blocks[i].getSize();
}
if (_encodedBlock != null)
{
_encodedBlock.rewind();
frameSize += _encodedBlock.remaining();
}
return frameSize;
}
public void writePayload(ByteBuffer buffer)
{
if (_encodedBlock != null)
{
buffer.put(_encodedBlock);
}
for (int i = 0; i < _blocks.length; i++)
{
_blocks[i].writePayload(buffer);
}
}
public String toString()
{
if (_blocks == null)
{
return "No blocks contained in composite frame";
}
else
{
StringBuilder buf = new StringBuilder();
for (int i = 0 ; i< _blocks.length; i++)
{
buf.append("Block ").append(i).append('\n').append(_blocks[i].toString());
}
return buf.toString();
}
}
}