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);
        }
Exemplo n.º 3
0
        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;
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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;
    }