Free cookie consent management tool by TermsFeed Policy Generator

source: branches/OKB/HeuristicLab.Clients.OKB-3.3/OKBClient.cs @ 4566

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

Worked on OKB (#1174)

File size: 18.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.Clients.Common;
26using HeuristicLab.Collections;
27using HeuristicLab.Common;
28using HeuristicLab.Core;
29using HeuristicLab.Data;
30using HeuristicLab.Optimization;
31using HeuristicLab.PluginInfrastructure;
32
33namespace HeuristicLab.Clients.OKB {
34  [Item("OKBClient", "Client for accessing the OKB.")]
35  public sealed class OKBClient : IContent {
36    private static OKBClient instance;
37    public static OKBClient Instance {
38      get {
39        if (instance == null) instance = new OKBClient();
40        return instance;
41      }
42    }
43
44    #region Properties
45    private ItemCollection<Platform> platforms;
46    public ItemCollection<Platform> Platforms {
47      get { return platforms; }
48    }
49    private ItemCollection<DataType> dataTypes;
50    public ItemCollection<DataType> DataTypes {
51      get { return dataTypes; }
52    }
53    private IEnumerable<User> users;
54    public IEnumerable<User> Users {
55      get { return users; }
56    }
57    private ItemCollection<AlgorithmClass> algorithmClasses;
58    public ItemCollection<AlgorithmClass> AlgorithmClasses {
59      get { return algorithmClasses; }
60    }
61    private ItemCollection<Algorithm> algorithms;
62    public ItemCollection<Algorithm> Algorithms {
63      get { return algorithms; }
64    }
65    private ItemCollection<ProblemClass> problemClasses;
66    public ItemCollection<ProblemClass> ProblemClasses {
67      get { return problemClasses; }
68    }
69    private ItemCollection<Problem> problems;
70    public ItemCollection<Problem> Problems {
71      get { return problems; }
72    }
73    #endregion
74
75    private OKBClient() {
76      platforms = new ItemCollection<Platform>();
77      platforms.ItemsRemoved += new CollectionItemsChangedEventHandler<Platform>(platforms_ItemsRemoved);
78      dataTypes = new ItemCollection<DataType>();
79      dataTypes.ItemsRemoved += new CollectionItemsChangedEventHandler<DataType>(dataTypes_ItemsRemoved);
80      algorithmClasses = new ItemCollection<AlgorithmClass>();
81      algorithmClasses.ItemsRemoved += new CollectionItemsChangedEventHandler<AlgorithmClass>(algorithmClasses_ItemsRemoved);
82      algorithms = new ItemCollection<Algorithm>();
83      algorithms.ItemsRemoved += new CollectionItemsChangedEventHandler<Algorithm>(algorithms_ItemsRemoved);
84      problemClasses = new ItemCollection<ProblemClass>();
85      problemClasses.ItemsRemoved += new CollectionItemsChangedEventHandler<ProblemClass>(problemClasses_ItemsRemoved);
86      problems = new ItemCollection<Problem>();
87      problems.ItemsRemoved += new CollectionItemsChangedEventHandler<Problem>(problems_ItemsRemoved);
88    }
89
90    #region Refresh
91    public void Refresh() {
92      OnRefreshing();
93
94      platforms.Clear();
95      dataTypes.Clear();
96      algorithmClasses.Clear();
97      algorithms.Clear();
98      problemClasses.Clear();
99      problems.Clear();
100
101      var call = new Func<Exception>(delegate() {
102        try {
103          platforms.AddRange(CallAdminService<Platform[]>(s => s.GetPlatforms()).OrderBy(x => x.Name));
104          dataTypes.AddRange(CallAdminService<DataType[]>(s => s.GetDataTypes()).OrderBy(x => x.Name));
105          users = CallAuthenticationService<User[]>(s => s.GetUsers()).OrderBy(x => x.Name);
106          algorithmClasses.AddRange(CallAdminService<AlgorithmClass[]>(s => s.GetAlgorithmClasses()).OrderBy(x => x.Name));
107          algorithms.AddRange(CallAdminService<Algorithm[]>(s => s.GetAlgorithms()).OrderBy(x => x.Name));
108          problemClasses.AddRange(CallAdminService<ProblemClass[]>(s => s.GetProblemClasses()).OrderBy(x => x.Name));
109          problems.AddRange(CallAdminService<Problem[]>(s => s.GetProblems()).OrderBy(x => x.Name));
110          return null;
111        }
112        catch (Exception ex) {
113          return ex;
114        }
115      });
116      call.BeginInvoke(delegate(IAsyncResult result) {
117        Exception ex = call.EndInvoke(result);
118        if (ex != null) ErrorHandling.ShowErrorDialog("Refresh failed.", ex);
119        OnRefreshed();
120      }, null);
121    }
122    #endregion
123
124    #region Store
125    public bool Store(IOKBItem item) {
126      try {
127        if (item.Id == 0) {
128          if (item is Platform)
129            item.Id = CallAdminService<long>(s => s.AddPlatform((Platform)item));
130          else if (item is DataType)
131            item.Id = CallAdminService<long>(s => s.AddDataType((DataType)item));
132          else if (item is AlgorithmClass)
133            item.Id = CallAdminService<long>(s => s.AddAlgorithmClass((AlgorithmClass)item));
134          else if (item is Algorithm)
135            item.Id = CallAdminService<long>(s => s.AddAlgorithm((Algorithm)item));
136          else if (item is AlgorithmParameter)
137            item.Id = CallAdminService<long>(s => s.AddAlgorithmParameter((AlgorithmParameter)item));
138          else if (item is ProblemClass)
139            item.Id = CallAdminService<long>(s => s.AddProblemClass((ProblemClass)item));
140          else if (item is Problem)
141            item.Id = CallAdminService<long>(s => s.AddProblem((Problem)item));
142          else if (item is ProblemParameter)
143            item.Id = CallAdminService<long>(s => s.AddProblemParameter((ProblemParameter)item));
144          else if (item is Result)
145            item.Id = CallAdminService<long>(s => s.AddResult((Result)item));
146        } else {
147          if (item is Platform)
148            CallAdminService(s => s.UpdatePlatform((Platform)item));
149          else if (item is DataType)
150            CallAdminService(s => s.UpdateDataType((DataType)item));
151          else if (item is AlgorithmClass)
152            CallAdminService(s => s.UpdateAlgorithmClass((AlgorithmClass)item));
153          else if (item is Algorithm)
154            CallAdminService(s => s.UpdateAlgorithm((Algorithm)item));
155          else if (item is AlgorithmParameter)
156            CallAdminService(s => s.UpdateAlgorithmParameter((AlgorithmParameter)item));
157          else if (item is ProblemClass)
158            CallAdminService(s => s.UpdateProblemClass((ProblemClass)item));
159          else if (item is Problem)
160            CallAdminService(s => s.UpdateProblem((Problem)item));
161          else if (item is ProblemParameter)
162            CallAdminService(s => s.UpdateProblemParameter((ProblemParameter)item));
163          else if (item is Result)
164            CallAdminService(s => s.UpdateResult((Result)item));
165        }
166        return true;
167      }
168      catch (Exception ex) {
169        ErrorHandling.ShowErrorDialog("Store failed.", ex);
170        return false;
171      }
172    }
173    public bool Store(long algorithmId, long problemId, Run run) {
174      try {
175        IAlgorithm algorithm = run.Algorithm;
176        IProblem problem = algorithm.Problem;
177
178        ItemCollection<AlgorithmParameter> algorithmParameters = GetAlgorithmParameters(algorithmId);
179        AddAlgorithmParamters(algorithmId, algorithmParameters, algorithm, "");
180        ItemCollection<ProblemParameter> problemParameters = GetProblemParameters(problemId);
181        AddProblemParamters(problemId, problemParameters, problem, "");
182
183        return true;
184      }
185      catch (Exception ex) {
186        ErrorHandling.ShowErrorDialog("Store run failed.", ex);
187        return false;
188      }
189    }
190
191    private void AddAlgorithmParamters(long algorithmId, ItemCollection<AlgorithmParameter> parameters, IParameterizedItem item, string prefix) {
192      foreach (IValueParameter param in item.Parameters.OfType<IValueParameter>()) {
193        if (param.GetsCollected && (param.Value != null) && (parameters.FirstOrDefault(x => x.Name == param.Name) == null)) {
194          AlgorithmParameter p = new AlgorithmParameter();
195          p.Name = prefix + param.Name;
196          p.Alias = prefix + param.Name;
197          p.Description = param.Description;
198          p.AlgorithmId = algorithmId;
199          p.DataTypeId = GetDataType(param.DataType).Id;
200          p.Store();
201          parameters.Add(p);
202        }
203        if (param.Value is IParameterizedItem)
204          AddAlgorithmParamters(algorithmId, parameters, (IParameterizedItem)param.Value, (string.IsNullOrEmpty(prefix) ? param.Name : prefix + param.Name) + ".");
205      }
206    }
207    private void AddProblemParamters(long problemId, ItemCollection<ProblemParameter> parameters, IParameterizedItem item, string prefix) {
208      foreach (IValueParameter param in item.Parameters.OfType<IValueParameter>()) {
209        if (param.GetsCollected && (param.Value != null) && (parameters.FirstOrDefault(x => x.Name == param.Name) == null)) {
210          ProblemParameter p = new ProblemParameter();
211          p.Name = prefix + param.Name;
212          p.Alias = prefix + param.Name;
213          p.Description = param.Description;
214          p.ProblemId = problemId;
215          p.DataTypeId = GetDataType(param.DataType).Id;
216          p.Store();
217          parameters.Add(p);
218        }
219        if (param.Value is IParameterizedItem)
220          AddProblemParamters(problemId, parameters, (IParameterizedItem)param.Value, (string.IsNullOrEmpty(prefix) ? param.Name : prefix + param.Name) + ".");
221      }
222    }
223
224    public DataType GetDataType(Type type) {
225      DataType dataType = DataTypes.FirstOrDefault(x => x.Name == type.AssemblyQualifiedName);
226      if (dataType == null) {
227        dataType = new DataType();
228        dataType.Name = type.AssemblyQualifiedName;
229        dataType.PlatformId = Platforms.FirstOrDefault(x => x.Name == "HeuristicLab 3.3").Id;
230
231        if (typeof(BoolValue).IsAssignableFrom(type))
232          dataType.SqlName = "bit";
233        else if (typeof(IntValue).IsAssignableFrom(type))
234          dataType.SqlName = "bigint";
235        else if (typeof(DoubleValue).IsAssignableFrom(type))
236          dataType.SqlName = "float";
237        else if (typeof(StringValue).IsAssignableFrom(type) || typeof(IStringConvertibleValue).IsAssignableFrom(type))
238          dataType.SqlName = "nvarchar";
239        else
240          dataType.SqlName = "varbinary";
241
242        dataType.Store();
243        DataTypes.Add(dataType);
244      }
245      return dataType;
246    }
247
248    #endregion
249
250    #region Algorithm Methods
251    public Guid[] GetAlgorithmUsers(long algorithmId) {
252      try {
253        return CallAdminService<Guid[]>(s => s.GetAlgorithmUsers(algorithmId));
254      }
255      catch (Exception ex) {
256        ErrorHandling.ShowErrorDialog("Refresh authorized algorithm users failed.", ex);
257        return null;
258      }
259    }
260    public bool UpdateAlgorithmUsers(long algorithmId, Guid[] users) {
261      try {
262        CallAdminService(s => s.UpdateAlgorithmUsers(algorithmId, users));
263        return true;
264      }
265      catch (Exception ex) {
266        ErrorHandling.ShowErrorDialog("Update authorized algorithm users failed.", ex);
267        return false;
268      }
269    }
270    public AlgorithmData GetAlgorithmData(long algorithmId) {
271      try {
272        return CallAdminService<AlgorithmData>(s => s.GetAlgorithmData(algorithmId));
273      }
274      catch (Exception ex) {
275        ErrorHandling.ShowErrorDialog("Refresh algorithm data failed.", ex);
276        return null;
277      }
278    }
279    public bool UpdateAlgorithmData(AlgorithmData algorithmData) {
280      try {
281        CallAdminService(s => s.UpdateAlgorithmData(algorithmData));
282        return true;
283      }
284      catch (Exception ex) {
285        ErrorHandling.ShowErrorDialog("Update algorithm data failed.", ex);
286        return false;
287      }
288    }
289    public ItemCollection<AlgorithmParameter> GetAlgorithmParameters(long algorithmId) {
290      try {
291        ItemCollection<AlgorithmParameter> parameters = new ItemCollection<AlgorithmParameter>();
292        parameters.AddRange(CallAdminService<AlgorithmParameter[]>(s => s.GetAlgorithmParameters(algorithmId)).OrderBy(x => x.Name));
293        return parameters;
294      }
295      catch (Exception ex) {
296        ErrorHandling.ShowErrorDialog("Refresh algorithm parameters failed.", ex);
297        return null;
298      }
299    }
300    public ItemCollection<Result> GetResults(long algorithmId) {
301      try {
302        ItemCollection<Result> results = new ItemCollection<Result>();
303        results.AddRange(CallAdminService<Result[]>(s => s.GetResults(algorithmId)).OrderBy(x => x.Name));
304        return results;
305      }
306      catch (Exception ex) {
307        ErrorHandling.ShowErrorDialog("Refresh results failed.", ex);
308        return null;
309      }
310    }
311    #endregion
312
313    #region Problem Methods
314    public Guid[] GetProblemUsers(long problemId) {
315      try {
316        return CallAdminService<Guid[]>(s => s.GetProblemUsers(problemId));
317      }
318      catch (Exception ex) {
319        ErrorHandling.ShowErrorDialog("Refresh authorized problem users failed.", ex);
320        return null;
321      }
322    }
323    public bool UpdateProblemUsers(long problemId, Guid[] users) {
324      try {
325        CallAdminService(s => s.UpdateProblemUsers(problemId, users));
326        return true;
327      }
328      catch (Exception ex) {
329        ErrorHandling.ShowErrorDialog("Update authorized problem users failed.", ex);
330        return false;
331      }
332    }
333    public ProblemData GetProblemData(long problemId) {
334      try {
335        return CallAdminService<ProblemData>(s => s.GetProblemData(problemId));
336      }
337      catch (Exception ex) {
338        ErrorHandling.ShowErrorDialog("Refresh problem data failed.", ex);
339        return null;
340      }
341    }
342    public bool UpdateProblemData(ProblemData problemData) {
343      try {
344        CallAdminService(s => s.UpdateProblemData(problemData));
345        return true;
346      }
347      catch (Exception ex) {
348        ErrorHandling.ShowErrorDialog("Update problem data failed.", ex);
349        return false;
350      }
351    }
352    public ItemCollection<ProblemParameter> GetProblemParameters(long problemId) {
353      try {
354        ItemCollection<ProblemParameter> parameters = new ItemCollection<ProblemParameter>();
355        parameters.AddRange(CallAdminService<ProblemParameter[]>(s => s.GetProblemParameters(problemId)).OrderBy(x => x.Name));
356        return parameters;
357      }
358      catch (Exception ex) {
359        ErrorHandling.ShowErrorDialog("Refresh problem parameters failed.", ex);
360        return null;
361      }
362    }
363    #endregion
364
365    #region Events
366    public event EventHandler Refreshing;
367    private void OnRefreshing() {
368      EventHandler handler = Refreshing;
369      if (handler != null) handler(this, EventArgs.Empty);
370    }
371    public event EventHandler Refreshed;
372    private void OnRefreshed() {
373      EventHandler handler = Refreshed;
374      if (handler != null) handler(this, EventArgs.Empty);
375    }
376
377    private void platforms_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<Platform> e) {
378      try {
379        foreach (Platform p in e.Items)
380          CallAdminService(s => s.DeletePlatform(p.Id));
381      }
382      catch (Exception ex) {
383        ErrorHandling.ShowErrorDialog("Delete failed.", ex);
384      }
385    }
386    private void dataTypes_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<DataType> e) {
387      try {
388        foreach (DataType d in e.Items)
389          CallAdminService(s => s.DeleteDataType(d.Id));
390      }
391      catch (Exception ex) {
392        ErrorHandling.ShowErrorDialog("Delete failed.", ex);
393      }
394    }
395    private void algorithmClasses_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<AlgorithmClass> e) {
396      try {
397        foreach (AlgorithmClass a in e.Items)
398          CallAdminService(s => s.DeleteAlgorithmClass(a.Id));
399      }
400      catch (Exception ex) {
401        ErrorHandling.ShowErrorDialog("Delete failed.", ex);
402      }
403    }
404    private void algorithms_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<Algorithm> e) {
405      try {
406        foreach (Algorithm a in e.Items)
407          CallAdminService(s => s.DeleteAlgorithm(a.Id));
408      }
409      catch (Exception ex) {
410        ErrorHandling.ShowErrorDialog("Delete failed.", ex);
411      }
412    }
413    private void problemClasses_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<ProblemClass> e) {
414      try {
415        foreach (ProblemClass p in e.Items)
416          CallAdminService(s => s.DeleteProblemClass(p.Id));
417      }
418      catch (Exception ex) {
419        ErrorHandling.ShowErrorDialog("Delete failed.", ex);
420      }
421    }
422    private void problems_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<Problem> e) {
423      try {
424        foreach (Problem p in e.Items)
425          CallAdminService(s => s.DeleteProblem(p.Id));
426      }
427      catch (Exception ex) {
428        ErrorHandling.ShowErrorDialog("Delete failed.", ex);
429      }
430    }
431    #endregion
432
433    #region Helpers
434    private void CallAdminService(Action<IOKBService> call) {
435      OKBServiceClient client = ClientFactory.CreateClient<OKBServiceClient, IOKBService>();
436      try {
437        call(client);
438      }
439      finally {
440        try {
441          client.Close();
442        }
443        catch (Exception) {
444          client.Abort();
445        }
446      }
447    }
448    private T CallAdminService<T>(Func<IOKBService, T> call) {
449      OKBServiceClient client = ClientFactory.CreateClient<OKBServiceClient, IOKBService>();
450      try {
451        return call(client);
452      }
453      finally {
454        try {
455          client.Close();
456        }
457        catch (Exception) {
458          client.Abort();
459        }
460      }
461    }
462    private T CallAuthenticationService<T>(Func<IAuthenticationService, T> call) {
463      AuthenticationServiceClient client = ClientFactory.CreateClient<AuthenticationServiceClient, IAuthenticationService>();
464      try {
465        return call(client);
466      }
467      finally {
468        try {
469          client.Close();
470        }
471        catch (Exception) {
472          client.Abort();
473        }
474      }
475    }
476    #endregion
477  }
478}
Note: See TracBrowser for help on using the repository browser.