#region License Information
/* HeuristicLab
* Copyright (C) 2002-2019 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
*
* This file is part of HeuristicLab.
*
* HeuristicLab is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* HeuristicLab is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with HeuristicLab. If not, see .
*/
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using DA = HeuristicLab.Services.OKB.DataAccess;
using DT = HeuristicLab.Services.OKB.RunCreation.DataTransfer;
namespace HeuristicLab.Services.OKB.RunCreation {
public static class Convert {
#region ToDto
public static DT.Algorithm ToDto(DA.Algorithm source) {
if (source == null) return null;
return new DT.Algorithm { Id = source.Id, Name = source.Name, Description = source.Description, AlgorithmClass = Convert.ToDto(source.AlgorithmClass), DataType = Convert.ToDto(source.DataType) };
}
public static DT.Problem ToDto(DA.Problem source) {
if (source == null) return null;
return new DT.Problem { Id = source.Id, Name = source.Name, Description = source.Description, ProblemClass = Convert.ToDto(source.ProblemClass), DataType = Convert.ToDto(source.DataType) };
}
public static DT.SingleObjectiveSolution ToDto(DA.SingleObjectiveSolution source) {
if (source == null) return null;
return new DT.SingleObjectiveSolution() {
Id = source.Id,
ProblemId = source.ProblemId.Value,
RunId = source.RunId,
Quality = source.Quality,
DataType = ToDto(source.DataType)
};
}
private static DT.DataType ToDto(DA.DataType source) {
if (source == null) return null;
return new DT.DataType { Name = source.Name, TypeName = source.TypeName };
}
private static DT.AlgorithmClass ToDto(DA.AlgorithmClass source) {
if (source == null) return null;
return new DT.AlgorithmClass { Name = source.Name, Description = source.Description };
}
private static DT.ProblemClass ToDto(DA.ProblemClass source) {
if (source == null) return null;
return new DT.ProblemClass { Name = source.Name, Description = source.Description };
}
#endregion
#region ToEntity
public static DA.Run ToEntity(DT.Run source, DA.OKBDataContext okb) {
if (source == null) return null;
List binCache = new List();
DA.Run entity = new DA.Run { Id = 0, AlgorithmId = source.AlgorithmId, ProblemId = source.ProblemId, CreatedDate = source.CreatedDate, UserId = source.UserId, ClientId = source.ClientId };
foreach (var value in source.ParameterValues)
entity.Values.Add(Convert.ToEntity(value, entity, DA.ValueNameCategory.Parameter, okb, binCache));
foreach (var value in source.ResultValues)
entity.Values.Add(Convert.ToEntity(value, entity, DA.ValueNameCategory.Result, okb, binCache));
return entity;
}
public static DT.Value ToDto(DA.CharacteristicValue source) {
if (source == null) return null;
if (source.Characteristic.Type == DA.CharacteristicType.Bool) {
return new DT.BoolValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.BoolValue.GetValueOrDefault() };
} else if (source.Characteristic.Type == DA.CharacteristicType.Int) {
return new DT.IntValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.IntValue.GetValueOrDefault() };
} else if (source.Characteristic.Type == DA.CharacteristicType.TimeSpan) {
return new DT.TimeSpanValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.LongValue.GetValueOrDefault() };
} else if (source.Characteristic.Type == DA.CharacteristicType.Long) {
return new DT.LongValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.LongValue.GetValueOrDefault() };
} else if (source.Characteristic.Type == DA.CharacteristicType.Float) {
return new DT.FloatValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.FloatValue.GetValueOrDefault() };
} else if (source.Characteristic.Type == DA.CharacteristicType.Double) {
return new DT.DoubleValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.DoubleValue.GetValueOrDefault() };
} else if (source.Characteristic.Type == DA.CharacteristicType.Percent) {
return new DT.PercentValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.DoubleValue.GetValueOrDefault() };
} else if (source.Characteristic.Type == DA.CharacteristicType.String) {
return new DT.StringValue { Name = source.Characteristic.Name, DataType = Convert.ToDto(source.DataType), Value = source.StringValue };
} else {
throw new ArgumentException("Unknown characteristic type.", "source");
}
}
public static DA.CharacteristicValue ToEntity(DT.Value source, DA.OKBDataContext okb, DA.Problem problem, DA.CharacteristicType type) {
if (okb == null || problem == null || source == null || string.IsNullOrEmpty(source.Name)) throw new ArgumentNullException();
var entity = new DA.CharacteristicValue();
entity.Problem = problem;
entity.DataType = Convert.ToEntity(source.DataType, okb);
entity.Characteristic = Convert.ToEntity(source.Name, type, okb);
if (source is DT.BoolValue) {
entity.BoolValue = ((DT.BoolValue)source).Value;
} else if (source is DT.IntValue) {
entity.IntValue = ((DT.IntValue)source).Value;
} else if (source is DT.TimeSpanValue) {
entity.LongValue = ((DT.TimeSpanValue)source).Value;
} else if (source is DT.LongValue) {
entity.LongValue = ((DT.LongValue)source).Value;
} else if (source is DT.FloatValue) {
entity.FloatValue = ((DT.FloatValue)source).Value;
} else if (source is DT.DoubleValue) {
entity.DoubleValue = ((DT.DoubleValue)source).Value;
} else if (source is DT.PercentValue) {
entity.DoubleValue = ((DT.PercentValue)source).Value;
} else if (source is DT.StringValue) {
entity.StringValue = ((DT.StringValue)source).Value;
} else {
throw new ArgumentException("Unknown characteristic type.", "source");
}
return entity;
}
private static DA.Characteristic ToEntity(string name, DA.CharacteristicType type, DA.OKBDataContext okb) {
if (string.IsNullOrEmpty(name)) return null;
var entity = okb.Characteristics.FirstOrDefault(x => (x.Name == name) && (x.Type == type));
return entity ?? new DA.Characteristic() { Id = 0, Name = name, Type = type };
}
private static DA.Value ToEntity(DT.Value source, DA.Run run, DA.ValueNameCategory category, DA.OKBDataContext okb, List binCache) {
if (source == null) return null;
var entity = new DA.Value();
entity.Run = run;
entity.DataType = Convert.ToEntity(source.DataType, okb);
if (source is DT.BoolValue) {
entity.ValueName = Convert.ToEntity(source.Name, category, DA.ValueNameType.Bool, okb);
entity.BoolValue = ((DT.BoolValue)source).Value;
} else if (source is DT.IntValue) {
entity.ValueName = Convert.ToEntity(source.Name, category, DA.ValueNameType.Int, okb);
entity.IntValue = ((DT.IntValue)source).Value;
} else if (source is DT.TimeSpanValue) {
entity.ValueName = Convert.ToEntity(source.Name, category, DA.ValueNameType.TimeSpan, okb);
entity.LongValue = ((DT.TimeSpanValue)source).Value;
} else if (source is DT.LongValue) {
entity.ValueName = Convert.ToEntity(source.Name, category, DA.ValueNameType.Long, okb);
entity.LongValue = ((DT.LongValue)source).Value;
} else if (source is DT.FloatValue) {
entity.ValueName = Convert.ToEntity(source.Name, category, DA.ValueNameType.Float, okb);
entity.FloatValue = ((DT.FloatValue)source).Value;
} else if (source is DT.DoubleValue) {
entity.ValueName = Convert.ToEntity(source.Name, category, DA.ValueNameType.Double, okb);
entity.DoubleValue = ((DT.DoubleValue)source).Value;
} else if (source is DT.PercentValue) {
entity.ValueName = Convert.ToEntity(source.Name, category, DA.ValueNameType.Percent, okb);
entity.DoubleValue = ((DT.PercentValue)source).Value;
} else if (source is DT.StringValue) {
entity.ValueName = Convert.ToEntity(source.Name, category, DA.ValueNameType.String, okb);
entity.StringValue = ((DT.StringValue)source).Value;
} else if (source is DT.BinaryValue) {
entity.ValueName = Convert.ToEntity(source.Name, category, DA.ValueNameType.Binary, okb);
entity.BinaryData = Convert.ToEntity(((DT.BinaryValue)source).Value, okb, binCache);
} else {
throw new ArgumentException("Unknown value type.", "source");
}
return entity;
}
public static DA.DataType ToEntity(DT.DataType source, DA.OKBDataContext okb) {
if (source == null) return null;
var entity = okb.DataTypes.FirstOrDefault(x => (x.Name == source.Name) && (x.TypeName == source.TypeName));
if (entity == null)
entity = new DA.DataType() { Id = 0, Name = source.Name, TypeName = source.TypeName };
return entity;
}
private static DA.ValueName ToEntity(string name, DA.ValueNameCategory category, DA.ValueNameType type, DA.OKBDataContext okb) {
if (string.IsNullOrEmpty(name)) return null;
var entity = okb.ValueNames.FirstOrDefault(x => (x.Name == name) && (x.Category == category) && (x.Type == type));
if (entity == null)
entity = new DA.ValueName() { Id = 0, Name = name, Category = category, Type = type };
return entity;
}
private static DA.BinaryData ToEntity(byte[] data, DA.OKBDataContext okb, List binCache) {
if (data == null) return null;
byte[] hash;
using (SHA1 sha1 = SHA1.Create()) {
hash = sha1.ComputeHash(data);
}
var cachedBinaryData = binCache.FirstOrDefault(x => x.Hash.SequenceEqual(hash));
if (cachedBinaryData != null)
return cachedBinaryData;
var entity = okb.BinaryDatas.FirstOrDefault(x => x.Hash.Equals(hash));
if (entity == null) {
entity = new DA.BinaryData() { Id = 0, Data = data, Hash = hash };
binCache.Add(entity);
}
return entity;
}
public static DA.SingleObjectiveSolution ToEntity(DT.SingleObjectiveSolution source, byte[] data, DA.OKBDataContext okb) {
var sol = okb.SingleObjectiveSolutions.SingleOrDefault(x => x.Id == source.Id) ?? new DA.SingleObjectiveSolution() {
ProblemId = source.ProblemId,
RunId = source.RunId,
Quality = source.Quality
};
if (source.DataType != null) {
sol.DataType = ToEntity(source.DataType, okb);
}
if (data != null && data.Length > 0) {
byte[] hash;
using (var sha1 = SHA1.Create()) {
hash = sha1.ComputeHash(data);
}
sol.BinaryData = new DA.BinaryData() {
Data = data,
Hash = hash
};
}
return sol;
}
#endregion
}
}