Index: Application/Ringtoets/src/Application.Ringtoets.Storage/Read/AssessmentSectionEntityReadExtensions.cs =================================================================== diff -u -r1c9b0e9cabaad22335799a442889c63bfc651e59 -r95e4c010cbc965a6f1be614bbfb3d6929bc60342 --- Application/Ringtoets/src/Application.Ringtoets.Storage/Read/AssessmentSectionEntityReadExtensions.cs (.../AssessmentSectionEntityReadExtensions.cs) (revision 1c9b0e9cabaad22335799a442889c63bfc651e59) +++ Application/Ringtoets/src/Application.Ringtoets.Storage/Read/AssessmentSectionEntityReadExtensions.cs (.../AssessmentSectionEntityReadExtensions.cs) (revision 95e4c010cbc965a6f1be614bbfb3d6929bc60342) @@ -25,9 +25,7 @@ using Application.Ringtoets.Storage.DbContext; using Application.Ringtoets.Storage.Serializers; using Core.Common.Base.Geometry; -using Core.Components.Gis; using Ringtoets.Common.Data.AssessmentSection; -using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Data.Hydraulics; using Ringtoets.Integration.Data; @@ -72,8 +70,6 @@ entity.ReadHydraulicDatabase(assessmentSection, collector); entity.ReadReferenceLine(assessmentSection); - FixMemoryLoadProblemForReadingFailureMechanisms(); - entity.ReadPipingFailureMechanism(assessmentSection, collector); entity.ReadGrassCoverErosionInwardsFailureMechanism(assessmentSection, collector); entity.ReadHeightStructuresFailureMechanism(assessmentSection, collector); @@ -96,18 +92,6 @@ return assessmentSection; } - /// - /// This method should be called after reading the but - /// before reading any of the instances. - /// - private static void FixMemoryLoadProblemForReadingFailureMechanisms() - { - // See WTI-1049 - GC.Collect(); - GC.WaitForPendingFinalizers(); - GC.Collect(); - } - private static void ReadBackgroundData(this AssessmentSectionEntity entity, IAssessmentSection assessmentSection) { BackgroundData backgroundData = entity.BackgroundDataEntities.Single().Read(); Index: Core/Common/src/Core.Common.Gui/OpenProjectActivity.cs =================================================================== diff -u -r71c4ff4caedb39679cd6642e2faf46ebd969dc9b -r95e4c010cbc965a6f1be614bbfb3d6929bc60342 --- Core/Common/src/Core.Common.Gui/OpenProjectActivity.cs (.../OpenProjectActivity.cs) (revision 71c4ff4caedb39679cd6642e2faf46ebd969dc9b) +++ Core/Common/src/Core.Common.Gui/OpenProjectActivity.cs (.../OpenProjectActivity.cs) (revision 95e4c010cbc965a6f1be614bbfb3d6929bc60342) @@ -40,6 +40,7 @@ private readonly IMigrateProject migrator; private readonly int totalNumberOfSteps = 2; private IProject openedProject; + private bool cancel; /// /// Creates a new instance of . @@ -77,32 +78,90 @@ protected override void OnRun() { + cancel = false; int currentStepNumber = 1; - openedProject = null; + ClearOpenedProject(); - if (migrator != null) + if (migrator != null && !MigrateProject(currentStepNumber++)) { - UpdateProgressText(Resources.OpenProjectActivity_ProgressTextStepName_MigrateProject, - currentStepNumber++, - totalNumberOfSteps); + return; + } - try + LoadProject(currentStepNumber); + } + + protected override void OnCancel() + { + cancel = true; + } + + protected override void OnFinish() + { + switch (State) + { + case ActivityState.Executed: + InitializeSuccssfulOpenedProject(); + break; + case ActivityState.Failed: + InitializeEmptyProject(); + break; + case ActivityState.Canceled: + ClearOpenedProject(); + break; + } + } + + private string FilePathTakingMigrationIntoAccount + { + get + { + return migratedProjectFilePath ?? filePath; + } + } + + /// + /// Migrates the project. + /// + /// The current step number. + /// true if migration was successful, false otherwise. + private bool MigrateProject(int currentStepNumber) + { + UpdateProgressText(Resources.OpenProjectActivity_ProgressTextStepName_MigrateProject, + currentStepNumber, + totalNumberOfSteps); + + try + { + bool migrationSuccessful = migrator.Migrate(filePath, migratedProjectFilePath); + + if (cancel) { - bool migrationSuccessful = migrator.Migrate(filePath, migratedProjectFilePath); - if (!migrationSuccessful) - { - State = ActivityState.Failed; - return; - } + return false; } - catch (ArgumentException e) + + if (!migrationSuccessful) { - log.Error(e.Message, e); State = ActivityState.Failed; - return; + return false; } } + catch (ArgumentException e) + { + if (cancel) + { + return false; + } + log.Error(e.Message, e); + State = ActivityState.Failed; + return false; + } + + return true; + } + + private void LoadProject(int currentStepNumber) + { UpdateProgressText(Resources.OpenProjectActivity_ProgressTextStepName_ReadProject, currentStepNumber, totalNumberOfSteps); @@ -112,49 +171,48 @@ } catch (StorageException e) { + if (cancel) + { + return; + } + log.Error(e.Message, e.InnerException); } + if (cancel) + { + return; + } + if (openedProject == null) { State = ActivityState.Failed; } } - protected override void OnCancel() {} + private void ClearOpenedProject() + { + openedProject = null; + } - protected override void OnFinish() + private void InitializeEmptyProject() { - switch (State) - { - case ActivityState.Executed: - UpdateProgressText(Resources.OpenProjectActivity_ProgressTextStepName_InitializeProject, - totalNumberOfSteps, - totalNumberOfSteps); + UpdateProgressText(Resources.OpenProjectActivity_ProgressTextStepName_InitializeEmptyProject, + totalNumberOfSteps, + totalNumberOfSteps); - projectOwner.SetProject(openedProject, FilePathTakingMigrationIntoAccount); - openedProject.Name = Path.GetFileNameWithoutExtension(FilePathTakingMigrationIntoAccount); - openedProject.NotifyObservers(); - break; - case ActivityState.Failed: - UpdateProgressText(Resources.OpenProjectActivity_ProgressTextStepName_InitializeEmptyProject, - totalNumberOfSteps, - totalNumberOfSteps); - - projectOwner.SetProject(projectFactory.CreateNewProject(), null); - break; - case ActivityState.Canceled: - openedProject = null; - break; - } + projectOwner.SetProject(projectFactory.CreateNewProject(), null); } - private string FilePathTakingMigrationIntoAccount + private void InitializeSuccssfulOpenedProject() { - get - { - return migratedProjectFilePath ?? filePath; - } + UpdateProgressText(Resources.OpenProjectActivity_ProgressTextStepName_InitializeProject, + totalNumberOfSteps, + totalNumberOfSteps); + + projectOwner.SetProject(openedProject, FilePathTakingMigrationIntoAccount); + openedProject.Name = Path.GetFileNameWithoutExtension(FilePathTakingMigrationIntoAccount); + openedProject.NotifyObservers(); } /// Index: Core/Common/test/Core.Common.Gui.Test/OpenProjectActivityTest.cs =================================================================== diff -u -r71c4ff4caedb39679cd6642e2faf46ebd969dc9b -r95e4c010cbc965a6f1be614bbfb3d6929bc60342 --- Core/Common/test/Core.Common.Gui.Test/OpenProjectActivityTest.cs (.../OpenProjectActivityTest.cs) (revision 71c4ff4caedb39679cd6642e2faf46ebd969dc9b) +++ Core/Common/test/Core.Common.Gui.Test/OpenProjectActivityTest.cs (.../OpenProjectActivityTest.cs) (revision 95e4c010cbc965a6f1be614bbfb3d6929bc60342) @@ -1061,5 +1061,154 @@ mocks.VerifyAll(); } + + [Test] + [TestCase(true)] + [TestCase(false)] + public void GivenActivityMigratingAndOpeningProject_WhenCancellingDuringMigration_DoNotLoadProject(bool migrationSuccessful) + { + // Setup + var mocks = new MockRepository(); + var projectFactory = mocks.StrictMock(); + var storeProject = mocks.StrictMock(); + var projectOwner = mocks.StrictMock(); + var migrateProject = mocks.Stub(); + migrateProject.Stub(mp => mp.Migrate(null, null)) + .IgnoreArguments() + .Return(migrationSuccessful); + mocks.ReplayAll(); + + var openProjectProperties = new OpenProjectActivity.OpenProjectConstructionProperties + { + FilePath = "", + ProjectFactory = projectFactory, + ProjectStorage = storeProject, + ProjectOwner = projectOwner + }; + var migrateProjectProperties = new OpenProjectActivity.ProjectMigrationConstructionProperties + { + MigrationFilePath = "", + Migrator = migrateProject + }; + var activity = new OpenProjectActivity(openProjectProperties, + migrateProjectProperties); + + // When + activity.ProgressChanged += (sender, args) => activity.Cancel(); + activity.Run(); + activity.Finish(); + + // Assert + Assert.AreEqual(ActivityState.Canceled, activity.State); + mocks.VerifyAll(); + } + + [Test] + public void GivenActivityMigratinProject_WhenCancellingAndMigrationThrowsException_DoNotLoadProject() + { + // Setup + var mocks = new MockRepository(); + var projectFactory = mocks.StrictMock(); + var storeProject = mocks.StrictMock(); + var projectOwner = mocks.StrictMock(); + var migrateProject = mocks.Stub(); + migrateProject.Stub(mp => mp.Migrate(null, null)) + .IgnoreArguments() + .Throw(new ArgumentException()); + mocks.ReplayAll(); + + var openProjectProperties = new OpenProjectActivity.OpenProjectConstructionProperties + { + FilePath = "", + ProjectFactory = projectFactory, + ProjectStorage = storeProject, + ProjectOwner = projectOwner + }; + var migrateProjectProperties = new OpenProjectActivity.ProjectMigrationConstructionProperties + { + MigrationFilePath = "", + Migrator = migrateProject + }; + var activity = new OpenProjectActivity(openProjectProperties, + migrateProjectProperties); + + // When + activity.ProgressChanged += (sender, args) => activity.Cancel(); + activity.Run(); + activity.Finish(); + + // Assert + Assert.AreEqual(ActivityState.Canceled, activity.State); + mocks.VerifyAll(); + } + + [Test] + [TestCase(true)] + [TestCase(false)] + public void GivenActivityOpeningProject_WhenCancellingDuringLoadProject_DoNotSetProject(bool loadProjectSuccessful) + { + // Setup + var mocks = new MockRepository(); + IProject project = loadProjectSuccessful ? + mocks.Stub() : + null; + var projectFactory = mocks.StrictMock(); + var projectOwner = mocks.StrictMock(); + var storeProject = mocks.Stub(); + storeProject.Stub(s => s.LoadProject(null)) + .IgnoreArguments() + .Return(project); + mocks.ReplayAll(); + + var openProjectProperties = new OpenProjectActivity.OpenProjectConstructionProperties + { + FilePath = "", + ProjectFactory = projectFactory, + ProjectStorage = storeProject, + ProjectOwner = projectOwner + }; + var activity = new OpenProjectActivity(openProjectProperties); + + // When + activity.ProgressChanged += (sender, args) => activity.Cancel(); + activity.Run(); + activity.Finish(); + + // Assert + Assert.AreEqual(ActivityState.Canceled, activity.State); + mocks.VerifyAll(); + } + + [Test] + public void GivenActivityOpeningProject_WhenCancellingWhileLoadProjectThrowsStorageException_DoNotSetProject() + { + // Setup + var mocks = new MockRepository(); + var projectFactory = mocks.StrictMock(); + var projectOwner = mocks.StrictMock(); + var storeProject = mocks.Stub(); + storeProject.Stub(s => s.LoadProject(null)) + .IgnoreArguments() + .Throw(new StorageException()); + mocks.ReplayAll(); + + var openProjectProperties = new OpenProjectActivity.OpenProjectConstructionProperties + { + FilePath = "", + ProjectFactory = projectFactory, + ProjectStorage = storeProject, + ProjectOwner = projectOwner + }; + var activity = new OpenProjectActivity(openProjectProperties); + + // When + activity.ProgressChanged += (sender, args) => activity.Cancel(); + activity.Run(); + activity.Finish(); + + // Assert + Assert.AreEqual(ActivityState.Canceled, activity.State); + mocks.VerifyAll(); + } } } \ No newline at end of file