using System; using System.Collections.Generic; using System.Linq; using System.Xml.XPath; using Umbraco.Cms.Core.Models.PublishedContent; using Umbraco.Cms.Core.Xml; using Umbraco.Extensions; namespace Umbraco.Cms.Core.PublishedCache { public abstract class PublishedCacheBase : IPublishedCache { private readonly IVariationContextAccessor? _variationContextAccessor; public PublishedCacheBase(IVariationContextAccessor variationContextAccessor) { _variationContextAccessor = variationContextAccessor ?? throw new ArgumentNullException(nameof(variationContextAccessor)); } public bool PreviewDefault { get; } protected PublishedCacheBase(bool previewDefault) { PreviewDefault = previewDefault; } public abstract IPublishedContent? GetById(bool preview, int contentId); public IPublishedContent? GetById(int contentId) => GetById(PreviewDefault, contentId); public abstract IPublishedContent GetById(bool preview, Guid contentId); public IPublishedContent GetById(Guid contentId) => GetById(PreviewDefault, contentId); public abstract IPublishedContent GetById(bool preview, Udi contentId); public IPublishedContent GetById(Udi contentId) => GetById(PreviewDefault, contentId); public abstract bool HasById(bool preview, int contentId); public bool HasById(int contentId) => HasById(PreviewDefault, contentId); public abstract IEnumerable GetAtRoot(bool preview, string? culture = null); public IEnumerable GetAtRoot(string? culture = null) { return GetAtRoot(PreviewDefault, culture); } public abstract IPublishedContent GetSingleByXPath(bool preview, string xpath, XPathVariable[] vars); public IPublishedContent GetSingleByXPath(string xpath, XPathVariable[] vars) { return GetSingleByXPath(PreviewDefault, xpath, vars); } public abstract IPublishedContent GetSingleByXPath(bool preview, XPathExpression xpath, XPathVariable[] vars); public IPublishedContent GetSingleByXPath(XPathExpression xpath, XPathVariable[] vars) { return GetSingleByXPath(PreviewDefault, xpath, vars); } public abstract IEnumerable GetByXPath(bool preview, string xpath, XPathVariable[] vars); public IEnumerable GetByXPath(string xpath, XPathVariable[] vars) { return GetByXPath(PreviewDefault, xpath, vars); } public abstract IEnumerable GetByXPath(bool preview, XPathExpression xpath, XPathVariable[] vars); public IEnumerable GetByXPath(XPathExpression xpath, XPathVariable[] vars) { return GetByXPath(PreviewDefault, xpath, vars); } public abstract XPathNavigator CreateNavigator(bool preview); public XPathNavigator CreateNavigator() { return CreateNavigator(PreviewDefault); } public abstract XPathNavigator CreateNodeNavigator(int id, bool preview); public abstract bool HasContent(bool preview); public bool HasContent() { return HasContent(PreviewDefault); } public abstract IPublishedContentType GetContentType(int id); public abstract IPublishedContentType GetContentType(string alias); public abstract IPublishedContentType GetContentType(Guid key); public virtual IEnumerable GetByContentType(IPublishedContentType contentType) { // this is probably not super-efficient, but works // some cache implementation may want to override it, though return GetAtRoot() .SelectMany(x => x.DescendantsOrSelf(_variationContextAccessor!)) .Where(x => x.ContentType.Id == contentType.Id); } } }