Refactoring content type cache

--HG--
branch : 1.x
This commit is contained in:
Sebastien Ros 2013-04-25 12:44:28 -07:00
parent 63a9167565
commit c6ac96a23a
15 changed files with 44 additions and 8 deletions

View File

@ -5,6 +5,7 @@ using Autofac;
using JetBrains.Annotations; using JetBrains.Annotations;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using Orchard.Caching;
using Orchard.ContentManagement; using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers; using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers; using Orchard.ContentManagement.Handlers;
@ -30,6 +31,7 @@ namespace Orchard.Core.Tests.Body {
public override void Register(ContainerBuilder builder) { public override void Register(ContainerBuilder builder) {
builder.RegisterType<DefaultContentManager>().As<IContentManager>(); builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>(); builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>();
builder.RegisterInstance(new Mock<IContentDefinitionManager>().Object); builder.RegisterInstance(new Mock<IContentDefinitionManager>().Object);
builder.RegisterInstance(new Mock<ITransactionManager>().Object); builder.RegisterInstance(new Mock<ITransactionManager>().Object);

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
using Autofac; using Autofac;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using Orchard.Caching;
using Orchard.ContentManagement; using Orchard.ContentManagement;
using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData;
using Orchard.ContentManagement.Records; using Orchard.ContentManagement.Records;
@ -36,6 +37,7 @@ namespace Orchard.Core.Tests.Scheduling {
builder.RegisterInstance(new Mock<IOrchardServices>().Object); builder.RegisterInstance(new Mock<IOrchardServices>().Object);
builder.RegisterInstance(new Mock<ITransactionManager>().Object); builder.RegisterInstance(new Mock<ITransactionManager>().Object);
builder.RegisterType<DefaultContentManager>().As<IContentManager>(); builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>(); builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>();
builder.RegisterType<DefaultShapeTableManager>().As<IShapeTableManager>(); builder.RegisterType<DefaultShapeTableManager>().As<IShapeTableManager>();
builder.RegisterType<ShapeTableLocator>().As<IShapeTableLocator>(); builder.RegisterType<ShapeTableLocator>().As<IShapeTableLocator>();

View File

@ -4,6 +4,7 @@ using System.Linq;
using Autofac; using Autofac;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using Orchard.Caching;
using Orchard.ContentManagement; using Orchard.ContentManagement;
using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData;
using Orchard.ContentManagement.Records; using Orchard.ContentManagement.Records;
@ -39,6 +40,7 @@ namespace Orchard.Core.Tests.Scheduling {
public override void Register(ContainerBuilder builder) { public override void Register(ContainerBuilder builder) {
builder.RegisterInstance(_mockServices.Object); builder.RegisterInstance(_mockServices.Object);
builder.RegisterType<DefaultContentManager>().As<IContentManager>(); builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>(); builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>();
builder.RegisterType<DefaultShapeTableManager>().As<IShapeTableManager>(); builder.RegisterType<DefaultShapeTableManager>().As<IShapeTableManager>();
builder.RegisterType<ShapeTableLocator>().As<IShapeTableLocator>(); builder.RegisterType<ShapeTableLocator>().As<IShapeTableLocator>();

View File

@ -4,6 +4,7 @@ using Autofac;
using JetBrains.Annotations; using JetBrains.Annotations;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using Orchard.Caching;
using Orchard.Comments.Handlers; using Orchard.Comments.Handlers;
using Orchard.Comments.Models; using Orchard.Comments.Models;
using Orchard.Comments.Services; using Orchard.Comments.Services;
@ -37,6 +38,7 @@ namespace Orchard.Tests.Modules.Comments.Services {
public override void Register(ContainerBuilder builder) { public override void Register(ContainerBuilder builder) {
builder.RegisterType<CommentService>().As<ICommentService>(); builder.RegisterType<CommentService>().As<ICommentService>();
builder.RegisterType<DefaultContentManager>().As<IContentManager>(); builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>(); builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>();
builder.RegisterInstance(new Mock<IContentDefinitionManager>().Object); builder.RegisterInstance(new Mock<IContentDefinitionManager>().Object);
builder.RegisterInstance(new Mock<ITransactionManager>().Object); builder.RegisterInstance(new Mock<ITransactionManager>().Object);

View File

@ -5,6 +5,7 @@ using Autofac;
using Lucene.Services; using Lucene.Services;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using Orchard.Caching;
using Orchard.ContentManagement; using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers; using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers; using Orchard.ContentManagement.Handlers;
@ -65,6 +66,7 @@ namespace Orchard.Tests.Modules.Indexing {
builder.RegisterType<DefaultIndexManager>().As<IIndexManager>(); builder.RegisterType<DefaultIndexManager>().As<IIndexManager>();
builder.RegisterType<IndexingTaskManager>().As<IIndexingTaskManager>(); builder.RegisterType<IndexingTaskManager>().As<IIndexingTaskManager>();
builder.RegisterType<DefaultContentManager>().As<IContentManager>(); builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>(); builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>();
builder.RegisterInstance(_contentDefinitionManager.Object); builder.RegisterInstance(_contentDefinitionManager.Object);
builder.RegisterInstance(new Mock<IContentDisplay>().Object); builder.RegisterInstance(new Mock<IContentDisplay>().Object);

View File

@ -5,6 +5,7 @@ using System.Linq;
using Autofac; using Autofac;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using Orchard.Caching;
using Orchard.ContentManagement; using Orchard.ContentManagement;
using Orchard.ContentManagement.Handlers; using Orchard.ContentManagement.Handlers;
using Orchard.ContentManagement.Records; using Orchard.ContentManagement.Records;
@ -37,6 +38,7 @@ namespace Orchard.Tests.Modules.Tags.Services {
builder.RegisterType<TagsPartHandler>().As<IContentHandler>(); builder.RegisterType<TagsPartHandler>().As<IContentHandler>();
builder.RegisterType<OrchardServices>().As<IOrchardServices>(); builder.RegisterType<OrchardServices>().As<IOrchardServices>();
builder.RegisterType<DefaultContentManager>().As<IContentManager>(); builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)); builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
} }

View File

@ -5,6 +5,7 @@ using Autofac;
using Moq; using Moq;
using NHibernate; using NHibernate;
using NUnit.Framework; using NUnit.Framework;
using Orchard.Caching;
using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData;
using Orchard.ContentManagement.MetaData.Models; using Orchard.ContentManagement.MetaData.Models;
using Orchard.ContentManagement.MetaData.Services; using Orchard.ContentManagement.MetaData.Services;
@ -72,6 +73,7 @@ namespace Orchard.Tests.Modules.Users.Services {
builder.RegisterType<MembershipService>().As<IMembershipService>(); builder.RegisterType<MembershipService>().As<IMembershipService>();
builder.RegisterType<DefaultContentQuery>().As<IContentQuery>(); builder.RegisterType<DefaultContentQuery>().As<IContentQuery>();
builder.RegisterType<DefaultContentManager>().As<IContentManager>(); builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
builder.RegisterType(typeof(SettingsFormatter)).As<ISettingsFormatter>(); builder.RegisterType(typeof(SettingsFormatter)).As<ISettingsFormatter>();
builder.RegisterType<ContentDefinitionManager>().As<IContentDefinitionManager>(); builder.RegisterType<ContentDefinitionManager>().As<IContentDefinitionManager>();
builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>(); builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>();

View File

@ -6,6 +6,7 @@ using Autofac;
using Moq; using Moq;
using NHibernate; using NHibernate;
using NUnit.Framework; using NUnit.Framework;
using Orchard.Caching;
using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData;
using Orchard.ContentManagement.MetaData.Models; using Orchard.ContentManagement.MetaData.Models;
using Orchard.ContentManagement.MetaData.Services; using Orchard.ContentManagement.MetaData.Services;
@ -83,6 +84,7 @@ namespace Orchard.Tests.Modules.Users.Services {
builder.RegisterInstance(_clock = new StubClock()).As<IClock>(); builder.RegisterInstance(_clock = new StubClock()).As<IClock>();
builder.RegisterType<DefaultContentQuery>().As<IContentQuery>(); builder.RegisterType<DefaultContentQuery>().As<IContentQuery>();
builder.RegisterType<DefaultContentManager>().As<IContentManager>(); builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
builder.RegisterType(typeof(SettingsFormatter)).As<ISettingsFormatter>(); builder.RegisterType(typeof(SettingsFormatter)).As<ISettingsFormatter>();
builder.RegisterType<ContentDefinitionManager>().As<IContentDefinitionManager>(); builder.RegisterType<ContentDefinitionManager>().As<IContentDefinitionManager>();
builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>(); builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>();

View File

@ -4,6 +4,7 @@ using System.Linq;
using Autofac; using Autofac;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using Orchard.Caching;
using Orchard.ContentManagement; using Orchard.ContentManagement;
using Orchard.ContentManagement.Handlers; using Orchard.ContentManagement.Handlers;
using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData;
@ -88,6 +89,7 @@ namespace Orchard.Tests.Modules.Widgets.Services {
.Returns(new[] { theme1, theme2, theme3, module1 }); .Returns(new[] { theme1, theme2, theme3, module1 });
builder.RegisterType<DefaultContentManager>().As<IContentManager>(); builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>(); builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>();
builder.RegisterInstance(new Mock<IContentDefinitionManager>().Object); builder.RegisterInstance(new Mock<IContentDefinitionManager>().Object);
builder.RegisterInstance(new Mock<ITransactionManager>().Object); builder.RegisterInstance(new Mock<ITransactionManager>().Object);

View File

@ -3,6 +3,7 @@ using Autofac;
using Moq; using Moq;
using NHibernate; using NHibernate;
using NUnit.Framework; using NUnit.Framework;
using Orchard.Caching;
using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData;
using Orchard.Data; using Orchard.Data;
using Orchard.ContentManagement; using Orchard.ContentManagement;
@ -47,6 +48,7 @@ namespace Orchard.Tests.ContentManagement {
builder.RegisterModule(new ContentModule()); builder.RegisterModule(new ContentModule());
builder.RegisterType<DefaultContentManager>().As<IContentManager>().SingleInstance(); builder.RegisterType<DefaultContentManager>().As<IContentManager>().SingleInstance();
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>(); builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>();
builder.RegisterInstance(new Mock<IContentDefinitionManager>().Object); builder.RegisterInstance(new Mock<IContentDefinitionManager>().Object);
builder.RegisterInstance(new Mock<IContentDisplay>().Object); builder.RegisterInstance(new Mock<IContentDisplay>().Object);

View File

@ -6,6 +6,7 @@ using Autofac;
using Moq; using Moq;
using NHibernate; using NHibernate;
using NUnit.Framework; using NUnit.Framework;
using Orchard.Caching;
using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData;
using Orchard.ContentManagement.MetaData.Builders; using Orchard.ContentManagement.MetaData.Builders;
using Orchard.ContentManagement.MetaData.Models; using Orchard.ContentManagement.MetaData.Models;
@ -59,6 +60,7 @@ namespace Orchard.Tests.ContentManagement {
var builder = new ContainerBuilder(); var builder = new ContainerBuilder();
builder.RegisterType<DefaultContentQuery>().As<IContentQuery>(); builder.RegisterType<DefaultContentQuery>().As<IContentQuery>();
builder.RegisterType<DefaultContentManager>().As<IContentManager>(); builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>(); builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>();
builder.RegisterInstance(_contentDefinitionManager.Object); builder.RegisterInstance(_contentDefinitionManager.Object);
builder.RegisterInstance(new Mock<IContentDisplay>().Object); builder.RegisterInstance(new Mock<IContentDisplay>().Object);

View File

@ -3,6 +3,7 @@ using Autofac;
using Moq; using Moq;
using NHibernate; using NHibernate;
using NUnit.Framework; using NUnit.Framework;
using Orchard.Caching;
using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData;
using Orchard.Data; using Orchard.Data;
using Orchard.ContentManagement; using Orchard.ContentManagement;
@ -45,6 +46,7 @@ namespace Orchard.Tests.ContentManagement {
builder.RegisterModule(new ContentModule()); builder.RegisterModule(new ContentModule());
builder.RegisterType<DefaultContentManager>().As<IContentManager>().SingleInstance(); builder.RegisterType<DefaultContentManager>().As<IContentManager>().SingleInstance();
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>(); builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>();
builder.RegisterInstance(new Mock<IContentDefinitionManager>().Object); builder.RegisterInstance(new Mock<IContentDefinitionManager>().Object);
builder.RegisterInstance(new Mock<IContentDisplay>().Object); builder.RegisterInstance(new Mock<IContentDisplay>().Object);

View File

@ -5,6 +5,7 @@ using Autofac;
using Moq; using Moq;
using NHibernate; using NHibernate;
using NUnit.Framework; using NUnit.Framework;
using Orchard.Caching;
using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData;
using Orchard.Data; using Orchard.Data;
using Orchard.ContentManagement; using Orchard.ContentManagement;
@ -48,6 +49,7 @@ namespace Orchard.Tests.ContentManagement {
builder.RegisterModule(new ContentModule()); builder.RegisterModule(new ContentModule());
builder.RegisterType<DefaultContentManager>().As<IContentManager>().SingleInstance(); builder.RegisterType<DefaultContentManager>().As<IContentManager>().SingleInstance();
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>(); builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>();
builder.RegisterInstance(new Mock<IContentDefinitionManager>().Object); builder.RegisterInstance(new Mock<IContentDefinitionManager>().Object);
builder.RegisterInstance(new Mock<IContentDisplay>().Object); builder.RegisterInstance(new Mock<IContentDisplay>().Object);

View File

@ -30,7 +30,7 @@ namespace Orchard.Caching {
} }
private CacheEntry UpdateEntry(CacheEntry currentEntry, TKey k, Func<AcquireContext<TKey>, TResult> acquire) { private CacheEntry UpdateEntry(CacheEntry currentEntry, TKey k, Func<AcquireContext<TKey>, TResult> acquire) {
var entry = (currentEntry.Tokens.Any(t => !t.IsCurrent)) ? CreateEntry(k, acquire) : currentEntry; var entry = (currentEntry.Tokens.Any(t => t != null && !t.IsCurrent)) ? CreateEntry(k, acquire) : currentEntry;
PropagateTokens(entry); PropagateTokens(entry);
return entry; return entry;
} }

View File

@ -10,6 +10,7 @@ using NHibernate;
using NHibernate.Criterion; using NHibernate.Criterion;
using NHibernate.SqlCommand; using NHibernate.SqlCommand;
using NHibernate.Transform; using NHibernate.Transform;
using Orchard.Caching;
using Orchard.ContentManagement.Handlers; using Orchard.ContentManagement.Handlers;
using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData;
using Orchard.ContentManagement.MetaData.Builders; using Orchard.ContentManagement.MetaData.Builders;
@ -27,6 +28,7 @@ namespace Orchard.ContentManagement {
private readonly IRepository<ContentItemRecord> _contentItemRepository; private readonly IRepository<ContentItemRecord> _contentItemRepository;
private readonly IRepository<ContentItemVersionRecord> _contentItemVersionRepository; private readonly IRepository<ContentItemVersionRecord> _contentItemVersionRepository;
private readonly IContentDefinitionManager _contentDefinitionManager; private readonly IContentDefinitionManager _contentDefinitionManager;
private readonly ICacheManager _cacheManager;
private readonly Func<IContentManagerSession> _contentManagerSession; private readonly Func<IContentManagerSession> _contentManagerSession;
private readonly Lazy<IContentDisplay> _contentDisplay; private readonly Lazy<IContentDisplay> _contentDisplay;
private readonly Lazy<ISessionLocator> _sessionLocator; private readonly Lazy<ISessionLocator> _sessionLocator;
@ -40,6 +42,7 @@ namespace Orchard.ContentManagement {
IRepository<ContentItemRecord> contentItemRepository, IRepository<ContentItemRecord> contentItemRepository,
IRepository<ContentItemVersionRecord> contentItemVersionRepository, IRepository<ContentItemVersionRecord> contentItemVersionRepository,
IContentDefinitionManager contentDefinitionManager, IContentDefinitionManager contentDefinitionManager,
ICacheManager cacheManager,
Func<IContentManagerSession> contentManagerSession, Func<IContentManagerSession> contentManagerSession,
Lazy<IContentDisplay> contentDisplay, Lazy<IContentDisplay> contentDisplay,
Lazy<ISessionLocator> sessionLocator, Lazy<ISessionLocator> sessionLocator,
@ -49,6 +52,7 @@ namespace Orchard.ContentManagement {
_contentItemRepository = contentItemRepository; _contentItemRepository = contentItemRepository;
_contentItemVersionRepository = contentItemVersionRepository; _contentItemVersionRepository = contentItemVersionRepository;
_contentDefinitionManager = contentDefinitionManager; _contentDefinitionManager = contentDefinitionManager;
_cacheManager = cacheManager;
_contentManagerSession = contentManagerSession; _contentManagerSession = contentManagerSession;
_handlers = handlers; _handlers = handlers;
_contentDisplay = contentDisplay; _contentDisplay = contentDisplay;
@ -661,13 +665,19 @@ namespace Orchard.ContentManagement {
} }
private ContentTypeRecord AcquireContentTypeRecord(string contentType) { private ContentTypeRecord AcquireContentTypeRecord(string contentType) {
var contentTypeRecord = _contentTypeRepository.Get(x => x.Name == contentType); var contentTypeId = _cacheManager.Get(contentType + "_Record", ctx => {
if (contentTypeRecord == null) { var contentTypeRecord = _contentTypeRepository.Get(x => x.Name == contentType);
//TEMP: this is not safe... ContentItem types could be created concurrently?
contentTypeRecord = new ContentTypeRecord { Name = contentType }; if (contentTypeRecord == null) {
_contentTypeRepository.Create(contentTypeRecord); //TEMP: this is not safe... ContentItem types could be created concurrently?
} contentTypeRecord = new ContentTypeRecord { Name = contentType };
return contentTypeRecord; _contentTypeRepository.Create(contentTypeRecord);
}
return contentTypeRecord.Id;
});
return _contentTypeRepository.Get(contentTypeId);
} }
public void Index(ContentItem contentItem, IDocumentIndex documentIndex) { public void Index(ContentItem contentItem, IDocumentIndex documentIndex) {