Index: Ringtoets/HeightStructures/src/Ringtoets.HeightStructures.Plugin/HeightStructuresPlugin.cs =================================================================== diff -u -rd93d1c16b0543964ba4202f9faa7a74a6cd4a467 -r9b0d18547885c18342a9ab149538b137f0b004d0 --- Ringtoets/HeightStructures/src/Ringtoets.HeightStructures.Plugin/HeightStructuresPlugin.cs (.../HeightStructuresPlugin.cs) (revision d93d1c16b0543964ba4202f9faa7a74a6cd4a467) +++ Ringtoets/HeightStructures/src/Ringtoets.HeightStructures.Plugin/HeightStructuresPlugin.cs (.../HeightStructuresPlugin.cs) (revision 9b0d18547885c18342a9ab149538b137f0b004d0) @@ -101,10 +101,7 @@ FileFilterGenerator = CreateHeightStructureFileFilter(), CreateFileImporter = (context, filePath) => CreateHeightStructuresImporter( context, filePath, new ImportMessageProvider(), new HeightStructureReplaceDataStrategy(context.FailureMechanism)), - VerifyUpdates = context => - VerifyStructuresShouldUpdate( - context.FailureMechanism, - RingtoetsCommonIOResources.VerifyStructuresShouldUpdate_When_importing_Calculation_with_Structure_data_output_will_be_cleared_confirm) + VerifyUpdates = VerifyStructuresShouldUpdateOnImport }; yield return RingtoetsImportInfoFactory.CreateCalculationConfigurationImportInfo( @@ -129,10 +126,7 @@ CreateFileImporter = (context, filePath) => CreateHeightStructuresImporter( context, filePath, new UpdateMessageProvider(), new HeightStructureUpdateDataStrategy(context.FailureMechanism)), CurrentPath = context => context.WrappedData.SourcePath, - VerifyUpdates = context => - VerifyStructuresShouldUpdate( - context.FailureMechanism, - RingtoetsCommonIOResources.VerifyStructuresShouldUpdate_When_updating_Calculation_with_Structure_data_output_will_be_cleared_confirm) + VerifyUpdates = VerifyStructuresShouldUpdateOnUpdate }; } @@ -885,6 +879,55 @@ RingtoetsCommonIOResources.Shape_file_filter_Description); } + private bool VerifyStructuresShouldUpdateOnImport(HeightStructuresContext context) + { + IFailureMechanism failureMechanism = context.FailureMechanism; + + bool hasStructureAndOutput = failureMechanism.Calculations + .Cast>() + .Any(c => c.InputParameters.Structure != null + && c.HasOutput); + + return !hasStructureAndOutput + || VerifyStructuresShouldUpdate( + failureMechanism, + RingtoetsCommonIOResources.VerifyStructuresShouldUpdate_When_importing_Calculation_with_Structure_data_output_will_be_cleared_confirm); + } + + /// + /// Class for comparing by only the id. + /// + private class StructureIdEqualityComparer : IEqualityComparer + { + public bool Equals(StructureBase x, StructureBase y) + { + return x.Id.Equals(y.Id); + } + + public int GetHashCode(StructureBase obj) + { + return obj.Id.GetHashCode(); + } + } + + private bool VerifyStructuresShouldUpdateOnUpdate(HeightStructuresContext context) + { + StructureCollection heightStructures = context.WrappedData; + IFailureMechanism failureMechanism = context.FailureMechanism; + var comparer = new StructureIdEqualityComparer(); + + bool hasRemovedStructure = context.FailureMechanism.Calculations + .Cast>() + .Any(c => c.InputParameters.Structure != null + && c.HasOutput + && !heightStructures.Contains(c.InputParameters.Structure, comparer)); + + return !hasRemovedStructure + || VerifyStructuresShouldUpdate( + failureMechanism, + RingtoetsCommonIOResources.VerifyStructuresShouldUpdate_When_updating_Calculation_with_Structure_data_output_will_be_cleared_confirm); + } + private bool VerifyStructuresShouldUpdate(IFailureMechanism failureMechanism, string query) { var changeHandler = new FailureMechanismCalculationChangeHandler(failureMechanism,