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

99 lines
3.8 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.PropertyEditors;
namespace Umbraco.Web.PublishedCache
{
// notes:
2017-07-21 17:04:14 +02:00
// a property set 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
2017-07-21 17:04:14 +02:00
// sets are created manually
//
2017-09-25 08:59:32 +02:00
internal class PublishedElement : IPublishedElement
{
2017-09-25 08:59:32 +02:00
// initializes a new instance of the PublishedElement class
// within the context of a facade service (eg a published content property value)
2017-09-25 08:59:32 +02:00
public PublishedElement(PublishedContentType contentType, Guid key, Dictionary<string, object> values, bool previewing,
2017-07-21 17:04:14 +02:00
IFacadeService facadeService, PropertyCacheLevel referenceCacheLevel)
{
ContentType = contentType;
Key = key;
values = GetCaseInsensitiveValueDictionary(values);
_propertiesArray = contentType
.PropertyTypes
.Select(propertyType =>
{
2017-07-21 17:04:14 +02:00
values.TryGetValue(propertyType.PropertyTypeAlias, out object value);
return facadeService.CreateSetProperty(propertyType, this, previewing, referenceCacheLevel, value);
})
.ToArray();
}
2017-09-25 08:59:32 +02:00
// initializes a new instance of the PublishedElement class
// without any context, so it's purely 'standalone' and should NOT interfere with the facade service
2017-09-25 08:59:32 +02:00
public PublishedElement(PublishedContentType contentType, Guid key, Dictionary<string, object> values, bool previewing)
{
ContentType = contentType;
Key = key;
values = GetCaseInsensitiveValueDictionary(values);
2017-07-21 17:04:14 +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
const PropertyCacheLevel cacheLevel = PropertyCacheLevel.None;
_propertiesArray = contentType
.PropertyTypes
.Select(propertyType =>
{
2017-07-21 17:04:14 +02:00
values.TryGetValue(propertyType.PropertyTypeAlias, out object value);
2017-09-25 08:59:32 +02:00
return (IPublishedProperty) new PublishedElementProperty(propertyType, this, previewing, cacheLevel, value);
})
.ToArray();
}
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
public PublishedContentType ContentType { get; }
#endregion
2017-09-25 08:59:32 +02:00
#region PublishedElement
public Guid Key { get; }
#endregion
#region Properties
private readonly IPublishedProperty[] _propertiesArray;
public IEnumerable<IPublishedProperty> Properties => _propertiesArray;
public IPublishedProperty GetProperty(string alias)
{
var index = ContentType.GetPropertyIndex(alias);
var property = index < 0 ? null : _propertiesArray[index];
return property;
}
#endregion
}
}