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 }