/// <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); }
/// <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); }