package cz.agents.agentpolis.darptestbed.simmodel.agent.passenger;
import java.util.Set;
import cz.agents.agentpolis.darptestbed.siminfrastructure.communication.passenger.message.*;
import cz.agents.agentpolis.darptestbed.siminfrastructure.communication.receiver.StringMessage;
import org.apache.log4j.Logger;
import org.joda.time.Duration;
import cz.agents.agentpolis.darptestbed.global.Utils;
import cz.agents.agentpolis.darptestbed.siminfrastructure.communication.passenger.receiver.PassengerReceiverVisitor;
import cz.agents.agentpolis.darptestbed.simmodel.agent.data.generator.RequestGenerator;
import cz.agents.agentpolis.darptestbed.simmodel.agent.data.generator.RequestGeneratorCall;
import cz.agents.agentpolis.darptestbed.simmodel.agent.passenger.logic.PassengerLogic;
import cz.agents.agentpolis.siminfrastructure.description.DescriptionImpl;
import cz.agents.agentpolis.simmodel.agent.Agent;
import cz.agents.agentpolis.simmodel.agent.activity.TimeSpendingActivity;
import cz.agents.agentpolis.simmodel.agent.activity.callback.TimeActivityCallback;
import cz.agents.agentpolis.simmodel.entity.EntityType;
/**
* The life cycle of a passenger
*
* @author Lukas Canda
*/
public abstract class PassengerAgent<TPassengerLogic extends PassengerLogic> extends Agent implements
RequestGeneratorCall, TimeActivityCallback, PassengerReceiverVisitor {
private static final Logger LOGGER = Logger.getLogger(PassengerAgent.class);
/**
* My logic processes all operations with received proposals. It also sends
* messages to whoever needs them.
*/
protected final TPassengerLogic logic;
/**
* A smart generator, that makes up my requests for taxis according to my
* profile
*/
private RequestGenerator requestGenerator;
/**
* A set of useful methods for searching paths, distances etc.
*/
protected final Utils utils;
/**
* The delay before starting the first activity
*/
private final Duration startLife;
/**
* This activity helps the passenger wait for some time
*/
private final TimeSpendingActivity timeSpendingActivity;
private final Set<String> passengerRequirements;
public PassengerAgent(String agentId, EntityType agentType, TPassengerLogic logic, Utils utils, Duration startLife,
TimeSpendingActivity timeSpendingActivity, Set<String> passengerRequirements,
RequestGenerator requestGenerator) {
super(agentId, agentType);
this.logic = logic;
this.utils = utils;
this.startLife = startLife;
this.timeSpendingActivity = timeSpendingActivity;
this.passengerRequirements = passengerRequirements;
this.requestGenerator = requestGenerator;
}
@Override
public void timeCallback() {
// generate a request for a ride
requestGenerator.start(getId(), passengerRequirements, this);
}
@Override
public DescriptionImpl getDescription() {
return new DescriptionImpl();
}
@Override
public void born() {
//LOGGER.info(getId() + " starts to live at " + utils.toHoursAndMinutes(this.startLife.getMillis()));
if (startLife.getMillis() > 0) {
timeSpendingActivity.spendingTime(this, startLife);
} else {
timeCallback();
}
}
@Override
public void visit(OrderConfirmation taxiSendConfirmationToPassengerMessage) {
logic.acceptTripInfo(taxiSendConfirmationToPassengerMessage.confirmation, passengerRequirements);
LOGGER.debug(getId() + ":" + taxiSendConfirmationToPassengerMessage.getClass().getSimpleName() + " " +
taxiSendConfirmationToPassengerMessage);
}
@Override
public void visit(DriverArrivedMessage driverArrivedMessage) {
logic.processVehicleArrived(driverArrivedMessage.driverId, driverArrivedMessage.confirmation.getVehicleId());
LOGGER.debug(getId() + ":" + driverArrivedMessage.getClass().getSimpleName());
}
@Override
public void visit(RequestReject requestReject) {
LOGGER.debug(getId() + ":" + requestReject.getClass().getSimpleName());
logic.processRejection(requestReject);
}
@Override
public void visit(Proposal proposal) {
LOGGER.debug(getId() + ":" + proposal.getClass().getSimpleName());
logic.processProposal(proposal);
}
@Override
public void visit(StringMessage message) {
LOGGER.debug(getId() + ":" + message.getClass().getSimpleName() + ":" + message);
logic.processTextMessage(message);
}
}