001    /*
002     * Created on Jun 25, 2005 @author paulk
003     */
004    package toolbus.atom.note;
005    
006    import java.util.ArrayList;
007    import java.util.Iterator;
008    import java.util.List;
009    import java.util.Set;
010    
011    import toolbus.TBTermFactory;
012    import toolbus.atom.Atom;
013    import toolbus.atom.Ref;
014    import toolbus.exceptions.ToolBusException;
015    import toolbus.exceptions.ToolBusExecutionException;
016    import toolbus.matching.MatchStore;
017    import toolbus.parsercup.PositionInformation;
018    import toolbus.process.ProcessExpression;
019    import toolbus.process.ProcessInstance;
020    import aterm.ATerm;
021    
022    public class SndNote extends Atom{
023            public final ATerm notePattern;
024            
025            public SndNote(ATerm note, TBTermFactory tbfactory, PositionInformation posInfo){
026                    super(tbfactory, posInfo);
027                    this.notePattern = note;
028                    setAtomArgs(new Ref[]{new Ref(note)});
029            }
030            
031            public ProcessExpression copy(){
032                    Atom a = new SndNote(notePattern, tbfactory, getPosInfo());
033                    a.copyAtomAttributes(this);
034                    return a;
035            }
036            
037            public boolean execute() throws ToolBusException{
038                    if(isEnabled()){
039                            MatchStore matchStore = getToolBus().getMatchStore();
040                            Set<ProcessInstance> notePartners = matchStore.getPossibleNotePartners(notePattern);
041                            
042                            if(notePartners.size() == 0) return true;
043                            
044                            ATerm theNote = tbfactory.fullSubstitute(notePattern, getEnv());
045                            if(theNote == null) throw new ToolBusExecutionException("Illegal note pattern: "+theNote+".", getPosInfo());
046                            
047                            Iterator<ProcessInstance> notePartnersIterator = notePartners.iterator();
048                            while(notePartnersIterator.hasNext()){
049                                    ProcessInstance pi = notePartnersIterator.next();
050                                    
051                                    pi.putNoteInQueue(theNote);
052                            }
053                            return true;
054                    }
055                    return false;
056            }
057            
058            public ProcessInstance[] debugExecute() throws ToolBusException{
059                    if(isEnabled()){
060                            MatchStore matchStore = getToolBus().getMatchStore();
061                            Set<ProcessInstance> notePartners = matchStore.getPossibleNotePartners(notePattern);
062                            
063                            if(notePartners.size() == 0) return new ProcessInstance[0];
064                            
065                            ATerm theNote = tbfactory.fullSubstitute(notePattern, getEnv());
066                            if(theNote == null) throw new ToolBusExecutionException("Illegal note pattern: "+theNote+".", getPosInfo());
067                            
068                            List<ProcessInstance> subscribedPartners = new ArrayList<ProcessInstance>();
069                            Iterator<ProcessInstance> notePartnersIterator = notePartners.iterator();
070                            while(notePartnersIterator.hasNext()){
071                                    ProcessInstance pi = notePartnersIterator.next();
072                                    
073                                    pi.putNoteInQueue(theNote);
074                                    subscribedPartners.add(pi);
075                            }
076                            
077                            ProcessInstance[] partners = new ProcessInstance[subscribedPartners.size()];
078                            return subscribedPartners.toArray(partners);
079                    }
080                    return null;
081            }
082    }