package nl.tudelft.bw4t.client.controller.percept.processors;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import eis.iilang.Identifier;
import eis.iilang.Numeral;
import eis.iilang.Parameter;
import eis.iilang.ParameterList;
import nl.tudelft.bw4t.client.controller.ClientMapController;
import nl.tudelft.bw4t.map.view.ViewEPartner;
import nl.tudelft.bw4t.map.view.ViewEntity;
/**
* The Class EPartnerProcessor.
*/
public class EPartnerProcessor implements PerceptProcessor {
/** The log4j Logger which displays logs on console. */
private static final Logger LOGGER = Logger
.getLogger(EPartnerProcessor.class.getName());
/*
* (non-Javadoc)
*
* @see
* nl.tudelft.bw4t.client.controller.percept.processors.PerceptProcessor
* #process(java.util.List,
* nl.tudelft.bw4t.client.controller.ClientMapController)
*/
@Override
public void process(List<Parameter> parameters,
ClientMapController clientMapController) {
long id = ((Numeral) parameters.get(0)).getValue().longValue();
String entityId = ((Identifier) parameters.get(1)).getValue();
long holderId = ((Numeral) parameters.get(2)).getValue().longValue();
ParameterList types = ((ParameterList) parameters.get(3));
ViewEntity theBot = clientMapController.getTheBot();
ViewEPartner epartner = clientMapController.getKnownEPartner(id);
epartner = initializeEPartner(clientMapController, id, entityId,
holderId, epartner, types);
checkHoldingEPartner(id, holderId, theBot);
if (clientMapController.containsBlock(id)) {
epartner.setLocation(clientMapController.getBlock(id).getPosition());
}
epartner.setPickedUp(holderId >= 0);
}
/**
* Initialize e partner.
*
* @param clientMapController
* the client map controller
* @param id
* the epartner id
* @param entityId
* the entity id
* @param holderId
* the holder id
* @param epartner
* the epartner
* @return the view e partner
*/
private ViewEPartner initializeEPartner(
ClientMapController clientMapController, long id, String entityId,
long holderId, ViewEPartner epartner, ParameterList types) {
if (epartner == null) {
epartner = new ViewEPartner();
epartner.setId(id);
clientMapController.addEPartner(epartner);
}
epartner.setName(entityId);
epartner.setVisible(true);
List<String> stringTypes = getStringTypes(types);
epartner.setTypes(stringTypes);
return epartner;
}
/**
* Returns a string list of the parameter functionality list.
*
* @param types
* the parameter list
* @return Returns the String representation of the parameters list.
*/
private List<String> getStringTypes(ParameterList types) {
List<String> res = new ArrayList<>(types.size());
for (Parameter t : types) {
res.add(((Identifier) t).getValue());
}
return res;
}
/**
* Check holding e partner.
*
* @param id
* of the epartner
* @param holderId
* the id of the bot which holds the epartner
* @param theBot
* the bot object
*/
private void checkHoldingEPartner(long id, long holderId, ViewEntity theBot) {
if (holderId == theBot.getId()) {
if (id != theBot.getHoldingEpartner()) {
LOGGER.info("We are now holding the e-partner: " + id);
}
theBot.setHoldingEpartner(id);
} else if (id == theBot.getHoldingEpartner()) {
theBot.setHoldingEpartner(-1);
}
}
}