// Copyright (C) Stichting Deltares 2016. 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 Application.Ringtoets.Storage.Create;
using Application.Ringtoets.Storage.DbContext;
using Application.Ringtoets.Storage.Exceptions;
using Application.Ringtoets.Storage.Serializers;
using Application.Ringtoets.Storage.Update.ClosingStructure;
using Application.Ringtoets.Storage.Update.DuneErosion;
using Application.Ringtoets.Storage.Update.GrassCoverErosionInwards;
using Application.Ringtoets.Storage.Update.GrassCoverErosionOutwards;
using Application.Ringtoets.Storage.Update.GrassCoverSlipOffInwards;
using Application.Ringtoets.Storage.Update.GrassCoverSlipOffOutwards;
using Application.Ringtoets.Storage.Update.HeightStructures;
using Application.Ringtoets.Storage.Update.MacrostabilityInwards;
using Application.Ringtoets.Storage.Update.MacrostabilityOutwards;
using Application.Ringtoets.Storage.Update.Microstability;
using Application.Ringtoets.Storage.Update.Piping;
using Application.Ringtoets.Storage.Update.PipingStructure;
using Application.Ringtoets.Storage.Update.StabilityStoneCover;
using Application.Ringtoets.Storage.Update.StrengthStabilityLengthwiseConstruction;
using Application.Ringtoets.Storage.Update.StrengthStabilityPointConstruction;
using Application.Ringtoets.Storage.Update.TechnicalInnovation;
using Application.Ringtoets.Storage.Update.WaterPressureAsphaltCover;
using Application.Ringtoets.Storage.Update.WaveImpactAsphaltCover;
using Ringtoets.Integration.Data;
namespace Application.Ringtoets.Storage.Update
{
///
/// Extension methods for related to updating an .
///
internal static class AssessmentSectionUpdateExtensions
{
///
/// Updates a in the database based on the information of the
/// .
///
/// The section to update the database entity for.
/// The object keeping track of update operations.
/// The context to obtain the existing entity from.
/// Thrown when either:
///
/// - is null
/// - is null
///
/// When
/// does not have a corresponding entity in the database.
internal static void Update(this AssessmentSection section, PersistenceRegistry registry, IRingtoetsEntities context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (registry == null)
{
throw new ArgumentNullException("registry");
}
AssessmentSectionEntity entity = section.GetCorrespondingEntity(context.AssessmentSectionEntities, context);
entity.Id = section.Id;
entity.Name = section.Name;
entity.Composition = (short) section.Composition;
entity.Comments = section.Comments;
entity.Norm = section.FailureMechanismContribution.Norm;
UpdateHydraulicDatabase(section, entity, registry, context);
UpdateReferenceLine(section, entity);
UpdateFailureMechanisms(section, registry, context);
registry.Register(entity, section);
}
private static void UpdateFailureMechanisms(AssessmentSection section, PersistenceRegistry registry, IRingtoetsEntities context)
{
PipingFailureMechanismUpdateExtensions.Update(section.PipingFailureMechanism, registry, context);
GrassCoverErosionInwardsFailureMechanismUpdateExtensions.Update(section.GrassCoverErosionInwards, registry, context);
MacrostabilityInwardsFailureMechanismUpdateExtensions.Update(section.MacrostabilityInwards, registry, context);
MacrostabilityOutwardsFailureMechanismUpdateExtensions.Update(section.MacrostabilityOutwards, registry, context);
MicrostabilityFailureMechanismUpdateExtensions.Update(section.Microstability, registry, context);
StabilityStoneCoverFailureMechanismUpdateExtensions.Update(section.StabilityStoneCover, registry, context);
WaveImpactAsphaltCoverFailureMechanismUpdateExtensions.Update(section.WaveImpactAsphaltCover, registry, context);
WaterPressureAsphaltCoverFailureMechanismUpdateExtensions.Update(section.WaterPressureAsphaltCover, registry, context);
GrassCoverErosionOutwardsFailureMechanismUpdateExtensions.Update(section.GrassCoverErosionOutwards, registry, context);
GrassCoverSlipOffOutwardsFailureMechanismUpdateExtensions.Update(section.GrassCoverSlipOffOutwards, registry, context);
GrassCoverSlipOffInwardsFailureMechanismUpdateExtensions.Update(section.GrassCoverSlipOffInwards, registry, context);
HeightStructuresFailureMechanismUpdateExtensions.Update(section.HeightStructures, registry, context);
ClosingStructureFailureMechanismUpdateExtensions.Update(section.ClosingStructure, registry, context);
PipingStructureFailureMechanismUpdateExtensions.Update(section.PipingStructure, registry, context);
StrengthStabilityPointConstructionFailureMechanismUpdateExtensions.Update(section.StrengthStabilityPointConstruction, registry, context);
StrengthStabilityLengthwiseConstructionFailureMechanismUpdateExtensions.Update(section.StrengthStabilityLengthwiseConstruction, registry, context);
DuneErosionFailureMechanismUpdateExtensions.Update(section.DuneErosion, registry, context);
TechnicalInnovationFailureMechanismUpdateExtensions.Update(section.TechnicalInnovation, registry, context);
}
private static void UpdateReferenceLine(AssessmentSection section, AssessmentSectionEntity entity)
{
if (section.ReferenceLine == null)
{
entity.ReferenceLinePointXml = null;
}
else
{
string newXml = new Point2DXmlSerializer().ToXml(section.ReferenceLine.Points);
if (entity.ReferenceLinePointXml == null || !entity.ReferenceLinePointXml.Equals(newXml))
{
entity.ReferenceLinePointXml = newXml;
}
}
}
private static void UpdateHydraulicDatabase(AssessmentSection section, AssessmentSectionEntity entity, PersistenceRegistry registry, IRingtoetsEntities context)
{
if (section.HydraulicBoundaryDatabase != null)
{
entity.HydraulicDatabaseLocation = section.HydraulicBoundaryDatabase.FilePath;
entity.HydraulicDatabaseVersion = section.HydraulicBoundaryDatabase.Version;
for (int i = 0; i < section.HydraulicBoundaryDatabase.Locations.Count; i++)
{
var hydraulicBoundaryLocation = section.HydraulicBoundaryDatabase.Locations[i];
if (hydraulicBoundaryLocation.IsNew())
{
entity.HydraulicLocationEntities.Add(hydraulicBoundaryLocation.Create(registry, i));
}
else
{
hydraulicBoundaryLocation.Update(registry, context);
}
}
}
}
}
}