public final void action(){
switch(state){
case WAITING_MSG_STATE:{
ACLMessage request = myAgent.receive(template);
if(request != null){
getDataStore().put(REQUEST_KEY,request);
state = PREPARE_RESPONSE_STATE;
}else
block();
break;
}
case PREPARE_RESPONSE_STATE:{
DataStore ds = getDataStore();
ACLMessage request = (ACLMessage)ds.get(REQUEST_KEY);
ACLMessage response = null;
state = SEND_RESPONSE_STATE;
try{
response = prepareResponse(request);
}catch(NotUnderstoodException nue){
response = request.createReply();
response.setContent(nue.getMessage());
response.setPerformative(ACLMessage.NOT_UNDERSTOOD);
}catch(RefuseException re){
response = request.createReply();
response.setContent(re.getMessage());
response.setPerformative(ACLMessage.REFUSE);
}
ds.put(RESPONSE_KEY,response);
break;
}
case SEND_RESPONSE_STATE:{
DataStore ds = getDataStore();
ACLMessage response = (ACLMessage)ds.get(RESPONSE_KEY);
if(response != null){
ACLMessage receivedMsg = (ACLMessage)ds.get(REQUEST_KEY);
response = arrangeMessage(receivedMsg,response);
myAgent.send(response);
if(response.getPerformative() == ACLMessage.AGREE)
state = PREPARE_RES_NOT_STATE;
else
state = RESET_STATE;
}else{
//could directly send a resultNotification message.
state = PREPARE_RES_NOT_STATE;
}
break;
}
case PREPARE_RES_NOT_STATE:{
state = SEND_RESULT_NOTIFICATION_STATE;
DataStore ds = getDataStore();
ACLMessage request = (ACLMessage)ds.get(REQUEST_KEY);
ACLMessage response = (ACLMessage)ds.get(RESPONSE_KEY);
ACLMessage resNotification = null;
try{
resNotification = prepareResultNotification(request,response);
}catch(FailureException fe){
resNotification = request.createReply();
resNotification.setContent(fe.getMessage());
resNotification.setPerformative(ACLMessage.FAILURE);
}
ds.put(RESULT_NOTIFICATION_KEY,resNotification);
break;
}
case SEND_RESULT_NOTIFICATION_STATE:{
state = RESET_STATE;
DataStore ds = getDataStore();
ACLMessage resNotification = (ACLMessage)ds.get(RESULT_NOTIFICATION_KEY);
if(resNotification != null){
ACLMessage receivedMsg = (ACLMessage)ds.get(REQUEST_KEY);
myAgent.send(arrangeMessage(receivedMsg,resNotification));
}
break;
}