Free cookie consent management tool by TermsFeed Policy Generator

source: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JCGenerator.cs @ 17406

Last change on this file since 17406 was 17406, checked in by dpiringe, 4 years ago

#3026

  • added interfaces IJsonItem and IJsonItemValidator
  • replaced every reference JsonItem with IJsonItem
File size: 5.1 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using HeuristicLab.Common;
5using HeuristicLab.Core;
6using HeuristicLab.Data;
7using HeuristicLab.Optimization;
8using Newtonsoft.Json;
9using Newtonsoft.Json.Linq;
10using HEAL.Attic;
11
12namespace HeuristicLab.JsonInterface {
13  /// <summary>
14  /// Class to generate json interface templates.
15  /// </summary>
16  public class JCGenerator {
17    private JObject Template { get; set; }
18    private JArray JArrayItems { get; set; }
19    private IList<IJsonItem> JsonItems { get; set; }
20    private IOptimizer Optimizer { get; set; }
21
22   
23    public string GenerateTemplate(IOptimizer optimizer) {
24      // data container
25      JArrayItems = new JArray();
26      JsonItems = new List<IJsonItem>();
27
28      ProtoBufSerializer serializer = new ProtoBufSerializer();
29      serializer.Serialize(optimizer, @"C:\Workspace\template.hl");
30      Template[Constants.Metadata][Constants.HLFileLocation] = @"C:\Workspace\template.hl";
31
32      // extract JsonItem, save the name in the metadata section of the
33      // template and save it an JArray incl. all parameters of the JsonItem,
34      // which have parameters aswell
35      AddIItem(optimizer);
36      // save the JArray with JsonItems (= IParameterizedItems)
37      Template[Constants.Parameters] = JArrayItems;
38      // serialize template and return string
39      return SingleLineArrayJsonWriter.Serialize(Template);
40    }
41
42    public string GenerateTemplate(IEnumerable<IJsonItem> items) {
43      ProtoBufSerializer serializer = new ProtoBufSerializer();
44      serializer.Serialize(Optimizer, @"C:\Workspace\template.hl");
45      Template[Constants.Metadata][Constants.HLFileLocation] = @"C:\Workspace\template.hl";
46
47      JArray ResultItems = new JArray();
48
49      JArrayItems = new JArray();
50      foreach (var item in items) {
51        if (item is ResultItem)
52          ResultItems.Add(Serialize(item));
53        else
54          JArrayItems.Add(Serialize(item));
55      }
56      Template[Constants.Parameters] = JArrayItems;
57      Template[Constants.ActivatedResults] = ResultItems;
58
59      // serialize template and return string
60      return SingleLineArrayJsonWriter.Serialize(Template);
61    }
62
63    public string GenerateTemplate(IJsonItem rootItem, IOptimizer optimizer) {
64      // data container
65      Template = JObject.Parse(Constants.Template);
66      JsonItems = new List<IJsonItem>();
67
68      // extract JsonItem, save the name in the metadata section of the
69      // template and save it an JArray incl. all parameters of the JsonItem,
70      // which have parameters aswell
71      Template[Constants.Metadata][Constants.Optimizer] = optimizer.Name;
72      PopulateJsonItems(rootItem);
73
74      ProtoBufSerializer serializer = new ProtoBufSerializer();
75      serializer.Serialize(Optimizer, @"C:\Workspace\template.hl");
76      Template[Constants.Metadata][Constants.HLFileLocation] = @"C:\Workspace\template.hl";
77
78      JArray ResultItems = new JArray();
79
80      JArrayItems = new JArray();
81      foreach (var item in JsonItems) {
82        if (item is ResultItem)
83          ResultItems.Add(Serialize(item));
84        else
85          JArrayItems.Add(Serialize(item));
86      }
87      Template[Constants.Parameters] = JArrayItems;
88      Template[Constants.ActivatedResults] = ResultItems;
89
90      // serialize template and return string
91      return SingleLineArrayJsonWriter.Serialize(Template);
92    }
93
94    public IEnumerable<IJsonItem> FetchJsonItems(IOptimizer optimizer) {
95      // data container
96      Template = JObject.Parse(Constants.Template);
97      JsonItems = new List<IJsonItem>();
98      Optimizer = optimizer;
99
100      // extract JsonItem, save the name in the metadata section of the
101      // template and save it an JArray incl. all parameters of the JsonItem,
102      // which have parameters aswell
103      AddIItem(optimizer);
104
105      // serialize template and return string
106      return JsonItems;
107    }
108   
109    #region Helper
110
111    private void AddIItem(IItem item) {
112      IJsonItem jsonItem = JsonItemConverter.Extract(item);
113      Template[Constants.Metadata][Constants.Optimizer] = item.ItemName;
114      PopulateJsonItems(jsonItem);
115    }
116
117    // serializes ParameterizedItems and saves them in list "JsonItems".
118    private void PopulateJsonItems(IJsonItem item) {
119      IEnumerable<IJsonItem> tmpParameter = item.Children;
120     
121      if (item.Value != null || item.Range != null || item is ResultItem || item.ActualName != null) {
122        JsonItems.Add(item);
123      }
124
125      if (tmpParameter != null) {
126        foreach (var p in tmpParameter) {
127          PopulateJsonItems(p);
128        }
129      }
130    }
131
132    private static JObject Serialize(IJsonItem item) =>
133      JObject.FromObject(item, Settings());
134
135    /// <summary>
136    /// Settings for the json serialization.
137    /// </summary>
138    /// <returns>A configured JsonSerializer.</returns>
139    private static JsonSerializer Settings() => new JsonSerializer() {
140      TypeNameHandling = TypeNameHandling.None,
141      NullValueHandling = NullValueHandling.Ignore,
142      ReferenceLoopHandling = ReferenceLoopHandling.Serialize
143    };
144    #endregion
145  }
146}
Note: See TracBrowser for help on using the repository browser.