package com.leansoft.luxun.message;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import com.leansoft.luxun.message.compress.CompressionUtils;
import com.leansoft.luxun.message.generated.CompressionCodec;
import com.leansoft.luxun.message.generated.TMessageList;
import com.leansoft.luxun.message.generated.TMessagePack;
import com.leansoft.luxun.serializer.ThriftConverter;
/**
* Basic unit for Luxun messages transportation and storage.
*
* @author bulldog
*
*/
public class MessageList extends ArrayList<Message> {
private static final long serialVersionUID = 1L;
private CompressionCodec codec;
public MessageList() {
this(CompressionCodec.NO_COMPRESSION);
}
public MessageList(CompressionCodec codec) {
super();
this.codec = codec;
}
/**
* Get compression codec used
*
* @return
*/
public CompressionCodec getCompressionCodec() {
return this.codec;
}
/**
* Set compression codec to be used
*
* @param codec
*/
public void setCompressionCodec(CompressionCodec codec) {
this.codec = codec;
}
/**
* Convert the message list to thrift buffer, compress accordingly.
*
* @return a TMessagePack serialized buffer
*/
public ByteBuffer toThriftBuffer() {
TMessagePack tMessagePack = new TMessagePack();
if (codec != null) {
tMessagePack.setAttribute((byte) codec.getValue());
}
TMessageList tMessageList = new TMessageList();
for(Message message : this) {
ByteBuffer buffer = message.getBufferDuplicate();
if (buffer != null) {
tMessageList.addToMessages(buffer);
}
}
byte[] messageListData = ThriftConverter.toBytes(tMessageList);
if (codec != null && codec != CompressionCodec.NO_COMPRESSION) {
byte[] compressedData = CompressionUtils.compress(messageListData, codec);
tMessagePack.setMessageList(compressedData);
} else {
tMessagePack.setMessageList(messageListData);
}
byte[] messagePackData = ThriftConverter.toBytes(tMessagePack);
return ByteBuffer.wrap(messagePackData);
}
/**
* Factory method, convert a thrift buffer to MessageList, decompress accordingly
*
* @param buffer TMessagePack serialized buffer
* @return a MessageList instance
*/
public static MessageList fromThriftBuffer(ByteBuffer buffer) {
MessageList messageList = new MessageList();
if (buffer == null) return messageList;
TMessagePack messagePack = (TMessagePack) ThriftConverter.toEvent(buffer, TMessagePack.class);
byte[] messageListData = messagePack.getMessageList();
CompressionCodec codec = CompressionCodec.findByValue(messagePack.getAttribute());
messageList.codec = codec;
if (codec != null && codec != CompressionCodec.NO_COMPRESSION) {
messageListData = CompressionUtils.decompress(messageListData, codec);
}
TMessageList tMessageList = (TMessageList) ThriftConverter.toEvent(messageListData, TMessageList.class);
if (tMessageList.getMessagesSize() > 0) {
for(ByteBuffer msgBuf :tMessageList.getMessages()) {
messageList.add(new Message(msgBuf));
}
}
return messageList;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((codec == null) ? 0 : codec.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
MessageList other = (MessageList) obj;
if (codec != other.codec)
return false;
return true;
}
}