Free cookie consent management tool by TermsFeed Policy Generator

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

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

#3026:

  • deleted JsonItemArrayControl and JsonItemDefaultControl
  • redesigned architecture for JsonItem: now there are different types of JsonItem (IntJsonItem, BoolJsonItem, ...) -> for better type safety and expandability
  • fixed bug in BaseConverter for GetMinValue and GetMaxValue for IntValue, but ignored for other value types (DoubleValue, DateTimeValue, ...) because the redesign of JsonItem-Architecture can make these two methods obsolet soon
  • fixed bug in JsonItemConverter to prevent null pointer exceptions
  • refactored value and range converters -> removed complicated generic ValueTypeValueConverter and ValueRangeConverter and implemented the necessary methods directly in concrete classes (improves readability and removes the need of reflection)
  • redesigned view handling in OptimizerIntegration -> dynamically seaches for JsonItemVMBase implementations, which are connected with a view
    • this enables better scaling with more user controls
  • JsonItemVMBase implements MVVM architecture
File size: 5.5 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; } = JObject.Parse(Constants.Template);
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      JArray ResultItems = new JArray();
27      JsonItems = new List<IJsonItem>();
28
29      ProtoBufSerializer serializer = new ProtoBufSerializer();
30      serializer.Serialize(optimizer, @"C:\Workspace\template.hl");
31      Template[Constants.Metadata][Constants.HLFileLocation] = @"C:\Workspace\template.hl";
32
33      // extract JsonItem, save the name in the metadata section of the
34      // template and save it an JArray incl. all parameters of the JsonItem,
35      // which have parameters aswell
36      AddIItem(optimizer);
37      // save the JArray with JsonItems (= IParameterizedItems)
38
39      JArrayItems = new JArray();
40      foreach (var item in JsonItems) {
41        if (item is ResultItem)
42          ResultItems.Add(Serialize(item));
43        else
44          JArrayItems.Add(Serialize(item));
45      }
46      Template[Constants.Parameters] = JArrayItems;
47      Template[Constants.ActivatedResults] = ResultItems;
48      // serialize template and return string
49      return SingleLineArrayJsonWriter.Serialize(Template);
50    }
51
52    public string GenerateTemplate(IEnumerable<IJsonItem> items) {
53      ProtoBufSerializer serializer = new ProtoBufSerializer();
54      serializer.Serialize(Optimizer, @"C:\Workspace\template.hl");
55      Template[Constants.Metadata][Constants.HLFileLocation] = @"C:\Workspace\template.hl";
56
57      JArray ResultItems = new JArray();
58
59      JArrayItems = new JArray();
60      foreach (var item in items) {
61        if (item is ResultItem)
62          ResultItems.Add(Serialize(item));
63        else
64          JArrayItems.Add(Serialize(item));
65      }
66      Template[Constants.Parameters] = JArrayItems;
67      Template[Constants.ActivatedResults] = ResultItems;
68
69      // serialize template and return string
70      return SingleLineArrayJsonWriter.Serialize(Template);
71    }
72
73    public string GenerateTemplate(IJsonItem rootItem, IOptimizer optimizer) {
74      // data container
75      Template = JObject.Parse(Constants.Template);
76      JsonItems = new List<IJsonItem>();
77
78      // extract JsonItem, save the name in the metadata section of the
79      // template and save it an JArray incl. all parameters of the JsonItem,
80      // which have parameters aswell
81      Template[Constants.Metadata][Constants.Optimizer] = optimizer.Name;
82      PopulateJsonItems(rootItem);
83
84      ProtoBufSerializer serializer = new ProtoBufSerializer();
85      serializer.Serialize(Optimizer, @"C:\Workspace\template.hl");
86      Template[Constants.Metadata][Constants.HLFileLocation] = @"C:\Workspace\template.hl";
87
88      JArray ResultItems = new JArray();
89
90      JArrayItems = new JArray();
91      foreach (var item in JsonItems) {
92        if (item is ResultItem)
93          ResultItems.Add(Serialize(item));
94        else
95          JArrayItems.Add(Serialize(item));
96      }
97      Template[Constants.Parameters] = JArrayItems;
98      Template[Constants.ActivatedResults] = ResultItems;
99
100      // serialize template and return string
101      return SingleLineArrayJsonWriter.Serialize(Template);
102    }
103
104    public IEnumerable<IJsonItem> FetchJsonItems(IOptimizer optimizer) {
105      // data container
106      Template = JObject.Parse(Constants.Template);
107      JsonItems = new List<IJsonItem>();
108      Optimizer = optimizer;
109
110      // extract JsonItem, save the name in the metadata section of the
111      // template and save it an JArray incl. all parameters of the JsonItem,
112      // which have parameters aswell
113      AddIItem(optimizer);
114
115      // serialize template and return string
116      return JsonItems;
117    }
118   
119    #region Helper
120
121    private void AddIItem(IItem item) {
122      IJsonItem jsonItem = JsonItemConverter.Extract(item);
123      Template[Constants.Metadata][Constants.Optimizer] = item.ItemName;
124      PopulateJsonItems(jsonItem);
125    }
126
127    // serializes ParameterizedItems and saves them in list "JsonItems".
128    private void PopulateJsonItems(IJsonItem item) {
129      IEnumerable<IJsonItem> tmpParameter = item.Children;
130     
131      if (item.Value != null || item.Range != null || item is ResultItem || item.ActualName != null) {
132        JsonItems.Add(item);
133      }
134
135      if (tmpParameter != null) {
136        foreach (var p in tmpParameter) {
137          PopulateJsonItems(p);
138        }
139      }
140    }
141
142    private static JObject Serialize(IJsonItem item) =>
143      JObject.FromObject(item, Settings());
144
145    /// <summary>
146    /// Settings for the json serialization.
147    /// </summary>
148    /// <returns>A configured JsonSerializer.</returns>
149    private static JsonSerializer Settings() => new JsonSerializer() {
150      TypeNameHandling = TypeNameHandling.None,
151      NullValueHandling = NullValueHandling.Ignore,
152      ReferenceLoopHandling = ReferenceLoopHandling.Serialize
153    };
154    #endregion
155  }
156}
Note: See TracBrowser for help on using the repository browser.