Exemple #1
0
        public void Handle(SmsReceived sms)
        {
            BaseInstance instance = instanceRepository.Peek(sms.PhoneNumber);

            if (instance != null)
            {
                if (this.mapper.MappingExists(sms.Body) && !(instance is ForkInstance))
                {
                    ForkInstance fork = new ForkInstance()
                    {
                        ForkingFromInstance = instance,
                        ForkingFromWorkflow = this.mapper.GetStateMachine(instance.GetType()),
                        ForkingToKeyword = sms.Body,
                        PhoneNumber = sms.PhoneNumber
                    };

                    var stateMachine = this.mapper.GetStateMachine(fork.GetType());

                    stateMachine.RaiseAnEvent(fork, stateMachine.Start, sms.PhoneNumber);

              instanceRepository.Push(sms.PhoneNumber, fork);
                }
                else
                {
                    //then raise the SMS received event
                    var stateMachine = this.mapper.GetStateMachine(instance.GetType());

                    stateMachine.RaiseAnEvent(instance, stateMachine.SMSReceived, sms.Body);

                    if (instance.CurrentState == stateMachine.Final)
                    {
                        instanceRepository.Pop(sms.PhoneNumber);
                    }
                }
            }
            else if (this.mapper.MappingExists(sms.Body))
            {
                //make a new state machine instance
                instance = this.mapper.GetStateMachineInstance(sms.Body);
                IWorkflow stateMachine = this.mapper.GetStateMachine(sms.Body);

                stateMachine.RaiseAnEvent(instance, stateMachine.Start, sms.PhoneNumber);
            instanceRepository.Push(sms.PhoneNumber, instance);
            }
            else
            {
                bus.Publish(new SendSms() { PhoneNumber = sms.PhoneNumber, Body = "That command was not recognized." });
            }
        }