From 62726a25c5340c779deb5dc6f476967cd87e49d6 Mon Sep 17 00:00:00 2001
From: "harald.martini@student.tugraz.at" <harald.martini@student.tugraz.at>
Date: Tue, 12 Oct 2021 11:15:18 +0200
Subject: [PATCH] Added private Methods for the creation of RunDataFactories,
 Added method to determine if a job should be simulated

---
 .../InputData/IVectoRunDataFactoryFactory.cs  |  13 +
 .../SimulatorFactoryDeclaration.cs            | 287 ++++++++++--------
 .../SimulatorFactoryEngineering.cs            |  33 +-
 VectoCore/VectoCore/VectoCore.csproj          |   2 +
 4 files changed, 181 insertions(+), 154 deletions(-)
 create mode 100644 VectoCore/VectoCore/InputData/IVectoRunDataFactoryFactory.cs

diff --git a/VectoCore/VectoCore/InputData/IVectoRunDataFactoryFactory.cs b/VectoCore/VectoCore/InputData/IVectoRunDataFactoryFactory.cs
new file mode 100644
index 0000000000..9a992a969f
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/IVectoRunDataFactoryFactory.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace TUGraz.VectoCore.InputData
+{
+    public interface IVectoRunDataFactoryFactory
+    {
+
+    }
+}
diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory/SimulatorFactoryDeclaration.cs b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory/SimulatorFactoryDeclaration.cs
index 30088d6307..4558d8ffa0 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory/SimulatorFactoryDeclaration.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory/SimulatorFactoryDeclaration.cs
@@ -9,6 +9,7 @@ using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData;
 using TUGraz.VectoCore.InputData.FileIO.XML;
 using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider;
 using TUGraz.VectoCore.InputData.Reader.Impl;
