package iamrescue.communication; import iamrescue.communication.compression.CompressorException; import iamrescue.communication.compression.IByteArrayCompressor; import iamrescue.communication.messages.Message; import iamrescue.communication.messages.codec.ICommunicationBeliefBaseAdapter; import java.util.Collection; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class Encoder implements IEncoder { private static Log log = LogFactory.getLog(Encoder.class); private IByteArrayCompressor compressor; private ICommunicationBeliefBaseAdapter beliefBase; // private static final boolean CONCATENATE_MESSAGES = false; public Encoder(IByteArrayCompressor compressor, ICommunicationBeliefBaseAdapter beliefBase) { this.compressor = compressor; this.beliefBase = beliefBase; } public IByteArrayCompressor getCompressor() { return compressor; } public byte[] encodeMessages(Collection<Message> messages, int maxLength) { BitStream encodedString = new BitStream(); int i = 0; try { for (Message message : messages) { BitStream afterConcatenation = encodedString .concatenate(message.encode(beliefBase)); // check if the compressed size of these messages exceeds the // maximum allowable size. if (compressor.compress(afterConcatenation).length > maxLength) break; else { encodedString = afterConcatenation; message.markAsSent(); } i++; } if (encodedString.available() == 0) { return new byte[0]; } byte[] compress = compressor.compress(encodedString); // int compressionPercentage = (int) ((1 - compress.length // / (double) encodedString.length) * 100); return compress; } catch (CompressorException e) { log.error("Error encoding messages due to exception in compressor", e); return new byte[0]; } } }