Adds new ValueReference classes and update to Interface for IsForEditor method to check if we should get references for a specific dataeditor based on its alias

This commit is contained in:
Warren Buckley
2019-11-27 20:24:16 +00:00
parent 7573d52807
commit 645a30a8aa
24 changed files with 281 additions and 130 deletions

View File

@@ -36,6 +36,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
where TRepository : class, IRepository
{
private readonly Lazy<PropertyEditorCollection> _propertyEditors;
private readonly DataValueReferenceCollection _dataValueReferences;
/// <summary>
///
@@ -49,13 +50,14 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
/// </param>
protected ContentRepositoryBase(IScopeAccessor scopeAccessor, AppCaches cache, ILogger logger,
ILanguageRepository languageRepository, IRelationRepository relationRepository, IRelationTypeRepository relationTypeRepository,
Lazy<PropertyEditorCollection> propertyEditors)
Lazy<PropertyEditorCollection> propertyEditors, DataValueReferenceCollection dataValueReferences)
: base(scopeAccessor, cache, logger)
{
LanguageRepository = languageRepository;
RelationRepository = relationRepository;
RelationTypeRepository = relationTypeRepository;
_propertyEditors = propertyEditors;
_dataValueReferences = dataValueReferences;
}
protected abstract TRepository This { get; }
@@ -826,15 +828,21 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
foreach (var p in entity.Properties)
{
if (!PropertyEditors.TryGet(p.PropertyType.PropertyEditorAlias, out var editor)) continue;
var valueEditor = editor.GetValueEditor();
if (!(valueEditor is IDataValueReference reference)) continue;
//TODO: Support variants/segments! This is not required for this initial prototype which is why there is a check here
if (!p.PropertyType.VariesByNothing()) continue;
var val = p.GetValue(); // get the invariant value
var refs = reference.GetReferences(val);
trackedRelations.AddRange(refs);
// WB: Loop over our collection of references registered and add references
foreach (var item in _dataValueReferences)
{
// Check if this value reference is for this datatype/editor
// Then call it's GetReferences method - to see if the value stored
// in the dataeditor/property has referecnes to media items
if (item.IsForEditor(editor))
trackedRelations.AddRange(item.GetReferences(val));
}
}
//First delete all auto-relations for this entity

View File

@@ -20,8 +20,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
{
public DocumentBlueprintRepository(IScopeAccessor scopeAccessor, AppCaches appCaches, ILogger logger,
IContentTypeRepository contentTypeRepository, ITemplateRepository templateRepository, ITagRepository tagRepository, ILanguageRepository languageRepository, IRelationRepository relationRepository, IRelationTypeRepository relationTypeRepository,
Lazy<PropertyEditorCollection> propertyEditorCollection)
: base(scopeAccessor, appCaches, logger, contentTypeRepository, templateRepository, tagRepository, languageRepository, relationRepository, relationTypeRepository, propertyEditorCollection)
Lazy<PropertyEditorCollection> propertyEditorCollection, DataValueReferenceCollection dataValueReferences)
: base(scopeAccessor, appCaches, logger, contentTypeRepository, templateRepository, tagRepository, languageRepository, relationRepository, relationTypeRepository, propertyEditorCollection, dataValueReferences)
{
}

View File

