V10: Fix build warnings in core (#12438)
* Run code cleanup * Start manual cleanup after dotnet format * Finish up manual pass * Fix up missed warnings * Fix after merge * Update src/Umbraco.Core/Cache/ContentTypeCacheRefresher.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/DataTypeCacheRefresher.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/DeepCloneAppCache.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/DomainCacheRefresher.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/FastDictionaryAppCacheBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/FastDictionaryAppCacheBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/FastDictionaryAppCacheBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/FastDictionaryAppCacheBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/FastDictionaryAppCacheBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/MacroCacheRefresher.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/MediaCacheRefresher.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/MemberCacheRefresher.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/MemberGroupCacheRefresher.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Composing/OrderedCollectionBuilderBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Configuration/Models/RequestHandlerSettings.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Composing/SetCollectionBuilderBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Composing/WeightedCollectionBuilderBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/ContentApps/ContentAppFactoryCollectionBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Dashboards/DashboardCollectionBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/ContentTypeRefreshedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/ContentTypeSavedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/ContentTypeSavingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/DictionaryCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/DataTypeCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/ContentUnpublishingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/DictionaryItemDeletingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/DictionaryItemSavedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/DictionaryItemSavingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/DomainCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/LanguageCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MacroCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaEmptiedRecycleBinNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaEmptyingRecycleBinNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaMovedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaMovedToRecycleBinNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaMovedToRecycleBinNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaMovingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaMovingToRecycleBinNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaTreeChangeNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaTreeChangeNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaTypeChangedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaTypeDeletingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaTypeMovedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaTypeMovingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaTypeMovingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaTypeRefreshedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberGroupCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberGroupDeletingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberGroupSavedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberGroupSavingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberTypeChangedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberTypeDeletedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberTypeDeletingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberTypeMovedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberTypeMovedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberTypeMovingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberTypeMovingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberTypeRefreshedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberTypeSavingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/UriExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MovedToRecycleBinNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MovedToRecycleBinNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MovingToRecycleBinNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MovingToRecycleBinNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PartialViewDeletingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/UriExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/IO/PhysicalFileSystem.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/IO/PhysicalFileSystem.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/IO/ShadowWrapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Logging/DisposableTimer.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Install/InstallSteps/UpgradeStep.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Mapping/MapDefinitionCollectionBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Media/EmbedProviders/EmbedProvidersCollectionBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PartialViewSavedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Models/ContentEditing/ContentVariationDisplay.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PartialViewSavingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PublicAccessCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PublicAccessEntryDeletedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PublicAccessEntryDeletingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PublicAccessEntryDeletingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PublicAccessEntrySavedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PublicAccessEntrySavingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PublicAccessEntrySavingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/RelationTypeCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/RelationTypeDeletingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/RelationTypeSavedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/RelationTypeSavingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/StatefulNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/StylesheetDeletingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/StylesheetSavingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Models/DeepCloneHelper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Models/File.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Models/PropertyGroupExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Models/PropertyGroupExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Fix based on review * Fix after merge Signed-off-by: Zeegaan <nge@umbraco.dk> Co-authored-by: Nikolaj Geisle <niko737@edu.ucl.dk> Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> Co-authored-by: Zeegaan <nge@umbraco.dk>
This commit is contained in:
@@ -1,197 +1,224 @@
|
||||
using System;
|
||||
using Umbraco.Cms.Core.Cache;
|
||||
using Umbraco.Cms.Core.Models.PublishedContent;
|
||||
using Umbraco.Cms.Core.PropertyEditors;
|
||||
using Umbraco.Extensions;
|
||||
|
||||
namespace Umbraco.Cms.Core.PublishedCache
|
||||
namespace Umbraco.Cms.Core.PublishedCache;
|
||||
|
||||
internal class PublishedElementPropertyBase : PublishedPropertyBase
|
||||
{
|
||||
internal class PublishedElementPropertyBase : PublishedPropertyBase
|
||||
protected readonly IPublishedElement Element;
|
||||
|
||||
// define constant - determines whether to use cache when previewing
|
||||
// to store eg routes, property converted values, anything - caching
|
||||
// means faster execution, but uses memory - not sure if we want it
|
||||
// so making it configurable.
|
||||
private const bool FullCacheWhenPreviewing = true;
|
||||
private readonly object _locko = new();
|
||||
private readonly IPublishedSnapshotAccessor? _publishedSnapshotAccessor;
|
||||
private readonly object? _sourceValue;
|
||||
protected readonly bool IsMember;
|
||||
protected readonly bool IsPreviewing;
|
||||
private CacheValues? _cacheValues;
|
||||
|
||||
private bool _interInitialized;
|
||||
private object? _interValue;
|
||||
private string? _valuesCacheKey;
|
||||
|
||||
public PublishedElementPropertyBase(
|
||||
IPublishedPropertyType propertyType,
|
||||
IPublishedElement element,
|
||||
bool previewing,
|
||||
PropertyCacheLevel referenceCacheLevel,
|
||||
object? sourceValue = null,
|
||||
IPublishedSnapshotAccessor? publishedSnapshotAccessor = null)
|
||||
: base(propertyType, referenceCacheLevel)
|
||||
{
|
||||
private readonly object _locko = new object();
|
||||
private readonly object? _sourceValue;
|
||||
private readonly IPublishedSnapshotAccessor? _publishedSnapshotAccessor;
|
||||
_sourceValue = sourceValue;
|
||||
_publishedSnapshotAccessor = publishedSnapshotAccessor;
|
||||
Element = element;
|
||||
IsPreviewing = previewing;
|
||||
IsMember = propertyType.ContentType?.ItemType == PublishedItemType.Member;
|
||||
}
|
||||
|
||||
protected readonly IPublishedElement Element;
|
||||
protected readonly bool IsPreviewing;
|
||||
protected readonly bool IsMember;
|
||||
// used to cache the CacheValues of this property
|
||||
// ReSharper disable InconsistentlySynchronizedField
|
||||
internal string ValuesCacheKey => _valuesCacheKey ??= PropertyCacheValues(Element.Key, Alias, IsPreviewing);
|
||||
|
||||
private bool _interInitialized;
|
||||
private object? _interValue;
|
||||
private CacheValues? _cacheValues;
|
||||
private string? _valuesCacheKey;
|
||||
public static string PropertyCacheValues(Guid contentUid, string typeAlias, bool previewing) =>
|
||||
"PublishedSnapshot.Property.CacheValues[" + (previewing ? "D:" : "P:") + contentUid + ":" + typeAlias + "]";
|
||||
|
||||
// define constant - determines whether to use cache when previewing
|
||||
// to store eg routes, property converted values, anything - caching
|
||||
// means faster execution, but uses memory - not sure if we want it
|
||||
// so making it configurable.
|
||||
private const bool FullCacheWhenPreviewing = true;
|
||||
|
||||
public PublishedElementPropertyBase(IPublishedPropertyType propertyType, IPublishedElement element, bool previewing, PropertyCacheLevel referenceCacheLevel, object? sourceValue = null, IPublishedSnapshotAccessor? publishedSnapshotAccessor = null)
|
||||
: base(propertyType, referenceCacheLevel)
|
||||
// ReSharper restore InconsistentlySynchronizedField
|
||||
public override bool HasValue(string? culture = null, string? segment = null)
|
||||
{
|
||||
var hasValue = PropertyType.IsValue(_sourceValue, PropertyValueLevel.Source);
|
||||
if (hasValue.HasValue)
|
||||
{
|
||||
_sourceValue = sourceValue;
|
||||
_publishedSnapshotAccessor = publishedSnapshotAccessor;
|
||||
Element = element;
|
||||
IsPreviewing = previewing;
|
||||
IsMember = propertyType.ContentType?.ItemType == PublishedItemType.Member;
|
||||
return hasValue.Value;
|
||||
}
|
||||
|
||||
public override bool HasValue(string? culture = null, string? segment = null)
|
||||
GetCacheLevels(out PropertyCacheLevel cacheLevel, out PropertyCacheLevel referenceCacheLevel);
|
||||
|
||||
lock (_locko)
|
||||
{
|
||||
var hasValue = PropertyType.IsValue(_sourceValue, PropertyValueLevel.Source);
|
||||
if (hasValue.HasValue) return hasValue.Value;
|
||||
|
||||
GetCacheLevels(out var cacheLevel, out var referenceCacheLevel);
|
||||
|
||||
lock (_locko)
|
||||
var value = GetInterValue();
|
||||
hasValue = PropertyType.IsValue(value, PropertyValueLevel.Inter);
|
||||
if (hasValue.HasValue)
|
||||
{
|
||||
var value = GetInterValue();
|
||||
hasValue = PropertyType.IsValue(value, PropertyValueLevel.Inter);
|
||||
if (hasValue.HasValue) return hasValue.Value;
|
||||
|
||||
var cacheValues = GetCacheValues(cacheLevel);
|
||||
if (!cacheValues.ObjectInitialized)
|
||||
{
|
||||
cacheValues.ObjectValue = PropertyType.ConvertInterToObject(Element, referenceCacheLevel, value, IsPreviewing);
|
||||
cacheValues.ObjectInitialized = true;
|
||||
}
|
||||
value = cacheValues.ObjectValue;
|
||||
return PropertyType.IsValue(value, PropertyValueLevel.Object) ?? false;
|
||||
return hasValue.Value;
|
||||
}
|
||||
|
||||
CacheValues cacheValues = GetCacheValues(cacheLevel);
|
||||
if (!cacheValues.ObjectInitialized)
|
||||
{
|
||||
cacheValues.ObjectValue =
|
||||
PropertyType.ConvertInterToObject(Element, referenceCacheLevel, value, IsPreviewing);
|
||||
cacheValues.ObjectInitialized = true;
|
||||
}
|
||||
|
||||
value = cacheValues.ObjectValue;
|
||||
return PropertyType.IsValue(value, PropertyValueLevel.Object) ?? false;
|
||||
}
|
||||
}
|
||||
|
||||
public override object? GetSourceValue(string? culture = null, string? segment = null) => _sourceValue;
|
||||
|
||||
private void GetCacheLevels(out PropertyCacheLevel cacheLevel, out PropertyCacheLevel referenceCacheLevel)
|
||||
{
|
||||
// based upon the current reference cache level (ReferenceCacheLevel) and this property
|
||||
// cache level (PropertyType.CacheLevel), determines both the actual cache level for the
|
||||
// property, and the new reference cache level.
|
||||
|
||||
// if the property cache level is 'shorter-termed' that the reference
|
||||
// then use it and it becomes the new reference, else use Content and
|
||||
// don't change the reference.
|
||||
//
|
||||
// examples:
|
||||
// currently (reference) caching at published snapshot, property specifies
|
||||
// elements, ok to use element. OTOH, currently caching at elements,
|
||||
// property specifies snapshot, need to use snapshot.
|
||||
if (PropertyType.CacheLevel > ReferenceCacheLevel || PropertyType.CacheLevel == PropertyCacheLevel.None)
|
||||
{
|
||||
cacheLevel = PropertyType.CacheLevel;
|
||||
referenceCacheLevel = cacheLevel;
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheLevel = PropertyCacheLevel.Element;
|
||||
referenceCacheLevel = ReferenceCacheLevel;
|
||||
}
|
||||
}
|
||||
|
||||
private IAppCache? GetSnapshotCache()
|
||||
{
|
||||
// cache within the snapshot cache, unless previewing, then use the snapshot or
|
||||
// elements cache (if we don't want to pollute the elements cache with short-lived
|
||||
// data) depending on settings
|
||||
// for members, always cache in the snapshot cache - never pollute elements cache
|
||||
if (_publishedSnapshotAccessor is null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// used to cache the CacheValues of this property
|
||||
// ReSharper disable InconsistentlySynchronizedField
|
||||
internal string ValuesCacheKey => _valuesCacheKey
|
||||
?? (_valuesCacheKey = PropertyCacheValues(Element.Key, Alias, IsPreviewing));
|
||||
// ReSharper restore InconsistentlySynchronizedField
|
||||
|
||||
protected class CacheValues
|
||||
if (!_publishedSnapshotAccessor.TryGetPublishedSnapshot(out IPublishedSnapshot? publishedSnapshot))
|
||||
{
|
||||
public bool ObjectInitialized;
|
||||
public object? ObjectValue;
|
||||
public bool XPathInitialized;
|
||||
public object? XPathValue;
|
||||
return null;
|
||||
}
|
||||
|
||||
public static string PropertyCacheValues(Guid contentUid, string typeAlias, bool previewing) => "PublishedSnapshot.Property.CacheValues[" + (previewing ? "D:" : "P:") + contentUid + ":" + typeAlias + "]";
|
||||
return (IsPreviewing == false || FullCacheWhenPreviewing) && IsMember == false
|
||||
? publishedSnapshot!.ElementsCache
|
||||
: publishedSnapshot!.SnapshotCache;
|
||||
}
|
||||
|
||||
private void GetCacheLevels(out PropertyCacheLevel cacheLevel, out PropertyCacheLevel referenceCacheLevel)
|
||||
private CacheValues GetCacheValues(PropertyCacheLevel cacheLevel)
|
||||
{
|
||||
CacheValues cacheValues;
|
||||
switch (cacheLevel)
|
||||
{
|
||||
// based upon the current reference cache level (ReferenceCacheLevel) and this property
|
||||
// cache level (PropertyType.CacheLevel), determines both the actual cache level for the
|
||||
// property, and the new reference cache level.
|
||||
case PropertyCacheLevel.None:
|
||||
// never cache anything
|
||||
cacheValues = new CacheValues();
|
||||
break;
|
||||
case PropertyCacheLevel.Element:
|
||||
// cache within the property object itself, ie within the content object
|
||||
cacheValues = _cacheValues ??= new CacheValues();
|
||||
break;
|
||||
case PropertyCacheLevel.Elements:
|
||||
// cache within the elements cache, depending...
|
||||
IAppCache? snapshotCache = GetSnapshotCache();
|
||||
cacheValues = (CacheValues?)snapshotCache?.Get(ValuesCacheKey, () => new CacheValues()) ??
|
||||
new CacheValues();
|
||||
break;
|
||||
case PropertyCacheLevel.Snapshot:
|
||||
IPublishedSnapshot? publishedSnapshot = _publishedSnapshotAccessor?.GetRequiredPublishedSnapshot();
|
||||
|
||||
// if the property cache level is 'shorter-termed' that the reference
|
||||
// then use it and it becomes the new reference, else use Content and
|
||||
// don't change the reference.
|
||||
//
|
||||
// examples:
|
||||
// currently (reference) caching at published snapshot, property specifies
|
||||
// elements, ok to use element. OTOH, currently caching at elements,
|
||||
// property specifies snapshot, need to use snapshot.
|
||||
//
|
||||
if (PropertyType.CacheLevel > ReferenceCacheLevel || PropertyType.CacheLevel == PropertyCacheLevel.None)
|
||||
{
|
||||
cacheLevel = PropertyType.CacheLevel;
|
||||
referenceCacheLevel = cacheLevel;
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheLevel = PropertyCacheLevel.Element;
|
||||
referenceCacheLevel = ReferenceCacheLevel;
|
||||
}
|
||||
// cache within the snapshot cache
|
||||
IAppCache? facadeCache = publishedSnapshot?.SnapshotCache;
|
||||
cacheValues = (CacheValues?)facadeCache?.Get(ValuesCacheKey, () => new CacheValues()) ??
|
||||
new CacheValues();
|
||||
break;
|
||||
default:
|
||||
throw new InvalidOperationException("Invalid cache level.");
|
||||
}
|
||||
|
||||
private IAppCache? GetSnapshotCache()
|
||||
return cacheValues;
|
||||
}
|
||||
|
||||
private object? GetInterValue()
|
||||
{
|
||||
if (_interInitialized)
|
||||
{
|
||||
// cache within the snapshot cache, unless previewing, then use the snapshot or
|
||||
// elements cache (if we don't want to pollute the elements cache with short-lived
|
||||
// data) depending on settings
|
||||
// for members, always cache in the snapshot cache - never pollute elements cache
|
||||
if (_publishedSnapshotAccessor is null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!_publishedSnapshotAccessor.TryGetPublishedSnapshot(out var publishedSnapshot))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return (IsPreviewing == false || FullCacheWhenPreviewing) && IsMember == false
|
||||
? publishedSnapshot!.ElementsCache
|
||||
: publishedSnapshot!.SnapshotCache;
|
||||
}
|
||||
|
||||
private CacheValues GetCacheValues(PropertyCacheLevel cacheLevel)
|
||||
{
|
||||
CacheValues cacheValues;
|
||||
switch (cacheLevel)
|
||||
{
|
||||
case PropertyCacheLevel.None:
|
||||
// never cache anything
|
||||
cacheValues = new CacheValues();
|
||||
break;
|
||||
case PropertyCacheLevel.Element:
|
||||
// cache within the property object itself, ie within the content object
|
||||
cacheValues = _cacheValues ?? (_cacheValues = new CacheValues());
|
||||
break;
|
||||
case PropertyCacheLevel.Elements:
|
||||
// cache within the elements cache, depending...
|
||||
var snapshotCache = GetSnapshotCache();
|
||||
cacheValues = (CacheValues?) snapshotCache?.Get(ValuesCacheKey, () => new CacheValues()) ?? new CacheValues();
|
||||
break;
|
||||
case PropertyCacheLevel.Snapshot:
|
||||
var publishedSnapshot = _publishedSnapshotAccessor?.GetRequiredPublishedSnapshot();
|
||||
// cache within the snapshot cache
|
||||
var facadeCache = publishedSnapshot?.SnapshotCache;
|
||||
cacheValues = (CacheValues?) facadeCache?.Get(ValuesCacheKey, () => new CacheValues()) ?? new CacheValues();
|
||||
break;
|
||||
default:
|
||||
throw new InvalidOperationException("Invalid cache level.");
|
||||
}
|
||||
return cacheValues;
|
||||
}
|
||||
|
||||
private object? GetInterValue()
|
||||
{
|
||||
if (_interInitialized) return _interValue;
|
||||
|
||||
_interValue = PropertyType.ConvertSourceToInter(Element, _sourceValue, IsPreviewing);
|
||||
_interInitialized = true;
|
||||
return _interValue;
|
||||
}
|
||||
|
||||
public override object? GetSourceValue(string? culture = null, string? segment = null) => _sourceValue;
|
||||
_interValue = PropertyType.ConvertSourceToInter(Element, _sourceValue, IsPreviewing);
|
||||
_interInitialized = true;
|
||||
return _interValue;
|
||||
}
|
||||
|
||||
public override object? GetValue(string? culture = null, string? segment = null)
|
||||
public override object? GetValue(string? culture = null, string? segment = null)
|
||||
{
|
||||
GetCacheLevels(out PropertyCacheLevel cacheLevel, out PropertyCacheLevel referenceCacheLevel);
|
||||
|
||||
lock (_locko)
|
||||
{
|
||||
GetCacheLevels(out var cacheLevel, out var referenceCacheLevel);
|
||||
|
||||
lock (_locko)
|
||||
CacheValues cacheValues = GetCacheValues(cacheLevel);
|
||||
if (cacheValues.ObjectInitialized)
|
||||
{
|
||||
var cacheValues = GetCacheValues(cacheLevel);
|
||||
if (cacheValues.ObjectInitialized) return cacheValues.ObjectValue;
|
||||
cacheValues.ObjectValue = PropertyType.ConvertInterToObject(Element, referenceCacheLevel, GetInterValue(), IsPreviewing);
|
||||
cacheValues.ObjectInitialized = true;
|
||||
return cacheValues.ObjectValue;
|
||||
}
|
||||
}
|
||||
|
||||
public override object? GetXPathValue(string? culture = null, string? segment = null)
|
||||
{
|
||||
GetCacheLevels(out var cacheLevel, out var referenceCacheLevel);
|
||||
|
||||
lock (_locko)
|
||||
{
|
||||
var cacheValues = GetCacheValues(cacheLevel);
|
||||
if (cacheValues.XPathInitialized) return cacheValues.XPathValue;
|
||||
cacheValues.XPathValue = PropertyType.ConvertInterToXPath(Element, referenceCacheLevel, GetInterValue(), IsPreviewing);
|
||||
cacheValues.XPathInitialized = true;
|
||||
return cacheValues.XPathValue;
|
||||
}
|
||||
cacheValues.ObjectValue =
|
||||
PropertyType.ConvertInterToObject(Element, referenceCacheLevel, GetInterValue(), IsPreviewing);
|
||||
cacheValues.ObjectInitialized = true;
|
||||
return cacheValues.ObjectValue;
|
||||
}
|
||||
}
|
||||
|
||||
public override object? GetXPathValue(string? culture = null, string? segment = null)
|
||||
{
|
||||
GetCacheLevels(out PropertyCacheLevel cacheLevel, out PropertyCacheLevel referenceCacheLevel);
|
||||
|
||||
lock (_locko)
|
||||
{
|
||||
CacheValues cacheValues = GetCacheValues(cacheLevel);
|
||||
if (cacheValues.XPathInitialized)
|
||||
{
|
||||
return cacheValues.XPathValue;
|
||||
}
|
||||
|
||||
cacheValues.XPathValue =
|
||||
PropertyType.ConvertInterToXPath(Element, referenceCacheLevel, GetInterValue(), IsPreviewing);
|
||||
cacheValues.XPathInitialized = true;
|
||||
return cacheValues.XPathValue;
|
||||
}
|
||||
}
|
||||
|
||||
protected class CacheValues
|
||||
{
|
||||
public bool ObjectInitialized;
|
||||
public object? ObjectValue;
|
||||
public bool XPathInitialized;
|
||||
public object? XPathValue;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user