001 /* 002 * Created on Jun 25, 2005 @author paulk 003 */ 004 package toolbus.atom.note; 005 006 import java.util.Stack; 007 008 import toolbus.State; 009 import toolbus.TBTermFactory; 010 import toolbus.atom.Atom; 011 import toolbus.atom.Ref; 012 import toolbus.exceptions.ToolBusException; 013 import toolbus.exceptions.ToolBusExecutionException; 014 import toolbus.matching.MatchStore; 015 import toolbus.parsercup.PositionInformation; 016 import toolbus.process.ProcessExpression; 017 import toolbus.process.ProcessInstance; 018 import aterm.ATerm; 019 020 public class Subscribe extends Atom{ 021 public final ATerm notePattern; 022 023 public Subscribe(ATerm msgpat, TBTermFactory tbfactory, PositionInformation posInfo){ 024 super(tbfactory, posInfo); 025 this.notePattern = msgpat; 026 setAtomArgs(new Ref[]{new Ref(msgpat)}); 027 } 028 029 public ProcessExpression copy(){ 030 Atom a = new Subscribe(notePattern, tbfactory, getPosInfo()); 031 a.copyAtomAttributes(this); 032 return a; 033 } 034 035 public void compile(ProcessInstance pi, Stack<String> calls, State follow) throws ToolBusException{ 036 super.compile(pi, calls, follow); 037 038 registerPartners(); 039 } 040 041 public void registerPartners(){ 042 MatchStore matchStore = getToolBus().getMatchStore(); 043 matchStore.registerSubscribeNote(this); 044 } 045 046 public void destroy(){ 047 MatchStore matchStore = getToolBus().getMatchStore(); 048 matchStore.deregisterSubscribeNote(this); 049 } 050 051 public ATerm getMatchPattern(){ 052 return notePattern; 053 } 054 055 public boolean execute() throws ToolBusException{ 056 if(!isEnabled()) return false; 057 058 ATerm subscribePattern = tbfactory.fullSubstitute(notePattern, getEnv()); 059 if(subscribePattern == null) throw new ToolBusExecutionException("Illegal subscription pattern: "+notePattern+".", getPosInfo()); 060 061 getProcess().subscribe(subscribePattern); 062 return true; 063 } 064 }