示例#1
0
        /// <summary>
        /// Add <see cref="CDP4Common.DTO.ParameterSubscription"/> to the list of operation if a <see cref="ParameterOverride"/> is created
        /// </summary>
        /// <param name="operationContainer">The <see cref="OperationContainer"/> to modify</param>
        /// <param name="parameterOverride">The <see cref="ParameterOverride"/> to create</param>
        /// <returns>A <see cref="IEnumerable{T}"/> of new <see cref="Operation"/>s</returns>
        private IEnumerable <Operation> AddParameterSubscriptionCreateOperation(OperationContainer operationContainer, ParameterOverride parameterOverride)
        {
            var          parameterId = parameterOverride.Parameter;
            Lazy <Thing> lazyParameter;
            var          operations = new List <Operation>();

            if (!this.session.Assembler.Cache.TryGetValue(new CacheKey(parameterId, parameterOverride.IterationContainerId), out lazyParameter))
            {
                return(operations);
            }

            var parameter = (Parameter)lazyParameter.Value;

            foreach (var subscription in parameter.ParameterSubscription.Where(x => x.Owner.Iid != parameterOverride.Owner))
            {
                var parameterSubscription = new ParameterSubscription
                {
                    Iid   = Guid.NewGuid(),
                    Owner = subscription.Owner.Iid
                };

                // Build Route for this Parameter subscription
                var elementUsageContainer =
                    operationContainer.Operations.Select(x => x.ModifiedThing)
                    .OfType <ElementUsage>()
                    .SingleOrDefault(x => x.ParameterOverride.Contains(parameterOverride.Iid));

                if (elementUsageContainer == null)
                {
                    continue;
                }

                Lazy <Thing> lazyElementUsageContainer;
                if (!this.session.Assembler.Cache.TryGetValue(new CacheKey(elementUsageContainer.Iid, elementUsageContainer.IterationContainerId), out lazyElementUsageContainer))
                {
                    continue;
                }

                var elementDef = lazyElementUsageContainer.Value.GetContainerOfType <ElementDefinition>();
                var iteration  = lazyElementUsageContainer.Value.GetContainerOfType <Iteration>();
                var model      = lazyElementUsageContainer.Value.GetContainerOfType <EngineeringModel>();

                if (elementDef == null || iteration == null || model == null)
                {
                    continue;
                }

                parameterSubscription.AddContainer(ClassKind.ParameterOverride, parameterOverride.Iid);
                parameterSubscription.AddContainer(ClassKind.ElementUsage, elementUsageContainer.Iid);
                parameterSubscription.AddContainer(ClassKind.ElementDefinition, elementDef.Iid);
                parameterSubscription.AddContainer(ClassKind.Iteration, iteration.Iid);
                parameterSubscription.AddContainer(ClassKind.EngineeringModel, model.Iid);

                parameterOverride.ParameterSubscription.Add(parameterSubscription.Iid);
                operations.Add(new Operation(null, parameterSubscription, OperationKind.Create));
            }

            return(operations);
        }
        /// <summary>
        /// Update a <see cref="ParameterSubscription"/> with new <see cref="CDP4Common.DTO.ParameterSubscriptionValueSet"/>
        /// </summary>
        /// <param name="parameterSubscription">The <see cref="ParameterSubscription"/></param>
        /// <param name="transaction">The current transaction</param>
        /// <param name="partition">The current partition</param>
        /// <param name="securityContext">The security context</param>
        /// <param name="newOldValueSetBaseMap">The map linking the old subscribed <see cref="ParameterValueSetBase"/> to the new ones</param>
        private void UpdateParameterSubscription(ParameterSubscription parameterSubscription, NpgsqlTransaction transaction, string partition, ISecurityContext securityContext, IReadOnlyDictionary <ParameterValueSetBase, ParameterValueSetBase> newOldValueSetBaseMap)
        {
            var oldValueSets = this.ParameterSubscriptionValueSetService.GetShallow(transaction, partition, parameterSubscription.ValueSet, securityContext)
                               .Where(i => i is ParameterSubscriptionValueSet).Cast <ParameterSubscriptionValueSet>().ToList();

            foreach (var newOldParameterValueSetPair in newOldValueSetBaseMap)
            {
                if (newOldParameterValueSetPair.Value != null)
                {
                    var oldValueSet = oldValueSets.SingleOrDefault(x => x.SubscribedValueSet == newOldParameterValueSetPair.Value.Iid);
                    this.CreateParameterSubscriptionValueSet(oldValueSet, newOldParameterValueSetPair.Key, parameterSubscription, transaction, partition);
                }
                else
                {
                    this.CreateParameterSubscriptionValueSet(null, newOldParameterValueSetPair.Key, parameterSubscription, transaction, partition);
                }
            }
        }
        /// <summary>
        /// Instantiate and deserialize the properties of a <paramref name="ParameterSubscription"/>
        /// </summary>
        /// <param name="jObject">The <see cref="JObject"/> containing the data</param>
        /// <returns>The <see cref="ParameterSubscription"/> to instantiate</returns>
        public static CDP4Common.DTO.ParameterSubscription FromJsonObject(JObject jObject)
        {
            var iid                   = jObject["iid"].ToObject <Guid>();
            var revisionNumber        = jObject["revisionNumber"].IsNullOrEmpty() ? 0 : jObject["revisionNumber"].ToObject <int>();
            var parameterSubscription = new CDP4Common.DTO.ParameterSubscription(iid, revisionNumber);

            if (!jObject["excludedDomain"].IsNullOrEmpty())
            {
                parameterSubscription.ExcludedDomain.AddRange(jObject["excludedDomain"].ToObject <IEnumerable <Guid> >());
            }

            if (!jObject["excludedPerson"].IsNullOrEmpty())
            {
                parameterSubscription.ExcludedPerson.AddRange(jObject["excludedPerson"].ToObject <IEnumerable <Guid> >());
            }

            if (!jObject["modifiedOn"].IsNullOrEmpty())
            {
                parameterSubscription.ModifiedOn = jObject["modifiedOn"].ToObject <DateTime>();
            }

            if (!jObject["owner"].IsNullOrEmpty())
            {
                parameterSubscription.Owner = jObject["owner"].ToObject <Guid>();
            }

            if (!jObject["thingPreference"].IsNullOrEmpty())
            {
                parameterSubscription.ThingPreference = jObject["thingPreference"].ToObject <string>();
            }

            if (!jObject["valueSet"].IsNullOrEmpty())
            {
                parameterSubscription.ValueSet.AddRange(jObject["valueSet"].ToObject <IEnumerable <Guid> >());
            }

            return(parameterSubscription);
        }
        /// <summary>
        /// Create a new <see cref="ParameterSubscriptionValueSet"/> from the updated <see cref="ParameterValueSetBase"/>
        /// </summary>
        /// <param name="oldValue">The old <see cref="ParameterSubscriptionValueSet"/></param>
        /// <param name="valueSetBase">The subscribed <see cref="ParameterValueSetBase"/></param>
        /// <param name="container">The container</param>
        /// <param name="transaction">The current transaction</param>
        /// <param name="partition">The current partition</param>
        private void CreateParameterSubscriptionValueSet(ParameterSubscriptionValueSet oldValue, ParameterValueSetBase valueSetBase, ParameterSubscription container, NpgsqlTransaction transaction, string partition)
        {
            var isOldValueNull = oldValue == null;
            var newValueSet    = new ParameterSubscriptionValueSet(Guid.NewGuid(), 1)
            {
                Manual             = new ValueArray <string>((oldValue == null) ? valueSetBase.Manual : oldValue.Manual),
                ValueSwitch        = isOldValueNull ? CDP4Common.EngineeringModelData.ParameterSwitchKind.MANUAL : oldValue.ValueSwitch,
                SubscribedValueSet = valueSetBase.Iid
            };

            this.ParameterSubscriptionValueSetService.CreateConcept(transaction, partition, newValueSet, container);
        }