package jade.domain;
//#APIDOC_EXCLUDE_FILE
//#MIDP_EXCLUDE_FILE
import java.util.Date;
import jade.core.AID;
import jade.core.AgentManager;
import jade.core.Channel;
import jade.core.Location;
import jade.core.ContainerID;
import jade.core.event.MTPEvent;
import jade.core.event.PlatformEvent;
import jade.domain.FIPAAgentManagement.AMSAgentDescription;
import jade.domain.introspection.AddedContainer;
import jade.domain.introspection.AddedMTP;
import jade.domain.introspection.BornAgent;
import jade.domain.introspection.ChangedAgentOwnership;
import jade.domain.introspection.DeadAgent;
import jade.domain.introspection.EventRecord;
import jade.domain.introspection.FrozenAgent;
import jade.domain.introspection.MovedAgent;
import jade.domain.introspection.PlatformDescription;
import jade.domain.introspection.RemovedContainer;
import jade.domain.introspection.RemovedMTP;
import jade.domain.introspection.ResumedAgent;
import jade.domain.introspection.SuspendedAgent;
import jade.domain.introspection.ThawedAgent;
import jade.util.InputQueue;
public class AMSEventQueueFeeder implements AgentManager.Listener {
private InputQueue eventQueue;
private Location localContainer;
private ams theAms;
public AMSEventQueueFeeder(InputQueue eventQueue, Location localContainer) {
this.eventQueue = eventQueue;
this.localContainer = localContainer;
}
public InputQueue getQueue() {
return eventQueue;
}
void setAms(ams ams) {
theAms = ams;
// Generate a PlatformDescription event in case some AddedMTP or RemovedMTP event happened when the AMS was not yet initialized
PlatformDescription ap = new PlatformDescription();
ap.setPlatform(theAms.getDescriptionAction(null));
EventRecord er = new EventRecord(ap, localContainer);
er.setWhen(new Date());
eventQueue.put(er);
}
public void bornAgent(PlatformEvent ev) {
ContainerID cid = ev.getContainer();
AID agentID = ev.getAgent();
String ownership = ev.getNewOwnership();
BornAgent ba = new BornAgent();
ba.setAgent(agentID);
ba.setWhere(cid);
ba.setState(AMSAgentDescription.ACTIVE);
ba.setOwnership(ownership);
ba.setClassName((String) agentID.getAllUserDefinedSlot().get(AID.AGENT_CLASSNAME));
EventRecord er = new EventRecord(ba, localContainer);
er.setWhen(ev.getTime());
eventQueue.put(er);
}
public void deadAgent(PlatformEvent ev) {
ContainerID cid = ev.getContainer();
AID agentID = ev.getAgent();
DeadAgent da = new DeadAgent();
da.setAgent(agentID);
da.setWhere(cid);
if (ev.getContainerRemoved()) {
da.setContainerRemoved(new Boolean(true));
}
EventRecord er = new EventRecord(da, localContainer);
er.setWhen(ev.getTime());
eventQueue.put(er);
}
public void suspendedAgent(PlatformEvent ev) {
ContainerID cid = ev.getContainer();
AID name = ev.getAgent();
SuspendedAgent sa = new SuspendedAgent();
sa.setAgent(name);
sa.setWhere(cid);
EventRecord er = new EventRecord(sa, localContainer);
er.setWhen(ev.getTime());
eventQueue.put(er);
}
public void resumedAgent(PlatformEvent ev) {
ContainerID cid = ev.getContainer();
AID name = ev.getAgent();
ResumedAgent ra = new ResumedAgent();
ra.setAgent(name);
ra.setWhere(cid);
EventRecord er = new EventRecord(ra, localContainer);
er.setWhen(ev.getTime());
eventQueue.put(er);
}
public void frozenAgent(PlatformEvent ev) {
ContainerID cid = ev.getContainer();
AID name = ev.getAgent();
ContainerID bufferContainer = ev.getNewContainer();
FrozenAgent fa = new FrozenAgent();
fa.setAgent(name);
fa.setWhere(cid);
fa.setBufferContainer(bufferContainer);
EventRecord er = new EventRecord(fa, localContainer);
er.setWhen(ev.getTime());
eventQueue.put(er);
}
public void thawedAgent(PlatformEvent ev) {
ContainerID cid = ev.getContainer();
AID name = ev.getAgent();
ContainerID bufferContainer = ev.getNewContainer();
ThawedAgent ta = new ThawedAgent();
ta.setAgent(name);
ta.setWhere(cid);
ta.setBufferContainer(bufferContainer);
EventRecord er = new EventRecord(ta, localContainer);
er.setWhen(ev.getTime());
eventQueue.put(er);
}
public void movedAgent(PlatformEvent ev) {
ContainerID from = ev.getContainer();
ContainerID to = ev.getNewContainer();
AID agentID = ev.getAgent();
MovedAgent ma = new MovedAgent();
ma.setAgent(agentID);
ma.setFrom(from);
ma.setTo(to);
EventRecord er = new EventRecord(ma, localContainer);
er.setWhen(ev.getTime());
eventQueue.put(er);
}
public void changedAgentPrincipal(PlatformEvent ev) {
ContainerID cid = ev.getContainer();
AID name = ev.getAgent();
ChangedAgentOwnership cao = new ChangedAgentOwnership();
cao.setAgent(name);
cao.setWhere(cid);
cao.setFrom(ev.getOldOwnership());
cao.setTo(ev.getNewOwnership());
EventRecord er = new EventRecord(cao, localContainer);
er.setWhen(ev.getTime());
eventQueue.put(er);
}
public void addedContainer(PlatformEvent ev) {
ContainerID cid = ev.getContainer();
String name = cid.getName();
AddedContainer ac = new AddedContainer();
ac.setContainer(cid);
EventRecord er = new EventRecord(ac, localContainer);
er.setWhen(ev.getTime());
eventQueue.put(er);
}
public void removedContainer(PlatformEvent ev) {
ContainerID cid = ev.getContainer();
String name = cid.getName();
RemovedContainer rc = new RemovedContainer();
rc.setContainer(cid);
EventRecord er = new EventRecord(rc, localContainer);
er.setWhen(ev.getTime());
eventQueue.put(er);
}
public synchronized void changedContainerPrincipal(PlatformEvent ev) {
// FIXME: There is no element in the IntrospectionOntology
// corresponding to this event
}
public synchronized void addedMTP(MTPEvent ev) {
Channel ch = ev.getChannel();
ContainerID cid = ev.getPlace();
String proto = ch.getProtocol();
String address = ch.getAddress();
// Generate a suitable AMS event
AddedMTP amtp = new AddedMTP();
amtp.setAddress(address);
amtp.setProto(proto);
amtp.setWhere(cid);
EventRecord er = new EventRecord(amtp, localContainer);
er.setWhen(ev.getTime());
eventQueue.put(er);
if (theAms != null) {
// The PlatformDescription has changed --> Generate a suitable event
PlatformDescription ap = new PlatformDescription();
ap.setPlatform(theAms.getDescriptionAction(null));
er = new EventRecord(ap, localContainer);
er.setWhen(ev.getTime());
eventQueue.put(er);
}
}
public synchronized void removedMTP(MTPEvent ev) {
Channel ch = ev.getChannel();
ContainerID cid = ev.getPlace();
String proto = ch.getProtocol();
String address = ch.getAddress();
RemovedMTP rmtp = new RemovedMTP();
rmtp.setAddress(address);
rmtp.setProto(proto);
rmtp.setWhere(cid);
EventRecord er = new EventRecord(rmtp, localContainer);
er.setWhen(ev.getTime());
eventQueue.put(er);
if (theAms != null) {
// The PlatformDescription has changed --> Generate a suitable event
PlatformDescription ap = new PlatformDescription();
ap.setPlatform(theAms.getDescriptionAction(null));
er = new EventRecord(ap, localContainer);
er.setWhen(ev.getTime());
eventQueue.put(er);
}
}
public void messageIn(MTPEvent ev) {
// No AMS event corresponds to this MTPEvent --> Just do nothing
}
public void messageOut(MTPEvent ev) {
// No AMS event corresponds to this MTPEvent --> Just do nothing
}
}