Index: Ringtoets/Common/src/Ringtoets.Common.Service/WaveHeightCalculationService.cs =================================================================== diff -u -rce190360da30edf73fb464cc0fea1d9a795aa5d4 -r02670d8c9fceeaea5f829937a2eb269f3488c6b1 --- Ringtoets/Common/src/Ringtoets.Common.Service/WaveHeightCalculationService.cs (.../WaveHeightCalculationService.cs) (revision ce190360da30edf73fb464cc0fea1d9a795aa5d4) +++ Ringtoets/Common/src/Ringtoets.Common.Service/WaveHeightCalculationService.cs (.../WaveHeightCalculationService.cs) (revision 02670d8c9fceeaea5f829937a2eb269f3488c6b1) @@ -19,36 +19,110 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Core.Common.Base.Data; +using log4net; +using Ringtoets.Common.Service.MessageProviders; +using Ringtoets.Common.Service.Properties; +using Ringtoets.HydraRing.Calculation.Calculator; +using Ringtoets.HydraRing.Calculation.Calculator.Factory; using Ringtoets.HydraRing.Calculation.Data.Input.Hydraulics; +using Ringtoets.HydraRing.Calculation.Parsers; using Ringtoets.HydraRing.Data; +using Ringtoets.HydraRing.IO; namespace Ringtoets.Common.Service { /// /// Service that provides methods for performing Hydra-Ring calculations for marginal wave statistics. /// - public class WaveHeightCalculationService : HydraulicBoundaryLocationCalculationService + public class WaveHeightCalculationService { - private static IHydraulicBoundaryLocationCalculationService instance; + private static readonly ILog log = LogManager.GetLogger(typeof(WaveHeightCalculationService)); - /// - /// Gets or sets an instance of . - /// - public static IHydraulicBoundaryLocationCalculationService Instance + private IWaveHeightCalculator calculator; + private bool canceled; + + public bool Validate(string name, string hydraulicBoundaryDatabaseFilePath, ICalculationMessageProvider messageProvider) { - get + string calculationName = messageProvider.GetCalculationName(name); + + CalculationServiceHelper.LogValidationBeginTime(calculationName); + + string[] validationProblem = ValidateInput(hydraulicBoundaryDatabaseFilePath); + + CalculationServiceHelper.LogMessagesAsError(Resources.Hydraulic_boundary_database_connection_failed_0_, + validationProblem); + + CalculationServiceHelper.LogValidationEndTime(calculationName); + + return !validationProblem.Any(); + } + + public void Calculate(HydraulicBoundaryLocation hydraulicBoundaryLocation, string hydraulicBoundaryDatabaseFilePath, string ringId, double norm, ICalculationMessageProvider messageProvider) + { + string hlcdDirectory = Path.GetDirectoryName(hydraulicBoundaryDatabaseFilePath); + string calculationName = messageProvider.GetCalculationName(hydraulicBoundaryLocation.Name); + + CalculationServiceHelper.LogCalculationBeginTime(calculationName); + + calculator = HydraRingCalculatorFactory.Instance.CreateWaveHeightCalculator(hlcdDirectory, ringId); + + try { - return instance ?? (instance = new WaveHeightCalculationService()); + calculator.Calculate(CreateInput(hydraulicBoundaryLocation, norm)); + + hydraulicBoundaryLocation.WaveHeight = (RoundedDouble) calculator.WaveHeight; + hydraulicBoundaryLocation.WaveHeightCalculationConvergence = + RingtoetsCommonDataCalculationService.CalculationConverged(calculator.ReliabilityIndex, norm); + + if (hydraulicBoundaryLocation.WaveHeightCalculationConvergence != CalculationConvergence.CalculatedConverged) + { + log.Warn(messageProvider.GetCalculatedNotConvergedMessage(hydraulicBoundaryLocation.Name)); + } } - set + catch (HydraRingFileParserException) { - instance = value; + if (!canceled) + { + log.Error(messageProvider.GetCalculationFailedMessage(hydraulicBoundaryLocation.Name)); + throw; + } } + finally + { + CalculationServiceHelper.LogCalculationEndTime(calculationName); + } } - protected override WaveHeightCalculationInput CreateInput(HydraulicBoundaryLocation hydraulicBoundaryLocation, double norm) + public void Cancel() { + if (calculator != null) + { + calculator.Cancel(); + canceled = true; + } + } + + private WaveHeightCalculationInput CreateInput(HydraulicBoundaryLocation hydraulicBoundaryLocation, double norm) + { return new WaveHeightCalculationInput(1, hydraulicBoundaryLocation.Id, norm); } + + private static string[] ValidateInput(string hydraulicBoundaryDatabaseFilePath) + { + List validationResult = new List(); + + var validationProblem = HydraulicDatabaseHelper.ValidatePathForCalculation(hydraulicBoundaryDatabaseFilePath); + + if (!string.IsNullOrEmpty(validationProblem)) + { + validationResult.Add(validationProblem); + } + + return validationResult.ToArray(); + } } } \ No newline at end of file