/// <summary> /// Update All <see cref="CDP4Common.DTO.ActualFiniteStateList"/> related to a modified <see cref="CDP4Common.DTO.PossibleFiniteStateList"/> /// </summary> /// <param name="possibleFiniteStateList"> /// The container instance of the <see cref="CDP4Common.DTO.PossibleFiniteStateList"/> that is inspected. /// </param> /// <param name="transaction"> /// The current transaction to the database. /// </param> /// <param name="partition"> /// The database partition (schema) where the requested resource will be stored. /// </param> /// <param name="securityContext"> /// The security Context used for permission checking. /// </param> public void UpdateAllRelevantActualFiniteStateList(PossibleFiniteStateList possibleFiniteStateList, NpgsqlTransaction transaction, string partition, ISecurityContext securityContext) { // redirect out the iteration partition to the engineeringmodel one, as that contains the iteration information var engineeringModelPartition = partition.Replace( CDP4Orm.Dao.Utils.IterationSubPartition, CDP4Orm.Dao.Utils.EngineeringModelPartition); var iteration = this.IterationService.GetShallow(transaction, engineeringModelPartition, null, securityContext) .Where(i => i is Iteration).Cast <Iteration>() .SingleOrDefault(); if (iteration == null) { throw new InvalidOperationException("The iteration could not be found."); } // get all actual finite state list var actualFiniteStateList = this.ActualFiniteStateListService.GetShallow(transaction, partition, null, securityContext).Cast <ActualFiniteStateList>(); var actualFiniteStateListToUpdate = actualFiniteStateList.Where(x => x.PossibleFiniteStateList.Select(item => Guid.Parse(item.V.ToString())).Contains(possibleFiniteStateList.Iid)); foreach (var finiteStateList in actualFiniteStateListToUpdate) { this.UpdateActualFinisteStateList(finiteStateList, iteration, transaction, partition, securityContext); } }
/// <summary> /// Modify the <see cref="CDP4Common.DTO.ActualFiniteState.Kind"/> state of the potential new default actual state to "Mandatory" /// </summary> /// <param name="possibleFiniteStateList">The updated <see cref="PossibleFiniteStateList"/></param> /// <returns>A <see cref="IEnumerable{T}"/> of new <see cref="Operation"/>s</returns> private IEnumerable <Operation> ModifyActualStateKindOnDefaultPossibleStateUpdate(PossibleFiniteStateList possibleFiniteStateList) { var operations = new List <Operation>(); var defaultStateId = possibleFiniteStateList.DefaultState; if (!defaultStateId.HasValue) { return(operations); } // gets the actualList that uses the updated possible list var actualLists = this.session.Assembler.Cache.Select(x => x.Value) .Select(x => x.Value) .OfType <ActualFiniteStateList>() .Where(x => x.PossibleFiniteStateList.Select(pl => pl.Iid).Contains(possibleFiniteStateList.Iid)) .ToList(); foreach (var actualFiniteStateList in actualLists) { var possibleLists = actualFiniteStateList.PossibleFiniteStateList.Where(x => x.Iid != possibleFiniteStateList.Iid).ToList(); if (possibleLists.Any(x => x.DefaultState == null)) { // one of the possible list has no default state continue; } var defaultPossibleStatesIds = possibleLists.Select(x => x.DefaultState.Iid).ToList(); defaultPossibleStatesIds.Add(defaultStateId.Value); // get the "default" actual state var defaultActualState = actualFiniteStateList.ActualState.SingleOrDefault( x => x.PossibleState.Select(ps => ps.Iid).Intersect(defaultPossibleStatesIds).Count() == defaultPossibleStatesIds.Count); if (defaultActualState == null || defaultActualState.Kind == ActualFiniteStateKind.MANDATORY) { continue; } // the new default is forbidden, send update with mandatory var actualStateDto = (ActualFiniteState)defaultActualState.ToDto(); actualStateDto.Kind = ActualFiniteStateKind.MANDATORY; var newOperation = new Operation(defaultActualState.ToDto(), actualStateDto, OperationKind.Update); operations.Add(newOperation); } return(operations); }
/// <summary> /// Instantiate and deserialize the properties of a <paramref name="PossibleFiniteStateList"/> /// </summary> /// <param name="jObject">The <see cref="JObject"/> containing the data</param> /// <returns>The <see cref="PossibleFiniteStateList"/> to instantiate</returns> public static CDP4Common.DTO.PossibleFiniteStateList FromJsonObject(JObject jObject) { var iid = jObject["iid"].ToObject <Guid>(); var revisionNumber = jObject["revisionNumber"].IsNullOrEmpty() ? 0 : jObject["revisionNumber"].ToObject <int>(); var possibleFiniteStateList = new CDP4Common.DTO.PossibleFiniteStateList(iid, revisionNumber); if (!jObject["alias"].IsNullOrEmpty()) { possibleFiniteStateList.Alias.AddRange(jObject["alias"].ToObject <IEnumerable <Guid> >()); } if (!jObject["category"].IsNullOrEmpty()) { possibleFiniteStateList.Category.AddRange(jObject["category"].ToObject <IEnumerable <Guid> >()); } if (!jObject["defaultState"].IsNullOrEmpty()) { possibleFiniteStateList.DefaultState = jObject["defaultState"].ToObject <Guid?>(); } if (!jObject["definition"].IsNullOrEmpty()) { possibleFiniteStateList.Definition.AddRange(jObject["definition"].ToObject <IEnumerable <Guid> >()); } if (!jObject["excludedDomain"].IsNullOrEmpty()) { possibleFiniteStateList.ExcludedDomain.AddRange(jObject["excludedDomain"].ToObject <IEnumerable <Guid> >()); } if (!jObject["excludedPerson"].IsNullOrEmpty()) { possibleFiniteStateList.ExcludedPerson.AddRange(jObject["excludedPerson"].ToObject <IEnumerable <Guid> >()); } if (!jObject["hyperLink"].IsNullOrEmpty()) { possibleFiniteStateList.HyperLink.AddRange(jObject["hyperLink"].ToObject <IEnumerable <Guid> >()); } if (!jObject["modifiedOn"].IsNullOrEmpty()) { possibleFiniteStateList.ModifiedOn = jObject["modifiedOn"].ToObject <DateTime>(); } if (!jObject["name"].IsNullOrEmpty()) { possibleFiniteStateList.Name = jObject["name"].ToObject <string>(); } if (!jObject["owner"].IsNullOrEmpty()) { possibleFiniteStateList.Owner = jObject["owner"].ToObject <Guid>(); } if (!jObject["possibleState"].IsNullOrEmpty()) { possibleFiniteStateList.PossibleState.AddRange(jObject["possibleState"].ToOrderedItemCollection()); } if (!jObject["shortName"].IsNullOrEmpty()) { possibleFiniteStateList.ShortName = jObject["shortName"].ToObject <string>(); } if (!jObject["thingPreference"].IsNullOrEmpty()) { possibleFiniteStateList.ThingPreference = jObject["thingPreference"].ToObject <string>(); } return(possibleFiniteStateList); }