// 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.ComponentModel; using System.Linq; using System.Xml; using System.Xml.Linq; using Ringtoets.Common.IO.Schema; namespace Ringtoets.Common.IO.Readers { /// /// Helper methods related to instances. /// public static class CalculationConfigurationReaderHelper { /// /// Gets the value from a descendant element. /// /// The that contains the descendant element. /// The name of the descendant element. /// The value of the element, or null when the /// does not have descendant elements of . /// Thrown when any parameter is null. /// Thrown when the value isn't in the correct format. /// Thrown when the value represents a number /// less than or greater than . public static double? GetDoubleValueFromDescendantElement(this XElement parentElement, string descendantElementName) { XElement descendantElement = parentElement.GetDescendantElement(descendantElementName); return descendantElement != null ? (double?) XmlConvert.ToDouble(descendantElement.Value) : null; } /// /// Gets the value from a descendant element. /// /// The that contains the descendant element. /// The name of the descendant element. /// The value of the element, or null when the /// does not have descendant elements of . /// Thrown when any parameter is null. public static string GetStringValueFromDescendantElement(this XElement parentElement, string descendantElementName) { XElement descendantElement = parentElement.GetDescendantElement(descendantElementName); return descendantElement?.Value; } /// /// Gets the value from a descendant element. /// /// The that contains the descendant element. /// The name of the descendant element. /// The value, or null when the /// does not have descendant elements of . /// Thrown when any parameter is null. /// Thrown when the value does not represent a value. public static bool? GetBoolValueFromDescendantElement(this XElement parentElement, string descendantElementName) { XElement descendantElement = parentElement.GetDescendantElement(descendantElementName); return descendantElement != null ? (bool?) XmlConvert.ToBoolean(descendantElement.Value) : null; } /// /// Gets the converted value from a descendant element. /// /// The to use /// The that contains the descendant element. /// The name of the descendant element. /// The converted value, or null when the /// does not have descendant elements of . /// Thrown when any parameter is null. /// Thrown when the conversion cannot be performed. public static object GetConvertedValueFromDescendantElement(this XElement parentElement, string descendantElementName) where TConverter : TypeConverter, new() { string stringValue = parentElement.GetStringValueFromDescendantElement(descendantElementName); if (stringValue == null) { return null; } return new TConverter().ConvertFromInvariantString(stringValue); } /// /// Gets the 'stochast' element from the descendant 'stochasts' element. /// /// The that contains the descendant element. /// The name of the stochast element. /// The stochast element, or null when the /// does not have stochast elements with the name . /// Thrown when any parameter is null. public static XElement GetStochastElement(this XElement parentElement, string stochastName) { if (parentElement == null) { throw new ArgumentNullException(nameof(parentElement)); } if (stochastName == null) { throw new ArgumentNullException(nameof(stochastName)); } return parentElement.Elements(ConfigurationSchemaIdentifiers.StochastsElement) .FirstOrDefault()? .Elements(ConfigurationSchemaIdentifiers.StochastElement) .FirstOrDefault(e => e.Attribute(ConfigurationSchemaIdentifiers.NameAttribute)?.Value == stochastName); } /// /// Gets a descendant element with the given . /// /// The that contains the descendant element. /// The name of the descendant element. /// The element, or null when the /// does not have descendant elements of . /// Thrown when any parameter is null. public static XElement GetDescendantElement(this XElement parentElement, string descendantElementName) { if (parentElement == null) { throw new ArgumentNullException(nameof(parentElement)); } if (descendantElementName == null) { throw new ArgumentNullException(nameof(descendantElementName)); } return parentElement.Descendants(descendantElementName).FirstOrDefault(); } } }