// Copyright (C) Stichting Deltares 2016. All rights reserved. // // This file is part of Ringtoets. // // Ringtoets is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // All names, logos, and references to "Deltares" are registered trademarks of // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. using System; using System.Collections.Generic; using Core.Common.Base; using Core.Common.Utils.Extensions; using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Data.Properties; namespace Ringtoets.Common.Data.Contribution { /// /// This class represents the distribution of all failure mechanism contributions. /// public class FailureMechanismContribution : Observable { private readonly ICollection distribution = new List(); private int norm; /// /// Creates a new instance of . Values are taken from the /// and one item is added with a value of /// which represents the contribution of any other failure mechanisms. /// /// The of on which to base /// the . /// The collective contribution for other failure mechanisms. /// The norm defined on a assessment section. /// Thrown when: /// /// any of the has a value for not in interval [0, 100]. /// the value of is not in interval [0, 100] /// /// /// Thrown when is null. public FailureMechanismContribution(IEnumerable failureMechanisms, double otherContribution, int norm) { Norm = norm; UpdateContributions(failureMechanisms, otherContribution); } /// /// Gets or sets the norm which has been defined on the assessment section. /// public int Norm { get { return norm; } set { if (value <= 0) { throw new ArgumentOutOfRangeException("value", Resources.FailureMechanismContributionItem_Norm_must_be_larger_than_zero); } norm = value; distribution.ForEachElementDo(d => d.Norm = norm); } } /// /// Gets the distribution of failure mechanism contributions. /// public IEnumerable Distribution { get { return distribution; } } /// /// Fully updates the contents of for a new set of failure /// mechanisms and the remainder contribution. /// /// The new failure mechanisms. /// The collective contribution for other failure mechanisms. /// Thrown when is null. /// Thrown when: /// /// any of the has a value for /// not in interval [0, 100]. /// the value of is not in interval [0, 100] /// /// public void UpdateContributions(IEnumerable newFailureMechanisms, double otherContribution) { if (newFailureMechanisms == null) { throw new ArgumentNullException("newFailureMechanisms", Resources.FailureMechanismContribution_UpdateContributions_Can_not_create_FailureMechanismContribution_without_FailureMechanism_collection); } distribution.Clear(); newFailureMechanisms.ForEachElementDo(AddContributionItem); AddOtherContributionItem(otherContribution); } /// /// Adds a based on . /// /// The to add a for. /// Thrown when is null. private void AddContributionItem(IFailureMechanism failureMechanism) { distribution.Add(new FailureMechanismContributionItem(failureMechanism, norm)); } /// /// Adds a representing all other failure mechanisms not in the failure mechanism /// list supported within Ringtoets. /// /// The contribution to set for other failure mechanisms. /// Thrown when is not in interval [0, 100] private void AddOtherContributionItem(double otherContribution) { var otherFailureMechanism = new OtherFailureMechanism { Contribution = otherContribution }; var otherContributionItem = new FailureMechanismContributionItem(otherFailureMechanism, norm, true); distribution.Add(otherContributionItem); } } }