// Copyright (C) Stichting Deltares 2017. 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 System.Globalization; using System.Linq; using Core.Common.Base; using Core.Common.Base.Data; using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.Properties; namespace Ringtoets.Common.Data.FailureMechanism { /// /// This class is the base implementation for a failure mechanism. Classes which want /// to implement can and should most likely inherit /// from this class. /// public abstract class FailureMechanismBase : Observable, IFailureMechanism { private static readonly Range contributionValidityRange = new Range(0, 100); private readonly List sections; private double contribution; /// /// Creates a new instance of the class. /// /// The name of the failure mechanism. /// The code of the failure mechanism. /// Thrown when either: /// /// is null or empty. /// is null or empty. /// /// protected FailureMechanismBase(string name, string failureMechanismCode) { ValidateParameters(name, failureMechanismCode); Name = name; Code = failureMechanismCode; sections = new List(); IsRelevant = true; InputComments = new Comment(); OutputComments = new Comment(); NotRelevantComments = new Comment(); } public double Contribution { get { return contribution; } set { if (!contributionValidityRange.InRange(value)) { string message = string.Format(Resources.Contribution_Value_should_be_in_Range_0_, contributionValidityRange.ToString(FormattableConstants.ShowAtLeastOneDecimal, CultureInfo.CurrentCulture)); throw new ArgumentOutOfRangeException(nameof(value), message); } contribution = value; } } public string Name { get; } public string Code { get; } public abstract IEnumerable Calculations { get; } public IEnumerable Sections { get { return sections; } } public Comment InputComments { get; } public Comment OutputComments { get; } public Comment NotRelevantComments { get; } public bool IsRelevant { get; set; } public virtual void AddSection(FailureMechanismSection section) { if (section == null) { throw new ArgumentNullException(nameof(section)); } if (!sections.Any()) { sections.Add(section); } else { InsertSectionWhileMaintainingConnectivityOrder(section); } } public virtual void ClearAllSections() { sections.Clear(); } private static void ValidateParameters(string failureMechanismName, string failureMechanismCode) { const string parameterIsRequired = "Parameter is required."; if (string.IsNullOrEmpty(failureMechanismName)) { throw new ArgumentException(parameterIsRequired, nameof(failureMechanismName)); } if (string.IsNullOrEmpty(failureMechanismCode)) { throw new ArgumentException(parameterIsRequired, nameof(failureMechanismCode)); } } /// /// Inserts the section to while maintaining connectivity /// order (neighboring have same end points). /// /// The new section. /// Thrown when cannot /// be connected to elements already defined in . private void InsertSectionWhileMaintainingConnectivityOrder(FailureMechanismSection sectionToInsert) { if (sections[sections.Count - 1].GetLast().Equals(sectionToInsert.GetStart())) { sections.Add(sectionToInsert); } else { string message = string.Format(Resources.BaseFailureMechanism_AddSection_Section_0_must_connect_to_existing_sections, sectionToInsert.Name); throw new ArgumentException(message, nameof(sectionToInsert)); } } } }