using System.Collections.Generic;
using HeuristicLab.Optimization;
using Newtonsoft.Json.Linq;
using HEAL.Attic;
using System.IO;
using HeuristicLab.Core;
using System.Linq;
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, IEnumerable resultCollectionProcessors) {
// clear all runs
if (optimizer.ExecutionState == ExecutionState.Paused)
optimizer.Stop();
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();
JArray resultCollectionProcessorItems = new JArray();
string templateName = Path.GetFileName(templatePath);
string templateDirectory = Path.GetDirectoryName(templatePath);
#endregion
// filter items with values/ranges/actualNames
var jsonItems = rootItem.Where(x => x.Active && !(x is EmptyJsonItem) && !(x is UnsupportedJsonItem));
#region Serialize HL File
ProtoBufSerializer serializer = new ProtoBufSerializer();
// get absolute path for serialization
string hlFilePath = Path.Combine(templateDirectory, $"{templateName}.hl");
serializer.Serialize(optimizer, hlFilePath);
// overwrite string for relative path
hlFilePath = Path.Combine($".", $"{templateName}.hl");
#endregion
#region Filter Items
foreach (var item in jsonItems) {
if (item is IResultJsonItem)
resultItems.Add(item.GenerateJObject());
else
parameterItems.Add(item.GenerateJObject());
}
#endregion
#region ResultCollectionProcessor Serialization
foreach (var proc in resultCollectionProcessors) {
JArray rcpParameterItems = new JArray();
var guid = StorableTypeAttribute.GetStorableTypeAttribute(proc.GetType()).Guid.ToString();
var item = JsonItemConverter.Extract(proc);
var rcpItems = item
.Where(x => !(x is EmptyJsonItem) && !(x is UnsupportedJsonItem))
.Select(x => x.GenerateJObject());
foreach (var i in rcpItems)
rcpParameterItems.Add(i);
JObject processorObj = new JObject();
processorObj.Add(nameof(IJsonItem.Name), item.Name);
processorObj.Add("GUID", guid);
processorObj.Add(Constants.Parameters, rcpParameterItems);
resultCollectionProcessorItems.Add(processorObj);
}
#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;
template[Constants.ResultCollectionProcessorItems] = resultCollectionProcessorItems;
#endregion
#region Serialize and write to file
File.WriteAllText(Path.Combine(templateDirectory, $"{templateName}.json"), SingleLineArrayJsonWriter.Serialize(template));
#endregion
}
}
}