示例#1
0
 public void AddEventLog(EventLog item)
 {
     _context.EventLog.Add(item);
     _context.SaveChanges();
 }
        public void AddStateMachine(StateMachineModel model)
        {
            var addedTriggers = new List <string>();
            var addedStates   = new List <string>();

            var stateMachineDefinition = new SMDefinition
            {
                Name       = model.Name,
                Agenda     = model.Agenda,
                Version    = model.Version,
                Definition = model.Definition.ToString(Formatting.None),
            };

            _context.SMDefinition.Add(stateMachineDefinition);
            _context.SaveChanges();

            var initialStateName = (string)model.Definition["initial"];
            var allObjects       = model.Definition.DescendantsAndSelf().OfType <JObject>();

            var stateTokens      = allObjects.Where(x => x.ContainsKey("kind"));
            var transitionTokens = allObjects.Where(x => x.ContainsKey("target"));
            var stateTypeId      = _context.ElementType.FirstOrDefault(x => x.Name.Equals("state")).Id;
            var transitionTypeId = _context.ElementType.FirstOrDefault(x => x.Name.Equals("transition")).Id;

            foreach (var transition in transitionTokens)
            {
                if (!addedTriggers.Contains((string)transition["event"]))
                {
                    var newTrigger = new TransitionTrigger
                    {
                        Name = (string)transition["event"]
                    };

                    addedTriggers.Add(newTrigger.Name);

                    _context.TransitionTrigger.Add(newTrigger);
                }
            }

            foreach (var state in stateTokens)
            {
                if (!addedStates.Contains((string)state["id"]))
                {
                    var newState = new Element
                    {
                        SMDefinitionId = stateMachineDefinition.Id,
                        ElementTypeId  = stateTypeId,
                        Name           = (string)state["id"]
                    };

                    addedStates.Add(newState.Name);

                    _context.Element.Add(newState);
                }
            }

            _context.SaveChanges();

            foreach (var state in stateTokens)
            {
                var childTransitionTokens = state["states"] == null
                    ? state.DescendantsAndSelf().OfType <JObject>().Where(x => x.ContainsKey("target"))
                    : state.SelectToken("transitions").Children().OfType <JObject>().Where(x => x.ContainsKey("target"));

                foreach (var childTransition in childTransitionTokens)
                {
                    var newTransition = new Element
                    {
                        ElementTypeId       = transitionTypeId,
                        SMDefinitionId      = stateMachineDefinition.Id,
                        OldStateId          = _context.Element.FirstOrDefault(x => x.ElementTypeId == stateTypeId && x.Name.Equals((string)state["id"])).Id,
                        NewStateId          = _context.Element.FirstOrDefault(x => x.ElementTypeId == stateTypeId && x.Name.Equals((string)childTransition["target"])).Id,
                        TransitionTriggerId = _context.TransitionTrigger.FirstOrDefault(x => x.Name.Equals((string)childTransition["event"])).Id
                    };

                    _context.Element.Add(newTransition);
                }
            }

            stateMachineDefinition.InitialStateId = _context.Element.FirstOrDefault(x => x.ElementTypeId == stateTypeId && x.Name.Equals(initialStateName)).Id;

            _context.SaveChanges();
        }