Index: Ringtoets/Piping/src/Ringtoets.Piping.IO/SoilProfile/SoilProfile1DReader.cs =================================================================== diff -u -r751aaf9b7623bac357cbacf4e6ddae87b2b69f1f -rcb6877f670bacc7a6a896ab132d592eeef1107b5 --- Ringtoets/Piping/src/Ringtoets.Piping.IO/SoilProfile/SoilProfile1DReader.cs (.../SoilProfile1DReader.cs) (revision 751aaf9b7623bac357cbacf4e6ddae87b2b69f1f) +++ Ringtoets/Piping/src/Ringtoets.Piping.IO/SoilProfile/SoilProfile1DReader.cs (.../SoilProfile1DReader.cs) (revision cb6877f670bacc7a6a896ab132d592eeef1107b5) @@ -21,6 +21,7 @@ using System; using System.Data.SQLite; +using Core.Common.IO.Exceptions; using Core.Common.IO.Readers; using Core.Common.Utils.Builders; using Ringtoets.Piping.IO.Builders; @@ -41,7 +42,7 @@ /// /// A which is used to read row values from. /// A new , which is based on the information from the database. - /// Thrown when reading the profile encountered an unrecoverable error. + /// Thrown when reading the profile encountered an unrecoverable error. /// Thrown when reading the profile encountered a recoverable error. internal static PipingSoilProfile ReadFrom(IRowBasedDatabaseReader reader) { @@ -53,14 +54,21 @@ var soilProfileBuilder = new SoilProfileBuilder1D(profileName, requiredProperties.Bottom, profileId); - for (var i = 1; i <= criticalProperties.LayerCount; i++) + try { - SoilLayer1D soilLayer = ReadSoilLayerFrom(reader, profileName); - soilProfileBuilder.Add(soilLayer.AsPipingSoilLayer()); - reader.MoveNext(); - } + for (var i = 1; i <= criticalProperties.LayerCount; i++) + { + SoilLayer1D soilLayer = ReadSoilLayerFrom(reader, profileName); + soilProfileBuilder.Add(soilLayer.AsPipingSoilLayer()); + reader.MoveNext(); + } - return Build(soilProfileBuilder, reader.Path, profileName); + return Build(soilProfileBuilder, reader.Path, profileName); + } + catch (SoilLayerConversionException e) + { + throw CreatePipingSoilProfileReadException(reader.Path, profileName, e); + } } /// @@ -88,7 +96,7 @@ /// Thrown when reading properties of the layers failed. private static SoilLayer1D ReadSoilLayerFrom(IRowBasedDatabaseReader reader, string profileName) { - var properties = new LayerProperties(reader, profileName); + var properties = new Layer1DProperties(reader, profileName); var pipingSoilLayer = new SoilLayer1D(properties.Top) { @@ -116,97 +124,51 @@ return pipingSoilLayer; } - private class LayerProperties + private class Layer1DProperties : LayerProperties { internal readonly double Top; - internal readonly double? IsAquifer; - internal readonly string MaterialName; - internal readonly double? Color; - internal readonly double? AbovePhreaticLevel; - internal readonly double? DryUnitWeight; - internal readonly double? BelowPhreaticLevelDistribution; - internal readonly double? BelowPhreaticLevelShift; - internal readonly double? BelowPhreaticLevelMean; - internal readonly double? BelowPhreaticLevelDeviation; - - internal readonly double? DiameterD70Distribution; - internal readonly double? DiameterD70Shift; - internal readonly double? DiameterD70Mean; - internal readonly double? DiameterD70Deviation; - - internal readonly double? PermeabilityDistribution; - internal readonly double? PermeabilityShift; - internal readonly double? PermeabilityMean; - internal readonly double? PermeabilityDeviation; - /// - /// Creates a new instance of , which contains properties + /// Creates a new instance of , which contains properties /// that are required to create a complete . If these properties /// cannot be read, then the reader can proceed to the next profile. /// /// The to read the required layer property values from. /// The profile name used in generating exceptions messages if casting failed. /// Thrown when the values in the database could not be /// casted to the expected column types. - internal LayerProperties(IRowBasedDatabaseReader reader, string profileName) + internal Layer1DProperties(IRowBasedDatabaseReader reader, string profileName) + : base(reader, profileName) { string readColumn = SoilProfileDatabaseColumns.Top; try { Top = reader.Read(readColumn); - - readColumn = SoilProfileDatabaseColumns.IsAquifer; - IsAquifer = reader.ReadOrDefault(readColumn); - - readColumn = SoilProfileDatabaseColumns.MaterialName; - MaterialName = reader.ReadOrDefault(readColumn); - - readColumn = SoilProfileDatabaseColumns.Color; - Color = reader.ReadOrDefault(readColumn); - - readColumn = SoilProfileDatabaseColumns.AbovePhreaticLevel; - AbovePhreaticLevel = reader.ReadOrDefault(readColumn); - readColumn = SoilProfileDatabaseColumns.DryUnitWeight; - DryUnitWeight = reader.ReadOrDefault(readColumn); - - readColumn = SoilProfileDatabaseColumns.BelowPhreaticLevelDistribution; - BelowPhreaticLevelDistribution = reader.ReadOrDefault(readColumn); - readColumn = SoilProfileDatabaseColumns.BelowPhreaticLevelShift; - BelowPhreaticLevelShift = reader.ReadOrDefault(readColumn); - readColumn = SoilProfileDatabaseColumns.BelowPhreaticLevelMean; - BelowPhreaticLevelMean = reader.ReadOrDefault(readColumn); - readColumn = SoilProfileDatabaseColumns.BelowPhreaticLevelDeviation; - BelowPhreaticLevelDeviation = reader.ReadOrDefault(readColumn); - - readColumn = SoilProfileDatabaseColumns.DiameterD70Distribution; - DiameterD70Distribution = reader.ReadOrDefault(readColumn); - readColumn = SoilProfileDatabaseColumns.DiameterD70Shift; - DiameterD70Shift = reader.ReadOrDefault(readColumn); - readColumn = SoilProfileDatabaseColumns.DiameterD70Mean; - DiameterD70Mean = reader.ReadOrDefault(readColumn); - readColumn = SoilProfileDatabaseColumns.DiameterD70Deviation; - DiameterD70Deviation = reader.ReadOrDefault(readColumn); - - readColumn = SoilProfileDatabaseColumns.PermeabilityDistribution; - PermeabilityDistribution = reader.ReadOrDefault(readColumn); - readColumn = SoilProfileDatabaseColumns.PermeabilityShift; - PermeabilityShift = reader.ReadOrDefault(readColumn); - readColumn = SoilProfileDatabaseColumns.PermeabilityMean; - PermeabilityMean = reader.ReadOrDefault(readColumn); - readColumn = SoilProfileDatabaseColumns.PermeabilityDeviation; - PermeabilityDeviation = reader.ReadOrDefault(readColumn); } catch (InvalidCastException e) { - var message = new FileReaderErrorMessageBuilder(reader.Path) - .WithSubject(String.Format(Resources.PipingSoilProfileReader_SoilProfileName_0_, profileName)) - .Build(string.Format(Resources.PipingSoilProfileReader_Profile_has_invalid_value_on_Column_0_, readColumn)); - throw new PipingSoilProfileReadException(profileName, message, e); + var message = string.Format(Resources.PipingSoilProfileReader_Profile_has_invalid_value_on_Column_0_, readColumn); + throw CreatePipingSoilProfileReadException(reader.Path, profileName, message, e); } } } + private static PipingSoilProfileReadException CreatePipingSoilProfileReadException(string filePath, string profileName, string errorMessage, Exception innerException) + { + var message = new FileReaderErrorMessageBuilder(filePath) + .WithSubject(string.Format(Resources.PipingSoilProfileReader_SoilProfileName_0_, profileName)) + .Build(errorMessage); + return new PipingSoilProfileReadException(profileName, message, innerException); + } + + private static PipingSoilProfileReadException CreatePipingSoilProfileReadException(string filePath, string profileName, Exception innerException) + { + var message = new FileReaderErrorMessageBuilder(filePath) + .WithSubject(string.Format(Resources.PipingSoilProfileReader_SoilProfileName_0_, profileName)) + .Build(innerException.Message); + return new PipingSoilProfileReadException(profileName, message, innerException); + } + private class RequiredProfileProperties { internal readonly double Bottom;