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