// 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.Globalization;
using Core.Common.Base;
using Core.Common.Base.Data;
using Ringtoets.Common.Data.Calculation;
using Ringtoets.Common.Data.Properties;
namespace Ringtoets.Common.Data.FailureMechanism
{
///
/// This class is the base implementation for a failure mechanism. Classes which want
/// to implement can and should most likely inherit
/// from this class.
///
public abstract class FailureMechanismBase : Observable, IFailureMechanism
{
private static readonly Range contributionValidityRange = new Range(0, 100);
private readonly FailureMechanismSectionCollection sectionCollection;
private double contribution;
///
/// Creates a new instance of the class.
///
/// The name of the failure mechanism.
/// The code of the failure mechanism.
/// The group that this failure mechanism belongs to.
/// Thrown when either:
///
/// - is null or empty.
/// - is null or empty.
///
///
protected FailureMechanismBase(string name, string failureMechanismCode, int group)
{
ValidateParameters(name, failureMechanismCode);
Name = name;
Code = failureMechanismCode;
Group = group;
sectionCollection = new FailureMechanismSectionCollection();
IsRelevant = true;
InputComments = new Comment();
OutputComments = new Comment();
NotRelevantComments = new Comment();
}
public double Contribution
{
get
{
return contribution;
}
set
{
if (!contributionValidityRange.InRange(value))
{
string message = string.Format(Resources.Contribution_Value_should_be_in_Range_0_,
contributionValidityRange.ToString(FormattableConstants.ShowAtLeastOneDecimal, CultureInfo.CurrentCulture));
throw new ArgumentOutOfRangeException(nameof(value), message);
}
contribution = value;
}
}
public string Name { get; }
public string Code { get; }
public int Group { get; }
public abstract IEnumerable Calculations { get; }
public IEnumerable Sections
{
get
{
return sectionCollection;
}
}
public string FailureMechanismSectionSourcePath
{
get
{
return sectionCollection.SourcePath;
}
}
public Comment InputComments { get; }
public Comment OutputComments { get; }
public Comment NotRelevantComments { get; }
public bool IsRelevant { get; set; }
public void SetSections(IEnumerable sections, string sourcePath)
{
if (sections == null)
{
throw new ArgumentNullException(nameof(sections));
}
if (sourcePath == null)
{
throw new ArgumentNullException(nameof(sourcePath));
}
sectionCollection.SetSections(sections, sourcePath);
foreach (FailureMechanismSection failureMechanismSection in sections)
{
AddSectionResult(failureMechanismSection);
}
}
public virtual void ClearAllSections()
{
sectionCollection.Clear();
}
protected virtual void AddSectionResult(FailureMechanismSection section) {}
private static void ValidateParameters(string failureMechanismName, string failureMechanismCode)
{
const string parameterIsRequired = "Parameter is required.";
if (string.IsNullOrEmpty(failureMechanismName))
{
throw new ArgumentException(parameterIsRequired, nameof(failureMechanismName));
}
if (string.IsNullOrEmpty(failureMechanismCode))
{
throw new ArgumentException(parameterIsRequired, nameof(failureMechanismCode));
}
}
}
}