using System.Collections.Generic; using System.IO; using System.Linq; using CTA.FeatureDetection.Common.Models.Configuration; using CTA.Rules.Config; using Microsoft.Extensions.Logging; using Newtonsoft.Json; namespace CTA.FeatureDetection.Common.Models.Parsers { /// /// Deserializes Features' assembly metadata from json format /// public class FeatureConfigParser { private static ILogger Logger => Log.Logger; private static readonly Dictionary _configCache = new Dictionary(); /// /// Deserializes one or more feature config files /// /// Feature config file paths /// Deserialized FeatureGroup objects public static IEnumerable Parse(IEnumerable configFiles) { Logger.LogDebug($"Parsing {configFiles.Count()} feature assembly metadata file(s)..."); var featureConfigs = configFiles.Select(Parse).Where(c => c != null); return featureConfigs; } /// /// Deserializes a feature config file /// /// Config file path /// Deserialized FeatureGroup objects public static FeatureConfig Parse(string configFile) { if (_configCache.TryGetValue(configFile, out var featureConfig)) { return featureConfig; } if (!File.Exists(configFile)) { Logger.LogError($"Metadata file does not exist: {configFile}"); return null; } Logger.LogDebug($"Parsing metadata file: {configFile}..."); var configContent = File.ReadAllText(configFile); Utils.ValidateJsonObject(configContent, typeof(FeatureConfig)); featureConfig = JsonConvert.DeserializeObject(configContent); _configCache[configFile] = featureConfig; return featureConfig; } } }