@@ -28,42 +29,149 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl.SimulatorFactory
 			IVTPReport vtpReport,
 			bool validate) : base(ExecutionMode.Declaration, writer, validate)
 		{
+			_simulate = CanBeSimulated(dataProvider);
 			CreateDeclarationDataReader(dataProvider, declarationReport, vtpReport);
-			//_simFactoryFactory = simFactoryFactory;
+		}
+
+		private bool CanBeSimulated(IInputDataProvider dataProvider)
+		{
+			if (dataProvider is IMultistageVIFInputData multistageVifInputData &&
+				multistageVifInputData.VehicleInputData == null) {
+				var inputComplete = multistageVifInputData.MultistageJobInputData.JobInputData.InputComplete;
+				var declType = multistageVifInputData.MultistageJobInputData.JobInputData.ConsolidateManufacturingStage
+					?.Vehicle.VehicleDeclarationType;
+				var final = declType == VehicleDeclarationType.final;
+				var exempted = multistageVifInputData.MultistageJobInputData.JobInputData.ConsolidateManufacturingStage?
+					.Vehicle.ExemptedVehicle == true;
+
+				if (!((final || exempted) && inputComplete)) {
+					return false;
+				}
+			}
+
+
+			return true;
 		}
 
 		private void CreateDeclarationDataReader(IInputDataProvider dataProvider, IDeclarationReport declarationReport, IVTPReport vtpReport)
 		{
-			if (dataProvider is IVTPDeclarationInputDataProvider vtpProvider)
-			{
-				var report = vtpReport ?? new XMLVTPReport(ReportWriter);
-				if (vtpProvider.JobInputData.Vehicle.VehicleCategory.IsLorry())
-				{
-					DataReader = new DeclarationVTPModeVectoRunDataFactoryLorries(vtpProvider, report);
+			switch (dataProvider) {
+				case IVTPDeclarationInputDataProvider vtpProvider: {
+					DataReader = CreateRunDataReader(vtpProvider, vtpReport);
+					return;
 				}
-				if (vtpProvider.JobInputData.Vehicle.VehicleCategory.IsBus())
-				{
-					DataReader = new DeclarationVTPModeVectoRunDataFactoryHeavyBusPrimary(vtpProvider, report);
+				case ISingleBusInputDataProvider singleBusProvider: {
+					DataReader = CreateRunDataReader(singleBusProvider, declarationReport);
+					return;
+				}
+				case IDeclarationInputDataProvider declDataProvider: {
+					DataReader = CreateRunDataReader(declDataProvider, declarationReport);
+					return;
+				}
+				case IMultistageVIFInputData multistageVifInputData: {
+					if (multistageVifInputData.VehicleInputData == null)
+					{
+						var reportCompleted = new XMLDeclarationReportCompletedVehicle(ReportWriter, true)
+						{
+							PrimaryVehicleReportInputData = multistageVifInputData.MultistageJobInputData.JobInputData.PrimaryVehicle,
+						};
+						DataReader = new DeclarationModeCompletedMultistageBusVectoRunDataFactory(
+							multistageVifInputData.MultistageJobInputData,
+							reportCompleted);
+
+						
+
+					}
+					else
+					{
+						var report = declarationReport ?? new XMLDeclarationReportMultistageBusVehicle(ReportWriter);
+
+						//DataReader = CreateRunDataReader(multistageVifInputData, report);
+						DataReader = new DeclarationModeMultistageBusVectoRunDataFactory(multistageVifInputData, report);
+
+						_followingSimulatorFactoryCreator = () => {
+							var container = new StandardKernel(
+								new VectoNinjectModule()
+							);
+							var inputDataReader = container.Get<IXMLInputDataReader>();
+							var inputData =
+								inputDataReader.CreateDeclaration(
+									XmlReader.Create(ReportWriter.MultistageXmlReport.ToString().ToStream()));
+#pragma warning disable 618
+							return CreateSimulatorFactory(_mode, new XMLDeclarationVIFInputData(inputData as IMultistageBusInputDataProvider, null), ReportWriter, report, vtpReport, Validate);
+#pragma warning restore 618
+						};
+
+					}
+					return;
+				}
+				case IMultistagePrimaryAndStageInputDataProvider multiStagePrimaryAndStageInputData: {
+					System.Diagnostics.Debug.Assert(multiStagePrimaryAndStageInputData.PrimaryVehicle.JobInputData.Vehicle.VehicleCategory == VehicleCategory.HeavyBusPrimaryVehicle);
+
+					var tempOutputWriter = new TempFileOutputWriter(ReportWriter, ReportType.DeclarationReportManufacturerXML);
+					var originalReportWriter = ReportWriter;
+					ReportWriter = tempOutputWriter;
+
+					var tempPrimaryReport = new XMLDeclarationReportPrimaryVehicle(tempOutputWriter, true);
+
+
+					DataReader = CreateRunDataReader(multiStagePrimaryAndStageInputData.PrimaryVehicle, tempPrimaryReport);
+					//DataReader = new DeclarationModePrimaryBusVectoRunDataFactory(multiStagePrimaryAndStageInputData.PrimaryVehicle, tempPrimaryReport);
+
+
+					CreateFollowUpSimulatorFactory = true;
+					_followingSimulatorFactoryCreator = (() => {
+						//replace with dependency injection 
+						var container = new StandardKernel(
+							new VectoNinjectModule()
+						);
+						try
+						{
+							var inputDataReader = container.Get<IXMLInputDataReader>();
+							var primaryInputData = inputDataReader.CreateDeclaration(tempOutputWriter
+								.GetDocument(ReportType.DeclarationReportPrimaryVehicleXML).CreateReader());
+							//var primaryInputData = inputDataReader.CreateDeclaration(((FileOutputWriter)ReportWriter).XMLPrimaryVehicleReportName);
+							var vifInputData = new XMLDeclarationVIFInputData(
+								primaryInputData as IMultistageBusInputDataProvider,
+								multiStagePrimaryAndStageInputData.StageInputData);
+
+							var manStagesCount =
+								vifInputData.MultistageJobInputData.JobInputData.ManufacturingStages?.Count ?? -1;
+
+							originalReportWriter.NumberOfManufacturingStages = manStagesCount;
+#pragma warning disable 618
+							var factory = CreateSimulatorFactory(_mode,
+#pragma warning restore 618
+								vifInputData, originalReportWriter,
+								null,
+								vtpReport,
+								Validate);
+							factory.CreateFollowUpSimulatorFactory = true;
+							return factory;
+						}
+						catch (Exception ex)
+						{
+							Log.Error($"Failed to create additional Simulation run: {ex.Message}");
+							return null;
+						}
+					});
+					return;
 				}
-				return;
+				default:
+					throw new VectoException("Unknown InputData for Declaration Mode!");
 			}
+		}
 
-			if (dataProvider is ISingleBusInputDataProvider)
-			{
-				var singleBus = dataProvider as ISingleBusInputDataProvider;
+		private IVectoRunDataFactory CreateRunDataReader(IDeclarationInputDataProvider declDataProvider,
+			IDeclarationReport declarationReport)
+		{
+			var vehicleCategory = declDataProvider.JobInputData.Vehicle.VehicleCategory;
+			if(vehicleCategory.IsLorry()) {
 				var report = declarationReport ?? new XMLDeclarationReport(ReportWriter);
-				DataReader = new DeclarationModeSingleBusVectoRunDataFactory(singleBus, report);
-				return;
+				return new DeclarationModeTruckVectoRunDataFactory(declDataProvider, report);
 			}
-			if (dataProvider is IDeclarationInputDataProvider declDataProvider)
-			{
-				if (declDataProvider.JobInputData.Vehicle.VehicleCategory.IsLorry())
-				{
-					var report = declarationReport ?? new XMLDeclarationReport(ReportWriter);
-					DataReader = new DeclarationModeTruckVectoRunDataFactory(declDataProvider, report);
-					return;
-				}
 
+			if(vehicleCategory.IsBus())
 				switch (declDataProvider.JobInputData.Vehicle.VehicleCategory)
 				{
 					case VehicleCategory.HeavyBusCompletedVehicle:
@@ -73,128 +181,43 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl.SimulatorFactory
 											{
 												PrimaryVehicleReportInputData = declDataProvider.PrimaryVehicleData,
 											};
-						DataReader = new DeclarationModeCompletedBusVectoRunDataFactory(declDataProvider, reportCompleted);
-						return;
+						return new DeclarationModeCompletedBusVectoRunDataFactory(declDataProvider, reportCompleted);
 					case VehicleCategory.HeavyBusPrimaryVehicle:
 						var reportPrimary = declarationReport ??
 											new XMLDeclarationReportPrimaryVehicle(ReportWriter,
 												declDataProvider.JobInputData.Vehicle.VehicleCategory == VehicleCategory.HeavyBusPrimaryVehicle);
-						DataReader = new DeclarationModePrimaryBusVectoRunDataFactory(declDataProvider, reportPrimary);
-						return;
+						return new DeclarationModePrimaryBusVectoRunDataFactory(declDataProvider, reportPrimary);
+						
 					default:
-						System.Diagnostics.Debug.Assert(false);
+
 						break;
 				}
-			}
-
-			if (dataProvider is IMultistageVIFInputData multistageVifInputData)
-			{
-				//ToDo FK: check if data completed == true && final 
-				var inputComplete = multistageVifInputData.MultistageJobInputData.JobInputData.InputComplete;
-				var declType = multistageVifInputData.MultistageJobInputData.JobInputData.ConsolidateManufacturingStage
-					?.Vehicle.VehicleDeclarationType;
-				var final = declType == VehicleDeclarationType.final;
-				var exempted = multistageVifInputData.MultistageJobInputData.JobInputData.ConsolidateManufacturingStage?
-					.Vehicle.ExemptedVehicle == true;
 
+			throw new Exception(
+				$"Could not create RunDataFactory for Vehicle Category{vehicleCategory}");
+		}
 
-				if (multistageVifInputData.VehicleInputData == null)
-				{ // eigener writer für in-memory
-					var reportCompleted = new XMLDeclarationReportCompletedVehicle(ReportWriter, true)
-					{
-						PrimaryVehicleReportInputData = multistageVifInputData.MultistageJobInputData.JobInputData.PrimaryVehicle,
-					};
-					DataReader = new DeclarationModeCompletedMultistageBusVectoRunDataFactory(
-						multistageVifInputData.MultistageJobInputData,
-						reportCompleted);
-					if (!((final || exempted) && inputComplete))
-					{
-						_simulate = false;
-					}
-
-				}
-				else
-				{
-					var report = declarationReport ?? new XMLDeclarationReportMultistageBusVehicle(ReportWriter);
-					DataReader = new DeclarationModeMultistageBusVectoRunDataFactory(multistageVifInputData, report);
-
-					_followingSimulatorFactoryCreator = () => {
-						var container = new StandardKernel(
-							new VectoNinjectModule()
-						);
-						var inputDataReader = container.Get<IXMLInputDataReader>();
-
-						var mode = _mode;
-						var inputData =
-							inputDataReader.CreateDeclaration(
-								XmlReader.Create(ReportWriter.MultistageXmlReport.ToString().ToStream()));
-						//inputDataReader.CreateDeclaration(((FileOutputWriter)ReportWriter)
-						//	.XMLMultistageReportFileName);
-#pragma warning disable 618
-						return CreateSimulatorFactory(_mode, new XMLDeclarationVIFInputData(inputData as IMultistageBusInputDataProvider, null), ReportWriter, report, vtpReport, Validate);
-#pragma warning restore 618
-					};
+		private IVectoRunDataFactory CreateRunDataReader(ISingleBusInputDataProvider singleBusProvider,
+			IDeclarationReport declarationReport)
+		{
+			var report = declarationReport ?? new XMLDeclarationReport(ReportWriter);
+			return new DeclarationModeSingleBusVectoRunDataFactory(singleBusProvider, report);
+		}
 
-				}
-				return;
+		private IVectoRunDataFactory CreateRunDataReader(IVTPDeclarationInputDataProvider vtpProvider,
+			IVTPReport vtpReport)
+		{
+			var report = vtpReport ?? new XMLVTPReport(ReportWriter);
+			if (vtpProvider.JobInputData.Vehicle.VehicleCategory.IsLorry()) {
+				return new DeclarationVTPModeVectoRunDataFactoryLorries(vtpProvider, report);
 			}
 
-			if (dataProvider is IMultistagePrimaryAndStageInputDataProvider multiStagePrimaryAndStageInputData)
-			{
-				System.Diagnostics.Debug.Assert(multiStagePrimaryAndStageInputData.PrimaryVehicle.JobInputData.Vehicle.VehicleCategory == VehicleCategory.HeavyBusPrimaryVehicle);
-
-				var tempOutputWriter = new TempFileOutputWriter(ReportWriter, ReportType.DeclarationReportManufacturerXML);
-				var originalReportWriter = ReportWriter;
-				ReportWriter = tempOutputWriter;
-
-				var tempPrimaryReport = new XMLDeclarationReportPrimaryVehicle(tempOutputWriter, true);
-
-				DataReader = new DeclarationModePrimaryBusVectoRunDataFactory(multiStagePrimaryAndStageInputData.PrimaryVehicle, tempPrimaryReport);
-
-				var reportPrimary = new XMLDeclarationReportPrimaryVehicle(ReportWriter,
-										true);
-
-				CreateFollowUpSimulatorFactory = true;
-				_followingSimulatorFactoryCreator = (() => {
-					//replace with dependency injection 
-					var container = new StandardKernel(
-						new VectoNinjectModule()
-					);
-					try
-					{
-						var inputDataReader = container.Get<IXMLInputDataReader>();
-						var primaryInputData = inputDataReader.CreateDeclaration(tempOutputWriter
-							.GetDocument(ReportType.DeclarationReportPrimaryVehicleXML).CreateReader());
-						//var primaryInputData = inputDataReader.CreateDeclaration(((FileOutputWriter)ReportWriter).XMLPrimaryVehicleReportName);
-						var vifInputData = new XMLDeclarationVIFInputData(
-							primaryInputData as IMultistageBusInputDataProvider,
-							multiStagePrimaryAndStageInputData.StageInputData);
-
-						var manStagesCount =
-							vifInputData.MultistageJobInputData.JobInputData.ManufacturingStages?.Count ?? -1;
-
-						originalReportWriter.NumberOfManufacturingStages = manStagesCount;
-#pragma warning disable 618
-						var factory = CreateSimulatorFactory(_mode,
-#pragma warning restore 618
-							vifInputData, originalReportWriter,
-							null,
-							vtpReport,
-							Validate);
-						factory.CreateFollowUpSimulatorFactory = true;
-						return factory;
-					}
-					catch (Exception ex)
-					{
-						Log.Error($"Failed to create additional Simulation run: {ex.Message}");
-						return null;
-					}
-				});
-				return;
+			if (vtpProvider.JobInputData.Vehicle.VehicleCategory.IsBus()) {
+				return new DeclarationVTPModeVectoRunDataFactoryHeavyBusPrimary(vtpProvider, report);
 			}
 
-
-			throw new VectoException("Unknown InputData for Declaration Mode!");
+			throw new Exception(
+				$"Could not create RunDataFactory for Vehicle Category{vtpProvider.JobInputData.Vehicle.VehicleCategory}");
 		}
 
 		#region Overrides of SimulatorFactory
diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory/SimulatorFactoryEngineering.cs b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory/SimulatorFactoryEngineering.cs
index 3ef0758934..49033e9301 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory/SimulatorFactoryEngineering.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory/SimulatorFactoryEngineering.cs
@@ -18,35 +18,24 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl.SimulatorFactory
             CreateEngineeringDataReader(dataProvider);
         }
 
-
-
 		private void CreateEngineeringDataReader(IInputDataProvider dataProvider)
 		{
-			if (dataProvider is IVTPEngineeringInputDataProvider vtpProvider)
-			{
-				if (vtpProvider.JobInputData.Vehicle.VehicleCategory.IsLorry())
-				{
+			switch (dataProvider) {
+				case IVTPEngineeringInputDataProvider vtpProvider when vtpProvider.JobInputData.Vehicle.VehicleCategory.IsLorry():
 					DataReader = new EngineeringVTPModeVectoRunDataFactoryLorries(vtpProvider);
-				}
-				if (vtpProvider.JobInputData.Vehicle.VehicleCategory.IsBus())
-				{
+					return;
+				case IVTPEngineeringInputDataProvider vtpProvider when vtpProvider.JobInputData.Vehicle.VehicleCategory.IsBus():
 					DataReader = new EngineeringVTPModeVectoRunDataFactoryHeavyBusPrimary(vtpProvider);
-				}
-				return;
-			}
-			if (dataProvider is IEngineeringInputDataProvider engDataProvider)
-			{
-				if (engDataProvider.JobInputData.JobType == VectoSimulationJobType.EngineOnlySimulation)
-				{
+					return;
+				case IEngineeringInputDataProvider engDataProvider when engDataProvider.JobInputData.JobType == VectoSimulationJobType.EngineOnlySimulation:
 					DataReader = new EngineOnlyVectoRunDataFactory(engDataProvider);
-				}
-				else
-				{
+					return;
+				case IEngineeringInputDataProvider engDataProvider:
 					DataReader = new EngineeringModeVectoRunDataFactory(engDataProvider);
-				}
-				return;
+					return;
+				default:
+					throw new VectoException("Unknown InputData for Engineering Mode!");
 			}
-			throw new VectoException("Unknown InputData for Engineering Mode!");
 		}
 
 		#region Overrides of SimulatorFactory
diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj
index ab04879a32..3b6cadfd54 100644
--- a/VectoCore/VectoCore/VectoCore.csproj
+++ b/VectoCore/VectoCore/VectoCore.csproj
@@ -282,6 +282,7 @@
     <Compile Include="InputData\FileIO\XML\Declaration\IXMLDeclarationInputDataReader.cs" />
     <Compile Include="InputData\FileIO\XML\IXMLInputDataReader.cs" />
     <Compile Include="InputData\FileIO\XML\XMLInputDataNinjectModule.cs" />
+    <Compile Include="InputData\IVectoRunDataFactoryFactory.cs" />
     <Compile Include="InputData\Reader\ComponentData\BatteryInternalResistanceReader.cs" />
     <Compile Include="InputData\Reader\ComponentData\BatteryMaxCurrentReader.cs" />
     <Compile Include="Models\SimulationComponent\Impl\BatterySystem.cs" />
@@ -525,6 +526,7 @@
     <Compile Include="OutputData\XML\DeclarationReports\VehicleInformationFile\XMLMultistageBusReport.cs" />
     <Compile Include="OutputData\XML\DeclarationReports\VehicleInformationFile\XMLPrimaryBusVehicleReport.cs" />
     <Compile Include="OutputData\XML\GroupWriter\XMLGroupWriterNinjectModule.cs" />
+    <Compile Include="Utils\Ninject\PerMethodInstanceProvider.cs" />
     <Compile Include="Utils\Ninject\UseFirstArgumentAsInstanceProvider.cs" />
     <Compile Include="InputData\FileIO\XML\Declaration\NinjectModules\XMLDeclarationReaderInjectModule.cs" />
     <Compile Include="InputData\FileIO\XML\Declaration\DataProvider\XMLDeclarationVehicleDataProvider.cs" />
-- 
GitLab