/*
* Cooperative Systems
*/
package src.coop;
import jade.content.lang.Codec;
import jade.content.lang.Codec.CodecException;
import jade.content.lang.xml.*;
import jade.domain.DFService;
import jade.domain.FIPAAgentManagement.*;
import jade.domain.FIPAException;
import jade.content.onto.Ontology;
import jade.content.onto.OntologyException;
import jade.content.*;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import jade.core.Agent;
import jade.core.behaviours.Behaviour;
import jade.core.behaviours.CyclicBehaviour;
/**
* Implementation of the logistics Agent
* @author Rudolf Mühlbauer, Aurel Wildfellner
*/
public class LogisticAgent extends Agent {
private Codec codec = new XMLCodec();
private Ontology ontology = BiFabOntology.getInstance();
// message behaviour
Behaviour messageBeh = new CyclicBehaviour(this) {
@Override
public void action() {
MessageTemplate mt = MessageTemplate.and(
MessageTemplate.MatchLanguage(codec.getName()),
MessageTemplate.MatchOntology(ontology.getName()));
ACLMessage msg = receive();
if (msg != null) {
try {
ContentElement ce = null;
if (msg.getPerformative() == ACLMessage.QUERY_IF) {
ce = getContentManager().extractContent(msg);
if (ce instanceof Deliver) {
// delivers immediatly
onDeliver((Deliver) ce);
} else {
System.out.println("LogisticAgent " + getLocalName()
+ " received unexpected, " + ce.toString());
}
} else {
System.out.println("LogisticAgent " + getLocalName()
+ " received non-INFORM");
}
} catch (CodecException ce) {
ce.printStackTrace();
} catch (OntologyException oe) {
oe.printStackTrace();
}
} else {
block();
}
}
};
private void onDeliver(Deliver ce) throws CodecException, OntologyException {
System.out.println("LogisticAgent " + getLocalName()
+ " sending " + ce.getResource() + "/" + ce.count
+ " from " + ce.getSource().getLocalName()
+ " to: " + ce.dest.getLocalName());
// this message is received from the storage when something is to be
// delivered
Delivered delivered = new Delivered(ce.resource, ce.count);
ACLMessage requestMsg = new ACLMessage(ACLMessage.QUERY_IF);
requestMsg.addReceiver(ce.dest);
requestMsg.setLanguage(codec.getName());
requestMsg.setOntology(ontology.getName());
getContentManager().fillContent(requestMsg, delivered);
send(requestMsg);
}
@Override
protected void setup() {
getContentManager().registerLanguage(codec);
getContentManager().registerOntology(ontology);
//Register the book-selling service in the yellow pages
DFAgentDescription dfd = new DFAgentDescription();
dfd.setName(getAID());
ServiceDescription sd = new ServiceDescription();
sd.setType("Logistics");
sd.setName(getLocalName() + "Logistics");
dfd.addServices(sd);
try {
DFService.register(this, dfd);
} catch (FIPAException fe) {
fe.printStackTrace();
}
addBehaviour(messageBeh);
}
@Override
protected void takeDown() {
System.out.println("Logistic Agent " + getAID().getName() + "exits.");
//Deregister from yellow pages
try {
DFService.deregister(this);
} catch (FIPAException fe) {
fe.printStackTrace();
}
}
}