Free cookie consent management tool by TermsFeed Policy Generator

source: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateGenerator.cs @ 18030

Last change on this file since 18030 was 18030, checked in by dpiringe, 3 years ago

#3026

  • added check for missing path property
  • added functionality for relative .hl file paths
File size: 3.1 KB
Line 
1using System.Collections.Generic;
2using HeuristicLab.Optimization;
3using Newtonsoft.Json.Linq;
4using HEAL.Attic;
5using System.IO;
6using HeuristicLab.Core;
7
8namespace HeuristicLab.JsonInterface {
9  /// <summary>
10  /// Class to generate json interface templates.
11  /// </summary>
12  public class JsonTemplateGenerator {
13
14    /// <summary>
15    /// static Function to generate a template.
16    /// </summary>
17    /// <param name="templatePath">the path for the template files</param>
18    /// <param name="optimizer">the optimizer object to serialize</param>
19    /// <param name="rootItem">Root JsonItem for serialization, considers only active JsonItems for serialization</param>
20    public static void GenerateTemplate(string templatePath, IOptimizer optimizer, IJsonItem rootItem) {
21      // clear all runs
22      optimizer.Runs.Clear();
23
24      // validation
25      ValidationResult validationResult = rootItem.GetValidator().Validate();
26      if (!validationResult.Success)
27        throw validationResult.GenerateException();
28
29      #region Init
30      JObject template = JObject.Parse(Constants.Template);
31      JArray parameterItems = new JArray();
32      JArray resultItems = new JArray();
33      IList<IJsonItem> jsonItems = new List<IJsonItem>();
34     
35      string templateName = Path.GetFileName(templatePath);
36      string templateDirectory = Path.GetDirectoryName(templatePath);
37
38      #endregion
39
40      if(optimizer.ExecutionState == ExecutionState.Paused)
41        optimizer.Stop();
42
43      // recursively filter items with values/ranges/actualNames
44      PopulateJsonItems(rootItem, jsonItems);
45
46      #region Serialize HL File
47      ProtoBufSerializer serializer = new ProtoBufSerializer();
48      // get absolute path for serialization
49      string hlFilePath = Path.Combine(templateDirectory, $"{templateName}.hl");
50      serializer.Serialize(optimizer, hlFilePath);
51      // overwrite string for relative path
52      hlFilePath = Path.Combine($".{Path.DirectorySeparatorChar}", $"{templateName}.hl");
53      #endregion
54
55      #region Filter Items
56      foreach (var item in jsonItems) {
57        if (item is IResultJsonItem)
58          resultItems.Add(item.GenerateJObject());
59        else
60          parameterItems.Add(item.GenerateJObject());
61      }
62      #endregion
63
64      #region Set Template Data
65      template[Constants.Metadata][Constants.TemplateName] = templateName;
66      template[Constants.Metadata][Constants.HLFileLocation] = hlFilePath;
67      template[Constants.Parameters] = parameterItems;
68      template[Constants.Results] = resultItems;
69      #endregion
70
71      #region Serialize and write to file
72      File.WriteAllText(Path.Combine(templateDirectory, $"{templateName}.json"), SingleLineArrayJsonWriter.Serialize(template));
73      #endregion
74    }
75
76    #region Helper   
77    private static void PopulateJsonItems(IJsonItem item, IList<IJsonItem> jsonItems) {
78      foreach(var x in item) {
79        if (x.Active && !(x is EmptyJsonItem) && !(x is UnsupportedJsonItem)) {
80          jsonItems.Add(x);
81        }
82      }
83    }
84    #endregion
85  }
86}
Note: See TracBrowser for help on using the repository browser.