Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/SolutionMessageBuilder.cs @ 4068

Last change on this file since 4068 was 4068, checked in by swagner, 14 years ago

Sorted usings and removed unused usings in entire solution (#1094)

File size: 5.4 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Linq;
25using HeuristicLab.Collections;
26using HeuristicLab.Core;
27using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
28
29namespace HeuristicLab.Problems.ExternalEvaluation {
30  [Item("SolutionMessageBuilder", "Holds and uses a number of converters to translate HeuristicLab objects into appropriate fields of a solution message.")]
31  [StorableClass]
32  public class SolutionMessageBuilder : NamedItem {
33    public override bool CanChangeName { get { return false; } }
34    public override bool CanChangeDescription { get { return false; } }
35    private Dictionary<Type, Action<IItem, string, SolutionMessage.Builder>> dispatcher;
36
37    [Storable]
38    private CheckedItemCollection<IItemToSolutionMessageConverter> converters;
39    public CheckedItemCollection<IItemToSolutionMessageConverter> Converters {
40      get { return converters; }
41    }
42
43    [StorableConstructor]
44    protected SolutionMessageBuilder(bool deserializing) : base(deserializing) { }
45    public SolutionMessageBuilder()
46      : base() {
47      name = ItemName;
48      description = ItemDescription;
49      converters = new CheckedItemCollection<IItemToSolutionMessageConverter>();
50      AttachEventHandlers();
51
52      converters.Add(new BoolConverter());
53      converters.Add(new DateTimeValueConverter());
54      converters.Add(new DoubleConverter());
55      converters.Add(new IntegerConverter());
56      converters.Add(new StringConverter());
57      converters.Add(new TimeSpanValueConverter());
58    }
59
60    public void AddToMessage(IItem item, string name, SolutionMessage.Builder builder) {
61      if (dispatcher == null) FillDispatcher();
62      Type itemType = item.GetType();
63      while (!dispatcher.ContainsKey(itemType)) {
64        if (itemType.BaseType != null) itemType = itemType.BaseType;
65        else break;
66      }
67      if (itemType.BaseType == null && !dispatcher.ContainsKey(itemType)) {
68        IEnumerable<Type> interfaces = item.GetType().GetInterfaces().Where(x => dispatcher.ContainsKey(x));
69        if (interfaces.Count() != 1) throw new ArgumentException(Name + ": No converter for type + " + itemType.FullName + " defined.", "item");
70        else itemType = interfaces.Single();
71      }
72      dispatcher[itemType](item, name, builder);
73    }
74
75    [StorableHook(HookType.AfterDeserialization)]
76    private void AttachEventHandlers() {
77      converters.ItemsAdded += new CollectionItemsChangedEventHandler<IItemToSolutionMessageConverter>(converters_ItemsAdded);
78      converters.ItemsRemoved += new CollectionItemsChangedEventHandler<IItemToSolutionMessageConverter>(converters_ItemsRemoved);
79      converters.CheckedItemsChanged += new CollectionItemsChangedEventHandler<IItemToSolutionMessageConverter>(converters_CheckedItemsChanged);
80    }
81
82    private void converters_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IItemToSolutionMessageConverter> e) {
83      AddToDispatcher(e.Items);
84    }
85
86    private void converters_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IItemToSolutionMessageConverter> e) {
87      RemoveFromDispatcher(e.Items);
88    }
89
90    private void converters_CheckedItemsChanged(object sender, CollectionItemsChangedEventArgs<IItemToSolutionMessageConverter> e) {
91      FillDispatcher();
92    }
93
94    private void FillDispatcher() {
95      dispatcher = new Dictionary<Type, Action<IItem, string, SolutionMessage.Builder>>();
96      foreach (IItemToSolutionMessageConverter c in converters.CheckedItems) {
97        Type[] types = c.ItemTypes;
98        foreach (Type t in types) {
99          if (dispatcher.ContainsKey(t)) dispatcher.Remove(t);
100          dispatcher.Add(t, new Action<IItem, string, SolutionMessage.Builder>(c.AddItemToBuilder));
101        }
102      }
103    }
104
105    private void AddToDispatcher(IEnumerable<IItemToSolutionMessageConverter> items) {
106      if (dispatcher == null) FillDispatcher();
107      foreach (IItemToSolutionMessageConverter c in items) {
108        Type[] types = c.ItemTypes;
109        foreach (Type t in types) {
110          if (dispatcher.ContainsKey(t)) dispatcher.Remove(t);
111          dispatcher.Add(t, new Action<IItem, string, SolutionMessage.Builder>(c.AddItemToBuilder));
112        }
113      }
114    }
115
116    private void RemoveFromDispatcher(IEnumerable<IItemToSolutionMessageConverter> items) {
117      if (dispatcher == null) FillDispatcher();
118      foreach (IItemToSolutionMessageConverter c in items) {
119        Type[] types = c.ItemTypes;
120        foreach (Type t in types) {
121          if (dispatcher.ContainsKey(t)) dispatcher.Remove(t);
122        }
123      }
124    }
125  }
126}
Note: See TracBrowser for help on using the repository browser.