//TODO try to simplify this monstrous method void CreateProcessConverters() { //Find the root proces (the one marked as executable) and create its process converter var rootProcessConverter = new ProcessConverter(GetExecutableProcess(), this); processConverters.Add(rootProcessConverter.Id, rootProcessConverter); //Store the newly found converters in a queue var processConverterQueue = new Queue <ProcessConverter>(); processConverterQueue.Enqueue(rootProcessConverter); while (processConverterQueue.Count() > 0) { var currentConverter = processConverterQueue.Dequeue(); var inheritedIdentifiers = processConverters[currentConverter.Id].InstanceIdentifiers; var callActivities = currentConverter.Process.Tasks.Where(t => t is CallActivity).Cast <CallActivity>(); //Look through all call activities of the current process converter foreach (var callActivity in callActivities) { if (Contract.TryGetProcess(callActivity.CalledElement, out var referencedProcess)) { //Create a new process converter based on the target process of the callactivity var calledProcessConverter = new ProcessConverter(referencedProcess, this, callActivity.Id, currentConverter); calledProcessConverter.InstanceIdentifiers.AddRange(inheritedIdentifiers); if (TryGetIdentifier(callActivity, out var identifier)) { calledProcessConverter.InstanceIdentifiers.Add(identifier); } processConverters.Add(calledProcessConverter.Id, calledProcessConverter); processConverterQueue.Enqueue(calledProcessConverter); } } } }
public ProcessConverter(Process process, ContractConverter contractConverter, string parentCallActivityCallName = null, ProcessConverter parentProcessConverter = null) { Process = process; ParentCallActivityId = parentCallActivityCallName; ParentProcessConverter = parentProcessConverter; ContractConverter = contractConverter; if (parentCallActivityCallName == null) { IsRootProcess = true; } else { IsRootProcess = false; } CreateElementConverters(); }
public static ElementConverter CreateConverter(ProcessElement element, ProcessConverter processConverter) { var elementType = element.GetType(); if (elementType == typeof(UserTask)) { return(new UserTaskConverter((UserTask)element, processConverter)); } else if (elementType == typeof(ScriptTask)) { return(new ScriptTaskConverter((ScriptTask)element, processConverter)); } else if (elementType == typeof(BusinessRuleTask)) { return(new BusinessRuleTaskConverter((BusinessRuleTask)element, processConverter)); } else if (elementType == typeof(EndEvent)) { return(new EndEventConverter((EndEvent)element, processConverter)); } else if (elementType == typeof(ExclusiveGateway)) { return(new ExclusiveGatewayConverter((ExclusiveGateway)element, processConverter)); } else if (elementType == typeof(ParallelGateway)) { return(new ParallelGatewayConverter((ParallelGateway)element, processConverter)); } else if (elementType == typeof(StartEvent)) { return(new StartEventConverter((StartEvent)element, processConverter)); } else if (elementType == typeof(CallActivity)) { return(new CallActivityConverter((CallActivity)element, processConverter)); } else if (elementType == typeof(TimerBoundaryEvent)) { return(new TimerBoundaryEventConverter((TimerBoundaryEvent)element, processConverter)); } return(null); }
public void AddProcessConverter(ProcessConverter processConverter) { processConverters.Add(processConverter.Process.Id, processConverter); }