From e0d4d4fa52ddc87c440b8cf91aaaf2759a2ed462 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Wed, 22 Mar 2017 17:20:52 +0100
Subject: [PATCH] use only one container class for storing information required
 during validation

---
 VECTO/Input Files/Engine.vb                   | 16 ++----
 VECTO/Input Files/Gearbox.vb                  | 14 ++---
 VECTO/Input Files/VectoJob.vb                 |  5 +-
 VECTO/Input Files/Vehicle.vb                  | 21 +++----
 VectoCommon/VectoCommon/Utils/Validation.cs   | 57 ++++++-------------
 .../Data/Gearbox/GearData.cs                  | 13 ++---
 .../Data/Gearbox/ShiftPolygon.cs              | 10 ++--
 .../Data/SimulationComponentData.cs           | 10 ++--
 8 files changed, 59 insertions(+), 87 deletions(-)

diff --git a/VECTO/Input Files/Engine.vb b/VECTO/Input Files/Engine.vb
index e71df29441..063053471f 100644
--- a/VECTO/Input Files/Engine.vb	
+++ b/VECTO/Input Files/Engine.vb	
@@ -229,18 +229,14 @@ Public Class Engine
 	' ReSharper disable once UnusedMember.Global  -- used for Validation
 	Public Shared Function ValidateEngine(engine As Engine, validationContext As ValidationContext) As ValidationResult
 		Dim engineData As CombustionEngineData
-		Dim modeService As ExecutionModeServiceContainer = TryCast(validationContext.GetService(GetType(ExecutionMode)), 
-																	ExecutionModeServiceContainer)
-		Dim mode As ExecutionMode = If(modeService Is Nothing, ExecutionMode.Declaration, modeService.Mode)
 
-		Dim emsCycleService As EmsCycleServiceContainer =
-				TryCast(validationContext.GetService(GetType(EmsCycleServiceContainer)), 
-						EmsCycleServiceContainer)
-		Dim emsCycle As Boolean = (emsCycleService IsNot Nothing) AndAlso emsCycleService.IsEmsCycle
 
-		Dim gbxtypeService As GearboxTypeServiceContainer =
-				TryCast(validationContext.GetService(GetType(GearboxTypeServiceContainer)), GearboxTypeServiceContainer)
-		Dim gbxType As GearboxType? = If(gbxtypeService Is Nothing, GearboxType.MT, gbxtypeService.Type)
+		Dim modeService As VectoValidationModeServiceContainer =
+				TryCast(validationContext.GetService(GetType(VectoValidationModeServiceContainer)), 
+						VectoValidationModeServiceContainer)
+		Dim mode As ExecutionMode = If(modeService Is Nothing, ExecutionMode.Declaration, modeService.Mode)
+		Dim emsCycle As Boolean = (modeService IsNot Nothing) AndAlso modeService.IsEMSCycle
+		Dim gbxType As GearboxType? = If(modeService Is Nothing, GearboxType.MT, modeService.GearboxType)
 
 		Try
 			If mode = ExecutionMode.Declaration Then
diff --git a/VECTO/Input Files/Gearbox.vb b/VECTO/Input Files/Gearbox.vb
index 0b6f6edd2e..48aeba42f9 100644
--- a/VECTO/Input Files/Gearbox.vb	
+++ b/VECTO/Input Files/Gearbox.vb	
@@ -186,14 +186,11 @@ Public Class Gearbox
 
 	' ReSharper disable once UnusedMember.Global -- used by Validation
 	Public Shared Function ValidateGearbox(gearbox As Gearbox, validationContext As ValidationContext) As ValidationResult
-		Dim modeService As ExecutionModeServiceContainer = TryCast(validationContext.GetService(GetType(ExecutionMode)), 
-																	ExecutionModeServiceContainer)
+		Dim modeService As VectoValidationModeServiceContainer =
+				TryCast(validationContext.GetService(GetType(VectoValidationModeServiceContainer)), 
+						VectoValidationModeServiceContainer)
 		Dim mode As ExecutionMode = If(modeService Is Nothing, ExecutionMode.Declaration, modeService.Mode)
-
-		Dim emsCycleService As EmsCycleServiceContainer =
-				TryCast(validationContext.GetService(GetType(EmsCycleServiceContainer)), 
-						EmsCycleServiceContainer)
-		Dim emsCycle As Boolean = (emsCycleService IsNot Nothing) AndAlso emsCycleService.IsEmsCycle
+		Dim emsCycle As Boolean = (modeService IsNot Nothing) AndAlso modeService.IsEMSCycle
 
 		Dim axlegearData As AxleGearData
 		Dim gearboxData As GearboxData
