001 package toolbus.atom.tool;
002
003 import toolbus.TBTermFactory;
004 import toolbus.TBTermVar;
005 import toolbus.atom.Atom;
006 import toolbus.atom.Ref;
007 import toolbus.exceptions.ToolBusException;
008 import toolbus.exceptions.ToolBusExecutionException;
009 import toolbus.parsercup.PositionInformation;
010 import toolbus.process.ProcessExpression;
011 import toolbus.tool.ToolInstance;
012 import aterm.ATerm;
013
014 public class SndResponse extends Atom{
015 private final Ref toolId;
016 private final Ref response;
017 private ToolInstance toolInstance;
018
019 public SndResponse(ATerm toolId, ATerm response, TBTermFactory tbfactory, PositionInformation posInfo){
020 super(tbfactory, posInfo);
021
022 this.toolId = new Ref(toolId);
023 this.response = new Ref(response);
024 setAtomArgs(new Ref[]{this.toolId, this.response});
025 externalNameAsReceivedByTool = "rec-response";
026 }
027
028 public ProcessExpression copy(){
029 Atom a = new SndResponse(toolId.value, response.value, tbfactory, getPosInfo());
030 a.copyAtomAttributes(this);
031
032 return a;
033 }
034
035 public void activate(){
036 toolInstance = null;
037 super.activate();
038 }
039
040 public boolean execute() throws ToolBusException{
041 if(!isEnabled()) return false;
042
043 if(toolInstance == null){
044 ATerm tid = getEnv().getValue((TBTermVar) toolId.value);
045 toolInstance = getToolBus().getToolInstanceManager().get(tid);
046 if(toolInstance == null) return false;
047 }
048
049 ATerm responseTerm = tbfactory.fullSubstitute(response.value, getEnv());
050 if(responseTerm == null) throw new ToolBusExecutionException("Illegal response term pattern: "+responseTerm+".", getPosInfo());
051
052 toolInstance.sendResponse(responseTerm);
053
054 return true;
055 }
056 }