private static IProcess BuildSequence(IReadOnlyList <IInitializer> initializers, InitializerExtractor extractor)
        {
            if (initializers.Count == 0)
            {
                return(null);
            }

            if (initializers.Count == 1)
            {
                return(extractor.AsSingleProcess(initializers[0]));
            }

            var dependentInitializers   = initializers.Where(x => extractor.GetDependencies(x).Any(y => initializers.Any(z => y == z.GetType()))).ToArray();
            var independentInitializers = initializers.Except(dependentInitializers).ToArray();

            var mainProcess = new SequentialProcess();

            if (independentInitializers.Length > 0)
            {
                var parallelProcess = new ParallelProcess();
                parallelProcess.AddRange(independentInitializers.Select(extractor.AsSingleProcess));
                mainProcess.Add(parallelProcess);
            }

            if (dependentInitializers.Length == 0)
            {
                return(mainProcess);
            }

            var process = BuildSequence(dependentInitializers, extractor);

            mainProcess.Add(process);

            return(mainProcess);
        }
        private IProcess BuildProcess(IReadOnlyCollection <IInitializer> initializers, InitializerExtractor extractor)
        {
            var result = _validator.Validate(initializers);

            if (!result.IsValid)
            {
                throw new ValidationException(result);
            }

            var firstInitializer      = initializers.SingleOrDefault(x => extractor.WhereModeEquals(x, RunModes.First));
            var lastInitializer       = initializers.SingleOrDefault(x => extractor.WhereModeEquals(x, RunModes.Last));
            var beginningInitializers = initializers.Where(x => extractor.WhereModeEquals(x, RunModes.Beginning)).ToArray();
            var endingInitializers    = initializers.Where(x => extractor.WhereModeEquals(x, RunModes.Ending)).ToArray();

            var mainProcess = new SequentialProcess();

            if (firstInitializer != null)
            {
                mainProcess.Add(extractor.AsSingleProcess(firstInitializer));
            }

            var sequence = BuildSequence(beginningInitializers, extractor);

            if (sequence != null)
            {
                mainProcess.Add(sequence);
            }

            sequence = BuildSequence(endingInitializers, extractor);
            if (sequence != null)
            {
                mainProcess.Add(sequence);
            }

            if (lastInitializer != null)
            {
                mainProcess.Add(extractor.AsSingleProcess(lastInitializer));
            }

            var optimizedProcess = _optimizer.OptimizeProcess(mainProcess);

            return(optimizedProcess);
        }
Beispiel #3
0
        private IProcess BuildComplexProcess(IReadOnlyCollection <IInitializer> initializers, InitializerConverter converter)
        {
            var firstInitializer      = initializers.SingleOrDefault(x => converter.WhereModeEquals(x, RunModes.First));
            var lastInitializer       = initializers.SingleOrDefault(x => converter.WhereModeEquals(x, RunModes.Last));
            var beginningInitializers = initializers.Where(x => converter.WhereModeEquals(x, RunModes.Beginning)).ToArray();
            var endingInitializers    = initializers.Where(x => converter.WhereModeEquals(x, RunModes.Ending)).ToArray();

            var mainProcess = new SequentialProcess();

            if (firstInitializer != null)
            {
                mainProcess.Add(converter.AsSingleProcess(firstInitializer));
            }

            var sequence = BuildSequence(beginningInitializers, converter);

            if (sequence != null)
            {
                mainProcess.Add(sequence);
            }

            sequence = BuildSequence(endingInitializers, converter);
            if (sequence != null)
            {
                mainProcess.Add(sequence);
            }

            if (lastInitializer != null)
            {
                mainProcess.Add(converter.AsSingleProcess(lastInitializer));
            }

            var optimizedProcess = _optimizer.OptimizeProcess(mainProcess);

            return(optimizedProcess);
        }