/** * */ package iamrescue.belief.commupdates; import iamrescue.belief.IAMWorldModel; import iamrescue.belief.provenance.AgentCommunicationOrigin; import iamrescue.belief.provenance.IPropertyMerger; import iamrescue.belief.provenance.ProvenanceLogEntry; import iamrescue.communication.messages.Message; import iamrescue.communication.messages.updates.EntityDeletedMessage; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import rescuecore2.standard.entities.Area; import rescuecore2.standard.entities.Blockade; import rescuecore2.standard.entities.StandardEntity; import rescuecore2.worldmodel.Entity; import rescuecore2.worldmodel.EntityID; import rescuecore2.worldmodel.Property; import rescuecore2.worldmodel.properties.EntityRefListProperty; /** * @author Sebastian * */ public class EntityDeletedHandler implements IMessageHandler { private static final Logger LOGGER = Logger .getLogger(EntityDeletedHandler.class); private IAMWorldModel worldModel; private IPropertyMerger propertyMerger; public EntityDeletedHandler(IAMWorldModel worldModel, IPropertyMerger propertyMerger) { this.worldModel = worldModel; this.propertyMerger = propertyMerger; } @Override public boolean canHandle(Message message) { return (message instanceof EntityDeletedMessage); } @Override public boolean handleMessage(Message message) { EntityDeletedMessage updateMsg = (EntityDeletedMessage) message; message.markAsRead(); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Updating world model with " + updateMsg); } StandardEntity existingEntity = worldModel.getEntity(updateMsg.getId()); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Existing entity: " + updateMsg); } if (existingEntity != null) { if (existingEntity instanceof Blockade) { // Need to unlink blockades property Blockade blockade = (Blockade) existingEntity; if (blockade.isPositionDefined()) { EntityID position = blockade.getPosition(); Entity entity = worldModel.getEntity(position); Area area = ((Area) entity); EntityRefListProperty currentBlockades = area .getBlockadesProperty(); EntityRefListProperty newBlockades = currentBlockades .copy(); if (newBlockades.isDefined()) { // Remove block List<EntityID> value = newBlockades.getValue(); List<EntityID> arrayList = new ArrayList<EntityID>( value); arrayList.remove(blockade.getID()); newBlockades.setValue(arrayList); } ProvenanceLogEntry entry = new ProvenanceLogEntry(updateMsg .getTimeStamp(), AgentCommunicationOrigin .get(updateMsg.getChannel()), newBlockades); worldModel.storeProvenance(updateMsg.getId(), entry); // update current value in belief base Property decidedValue = propertyMerger .decideValue(worldModel.getProvenance(updateMsg .getId(), newBlockades.getURN())); Property existingProperty = area.getBlockadesProperty(); existingProperty.takeValue(decidedValue); } } // Now remove entity worldModel.removeEntity(existingEntity); return true; } else { return false; } } }