Click here to Skip to main content
15,896,348 members
Articles / Programming Languages / C#

Data-controlled Processes Application Design

Rate me:
Please Sign up or sign in to vote.
4.65/5 (7 votes)
23 Nov 2009CPOL10 min read 30.3K   376   34  
A ready-to-use process manager provided
using System.Collections;
using System.Collections.Generic;

namespace DataDriven
{
    public abstract class DataProcessSet : IEnumerable<AddProcessParams>
    {
        private readonly List<AddProcessParams> processes = new List<AddProcessParams>();
        private readonly List<InputRequirement> setInputRequirements = new List<InputRequirement>();
        private readonly List<AddProcessParams> possibleLastProcesses = new List<AddProcessParams>();

        /*protected List<ProcessInputRequirements> OverAllInputRequirement
        {
            get { return overAllInputRequirements; }
        }*/
        internal protected void AddSetInputRequirement(InputRequirement requirement)
        {
            setInputRequirements.Add(requirement);
        }
        public void Add(IDataProcess process)
        {
            var param = new AddProcessParams(process);
            AddActions(param);
            processes.Add(param);
            AddToPossibleLastProcesses(param);
        }

        protected virtual void AddActions(AddProcessParams param)
        {
        }

        protected virtual void AddActions(DataProcessSet set)
        {
        }
        public void Add(DataProcessSet set)
        {
            AddActions(set);
            IEnumerable<AddProcessParams> enumerable = set.FlattenProcesses() ?? set.Processes;
            foreach (AddProcessParams param in enumerable)
            {
                foreach (InputRequirement requirement in set.setInputRequirements)
                    param.InputRequirements.AddOverAllRequirement(requirement);
                processes.Add(param);
            }
            AddToPossibleLastProcesses(set);
        }

        protected virtual void AddToPossibleLastProcesses(AddProcessParams param)
        {
            possibleLastProcesses.Add(param);
        }

        protected virtual void AddToPossibleLastProcesses(DataProcessSet set)
        {
            foreach (AddProcessParams param in set.possibleLastProcesses)
                possibleLastProcesses.Add(param);
        }

        protected internal List<AddProcessParams> Processes
        {
            get { return processes; }
        }

        protected virtual IEnumerable<AddProcessParams> FlattenProcesses()
        {
            return null;
        }

        public IEnumerator<AddProcessParams> GetEnumerator()
        {
            return Processes.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
        protected internal int ProcessCount { get { return processes.Count; } }

        public List<AddProcessParams> PossibleLastProcesses
        {
            get { return possibleLastProcesses; }
        }
    }


    public class DataProcessParallel : DataProcessSet
    {
        protected override IEnumerable<AddProcessParams> FlattenProcesses()
        {
            var forbidden = new List<IDataProcess>();
            foreach (AddProcessParams param in Processes)
                forbidden.Add(param.Process);
            var requirement = new TrackRestrictionRequirement
            {
                RestrictionType = TrackRestrictionRequirement.RestrictionTypes.Forbid
            };
            requirement.AffectedProcesses.AddRange(forbidden);
            foreach (AddProcessParams param in Processes)
            {
                param.InputRequirements.AddOverAllRequirement(requirement);
                yield return param;
            }
        }
    }
    public class DataProcessSequence : DataProcessSet
    {
        private List<AddProcessParams> previous;

        protected override void AddActions(AddProcessParams process)
        {
            if (previous != null)
                process.InputRequirements.AddOverAllRequirement(
                    new SequenceRequirement(previous.ConvertAll(par => par.Process)));

            previous = new List<AddProcessParams> { process };
        }

        protected override void AddActions(DataProcessSet set)
        {
            if (previous != null)
                set.AddSetInputRequirement(new SequenceRequirement(previous.ConvertAll(par => par.Process)));
            previous = new List<AddProcessParams>(set.PossibleLastProcesses);
        }

        protected override void AddToPossibleLastProcesses(AddProcessParams param)
        {
            PossibleLastProcesses.Clear();
            PossibleLastProcesses.Add(param);
        }

        protected override void AddToPossibleLastProcesses(DataProcessSet set)
        {
            if (set.PossibleLastProcesses.Count > 0)
                AddToPossibleLastProcesses(set.PossibleLastProcesses[set.PossibleLastProcesses.Count - 1]);
            else if (set.ProcessCount > 0)
                AddToPossibleLastProcesses(set.Processes[set.ProcessCount - 1]);
        }
    }
    public class DataProcessLooseSet : DataProcessSet
    {
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer
Poland Poland
My name is Jacek. Currently, I am a Java/kotlin developer. I like C# and Monthy Python's sense of humour.

Comments and Discussions