source: branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItemConverter.cs @ 17439

Last change on this file since 17439 was 17439, checked in by dpiringe, 15 months ago

#3026:

  • fixed a bug in HeuristicLab.JsonInterface.App -> now the Runner checks if the instantiated optimizer is an EngineAlgorithm, if true: Engine = SequentialEngine (engine can be configured in later versions)
  • added a TabControl in ExportJsonDialog for parameters and results
  • updated parameter tree view with checkboxes (and linked them with VM)
  • renamed ActivatedResults to Results for templates
  • fixed a bug with injection of operators in MultiCheckedOperatorConverter -> now operators of an ValueParameter get set correctly
  • updated MultiCheckedOperatorConverter to extract/inject parameters of operators
  • fixed bug with path for template -> removed usage of method Path.GetDirectoryName, returned wrong results
  • splitted cache for JsonItemConverter into a cache for injection and extraction
  • JsonTemplateInstantiator now uses first item in objects array instead of searching for an object with template name
File size: 3.1 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Threading.Tasks;
6using HeuristicLab.Core;
7using HeuristicLab.Data;
8using HeuristicLab.PluginInfrastructure;
9using HEAL.Attic;
10using System.Collections;
11
12namespace HeuristicLab.JsonInterface {
13  /// <summary>
14  /// Class for handling json converters.
15  /// </summary>
16  public class JsonItemConverter : IJsonItemConverter {
17   
18    #region Properties
19    private IDictionary<Type, IJsonItemConverter> Converters { get; set; }
20      = new Dictionary<Type, IJsonItemConverter>();
21
22    private IDictionary<int, IJsonItem> InjectCache { get; set; }
23      = new Dictionary<int, IJsonItem>();
24
25    private IDictionary<int, IJsonItem> ExtractCache { get; set; }
26      = new Dictionary<int, IJsonItem>();
27
28    public int Priority => throw new NotImplementedException();
29
30    public Type ConvertableType => throw new NotImplementedException();
31    #endregion
32
33    /// <summary>
34    /// GetConverter a converter for a specific type.
35    /// </summary>
36    /// <param name="type">The type for which the converter will be selected.</param>
37    /// <returns>An IJsonItemConverter object.</returns>
38    public IJsonItemConverter GetConverter(Type type) {
39      IList<IJsonItemConverter> possibleConverters = new List<IJsonItemConverter>();
40     
41      foreach (var x in Converters)
42        if (type.IsEqualTo(x.Key))
43          possibleConverters.Add(x.Value);
44
45      if(possibleConverters.Count > 0) {
46        IJsonItemConverter best = possibleConverters.First();
47        foreach (var x in possibleConverters) {
48          if (x.Priority > best.Priority)
49            best = x;
50        }
51        return best;
52      }
53      return null;
54    }
55   
56    public void Inject(IItem item, IJsonItem data, IJsonItemConverter root) {
57      if (item != null && !InjectCache.ContainsKey(item.GetHashCode())) {
58        IJsonItemConverter converter = GetConverter(item.GetType());
59        if(converter != null) converter.Inject(item, data, root);
60        InjectCache.Add(item.GetHashCode(), data);
61      }
62    }
63
64    public IJsonItem Extract(IItem item, IJsonItemConverter root) {
65      int hash = item.GetHashCode();
66      if (ExtractCache.TryGetValue(hash, out IJsonItem val))
67        return val;
68      else {
69        IJsonItemConverter converter = GetConverter(item.GetType());
70        if (converter == null) return new UnsupportedJsonItem();
71        IJsonItem tmp = GetConverter(item.GetType()).Extract(item, root);
72        ExtractCache.Add(hash, tmp);
73        return tmp;
74      }
75    }
76   
77    public static void Inject(IItem item, IJsonItem data) {
78      IJsonItemConverter c = JsonItemConverterFactory.Create();
79      c.Inject(item, data, c);
80    }
81
82    public static IJsonItem Extract(IItem item) {
83      IJsonItemConverter c = JsonItemConverterFactory.Create();
84      return c.Extract(item, c);
85    }
86
87    /// <summary>
88    /// Static constructor for default converter configuration.
89    /// </summary>
90    internal JsonItemConverter(IDictionary<Type, IJsonItemConverter> converters) {
91      Converters = converters;
92    }
93  }
94}
Note: See TracBrowser for help on using the repository browser.