package jade.core.behaviours; import jade.core.Agent; import jade.core.behaviours.Behaviour; import jade.core.behaviours.CompositeBehaviour; import jade.util.leap.Collection; /** * This behaviour allows modifying on the fly the way an existing behaviour object works * The following piece of code provides an example where we modify the <code>done()</code> * method of an existing behaviour object to print on the standard output a proper message when the behaviour * is completing. * <pr><hr><blockquote><pre> Behaviour b = // get the behaviour object addBehaviour(new WrapperBehaviour(b) { public boolean done() { boolean ret = super.boolean(); if (ret) { System.out.println("done() method returned true --> The behaviour is completing!"); } return ret; } }); </pre></blockquote><hr> * */ public class WrapperBehaviour extends Behaviour { private Behaviour wrappedBehaviour; public WrapperBehaviour(Behaviour wrapped) { super(wrapped.myAgent); wrappedBehaviour = wrapped; // Set a dummy parent to the wrapped-behaviour to allow propagation of upward events and root calculations // from the wrapped behaviour to this WrapperBehaviour wrappedBehaviour.setParent(new CompositeBehaviour() { // Redefine the handle() method to propagate events (note that these are always upwards events // from the wrapped-behaviour) to this WrapperBehaviour protected void handle(RunnableChangedEvent rce) { WrapperBehaviour.this.handle(rce); } // Redefine the root() method to propagate root calculations to this WrapperBehaviour public Behaviour root() { return WrapperBehaviour.this.root(); } protected void scheduleFirst() {} protected void scheduleNext(boolean currentDone, int currentResult) {} protected boolean checkTermination(boolean currentDone, int currentResult) {return false;} protected Behaviour getCurrent() {return null;} public Collection getChildren() {return null;} }); } protected void handle(RunnableChangedEvent rce) { super.handle(rce); // If the event is downwards, propagate it to the wrapped-behaviour if (!rce.isUpwards()) { wrappedBehaviour.handle(rce); } } public void setAgent(Agent a) { super.setAgent(a); wrappedBehaviour.setAgent(a); } void setParent(CompositeBehaviour parent) { super.setParent(parent); wrappedBehaviour.setWrappedParent(parent); } public void setDataStore(DataStore ds) { wrappedBehaviour.setDataStore(ds); } public DataStore getDataStore() { return wrappedBehaviour.getDataStore(); } public void reset() { wrappedBehaviour.reset(); super.reset(); } public void onStart() { wrappedBehaviour.onStart(); } public void action() { wrappedBehaviour.action(); } public boolean done() { return wrappedBehaviour.done(); } public int onEnd() { return wrappedBehaviour.onEnd(); } public Behaviour getWrappedBehaviour() { return wrappedBehaviour; } }