using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using HeuristicLab.Core; using HeuristicLab.Data; using HeuristicLab.PluginInfrastructure; using HEAL.Attic; using System.Collections; namespace HeuristicLab.JsonInterface { /// /// Class for handling json converters. /// public class JsonItemConverter : IJsonItemConverter { #region Properties private IDictionary Converters { get; set; } = new Dictionary(); private IDictionary InjectCache { get; set; } = new Dictionary(); private IDictionary ExtractCache { get; set; } = new Dictionary(); public int Priority => throw new NotImplementedException(); public Type ConvertableType => throw new NotImplementedException(); #endregion /// /// GetConverter a converter for a specific type. /// /// The type for which the converter will be selected. /// An IJsonItemConverter object. public IJsonItemConverter GetConverter(Type type) { IList possibleConverters = new List(); foreach (var x in Converters) if (type.IsEqualTo(x.Key)) possibleConverters.Add(x.Value); if(possibleConverters.Count > 0) { IJsonItemConverter best = possibleConverters.First(); foreach (var x in possibleConverters) { if (x.Priority > best.Priority) best = x; } return best; } return null; } public void Inject(IItem item, IJsonItem data, IJsonItemConverter root) { if (item != null && !InjectCache.ContainsKey(item.GetHashCode())) { IJsonItemConverter converter = GetConverter(item.GetType()); if(converter != null) converter.Inject(item, data, root); InjectCache.Add(item.GetHashCode(), data); } } public IJsonItem Extract(IItem item, IJsonItemConverter root) { int hash = item.GetHashCode(); if (ExtractCache.TryGetValue(hash, out IJsonItem val)) return val; else { IJsonItemConverter converter = GetConverter(item.GetType()); if (converter == null) return new UnsupportedJsonItem(); IJsonItem tmp = GetConverter(item.GetType()).Extract(item, root); ExtractCache.Add(hash, tmp); return tmp; } } public static void Inject(IItem item, IJsonItem data) { IJsonItemConverter c = JsonItemConverterFactory.Create(); c.Inject(item, data, c); } public static IJsonItem Extract(IItem item) { IJsonItemConverter c = JsonItemConverterFactory.Create(); return c.Extract(item, c); } /// /// Static constructor for default converter configuration. /// internal JsonItemConverter(IDictionary converters) { Converters = converters; } } }