diff --git a/CDP4Orm/CDP4Orm.csproj b/CDP4Orm/CDP4Orm.csproj
index c5c6ac50..8bf02ce7 100644
--- a/CDP4Orm/CDP4Orm.csproj
+++ b/CDP4Orm/CDP4Orm.csproj
@@ -80,7 +80,7 @@
-
+
diff --git a/CometServer/CometServer.csproj b/CometServer/CometServer.csproj
index 491e1011..6a1b0263 100644
--- a/CometServer/CometServer.csproj
+++ b/CometServer/CometServer.csproj
@@ -19,8 +19,8 @@
-
-
+
+
diff --git a/CometServer/Services/Operations/SideEffects/Implementation/ParameterSubscriptionValueSetSideEffect.cs b/CometServer/Services/Operations/SideEffects/Implementation/ParameterSubscriptionValueSetSideEffect.cs
index 13dde53d..59d226af 100644
--- a/CometServer/Services/Operations/SideEffects/Implementation/ParameterSubscriptionValueSetSideEffect.cs
+++ b/CometServer/Services/Operations/SideEffects/Implementation/ParameterSubscriptionValueSetSideEffect.cs
@@ -34,6 +34,7 @@ namespace CometServer.Services.Operations.SideEffects
using CDP4Common;
using CDP4Common.DTO;
using CDP4Common.EngineeringModelData;
+ using CDP4Common.Exceptions;
using CDP4Common.Validation;
using CometServer.Exceptions;
@@ -41,6 +42,8 @@ namespace CometServer.Services.Operations.SideEffects
using Npgsql;
using Parameter = CDP4Common.DTO.Parameter;
+ using ParameterOrOverrideBase = CDP4Common.DTO.ParameterOrOverrideBase;
+ using ParameterOverride = CDP4Common.DTO.ParameterOverride;
using ParameterSubscription = CDP4Common.DTO.ParameterSubscription;
using ParameterSubscriptionValueSet = CDP4Common.DTO.ParameterSubscriptionValueSet;
@@ -54,6 +57,11 @@ public sealed class ParameterSubscriptionValueSetSideEffect : OperationSideEffec
///
public IParameterService ParameterService { get; set; }
+ ///
+ /// Gets or sets the injected used to retrieve linked
+ ///
+ public IParameterOverrideService ParameterOverrideService { get; set; }
+
///
/// Execute additional logic before a create operation.
///
@@ -120,15 +128,50 @@ public override void BeforeUpdate(ParameterSubscriptionValueSet thing, Thing con
throw new ArgumentException("The container of the ParameterSubscriptionValueSet is not a ParameterSubscription", nameof(container));
}
- var parameter = this.ParameterService.Get(transaction, partition, null, securityContext)
- .OfType()
- .Single(x => x.ParameterSubscription.Contains(parameterSubscription.Iid));
+ var parameters = this.ParameterService.Get(transaction, partition, null, securityContext).ToList();
+
+ var parameterOrOverrideBase =
+ parameters
+ .OfType()
+ .SingleOrDefault(
+ x => x.ParameterSubscription.Contains(parameterSubscription.Iid))
+ ??
+ this.ParameterOverrideService.Get(transaction, partition, null, securityContext)
+ .OfType()
+ .SingleOrDefault(
+ x => x.ParameterSubscription.Contains(parameterSubscription.Iid));
var things = new List();
- things.AddRange(this.ParameterService.QueryReferencedSiteDirectoryThings(parameter, transaction,securityContext));
+ if (parameterOrOverrideBase == null)
+ {
+ throw new ThingNotFoundException("The ParameterSubscription's container Parameter, or ParameterOverride was not found");
+ }
+
+ ValidationResult validationResult = default;
+ validationResult.Message = "Validation failed";
+
+ if (parameterOrOverrideBase is Parameter parameter)
+ {
+ things.AddRange(this.ParameterService.QueryReferencedSiteDirectoryThings(parameter, transaction, securityContext));
+
+ validationResult = parameter.ValidateAndCleanup(rawUpdateInfo, things, CultureInfo.InvariantCulture);
+ }
+
+ if (parameterOrOverrideBase is ParameterOverride parameterOverride)
+ {
+ var parameterOverrideParameter = parameters.SingleOrDefault(x => x.Iid == parameterOverride.Parameter) as Parameter;
+
+ if (parameterOrOverrideBase == null)
+ {
+ throw new ThingNotFoundException("The ParameterOverride's container Parameter was not found");
+ }
- var validationResult = parameter.ValidateAndCleanup(rawUpdateInfo, things, CultureInfo.InvariantCulture);
+ things.Add(parameterOverrideParameter);
+ things.AddRange(this.ParameterService.QueryReferencedSiteDirectoryThings(parameterOverrideParameter, transaction, securityContext));
+
+ validationResult = parameterOverride.ValidateAndCleanup(rawUpdateInfo, things, CultureInfo.InvariantCulture);
+ }
if (validationResult.ResultKind != ValidationResultKind.Valid)
{