package iamrescue.communication; import iamrescue.communication.messages.CivilianCryForHelpMessage; import iamrescue.communication.messages.Message; import iamrescue.communication.messages.MessageChannel; import iamrescue.communication.messages.codec.ICommunicationBeliefBaseAdapter; import iamrescue.communication.messages.codec.UnknownMessageFormatException; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.ArrayUtils; import rescuecore2.worldmodel.EntityID; /** * This decoder is used to decode messages from external agents. Currently, only * civilians send messages to our agents, in which they cry for help. * * @author rs06r * */ public class ExternalMessageDecoder implements IDecoder { private static final byte[] civilianHelpMessage = "Help".getBytes(); private static final byte[] civilianOuchMessage = "Ouch".getBytes(); private static final byte[] civilianDropoutMessage = new byte[0]; private final static List<byte[]> possibleMessages = new ArrayList<byte[]>(); static { possibleMessages.add(civilianHelpMessage); possibleMessages.add(civilianOuchMessage); possibleMessages.add(civilianDropoutMessage); } @Override public List<Message> decode(EntityID senderAgentID, MessageChannel channel, int timestep, byte[] rawData, ICommunicationBeliefBaseAdapter beliefBase) throws UnknownMessageFormatException { if (!beliefBase.isRescueEntity(senderAgentID)) { for (byte[] message : possibleMessages) { if (ArrayUtils.isEquals(rawData, message)) { List<Message> result = new ArrayList<Message>(); CivilianCryForHelpMessage civilianMessage = new CivilianCryForHelpMessage(); civilianMessage.setSenderAgentID(senderAgentID); civilianMessage.setTimestepReceived(timestep); result.add(civilianMessage); return result; } } } throw new UnknownMessageFormatException(); } /* * (non-Javadoc) * * @see * iamrescue.communication.IDecoder#canDecode(rescuecore2.worldmodel.EntityID * , iamrescue.communication.messages.MessageChannel, int, byte[], * iamrescue.communication.messages.codec.ICommunicationBeliefBaseAdapter) */ @Override public boolean canDecode(EntityID senderAgentID, MessageChannel channel, int timestep, byte[] messageContents, ICommunicationBeliefBaseAdapter beliefBase) { return !beliefBase.isRescueEntity(senderAgentID); } }