package agents;
import jade.core.AID;
import jade.core.Agent;
import jade.core.behaviours.CyclicBehaviour;
import jade.core.behaviours.OneShotBehaviour;
import jade.domain.DFService;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.FIPAException;
import jade.lang.acl.ACLMessage;
import java.util.logging.Level;
import java.util.logging.Logger;
import vocabularies.NodeVocabulary;
/**
* ResourceAgent
*
* @author Smit, Edo
*/
public class ResourceAgent extends Agent implements NodeVocabulary {
/**
* The name of the service the resource provides
*/
private String serviceName;
@Override
public void setup() {
Object[] arguments = getArguments();
// Check if an argument has been set
if ((arguments != null) && (arguments.length == 1) && (arguments[0] instanceof String)) {
String argument = (String) arguments[0];
if (argument.equals("Add")) {
serviceName = ResourceType.ADD.toString();
} else if (argument.equals("Substract")) {
serviceName = ResourceType.SUBSTRACT.toString();
} else if (argument.equals("Multiply")) {
serviceName = ResourceType.MULTIPLY.toString();;
} else if (argument.equals("Divide")) {
serviceName = ResourceType.DIVIDE.toString();;
}
}
// Check if the service has been set
if (serviceName == null) {
serviceName = OPERATION_UNKNOWN;
}
Logger.getLogger(ResourceAgent.class.getName()).log(Level.SEVERE,
"{0} running as {1}",
new Object[]{getAID().getLocalName(), serviceName});
DFAgentDescription dfd = new DFAgentDescription();
dfd.setName(getAID());
ServiceDescription sd = new ServiceDescription();
sd.setType(RESOURCE_AGENT_TYPE);
sd.setName(serviceName);
dfd.addServices(sd);
addBehaviour(new ResourceBehaviour());
try {
DFService.register(this, dfd);
} catch (FIPAException fe) {
Logger.getLogger(ResourceAgent.class.getName()).log(Level.SEVERE, null, fe);
}
}
protected void takeDown() {
try {
DFService.deregister(this);
} catch (Exception ex) {
Logger.getLogger(NodeAgent.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
*
*/
class DeleteBehaviour extends OneShotBehaviour {
@Override
public void action() {
myAgent.doDelete();
}
} // End inner class DeleteBehaviour
/**
*
*/
class ResourceBehaviour extends CyclicBehaviour {
/**
*
*/
public ResourceBehaviour() {
}
/**
*
* @param a
*/
public ResourceBehaviour(Agent a) {
super(a);
}
@Override
public void action() {
ACLMessage message = myAgent.receive();
if (message != null) {
Logger.getLogger(NodeAgent.class.getName()).log(Level.INFO,
"{0} recieved message with performative {1}.",
new Object[]{myAgent.getLocalName(), ACLMessage.getPerformative(message.getPerformative())});
switch (message.getPerformative()) {
case ACLMessage.CANCEL:
Logger.getLogger(ResourceAgent.class.getName()).log(Level.INFO, "{0} shutting down.", myAgent.getLocalName());
myAgent.doDelete();
break;
case ACLMessage.REQUEST:
// Send a response to the NodeAgent
int result = processRequest(message);
sendResponse(message, result);
}
} else {
block();
}
}
private int processRequest(ACLMessage message) {
int result = 0;
String[] values = message.getContent().split(";");
int value1 = Integer.parseInt(values[0]);
int value2 = Integer.parseInt(values[1]);
switch (ResourceType.valueOf(serviceName)) {
case ADD:
result = value1 + value2;
break;
case SUBSTRACT:
result = value1 - value2;
break;
case DIVIDE:
// Can not divide by zero
if (value2 == 0) {
result = value1 / 1;
} else {
result = value1 / value2;
}
break;
case MULTIPLY:
result = value1 * value2;
break;
}
Logger.getLogger(ResourceAgent.class.getName()).log(Level.INFO,
"{0} not busy anymore.",
myAgent.getLocalName());
return result;
}
/**
* Sends a response to the NodeAgent
*
* @param message
*/
private void sendResponse(ACLMessage message, int result) {
ACLMessage response = message.createReply();
response.setPerformative(ACLMessage.INFORM);
response.setContent(Integer.toString(result));
myAgent.send(response);
Logger.getLogger(ResourceAgent.class.getName()).log(Level.INFO,
"{0} not busy anymore.",
myAgent.getLocalName());
}
} // End class NodeBehaviour
public enum ResourceType {
ADD(0), SUBSTRACT(1), DIVIDE(2), MULTIPLY(3);
private int type;
private ResourceType(int c) {
type = c;
}
public int getType() {
return type;
}
}
}