package jade.proto;
import jade.core.*;
import jade.core.behaviours.*;
import jade.lang.acl.*;
/**
* This behaviour is designed to be used together with the Single-Session responder protocol classes.
* More in details it is aimed at dealing with protocol initiation messages and dispatching them to
* responders. The latter are created by means of the <code>createResponder()</code> abstract method
* that developers must implement.
* @author Giovanni Caire
*
* @see SSContractNetResponder
* @see SSIteratedContractNetResponder
* @see SSIteratedAchieveREtResponder
*/
public abstract class SSResponderDispatcher extends CyclicBehaviour {
private ConversationList activeConversations;
private MessageTemplate template;
public SSResponderDispatcher(Agent a, MessageTemplate tpl) {
super(a);
activeConversations = new ConversationList(a);
template = MessageTemplate.and(
tpl,
activeConversations.getMessageTemplate());
}
public final void action() {
ACLMessage msg = myAgent.receive(template);
if (msg != null) {
// Be sure a conversation-id is set. If not create a suitable one
if (msg.getConversationId() == null) {
msg.setConversationId(createConversationId(myAgent.getLocalName()));
}
final String convId = msg.getConversationId();
Behaviour ssResponder = createResponder(msg);
if (ssResponder != null) {
activeConversations.registerConversation(convId);
SequentialBehaviour sb = new SequentialBehaviour() {
private static final long serialVersionUID = 12345678L;
public int onEnd() {
activeConversations.deregisterConversation(convId);
return super.onEnd();
}
};
sb.setBehaviourName(convId+"-Responder");
sb.addSubBehaviour(createResponder(msg));
myAgent.addBehaviour(sb);
}
}
else {
block();
}
}
/**
* This method is responsible for creating a suitable <code>Behaviour</code> acting as responder
* in the interaction protocol initiated by message <code>initiationMsg</code>.
* @param initiationMsg The message initiating the interaction protocol
* @return
*/
protected abstract Behaviour createResponder(ACLMessage initiationMsg);
private static long cnt = 0;
private synchronized static String createConversationId(String name) {
return "C-"+name+'-'+System.currentTimeMillis()+'-'+(cnt++);
}
}