Index: Ringtoets/Common/src/Ringtoets.Common.Service/CalculationServiceHelper.cs =================================================================== diff -u -r12a35732d53e73c149035a212f96d2a0e9604cff -r3d9b418d483c122040e11a7e074d666c64e9d7b5 --- Ringtoets/Common/src/Ringtoets.Common.Service/CalculationServiceHelper.cs (.../CalculationServiceHelper.cs) (revision 12a35732d53e73c149035a212f96d2a0e9604cff) +++ Ringtoets/Common/src/Ringtoets.Common.Service/CalculationServiceHelper.cs (.../CalculationServiceHelper.cs) (revision 3d9b418d483c122040e11a7e074d666c64e9d7b5) @@ -60,26 +60,16 @@ /// Method for performing calculations. Error and status information is logged during /// the execution of the operation. /// - /// The output type. /// The name of the calculation. /// The method used to perform the calculation. - /// The error message to show when the output is null. - /// on a successful calculation, null otherwise. - /// When throws an exception, this will not be catched in this method. - public static T PerformCalculation(string name, Func calculationFunc, string outputIsNullErrorMessage) + /// When throws an exception, this will not be caught in this method. + public static void PerformCalculation(string name, Action calculationFunc) { LogCalculationBeginTime(name); try { - var output = calculationFunc(); - - if (output == null) - { - LogMessagesAsError(outputIsNullErrorMessage, name); - } - - return output; + calculationFunc(); } finally { Index: Ringtoets/Common/test/Ringtoets.Common.Service.Test/CalculationServiceHelperTest.cs =================================================================== diff -u -r5e6eacaf76f765ba77febee673e9e94895e46feb -r3d9b418d483c122040e11a7e074d666c64e9d7b5 --- Ringtoets/Common/test/Ringtoets.Common.Service.Test/CalculationServiceHelperTest.cs (.../CalculationServiceHelperTest.cs) (revision 5e6eacaf76f765ba77febee673e9e94895e46feb) +++ Ringtoets/Common/test/Ringtoets.Common.Service.Test/CalculationServiceHelperTest.cs (.../CalculationServiceHelperTest.cs) (revision 3d9b418d483c122040e11a7e074d666c64e9d7b5) @@ -80,50 +80,25 @@ } [Test] - public void PerformCalculation_CalculationFuncReturnsNull_WritesStartAndEndAndErrorLogMessagesAndReturnsNull() + public void PerformCalculation_WithCalculation_ExecutesCalculationActionAndWritesStartAndEndAndErrorLogMessages() { // Setup string name = "Test name"; - string errorMessage = "There was an error: {0}"; - object output = null; + int called = 0; // Call - Action call = () => output = CalculationServiceHelper.PerformCalculation(name, () => null, errorMessage); + Action call = () => CalculationServiceHelper.PerformCalculation(name, () => called++); // Assert TestHelper.AssertLogMessages(call, messages => { var msgs = messages.ToArray(); - Assert.AreEqual(3, msgs.Length); - StringAssert.StartsWith(string.Format("Berekening van '{0}' gestart om: ", name), msgs[0]); - StringAssert.StartsWith(string.Format(errorMessage, name), msgs[1]); - StringAssert.StartsWith(string.Format("Berekening van '{0}' beëindigd om: ", name), msgs[2]); - }); - Assert.IsNull(output); - } - - [Test] - public void PerformCalculation_CalculationFuncReturnsOutput_WritesStartAndEndLogMessagesAndReturnsOutput() - { - // Setup - string name = "Test name"; - double outputValue = 4.0; - - double output = double.NaN; - - // Call - Action call = () => output = CalculationServiceHelper.PerformCalculation(name, () => outputValue, string.Empty); - - // Assert - TestHelper.AssertLogMessages(call, messages => - { - var msgs = messages.ToArray(); Assert.AreEqual(2, msgs.Length); StringAssert.StartsWith(string.Format("Berekening van '{0}' gestart om: ", name), msgs[0]); StringAssert.StartsWith(string.Format("Berekening van '{0}' beëindigd om: ", name), msgs[1]); }); - Assert.AreEqual(outputValue, output); + Assert.AreEqual(1, called); } [Test] Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsCalculationService.cs =================================================================== diff -u -r04d96e936610eab56e9ddc09c055526efe9b9652 -r3d9b418d483c122040e11a7e074d666c64e9d7b5 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsCalculationService.cs (.../GrassCoverErosionInwardsCalculationService.cs) (revision 04d96e936610eab56e9ddc09c055526efe9b9652) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/GrassCoverErosionInwardsCalculationService.cs (.../GrassCoverErosionInwardsCalculationService.cs) (revision 3d9b418d483c122040e11a7e074d666c64e9d7b5) @@ -21,6 +21,7 @@ using System.Collections.Generic; using System.Linq; +using log4net; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Service; @@ -29,6 +30,7 @@ using Ringtoets.HydraRing.Calculation.Data; using Ringtoets.HydraRing.Calculation.Data.Input.Overtopping; using Ringtoets.HydraRing.Calculation.Data.Output; +using Ringtoets.HydraRing.Calculation.Parsers; using Ringtoets.HydraRing.Calculation.Services; using Ringtoets.HydraRing.IO; using RingtoetsCommonServiceResources = Ringtoets.Common.Service.Properties.Resources; @@ -40,6 +42,8 @@ /// public static class GrassCoverErosionInwardsCalculationService { + private static readonly ILog log = LogManager.GetLogger(typeof(GrassCoverErosionInwardsCalculationService)); + /// /// Performs validation over the values on the given . Error and status information is logged during /// the execution of the operation. @@ -67,12 +71,38 @@ string ringId, GeneralGrassCoverErosionInwardsInput generalInput) { OvertoppingCalculationInput input = CreateInput(calculation, failureMechanismSection, generalInput); + var exceedanceProbabilityCalculationParser = new ExceedanceProbabilityCalculationParser(); - return CalculationServiceHelper.PerformCalculation(calculation.Name, - () => HydraRingCalculationService.PerformCalculation(hlcdDirectory, ringId, HydraRingTimeIntegrationSchemeType.FerryBorgesCastanheta, HydraRingUncertaintiesType.All, input), - Resources.GrassCoverErosionInwardsCalculationService_Calculate_Error_in_grass_cover_erosion_inwards_0_calculation); + CalculationServiceHelper.PerformCalculation( + calculation.Name, + () => + { + HydraRingCalculationService.PerformCalculation( + hlcdDirectory, + ringId, + HydraRingTimeIntegrationSchemeType.FerryBorgesCastanheta, + HydraRingUncertaintiesType.All, + input, + new[] + { + exceedanceProbabilityCalculationParser + }); + + VerifyOutput(exceedanceProbabilityCalculationParser.Output, calculation.Name); + }); + + return exceedanceProbabilityCalculationParser.Output; } + private static void VerifyOutput(ExceedanceProbabilityCalculationOutput output, string name) + { + if (output == null) + { + log.ErrorFormat(Resources.GrassCoverErosionInwardsCalculationService_Calculate_Error_in_grass_cover_erosion_inwards_0_calculation, name); + } + } + + private static OvertoppingCalculationInput CreateInput(GrassCoverErosionInwardsCalculation calculation, FailureMechanismSection failureMechanismSection, GeneralGrassCoverErosionInwardsInput generalInput) { return new OvertoppingCalculationInput(calculation.InputParameters.HydraulicBoundaryLocation.Id, Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/Ringtoets.GrassCoverErosionInwards.Service.csproj =================================================================== diff -u -r5e6eacaf76f765ba77febee673e9e94895e46feb -r3d9b418d483c122040e11a7e074d666c64e9d7b5 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/Ringtoets.GrassCoverErosionInwards.Service.csproj (.../Ringtoets.GrassCoverErosionInwards.Service.csproj) (revision 5e6eacaf76f765ba77febee673e9e94895e46feb) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/Ringtoets.GrassCoverErosionInwards.Service.csproj (.../Ringtoets.GrassCoverErosionInwards.Service.csproj) (revision 3d9b418d483c122040e11a7e074d666c64e9d7b5) @@ -32,6 +32,10 @@ AllRules.ruleset + + ..\..\..\..\packages\log4net.2.0.4\lib\net40-full\log4net.dll + True + @@ -94,6 +98,7 @@ Copying.licenseheader + Fisheye: Tag 5e6eacaf76f765ba77febee673e9e94895e46feb refers to a dead (removed) revision in file `Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Service/packages.config'. Fisheye: No comparison available. Pass `N' to diff? Index: Ringtoets/HeightStructures/src/Ringtoets.HeightStructures.Service/HeightStructuresCalculationService.cs =================================================================== diff -u -r20415b2886919a103cb4677f56a8f61abbb7aa8a -r3d9b418d483c122040e11a7e074d666c64e9d7b5 --- Ringtoets/HeightStructures/src/Ringtoets.HeightStructures.Service/HeightStructuresCalculationService.cs (.../HeightStructuresCalculationService.cs) (revision 20415b2886919a103cb4677f56a8f61abbb7aa8a) +++ Ringtoets/HeightStructures/src/Ringtoets.HeightStructures.Service/HeightStructuresCalculationService.cs (.../HeightStructuresCalculationService.cs) (revision 3d9b418d483c122040e11a7e074d666c64e9d7b5) @@ -20,6 +20,7 @@ // All rights reserved. using System.Collections.Generic; +using log4net; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Data.Probabilistics; @@ -29,6 +30,7 @@ using Ringtoets.HydraRing.Calculation.Data; using Ringtoets.HydraRing.Calculation.Data.Input.Structures; using Ringtoets.HydraRing.Calculation.Data.Output; +using Ringtoets.HydraRing.Calculation.Parsers; using Ringtoets.HydraRing.Calculation.Services; using Ringtoets.HydraRing.IO; using RingtoetsCommonServiceResources = Ringtoets.Common.Service.Properties.Resources; @@ -40,6 +42,8 @@ /// public static class HeightStructuresCalculationService { + private static readonly ILog log = LogManager.GetLogger(typeof(HeightStructuresCalculationService)); + /// /// Performs validation over the values on the given . Error and status information is logged during /// the execution of the operation. @@ -66,12 +70,37 @@ string hlcdDirectory, FailureMechanismSection failureMechanismSection, string ringId, GeneralHeightStructuresInput generalInput) { - var input = CreateInput(calculation, failureMechanismSection, generalInput); - return CalculationServiceHelper.PerformCalculation(calculation.Name, - () => HydraRingCalculationService.PerformCalculation(hlcdDirectory, ringId, HydraRingTimeIntegrationSchemeType.FerryBorgesCastanheta, HydraRingUncertaintiesType.All, input), - Resources.HeightStructuresCalculationService_Calculate_Error_in_height_structures_0_calculation); + StructuresOvertoppingCalculationInput input = CreateInput(calculation, failureMechanismSection, generalInput); + var exceedanceProbabilityCalculationParser = new ExceedanceProbabilityCalculationParser(); + + CalculationServiceHelper.PerformCalculation( + calculation.Name, + () => { + HydraRingCalculationService.PerformCalculation( + hlcdDirectory, + ringId, + HydraRingTimeIntegrationSchemeType.FerryBorgesCastanheta, + HydraRingUncertaintiesType.All, + input, + new [] + { + exceedanceProbabilityCalculationParser + }); + + VerifyOutput(exceedanceProbabilityCalculationParser.Output, calculation.Name); + }); + + return exceedanceProbabilityCalculationParser.Output; } + private static void VerifyOutput(ExceedanceProbabilityCalculationOutput output, string name) + { + if (output == null) + { + log.ErrorFormat(Resources.HeightStructuresCalculationService_Calculate_Error_in_height_structures_0_calculation, name); + } + } + private static StructuresOvertoppingCalculationInput CreateInput(HeightStructuresCalculation calculation, FailureMechanismSection failureMechanismSection, GeneralHeightStructuresInput generalInput) { return new StructuresOvertoppingCalculationInput( Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/ExceedanceProbabilityCalculationParser.cs =================================================================== diff -u -rde4477561032a5d95d5e65e50b719724466648ed -r3d9b418d483c122040e11a7e074d666c64e9d7b5 --- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/ExceedanceProbabilityCalculationParser.cs (.../ExceedanceProbabilityCalculationParser.cs) (revision de4477561032a5d95d5e65e50b719724466648ed) +++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/ExceedanceProbabilityCalculationParser.cs (.../ExceedanceProbabilityCalculationParser.cs) (revision 3d9b418d483c122040e11a7e074d666c64e9d7b5) @@ -23,18 +23,18 @@ using System.Collections.Generic; using System.Data; using System.Data.SQLite; +using System.IO; using Ringtoets.HydraRing.Calculation.Data.Output; +using Ringtoets.HydraRing.Calculation.Services; namespace Ringtoets.HydraRing.Calculation.Parsers { /// /// Parser for the output of a Hydra-Ring type I calculation via Hydra-Ring: /// Given a set of random variables, compute the probability of failure. /// - internal class ExceedanceProbabilityCalculationParser + public class ExceedanceProbabilityCalculationParser : IHydraRingFileParser { - private ExceedanceProbabilityCalculationOutput output; - private const string betaResultQuery = "SELECT BetaId, RingCombinMethod, PresentationSectionId, MainMechanismId, MainMechanismCombinMethod, MechanismId, LayerId, AlternativeId, Beta " + "FROM BetaResults " + "WHERE SectionId = @SectionId " + @@ -46,29 +46,24 @@ "ORDER BY BetaId, VariableId, LoadVariableId;"; /// - /// Tries to parse an object from the provided and . + /// Gets the output of a successful parse of the output file. /// - /// The path to the file which contains the output of the Hydra-Ring type I calculation. - /// The section id to get the object for. - public void Parse(string outputFilePath, int sectionId) + /// A corresponding to the section id if executed + /// successfully; or null otherwise. + public ExceedanceProbabilityCalculationOutput Output { get; private set; } + + public void Parse(string workingDirectory, int sectionId) { try { - Output = DoParse(outputFilePath, sectionId); + Output = DoParse(Path.Combine(workingDirectory, HydraRingFileName.OutputDatabaseFileName), sectionId); } catch { // ignored } } - /// - /// Gets the output of a successful parse of the output file. - /// - /// A corresponding to the section id if executed - /// successfully; or null otherwise. - public ExceedanceProbabilityCalculationOutput Output { get; private set; } - private static ExceedanceProbabilityCalculationOutput DoParse(string outputFilePath, int sectionId) { using (var sqLiteConnection = CreateConnection(outputFilePath)) Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IHydraRingFileParser.cs =================================================================== diff -u --- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IHydraRingFileParser.cs (revision 0) +++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IHydraRingFileParser.cs (revision 3d9b418d483c122040e11a7e074d666c64e9d7b5) @@ -0,0 +1,12 @@ +namespace Ringtoets.HydraRing.Calculation.Parsers +{ + public interface IHydraRingFileParser + { + /// + /// Tries to parse output from a file in the based on a . + /// + /// The path to the file which contains the output of the Hydra-Ring type I calculation. + /// The section id to get the output for. + void Parse(string workingDirectory, int sectionId); + } +} \ No newline at end of file Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/TargetProbabilityCalculationParser.cs =================================================================== diff -u -rde4477561032a5d95d5e65e50b719724466648ed -r3d9b418d483c122040e11a7e074d666c64e9d7b5 --- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/TargetProbabilityCalculationParser.cs (.../TargetProbabilityCalculationParser.cs) (revision de4477561032a5d95d5e65e50b719724466648ed) +++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/TargetProbabilityCalculationParser.cs (.../TargetProbabilityCalculationParser.cs) (revision 3d9b418d483c122040e11a7e074d666c64e9d7b5) @@ -24,25 +24,28 @@ using System.IO; using System.Linq; using Ringtoets.HydraRing.Calculation.Data.Output; +using Ringtoets.HydraRing.Calculation.Services; namespace Ringtoets.HydraRing.Calculation.Parsers { /// /// Parser for the output of a Hydra-Ring type II calculation: /// Iterate towards a target probability, provided as reliability index. /// - internal class TargetProbabilityCalculationParser + public class TargetProbabilityCalculationParser : IHydraRingFileParser { /// - /// Tries to parse a object from the provided for the provided . + /// Gets the output of a successful parse of the output file. /// - /// The path to the file which contains the output of the Hydra-Ring type II calculation. - /// The section id to get the object for. - public void Parse(string outputFilePath, int sectionId) + /// A corresponding to the section id if executed + /// successfully; or null otherwise. + public TargetProbabilityCalculationOutput Output { get; private set; } + + public void Parse(string workingDirectory, int sectionId) { try { - using (var streamReader = new StreamReader(outputFilePath)) + using (var streamReader = new StreamReader(Path.Combine(workingDirectory, HydraRingFileName.DesignTablesFileName))) { var fileContents = streamReader.ReadToEnd(); var lines = fileContents.Split('\n'); @@ -64,13 +67,6 @@ } } - /// - /// Gets the output of a successful parse of the output file. - /// - /// A corresponding to the section id if executed - /// successfully; or null otherwise. - public TargetProbabilityCalculationOutput Output { get; private set; } - private static double GetDoubleValueFromElement(string element) { return double.Parse(element, CultureInfo.InvariantCulture); Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Ringtoets.HydraRing.Calculation.csproj =================================================================== diff -u -rde4477561032a5d95d5e65e50b719724466648ed -r3d9b418d483c122040e11a7e074d666c64e9d7b5 --- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Ringtoets.HydraRing.Calculation.csproj (.../Ringtoets.HydraRing.Calculation.csproj) (revision de4477561032a5d95d5e65e50b719724466648ed) +++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Ringtoets.HydraRing.Calculation.csproj (.../Ringtoets.HydraRing.Calculation.csproj) (revision 3d9b418d483c122040e11a7e074d666c64e9d7b5) @@ -65,6 +65,7 @@ + Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Services/HydraRingCalculationService.cs =================================================================== diff -u -rde4477561032a5d95d5e65e50b719724466648ed -r3d9b418d483c122040e11a7e074d666c64e9d7b5 --- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Services/HydraRingCalculationService.cs (.../HydraRingCalculationService.cs) (revision de4477561032a5d95d5e65e50b719724466648ed) +++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Services/HydraRingCalculationService.cs (.../HydraRingCalculationService.cs) (revision 3d9b418d483c122040e11a7e074d666c64e9d7b5) @@ -19,6 +19,7 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System.Collections.Generic; using System.Diagnostics; using System.IO; using Ringtoets.HydraRing.Calculation.Data; @@ -44,15 +45,17 @@ /// The to use while executing the calculation. /// The to use while executing the calculation. /// The input of the calculation to perform. + /// Parsers that will be invoked after the Hydra-Ring calculation has ran. /// A on a successful calculation, null otherwise. - public static TargetProbabilityCalculationOutput PerformCalculation(string hlcdDirectory, string ringId, - HydraRingTimeIntegrationSchemeType timeIntegrationSchemeType, - HydraRingUncertaintiesType uncertaintiesType, - TargetProbabilityCalculationInput targetProbabilityCalculationInput) + public static void PerformCalculation( + string hlcdDirectory, + string ringId, + HydraRingTimeIntegrationSchemeType timeIntegrationSchemeType, + HydraRingUncertaintiesType uncertaintiesType, + HydraRingCalculationInput targetProbabilityCalculationInput, + IEnumerable parsers) { var sectionId = targetProbabilityCalculationInput.Section.SectionId; - - // Create a working directory var workingDirectory = CreateWorkingDirectory(); var hydraRingInitializationService = new HydraRingInitializationService(targetProbabilityCalculationInput.FailureMechanismType, sectionId, hlcdDirectory, workingDirectory); @@ -64,48 +67,10 @@ PerformCalculation(workingDirectory, hydraRingInitializationService); - // Parse and return the output - var targetProbabilityCalculationParser = new TargetProbabilityCalculationParser(); - targetProbabilityCalculationParser.Parse(hydraRingInitializationService.OutputFilePath, targetProbabilityCalculationInput.Section.SectionId); - return targetProbabilityCalculationParser.Output; + ExecuteParsers(parsers, hydraRingInitializationService.TemporaryWorkingDirectory, targetProbabilityCalculationInput.Section.SectionId); } /// - /// This method performs a type I calculation via Hydra-Ring: - /// Given a set of random variables, compute the probability of failure. - /// - /// The directory of the HLCD file that should be used for performing the calculation. - /// The id of the ring to perform the calculation for. - /// The to use while executing the calculation. - /// The to use while executing the calculation. - /// The input of the calculation to perform. - /// A on a successful calculation, null otherwise. - public static ExceedanceProbabilityCalculationOutput PerformCalculation(string hlcdDirectory, string ringId, - HydraRingTimeIntegrationSchemeType timeIntegrationSchemeType, - HydraRingUncertaintiesType uncertaintiesType, - ExceedanceProbabilityCalculationInput exceedanceProbabilityCalculationInput) - { - var sectionId = exceedanceProbabilityCalculationInput.Section.SectionId; - - // Create a working directory - var workingDirectory = CreateWorkingDirectory(); - - // Write the initialization script - var hydraRingInitializationService = new HydraRingInitializationService(exceedanceProbabilityCalculationInput.FailureMechanismType, sectionId, hlcdDirectory, workingDirectory); - hydraRingInitializationService.WriteInitializationScript(); - - var hydraRingConfigurationService = new HydraRingConfigurationService(ringId, timeIntegrationSchemeType, uncertaintiesType); - hydraRingConfigurationService.AddHydraRingCalculationInput(exceedanceProbabilityCalculationInput); - hydraRingConfigurationService.WriteDataBaseCreationScript(hydraRingInitializationService.DatabaseCreationScriptFilePath); - - PerformCalculation(workingDirectory, hydraRingInitializationService); - - var exceedanceProbabilityCalculationParser = new ExceedanceProbabilityCalculationParser(); - exceedanceProbabilityCalculationParser.Parse(hydraRingInitializationService.OutputDataBasePath, exceedanceProbabilityCalculationInput.Section.SectionId); - return exceedanceProbabilityCalculationParser.Output; - } - - /// /// Cancels any currently running Hydra-Ring calculation. /// public static void CancelRunningCalculation() @@ -116,6 +81,14 @@ } } + private static void ExecuteParsers(IEnumerable parsers, string workingDirectory, int sectionId) + { + foreach (var parser in parsers) + { + parser.Parse(workingDirectory, sectionId); + } + } + private static void PerformCalculation(string workingDirectory, HydraRingInitializationService hydraRingInitializationService) { hydraRingProcess = HydraRingProcessFactory.Create( Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Services/HydraRingInitializationService.cs =================================================================== diff -u -rde4477561032a5d95d5e65e50b719724466648ed -r3d9b418d483c122040e11a7e074d666c64e9d7b5 --- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Services/HydraRingInitializationService.cs (.../HydraRingInitializationService.cs) (revision de4477561032a5d95d5e65e50b719724466648ed) +++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Services/HydraRingInitializationService.cs (.../HydraRingInitializationService.cs) (revision 3d9b418d483c122040e11a7e074d666c64e9d7b5) @@ -20,9 +20,11 @@ // All rights reserved. using System; +using System.Collections.Generic; using System.IO; using System.Reflection; using Ringtoets.HydraRing.Calculation.Data; +using Ringtoets.HydraRing.Calculation.Parsers; using Ringtoets.HydraRing.Calculation.Providers; namespace Ringtoets.HydraRing.Calculation.Services @@ -48,7 +50,6 @@ private readonly int sectionId; // Working directories - private readonly string temporaryWorkingDirectory; private readonly string hydraRingDirectory; private readonly string hlcdDirectory; @@ -58,13 +59,14 @@ /// The failure mechanism type. /// The section id. /// The HLCD directory. - /// The working directory. - public HydraRingInitializationService(HydraRingFailureMechanismType failureMechanismType, int sectionId, string hlcdDirectory, string temporaryWorkingDirectory) + /// The working directory. + public HydraRingInitializationService(HydraRingFailureMechanismType failureMechanismType, int sectionId, string hlcdDirectory, string temporaryTemporaryWorkingDirectory) { mechanismId = new FailureMechanismDefaultsProvider().GetFailureMechanismDefaults(failureMechanismType).MechanismId; this.sectionId = sectionId; - this.temporaryWorkingDirectory = temporaryWorkingDirectory; + TemporaryWorkingDirectory = temporaryTemporaryWorkingDirectory; + this.hlcdDirectory = hlcdDirectory; hydraRingDirectory = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"HydraRing"); } @@ -76,7 +78,7 @@ { get { - return Path.Combine(temporaryWorkingDirectory, sectionId + iniFileExtension); + return Path.Combine(TemporaryWorkingDirectory, sectionId + iniFileExtension); } } @@ -87,7 +89,7 @@ { get { - return Path.Combine(temporaryWorkingDirectory, sectionId + databaseFileExtension); + return Path.Combine(TemporaryWorkingDirectory, sectionId + databaseFileExtension); } } @@ -98,7 +100,7 @@ { get { - return Path.Combine(temporaryWorkingDirectory, sectionId + logFileExtension); + return Path.Combine(TemporaryWorkingDirectory, sectionId + logFileExtension); } } @@ -109,7 +111,7 @@ { get { - return Path.Combine(temporaryWorkingDirectory, HydraRingFileName.DesignTablesFileName); + return Path.Combine(TemporaryWorkingDirectory, HydraRingFileName.DesignTablesFileName); } } @@ -120,7 +122,7 @@ { get { - return Path.Combine(temporaryWorkingDirectory, HydraRingFileName.OutputDatabaseFileName); + return Path.Combine(TemporaryWorkingDirectory, HydraRingFileName.OutputDatabaseFileName); } } @@ -158,6 +160,12 @@ } /// + /// Gets the directory in which HydraRing will place temporary input and output files created during a + /// calculation. + /// + public string TemporaryWorkingDirectory { get; private set; } + + /// /// Generates the initialization script necessary for performing Hydra-Ring calculations. /// /// The initialization script. Index: Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/Parsers/ExceedanceProbabilityCalculationParserTest.cs =================================================================== diff -u -rde4477561032a5d95d5e65e50b719724466648ed -r3d9b418d483c122040e11a7e074d666c64e9d7b5 --- Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/Parsers/ExceedanceProbabilityCalculationParserTest.cs (.../ExceedanceProbabilityCalculationParserTest.cs) (revision de4477561032a5d95d5e65e50b719724466648ed) +++ Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/Parsers/ExceedanceProbabilityCalculationParserTest.cs (.../ExceedanceProbabilityCalculationParserTest.cs) (revision 3d9b418d483c122040e11a7e074d666c64e9d7b5) @@ -25,12 +25,14 @@ using NUnit.Framework; using Ringtoets.HydraRing.Calculation.Data.Output; using Ringtoets.HydraRing.Calculation.Parsers; +using Ringtoets.HydraRing.Calculation.Services; namespace Ringtoets.HydraRing.Calculation.Test.Parsers { [TestFixture] public class ExceedanceProbabilityCalculationParserTest { + private const string workingDirectory = "tempDir"; private readonly string testDataPath = Path.Combine(TestHelper.GetTestDataPath(TestDataPath.Ringtoets.HydraRing.Calculation, "Parsers"), "ExceedanceProbabilityCalculationParser"); [Test] @@ -40,44 +42,50 @@ var parser = new ExceedanceProbabilityCalculationParser(); // Assert + Assert.IsInstanceOf(parser); Assert.IsNull(parser.Output); } [Test] public void Parse_NotExistingOutputFile_OutputNull() { // Setup - var filePath = Path.Combine(testDataPath, "notExisting.sqlite"); var exceedanceProbabilityCalculationParser = new ExceedanceProbabilityCalculationParser(); - // Call - exceedanceProbabilityCalculationParser.Parse(filePath, 1); + using (new DirectoryDisposeHelper(workingDirectory)) + { + // Call + exceedanceProbabilityCalculationParser.Parse(workingDirectory, 1); + } // Assert Assert.IsNull(exceedanceProbabilityCalculationParser.Output); - Assert.IsFalse(File.Exists(testDataPath)); } [Test] public void Parse_EmptyOutputFile_OutputNull() { // Setup - var filePath = Path.Combine(testDataPath, "empty.sqlite"); var exceedanceProbabilityCalculationParser = new ExceedanceProbabilityCalculationParser(); + var testFile = "empty.sqlite"; - // Call - exceedanceProbabilityCalculationParser.Parse(filePath, 1); + using (new DirectoryDisposeHelper(workingDirectory)) + { + CopyTestInputToTemporaryOutput(testFile); - // Assert - Assert.IsNull(exceedanceProbabilityCalculationParser.Output); - Assert.IsTrue(TestHelper.CanOpenFileForWrite(filePath)); + // Call + exceedanceProbabilityCalculationParser.Parse(workingDirectory, 1); + + // Assert + Assert.IsNull(exceedanceProbabilityCalculationParser.Output); + Assert.IsTrue(TestHelper.CanOpenFileForWrite(Path.Combine(workingDirectory, testFile))); + } } [Test] public void Parse_ExampleCompleteOutputFile_ExpectedExceedanceProbabilityCalculationOutputSet() { // Setup - var filePath = Path.Combine(testDataPath, "complete.sqlite"); var ringCombinMethod = 0; var presentationSectionId = 1; var mainMechanismId = 101; @@ -99,72 +107,97 @@ }; var exceedanceProbabilityCalculationParser = new ExceedanceProbabilityCalculationParser(); + var testFile = "complete.sqlite"; - // Call - exceedanceProbabilityCalculationParser.Parse(filePath, sectionId); + using (new DirectoryDisposeHelper(workingDirectory)) + { + CopyTestInputToTemporaryOutput(testFile); - // Assert - ExceedanceProbabilityCalculationOutput exceedanceProbabilityCalculationOutput = exceedanceProbabilityCalculationParser.Output; - Assert.IsNotNull(exceedanceProbabilityCalculationOutput); - Assert.AreEqual(ringCombinMethod, exceedanceProbabilityCalculationOutput.RingCombinMethod); - Assert.AreEqual(presentationSectionId, exceedanceProbabilityCalculationOutput.PresentationSectionId); - Assert.AreEqual(mainMechanismId, exceedanceProbabilityCalculationOutput.MainMechanismId); - Assert.AreEqual(mainMechanismCombinMethod, exceedanceProbabilityCalculationOutput.MainMechanismCombinMethod); - Assert.AreEqual(mechanismId, exceedanceProbabilityCalculationOutput.MechanismId); - Assert.AreEqual(layerId, exceedanceProbabilityCalculationOutput.LayerId); - Assert.AreEqual(alternativeId, exceedanceProbabilityCalculationOutput.AlternativeId); - Assert.AreEqual(beta, exceedanceProbabilityCalculationOutput.Beta); + // Call + exceedanceProbabilityCalculationParser.Parse(workingDirectory, sectionId); - Assert.AreEqual(alphaValues.Count, exceedanceProbabilityCalculationOutput.Alphas.Count); - for (var i = 0; i < alphaValues.Count; i++) - { - var expectedAlpha = alphaValues[i]; - var actualAlpha = exceedanceProbabilityCalculationOutput.Alphas[i]; + // Assert + ExceedanceProbabilityCalculationOutput exceedanceProbabilityCalculationOutput = exceedanceProbabilityCalculationParser.Output; + Assert.IsNotNull(exceedanceProbabilityCalculationOutput); + Assert.AreEqual(ringCombinMethod, exceedanceProbabilityCalculationOutput.RingCombinMethod); + Assert.AreEqual(presentationSectionId, exceedanceProbabilityCalculationOutput.PresentationSectionId); + Assert.AreEqual(mainMechanismId, exceedanceProbabilityCalculationOutput.MainMechanismId); + Assert.AreEqual(mainMechanismCombinMethod, exceedanceProbabilityCalculationOutput.MainMechanismCombinMethod); + Assert.AreEqual(mechanismId, exceedanceProbabilityCalculationOutput.MechanismId); + Assert.AreEqual(layerId, exceedanceProbabilityCalculationOutput.LayerId); + Assert.AreEqual(alternativeId, exceedanceProbabilityCalculationOutput.AlternativeId); + Assert.AreEqual(beta, exceedanceProbabilityCalculationOutput.Beta); - Assert.AreEqual(expectedAlpha.RingCombinMethod, actualAlpha.RingCombinMethod); - Assert.AreEqual(expectedAlpha.PresentationSectionId, actualAlpha.PresentationSectionId); - Assert.AreEqual(expectedAlpha.MainMechanismId, actualAlpha.MainMechanismId); - Assert.AreEqual(expectedAlpha.MainMechanismCombinMethod, actualAlpha.MainMechanismCombinMethod); - Assert.AreEqual(expectedAlpha.MechanismId, actualAlpha.MechanismId); - Assert.AreEqual(expectedAlpha.LayerId, actualAlpha.LayerId); - Assert.AreEqual(expectedAlpha.AlternativeId, actualAlpha.AlternativeId); - Assert.AreEqual(expectedAlpha.VariableId, actualAlpha.VariableId); - Assert.AreEqual(expectedAlpha.LoadVariableId, actualAlpha.LoadVariableId); - Assert.AreEqual(expectedAlpha.Alpha, actualAlpha.Alpha); - } + Assert.AreEqual(alphaValues.Count, exceedanceProbabilityCalculationOutput.Alphas.Count); + for (var i = 0; i < alphaValues.Count; i++) + { + var expectedAlpha = alphaValues[i]; + var actualAlpha = exceedanceProbabilityCalculationOutput.Alphas[i]; - Assert.IsTrue(TestHelper.CanOpenFileForWrite(filePath)); + Assert.AreEqual(expectedAlpha.RingCombinMethod, actualAlpha.RingCombinMethod); + Assert.AreEqual(expectedAlpha.PresentationSectionId, actualAlpha.PresentationSectionId); + Assert.AreEqual(expectedAlpha.MainMechanismId, actualAlpha.MainMechanismId); + Assert.AreEqual(expectedAlpha.MainMechanismCombinMethod, actualAlpha.MainMechanismCombinMethod); + Assert.AreEqual(expectedAlpha.MechanismId, actualAlpha.MechanismId); + Assert.AreEqual(expectedAlpha.LayerId, actualAlpha.LayerId); + Assert.AreEqual(expectedAlpha.AlternativeId, actualAlpha.AlternativeId); + Assert.AreEqual(expectedAlpha.VariableId, actualAlpha.VariableId); + Assert.AreEqual(expectedAlpha.LoadVariableId, actualAlpha.LoadVariableId); + Assert.AreEqual(expectedAlpha.Alpha, actualAlpha.Alpha); + } + + Assert.IsTrue(TestHelper.CanOpenFileForWrite(Path.Combine(workingDirectory, testFile))); + } } [Test] public void Parse_FileWithoutTableAlphaResults_OutputNull() { // Setup - var filePath = Path.Combine(testDataPath, "withoutAlphaResults.sqlite"); + var testFile = "withoutAlphaResults.sqlite"; var exceedanceProbabilityCalculationParser = new ExceedanceProbabilityCalculationParser(); - // Call - exceedanceProbabilityCalculationParser.Parse(filePath, 1); + using (new DirectoryDisposeHelper(workingDirectory)) + { + // Call + exceedanceProbabilityCalculationParser.Parse(workingDirectory, 1); - // Assert - Assert.IsNull(exceedanceProbabilityCalculationParser.Output); - Assert.IsTrue(TestHelper.CanOpenFileForWrite(filePath)); + // Assert + Assert.IsNull(exceedanceProbabilityCalculationParser.Output); + Assert.IsTrue(TestHelper.CanOpenFileForWrite(Path.Combine(workingDirectory, testFile))); + } } [Test] public void Parse_ExampleHydraRingOutputFileNotContainingSectionId_OutputNull() { // Setup var sectionId = 1; - var filePath = Path.Combine(testDataPath, "complete.sqlite"); + var testFile = "complete.sqlite"; var exceedanceProbabilityCalculationParser = new ExceedanceProbabilityCalculationParser(); - // Call - exceedanceProbabilityCalculationParser.Parse(filePath, sectionId); + using (new DirectoryDisposeHelper(workingDirectory)) + { + // Call + exceedanceProbabilityCalculationParser.Parse(workingDirectory, sectionId); - // Assert - Assert.IsNull(exceedanceProbabilityCalculationParser.Output); - Assert.IsTrue(TestHelper.CanOpenFileForWrite(filePath)); + // Assert + Assert.IsNull(exceedanceProbabilityCalculationParser.Output); + Assert.IsTrue(TestHelper.CanOpenFileForWrite(Path.Combine(workingDirectory, testFile))); + } } + + /// + /// Copies the testfile from the test directory to the working directory. + /// + /// The name of the test's input file. + /// The copied file is removed from the working directory by using the , + /// which recursively removes all files in the directory. + private void CopyTestInputToTemporaryOutput(string testFile) + { + var inputFilePath = Path.Combine(testDataPath, testFile); + var outputFilePath = Path.Combine(workingDirectory, HydraRingFileName.OutputDatabaseFileName); + File.Copy(inputFilePath, outputFilePath); + } } } \ No newline at end of file Index: Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/Parsers/TargetProbabilityCalculationParserTest.cs =================================================================== diff -u -rde4477561032a5d95d5e65e50b719724466648ed -r3d9b418d483c122040e11a7e074d666c64e9d7b5 --- Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/Parsers/TargetProbabilityCalculationParserTest.cs (.../TargetProbabilityCalculationParserTest.cs) (revision de4477561032a5d95d5e65e50b719724466648ed) +++ Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/Parsers/TargetProbabilityCalculationParserTest.cs (.../TargetProbabilityCalculationParserTest.cs) (revision 3d9b418d483c122040e11a7e074d666c64e9d7b5) @@ -23,22 +23,38 @@ using Core.Common.TestUtil; using NUnit.Framework; using Ringtoets.HydraRing.Calculation.Parsers; +using Ringtoets.HydraRing.Calculation.Services; namespace Ringtoets.HydraRing.Calculation.Test.Parsers { [TestFixture] public class TargetProbabilityCalculationParserTest { + private const string workingDirectory = "tempDir"; private readonly string testDataPath = Path.Combine(TestHelper.GetTestDataPath(TestDataPath.Ringtoets.HydraRing.Calculation, "Parsers"), "TargetProbabilityCalculationParser"); [Test] + public void DefaultConstructor_SetDefaultValues() + { + // Call + var parser = new TargetProbabilityCalculationParser(); + + // Assert + Assert.IsInstanceOf(parser); + Assert.IsNull(parser.Output); + } + + [Test] public void Parse_NotExistingOutputFile_OutputNull() { // Setup var targetProbabilityCalculationParser = new TargetProbabilityCalculationParser(); - // Call - targetProbabilityCalculationParser.Parse(Path.Combine(testDataPath, "notExisting.txt"), 1); + using (new DirectoryDisposeHelper(workingDirectory)) + { + // Call + targetProbabilityCalculationParser.Parse(workingDirectory, 1); + } // Assert Assert.IsNull(targetProbabilityCalculationParser.Output); @@ -50,9 +66,14 @@ // Setup var targetProbabilityCalculationParser = new TargetProbabilityCalculationParser(); - // Call - targetProbabilityCalculationParser.Parse(Path.Combine(testDataPath, "empty.txt"), 1); + using (new DirectoryDisposeHelper(workingDirectory)) + { + CopyTestInputToTemporaryOutput("empty.txt"); + // Call + targetProbabilityCalculationParser.Parse(workingDirectory, 1); + } + // Assert Assert.IsNull(targetProbabilityCalculationParser.Output); } @@ -63,12 +84,16 @@ public void Parse_ExampleHydraRingOutputFileContainingSectionIds_ReturnsExpectedTargetProbabilityCalculationResult(int sectionId, double result, double actual) { // Setup - var outputFilePath = Path.Combine(testDataPath, "exampleOutputTable.txt"); var targetProbabilityCalculationParser = new TargetProbabilityCalculationParser(); - // Call - targetProbabilityCalculationParser.Parse(outputFilePath, sectionId); + using (new DirectoryDisposeHelper(workingDirectory)) + { + CopyTestInputToTemporaryOutput("exampleOutputTable.txt"); + // Call + targetProbabilityCalculationParser.Parse(workingDirectory, sectionId); + } + // Assert var targetProbabilityCalculationOutput = targetProbabilityCalculationParser.Output; Assert.IsNotNull(targetProbabilityCalculationOutput); @@ -82,11 +107,29 @@ // Setup var targetProbabilityCalculationParser = new TargetProbabilityCalculationParser(); - // Call - targetProbabilityCalculationParser.Parse(Path.Combine(testDataPath, "exampleOutputTable.txt"), 2); + using (new DirectoryDisposeHelper(workingDirectory)) + { + CopyTestInputToTemporaryOutput("exampleOutputTable.txt"); + // Call + targetProbabilityCalculationParser.Parse(workingDirectory, 2); + } + // Assert Assert.IsNull(targetProbabilityCalculationParser.Output); } + + /// + /// Copies the testfile from the test directory to the working directory. + /// + /// The name of the test's input file. + /// The copied file is removed from the working directory by using the , + /// which recursively removes all files in the directory. + private void CopyTestInputToTemporaryOutput(string testFile) + { + var inputFilePath = Path.Combine(testDataPath, testFile); + var outputFilePath = Path.Combine(workingDirectory, HydraRingFileName.DesignTablesFileName); + File.Copy(inputFilePath, outputFilePath); + } } } \ No newline at end of file Index: Ringtoets/Integration/src/Ringtoets.Integration.Service/DesignWaterLevelCalculationService.cs =================================================================== diff -u -re88fa1dfcf62085f7fabc453b73dbc8ac3ff9223 -r3d9b418d483c122040e11a7e074d666c64e9d7b5 --- Ringtoets/Integration/src/Ringtoets.Integration.Service/DesignWaterLevelCalculationService.cs (.../DesignWaterLevelCalculationService.cs) (revision e88fa1dfcf62085f7fabc453b73dbc8ac3ff9223) +++ Ringtoets/Integration/src/Ringtoets.Integration.Service/DesignWaterLevelCalculationService.cs (.../DesignWaterLevelCalculationService.cs) (revision 3d9b418d483c122040e11a7e074d666c64e9d7b5) @@ -20,11 +20,13 @@ // All rights reserved. using System.IO; +using log4net; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Service; using Ringtoets.HydraRing.Calculation.Data; using Ringtoets.HydraRing.Calculation.Data.Input.Hydraulics; using Ringtoets.HydraRing.Calculation.Data.Output; +using Ringtoets.HydraRing.Calculation.Parsers; using Ringtoets.HydraRing.Calculation.Services; using Ringtoets.HydraRing.Data; using Ringtoets.HydraRing.IO; @@ -38,8 +40,10 @@ /// /// Service that provides methods for performing Hydra-Ring calculations for design water level. /// - internal static class DesignWaterLevelCalculationService + internal static class DesignWaterLevelCalculationService { + private static readonly ILog log = LogManager.GetLogger(typeof(DesignWaterLevelCalculationService)); + /// /// Performs validation over the values on the given . Error information is logged during /// the execution of the operation. @@ -79,12 +83,34 @@ { var hlcdDirectory = Path.GetDirectoryName(hydraulicBoundaryDatabase.FilePath); var input = CreateInput(assessmentSection, hydraulicBoundaryLocation); + var targetProbabilityCalculationParser = new TargetProbabilityCalculationParser(); - return CalculationServiceHelper.PerformCalculation(hydraulicBoundaryLocation.Id.ToString(), - () => HydraRingCalculationService.PerformCalculation(hlcdDirectory, ringId, HydraRingTimeIntegrationSchemeType.FerryBorgesCastanheta, HydraRingUncertaintiesType.All, input), - Resources.DesignWaterLevelCalculationService_Calculate_Error_in_design_water_level_0_calculation); + CalculationServiceHelper.PerformCalculation( + hydraulicBoundaryLocation.Id.ToString(), + () => + { + HydraRingCalculationService.PerformCalculation( + hlcdDirectory, + ringId, + HydraRingTimeIntegrationSchemeType.FerryBorgesCastanheta, + HydraRingUncertaintiesType.All, + input, + new[] { targetProbabilityCalculationParser }); + + VerifyOutput(targetProbabilityCalculationParser.Output, hydraulicBoundaryLocation.Id.ToString()); + }); + + return targetProbabilityCalculationParser.Output; } + private static void VerifyOutput(TargetProbabilityCalculationOutput output, string name) + { + if (output == null) + { + log.ErrorFormat(Resources.DesignWaterLevelCalculationService_Calculate_Error_in_design_water_level_0_calculation, name); + } + } + private static AssessmentLevelCalculationInput CreateInput(IAssessmentSection assessmentSection, HydraulicBoundaryLocation hydraulicBoundaryLocation) { return new AssessmentLevelCalculationInput(1, hydraulicBoundaryLocation.Id, assessmentSection.FailureMechanismContribution.Norm);