using System; using System.Collections.Generic; using System.Linq; using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Data; using HeuristicLab.Optimization; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using HEAL.Attic; namespace HeuristicLab.JsonInterface { /// /// Static class to generate json interface templates. /// public static class JCGenerator { private struct GenData { public JObject Template { get; set; } public JArray JsonItems { get; set; } } public static string GenerateTemplate(IAlgorithm algorithm) { // data container GenData genData = new GenData() { Template = JObject.Parse(Constants.Template), JsonItems = new JArray() }; ProtoBufSerializer serializer = new ProtoBufSerializer(); serializer.Serialize(algorithm, @"C:\Workspace\template.hl"); genData.Template[Constants.Metadata][Constants.HLFileLocation] = @"C:\Workspace\template.hl"; // extract JsonItem, save the name in the metadata section of the // template and save it an JArray incl. all parameters of the JsonItem, // which have parameters aswell AddInstantiableIItem(Constants.Algorithm, algorithm, genData); if (algorithm.Problem != null) // only when an problem exists AddInstantiableIItem(Constants.Problem, algorithm.Problem, genData); // save the JArray with JsonItems (= IParameterizedItems) genData.Template[Constants.Parameters] = genData.JsonItems; // serialize template and return string return SingleLineArrayJsonWriter.Serialize(genData.Template); } #region Helper private static void AddInstantiableIItem(string metaDataTagName, IItem item, GenData genData) { JsonItem jsonItem = JsonItemConverter.Extract(item); genData.Template[Constants.Metadata][metaDataTagName] = item.ItemName; PopulateJsonItems(jsonItem, genData); } // serializes ParameterizedItems and saves them in list "JsonItems". private static void PopulateJsonItems(JsonItem item, GenData genData) { IEnumerable tmpParameter = item.Children; if (item.Value != null || item.Range != null) { genData.JsonItems.Add(Serialize(item)); } if (tmpParameter != null) { foreach (var p in tmpParameter) { PopulateJsonItems(p, genData); } } } private static JObject Serialize(JsonItem item) => JObject.FromObject(item, Settings()); /// /// Settings for the json serialization. /// /// A configured JsonSerializer. private static JsonSerializer Settings() => new JsonSerializer() { TypeNameHandling = TypeNameHandling.None, NullValueHandling = NullValueHandling.Ignore, ReferenceLoopHandling = ReferenceLoopHandling.Serialize }; #endregion } }