コード例 #1
0
        /// <summary>
        /// Get process from a simple diagram
        /// </summary>
        /// <returns></returns>
        private STParsedProcess GetProcessFromSimpleDiagram(IEnumerable <XElement> startEvents)
        {
            var xElements = startEvents.ToList();

            if (!xElements.Any())
            {
                return(null);
            }
            var process = new STParsedProcess();

            foreach (var startEvent in xElements)
            {
                //Initiate start transition
                var startTransition = new STProcessTransition
                {
                    Name               = startEvent.ID,
                    TransitionType     = startEvent.TypeName.ToUpperFirstString().GetTransitionType(),
                    TransitionSettings = XSettings.FirstOrDefault(x => x?["id"] == startEvent.ID).ToStringSettings()
                };

                var xOutgoings = startEvent.Elements["outgoing"];
                if (!xOutgoings.Any())
                {
                    continue;
                }
                var nextTransitions = GetOutgoingXElementTransitions(xOutgoings).ToList();
                startTransition.OutgoingTransitions = ConvertXElementToXComing <STOutgoingTransition>(xOutgoings, startTransition);
                var go = xOutgoings.Any();
                while (go)
                {
                    var(nextTrans, recycle) = GetNextTransitions(nextTransitions);

                    foreach (var nextTransition in nextTrans)
                    {
                        //TODO: Parse simple diagram
                    }

                    go = recycle;
                }
            }

            return(process);
        }
コード例 #2
0
        /// <summary>
        /// Get processes
        /// </summary>
        /// <returns></returns>
        public IEnumerable <STProcess> GetProcesses()
        {
            ValidateInit();
            var processes = new List <STProcess>();

            if (XSchema == null)
            {
                return(processes);
            }

            if (XSchema.IsCollaborationDiagram())
            {
                processes = GetProcessFromCollaborationDiagram().ToList();
            }
            else
            {
                var startEvents = XSchema.Elements.Where(x => x.TypeName.ToUpperFirstString().GetTransitionType() == TransitionType.StartEvent);
                if (!startEvents.Any())
                {
                    return(processes);
                }
                {
                    var sequences = XSchema.Elements.Where(x =>
                                                           x.TypeName.ToUpperFirstString().GetTransitionType() == TransitionType.SequenceFlow).ToList();

                    if (!sequences.Any())
                    {
                        return(processes);
                    }
                    {
                        var prElement = XSchema.Elements.FirstOrDefault(x => x.TypeName.ToUpperFirstString().GetTransitionType() == TransitionType.Process);
                        var process   = new STProcess
                        {
                            Name = prElement?.ID,
                            ProcessTransitions = new List <STProcessTransition>(),
                            ProcessSettings    = XSettings.FirstOrDefault(x => x?["id"] == prElement?.ID).ToStringSettings(),
                            Created            = DateTime.Now,
                            Changed            = DateTime.Now
                        };
                        foreach (var sequence in sequences)
                        {
                            var source = sequence.Attributes["sourceRef"];
                            var target = sequence.Attributes["targetRef"];

                            //Check source
                            if (string.IsNullOrEmpty(source))
                            {
                                continue;
                            }
                            //Check if source exist
                            var sourceTransition = process.ProcessTransitions.FirstOrDefault(x => x.Name == source);
                            if (sourceTransition == null)
                            {
                                var sourceElement = XSchema.Elements.FirstOrDefault(x => x.ID == source);
                                if (sourceElement == null)
                                {
                                    continue;
                                }
                                {
                                    var newSourceTran = new STProcessTransition
                                    {
                                        Id   = Guid.NewGuid(),
                                        Name = source,
                                        TransitionSettings = XSettings.FirstOrDefault(x => x?["id"] == source).ToStringSettings(),
                                        TransitionType     = sourceElement.TypeName.ToUpperFirstString().GetTransitionType()
                                    };

                                    if (string.IsNullOrEmpty(target))
                                    {
                                        continue;
                                    }
                                    {
                                        //Check if target exist
                                        var trans = process.ProcessTransitions.FirstOrDefault(x => x.Name == target);

                                        //Check if exist transition has Incoming transition
                                        if (trans != null)
                                        {
                                            var existIncoming = trans.IncomingTransitions.FirstOrDefault(x => x.IncomingTransitionId == newSourceTran.Id);
                                            if (existIncoming == null)
                                            {
                                                process.ProcessTransitions[process.ProcessTransitions.IndexOf(trans)].IncomingTransitions.Add(new STIncomingTransition
                                                {
                                                    IncomingTransitionId = newSourceTran.Id,
                                                    ProcessTransitionId  = trans.Id
                                                });
                                            }
                                        }
                                        //Create new target transition
                                        else
                                        {
                                            var targetElement = XSchema.Elements.FirstOrDefault(x => x.ID == target);
                                            if (targetElement != null)
                                            {
                                                var newSourceTran1 = new STProcessTransition
                                                {
                                                    Id                  = Guid.NewGuid(),
                                                    Name                = target,
                                                    TransitionType      = targetElement.TypeName.ToUpperFirstString().GetTransitionType(),
                                                    TransitionSettings  = XSettings.FirstOrDefault(x => x?["id"] == target).ToStringSettings(),
                                                    IncomingTransitions = new List <STIncomingTransition> {
                                                        new STIncomingTransition {
                                                            IncomingTransitionId = newSourceTran.Id,
                                                            ProcessTransitionId  = trans.Id
                                                        }
                                                    }
                                                };
                                                process.ProcessTransitions.Add(newSourceTran1);
                                            }
                                        }
                                    }
                                }
                            }
                            //Check if transition has outgoing
                            else
                            {
                                if (string.IsNullOrEmpty(target))
                                {
                                    continue;
                                }
                                //Check outgoing transition
                                var outTransition = process.ProcessTransitions.FirstOrDefault(x => x.Name == target);
                                if (outTransition == null)
                                {
                                    continue;
                                }
                                {
                                    var exist = sourceTransition.OutgoingTransitions.FirstOrDefault(x => x.OutgoingTransitionId == outTransition.Id);
                                    if (exist == null)
                                    {
                                        sourceTransition.OutgoingTransitions.Add(new STOutgoingTransition
                                        {
                                            ProcessTransitionId  = sourceTransition.Id,
                                            OutgoingTransitionId = outTransition.Id
                                        });
                                    }
                                }
                            }
                        }
                        processes.Add(process);
                    }
                }
            }

            return(processes);
        }