package org.juxtapose.streamline.experimental.protocol.message;
import static org.juxtapose.streamline.experimental.protocol.message.MessageConstants.*;
import java.util.Map;
import org.apache.commons.lang3.ArrayUtils;
public class MessageSerializer
{
/**
* @param inMessage
* @return
*/
public static final byte[] serializeMessage( Message inMessage )
{
if( inMessage instanceof SubQuery )
{
SubQuery sq = ( SubQuery )inMessage;
byte[] serviceBytes = DataSerializer.serializeString( sq.service );
byte[] queryBytes = DataSerializer.serializeQuery( sq.queryMap );
byte[] messageBytes = new byte[ 1 + serviceBytes.length + queryBytes.length ];
messageBytes[0] = TYPE_SUBQUERY;
int offset = 1;
System.arraycopy( serviceBytes, 0, messageBytes, offset, serviceBytes.length );
offset += serviceBytes.length;
System.arraycopy( queryBytes, 0, messageBytes, offset, queryBytes.length );
return messageBytes;
}
throw new IllegalAccessError();
}
/**
* @param inBytes
* @return
*/
public static final Message unserializeMessage( byte[] inBytes )
{
if( inBytes == null || inBytes.length < 1 )
throw new ArrayIndexOutOfBoundsException( "cannot unserialize a byte arr with no elements" );
byte type = inBytes[0];
int offset = 1;
if( type == TYPE_SUBQUERY )
{
int serviceLength = (int)DataSerializer.numberFromByteArray( inBytes, offset, DataSerializer.FIELD_BYTE_LENGTH, null );
offset += DataSerializer.FIELD_BYTE_LENGTH;
byte[] charBytes = ArrayUtils.subarray( inBytes, offset, offset+serviceLength );
String service = new String(charBytes);
offset += charBytes.length;
byte[] queryBytes = ArrayUtils.subarray( inBytes, offset, inBytes.length );
Map<String, String> queryMap = DataSerializer.unserializeQuery( queryBytes );
return new SubQuery( service, queryMap );
}
throw new IllegalAccessError();
}
}