Esempio n. 1
0
        //TODO CanAddPredecessor sollte eine Begründung (in form einer exception) zurückgeben, warum es fehlgeschlagen ist
        private bool CanAddPredecessor(Ticket other)
        {
            //Falls A Ein Ober-/Unter-ticket von B ist
            if (IsChildOf(other) || other.IsChildOf(this))
            {
                return(false);
            }

            Queue <Ticket> tickets = new Queue <Ticket>();

            //fügt sich selber und alle Kinder hinzu. Die Kinder werden hinzugefügt, da der Vorgänger eines Obertickets der Vorgänger aller
            //Untertickets ist
            tickets.Enqueue(this);
            foreach (var ticket in GetChildrenRecursive())
            {
                tickets.Enqueue(ticket);
            }

            /*
             * Iteriert durch jedes Ticket bis die Queue leer ist oder element.Equals(other) true ist. Bei jeder Iteration werden Eltern
             * und alle Nachfolger (auch indirekte) der Queue hinzugefügt
             */
            while (tickets.Count > 0)
            {
                var element = tickets.Dequeue();
                if (element == null)
                {
                    continue;
                }
                if (element.Equals(other))
                {
                    return(false);
                }
                if (element.Parent != null)
                {
                    tickets.Enqueue(element.Parent);
                }
                foreach (var ticket in element.GetSuccessorsAdvanced())
                {
                    tickets.Enqueue(ticket);
                }
            }

            return(true);
        }