using System; using System.Collections.Generic; using Umbraco.Core.Models.Membership; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; using Umbraco.Web.Cache; namespace Umbraco.Web.PublishedCache { /// /// Creates and manages IFacade. /// public interface IFacadeService : IDisposable { #region Facade /* Various places (such as Node) want to access the XML content, today as an XmlDocument * but to migrate to a new cache, they're migrating to an XPathNavigator. Still, they need * to find out how to get that navigator. * * Because a cache such as the DrippingCache is contextual ie it has a "snapshot" nothing * and remains consistent over the snapshot, the navigator should come from the "current" * snapshot. * * The service creates those snapshots in IPublishedCaches objects. * * Places such as Node need to be able to find the "current" one so the factory has a * notion of what is "current". In most cases, the IPublishedCaches object is created * and registered against an UmbracoContext, and that context is then used as "current". * * But for tests we need to have a way to specify what's the "current" object & preview. * Which is defined in PublishedCachesServiceBase. * */ /// /// Creates a facade. /// /// A preview token, or null if not previewing. /// A facade. IFacade CreateFacade(string previewToken); /// /// Gets the facade accessor. /// IFacadeAccessor FacadeAccessor { get; } /// /// Ensures that the facade has the proper environment to run. /// /// The errors, if any. /// A value indicating whether the facade has the proper environment to run. bool EnsureEnvironment(out IEnumerable errors); #endregion #region Preview /* Later on we can imagine that EnterPreview would handle a "level" that would be either * the content only, or the content's branch, or the whole tree + it could be possible * to register filters against the factory to filter out which nodes should be preview * vs non preview. * * EnterPreview() returns the previewToken. It is up to callers to store that token * wherever they want, most probably in a cookie. * */ /// /// Enters preview for specified user and content. /// /// The user. /// The content identifier. /// A preview token. /// /// Tells the caches that they should prepare any data that they would be keeping /// in order to provide preview to a give user. In the Xml cache this means creating the Xml /// file, though other caches may do things differently. /// Does not handle the preview token storage (cookie, etc) that must be handled separately. /// string EnterPreview(IUser user, int contentId); /// /// Refreshes preview for a specified content. /// /// The preview token. /// The content identifier. /// Tells the caches that they should update any data that they would be keeping /// in order to provide preview to a given user. In the Xml cache this means updating the Xml /// file, though other caches may do things differently. void RefreshPreview(string previewToken, int contentId); /// /// Exits preview for a specified preview token. /// /// The preview token. /// /// Tells the caches that they can dispose of any data that they would be keeping /// in order to provide preview to a given user. In the Xml cache this means deleting the Xml file, /// though other caches may do things differently. /// Does not handle the preview token storage (cookie, etc) that must be handled separately. /// void ExitPreview(string previewToken); #endregion #region Changes /* An IPublishedCachesService implementation can rely on transaction-level events to update * its internal, database-level data, as these events are purely internal. However, it cannot * rely on cache refreshers CacheUpdated events to update itself, as these events are external * and the order-of-execution of the handlers cannot be guaranteed, which means that some * user code may run before Umbraco is finished updating itself. Instead, the cache refreshers * explicitely notify the service of changes. * */ /// /// Notifies of content cache refresher changes. /// /// The changes. /// A value indicating whether draft contents have been changed in the cache. /// A value indicating whether published contents have been changed in the cache. void Notify(ContentCacheRefresher.JsonPayload[] payloads, out bool draftChanged, out bool publishedChanged); /// /// Notifies of media cache refresher changes. /// /// The changes. /// A value indicating whether medias have been changed in the cache. void Notify(MediaCacheRefresher.JsonPayload[] payloads, out bool anythingChanged); // there is no NotifyChanges for MemberCacheRefresher because we're not caching members. /// /// Notifies of content type refresher changes. /// /// The changes. void Notify(ContentTypeCacheRefresher.JsonPayload[] payloads); /// /// Notifies of data type refresher changes. /// /// The changes. void Notify(DataTypeCacheRefresher.JsonPayload[] payloads); /// /// Notifies of domain refresher changes. /// /// The changes. void Notify(DomainCacheRefresher.JsonPayload[] payloads); #endregion #region Property Set /// /// Creates a property set. /// /// The content type. /// The set key. /// Raw values for properties. /// A value indicating whether previewing. /// The reference cache level. /// A property set. IPropertySet CreateSet(PublishedContentType contentType, Guid key, Dictionary values, bool previewing, PropertyCacheLevel referenceCacheLevel); /// /// Creates a set property. /// /// The property type. /// The set key. /// A value indicating whether previewing. /// The reference cache level. /// The source value. /// A set property. IPublishedProperty CreateSetProperty(PublishedPropertyType propertyType, Guid setKey, bool previewing, PropertyCacheLevel referenceCacheLevel, object sourceValue = null); #endregion } }