using System.Collections.Generic; using HeuristicLab.Optimization; using Newtonsoft.Json.Linq; using HEAL.Attic; using System.IO; using HeuristicLab.Core; namespace HeuristicLab.JsonInterface { /// /// Class to generate json interface templates. /// public class JsonTemplateGenerator { /// /// static Function to generate a template. /// /// the path for the template files /// the optimizer object to serialize /// Root JsonItem for serialization, considers only active JsonItems for serialization public static void GenerateTemplate(string templatePath, IOptimizer optimizer, IJsonItem rootItem) { // clear all runs optimizer.Runs.Clear(); // validation ValidationResult validationResult = rootItem.GetValidator().Validate(); if (!validationResult.Success) throw validationResult.GenerateException(); #region Init JObject template = JObject.Parse(Constants.Template); JArray parameterItems = new JArray(); JArray resultItems = new JArray(); IList jsonItems = new List(); string templateName = Path.GetFileName(templatePath); string templateDirectory = Path.GetDirectoryName(templatePath); #endregion if(optimizer.ExecutionState == ExecutionState.Paused) optimizer.Stop(); // recursively filter items with values/ranges/actualNames PopulateJsonItems(rootItem, jsonItems); #region Serialize HL File ProtoBufSerializer serializer = new ProtoBufSerializer(); string hlFilePath = Path.Combine(templateDirectory, $"{templateName}.hl"); serializer.Serialize(optimizer, hlFilePath); #endregion #region Filter Items foreach (var item in jsonItems) { if (item is IResultJsonItem) resultItems.Add(item.GenerateJObject()); else parameterItems.Add(item.GenerateJObject()); } #endregion #region Set Template Data template[Constants.Metadata][Constants.TemplateName] = templateName; template[Constants.Metadata][Constants.HLFileLocation] = hlFilePath; template[Constants.Parameters] = parameterItems; template[Constants.Results] = resultItems; #endregion #region Serialize and write to file File.WriteAllText(Path.Combine(templateDirectory, $"{templateName}.json"), SingleLineArrayJsonWriter.Serialize(template)); #endregion } #region Helper private static void PopulateJsonItems(IJsonItem item, IList jsonItems) { foreach(var x in item) { if (x.Active && !(x is EmptyJsonItem) && !(x is UnsupportedJsonItem)) { jsonItems.Add(x); } } } #endregion } }