Index: Riskeer/Integration/src/Riskeer.Integration.IO/Importers/HydraulicLocationConfigurationDatabaseImporter.cs =================================================================== diff -u -r3cf4db7514bf18c69df8848ccebfaad27c052145 -r4d1a83529af01e9d195a7cba18a51ecb4d596ef5 --- Riskeer/Integration/src/Riskeer.Integration.IO/Importers/HydraulicLocationConfigurationDatabaseImporter.cs (.../HydraulicLocationConfigurationDatabaseImporter.cs) (revision 3cf4db7514bf18c69df8848ccebfaad27c052145) +++ Riskeer/Integration/src/Riskeer.Integration.IO/Importers/HydraulicLocationConfigurationDatabaseImporter.cs (.../HydraulicLocationConfigurationDatabaseImporter.cs) (revision 4d1a83529af01e9d195a7cba18a51ecb4d596ef5) @@ -1,4 +1,4 @@ -// Copyright (C) Stichting Deltares 2022. All rights reserved. +// Copyright (C) Stichting Deltares 2022. All rights reserved. // // This file is part of Riskeer. // @@ -29,6 +29,7 @@ using Core.Common.IO.Readers; using Core.Common.Util.Builders; using Riskeer.Common.Data.Hydraulics; +using Riskeer.HydraRing.IO.HydraulicBoundaryDatabase; using Riskeer.HydraRing.IO.HydraulicLocationConfigurationDatabase; using Riskeer.Integration.IO.Handlers; using Riskeer.Integration.IO.Properties; @@ -109,9 +110,24 @@ return false; } + var hydraulicBoundaryDatabaseLookup = new Dictionary(); + if (hydraulicBoundaryData.HydraulicBoundaryDatabases.Any()) { NotifyProgress(Resources.HydraulicLocationConfigurationDatabaseImporter_ProgressText_Reading_Hrd_files, 2, numberOfSteps); + + foreach (HydraulicBoundaryDatabase hydraulicBoundaryDatabase in hydraulicBoundaryData.HydraulicBoundaryDatabases) + { + ReadResult readHydraulicBoundaryDatabase = ReadHydraulicBoundaryDatabase(hydraulicBoundaryDatabase); + if (readHydraulicBoundaryDatabase.CriticalErrorOccurred || Canceled) + { + return false; + } + + long hydraulicBoundaryDatabaseTrackId = readHydraulicBoundaryDatabase.Items.Single().TrackId; + + hydraulicBoundaryDatabaseLookup.Add(hydraulicBoundaryDatabase, hydraulicBoundaryDatabaseTrackId); + } } IEnumerable currentLocationIds = hydraulicBoundaryData.GetLocations().Select(l => l.Id).ToArray(); @@ -122,7 +138,7 @@ return false; } - SetReadHydraulicLocationConfigurationSettingsToDataModel(readHydraulicLocationConfigurationDatabase); + SetReadHydraulicLocationConfigurationSettingsToDataModel(readHydraulicLocationConfigurationDatabase, hydraulicBoundaryDatabaseLookup); return true; } @@ -164,6 +180,27 @@ } } + private ReadResult ReadHydraulicBoundaryDatabase(HydraulicBoundaryDatabase hydraulicBoundaryDatabase) + { + try + { + using (var reader = new HydraulicBoundaryDatabaseReader(hydraulicBoundaryDatabase.FilePath)) + { + return new ReadResult(false) + { + Items = new[] + { + reader.Read() + } + }; + } + } + catch (Exception e) when (e is CriticalFileReadException || e is LineParseException) + { + return HandleCriticalFileReadError(e); + } + } + private void InquireConfirmation() { if (!updateHandler.InquireConfirmation()) @@ -172,11 +209,12 @@ } } - private void SetReadHydraulicLocationConfigurationSettingsToDataModel(ReadHydraulicLocationConfigurationDatabase readHydraulicLocationConfigurationDatabase) + private void SetReadHydraulicLocationConfigurationSettingsToDataModel(ReadHydraulicLocationConfigurationDatabase readHydraulicLocationConfigurationDatabase, + IDictionary hydraulicBoundaryDatabaseLookup) { NotifyProgress(RiskeerCommonIOResources.Importer_ProgressText_Adding_imported_data_to_AssessmentSection, numberOfSteps, numberOfSteps); changedObservables.AddRange(updateHandler.Update(hydraulicBoundaryData, readHydraulicLocationConfigurationDatabase, - new Dictionary(), FilePath)); + hydraulicBoundaryDatabaseLookup, FilePath)); } private ReadResult HandleCriticalFileReadError(Exception e) Index: Riskeer/Integration/test/Riskeer.Integration.IO.Test/Importers/HydraulicLocationConfigurationDatabaseImporterTest.cs =================================================================== diff -u -r3cf4db7514bf18c69df8848ccebfaad27c052145 -r4d1a83529af01e9d195a7cba18a51ecb4d596ef5 --- Riskeer/Integration/test/Riskeer.Integration.IO.Test/Importers/HydraulicLocationConfigurationDatabaseImporterTest.cs (.../HydraulicLocationConfigurationDatabaseImporterTest.cs) (revision 3cf4db7514bf18c69df8848ccebfaad27c052145) +++ Riskeer/Integration/test/Riskeer.Integration.IO.Test/Importers/HydraulicLocationConfigurationDatabaseImporterTest.cs (.../HydraulicLocationConfigurationDatabaseImporterTest.cs) (revision 4d1a83529af01e9d195a7cba18a51ecb4d596ef5) @@ -269,7 +269,13 @@ handler.Expect(h => h.InquireConfirmation()).Return(true); handler.Expect(h => h.Update(Arg.Is.Same(hydraulicBoundaryData), Arg.Is.NotNull, - Arg>.Is.NotNull, + Arg>.Is.Equal( + new Dictionary + { + { + hydraulicBoundaryData.HydraulicBoundaryDatabases.First(), 13 + } + }), Arg.Is.Equal(hlcdFilePath))) .Return(Enumerable.Empty()); mocks.ReplayAll(); @@ -288,7 +294,7 @@ } [Test] - public void Import_ValidFileWithScenarioInformation_UpdatesHydraulicBoundaryDatabaseWithImportedData() + public void Import_ValidFileWithScenarioInformation_UpdatesHydraulicBoundaryDataWithImportedData() { // Setup var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); @@ -302,7 +308,13 @@ handler.Expect(h => h.InquireConfirmation()).Return(true); handler.Expect(h => h.Update(Arg.Is.Same(hydraulicBoundaryData), Arg.Is.NotNull, - Arg>.Is.NotNull, + Arg>.Is.Equal( + new Dictionary + { + { + hydraulicBoundaryData.HydraulicBoundaryDatabases.First(), 13 + } + }), Arg.Is.Equal(filePath))) .Return(Enumerable.Empty()); mocks.ReplayAll(); @@ -321,6 +333,40 @@ } [Test] + public void Import_InvalidHydraulicBoundaryDatabase_CancelImportAndLogs() + { + // Setup + var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike); + DataImportHelper.ImportHydraulicBoundaryData(assessmentSection, validHlcdFilePath, validHrdFilePath); + HydraulicBoundaryData hydraulicBoundaryData = assessmentSection.HydraulicBoundaryData; + + string invalidHrdFilePath = Path.Combine(testDataPath, "doesNotExist.sqlite"); + hydraulicBoundaryData.HydraulicBoundaryDatabases.Add(new HydraulicBoundaryDatabase + { + FilePath = invalidHrdFilePath + }); + + string filePath = Path.Combine(testDataPath, "hlcdWithValidScenarioInformation.sqlite"); + + var mocks = new MockRepository(); + var handler = mocks.StrictMock(); + handler.Expect(h => h.InquireConfirmation()).Return(true); + mocks.ReplayAll(); + + var importer = new HydraulicLocationConfigurationDatabaseImporter(hydraulicBoundaryData.HydraulicLocationConfigurationDatabase, handler, + hydraulicBoundaryData, filePath); + + // Call + var importSuccessful = true; + void Call() => importSuccessful = importer.Import(); + + // Assert + var expectedMessage = $"Fout bij het lezen van bestand '{invalidHrdFilePath}': het bestand bestaat niet."; + AssertImportFailed(Call, expectedMessage, ref importSuccessful); + mocks.VerifyAll(); + } + + [Test] public void DoPostImportUpdates_WhenImportSuccessful_NotifyObserversOfReturnedObjects() { // Setup