package siebog.interaction.contractnet;
/**
*
* @author <a href="jovanai.191@gmail.com">Jovana Ivkovic</a>
*/
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import siebog.agents.XjafAgent;
import siebog.interaction.ACLMessage;
import siebog.interaction.Performative;
public abstract class Participant extends XjafAgent {
private static final long serialVersionUID = 1L;
private static final Logger LOG = LoggerFactory.getLogger(Participant.class);
private CallForProposal cfp;
public void propose(Proposal proposal) {
ACLMessage reply = new ACLMessage(Performative.PROPOSE);
reply.receivers.add(proposal.getInitiator());
reply.sender = myAid;
reply.contentObj = proposal;
msm().post(reply);
}
public void refuse(Proposal proposal) {
ACLMessage reply = new ACLMessage(Performative.REFUSE);
reply.receivers.add(proposal.getInitiator());
reply.sender = myAid;
msm().post(reply);
}
public void handleCfp(ACLMessage msg) {
if (msg.replyBy < System.currentTimeMillis())
LOG.info("{}: ReplyBy time has elapsed, so I'm not bidding.", myAid);
else {
Proposal proposal = createProposal((CallForProposal) msg.contentObj);
proposal.setInitiator(msg.sender);
if (!proposal.isProposing()) {
refuse(proposal);
} else {
cfp = (CallForProposal) msg.contentObj;
propose(proposal);
}
}
}
public abstract Proposal createProposal(CallForProposal cfp);
public abstract Result performTask(CallForProposal cfp);
public void handleAcceptProposal() {
Result result = performTask(cfp);
ACLMessage msg = null;
if (result.isSuccesful()) {
msg = new ACLMessage(Performative.INFORM);
msg.sender = myAid;
msg.receivers.add(cfp.getInitiator());
msg.contentObj = result;
msm().post(msg);
} else {
msg = new ACLMessage(Performative.FAILURE);
msg.sender = myAid;
msg.receivers.add(cfp.getInitiator());
msm().post(msg);
}
}
@Override
protected void onMessage(ACLMessage msg) {
switch (msg.performative) {
case CALL_FOR_PROPOSAL:
handleCfp(msg);
break;
case REJECT_PROPOSAL:
// handleRejectProposal();
break;
case ACCEPT_PROPOSAL:
handleAcceptProposal();
break;
default:
break;
}
}
}