001 /* 002 * Created on Jun 26, 2005 003 */ 004 package toolbus.atom.tool; 005 006 import java.util.Stack; 007 008 import toolbus.Functions; 009 import toolbus.State; 010 import toolbus.TBTermFactory; 011 import toolbus.TBTermVar; 012 import toolbus.ToolBus; 013 import toolbus.ToolInstanceManager; 014 import toolbus.atom.Atom; 015 import toolbus.atom.Ref; 016 import toolbus.exceptions.ToolBusException; 017 import toolbus.exceptions.ToolBusExecutionException; 018 import toolbus.parsercup.PositionInformation; 019 import toolbus.process.ProcessExpression; 020 import toolbus.process.ProcessInstance; 021 import toolbus.tool.ToolInstance; 022 import aterm.ATerm; 023 import aterm.ATermAppl; 024 025 /** 026 * Execute a tool 027 */ 028 public class Execute extends Atom{ 029 private final Ref tool; 030 private final Ref rvar; 031 032 public Execute(ATerm tool, ATerm rvar, TBTermFactory tbfactory, PositionInformation posInfo){ 033 super(tbfactory, posInfo); 034 this.tool = new Ref(tool); 035 this.rvar = new Ref(rvar); 036 setAtomArgs(new Ref[]{this.tool, this.rvar}); 037 } 038 public ProcessExpression copy(){ 039 Atom a = new Execute(tool.value, rvar.value, tbfactory, getPosInfo()); 040 a.copyAtomAttributes(this); 041 042 return a; 043 } 044 045 public void compile(ProcessInstance P, Stack<String> calls, State follow) throws ToolBusException{ 046 super.compile(P, calls, follow); 047 048 if(tool.value.getType() != ATerm.APPL) throw new ToolBusExecutionException("Malformed first argument in execute.", getPosInfo()); 049 if(!tbfactory.isResultVar(rvar.value)) throw new ToolBusExecutionException("Second argument of execute should be a result variable.", getPosInfo()); 050 if(!Functions.compatibleTypes(tool.value, rvar.value)) throw new ToolBusExecutionException("Arguments of execute should have the same (tool) type.", getPosInfo()); 051 } 052 053 public boolean execute() throws ToolBusException{ 054 if(!isEnabled()) return false; 055 056 String name = ((ATermAppl) tool.value).getName(); 057 ToolBus toolbus = getToolBus(); 058 ToolInstance toolInstance = new ToolInstance(toolbus.getToolDefinition(name), toolbus); 059 ToolInstanceManager toolInstanceManager = toolbus.getToolInstanceManager(); 060 toolInstanceManager.addPendingTool(toolInstance); 061 062 getEnv().assignVar((TBTermVar) rvar.value, toolInstance.getToolKey()); 063 toolInstance.executeTool(); 064 //LoggerFactory.log(this.getProcess().getProcessName(), "Execute " + tool.value, IToolBusLoggerConstants.TOOLCOM); 065 return true; 066 } 067 }