@@ -46,8 +46,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
/// </param>
public DocumentRepository(IScopeAccessor scopeAccessor, AppCaches appCaches, ILogger logger,
IContentTypeRepository contentTypeRepository, ITemplateRepository templateRepository, ITagRepository tagRepository, ILanguageRepository languageRepository, IRelationRepository relationRepository, IRelationTypeRepository relationTypeRepository,
Lazy<PropertyEditorCollection> propertyEditors)
: base(scopeAccessor, appCaches, logger, languageRepository, relationRepository, relationTypeRepository, propertyEditors)
Lazy<PropertyEditorCollection> propertyEditors, DataValueReferenceCollection dataValueReferences)
: base(scopeAccessor, appCaches, logger, languageRepository, relationRepository, relationTypeRepository, propertyEditors, dataValueReferences)
{
_contentTypeRepository = contentTypeRepository ?? throw new ArgumentNullException(nameof(contentTypeRepository));
_templateRepository = templateRepository ?? throw new ArgumentNullException(nameof(templateRepository));

View File

@@ -29,8 +29,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
private readonly MediaByGuidReadRepository _mediaByGuidReadRepository;
public MediaRepository(IScopeAccessor scopeAccessor, AppCaches cache, ILogger logger, IMediaTypeRepository mediaTypeRepository, ITagRepository tagRepository, ILanguageRepository languageRepository, IRelationRepository relationRepository, IRelationTypeRepository relationTypeRepository,
Lazy<PropertyEditorCollection> propertyEditorCollection)
: base(scopeAccessor, cache, logger, languageRepository, relationRepository, relationTypeRepository, propertyEditorCollection)
Lazy<PropertyEditorCollection> propertyEditorCollection, DataValueReferenceCollection dataValueReferences)
: base(scopeAccessor, cache, logger, languageRepository, relationRepository, relationTypeRepository, propertyEditorCollection, dataValueReferences)
{
_mediaTypeRepository = mediaTypeRepository ?? throw new ArgumentNullException(nameof(mediaTypeRepository));
_tagRepository = tagRepository ?? throw new ArgumentNullException(nameof(tagRepository));

View File

@@ -28,8 +28,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
public MemberRepository(IScopeAccessor scopeAccessor, AppCaches cache, ILogger logger,
IMemberTypeRepository memberTypeRepository, IMemberGroupRepository memberGroupRepository, ITagRepository tagRepository, ILanguageRepository languageRepository, IRelationRepository relationRepository, IRelationTypeRepository relationTypeRepository,
Lazy<PropertyEditorCollection> propertyEditors)
: base(scopeAccessor, cache, logger, languageRepository, relationRepository, relationTypeRepository, propertyEditors)
Lazy<PropertyEditorCollection> propertyEditors, DataValueReferenceCollection dataValueReferences)
: base(scopeAccessor, cache, logger, languageRepository, relationRepository, relationTypeRepository, propertyEditors, dataValueReferences)
{
_memberTypeRepository = memberTypeRepository ?? throw new ArgumentNullException(nameof(memberTypeRepository));
_tagRepository = tagRepository ?? throw new ArgumentNullException(nameof(tagRepository));

View File

@@ -2,8 +2,8 @@
namespace Umbraco.Core.PropertyEditors
{
public class DataValueReferenceCollectionBuilder : LazyCollectionBuilderBase<DataValueReferenceCollectionBuilder, DataValueReferenceCollection, IDataValueReference>
public class DataValueReferenceCollectionBuilder : OrderedCollectionBuilderBase<DataValueReferenceCollectionBuilder, DataValueReferenceCollection, IDataValueReference>
{
protected override DataValueReferenceCollectionBuilder This => this;
protected override DataValueReferenceCollectionBuilder This => this;
}
}

View File

@@ -14,5 +14,12 @@ namespace Umbraco.Core.PropertyEditors
/// <param name="value"></param>
/// <returns></returns>
IEnumerable<UmbracoEntityReference> GetReferences(object value);
/// <summary>
/// Gets a value indicating whether the DataValueReference lookup supports a datatype (data editor).
/// </summary>
/// <param name="dataType">The datatype.</param>
/// <returns>A value indicating whether the converter supports a datatype.</returns>
bool IsForEditor(IDataEditor dataEditor);
}
}

View File

@@ -75,9 +75,6 @@ namespace Umbraco.Core.Runtime
composition.RegisterUnique<PropertyEditorCollection>();
composition.RegisterUnique<ParameterEditorCollection>();
// TODO: WB Add our collection
// Manually register stuff in this collection
composition.DataValueReferences();
// register a server registrar, by default it's the db registrar
composition.RegisterUnique<IServerRegistrar>(f =>

View File

@@ -29,21 +29,11 @@ namespace Umbraco.Web.PropertyEditors
protected override IDataValueEditor CreateValueEditor() => new ContentPickerPropertyValueEditor(Attribute);
internal class ContentPickerPropertyValueEditor : DataValueEditor, IDataValueReference
internal class ContentPickerPropertyValueEditor : DataValueEditor
{
public ContentPickerPropertyValueEditor(DataEditorAttribute attribute) : base(attribute)
{
}
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
{
var asString = value is string str ? str : value?.ToString();
if (string.IsNullOrEmpty(asString)) yield break;
if (Udi.TryParse(asString, out var udi))
yield return new UmbracoEntityReference(udi);
}
}
}
}

View File

@@ -54,7 +54,7 @@ namespace Umbraco.Web.PropertyEditors
protected override IConfigurationEditor CreateConfigurationEditor() => new GridConfigurationEditor();
internal class GridPropertyValueEditor : DataValueEditor, IDataValueReference
internal class GridPropertyValueEditor : DataValueEditor
{
private readonly IUmbracoContextAccessor _umbracoContextAccessor;
private readonly HtmlImageSourceParser _imageSourceParser;
@@ -156,30 +156,6 @@ namespace Umbraco.Web.PropertyEditors
return grid;
}
/// <summary>
/// Resolve references from <see cref="IDataValueEditor"/> values
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
{
var rawJson = value == null ? string.Empty : value is string str ? str : value.ToString();
DeserializeGridValue(rawJson, out var richTextEditorValues, out var mediaValues);
foreach (var umbracoEntityReference in richTextEditorValues.SelectMany(x =>
_richTextPropertyValueEditor.GetReferences(x.Value)))
{
yield return umbracoEntityReference;
}
foreach (var umbracoEntityReference in mediaValues.SelectMany(x =>
_mediaPickerPropertyValueEditor.GetReferences(x.Value["udi"])))
{
yield return umbracoEntityReference;
}
}
}
}
}

View File

@@ -33,21 +33,11 @@ namespace Umbraco.Web.PropertyEditors
protected override IDataValueEditor CreateValueEditor() => new MediaPickerPropertyValueEditor(Attribute);
internal class MediaPickerPropertyValueEditor : DataValueEditor, IDataValueReference
internal class MediaPickerPropertyValueEditor : DataValueEditor
{
public MediaPickerPropertyValueEditor(DataEditorAttribute attribute) : base(attribute)
{
}
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
{
var asString = value is string str ? str : value?.ToString();
if (string.IsNullOrEmpty(asString)) yield break;
if (Udi.TryParse(asString, out var udi))
yield return new UmbracoEntityReference(udi);
}
}
}

View File

@@ -23,25 +23,12 @@ namespace Umbraco.Web.PropertyEditors
protected override IDataValueEditor CreateValueEditor() => new MultiNodeTreePickerPropertyValueEditor(Attribute);
public class MultiNodeTreePickerPropertyValueEditor : DataValueEditor, IDataValueReference
public class MultiNodeTreePickerPropertyValueEditor : DataValueEditor
{
public MultiNodeTreePickerPropertyValueEditor(DataEditorAttribute attribute): base(attribute)
{
}
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
{
var asString = value == null ? string.Empty : value is string str ? str : value.ToString();
var udiPaths = asString.Split(',');
foreach (var udiPath in udiPaths)
{
if (Udi.TryParse(udiPath, out var udi))
yield return new UmbracoEntityReference(udi);
}
}
}
}

View File

@@ -15,7 +15,7 @@ using Umbraco.Web.PublishedCache;
namespace Umbraco.Web.PropertyEditors
{
public class MultiUrlPickerValueEditor : DataValueEditor, IDataValueReference
public class MultiUrlPickerValueEditor : DataValueEditor
{
private readonly IEntityService _entityService;
private readonly ILogger _logger;
@@ -190,9 +190,6 @@ namespace Umbraco.Web.PropertyEditors
}
}
}
}
}

View File

@@ -54,7 +54,7 @@ namespace Umbraco.Web.PropertyEditors
protected override IDataValueEditor CreateValueEditor() => new NestedContentPropertyValueEditor(Attribute, PropertyEditors, _dataTypeService, _contentTypeService);
internal class NestedContentPropertyValueEditor : DataValueEditor, IDataValueReference
internal class NestedContentPropertyValueEditor : DataValueEditor
{
private readonly PropertyEditorCollection _propertyEditors;
private readonly IDataTypeService _dataTypeService;
@@ -227,32 +227,6 @@ namespace Umbraco.Web.PropertyEditors
// return json
return JsonConvert.SerializeObject(deserialized);
}
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
{
var rawJson = value == null ? string.Empty : value is string str ? str : value.ToString();
var result = new List<UmbracoEntityReference>();
foreach (var row in _nestedContentValues.GetPropertyValues(rawJson, out _))
{
if (row.PropType == null) continue;
var propEditor = _propertyEditors[row.PropType.PropertyEditorAlias];
var valueEditor = propEditor?.GetValueEditor();
if (!(valueEditor is IDataValueReference reference)) continue;
var val = row.JsonRowValue[row.PropKey]?.ToString();
var refs = reference.GetReferences(val);
result.AddRange(refs);
}
return result;
}
#endregion
}

View File

@@ -57,7 +57,7 @@ namespace Umbraco.Web.PropertyEditors
/// <summary>
/// A custom value editor to ensure that macro syntax is parsed when being persisted and formatted correctly for display in the editor
/// </summary>
internal class RichTextPropertyValueEditor : DataValueEditor, IDataValueReference
internal class RichTextPropertyValueEditor : DataValueEditor
{
private IUmbracoContextAccessor _umbracoContextAccessor;
private readonly HtmlImageSourceParser _imageSourceParser;
@@ -130,24 +130,6 @@ namespace Umbraco.Web.PropertyEditors
return parsed;
}
/// <summary>
/// Resolve references from <see cref="IDataValueEditor"/> values
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
{
var asString = value == null ? string.Empty : value is string str ? str : value.ToString();
foreach (var udi in _imageSourceParser.FindUdisFromDataAttributes(asString))
yield return new UmbracoEntityReference(udi);
foreach (var udi in _localLinkParser.FindUdisFromLocalLinks(asString))
yield return new UmbracoEntityReference(udi);
//TODO: Detect Macros too ... but we can save that for a later date, right now need to do media refs
}
}
internal class RichTextPropertyIndexValueFactory : IPropertyIndexValueFactory

View File

@@ -0,0 +1,22 @@
using System.Collections.Generic;
using Umbraco.Core;
using Umbraco.Core.Models.Editors;
using Umbraco.Core.PropertyEditors;
namespace Umbraco.Web.PropertyEditors.ValueReferences
{
public class ContentPickerPropertyValueReferences : IDataValueReference
{
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
{
var asString = value is string str ? str : value?.ToString();
if (string.IsNullOrEmpty(asString)) yield break;
if (Udi.TryParse(asString, out var udi))
yield return new UmbracoEntityReference(udi);
}
public bool IsForEditor(IDataEditor dataEditor) => dataEditor.Alias.InvariantEquals(Constants.PropertyEditors.Aliases.ContentPicker);
}
}

View File

@@ -0,0 +1,37 @@
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core;
using Umbraco.Core.Models.Editors;
using Umbraco.Core.PropertyEditors;
namespace Umbraco.Web.PropertyEditors.ValueReferences
{
public class GridPropertyValueReferences : IDataValueReference
{
/// <summary>
/// Resolve references from <see cref="IDataValueEditor"/> values
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
{
return Enumerable.Empty<UmbracoEntityReference>();
//var rawJson = value == null ? string.Empty : value is string str ? str : value.ToString();
////TODO FIX SQUIGLES
//GridPropertyEditor.GridPropertyValueEditor.DeserializeGridValue(rawJson, out var richTextEditorValues, out var mediaValues);
//foreach (var umbracoEntityReference in richTextEditorValues.SelectMany(x =>
// _richTextPropertyValueEditor.GetReferences(x.Value)))
// yield return umbracoEntityReference;
//foreach (var umbracoEntityReference in mediaValues.SelectMany(x =>
// _mediaPickerPropertyValueEditor.GetReferences(x.Value["udi"])))
// yield return umbracoEntityReference;
}
public bool IsForEditor(IDataEditor dataEditor) => dataEditor.Alias.InvariantEquals(Constants.PropertyEditors.Aliases.Grid);
}
}

