// Skal gennemgå hele trace fra ende til anden ikke gennemgå grafen private void FindEvent(string bpmnSeqId, List <string> trace) { string targetId = trail.GetSequenceFlow(bpmnSeqId).targetRef; if (trail.EndEventExists(targetId) && traceStatus[trace] == trace.Count) { bpmnElements.Add(targetId); return; } else if (trail.ExclusiveGatewayExists(targetId)) { bpmnElements.Add(targetId); trail.GetExclusiveGateWay(targetId).outgoing.ForEach(x => FindEvent(x, trace)); } else if (trail.ParallelGatewayExists(targetId)) { bpmnElements.Add(targetId); trail.GetParallelGateWay(targetId).outgoing.ForEach(x => FindEvent(x, trace)); } else if (trail.TaskExists(targetId)) { if (trace.Count > traceStatus[trace]) { Task task = trail.GetTask(targetId); string curr = string.Empty; for (int i = 0; i <= traceStatus[trace]; i++) { curr += trace[i]; } if (labelId[task.name].Equals(trace[traceStatus[trace]])) { bpmnElements.Add(task.id); traceStatus[trace]++; foreach (string id in task.outgoing) { FindEvent(id, trace); } } } } }
private BPMNTrail FixMergeGateLocationsInRepeatedSequences(List <string> repSeq, Tuple <int, List <int> > startLocs, List <string> trace, BPMNTrail workingTrail) { string idString = string.Empty; List <string> repSeqIds = new List <string>(); List <string> ids = new List <string>(); for (int i = 0; i < repSeq.Count + startLocs.Item1; i++) { idString += trace[i]; if (i >= startLocs.Item1) { repSeqIds.Add(idString); } } if (!(repSeqIds[0] + repSeqIds[0]).Equals(repSeqIds[1])) { foreach (int pos in startLocs.Item2) { idString = string.Empty; for (int i = 0; i < pos + repSeq.Count; i++) { idString += trace[i]; if (i >= pos) { ids.Add(idString); } } } Task current = workingTrail.GetTask(repSeqIds.Last <string>()); Task helperTask1 = null; Task helperTask2 = null; ExclusiveGateway eg = null; SequenceFlow seqFlow = null; int index = 0; string nextId = ids[0]; string helper = string.Empty; while (!current.id.Equals(ids.Last <string>())) { helper = workingTrail.GetSequenceFlow(current.outgoing[0]).targetRef; if (helper.Equals(nextId)) { if (!nextId.Equals(ids.Last <string>())) { nextId = ids[index += 1]; } current = workingTrail.GetTask(helper); } else if (workingTrail.ExclusiveGatewayExists(helper)) { eg = workingTrail.GetExclusiveGateWay(helper); foreach (string s in eg.outgoing) { helper = workingTrail.GetSequenceFlow(s).targetRef; if (helper.Equals(nextId)) { seqFlow = workingTrail.GetSequenceFlow(s); helperTask1 = workingTrail.GetTask(helper); helperTask2 = workingTrail.GetTaskByNameIfIdInList(helperTask1.name, repSeqIds); if (!repSeqIds.Contains(current.id)) { workingTrail.MoveMergeGate(eg.id, workingTrail.GetSequenceFlowByTargetRefId(helperTask2.id).sourceRef, helperTask1.id); } if (!nextId.Equals(ids.Last <string>())) { nextId = ids[index += 1]; } current = helperTask1; break; } } } } } return(workingTrail); }