diff --git a/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs b/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs index 176ec2e93ba6fba19938ca48a577bc2bf46c9d18..e74e5aa1df286bc34b47fe54c56dc459760441c8 100644 --- a/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs +++ b/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs @@ -105,6 +105,8 @@ namespace TUGraz.VectoCommon.InputData VectoSimulationJobType JobType { get; } bool InputComplete { get; } + + IList<string> InvalidEntries { get; } } diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationMultistageInputData.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationMultistageInputData.cs index c5ea9f4bbe0400b8bd3d26a8d043775fa47ca27a..e65ddef508ad1f130fa9d3a3b00ecb82d12257c0 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationMultistageInputData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationMultistageInputData.cs @@ -88,6 +88,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider public bool InputComplete => Reader.InputComplete; + public IList<string> InvalidEntries => Reader.InvalidEntries; + public IXMLMultistageJobReader Reader { protected get; set; } public IXMLMultistageInputDataProvider InputData { get; } diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/IXMLDeclarationInputDataReader.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/IXMLDeclarationInputDataReader.cs index 60c24aeed47d0d135d3ee999a171021251685a44..7a2edd40e6f1d2fd25b3bef846cdd52951d5722d 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/IXMLDeclarationInputDataReader.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/IXMLDeclarationInputDataReader.cs @@ -65,6 +65,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration VectoSimulationJobType JobType { get; } bool InputComplete { get; } + + IList<string> InvalidEntries { get; } } public interface IXMLMultistageReader diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs index 0e64957144fe4821fc70761f291b12e5c37f622a..a46f804da8fab65497ce26a3c4ecc8d48762c42a 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Xml; using System.Xml.Linq; @@ -151,6 +152,14 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl } } + public IList<string> InvalidEntries + { + get + { + return _consolidateManufacturingStages?.GetInvalidEntries(JobType); + } + } + private ConsolidateManufacturingStages GetConsolidateManufacturingStage() { return new ConsolidateManufacturingStages(PrimaryVehicle, ManufacturingStages.Reverse()); @@ -286,11 +295,34 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl #region Generate Consolidated Multistage InputData - public abstract class ConsolidatedDataBase { protected readonly IEnumerable<IManufacturingStageInputData> _manufacturingStages; - protected string InvalidEntry { get; private set; } + private string _invalidEntry; + protected IList<string> _invalidEntries = new List<string>(); + protected bool _fullChecked = false; + protected bool _checked = false; + protected bool _isComplete = true; + + protected string InvalidEntry + { + get => _invalidEntry; + private set + { + _invalidEntry = value; + + if (!_invalidEntries.Contains(_invalidEntry)) { + _invalidEntries.Add(_invalidEntry); + } + _isComplete = false; + } + } + + + + + + public ConsolidatedDataBase(IEnumerable<IManufacturingStageInputData> manufacturingStages) { @@ -321,10 +353,49 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl return obj; } - public abstract bool IsInputDataComplete(VectoSimulationJobType jobType); + protected abstract bool IsInputDataCompleteTemplate(VectoSimulationJobType jobType, bool fullCheck); + + protected bool IsInputDataComplete(VectoSimulationJobType jobType, bool fullCheck) + { + return fullCheck ? IsInputDataCompleteFullCheck(jobType) : IsInputDataComplete(jobType); + } + + public bool IsInputDataComplete(VectoSimulationJobType jobType) + { + var result = (_checked && _isComplete) || IsInputDataCompleteTemplate(jobType, fullCheck: false); + return result; + } + + public bool IsInputDataCompleteFullCheck(VectoSimulationJobType jobType) + { + if (_isComplete && _checked) { + return true; + } else { + var result = IsInputDataCompleteTemplate(jobType, fullCheck: true); + _fullChecked = true; + _checked = true; + return result; + } + } + + + public abstract string GetInvalidEntry(); + protected abstract IList<string> GetInvalidEntriesTemplate(VectoSimulationJobType jobType); + + public IList<string> GetInvalidEntries(VectoSimulationJobType jobType) + { + if (_checked && _isComplete) { + return _invalidEntries; //<- empty + } else { + IsInputDataCompleteFullCheck(jobType); + return GetInvalidEntriesTemplate(jobType); + } + + } + protected bool MethodComplete(bool result, string methodName) { if (result) @@ -367,9 +438,12 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl public DigestData Signature => _manufacturingStages.First().Signature; - public override bool IsInputDataComplete(VectoSimulationJobType jobType) + + protected override bool IsInputDataCompleteTemplate(VectoSimulationJobType jobType, bool fullCheck) { - return GetConsolidatedVehicleData().IsInputDataComplete(jobType); + return fullCheck + ? GetConsolidatedVehicleData().IsInputDataCompleteFullCheck(jobType) + : GetConsolidatedVehicleData().IsInputDataComplete(jobType); } public override string GetInvalidEntry() @@ -377,6 +451,13 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl return _consolidatedVehicleData.GetInvalidEntry(); } + #region Overrides of ConsolidatedDataBase + protected override IList<string> GetInvalidEntriesTemplate(VectoSimulationJobType jobType) + { + return _invalidEntries.Concat(_consolidatedVehicleData.GetInvalidEntries(jobType)).ToList(); + } + #endregion + private ConsolidatedVehicleData GetConsolidatedVehicleData() { return _consolidatedVehicleData ?? @@ -570,11 +651,37 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl return validAirdragEntries; } - public override bool IsInputDataComplete(VectoSimulationJobType jobType) + protected override bool IsInputDataCompleteTemplate(VectoSimulationJobType jobType, bool fullCheck) { GetADAS(); GetComponents(); + if (fullCheck) { + //use Binary AND to execute all Statements and gather information about missing parameters. + return InputComplete(Model, nameof(Model)) + & InputComplete(LegislativeClass, nameof(LegislativeClass)) + & InputComplete(CurbMassChassis, nameof(CurbMassChassis)) + & InputComplete(GrossVehicleMassRating, nameof(GrossVehicleMassRating)) + & MethodComplete(IsAirdragEntriesValid(), nameof(IsAirdragEntriesValid)) + & MethodComplete(IsTankSystemValid(), nameof(IsTankSystemValid)) + & InputComplete(RegisteredClass, nameof(RegisteredClass)) + & InputComplete(NumberPassengerSeatsLowerDeck, nameof(NumberPassengerSeatsLowerDeck)) + & InputComplete(NumberPassengerSeatsUpperDeck, nameof(NumberPassengerSeatsUpperDeck)) + & InputComplete(NumberPassengersStandingLowerDeck, nameof(NumberPassengersStandingLowerDeck)) + & InputComplete(NumberPassengersStandingUpperDeck, nameof(NumberPassengersStandingUpperDeck)) + & InputComplete(VehicleCode, nameof(VehicleCode)) + & InputComplete(LowEntry, nameof(LowEntry)) + & InputComplete(Height, nameof(Height)) + & InputComplete(Length, nameof(Length)) + & InputComplete(Width, nameof(Width)) + & InputComplete(EntranceHeight, nameof(EntranceHeight)) + & InputComplete(DoorDriveTechnology, nameof(DoorDriveTechnology)) + & InputComplete(_consolidatedADAS, nameof(_consolidatedADAS)) + & _consolidatedADAS.IsInputDataCompleteFullCheck(jobType) + & InputComplete(_consolidatedComponents, nameof(_consolidatedComponents)) + & _consolidatedComponents.IsInputDataCompleteFullCheck(jobType); + } + return InputComplete(Model, nameof(Model)) && InputComplete(LegislativeClass, nameof(LegislativeClass)) && InputComplete(CurbMassChassis, nameof(CurbMassChassis)) @@ -597,6 +704,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl && _consolidatedComponents.IsInputDataComplete(jobType); } + public override string GetInvalidEntry() { if (InvalidEntry != null) @@ -610,6 +718,12 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl return null; } + + protected override IList<string> GetInvalidEntriesTemplate(VectoSimulationJobType jobType) + { + return _invalidEntries.Concat(_consolidatedComponents.GetInvalidEntries(jobType)) + .Concat(_consolidatedADAS.GetInvalidEntries(jobType)).ToList(); + } } // --------------------------------------------------------------------------------------- @@ -644,7 +758,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl return default; } - public override bool IsInputDataComplete(VectoSimulationJobType jobType) + protected override bool IsInputDataCompleteTemplate(VectoSimulationJobType jobType, bool fullCheck) { return InputComplete(ATEcoRollReleaseLockupClutch, nameof(ATEcoRollReleaseLockupClutch)); } @@ -653,6 +767,11 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl { return InvalidEntry; } + + protected override IList<string> GetInvalidEntriesTemplate(VectoSimulationJobType jobType) + { + return _invalidEntries; + } } // --------------------------------------------------------------------------------------- @@ -727,11 +846,15 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl } - public override bool IsInputDataComplete(VectoSimulationJobType jobType) + protected override bool IsInputDataCompleteTemplate(VectoSimulationJobType jobType, bool fullCheck) { GetAirdragInputData(); GetBusAuxiliaries(); - + if (fullCheck) { + //use Binary AND to execute all Statements and gather information about missing parameters. + return InputComplete(_consolidateBusAuxiliariesData, nameof(_consolidateBusAuxiliariesData)) + & _consolidateBusAuxiliariesData.IsInputDataCompleteFullCheck(jobType); + } return InputComplete(_consolidateBusAuxiliariesData, nameof(_consolidateBusAuxiliariesData)) && _consolidateBusAuxiliariesData.IsInputDataComplete(jobType); } @@ -749,6 +872,11 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl return InvalidEntry; } + + protected override IList<string> GetInvalidEntriesTemplate(VectoSimulationJobType jobType) + { + return _invalidEntries.Concat(_consolidateBusAuxiliariesData.GetInvalidEntries(jobType)).ToList(); + } } // --------------------------------------------------------------------------------------- @@ -802,7 +930,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl } } - public override bool IsInputDataComplete(VectoSimulationJobType jobType) + protected override bool IsInputDataCompleteTemplate(VectoSimulationJobType jobType, bool fullCheck) { return InputComplete(AirdragEntry, nameof(AirdragEntry)); } @@ -811,6 +939,11 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl { return InvalidEntry; } + + protected override IList<string> GetInvalidEntriesTemplate(VectoSimulationJobType jobType) + { + return _invalidEntries; + } } // --------------------------------------------------------------------------------------- @@ -874,11 +1007,18 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl } - public override bool IsInputDataComplete(VectoSimulationJobType jobType) + protected override bool IsInputDataCompleteTemplate(VectoSimulationJobType jobType, bool fullCheck) { GetElectricConsumers(); GetHVACAux(); + if (fullCheck) { + //use Binary AND to execute all Statements and gather information about missing parameters. + return InputComplete(_consolidateElectricConsumerData, nameof(_consolidateElectricConsumerData)) + & _consolidateElectricConsumerData.IsInputDataCompleteFullCheck(jobType) + & InputComplete(_consolidatedHVACBusAuxiliariesData, nameof(_consolidatedHVACBusAuxiliariesData)) + & _consolidatedHVACBusAuxiliariesData.IsInputDataCompleteFullCheck(jobType); + } return InputComplete(_consolidateElectricConsumerData, nameof(_consolidateElectricConsumerData)) && _consolidateElectricConsumerData.IsInputDataComplete(jobType) && InputComplete(_consolidatedHVACBusAuxiliariesData, nameof(_consolidatedHVACBusAuxiliariesData)) @@ -898,6 +1038,12 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl return null; } + protected override IList<string> GetInvalidEntriesTemplate(VectoSimulationJobType jobType) + { + return _invalidEntries.Concat(_consolidateElectricConsumerData.GetInvalidEntries(jobType)) + .Concat(_consolidatedHVACBusAuxiliariesData.GetInvalidEntries(jobType)).ToList(); + } + private XmlNode GetBusAuxXMLSource() { @@ -948,8 +1094,15 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl return default; } - public override bool IsInputDataComplete(VectoSimulationJobType jobType) + protected override bool IsInputDataCompleteTemplate(VectoSimulationJobType jobType, bool fullCheck) { + if (fullCheck) { + return InputComplete(InteriorLightsLED, nameof(InteriorLightsLED)) + & InputComplete(DayrunninglightsLED, nameof(DayrunninglightsLED)) + & InputComplete(PositionlightsLED, nameof(PositionlightsLED)) + & InputComplete(HeadlightsLED, nameof(HeadlightsLED)) + & InputComplete(BrakelightsLED, nameof(BrakelightsLED)); + } return InputComplete(InteriorLightsLED, nameof(InteriorLightsLED)) && InputComplete(DayrunninglightsLED, nameof(DayrunninglightsLED)) && InputComplete(PositionlightsLED, nameof(PositionlightsLED)) @@ -961,6 +1114,11 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl { return InvalidEntry; } + + protected override IList<string> GetInvalidEntriesTemplate(VectoSimulationJobType jobType) + { + return _invalidEntries; + } } // --------------------------------------------------------------------------------------- @@ -1043,8 +1201,19 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl } } - public override bool IsInputDataComplete(VectoSimulationJobType jobType) - { + protected override bool IsInputDataCompleteTemplate(VectoSimulationJobType jobType, bool fullCheck) + { + if (fullCheck) { + return MethodComplete(IsCorrectSystemConfiguration(), nameof(IsCorrectSystemConfiguration)) + & InputComplete(HeatPumpTypeDriverCompartment, nameof(HeatPumpTypeDriverCompartment)) + & InputComplete(HeatPumpModeDriverCompartment, nameof(HeatPumpModeDriverCompartment)) + & InputComplete(HeatPumpPassengerCompartments, nameof(HeatPumpPassengerCompartments)) + & InputComplete(AuxHeaterPower, nameof(AuxHeaterPower)) + & InputComplete(DoubleGlazing, nameof(DoubleGlazing)) + & InputComplete(AdjustableAuxiliaryHeater, nameof(AdjustableAuxiliaryHeater)) + & InputComplete(SeparateAirDistributionDucts, nameof(SeparateAirDistributionDucts)) + & MethodComplete(RequiredParametersForJobType(jobType), nameof(RequiredParametersForJobType)); + } return MethodComplete(IsCorrectSystemConfiguration(), nameof(IsCorrectSystemConfiguration)) && InputComplete(HeatPumpTypeDriverCompartment, nameof(HeatPumpTypeDriverCompartment)) && InputComplete(HeatPumpModeDriverCompartment, nameof(HeatPumpModeDriverCompartment)) @@ -1060,6 +1229,11 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl { return InvalidEntry; } + + protected override IList<string> GetInvalidEntriesTemplate(VectoSimulationJobType jobType) + { + return _invalidEntries; + } } #endregion