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    }