Files
Umbraco-CMS/src/Umbraco.Core/PublishedCache/PublishedElement.cs

89 lines
3.9 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Cms.Core.Models.PublishedContent;
using Umbraco.Cms.Core.PropertyEditors;
namespace Umbraco.Cms.Core.PublishedCache
{
// notes:
2017-09-26 14:57:50 +02:00
// a published element does NOT manage any tree-like elements, neither the
// original NestedContent (from Lee) nor the DetachedPublishedContent POC did.
//
2017-07-21 17:04:14 +02:00
// at the moment we do NOT support models for sets - that would require
// an entirely new models factory + not even sure it makes sense at all since
2019-01-22 09:49:35 +01:00
// sets are created manually todo yes it does! - what does this all mean?
//
public class PublishedElement : IPublishedElement
{
2017-09-25 08:59:32 +02:00
// initializes a new instance of the PublishedElement class
2017-10-31 12:48:24 +01:00
// within the context of a published snapshot service (eg a published content property value)
2022-02-21 10:12:51 +01:00
public PublishedElement(IPublishedContentType contentType, Guid key, Dictionary<string, object>? values, bool previewing,
2022-02-09 13:24:35 +01:00
PropertyCacheLevel referenceCacheLevel, IPublishedSnapshotAccessor? publishedSnapshotAccessor)
{
2017-09-29 15:51:33 +02:00
if (key == Guid.Empty) throw new ArgumentException("Empty guid.");
if (values == null) throw new ArgumentNullException(nameof(values));
2017-10-31 12:48:24 +01:00
if (referenceCacheLevel != PropertyCacheLevel.None && publishedSnapshotAccessor == null)
throw new ArgumentNullException("A published snapshot accessor is required when referenceCacheLevel != None.", nameof(publishedSnapshotAccessor));
2017-09-29 15:51:33 +02:00
ContentType = contentType ?? throw new ArgumentNullException(nameof(contentType));
Key = key;
values = GetCaseInsensitiveValueDictionary(values);
_propertiesArray = contentType
2022-02-09 13:24:35 +01:00
.PropertyTypes?
.Select(propertyType =>
{
values.TryGetValue(propertyType.Alias, out var value);
2017-10-31 12:48:24 +01:00
return (IPublishedProperty) new PublishedElementPropertyBase(propertyType, this, previewing, referenceCacheLevel, value, publishedSnapshotAccessor);
})
.ToArray();
}
2017-09-25 08:59:32 +02:00
// initializes a new instance of the PublishedElement class
2017-10-31 12:48:24 +01:00
// without any context, so it's purely 'standalone' and should NOT interfere with the published snapshot service
2017-09-29 15:51:33 +02:00
// + using an initial reference cache level of .None ensures that everything will be
// cached at .Content level - and that reference cache level will propagate to all
// properties
2019-04-15 13:04:14 +02:00
public PublishedElement(IPublishedContentType contentType, Guid key, Dictionary<string, object> values, bool previewing)
2017-09-29 15:51:33 +02:00
: this(contentType, key, values, previewing, PropertyCacheLevel.None, null)
{ }
private static Dictionary<string, object> GetCaseInsensitiveValueDictionary(Dictionary<string, object> values)
{
// ensure we ignore case for property aliases
var comparer = values.Comparer;
2017-07-21 17:04:14 +02:00
var ignoreCase = Equals(comparer, StringComparer.OrdinalIgnoreCase) || Equals(comparer, StringComparer.InvariantCultureIgnoreCase) || Equals(comparer, StringComparer.CurrentCultureIgnoreCase);
return ignoreCase ? values : new Dictionary<string, object>(values, StringComparer.OrdinalIgnoreCase);
}
#region ContentType
2019-04-15 13:04:14 +02:00
public IPublishedContentType ContentType { get; }
#endregion
2017-09-25 08:59:32 +02:00
#region PublishedElement
public Guid Key { get; }
#endregion
#region Properties
2022-02-09 13:24:35 +01:00
private readonly IPublishedProperty[]? _propertiesArray;
2022-02-09 13:24:35 +01:00
public IEnumerable<IPublishedProperty>? Properties => _propertiesArray;
2022-02-09 13:24:35 +01:00
public IPublishedProperty? GetProperty(string alias)
{
var index = ContentType.GetPropertyIndex(alias);
2022-02-09 13:24:35 +01:00
var property = index < 0 ? null : _propertiesArray?[index];
return property;
}
#endregion
}
}