Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

Skip to content
Snippets Groups Projects
Commit 1c018063 authored by Michael KRISPER's avatar Michael KRISPER
Browse files

fixed error in validation (validation attributes on interfaces)

parent f9175af2
Branches
Tags
No related merge requests found
......@@ -37,7 +37,6 @@ using TUGraz.VectoCore.Exceptions;
using TUGraz.VectoCore.Models.Declaration;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.OutputData;
using TUGraz.VectoCore.OutputData.PDF;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Models.Simulation.Data
......
......@@ -35,7 +35,6 @@ using System.ComponentModel.DataAnnotations;
using System.Linq;
using TUGraz.VectoCore.Exceptions;
using TUGraz.VectoCore.Models.Declaration;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Models.SimulationComponent.Data
......@@ -135,7 +134,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
WheelsInertia = wheelsInertia;
}
public ValidationResult ValidateVehicleData(VehicleData vehicleData, ValidationContext validationContext)
public static ValidationResult ValidateVehicleData(VehicleData vehicleData, ValidationContext validationContext)
{
var weightShareSum = vehicleData.AxleData.Sum(axle => axle.AxleWeightShare);
if (!weightShareSum.IsEqual(1.0, 1E-10)) {
......
......@@ -29,6 +29,7 @@
* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
......@@ -55,37 +56,59 @@ namespace TUGraz.VectoCore.Utils
var results = new List<ValidationResult>();
Validator.TryValidateObject(entity, new ValidationContext(entity), results, true);
foreach (
var p in
entity.GetType()
.GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public |
BindingFlags.FlattenHierarchy)) {
var attrs = p.GetCustomAttributes(typeof(ValidationAttribute)).Cast<ValidationAttribute>().ToList();
if (attrs.Any()) {
const BindingFlags flags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public |
BindingFlags.FlattenHierarchy;
var properties = entity.GetType().GetProperties(flags);
foreach (var p in properties) {
var attributes = p.GetAttributes<ValidationAttribute>(entity.GetType()).ToArray();
if (attributes.Any()) {
var val = p.GetValue(entity);
context.DisplayName = p.Name;
context.MemberName = p.Name;
Validator.TryValidateValue(val, context, results, attrs);
Validator.TryValidateValue(val, context, results, attributes);
}
}
foreach (
var f in
entity.GetType()
.GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public |
BindingFlags.FlattenHierarchy)) {
var attrs = f.GetCustomAttributes(typeof(ValidationAttribute)).Cast<ValidationAttribute>().ToList();
if (attrs.Any()) {
var fields = entity.GetType().GetFields(flags);
foreach (var f in fields) {
var attributes = f.GetAttributes<ValidationAttribute>(entity.GetType()).ToArray();
if (attributes.Any()) {
var val = f.GetValue(entity);
context.DisplayName = f.Name;
context.MemberName = f.Name;
Validator.TryValidateValue(val, context, results, attrs);
Validator.TryValidateValue(val, context, results, attributes);
}
}
return results;
}
/// <summary>
/// Gets the attributes of a member for the current class, parent classes and all interfaces.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="m"></param>
/// <param name="obj"></param>
/// <returns></returns>
private static IEnumerable<T> GetAttributes<T>(this MemberInfo m, Type obj) where T : Attribute
{
var attributes = Enumerable.Empty<T>();
const BindingFlags flags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy;
var prop = obj.GetProperty(m.Name, flags);
if (prop != null) {
attributes = prop.GetCustomAttributes(typeof(T)).Cast<T>().Concat(obj.GetInterfaces().SelectMany(m.GetAttributes<T>));
}
var field = obj.GetField(m.Name, flags);
if (field != null) {
attributes = attributes.Concat(field.GetCustomAttributes(typeof(T)).Cast<T>().Concat(obj.GetInterfaces().SelectMany(m.GetAttributes<T>)));
}
return attributes;
}
/// <summary>
/// Determines whether this instance is valid. (Extension Method)
/// </summary>
......@@ -177,7 +200,8 @@ namespace TUGraz.VectoCore.Utils
/// </returns>
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
return base.IsValid(((SI)value).Value(), validationContext);
var si = value as SI;
return base.IsValid(si != null ? si.Value() : value, validationContext);
}
}
......
......@@ -123,7 +123,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
};
var results = data.Validate();
Assert.IsFalse(results.Any(), "Validation Failed: " + "; ".Join(results.Select(r => r.ErrorMessage)));
Assert.IsTrue(results.Any(), "Validation should have failed, but succeded.");
}
/// <summary>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment