Files
Umbraco-CMS/src/Umbraco.Web/PublishedCache/NuCache/ContentNode.cs

173 lines
7.2 KiB
C#
Raw Normal View History

2016-05-27 14:26:28 +02:00
using System;
using System.Collections.Generic;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Web.PublishedCache.NuCache.DataSource;
namespace Umbraco.Web.PublishedCache.NuCache
{
// represents a content "node" ie a pair of draft + published versions
// internal, never exposed, to be accessed from ContentStore (only!)
internal class ContentNode
{
// special ctor with no content data - for members
public ContentNode(int id, Guid uid, PublishedContentType contentType,
int level, string path, int sortOrder,
int parentContentId,
DateTime createDate, int creatorId)
{
Id = id;
Uid = uid;
ContentType = contentType;
Level = level;
Path = path;
SortOrder = sortOrder;
ParentContentId = parentContentId;
CreateDate = createDate;
CreatorId = creatorId;
ChildContentIds = new List<int>();
}
public ContentNode(int id, Guid uid, PublishedContentType contentType,
int level, string path, int sortOrder,
int parentContentId,
DateTime createDate, int creatorId,
2016-05-30 19:54:36 +02:00
ContentData draftData, ContentData publishedData,
IPublishedSnapshotAccessor publishedSnapshotAccessor,
2018-04-30 21:29:49 +02:00
IVariationContextAccessor variationContextAccessor)
2016-05-27 14:26:28 +02:00
: this(id, uid, level, path, sortOrder, parentContentId, createDate, creatorId)
{
2018-04-30 21:29:49 +02:00
SetContentTypeAndData(contentType, draftData, publishedData, publishedSnapshotAccessor, variationContextAccessor);
2016-05-27 14:26:28 +02:00
}
// 2-phases ctor, phase 1
public ContentNode(int id, Guid uid,
int level, string path, int sortOrder,
int parentContentId,
DateTime createDate, int creatorId)
{
Id = id;
Uid = uid;
Level = level;
Path = path;
SortOrder = sortOrder;
ParentContentId = parentContentId;
CreateDate = createDate;
CreatorId = creatorId;
ChildContentIds = new List<int>();
}
// two-phase ctor, phase 2
2018-04-30 21:29:49 +02:00
public void SetContentTypeAndData(PublishedContentType contentType, ContentData draftData, ContentData publishedData, IPublishedSnapshotAccessor publishedSnapshotAccessor, IVariationContextAccessor variationContextAccessor)
2016-05-27 14:26:28 +02:00
{
ContentType = contentType;
if (draftData == null && publishedData == null)
throw new ArgumentException("Both draftData and publishedData cannot be null at the same time.");
if (draftData != null)
2019-01-28 14:15:47 +01:00
DraftModel = new PublishedContent(this, draftData, publishedSnapshotAccessor, variationContextAccessor).CreateModel();
2016-05-27 14:26:28 +02:00
if (publishedData != null)
2019-01-28 14:15:47 +01:00
PublishedModel = new PublishedContent(this, publishedData, publishedSnapshotAccessor, variationContextAccessor).CreateModel();
2016-05-27 14:26:28 +02:00
}
// clone parent
2017-07-12 14:09:31 +02:00
private ContentNode(ContentNode origin)
2016-05-27 14:26:28 +02:00
{
// everything is the same, except for the child items
// list which is a clone of the original list
Id = origin.Id;
Uid = origin.Uid;
ContentType = origin.ContentType;
Level = origin.Level;
Path = origin.Path;
SortOrder = origin.SortOrder;
ParentContentId = origin.ParentContentId;
CreateDate = origin.CreateDate;
CreatorId = origin.CreatorId;
2019-01-28 14:15:47 +01:00
var originDraft = origin.DraftModel == null ? null : PublishedContent.UnwrapIPublishedContent(origin.DraftModel);
var originPublished = origin.PublishedModel == null ? null : PublishedContent.UnwrapIPublishedContent(origin.PublishedModel);
2016-05-27 14:26:28 +02:00
2019-01-28 14:15:47 +01:00
DraftModel = originDraft == null ? null : new PublishedContent(this, originDraft).CreateModel();
PublishedModel = originPublished == null ? null : new PublishedContent(this, originPublished).CreateModel();
2016-05-27 14:26:28 +02:00
ChildContentIds = new List<int>(origin.ChildContentIds); // needs to be *another* list
}
// clone with new content type
2018-04-30 21:29:49 +02:00
public ContentNode(ContentNode origin, PublishedContentType contentType, IPublishedSnapshotAccessor publishedSnapshotAccessor, IVariationContextAccessor variationContextAccessor)
2016-05-27 14:26:28 +02:00
{
Id = origin.Id;
Uid = origin.Uid;
ContentType = contentType; // change!
Level = origin.Level;
Path = origin.Path;
SortOrder = origin.SortOrder;
ParentContentId = origin.ParentContentId;
CreateDate = origin.CreateDate;
CreatorId = origin.CreatorId;
2019-01-28 14:15:47 +01:00
var originDraft = origin.DraftModel == null ? null : PublishedContent.UnwrapIPublishedContent(origin.DraftModel);
var originPublished = origin.PublishedModel == null ? null : PublishedContent.UnwrapIPublishedContent(origin.PublishedModel);
2016-05-27 14:26:28 +02:00
2019-01-28 16:22:40 +01:00
DraftContent = originDraft == null ? null : new PublishedContent(this, originDraft.ContentData, publishedSnapshotAccessor, variationContextAccessor);
2019-01-28 14:15:47 +01:00
DraftModel = DraftContent?.CreateModel();
2019-01-28 16:22:40 +01:00
PublishedContent = originPublished == null ? null : new PublishedContent(this, originPublished.ContentData, publishedSnapshotAccessor, variationContextAccessor);
2019-01-28 14:15:47 +01:00
PublishedModel = PublishedContent?.CreateModel();
2016-05-27 14:26:28 +02:00
2019-01-21 15:57:48 +01:00
ChildContentIds = origin.ChildContentIds; // can be the *same* list
2016-05-27 14:26:28 +02:00
}
// everything that is common to both draft and published versions
// keep this as small as possible
public readonly int Id;
public readonly Guid Uid;
public PublishedContentType ContentType;
public readonly int Level;
public readonly string Path;
public readonly int SortOrder;
public readonly int ParentContentId;
public List<int> ChildContentIds;
public readonly DateTime CreateDate;
public readonly int CreatorId;
2019-01-28 14:15:47 +01:00
// draft and published version (either can be null, but not both)
// are the direct PublishedContent instances
public PublishedContent DraftContent;
public PublishedContent PublishedContent;
2016-05-27 14:26:28 +02:00
// draft and published version (either can be null, but not both)
// are models not direct PublishedContent instances
2019-01-28 14:15:47 +01:00
public IPublishedContent DraftModel;
public IPublishedContent PublishedModel;
2016-05-27 14:26:28 +02:00
2017-10-31 12:48:24 +01:00
public ContentNode CloneParent(IPublishedSnapshotAccessor publishedSnapshotAccessor)
2016-05-27 14:26:28 +02:00
{
2017-07-12 14:09:31 +02:00
return new ContentNode(this);
2016-05-27 14:26:28 +02:00
}
public ContentNodeKit ToKit()
{
2019-01-28 14:15:47 +01:00
var draft = DraftModel is PublishedContentModel draftModel
? (PublishedContent) draftModel.Unwrap()
2019-01-28 14:15:47 +01:00
: (PublishedContent) DraftModel;
2019-01-28 14:15:47 +01:00
var published = PublishedModel is PublishedContentModel publishedModel
? (PublishedContent) publishedModel.Unwrap()
2019-01-28 14:15:47 +01:00
: (PublishedContent) PublishedModel;
2016-05-27 14:26:28 +02:00
return new ContentNodeKit
{
Node = this,
ContentTypeId = ContentType.Id,
2017-07-20 11:21:28 +02:00
2019-01-28 16:22:40 +01:00
DraftData = draft?.ContentData,
PublishedData = published?.ContentData
2016-05-27 14:26:28 +02:00
};
}
}
}