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 CopyItem([NotNull] ID sourceItemID, [NotNull] ID destinationItemID, [NotNull] ID copyID, [NotNull] string copyName)
    {
      Assert.ArgumentNotNull(sourceItemID, "sourceItemID");
      Assert.ArgumentNotNull(destinationItemID, "destinationItemID");
      Assert.ArgumentNotNull(copyID, "copyID");
      Assert.ArgumentNotNull(copyName, "copyName");

      var sourceItem = this.GetItem(sourceItemID);
      if (sourceItem == null)
      {
        return false;
      }

      if (destinationItemID != this.RootID)
      {
        var destinationItem = this.GetItem(destinationItemID);
        if (destinationItem == null)
        {
          return false;
        }
      }

      if (!this.CreateItem(copyID, copyName, sourceItem.TemplateID, destinationItemID))
      {
        return false;
      }

      var copyItem = this.GetItem(copyID);
      var copyFields = copyItem.Fields;
      var copyShared = copyFields.Shared;
      var copyUnversioned = copyFields.Unversioned;
      var copyVersioned = copyFields.Versioned;
      var sourceFields = sourceItem.Fields;
      lock (this.SyncRoot)
      {
        // copy shared fields
        copyShared.Clear();
        foreach (var sourceField in sourceFields.Shared)
        {
          copyShared.Add(sourceField.Key, sourceField.Value);
        }

        // copy unversioned fields
        foreach (var languageGroup in sourceFields.Unversioned)
        {
          var language = languageGroup.Key;
          var fields = copyUnversioned[language];
          foreach (var sourceField in languageGroup.Value)
          {
            fields.Add(sourceField.Key, sourceField.Value);
          }
        }

        // copy versioned
        foreach (var languageGroup in sourceFields.Versioned)
        {
          var language = languageGroup.Key;
          var versions = copyVersioned[language];
          foreach (var versionGroup in languageGroup.Value)
          {
            var number = versionGroup.Key;
            var fields = new JsonFieldsCollection();
            versions.Add(number, fields);
            foreach (var sourceField in versionGroup.Value)
            {
              fields.Add(sourceField.Key, sourceField.Value);
            }
          }
        }

        this.Commit();
      }

      return true;
    }
    public int AddVersion([NotNull] ID itemID, [NotNull] VersionUri versionUri)
    {
      Assert.ArgumentNotNull(itemID, "itemID");
      Assert.ArgumentNotNull(versionUri, "versionUri");

      var item = this.GetItem(itemID);
      if (item == null)
      {
        return -1;
      }

      var newNumber = -1;
      var number = versionUri.Version.Number;
      var language = versionUri.Language;

      var versions = item.Fields.Versioned[language];

      lock (this.SyncRoot)
      {
        if (number > 0)
        {
          // command to try to copy existing version
          var version = versions[number];
          if (version != null)
          {
            newNumber = versions.Max(x => x.Key) + 1;

            var copiedVersion = new JsonFieldsCollection(version);
            copiedVersion.Remove(FieldIDs.WorkflowState);

            versions.Add(newNumber, copiedVersion);
          }
        }

        if (newNumber != -1)
        {
          this.Commit();

          return newNumber;
        }

        if (versions.Count == 0)
        {
          newNumber = 1;
        }
        else
        {
          newNumber = versions.Max(x => x.Key) + 1;
        }

        var newVersion = new JsonFieldsCollection();
        newVersion[FieldIDs.Created] = DateUtil.IsoNowWithTicks;

        versions.Add(newNumber, newVersion);

        this.Commit();

        return newNumber;
      }
    }
Esempio n. 4
0
        public int AddVersion([NotNull] ID itemID, [NotNull] VersionUri versionUri)
        {
            Assert.ArgumentNotNull(itemID, "itemID");
            Assert.ArgumentNotNull(versionUri, "versionUri");

            var item = this.GetItem(itemID);

            if (item == null)
            {
                return(-1);
            }

            var newNumber = -1;
            var number    = versionUri.Version.Number;
            var language  = versionUri.Language;

            var versions = item.Fields.Versioned[language];

            lock (this.SyncRoot)
            {
                if (number > 0)
                {
                    // command to try to copy existing version
                    var version = versions[number];
                    if (version != null)
                    {
                        newNumber = versions.Max(x => x.Key) + 1;

                        var copiedVersion = new JsonFieldsCollection(version);
                        copiedVersion.Remove(FieldIDs.WorkflowState);

                        versions.Add(newNumber, copiedVersion);
                    }
                }

                if (newNumber != -1)
                {
                    this.Commit();

                    return(newNumber);
                }

                if (versions.Count == 0)
                {
                    newNumber = 1;
                }
                else
                {
                    newNumber = versions.Max(x => x.Key) + 1;
                }

                var newVersion = new JsonFieldsCollection();
                newVersion[FieldIDs.Created] = DateUtil.IsoNowWithTicks;

                versions.Add(newNumber, newVersion);

                this.Commit();

                return(newNumber);
            }
        }
