private void UpdateItemDefinition([NotNull] ItemDefinition item, [NotNull] ItemChanges changes) { var itemName = StringUtil.GetString(changes.GetPropertyValue("name"), item.Name); var templateID = MainUtil.GetObject(changes.GetPropertyValue("templateid"), item.TemplateID) as ID; var branchId = MainUtil.GetObject(changes.GetPropertyValue("branchid"), item.BranchId) as ID; ItemsRow r; if (!Items.TryGetValue(item.ID, out r)) { return; } r.Name = itemName; r.TemplateID = templateID; r.BranchID = branchId; }
/// <summary> /// Save changes that were made to an item to the database. /// </summary> /// <param name="itemDefinition">Used to identify the particular item</param> /// <param name="changes">A holder object that keeps track of the changes</param> /// <param name="context"></param> /// <returns></returns> public override bool SaveItem(ItemDefinition itemDefinition, ItemChanges changes, CallContext context) { if (!ItemsById.ContainsKey(itemDefinition.ID)) { return(false); } SyncItem current = ItemsById[itemDefinition.ID]; if (changes.HasPropertiesChanged) { current.Name = StringUtil.GetString(changes.GetPropertyValue("name"), itemDefinition.Name); var templateId = MainUtil.GetObject(changes.GetPropertyValue("templateid"), itemDefinition.TemplateID) as ID; current.TemplateID = templateId != ID.Null ? GetIdAsString(templateId) : null; var branchId = MainUtil.GetObject(changes.GetPropertyValue("branchid"), itemDefinition.BranchId) as ID; current.BranchId = branchId != ID.Null ? GetIdAsString(branchId) : null; } if (changes.HasFieldsChanged) { foreach (FieldChange change in changes.FieldChanges) { string changeFieldId = GetIdAsString(change.FieldID); IEnumerable <SyncField> matchingSharedFields = current.SharedFields.Where(fv => changeFieldId.Equals(fv.FieldID)); IEnumerable <SyncVersion> matchingVersions = current.Versions .Where( vr => vr.Version.Equals(change.Version.Number.ToString()) && vr.Language.Equals(change.Language.Name)); var matchingNonSharedFields = matchingVersions .SelectMany(vr => vr.Fields.Select(fl => new { Ver = vr, Field = fl })) .Where(fv => changeFieldId.Equals(fv.Field.FieldID)); if (change.RemoveField) { if (matchingSharedFields.Any()) { current.SharedFields.Remove(matchingSharedFields.First()); } if (matchingNonSharedFields.Any()) { matchingNonSharedFields.First() .Ver.RemoveField(matchingNonSharedFields.First().Field.FieldName); } } else { bool changeMade = false; if (matchingSharedFields.Any()) { matchingSharedFields.First().FieldValue = change.Value; changeMade = true; } if (matchingNonSharedFields.Any()) { matchingNonSharedFields.First().Field.FieldValue = change.Value; changeMade = true; } if (!changeMade && change.Definition != null) { if (change.Definition.IsShared || change.Definition.IsUnversioned) { current.AddSharedField(changeFieldId, change.Definition.Name, change.Definition.Key, change.Value, true); } else if (matchingVersions.Any()) { matchingVersions.First() .AddField(changeFieldId, change.Definition.Name, change.Definition.Key, change.Value, true); } } } } } return(true); }
public override bool SaveItem(ItemDefinition itemDefinition, ItemChanges changes, CallContext context) { var current = Provider.GetItem(itemDefinition.ID.ToGuid()); if (current == null) { return false; } if (changes.HasPropertiesChanged) { current.Name = StringUtil.GetString(changes.GetPropertyValue("name"), itemDefinition.Name); var templateId = MainUtil.GetObject(changes.GetPropertyValue("templateid"), itemDefinition.TemplateID) as ID; current.TemplateId = templateId != ID.Null ? templateId.ToGuid() : Guid.Empty; var branchId = MainUtil.GetObject(changes.GetPropertyValue("branchid"), itemDefinition.BranchId) as ID; current.BranchId = branchId != ID.Null ? branchId.ToGuid() : Guid.Empty; } if (changes.HasFieldsChanged) { foreach (FieldChange change in changes.FieldChanges) { var fieldVersionUri = new VersionUri( change.Definition == null || change.Definition.IsShared ? null : change.Language, change.Definition == null || change.Definition.IsUnversioned ? null : change.Version); var matchingFields = current.FieldValues.Where(fv => fv.Matches(fieldVersionUri) && fv.Id.Equals(change.FieldID.ToGuid())).ToList(); if (change.RemoveField) { if (matchingFields.Any()) { current.FieldValues.Remove(matchingFields.First()); } } else { if (matchingFields.Any()) { current.FieldValues.Find(fv => fv.Matches(fieldVersionUri) && fv.Id.Equals(change.FieldID.ToGuid())).Value = change.Value; } else { current.FieldValues.Add(new FieldDto { Id = change.FieldID.ToGuid(), Language = fieldVersionUri.Language != null ? fieldVersionUri.Language.Name : null, Version = fieldVersionUri.Version != null ? fieldVersionUri.Version.Number : null as int?, Value = change.Value }); } if (change.FieldID == FieldIDs.WorkflowState) { Guid workflowStateId = Guid.Empty; Guid.TryParse(change.Value, out workflowStateId); current.WorkflowStateId = workflowStateId; } } } Provider.WritableProvider.Store(current); } return true; }
/// <summary> /// Save changes that were made to an item to the database. /// </summary> /// <param name="itemDefinition">Used to identify the particular item</param> /// <param name="changes">A holder object that keeps track of the changes</param> /// <param name="context"></param> /// <returns></returns> public override bool SaveItem(ItemDefinition itemDefinition, ItemChanges changes, CallContext context) { if (! ItemsById.ContainsKey(itemDefinition.ID)) { return false; } SyncItem current = ItemsById[itemDefinition.ID]; if (changes.HasPropertiesChanged) { current.Name = StringUtil.GetString(changes.GetPropertyValue("name"), itemDefinition.Name); var templateId = MainUtil.GetObject(changes.GetPropertyValue("templateid"), itemDefinition.TemplateID) as ID; current.TemplateID = templateId != ID.Null ? GetIdAsString(templateId) : null; var branchId = MainUtil.GetObject(changes.GetPropertyValue("branchid"), itemDefinition.BranchId) as ID; current.BranchId = branchId != ID.Null ? GetIdAsString(branchId) : null; } if (changes.HasFieldsChanged) { foreach (FieldChange change in changes.FieldChanges) { string changeFieldId = GetIdAsString(change.FieldID); IEnumerable<SyncField> matchingSharedFields = current.SharedFields.Where(fv => changeFieldId.Equals(fv.FieldID)); IEnumerable<SyncVersion> matchingVersions = current.Versions .Where( vr => vr.Version.Equals(change.Version.Number.ToString()) && vr.Language.Equals(change.Language.Name)); var matchingNonSharedFields = matchingVersions .SelectMany(vr => vr.Fields.Select(fl => new {Ver = vr, Field = fl})) .Where(fv => changeFieldId.Equals(fv.Field.FieldID)); if (change.RemoveField) { if (matchingSharedFields.Any()) { current.SharedFields.Remove(matchingSharedFields.First()); } if (matchingNonSharedFields.Any()) { matchingNonSharedFields.First() .Ver.RemoveField(matchingNonSharedFields.First().Field.FieldName); } } else { bool changeMade = false; if (matchingSharedFields.Any()) { matchingSharedFields.First().FieldValue = change.Value; changeMade = true; } if (matchingNonSharedFields.Any()) { matchingNonSharedFields.First().Field.FieldValue = change.Value; changeMade = true; } if (! changeMade && change.Definition != null) { if (change.Definition.IsShared || change.Definition.IsUnversioned) { current.AddSharedField(changeFieldId, change.Definition.Name, change.Definition.Key, change.Value, true); } else if (matchingVersions.Any()) { matchingVersions.First() .AddField(changeFieldId, change.Definition.Name, change.Definition.Key, change.Value, true); } } } } } return true; }
public override bool SaveItem(ItemDefinition itemDefinition, ItemChanges changes, CallContext context) { var current = Provider.GetItem(itemDefinition.ID.ToGuid()); if (current == null) { return(false); } if (changes.HasPropertiesChanged) { current.Name = StringUtil.GetString(changes.GetPropertyValue("name"), itemDefinition.Name); var templateId = MainUtil.GetObject(changes.GetPropertyValue("templateid"), itemDefinition.TemplateID) as ID; current.TemplateId = templateId != ID.Null ? templateId.ToGuid() : Guid.Empty; var branchId = MainUtil.GetObject(changes.GetPropertyValue("branchid"), itemDefinition.BranchId) as ID; current.BranchId = branchId != ID.Null ? branchId.ToGuid() : Guid.Empty; } if (changes.HasFieldsChanged) { foreach (FieldChange change in changes.FieldChanges) { var fieldVersionUri = new VersionUri( change.Definition == null || change.Definition.IsShared ? null : change.Language, change.Definition == null || change.Definition.IsUnversioned ? null : change.Version); var matchingFields = current.FieldValues.Where(fv => fv.Matches(fieldVersionUri) && fv.Id.Equals(change.FieldID.ToGuid())).ToList(); if (change.RemoveField) { if (matchingFields.Any()) { current.FieldValues.Remove(matchingFields.First()); } } else { if (matchingFields.Any()) { current.FieldValues.Find(fv => fv.Matches(fieldVersionUri) && fv.Id.Equals(change.FieldID.ToGuid())).Value = change.Value; } else { current.FieldValues.Add(new FieldDto { Id = change.FieldID.ToGuid(), Language = fieldVersionUri.Language != null ? fieldVersionUri.Language.Name : null, Version = fieldVersionUri.Version != null ? fieldVersionUri.Version.Number : null as int?, Value = change.Value }); } if (change.FieldID == FieldIDs.WorkflowState) { Guid workflowStateId = Guid.Empty; Guid.TryParse(change.Value, out workflowStateId); current.WorkflowStateId = workflowStateId; } } } Provider.WritableProvider.Store(current); } return(true); }
public bool SaveItem([NotNull] ID itemID, [NotNull] ItemChanges changes) { Assert.ArgumentNotNull(itemID, "itemID"); Assert.ArgumentNotNull(changes, "changes"); var item = this.GetItem(itemID); if (item == null) { return(false); } lock (this.SyncRoot) { if (changes.HasPropertiesChanged) { var name = changes.GetPropertyValue("name") as string; item.Name = name ?? item.Name; var templateID = changes.GetPropertyValue("templateid") as ID; item.TemplateID = templateID ?? item.TemplateID; } if (changes.HasFieldsChanged) { var saveAll = changes.Item.RuntimeSettings.SaveAll; if (saveAll) { item.Fields.Shared.Clear(); item.Fields.Unversioned.Clear(); item.Fields.Versioned.Clear(); } foreach (var fieldChange in changes.FieldChanges.OfType <FieldChange>()) { var language = fieldChange.Language; var number = fieldChange.Version.Number; var fieldID = fieldChange.FieldID; if (fieldID as object == null) { continue; } var definition = fieldChange.Definition; if (definition == null) { continue; } var value = fieldChange.Value; var shared = item.Fields.Shared; var unversioned = item.Fields.Unversioned[language]; var versions = item.Fields.Versioned[language]; var versioned = versions[number]; if (fieldChange.RemoveField || value == null) { if (saveAll) { continue; } shared.Remove(fieldID); unversioned.Remove(fieldID); if (versioned != null) { versioned.Remove(fieldID); } } else if (definition.IsShared) { shared[fieldID] = value; } else if (definition.IsUnversioned) { unversioned[fieldID] = value; } else if (definition.IsVersioned) { if (versioned == null) { versioned = new JsonFieldsCollection(); versions.Add(number, versioned); } versioned[fieldID] = value; } else { throw new NotSupportedException("This situation is not supported"); } } } this.Commit(); } return(true); }
public bool SaveItem(ID itemID, ItemChanges changes) { Assert.ArgumentNotNull(itemID, nameof(itemID)); Assert.ArgumentNotNull(changes, nameof(changes)); var item = this.GetItem(itemID); if (item == null) { return false; } if (this.ReadOnly) { throw new InvalidOperationException($"The file mapping the {itemID} item belongs to is in read-only mode"); } Lock.EnterWriteLock(); try { if (changes.HasPropertiesChanged) { var name = changes.GetPropertyValue("name") as string; item.Name = name ?? item.Name; var templateID = changes.GetPropertyValue("templateid") as ID; item.TemplateID = templateID ?? item.TemplateID; } if (changes.HasFieldsChanged) { var saveAll = changes.Item.RuntimeSettings.SaveAll; if (saveAll) { item.Fields.Shared.Clear(); item.Fields.Unversioned.Clear(); item.Fields.Versioned.Clear(); } foreach (var fieldChange in changes.FieldChanges.OfType<FieldChange>()) { var language = fieldChange.Language; var number = fieldChange.Version.Number; var fieldID = fieldChange.FieldID; if (fieldID == Null.Object) { continue; } var definition = fieldChange.Definition; if (definition == null) { continue; } var value = fieldChange.Value; var shared = item.Fields.Shared; var unversioned = item.Fields.Unversioned[language]; var versions = item.Fields.Versioned[language]; var versioned = versions[number]; if (fieldChange.RemoveField || value == null) { if (saveAll) { continue; } shared.Remove(fieldID); unversioned.Remove(fieldID); versioned?.Remove(fieldID); } else if (definition.IsShared) { shared[fieldID] = value; } else if (definition.IsUnversioned) { unversioned[fieldID] = value; } else if (definition.IsVersioned) { if (versioned == null) { versioned = new JsonFieldsCollection { [FieldIDs.Created] = DateUtil.IsoNowWithTicks }; versions.Add(number, versioned); } versioned[fieldID] = value; } else { throw new NotSupportedException("This situation is not supported"); } } } } finally { Lock.ExitWriteLock(); } this.Commit(); return true; }