package cz.agents.agentpolis.darptestbed.simmodel.agent.dispatching;
import cz.agents.agentpolis.darptestbed.siminfrastructure.communication.dispatching.protocol.DispatchingMessageProtocolCombinedVisitor;
import cz.agents.agentpolis.darptestbed.siminfrastructure.communication.driver.message.*;
import cz.agents.agentpolis.darptestbed.siminfrastructure.communication.receiver.StringMessage;
import cz.agents.agentpolis.darptestbed.siminfrastructure.communication.requestconsumer.message.ProposalAccept;
import cz.agents.agentpolis.darptestbed.siminfrastructure.communication.requestconsumer.message.ProposalReject;
import cz.agents.agentpolis.darptestbed.simmodel.agent.data.Request;
import cz.agents.agentpolis.darptestbed.simmodel.agent.dispatching.logic.DispatchingLogic;
import cz.agents.agentpolis.darptestbed.simmodel.agent.timer.TimerCallback;
import cz.agents.agentpolis.siminfrastructure.description.DescriptionImpl;
import cz.agents.agentpolis.simmodel.agent.Agent;
import cz.agents.agentpolis.simmodel.entity.EntityType;
import org.apache.log4j.Logger;
/**
* The life cycle of the dispatching (there's usually only one instance in the
* whole application).
*
* @author Lukas Canda
*/
public class DispatchingAgent extends Agent implements TimerCallback, DispatchingMessageProtocolCombinedVisitor {
private static final Logger LOGGER = Logger.getLogger(DispatchingAgent.class);
/**
* My logic processes all operations with received requests including
* planning. It also sends messages to whoever needs them.
*/
private DispatchingLogic logic;
public DispatchingAgent(String agentId, EntityType agentType, DispatchingLogic logic) {
super(agentId, agentType);
this.logic = logic;
}
@Override
public void born() {
}
/**
* This method is usually called by a timer at regular intervals.
*/
@Override
public void timerCallback() {
logic.processRequests();
}
@Override
public DescriptionImpl getDescription() {
return new DescriptionImpl();
}
@Override
public void visit(Request request) {
//LOGGER.debug(getId() + ":" + request.getClass().getSimpleName());
logic.processNewRequest(request);
}
@Override
public void visit(ProposalReject proposalReject) {
//LOGGER.debug(getId() + ":" + proposalReject.getClass().getSimpleName());
logic.processRejectedProposal(proposalReject);
}
@Override
public void visit(ProposalAccept proposalAccept) {
//LOGGER.debug(getId() + ":" + proposalAccept.getClass().getSimpleName());
logic.confirmOrder(proposalAccept);
}
@Override
public void visit(DriverReportsPassengerIsInMessage passengerIsInTaxiMessage) {
LOGGER.debug("---> Dispatching: Passenger entered " + passengerIsInTaxiMessage);
logic.processPassengerInVehicle(passengerIsInTaxiMessage);
}
@Override
public void visit(DriverReportsPassengerHasLeftMessage passengerHasLeftTaxiMessage) {
LOGGER.debug("---> Dispatching: Passenger left " + passengerHasLeftTaxiMessage);
logic.processPassengerOffVehicle(passengerHasLeftTaxiMessage);
}
@Override
public void visit(DriverReportsLateForPassengerMessage driverReportsLateForPassengerMessage) {
logic.processDriverArrivedLateForPassengerPickup(driverReportsLateForPassengerMessage);
}
@Override
public void visit(DriverNewPlanAcceptMessage driverNewPlanAcceptMessage) {
logic.processDriverAcceptsNewPlan(driverNewPlanAcceptMessage);
}
@Override
public void visit(DriverNewPlanRejectMessage driverNewPlanRejectMessage) {
logic.processDriverRejectsNewPlan(driverNewPlanRejectMessage);
}
@Override
public void visit(StringMessage stringMessage) {
LOGGER.debug(getId() + ":" + stringMessage.getClass().getSimpleName() + ":" + stringMessage);
logic.processTextMessage(stringMessage);
}
}