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.AFun; 013 import aterm.ATerm; 014 import aterm.ATermAppl; 015 import aterm.ATermList; 016 017 /** 018 * @author paulk, Jul 31, 2002 019 */ 020 public class AckEvent extends Atom{ 021 private final Ref toolId; 022 private final Ref event; 023 private final Ref callbackData; 024 private ToolInstance toolInstance; 025 026 public AckEvent(ATerm toolId, ATerm event, ATerm callbackData, TBTermFactory tbfactory, PositionInformation posInfo){ 027 super(tbfactory, posInfo); 028 029 this.toolId = new Ref(toolId); 030 this.event = new Ref(event); 031 this.callbackData = new Ref(callbackData); 032 setAtomArgs(new Ref[]{this.toolId, this.event}); 033 externalNameAsReceivedByTool = "rec-ack-event"; 034 } 035 036 public ProcessExpression copy(){ 037 Atom a = new AckEvent(toolId.value, event.value, callbackData.value, tbfactory, getPosInfo()); 038 a.copyAtomAttributes(this); 039 040 return a; 041 } 042 043 public void activate(){ 044 toolInstance = null; 045 super.activate(); 046 } 047 048 public boolean execute() throws ToolBusException{ 049 if(!isEnabled()) return false; 050 051 if(toolInstance == null){ 052 ATerm tid = getEnv().getValue((TBTermVar) toolId.value); 053 toolInstance = getToolBus().getToolInstanceManager().get(tid); 054 if(toolInstance == null) return false; 055 } 056 057 // Construct an ack appl with the right amount of arguments. 058 AFun ackFun = ((ATermAppl) event.value).getAFun(); 059 int arity = ackFun.getArity(); 060 ATerm[] arguments = new ATerm[arity]; 061 for(int i = 0; i < arity; i++){ 062 arguments[i] = tbfactory.EmptyList; 063 } 064 ATermAppl ackAppl = tbfactory.makeAppl(ackFun, arguments); 065 066 // Get the callback data if present. 067 ATerm callbackTerm = callbackData.value; 068 if(callbackTerm == null){ 069 callbackTerm = tbfactory.EmptyList; 070 }else{ 071 callbackTerm = tbfactory.fullSubstitute(callbackTerm, getEnv()); 072 if(callbackTerm == null) throw new ToolBusExecutionException("Illegal callback term pattern: "+callbackTerm+".", getPosInfo()); 073 } 074 075 // Construct the ack event. 076 ATermList ackEvent = tbfactory.makeList(); 077 ackEvent = ackEvent.insert(callbackTerm); 078 ackEvent = ackEvent.insert(ackAppl); 079 080 toolInstance.sendAckEvent(ackEvent); 081 082 //LoggerFactory.log(this.getProcess().getProcessName(), "AckEvent " + event.value, IToolBusLoggerConstants.TOOLCOM); 083 return true; 084 } 085 }