public override bool CopyItem(ItemDefinition source, ItemDefinition destination, string copyName, ID copyID, CallContext context) { #if DEBUG this.Trace(true, null, source.ID, destination.ID, copyName, copyID, context); #endif // source item is in head provider if (HeadProvider.GetItemDefinition(source.ID, context) != null) { if (HeadProvider.CopyItem(source, destination, copyName, copyID, context)) { return(true); } } var database = context.DataManager.Database; var itemId = source.ID; using (new SecurityDisabler()) { var item = database.GetItem(itemId); Assert.IsNotNull(item, nameof(item)); using (var limit = new RecursionLimit($"{nameof(CopyItem)}-{item.ID}-{destination.ID}", 1)) { if (limit.Exceeded) { return(true); } var defaultOptions = ItemSerializerOptions.GetDefaultOptions(); defaultOptions.AllowDefaultValues = false; // TODO: needs checking defaultOptions.AllowStandardValues = false; defaultOptions.IncludeBlobFields = true; defaultOptions.ProcessChildren = true; // TODO: slow, needs optimization var outerXml = item.GetOuterXml(defaultOptions); var target = database.GetItem(destination.ID); Assert.IsNotNull(target, nameof(target)); target.Paste(outerXml, true, PasteMode.Overwrite); Log.Audit(this, "Default item {0} ({1}) was copied to {2} in head provider", item.Name, item.ID.ToString(), destination.ID.ToString()); return(true); } } }
private bool MigrateDefaultItem([NotNull] ItemDefinition itemDefinition, [NotNull] Item item, [NotNull] CallContext context) { Assert.ArgumentNotNull(itemDefinition, nameof(itemDefinition)); Assert.ArgumentNotNull(item, nameof(item)); Assert.ArgumentNotNull(context, nameof(context)); using (var limit = new RecursionLimit($"{nameof(MigrateDefaultItem)}-{item.ID}", 1)) { if (limit.Exceeded) { return(true); } using (new SecurityDisabler()) { var defaultOptions = ItemSerializerOptions.GetDefaultOptions(); defaultOptions.AllowDefaultValues = false; defaultOptions.AllowStandardValues = false; defaultOptions.IncludeBlobFields = true; defaultOptions.ProcessChildren = false; var outerXml = item.GetOuterXml(defaultOptions); var parent = item.Parent; Assert.IsNotNull(parent, nameof(parent)); parent.Paste(outerXml, false, PasteMode.Overwrite); Log.Audit(this, "Default item {0} ({1}) was migrated to head provider", item.Name, item.ID.ToString()); var result = MoveItem(itemDefinition, GetItemDefinition(parent.ID, context), context); if (!result) { Log.Error($"Cannot migrate default item {item.Name} ({item.ID}) to head data provider", this); } else { item.Database.RemoveFromCaches(item.ID); } return(result); } } }
public override void Serialize(Field field, JsonTextWriter writer) { Assert.ArgumentNotNull(field, nameof(field)); Assert.ArgumentNotNull(writer, nameof(writer)); using (RecursionLimit recursionLimit = new RecursionLimit(string.Format("{0}|{1}|{2}", GetType().FullName, field.Item.ID, field.ID), 1)) { if (recursionLimit.Exceeded) { return; } Item[] items = ((MultilistField)field).GetItems(); if (items == null || items.Length == 0) { writer.WritePropertyName(field.Name); writer.WriteStartArray(); writer.WriteEndArray(); } else { writer.WritePropertyName(field.Name); writer.WriteStartArray(); foreach (Item obj in items) { if (obj.IsDerived(productTemplateId)) { continue; } writer.WriteStartObject(); writer.WritePropertyName("id"); writer.WriteValue(obj.ID.Guid.ToString()); writer.WritePropertyName("fields"); writer.WriteRawValue(ItemSerializer.Serialize(obj)); writer.WriteEndObject(); } writer.WriteEndArray(); } } }