@@ -238,7 +235,8 @@ Public Class Gearbox
 										result.Select(Function(r) r.ErrorMessage + String.Join(Environment.NewLine, r.MemberNames)).ToList())
 			End If
 
-			result = axlegearData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gearbox.Type, emsCycle)
+			result = axlegearData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gearbox.Type,
+											emsCycle)
 			If result.Any() Then
 				Return _
 					New ValidationResult("Axlegear Configuration is invalid. ",
diff --git a/VECTO/Input Files/VectoJob.vb b/VECTO/Input Files/VectoJob.vb
index cf2c922eae..4f02fa7509 100644
--- a/VECTO/Input Files/VectoJob.vb	
+++ b/VECTO/Input Files/VectoJob.vb	
@@ -308,8 +308,9 @@ Public Class VectoJob
 
 	' ReSharper disable once UnusedMember.Global -- used by Validation
 	Public Shared Function ValidateJob(vectoJob As VectoJob, validationContext As ValidationContext) As ValidationResult
-		Dim modeService As ExecutionModeServiceContainer = TryCast(validationContext.GetService(GetType(ExecutionMode)), 
-																	ExecutionModeServiceContainer)
+		Dim modeService As VectoValidationModeServiceContainer =
+				TryCast(validationContext.GetService(GetType(VectoValidationModeServiceContainer)), 
+						VectoValidationModeServiceContainer)
 		Dim mode As ExecutionMode = If(modeService Is Nothing, ExecutionMode.Declaration, modeService.Mode)
 
 		If mode = ExecutionMode.Engineering AndAlso vectoJob.EngineOnly Then
diff --git a/VECTO/Input Files/Vehicle.vb b/VECTO/Input Files/Vehicle.vb
index 337eebf737..0c3cd37815 100644
--- a/VECTO/Input Files/Vehicle.vb	
+++ b/VECTO/Input Files/Vehicle.vb	
@@ -95,17 +95,12 @@ Public Class Vehicle
 		Dim ptoData As PTOData = Nothing
 		Dim angledriveData As AngledriveData
 
-		Dim modeService As ExecutionModeServiceContainer = TryCast(validationContext.GetService(GetType(ExecutionMode)), 
-																	ExecutionModeServiceContainer)
+		Dim modeService As VectoValidationModeServiceContainer =
+				TryCast(validationContext.GetService(GetType(VectoValidationModeServiceContainer)), 
+						VectoValidationModeServiceContainer)
 		Dim mode As ExecutionMode = If(modeService Is Nothing, ExecutionMode.Declaration, modeService.Mode)
-		Dim emsCycleService As EmsCycleServiceContainer =
-				TryCast(validationContext.GetService(GetType(EmsCycleServiceContainer)), 
-						EmsCycleServiceContainer)
-		Dim emsCycle As Boolean = (emsCycleService IsNot Nothing) AndAlso emsCycleService.IsEmsCycle
-
-		Dim gbxtypeService As GearboxTypeServiceContainer =
-				TryCast(validationContext.GetService(GetType(GearboxTypeServiceContainer)), GearboxTypeServiceContainer)
-		Dim gbxType As GearboxType? = If(gbxtypeService Is Nothing, Nothing, gbxtypeService.Type)
+		Dim emsCycle As Boolean = (modeService IsNot Nothing) AndAlso modeService.IsEMSCycle
+		Dim gbxType As GearboxType? = If(modeService Is Nothing, Nothing, modeService.GearboxType)
 
 		Try
 			If mode = ExecutionMode.Declaration Then
@@ -132,7 +127,8 @@ Public Class Vehicle
 										result.Select(Function(r) r.ErrorMessage + String.Join(Environment.NewLine, r.MemberNames)).ToList())
 			End If
 
-			result = retarderData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gbxType, emsCycle)
+			result = retarderData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gbxType,
+											emsCycle)
 			If result.Any() Then
 				Return _
 					New ValidationResult("Retarder Configuration is invalid. ",
@@ -140,7 +136,8 @@ Public Class Vehicle
 			End If
 
 			If vehicle.AngledriveType = AngledriveType.SeparateAngledrive Then
-				result = angledriveData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gbxType, emsCycle)
+				result = angledriveData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gbxType,
+												emsCycle)
 				If result.Any() Then
 					Return _
 						New ValidationResult("AngleDrive Configuration is invalid. ",
diff --git a/VectoCommon/VectoCommon/Utils/Validation.cs b/VectoCommon/VectoCommon/Utils/Validation.cs
index c3a1fa07db..42436a1e9c 100644
--- a/VectoCommon/VectoCommon/Utils/Validation.cs
+++ b/VectoCommon/VectoCommon/Utils/Validation.cs
@@ -61,9 +61,8 @@ namespace TUGraz.VectoCommon.Utils
 				return new[] { new ValidationResult(string.Format("null value given for {0}", typeof(T))) };
 			}
 			var context = new ValidationContext(entity);
