// Copyright (C) Stichting Deltares 2017. All rights reserved. // // This file is part of Ringtoets. // // Ringtoets is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // All names, logos, and references to "Deltares" are registered trademarks of // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. using System; using System.Collections.Generic; using System.Linq; using Core.Common.Base; using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.DikeProfiles; using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Data.UpdateDataStrategies; using Ringtoets.Common.IO.FileImporters; using Ringtoets.Common.Service; namespace Ringtoets.Integration.Plugin.FileImporters { /// /// An for /// updating surface lines based on imported data. /// public class ForeshoreProfileUpdateDataStrategy : UpdateDataStrategyBase, IForeshoreProfileUpdateDataStrategy { /// /// Creates a new instance of . /// /// The failure mechanism in which the /// are updated. /// Thrown when /// is null. public ForeshoreProfileUpdateDataStrategy(IFailureMechanism failureMechanism) : base(failureMechanism, new ForeshoreProfileEqualityComparer()) {} public IEnumerable UpdateForeshoreProfilesWithImportedData(ForeshoreProfileCollection targetDataCollection, IEnumerable importedDataCollection, string sourceFilePath) { return UpdateTargetCollectionData(targetDataCollection, importedDataCollection, sourceFilePath); } protected override IEnumerable RemoveObjectAndDependentData(ForeshoreProfile removedObject) { IEnumerable> affectedCalculations = GetAffectedCalculationWithSurfaceLines(removedObject); var affectedObjects = new List(); foreach (ICalculation calculation in affectedCalculations) { ((IHasForeshoreProfile) calculation.InputParameters).ForeshoreProfile = null; affectedObjects.Add(calculation.InputParameters); affectedObjects.AddRange(RingtoetsCommonDataSynchronizationService.ClearCalculationOutput(calculation)); } return affectedObjects; } private IEnumerable> GetAffectedCalculationWithSurfaceLines(ForeshoreProfile foreshoreProfile) { IEnumerable> calculations = FailureMechanism.Calculations.Cast>(); IEnumerable> affectedCalculations = calculations.Where(calc => ReferenceEquals( ((IHasForeshoreProfile) calc.InputParameters).ForeshoreProfile, foreshoreProfile)); return affectedCalculations; } /// /// Class for comparing he only by ID. /// private class ForeshoreProfileEqualityComparer : IEqualityComparer { public bool Equals(ForeshoreProfile x, ForeshoreProfile y) { return x.Id.Equals(y.Id); } public int GetHashCode(ForeshoreProfile obj) { return obj.Id.GetHashCode(); } } #region Update Logic protected override IEnumerable UpdateObjectAndDependentData(ForeshoreProfile objectToUpdate, ForeshoreProfile objectToUpdateFrom) { objectToUpdate.CopyProperties(objectToUpdateFrom); var affectedObjects = new List(); IEnumerable> affectedCalculations = GetAffectedCalculationWithSurfaceLines(objectToUpdate); foreach (ICalculation calculation in affectedCalculations) { affectedObjects.Add(calculation.InputParameters); affectedObjects.AddRange(RingtoetsCommonDataSynchronizationService.ClearCalculationOutput(calculation)); ValidateUseForeshore(calculation, objectToUpdate); } return affectedObjects; } private static void ValidateUseForeshore(ICalculation calculation, ForeshoreProfile foreshoreProfile) { if (!foreshoreProfile.Geometry.Any()) { ((IUseForeshore) calculation.InputParameters).UseForeshore = false; } } #endregion } }