// 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 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.Linq; using System.Xml; using System.Xml.Linq; using Core.Common.Base.IO; using Core.Common.Utils; using Core.Common.Utils.Builders; using Core.Components.Gis.IO.Properties; using log4net; using CoreCommonUtilsResources = Core.Common.Utils.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); var readConnectionInfos = new WmtsConnectionInfo[0]; if (!File.Exists(path)) { return new ReadOnlyCollection(readConnectionInfos); } try { readConnectionInfos = ReadWmtsConnectionInfosFromFile(path).ToArray(); } catch (Exception exception) when (exception is XmlException || exception is InvalidOperationException || exception is IOException) { string message = new FileReaderErrorMessageBuilder(path) .Build(CoreCommonUtilsResources.Error_General_IO_Import_ErrorMessage); throw new CriticalFileReadException(message, exception); } return new ReadOnlyCollection(readConnectionInfos); } /// /// Reads the default WMTS Connection info objects. /// /// The read information. public ReadOnlyCollection ReadDefaultWmtsConnectionInfos() { using (XmlReader reader = XmlReader.Create(new StringReader(Resources.defaultWmtsConnectionInfo))) { var connectionInfos = new List(); while (reader.Read()) { if (IsReadElementWmtsConnectionElement(reader)) { continue; } WmtsConnectionInfo readWmtsConnectionElement; using (XmlReader subtreeReader = reader.ReadSubtree()) { XElement wmtsConnectionElement = XElement.Load(subtreeReader); readWmtsConnectionElement = CreateWmtsConnectionInfo(wmtsConnectionElement); } if (readWmtsConnectionElement != null) { connectionInfos.Add(readWmtsConnectionElement); } } return new ReadOnlyCollection(connectionInfos); } } /// /// 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 IEnumerable ReadWmtsConnectionInfosFromFile(string path) { using (XmlReader reader = XmlReader.Create(path)) { var connectionInfos = new List(); while (reader.Read()) { if (IsReadElementWmtsConnectionElement(reader)) { continue; } WmtsConnectionInfo readWmtsConnectionElement; using (XmlReader subtreeReader = reader.ReadSubtree()) { XElement wmtsConnectionElement = XElement.Load(subtreeReader); readWmtsConnectionElement = TryCreateWmtsConnectionInfo(path, wmtsConnectionElement); } if (readWmtsConnectionElement != null) { connectionInfos.Add(readWmtsConnectionElement); } } return 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); } } }