-			context.ServiceContainer.AddService(typeof(ExecutionMode), new ExecutionModeServiceContainer(mode));
-			context.ServiceContainer.AddService(typeof(GearboxTypeServiceContainer), new GearboxTypeServiceContainer(gbxType));
-			context.ServiceContainer.AddService(typeof(EmsCycleServiceContainer), new EmsCycleServiceContainer(emsCycle));
+			context.ServiceContainer.AddService(typeof(VectoValidationModeServiceContainer),
+				new VectoValidationModeServiceContainer(mode, gbxType, emsCycle));
 
 			var results = new List<ValidationResult>();
 			Validator.TryValidateObject(entity, context, results, true);
@@ -140,36 +139,20 @@ namespace TUGraz.VectoCommon.Utils
 		}
 	}
 
-	public class ExecutionModeServiceContainer
+	public class VectoValidationModeServiceContainer
 	{
-		public ExecutionModeServiceContainer(ExecutionMode mode)
-		{
-			Mode = mode;
-		}
-
 		public ExecutionMode Mode { get; protected set; }
-	}
+		public GearboxType? GearboxType { get; protected set; }
+		public bool IsEMSCycle { get; protected set; }
 
-	public class GearboxTypeServiceContainer
-	{
-		public GearboxTypeServiceContainer(GearboxType? type)
+		public VectoValidationModeServiceContainer(ExecutionMode mode, GearboxType? gbxType, bool isEMSCycle = false)
 		{
-			Type = type;
+			Mode = mode;
+			GearboxType = gbxType;
+			IsEMSCycle = isEMSCycle;
 		}
-
-
-		public GearboxType? Type { get; protected set; }
 	}
 
-	public class EmsCycleServiceContainer
-	{
-		public EmsCycleServiceContainer(bool isEmsCycle)
-		{
-			IsEmsCycle = isEmsCycle;
-		}
-
-		public bool IsEmsCycle { get; protected set; }
-	}
 
 	/// <summary>
 	/// Determines that the attributed object should be validated recursively.
@@ -190,14 +173,11 @@ namespace TUGraz.VectoCommon.Utils
 				return ValidationResult.Success;
 			}
 
