001 /*
002 * Created on Jul 7, 2005 @author paulk
003 */
004 package toolbus.atom.tool;
005
006 import toolbus.TBTermFactory;
007 import toolbus.TBTermVar;
008 import toolbus.atom.Atom;
009 import toolbus.atom.Ref;
010 import toolbus.exceptions.ToolBusException;
011 import toolbus.exceptions.ToolBusExecutionException;
012 import toolbus.parsercup.PositionInformation;
013 import toolbus.process.ProcessExpression;
014 import toolbus.tool.ToolInstance;
015 import aterm.ATerm;
016
017 public class Terminate extends Atom{
018 private final Ref toolId;
019 private final Ref request;
020 private ToolInstance toolInstance;
021
022 public Terminate(ATerm toolId, ATerm request, TBTermFactory tbfactory, PositionInformation posInfo){
023 super(tbfactory, posInfo);
024
025 this.toolId = new Ref(toolId);
026 this.request = new Ref(request);
027 setAtomArgs(new Ref[]{this.toolId});
028 externalNameAsReceivedByTool = "rec-terminate";
029 }
030
031 /**
032 * @see toolbus.process.ProcessExpression#copy()
033 */
034 public ProcessExpression copy(){
035 Atom a = new Terminate(toolId.value, request.value, tbfactory, getPosInfo());
036 a.copyAtomAttributes(this);
037
038 return a;
039 }
040
041 public void activate(){
042 toolInstance = null;
043 super.activate();
044 }
045
046 public boolean execute() throws ToolBusException{
047 if(!isEnabled()) return false;
048
049 if(toolInstance == null){
050 ATerm tid = getEnv().getValue((TBTermVar) toolId.value);
051 toolInstance = getToolBus().getToolInstanceManager().get(tid);
052 if(toolInstance == null) return false;
053 }
054
055 ATerm req = tbfactory.fullSubstitute(request.value, getEnv());
056 if(req == null) throw new ToolBusExecutionException("Illegal terminate request pattern: "+request.value+".", getPosInfo());
057
058 toolInstance.sendTerminate(req);
059 //LoggerFactory.log(this.getProcess().getProcessName(), "Terminate " + request.value, IToolBusLoggerConstants.TOOLCOM);
060 return true;
061 }
062 }