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 /**
015 * @author paulk, Aug 7, 2002
016 */
017 public class Do extends Atom{
018 private final Ref toolId;
019 private final Ref request;
020 private ToolInstance toolInstance;
021
022 public Do(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, this.request});
028 externalNameAsReceivedByTool = "rec-do";
029 }
030
031 public ProcessExpression copy(){
032 Atom a = new Do(toolId.value, request.value, tbfactory, getPosInfo());
033 a.copyAtomAttributes(this);
034
035 return a;
036 }
037
038 public void activate(){
039 toolInstance = null;
040 super.activate();
041 }
042
043 public boolean execute() throws ToolBusException{
044 if(!isEnabled()) return false;
045
046 if(toolInstance == null){
047 ATerm tid = getEnv().getValue((TBTermVar) toolId.value);
048 toolInstance = getToolBus().getToolInstanceManager().get(tid);
049 if(toolInstance == null) return false;
050 }
051
052 if(toolInstance.tryDoEval()){
053 ATerm req = tbfactory.fullSubstitute(request.value, getEnv());
054 if(req == null) throw new ToolBusExecutionException("Illegal do request pattern: "+request.value+".", getPosInfo());
055
056 toolInstance.sendDo(req);
057 //LoggerFactory.log(this.getProcess().getProcessName(), "Do " + request.value, IToolBusLoggerConstants.TOOLCOM);
058 return true;
059 }
060 return false;
061 }
062 }