package jade.wrapper.gateway;
//#J2ME_EXCLUDE_FILE
import jade.core.Agent;
import jade.core.behaviours.*;
import jade.util.Logger;
/**
* This agent is the gateway able to execute all commands requests received via JadeGateway.
* <p>
* <code>JadeGateway</code> enables two alternative ways to implement a gateway
* that allows non-JADE code to communicate with JADE agents.
* <br> The first one is to extend the <code>GatewayAgent</code>
* <br> The second one is to extend this <code>GatewayBehaviour</code> and add an instance
* of this Behaviour to your own agent that will have to function as a gateway (see its javadoc for reference).
* @see JadeGateway
* @see GatewayBehaviour
* @author Fabio Bellifemine, Telecom Italia LAB
* @version $Date: 2010-01-26 17:27:22 +0100 (mar, 26 gen 2010) $ $Revision: 6253 $
**/
public class GatewayAgent extends Agent {
private GatewayBehaviour myB = null;
private GatewayListener listener;
private final Logger myLogger = Logger.getMyLogger(this.getClass().getName());
/** subclasses may implement this method.
* The method is called each time a request to process a command
* is received from the JSP Gateway.
* <p> The recommended pattern is the following implementation:
<code>
if (c instanceof Command1)
exexCommand1(c);
else if (c instanceof Command2)
exexCommand2(c);
</code>
* </p>
* <b> REMIND THAT WHEN THE COMMAND HAS BEEN PROCESSED,
* YOU MUST CALL THE METHOD <code>releaseCommand</code>.
* <br>Sometimes, you might prefer launching a new Behaviour that processes
* this command and release the command just when the Behaviour terminates,
* i.e. in its <code>onEnd()</code> method.
**/
protected void processCommand(final Object command) {
if (command instanceof Behaviour) {
SequentialBehaviour sb = new SequentialBehaviour(this);
sb.addSubBehaviour((Behaviour) command);
sb.addSubBehaviour(new OneShotBehaviour(this) {
public void action() {
GatewayAgent.this.releaseCommand(command);
}
});
addBehaviour(sb);
}
else {
myLogger.log(Logger.WARNING, "Unknown command "+command);
}
}
/**
* notify that the command has been processed and remove the command from the queue
* @param command is the same object that was passed in the processCommand method
**/
final public void releaseCommand(Object command) {
myB.releaseCommand(command);
}
public GatewayAgent() {
// enable object2agent communication with queue of infinite length
setEnabledO2ACommunication(true, 0);
}
/*
* Those classes that extends this setup method of the GatewayAgent
* MUST absolutely call <code>super.setup()</code> otherwise this
* method is not executed and the system would not work.
* @see jade.core.Agent#setup()
*/
protected void setup() {
myLogger.log(Logger.INFO, "Started GatewayAgent "+getLocalName());
myB = new GatewayBehaviour() {
protected void processCommand(Object command){
((GatewayAgent)myAgent).processCommand(command);
}
};
addBehaviour(myB);
setO2AManager(myB);
if (listener != null) {
listener.handleGatewayConnected();
}
}
protected void takeDown() {
if (listener != null) {
listener.handleGatewayDisconnected();
}
}
// No need for synchronizations since this is only called when the Agent Thread has not started yet
void setListener(GatewayListener listener) {
this.listener = listener;
}
}