private IFlow LoadFlow(XmlFlow xmlFlow)
        {
            string flowId = xmlFlow.Id;

            if (_flowMap.ContainsKey(flowId))
            {
                return(_flowMap[flowId]);
            }

            FlowBuilder <IFlow> flowBuilder  = new FlowBuilder <IFlow>(flowId);
            XmlJobElement       firstElement = xmlFlow.JobElements.First();

            if (firstElement is XmlStep)
            {
                flowBuilder.Start(_stepsMap[firstElement.Id]);
            }
            else
            {
                XmlFlow  xmlSubFlow = firstElement as XmlFlow;
                XmlSplit xmlSplit   = firstElement as XmlSplit;

                flowBuilder.Start(xmlSubFlow != null ? LoadFlow((XmlFlow)firstElement) : LoadSplit(xmlSplit));
            }

            HandleSubElements(flowBuilder, xmlFlow);

            IFlow flow = flowBuilder.End();

            _flowMap[xmlFlow.Id] = flow;
            return(flow);
        }
        private IJob LoadJob(XmlJob xmlJob, JobBuilder jobBuilder)
        {
            FlowBuilder <FlowJobBuilder> jobFlowBuilder;
            XmlJobElement xmlElement = xmlJob.JobElements.First();

            if (xmlElement is XmlStep)
            {
                jobFlowBuilder = jobBuilder.Flow(_stepsMap[xmlElement.Id]);
            }
            else
            {
                XmlFlow  xmlFlow  = xmlElement as XmlFlow;
                XmlSplit xmlSplit = xmlElement as XmlSplit;

                jobFlowBuilder = jobBuilder.Start(xmlFlow != null ? LoadFlow(xmlFlow) : LoadSplit(xmlSplit));
            }

            HandleSubElements(jobFlowBuilder, xmlJob);
            return(jobFlowBuilder.End().Build());
        }