View File

@@ -0,0 +1,22 @@
using System.Collections.Generic;
using Umbraco.Core;
using Umbraco.Core.Models.Editors;
using Umbraco.Core.PropertyEditors;
namespace Umbraco.Web.PropertyEditors.ValueReferences
{
public class MediaPickerPropertyValueReferences : IDataValueReference
{
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
{
var asString = value is string str ? str : value?.ToString();
if (string.IsNullOrEmpty(asString)) yield break;
if (Udi.TryParse(asString, out var udi))
yield return new UmbracoEntityReference(udi);
}
public bool IsForEditor(IDataEditor dataEditor) => dataEditor.Alias.InvariantEquals(Constants.PropertyEditors.Aliases.MediaPicker);
}
}

View File

@@ -0,0 +1,23 @@
using System.Collections.Generic;
using Umbraco.Core;
using Umbraco.Core.Models.Editors;
using Umbraco.Core.PropertyEditors;
namespace Umbraco.Web.PropertyEditors.ValueReferences
{
public class MultiNodeTreePickerPropertyValueReferences : IDataValueReference
{
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
{
var asString = value == null ? string.Empty : value is string str ? str : value.ToString();
var udiPaths = asString.Split(',');
foreach (var udiPath in udiPaths)
if (Udi.TryParse(udiPath, out var udi))
yield return new UmbracoEntityReference(udi);
}
public bool IsForEditor(IDataEditor dataEditor) => dataEditor.Alias.InvariantEquals(Constants.PropertyEditors.Aliases.MultiNodeTreePicker);
}
}

View File

@@ -0,0 +1,26 @@
using Newtonsoft.Json;
using System.Collections.Generic;
using Umbraco.Core;
using Umbraco.Core.Models.Editors;
using Umbraco.Core.PropertyEditors;
namespace Umbraco.Web.PropertyEditors.ValueReferences
{
public class MultiUrlPickerValueReferences : IDataValueReference
{
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
{
var asString = value == null ? string.Empty : value is string str ? str : value.ToString();
if (string.IsNullOrEmpty(asString)) yield break;
var links = JsonConvert.DeserializeObject<List<MultiUrlPickerValueEditor.LinkDto>>(asString);
foreach (var link in links)
if (link.Udi != null) // Links can be absolute links without a Udi
yield return new UmbracoEntityReference(link.Udi);
}
public bool IsForEditor(IDataEditor dataEditor) => dataEditor.Alias.InvariantEquals(Constants.PropertyEditors.Aliases.MultiUrlPicker);
}
}

View File

@@ -0,0 +1,49 @@
using System.Collections.Generic;
using Umbraco.Core;
using Umbraco.Core.Models.Editors;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Services;
using static Umbraco.Web.PropertyEditors.NestedContentPropertyEditor;
namespace Umbraco.Web.PropertyEditors.ValueReferences
{
public class NestedContentPropertyValueReferences : IDataValueReference
{
private PropertyEditorCollection _propertyEditors;
private NestedContentValues _nestedContentValues;
//ARGH LightInject moaning at me
public NestedContentPropertyValueReferences(PropertyEditorCollection propertyEditors, IContentTypeService contentTypeService)
{
_propertyEditors = propertyEditors;
_nestedContentValues = new NestedContentValues(contentTypeService);
}
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
{
var rawJson = value == null ? string.Empty : value is string str ? str : value.ToString();
var result = new List<UmbracoEntityReference>();
foreach (var row in _nestedContentValues.GetPropertyValues(rawJson, out _))
{
if (row.PropType == null) continue;
var propEditor = _propertyEditors[row.PropType.PropertyEditorAlias];
var valueEditor = propEditor?.GetValueEditor();
if (!(valueEditor is IDataValueReference reference)) continue;
var val = row.JsonRowValue[row.PropKey]?.ToString();
var refs = reference.GetReferences(val);
result.AddRange(refs);
}
return result;
}
public bool IsForEditor(IDataEditor dataEditor) => dataEditor.Alias.InvariantEquals(Constants.PropertyEditors.Aliases.NestedContent);
}
}