Esempio n. 5
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);
        }
Esempio n. 6
0
        public bool CopyItem([NotNull] ID sourceItemID, [NotNull] ID destinationItemID, [NotNull] ID copyID, [NotNull] string copyName)
        {
            Assert.ArgumentNotNull(sourceItemID, "sourceItemID");
            Assert.ArgumentNotNull(destinationItemID, "destinationItemID");
            Assert.ArgumentNotNull(copyID, "copyID");
            Assert.ArgumentNotNull(copyName, "copyName");

            var sourceItem = this.GetItem(sourceItemID);

            if (sourceItem == null)
            {
                return(false);
            }

            if (destinationItemID != this.RootID)
            {
                var destinationItem = this.GetItem(destinationItemID);
                if (destinationItem == null)
                {
                    return(false);
                }
            }

            if (!this.CreateItem(copyID, copyName, sourceItem.TemplateID, destinationItemID))
            {
                return(false);
            }

            var copyItem        = this.GetItem(copyID);
            var copyFields      = copyItem.Fields;
            var copyShared      = copyFields.Shared;
            var copyUnversioned = copyFields.Unversioned;
            var copyVersioned   = copyFields.Versioned;
            var sourceFields    = sourceItem.Fields;

            lock (this.SyncRoot)
            {
                // copy shared fields
                copyShared.Clear();
                foreach (var sourceField in sourceFields.Shared)
                {
                    copyShared.Add(sourceField.Key, sourceField.Value);
                }

                // copy unversioned fields
                foreach (var languageGroup in sourceFields.Unversioned)
                {
                    var language = languageGroup.Key;
                    var fields   = copyUnversioned[language];
                    foreach (var sourceField in languageGroup.Value)
                    {
                        fields.Add(sourceField.Key, sourceField.Value);
                    }
                }

                // copy versioned
                foreach (var languageGroup in sourceFields.Versioned)
                {
                    var language = languageGroup.Key;
                    var versions = copyVersioned[language];
                    foreach (var versionGroup in languageGroup.Value)
                    {
                        var number = versionGroup.Key;
                        var fields = new JsonFieldsCollection();
                        versions.Add(number, fields);
                        foreach (var sourceField in versionGroup.Value)
                        {
                            fields.Add(sourceField.Key, sourceField.Value);
                        }
                    }
                }

                this.Commit();
            }

            return(true);
        }
    private void ChangeFieldSharingToVersioned([NotNull] JsonItem item, [NotNull] ID fieldID)
    {
      Assert.ArgumentNotNull(item, nameof(item));
      Assert.ArgumentNotNull(fieldID, nameof(fieldID));

      // find value among shared
      var fields = item.Fields;
      var fieldValue = fields.Shared[fieldID];

      // if found among shared
      if (fieldValue != null)
      {
        // set same "shared" value in all versions of all languages
        foreach (var languageVersions in fields.Versioned.Values)
        {
          if (languageVersions == null)
          {
            continue;
          }

          foreach (var versionFields in languageVersions.Values)
          {
            if (versionFields != null)
            {
              versionFields[fieldID] = fieldValue;
            }
          }
        }
      }
      else // find value among unversioned
      {
        var allLanguages = fields.GetAllLanguages();
        foreach (var language in allLanguages)
        {
          if (fields.Unversioned.ContainsKey(language))
          {
            fieldValue = fields.Unversioned[language][fieldID];
          }

          // if value was found then 
          if (fieldValue != null)
          {
            // set unversioned value in all versions
            var versions = fields.Versioned[language];
            if (versions.Count == 0)
            {
              var fieldCollection = new JsonFieldsCollection
              {
                [FieldIDs.Created] = DateUtil.IsoNowWithTicks
              };

              versions.Add(1, fieldCollection);
            }

            foreach (var versionFields in versions.Values)
            {
              versionFields[fieldID] = fieldValue;
            }
          }
        }
      }

      // remove invalid values
      fields.Shared.Remove(fieldID);
      fields.Unversioned.RemoveField(fieldID);
    }
    protected JsonItem DoCopy(ID sourceItemID, ID destinationItemID, ID copyID, string copyName, CallContext context)
    {
      var source = context.DataManager.Database.GetItem(sourceItemID);
      var item = new JsonItem(copyID, destinationItemID)
      {
        Name = copyName,
        TemplateID = source.TemplateID
      };

      var sharedIds = source.Template.Fields.Where(x => x.IsShared).Select(x => x.ID).ToArray();
      foreach (var fieldId in sharedIds)
      {
        if (JsonDataProvider.IgnoreFields.Keys.Contains(fieldId))
        {
          continue;
        }

        var field = source.Fields[fieldId];
        var value = field.GetValue(false, false, false, false);
        if (value == null)
        {
          continue;
        }

        item.Fields.Shared[fieldId] = value;
      }

      var unversionedIds = source.Template.Fields.Where(x => x.IsUnversioned).Select(x => x.ID).ToArray();
      foreach (var language in source.Languages)
      {
        var version = source.Versions.GetLatestVersion(language);
        var json = item.Fields.Unversioned[language];
        foreach (var fieldId in unversionedIds)
        {
          if (JsonDataProvider.IgnoreFields.Keys.Contains(fieldId))
          {
            continue;
          }

          var field = version.Fields[fieldId];
          var value = field.GetValue(false, false, false, false);
          if (value == null)
          {
            continue;
          }

          json[fieldId] = value;
        }
      }

      var versionedIds = source.Template.Fields.Where(x => !x.IsShared && !x.IsUnversioned).Select(x => x.ID).ToArray();
      foreach (var language in source.Languages)
      {
        var sourceVersion = source.Versions.GetLatestVersion(language);
        var jsonVersions = item.Fields.Versioned[language];
        foreach (var version in sourceVersion.Versions.GetVersions())
        {
          var json = new JsonFieldsCollection();
          foreach (var fieldId in versionedIds)
          {
            if (JsonDataProvider.IgnoreFields.Keys.Contains(fieldId))
            {
              continue;
            }

            var field = version.Fields[fieldId];
            var value = field.GetValue(false, false, false, false);
            if (value == null)
            {
              continue;
            }

            json[fieldId] = value;
          }

          jsonVersions.Add(version.Version.Number, json);
        }
      }

      return item;
    }
    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;
    }
    public int AddVersion(ID itemID, VersionUri versionUri)
    {
      Assert.ArgumentNotNull(itemID, nameof(itemID));
      Assert.ArgumentNotNull(versionUri, nameof(versionUri));

      JsonItem item;

      item = this.GetItem(itemID);
      if (item == null)
      {
        return -1;
      }

      if (this.ReadOnly)
      {
        throw new InvalidOperationException($"The file mapping the {itemID} item is in read-only mode");
      }

      var newNumber = -1;
      var number = versionUri.Version.Number;
      var language = versionUri.Language;

      Lock.EnterWriteLock();
      var locked = true;
      try
      {
        var versions = item.Fields.Versioned[language];

        if (number > 0)
        {
          // command to try to copy existing version
          var version = versions[number];
          if (version != null)
          {
            newNumber = versions.Max(x => x.Key) + 1;

            var copiedVersion = new JsonFieldsCollection(version);
            copiedVersion.Remove(FieldIDs.WorkflowState);

            versions.Add(newNumber, copiedVersion);
          }
        }

        if (newNumber != -1)
        {
          // unlock to commit
          Lock.ExitWriteLock();
          locked = false;

          this.Commit();

          return newNumber;
        }

        if (versions.Count == 0)
        {
          newNumber = 1;
        }
        else
        {
          newNumber = versions.Max(x => x.Key) + 1;
        }

        var newVersion = new JsonFieldsCollection
        {
          [FieldIDs.Created] = DateUtil.IsoNowWithTicks
        };

        versions.Add(newNumber, newVersion);
      }
      finally
      {
        if (locked)
        {
          Lock.ExitWriteLock();
        }
      }

      this.Commit();

      return newNumber;
    }