// Copyright (C) Stichting Deltares 2021. All rights reserved. // // This file is part of Riskeer. // // Riskeer is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser 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.Collections.ObjectModel; using System.IO; using System.Xml; using System.Xml.Linq; using Core.Common.Base.IO; using Core.Common.Util; using Core.Common.Util.Builders; using Core.Components.Gis.IO.Properties; using log4net; using CoreCommonUtilResources = Core.Common.Util.Properties.Resources; namespace Core.Components.Gis.IO.Readers { /// /// Reader class for . /// public class WmtsConnectionInfoReader { private static readonly ILog log = LogManager.GetLogger(typeof(WmtsConnectionInfoReader)); /// /// Reads the WMTS Connection info objects from . /// /// The file path that contains the information. /// The read information. /// Thrown when is invalid. /// Thrown when could not successfully be read. /// A valid path: /// /// is not empty or null, /// does not consist out of only whitespace characters, /// does not contain an invalid character, /// does not end with a directory or path separator (empty file name). /// public ReadOnlyCollection ReadWmtsConnectionInfos(string path) { IOUtils.ValidateFilePath(path); if (!File.Exists(path)) { return new ReadOnlyCollection(new WmtsConnectionInfo[0]); } try { return ReadWmtsConnectionInfosFromFile(path); } catch (Exception exception) when (exception is XmlException || exception is InvalidOperationException || exception is IOException) { string message = new FileReaderErrorMessageBuilder(path) .Build(CoreCommonUtilResources.Error_General_IO_Import_ErrorMessage); throw new CriticalFileReadException(message, exception); } } /// /// Reads the default WMTS Connection info objects. /// /// The read information. public ReadOnlyCollection ReadDefaultWmtsConnectionInfos() { using (XmlReader reader = XmlReader.Create(new StringReader(Resources.defaultWmtsConnectionInfo))) { return ReadWmtsConnectionInfosFromReader(reader, CreateWmtsConnectionInfo); } } /// /// Reads the collection of from . /// /// The file path that contains the information. /// The read collection. /// Thrown when an error occurred while parsing the XML. /// Thrown when an error occurred while reading the XML. private static ReadOnlyCollection ReadWmtsConnectionInfosFromFile(string path) { using (XmlReader reader = XmlReader.Create(path)) { return ReadWmtsConnectionInfosFromReader(reader, element => TryCreateWmtsConnectionInfo(path, element)); } } /// /// Reads the collection of from an . /// /// The reader to use. /// Method responsible to turning an /// into a . This method may /// return null or throw any type of . /// /// This method only throws exceptions thrown by . /// Thrown when an error occurred while parsing the XML. /// Thrown when an error occurred while reading the XML. private static ReadOnlyCollection ReadWmtsConnectionInfosFromReader(XmlReader reader, Func tryParseWmtsConnectionElement) { var connectionInfos = new List(); while (reader.Read()) { if (IsReadElementWmtsConnectionElement(reader)) { continue; } WmtsConnectionInfo readWmtsConnectionElement; using (XmlReader subtreeReader = reader.ReadSubtree()) { XElement wmtsConnectionElement = XElement.Load(subtreeReader); readWmtsConnectionElement = tryParseWmtsConnectionElement(wmtsConnectionElement); } if (readWmtsConnectionElement != null) { connectionInfos.Add(readWmtsConnectionElement); } } return new ReadOnlyCollection(connectionInfos); } /// /// Validates if the reader points to the element. /// /// The reader to use. /// true if the reader points to the WMTS connection element, false otherwise. /// Thrown when the input stream encountered incorrect XML. private static bool IsReadElementWmtsConnectionElement(XmlReader reader) { return reader.NodeType != XmlNodeType.Element || !reader.IsStartElement() || reader.Name != WmtsConnectionInfoXmlDefinitions.WmtsConnectionElement; } private static WmtsConnectionInfo TryCreateWmtsConnectionInfo(string path, XContainer element) { XElement nameElement = element.Element(WmtsConnectionInfoXmlDefinitions.WmtsConnectionNameElement); XElement urlElement = element.Element(WmtsConnectionInfoXmlDefinitions.WmtsConnectionUrlElement); if (nameElement == null || urlElement == null) { return null; } try { return new WmtsConnectionInfo(nameElement.Value, urlElement.Value); } catch (ArgumentException exception) { string errorMessage = string.Format(Resources.WmtsConnectionInfoReader_Unable_To_Create_WmtsConnectionInfo, nameElement.Value, urlElement.Value); string message = new FileReaderErrorMessageBuilder(path).Build(errorMessage); log.Warn(message, exception); } return null; } private static WmtsConnectionInfo CreateWmtsConnectionInfo(XContainer element) { XElement nameElement = element.Element(WmtsConnectionInfoXmlDefinitions.WmtsConnectionNameElement); XElement urlElement = element.Element(WmtsConnectionInfoXmlDefinitions.WmtsConnectionUrlElement); return new WmtsConnectionInfo(nameElement.Value, urlElement.Value); } } }