* Obsoletions related to Delivery API * Fix TypeLoader and TypeFinder tests * Remove obsolete and default implementations of IFileSource and IFileTypeCollection * More Delivery API related obsoletions * VariationContextAccessor related * ValueFactories obsoletion and fix references * ValueSetBuilders obsoletions * ValueConverters obsoletions * Other obsolete ctors and methods * Forgotten VariationContextAccessor obsoletion * More obsoletions * XPath related obsoletions * Revert XmlHelper changes * Delete RenamedRootNavigator and its tests * Fix test * XmlHelper obsoletion * Return null instead of GetXPathValue * Obsolete entire class instead * Remove XPath obsoletions from IPublishedCache * Remove XPath-related if-block that is no longer needed * Change obsolete msg for classes needed for NuCache * Moving classes to NuCache and making them internal * Remove more XPath-related obsoletions * Remove NavigableNavigator and its tests * Cleanup * Remove Xpath references from tests * Revert interface deletion in MediaCache * Using XOR operation Co-authored-by: Nuklon <Nuklon@users.noreply.github.com> --------- Co-authored-by: Nuklon <Nuklon@users.noreply.github.com>
101 lines
3.8 KiB
C#
101 lines
3.8 KiB
C#
using Microsoft.Extensions.Options;
|
|
using Umbraco.Cms.Core.Configuration.Models;
|
|
using Umbraco.Cms.Core.Models;
|
|
using Umbraco.Cms.Core.Serialization;
|
|
using Umbraco.Cms.Core.Serialization;
|
|
using Umbraco.Extensions;
|
|
|
|
namespace Umbraco.Cms.Core.PropertyEditors;
|
|
|
|
/// <summary>
|
|
/// Abstract base for property index value factories where the value is json.
|
|
/// </summary>
|
|
/// <typeparam name="TSerialized">The type to deserialize the json to.</typeparam>
|
|
public abstract class JsonPropertyIndexValueFactoryBase<TSerialized> : IPropertyIndexValueFactory
|
|
{
|
|
private readonly IJsonSerializer _jsonSerializer;
|
|
private IndexingSettings _indexingSettings;
|
|
|
|
protected bool ForceExplicitlyIndexEachNestedProperty { get; set; }
|
|
|
|
/// <summary>
|
|
/// Constructor for the JsonPropertyIndexValueFactoryBase.
|
|
/// </summary>
|
|
protected JsonPropertyIndexValueFactoryBase(IJsonSerializer jsonSerializer, IOptionsMonitor<IndexingSettings> indexingSettings)
|
|
{
|
|
_jsonSerializer = jsonSerializer;
|
|
_indexingSettings = indexingSettings.CurrentValue;
|
|
indexingSettings.OnChange(newValue => _indexingSettings = newValue);
|
|
}
|
|
|
|
public virtual IEnumerable<KeyValuePair<string, IEnumerable<object?>>> GetIndexValues(
|
|
IProperty property,
|
|
string? culture,
|
|
string? segment,
|
|
bool published,
|
|
IEnumerable<string> availableCultures,
|
|
IDictionary<Guid, IContentType> contentTypeDictionary)
|
|
{
|
|
var result = new List<KeyValuePair<string, IEnumerable<object?>>>();
|
|
|
|
var propertyValue = property.GetValue(culture, segment, published);
|
|
|
|
// If there is a value, it's a string and it's detected as json.
|
|
if (propertyValue is string rawValue && rawValue.DetectIsJson())
|
|
{
|
|
try
|
|
{
|
|
TSerialized? deserializedPropertyValue = _jsonSerializer.Deserialize<TSerialized>(rawValue);
|
|
|
|
if (deserializedPropertyValue is null)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
result.AddRange(Handle(deserializedPropertyValue, property, culture, segment, published, availableCultures, contentTypeDictionary));
|
|
}
|
|
catch (InvalidCastException)
|
|
{
|
|
// Swallow...on purpose, there's a chance that this isn't the json format we are looking for
|
|
// and we don't want that to affect the website.
|
|
}
|
|
catch (ArgumentException)
|
|
{
|
|
// Swallow on purpose to prevent this error:
|
|
// Can not add Newtonsoft.Json.Linq.JValue to Newtonsoft.Json.Linq.JObject.
|
|
}
|
|
}
|
|
|
|
IEnumerable<KeyValuePair<string, IEnumerable<object?>>> summary = HandleResume(result, property, culture, segment, published);
|
|
if (_indexingSettings.ExplicitlyIndexEachNestedProperty || ForceExplicitlyIndexEachNestedProperty)
|
|
{
|
|
result.AddRange(summary);
|
|
return result;
|
|
}
|
|
|
|
return summary;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Method to return a list of summary of the content. By default this returns an empty list
|
|
/// </summary>
|
|
protected virtual IEnumerable<KeyValuePair<string, IEnumerable<object?>>> HandleResume(
|
|
List<KeyValuePair<string, IEnumerable<object?>>> result,
|
|
IProperty property,
|
|
string? culture,
|
|
string? segment,
|
|
bool published) => Array.Empty<KeyValuePair<string, IEnumerable<object?>>>();
|
|
|
|
/// <summary>
|
|
/// Method that handle the deserialized object.
|
|
/// </summary>
|
|
protected abstract IEnumerable<KeyValuePair<string, IEnumerable<object?>>> Handle(
|
|
TSerialized deserializedPropertyValue,
|
|
IProperty property,
|
|
string? culture,
|
|
string? segment,
|
|
bool published,
|
|
IEnumerable<string> availableCultures,
|
|
IDictionary<Guid, IContentType> contentTypeDictionary);
|
|
}
|