package iamrescue.communication.messages; import iamrescue.communication.BitStream; import iamrescue.communication.messages.codec.ICommunicationBeliefBaseAdapter; import iamrescue.communication.messages.codec.IMessageCodec; import rescuecore2.worldmodel.EntityID; /** * Abstract class that represents messages that are sent over the communication * network. * * @author Ruben Stranders * */ public abstract class Message { private int timestepReceived; private MessagePriority priority = MessagePriority.NORMAL; private EntityID senderAgentID; private MessageChannel channel; private boolean read = false; // private boolean sent; // default time to live is 1 private int ttl = 1; private int repeats = 1; private BitStream encoded = null; public final MessagePriority getPriority() { return priority; } public void setEncoded(BitStream encoded) { this.encoded = encoded; } public final void setPriority(MessagePriority priority) { this.priority = priority; } public final void setSenderAgentID(EntityID senderAgentID) { this.senderAgentID = senderAgentID; } public final EntityID getSenderAgentID() { return senderAgentID; } public final void setTimestepReceived(int timestepReceived) { this.timestepReceived = timestepReceived; } public final int getTimestepReceived() { return timestepReceived; } public final MessageChannel getChannel() { return channel; } public final void setChannel(MessageChannel channel) { this.channel = channel; } @Override public String toString() { StringBuffer sb = new StringBuffer(); sb.append(getMessageName()); sb.append('['); sb.append(getMessageContentsAsString()); sb.append("] - "); sb.append(getMessageProperties()); return sb.toString(); } public abstract String getMessageName(); public abstract String getMessageContentsAsString(); public StringBuffer getMessageProperties() { StringBuffer sb = new StringBuffer(); sb.append("timestepreceived="); sb.append(getTimestepReceived()); sb.append(",priority="); sb.append(getPriority()); sb.append(",senderAgentID="); sb.append(getSenderAgentID()); sb.append(",channel="); sb.append(getChannel()); sb.append(",ttl="); sb.append(getTTL()); sb.append(",repeats="); sb.append(getRepeats()); sb.append(",encoded="); if (this.encoded == null) { sb.append("notyet"); } else { sb.append(encoded.size()); sb.append(" bits = "); sb.append(encoded.size() / 8.0); sb.append(" bytes"); } return sb; } public String toShortString() { return getMessageName() + "[s:" + senderAgentID + "]"; } public BitStream encode(ICommunicationBeliefBaseAdapter beliefBase) { if (encoded == null) { encoded = getCodec().encode(this, beliefBase); } return encoded; } protected void invalidateEncoded() { encoded = null; } public abstract IMessageCodec getCodec(); public final boolean isRead() { return read; } public final void markAsRead() { read = true; } public final void markAsSent() { // one instance has been sent repeats--; } public final boolean isSent() { // all messages are sent return repeats <= 0; } public final void setTTL(int ttl) { this.ttl = ttl; } public final int getTTL() { return ttl; } protected void copyProperties(Message message) { message.setPriority(priority); message.setTTL(ttl); message.setEncoded(encoded); } public final void setRepeats(int repeats) { this.repeats = repeats; } public final int getRepeats() { return repeats; } public abstract Message copy(); }