// ********************************************************************************************************** // ConfigurationHelper.cs // 7/5/2022 // NGI - Next Generation Interceptor // // Contract No. HQ0856-21-C-0003/1022000209 // // THIS DOCUMENT DOES NOT CONTAIN TECHNOLOGY OR TECHNICAL DATA CONTROLLED UNDER EITHER THE U.S. // INTERNATIONAL TRAFFIC IN ARMS REGULATIONS OR THE U.S. EXPORT ADMINISTRATION REGULATIONS. // // RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION PROPRIETARY TO RAYTHEON // COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. // DISCLOSURE TO UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO RAYTHEON // COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS CONTENTS SHALL BE FURNISHED OR DISCLOSED // TO OR COPIED OR USED BY PERSONS OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF // RAYTHEON COMPANY. // // UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY. // // DESTRUCTION NOTICE: FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN DOD 5220.22-M, // NATIONAL INDUSTRIAL SECURITY PROGRAM OPERATING MANUAL, FEBRUARY 2006, // INCORPORATING CHANGE 1, MARCH 28, 2013, CHAPTER 5, SECTION 7, OR DODM 5200.01-VOLUME 3, // DOD INFORMATION SECURITY PROGRAM: PROTECTION OF CLASSIFIED INFORMATION, ENCLOSURE 3, // SECTION 17. FOR CONTROLLED UNCLASSIFIED INFORMATION FOLLOW THE PROCEDURES IN DODM 5200.01-VOLUME 4, // INFORMATION SECURITY PROGRAM: CONTROLLED UNCLASSIFIED INFORMATION. // // CONTROLLED BY: MISSILE DEFENSE AGENCY // CONTROLLED BY: GROUND-BASED MIDCOURSE DEFENSE PROGRAM OFFICE // CUI CATEGORY: CTI // DISTRIBUTION/DISSEMINATION CONTROL: F // POC: Alex Kravchenko (1118268) // ********************************************************************************************************** using Raytheon.Common; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Xml.Linq; namespace Raytheon.Instruments { /// /// type conversion utility with a special case for enums /// public static class TypeConverter { public static T ChangeType(object value) { return typeof(T).IsEnum ? (T)Enum.Parse(typeof(T), value.ToString()) : (T)ChangeType(typeof(T), value); } public static object ChangeType(Type t, object value) { System.ComponentModel.TypeConverter tc = TypeDescriptor.GetConverter(t); return tc.ConvertFrom(value); } public static void RegisterTypeConverter() where TC : System.ComponentModel.TypeConverter { TypeDescriptor.AddAttributes(typeof(T), new TypeConverterAttribute(typeof(TC))); } } /// /// Helper class contains extention fuctions for reading types other than strings from configuration, /// as well as reading lists of values /// public static class ConfigurationHelper { /// /// template function for reading different types from configuration /// /// /// /// /// /// public static T GetConfigurationValue(this IConfiguration configuration, string section, string key) { var tmpResult = configuration.GetConfigurationValue(section, key); return !string.IsNullOrEmpty(tmpResult) ? TypeConverter.ChangeType(tmpResult) : default; } /// /// returns multivalue result (list of T) from configuration /// /// /// /// /// /// public static List GetConfigurationListValue(this IConfiguration configuration, string section, string key, List defaultValue) { var tmpResult = configuration.GetXmlConfiguration(section); if (string.IsNullOrEmpty(tmpResult)) { return new List(); } else { var stringRes = BuildElementListFromXml(tmpResult, key); return new List(stringRes.Select(x => TypeConverter.ChangeType(x))); } } /// /// returns values from XML section converted to string list /// /// /// /// private static List BuildElementListFromXml(string data, string key) { XElement doc = XElement.Parse(data); IEnumerable xmlMessages = from m in doc.Elements($"{key}s").Elements(key) select m; var messages = xmlMessages.Select(x => x.Value); return messages?.ToList(); } } }