View File

@@ -0,0 +1,40 @@
using System.Collections.Generic;
using Umbraco.Core;
using Umbraco.Core.Models.Editors;
using Umbraco.Core.PropertyEditors;
using Umbraco.Web.Templates;
namespace Umbraco.Web.PropertyEditors.ValueReferences
{
public class RichTextPropertyValueReferences : IDataValueReference
{
private HtmlImageSourceParser _imageSourceParser;
private HtmlLocalLinkParser _localLinkParser;
public RichTextPropertyValueReferences(HtmlImageSourceParser imageSourceParser, HtmlLocalLinkParser localLinkParser)
{
_imageSourceParser = imageSourceParser;
_localLinkParser = localLinkParser;
}
/// <summary>
/// Resolve references from <see cref="IDataValueEditor"/> values
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
{
var asString = value == null ? string.Empty : value is string str ? str : value.ToString();
foreach (var udi in _imageSourceParser.FindUdisFromDataAttributes(asString))
yield return new UmbracoEntityReference(udi);
foreach (var udi in _localLinkParser.FindUdisFromLocalLinks(asString))
yield return new UmbracoEntityReference(udi);
//TODO: Detect Macros too ... but we can save that for a later date, right now need to do media refs
}
public bool IsForEditor(IDataEditor dataEditor) => dataEditor.Alias.InvariantEquals(Constants.PropertyEditors.Aliases.TinyMce);
}
}

View File

@@ -42,6 +42,8 @@ using Umbraco.Web.Trees;
using Umbraco.Web.WebApi;
using Current = Umbraco.Web.Composing.Current;
using Umbraco.Web.PropertyEditors;
using static Umbraco.Web.PropertyEditors.GridPropertyEditor;
using Umbraco.Web.PropertyEditors.ValueReferences;
namespace Umbraco.Web.Runtime
{
@@ -274,7 +276,22 @@ namespace Umbraco.Web.Runtime
.Append<Issuu>()
.Append<Hulu>()
.Append<Giphy>();
// Used to determine if a datatype/editor should be storing/tracking
// references to media item/s
composition.DataValueReferences()
.Append<ContentPickerPropertyValueReferences>()
// TODO: Unsure how to call other ValueReference in collection
// When looking at grid item cells for RTE or media found
//.Append<GridPropertyValueReferences>()
.Append<MediaPickerPropertyValueReferences>()
.Append<MultiNodeTreePickerPropertyValueReferences>()
.Append<MultiUrlPickerValueReferences>()
// TODO: LightInject problem
//.Append<NestedContentPropertyValueReferences>()
.Append<RichTextPropertyValueReferences>();
// replace with web implementation
composition.RegisterUnique<IPublishedSnapshotRebuilder, Migrations.PostMigrations.PublishedSnapshotRebuilder>();

View File

@@ -235,6 +235,13 @@
<Compile Include="Profiling\WebProfilingController.cs" />
<Compile Include="PropertyEditors\ParameterEditors\MultipleMediaPickerParameterEditor.cs" />
<Compile Include="PropertyEditors\RichTextEditorPastedImages.cs" />
<Compile Include="PropertyEditors\ValueReferences\ContentPickerPropertyValueReferences.cs" />
<Compile Include="PropertyEditors\ValueReferences\GridPropertyValueReferences.cs" />
<Compile Include="PropertyEditors\ValueReferences\MediaPickerPropertyValueReferences.cs" />
<Compile Include="PropertyEditors\ValueReferences\MultiNodeTreePickerPropertyValueReferences.cs" />
<Compile Include="PropertyEditors\ValueReferences\MultiUrlPickerValueReferences.cs" />
<Compile Include="PropertyEditors\ValueReferences\NestedContentPropertyValueReferences.cs" />
<Compile Include="PropertyEditors\ValueReferences\RichTextPropertyValueReferences.cs" />
<Compile Include="PublishedCache\NuCache\PublishedSnapshotServiceOptions.cs" />
<Compile Include="PublishedCache\NuCache\Snap\GenObj.cs" />
<Compile Include="PublishedCache\NuCache\Snap\GenRef.cs" />