-			var modeService = validationContext.GetService(typeof(ExecutionMode)) as ExecutionModeServiceContainer;
-			var mode = modeService != null ? modeService.Mode : ExecutionMode.Declaration;
-
-			var gbxTypeService = validationContext.GetService(typeof(GearboxTypeServiceContainer)) as GearboxTypeServiceContainer;
-			var gbxType = gbxTypeService != null ? gbxTypeService.Type : GearboxType.MT;
-
-			var emsTypeService = validationContext.GetService(typeof(EmsCycleServiceContainer)) as EmsCycleServiceContainer;
-			var isEmsCycle = emsTypeService != null && emsTypeService.IsEmsCycle;
+			var validationService =
+				validationContext.GetService(typeof(VectoValidationModeServiceContainer)) as VectoValidationModeServiceContainer;
+			var mode = validationService != null ? validationService.Mode : ExecutionMode.Declaration;
+			var gbxType = validationService != null ? validationService.GearboxType : GearboxType.MT;
+			var isEmsCycle = validationService != null && validationService.IsEMSCycle;
 
 			var enumerable = value as IEnumerable;
 			if (enumerable != null) {
@@ -417,11 +397,10 @@ namespace TUGraz.VectoCommon.Utils
 			if (si != null) {
 				_unit = si.GetUnitString();
 			}
-			var emsService = validationContext.GetService(typeof(EmsCycleServiceContainer)) as EmsCycleServiceContainer;
-			var emsMode = emsService != null && emsService.IsEmsCycle;
-
-			var modeService = validationContext.GetService(typeof(ExecutionMode)) as ExecutionModeServiceContainer;
-			var mode = modeService == null ? (ExecutionMode?)null : modeService.Mode;
+			var validationService =
+				validationContext.GetService(typeof(VectoValidationModeServiceContainer)) as VectoValidationModeServiceContainer;
+			var mode = validationService != null ? validationService.Mode : (ExecutionMode?)null;
+			var emsMode = validationService != null && validationService.IsEMSCycle;
 
 			if (!_emsMission.HasValue || _emsMission.Value == emsMode) {
 				if (mode == null) {
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs
index 64856e1d2b..2f0f733297 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs
@@ -77,14 +77,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
 		// ReSharper disable once UnusedMember.Global -- used via validation
 		public static ValidationResult ValidateGearData(GearData gearData, ValidationContext context)
 		{
-			var modeService = context.GetService(typeof(ExecutionMode)) as ExecutionModeServiceContainer;
-			var mode = modeService == null ? ExecutionMode.Declaration : modeService.Mode;
-
-			var gbxTypeService = context.GetService(typeof(GearboxTypeServiceContainer)) as GearboxTypeServiceContainer;
-			var gbxType = gbxTypeService == null ? GearboxType.MT : gbxTypeService.Type;
-
-			var emsTypeService = context.GetService(typeof(EmsCycleServiceContainer)) as EmsCycleServiceContainer;
-			var emsMission = emsTypeService != null && emsTypeService.IsEmsCycle;
+			var validationService =
+				context.GetService(typeof(VectoValidationModeServiceContainer)) as VectoValidationModeServiceContainer;
+			var mode = validationService != null ? validationService.Mode : ExecutionMode.Declaration;
+			var gbxType = validationService != null ? validationService.GearboxType : GearboxType.MT;
+			var emsMission = validationService != null && validationService.IsEMSCycle;
 
 			if (gearData.HasTorqueConverter) {
 				if (gearData.TorqueConverterShiftPolygon == null) {
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/ShiftPolygon.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/ShiftPolygon.cs
index 9b41a3a89c..3069a63cae 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/ShiftPolygon.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/ShiftPolygon.cs
@@ -145,11 +145,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
 		// ReSharper disable once UnusedMember.Global -- used via validation
 		public static ValidationResult ValidateShiftPolygon(ShiftPolygon shiftPolygon, ValidationContext validationContext)
 		{
-			var gbxTypeService = validationContext.GetService(typeof(GearboxTypeServiceContainer)) as GearboxTypeServiceContainer;
-			var gbxType = gbxTypeService == null ? null : gbxTypeService.Type;
+			var validationService =
+				validationContext.GetService(typeof(VectoValidationModeServiceContainer)) as VectoValidationModeServiceContainer;
+			var gbxType = validationService != null ? validationService.GearboxType : null;
 
-			if (gbxType == null || gbxType.Value.AutomaticTransmission())
+			if (gbxType == null || gbxType.Value.AutomaticTransmission()) {
 				return ValidationResult.Success;
+			}
 
 			return shiftPolygon.Downshift.Pairwise(Tuple.Create)
 				.Any(
@@ -182,7 +184,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
 				// vertical line
 				return double.MaxValue.SI<NewtonMeter>();
 			}
-			return VectoMath.Interpolate(section.Item1.AngularSpeed, section.Item2.AngularSpeed, section.Item1.Torque, 
+			return VectoMath.Interpolate(section.Item1.AngularSpeed, section.Item2.AngularSpeed, section.Item1.Torque,
 				section.Item2.Torque, inAngularVelocity);
 		}
 	}
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/SimulationComponentData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/SimulationComponentData.cs
index 7142c1e34a..6cb49c1eff 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/SimulationComponentData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/SimulationComponentData.cs
@@ -57,14 +57,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 
 		protected static ExecutionMode GetExecutionMode(ValidationContext context)
 		{
-			var modeService = context.GetService(typeof(ExecutionMode)) as ExecutionModeServiceContainer;
-			return modeService == null ? ExecutionMode.Declaration : modeService.Mode;
+			var validationService =
+				context.GetService(typeof(VectoValidationModeServiceContainer)) as VectoValidationModeServiceContainer;
+			return validationService == null ? ExecutionMode.Declaration : validationService.Mode;
 		}
 
 		protected static bool GetEmsMode(ValidationContext context)
 		{
-			var emsService = context.GetService(typeof(EmsCycleServiceContainer)) as EmsCycleServiceContainer;
-			return emsService != null && emsService.IsEmsCycle;
+			var validationService =
+				context.GetService(typeof(VectoValidationModeServiceContainer)) as VectoValidationModeServiceContainer;
+			return validationService != null && validationService.IsEMSCycle;
 		}
 	}
 }
\ No newline at end of file
-- 
GitLab