Exemple #1
0
        /// <summary>
        ///   The equals.
        /// </summary>
        /// <param name="other"> The other. </param>
        /// <returns> The System.Boolean. </returns>
        public bool Equals(TaskNode other)
        {
            if (ReferenceEquals(null, other))
            {
                return(false);
            }

            if (ReferenceEquals(this, other))
            {
                return(true);
            }

            return(other.Depth == this.Depth && other.Index == this.Index && Equals(other.Parent, this.Parent) &&
                   ReferenceEquals(other.Task, this.Task));
        }
        /// <summary>
        ///   The equals.
        /// </summary>
        /// <param name="other"> The other. </param>
        /// <returns> The System.Boolean. </returns>
        public bool Equals(TaskNode other)
        {
            if (ReferenceEquals(null, other))
            {
                return false;
            }

            if (ReferenceEquals(this, other))
            {
                return true;
            }

            return other.Depth == this.Depth && other.Index == this.Index && Equals(other.Parent, this.Parent)
                   && ReferenceEquals(other.Task, this.Task);
        }
        /// <summary>
        ///   Solves all sub tree reference tasks and replaces them by real references to the sub tree.
        /// </summary>
        /// <param name="tree"> Tree in which to solve references. </param>
        /// <returns> Task to use instead of the passed one. </returns>
        private ITask SolveReferences(ITask tree)
        {
            if (tree == null)
            {
                return tree;
            }

            // Check if root is reference.
            if (tree is SubTreeReference)
            {
                SubTreeReference subTreeReference = tree as SubTreeReference;

                // Resolve reference.
                ITask treeReference = this.SolveReference(subTreeReference);

                return treeReference;
            }

            // Find sub tree reference tasks in tree.
            ICollection<TaskNode> referenceNodes = new List<TaskNode>();
            TaskNode rootNode = new TaskNode { Task = tree };
            tree.FindTasks(rootNode, task => task is SubTreeReference, ref referenceNodes);

            // Replace tasks in found nodes by referenced tree.
            foreach (TaskNode referenceNode in referenceNodes)
            {
                SubTreeReference subTreeReference = referenceNode.Task as SubTreeReference;
                if (subTreeReference == null)
                {
                    throw new Exception(
                        "Searched for SubTreeReference nodes, but found a task which is no sub tree reference node.");
                }

                IComposite parentComposite = referenceNode.ParentTask as IComposite;
                if (parentComposite == null)
                {
                    throw new Exception("Found task which has no parent composite.");
                }

                // Resolve reference.
                ITask treeReference = this.SolveReference(subTreeReference);

                // Remove from parent.
                parentComposite.RemoveChild(referenceNode.Task);

                // Add tree reference to parent at same position.
                parentComposite.InsertChild(referenceNode.Index, treeReference);
            }

            return tree;
        }
        /// <summary>
        ///   Generates a collection of active task nodes under this task. Used for debugging only.
        /// </summary>
        /// <param name="agentData"> Agent data. </param>
        /// <returns> Collection of active task nodes. </returns>
        public ICollection<TaskNode> GetActiveTasks(IAgentData agentData)
        {
            if (this.root == null || agentData.ExecutionStatus != ExecutionStatus.Running)
            {
                return null;
            }

            agentData.CurrentDeciderLevel = 0;

            TaskNode taskNode = new TaskNode { Task = this.root };
            ICollection<TaskNode> activeTasks = new List<TaskNode> { taskNode };
            this.root.GetActiveTasks(agentData, taskNode, ref activeTasks);
            return activeTasks;
        }
        /// <summary>
        ///   Searches for tasks which forfill the passed predicate.
        /// </summary>
        /// <param name="taskNode"> Task node of this task. </param>
        /// <param name="predicate"> Predicate to forfill. </param>
        /// <param name="tasks"> List of tasks which forfill the passed predicate. </param>
        public override void FindTasks(TaskNode taskNode, Func<ITask, bool> predicate, ref ICollection<TaskNode> tasks)
        {
            if (this.Task == null)
            {
                return;
            }

            // Check child.
            TaskNode childTaskNode = taskNode.CreateChildNode(this.Task, 0);
            if (predicate(this.Task))
            {
                tasks.Add(childTaskNode);
            }

            // Find tasks in child.
            this.Task.FindTasks(childTaskNode, predicate, ref tasks);
        }