001    /**
002     * @author paulk, Jul 16, 2002
003     */
004    
005    package toolbus.atom.msg;
006    
007    import java.util.List;
008    import toolbus.TBTermFactory;
009    import toolbus.atom.Atom;
010    import toolbus.exceptions.ToolBusException;
011    import toolbus.matching.MatchStore;
012    import toolbus.parsercup.PositionInformation;
013    import toolbus.process.ProcessExpression;
014    import toolbus.process.ProcessInstance;
015    import aterm.ATerm;
016    
017    public class SndMsg extends MsgAtom{
018            private int index;
019            
020            public SndMsg(ATerm msg, TBTermFactory tbfactory, PositionInformation posInfo){
021                    super(msg, tbfactory, posInfo);
022                    
023                    index = 0;
024            }
025            
026            public ProcessExpression copy(){
027                    Atom a = new SndMsg(msg, tbfactory, getPosInfo());
028                    a.copyAtomAttributes(this);
029                    return a;
030            }
031            
032            private boolean matchesPartner(RecMsg recMsg){
033                    return tbfactory.match(recMsg.msg, recMsg.getEnv(), msg, getEnv());
034            }
035            
036            public boolean execute() throws ToolBusException{
037                    if(isEnabled()){
038                            MatchStore matchStore = getToolBus().getMatchStore();
039                            List<RecMsg> msgPartners = matchStore.getPossibleMessagePartners(msg);
040                            
041                            int size = msgPartners.size();
042                            
043                            if(size == 0) return false;
044                            
045                            for(int i = (index++ % size), left = size; left > 0; i = ((i + 1) % size), left--){
046                                    RecMsg recMsg = msgPartners.get(i);
047                                    ProcessInstance pb = recMsg.getProcess();
048                                    
049                                    if(pb.contains(recMsg) && recMsg.isEnabled() && matchesPartner(recMsg)){
050                                            //LoggerFactory.log("unknown", "    " + this, IToolBusLoggerConstants.MESSAGES);
051                                            //LoggerFactory.log("unknown", "<=> " + b, IToolBusLoggerConstants.MESSAGES);
052                                            pb.gotoNextStateAndActivate(recMsg);
053                                            return true;
054                                    }
055                            }
056                    }
057                    return false;
058            }
059            
060            public ProcessInstance[] debugExecute() throws ToolBusException{
061                    if(isEnabled()){
062                            MatchStore matchStore = getToolBus().getMatchStore();
063                            List<RecMsg> msgPartners = matchStore.getPossibleMessagePartners(msg);
064                            
065                            int size = msgPartners.size();
066                            
067                            if(size == 0) return null;
068                            
069                            for(int i = (index++ % size), left = size; left > 0; i = ((i + 1) % size), left--){
070                                    RecMsg recMsg = msgPartners.get(i);
071                                    ProcessInstance pb = recMsg.getProcess();
072                                    
073                                    if(pb.contains(recMsg) && recMsg.isEnabled() && matchesPartner(recMsg)){
074                                            //LoggerFactory.log("unknown", "    " + this, IToolBusLoggerConstants.MESSAGES);
075                                            //LoggerFactory.log("unknown", "<=> " + b, IToolBusLoggerConstants.MESSAGES);
076                                            pb.gotoNextStateAndActivate(recMsg);
077                                            return new ProcessInstance[]{pb};
078                                    }
079                            }
080                    }
081                    return null;
082            }
083    }