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