From 1b18621e003b3c0cb046d04a7fa10429a8f3ec4d Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Wed, 27 Aug 2014 18:29:11 -0700 Subject: [PATCH] Revert "Removing DefaultContentManagerSession" This reverts commit 262c825c26327856712be71234c53b5040292bea. --- src/Orchard.Core.Tests/Body/BodyPartTests.cs | 1 + .../Providers/CommonPartProviderTests.cs | 1 + .../Scheduling/ScheduledTaskExecutorTests.cs | 1 + .../Scheduling/ScheduledTaskManagerTests.cs | 1 + .../Comments/Services/CommentServiceTests.cs | 1 + .../Indexing/IndexingTaskExecutorTests.cs | 2 ++ .../Controllers/AccountControllerTests.cs | 1 + .../Users/Services/MembershipServiceTests.cs | 1 + .../Users/Services/UserServiceTests.cs | 1 + .../Widgets/Services/WidgetsServiceTest.cs | 1 + .../ContentManagement/ContentQueryTests.cs | 1 + .../DefaultContentManagerTests.cs | 1 + .../DynamicContentQueryTests.cs | 1 + .../ContentManagement/HqlExpressionTests.cs | 1 + .../Localization/CultureManagerTests.cs | 1 + .../Tests/Services/FieldIndexServiceTests.cs | 1 + .../Tests/Services/FieldIndexStorageTests.cs | 1 + .../DefaultContentManager.cs | 34 +++++++++++++++++-- .../DefaultContentManagerSession.cs | 30 ++++++++++++++++ .../IContentManagerSession.cs | 4 +-- src/Orchard/Orchard.Framework.csproj | 3 ++ 21 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 src/Orchard/ContentManagement/DefaultContentManagerSession.cs diff --git a/src/Orchard.Core.Tests/Body/BodyPartTests.cs b/src/Orchard.Core.Tests/Body/BodyPartTests.cs index d29b3d26b..a04c75be8 100644 --- a/src/Orchard.Core.Tests/Body/BodyPartTests.cs +++ b/src/Orchard.Core.Tests/Body/BodyPartTests.cs @@ -33,6 +33,7 @@ namespace Orchard.Core.Tests.Body { builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterInstance(new Mock().Object); builder.RegisterInstance(new Mock().Object); builder.RegisterInstance(new Mock().Object); diff --git a/src/Orchard.Core.Tests/Common/Providers/CommonPartProviderTests.cs b/src/Orchard.Core.Tests/Common/Providers/CommonPartProviderTests.cs index 7f89b2e6c..75d6b0f6c 100644 --- a/src/Orchard.Core.Tests/Common/Providers/CommonPartProviderTests.cs +++ b/src/Orchard.Core.Tests/Common/Providers/CommonPartProviderTests.cs @@ -52,6 +52,7 @@ namespace Orchard.Core.Tests.Common.Providers { public override void Register(ContainerBuilder builder) { builder.RegisterType().As(); builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Core.Tests/Scheduling/ScheduledTaskExecutorTests.cs b/src/Orchard.Core.Tests/Scheduling/ScheduledTaskExecutorTests.cs index 0248018a7..00a7566a8 100644 --- a/src/Orchard.Core.Tests/Scheduling/ScheduledTaskExecutorTests.cs +++ b/src/Orchard.Core.Tests/Scheduling/ScheduledTaskExecutorTests.cs @@ -39,6 +39,7 @@ namespace Orchard.Core.Tests.Scheduling { builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Core.Tests/Scheduling/ScheduledTaskManagerTests.cs b/src/Orchard.Core.Tests/Scheduling/ScheduledTaskManagerTests.cs index c04995349..10daf173c 100644 --- a/src/Orchard.Core.Tests/Scheduling/ScheduledTaskManagerTests.cs +++ b/src/Orchard.Core.Tests/Scheduling/ScheduledTaskManagerTests.cs @@ -42,6 +42,7 @@ namespace Orchard.Core.Tests.Scheduling { builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Tests.Modules/Comments/Services/CommentServiceTests.cs b/src/Orchard.Tests.Modules/Comments/Services/CommentServiceTests.cs index 5f53f6e81..2e231d90d 100644 --- a/src/Orchard.Tests.Modules/Comments/Services/CommentServiceTests.cs +++ b/src/Orchard.Tests.Modules/Comments/Services/CommentServiceTests.cs @@ -49,6 +49,7 @@ namespace Orchard.Tests.Modules.Comments.Services { builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterInstance(new Mock().Object); builder.RegisterInstance(new Mock().Object); builder.RegisterInstance(new Mock().Object); diff --git a/src/Orchard.Tests.Modules/Indexing/IndexingTaskExecutorTests.cs b/src/Orchard.Tests.Modules/Indexing/IndexingTaskExecutorTests.cs index 6280fa62c..8028de1f2 100644 --- a/src/Orchard.Tests.Modules/Indexing/IndexingTaskExecutorTests.cs +++ b/src/Orchard.Tests.Modules/Indexing/IndexingTaskExecutorTests.cs @@ -70,9 +70,11 @@ namespace Orchard.Tests.Modules.Indexing { builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterInstance(_contentDefinitionManager.Object); builder.RegisterInstance(new Mock().Object); + builder.RegisterType().As(); builder.RegisterInstance(new Mock().Object); builder.RegisterInstance(new Mock().Object); builder.RegisterType().As(); diff --git a/src/Orchard.Tests.Modules/Users/Controllers/AccountControllerTests.cs b/src/Orchard.Tests.Modules/Users/Controllers/AccountControllerTests.cs index 5ca9b9cb5..73d9744e2 100644 --- a/src/Orchard.Tests.Modules/Users/Controllers/AccountControllerTests.cs +++ b/src/Orchard.Tests.Modules/Users/Controllers/AccountControllerTests.cs @@ -58,6 +58,7 @@ namespace Orchard.Tests.Modules.Users.Controllers { builder.RegisterType().As(); builder.RegisterType(typeof(SettingsFormatter)).As(); builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterType().As().InstancePerDependency(); builder.RegisterInstance(new Mock().Object); diff --git a/src/Orchard.Tests.Modules/Users/Services/MembershipServiceTests.cs b/src/Orchard.Tests.Modules/Users/Services/MembershipServiceTests.cs index 50ac1e18d..04ccfa7ed 100644 --- a/src/Orchard.Tests.Modules/Users/Services/MembershipServiceTests.cs +++ b/src/Orchard.Tests.Modules/Users/Services/MembershipServiceTests.cs @@ -79,6 +79,7 @@ namespace Orchard.Tests.Modules.Users.Services { builder.RegisterType().As(); builder.RegisterType(typeof(SettingsFormatter)).As(); builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterInstance(new ShellSettings { Name = ShellSettings.DefaultName, DataProvider = "SqlCe" }); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Tests.Modules/Users/Services/UserServiceTests.cs b/src/Orchard.Tests.Modules/Users/Services/UserServiceTests.cs index f0cf2ede2..95655600d 100644 --- a/src/Orchard.Tests.Modules/Users/Services/UserServiceTests.cs +++ b/src/Orchard.Tests.Modules/Users/Services/UserServiceTests.cs @@ -91,6 +91,7 @@ namespace Orchard.Tests.Modules.Users.Services { builder.RegisterType().As(); builder.RegisterType(typeof(SettingsFormatter)).As(); builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Tests.Modules/Widgets/Services/WidgetsServiceTest.cs b/src/Orchard.Tests.Modules/Widgets/Services/WidgetsServiceTest.cs index 0b3463fe1..7ccc08bae 100644 --- a/src/Orchard.Tests.Modules/Widgets/Services/WidgetsServiceTest.cs +++ b/src/Orchard.Tests.Modules/Widgets/Services/WidgetsServiceTest.cs @@ -91,6 +91,7 @@ namespace Orchard.Tests.Modules.Widgets.Services { builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterInstance(new Mock().Object); builder.RegisterInstance(new Mock().Object); builder.RegisterInstance(new Mock().Object); diff --git a/src/Orchard.Tests/ContentManagement/ContentQueryTests.cs b/src/Orchard.Tests/ContentManagement/ContentQueryTests.cs index 7ef004dcc..2b4415b10 100644 --- a/src/Orchard.Tests/ContentManagement/ContentQueryTests.cs +++ b/src/Orchard.Tests/ContentManagement/ContentQueryTests.cs @@ -51,6 +51,7 @@ namespace Orchard.Tests.ContentManagement { builder.RegisterType().As().SingleInstance(); builder.RegisterType().As(); builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterInstance(new Mock().Object); builder.RegisterInstance(new Mock().Object); builder.RegisterInstance(new ShellSettings { Name = ShellSettings.DefaultName, DataProvider = "SqlCe" }); diff --git a/src/Orchard.Tests/ContentManagement/DefaultContentManagerTests.cs b/src/Orchard.Tests/ContentManagement/DefaultContentManagerTests.cs index 1640732a9..92476bb7f 100644 --- a/src/Orchard.Tests/ContentManagement/DefaultContentManagerTests.cs +++ b/src/Orchard.Tests/ContentManagement/DefaultContentManagerTests.cs @@ -63,6 +63,7 @@ namespace Orchard.Tests.ContentManagement { builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterInstance(_contentDefinitionManager.Object); builder.RegisterInstance(new Mock().Object); builder.RegisterInstance(new ShellSettings {Name = ShellSettings.DefaultName, DataProvider = "SqlCe"}); diff --git a/src/Orchard.Tests/ContentManagement/DynamicContentQueryTests.cs b/src/Orchard.Tests/ContentManagement/DynamicContentQueryTests.cs index 2517dfedf..331a83448 100644 --- a/src/Orchard.Tests/ContentManagement/DynamicContentQueryTests.cs +++ b/src/Orchard.Tests/ContentManagement/DynamicContentQueryTests.cs @@ -49,6 +49,7 @@ namespace Orchard.Tests.ContentManagement { builder.RegisterType().As().SingleInstance(); builder.RegisterType().As(); builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterInstance(new Mock().Object); builder.RegisterInstance(new Mock().Object); builder.RegisterInstance(new ShellSettings { Name = ShellSettings.DefaultName, DataProvider = "SqlCe" }); diff --git a/src/Orchard.Tests/ContentManagement/HqlExpressionTests.cs b/src/Orchard.Tests/ContentManagement/HqlExpressionTests.cs index 5bb8ca6ef..0824817a5 100644 --- a/src/Orchard.Tests/ContentManagement/HqlExpressionTests.cs +++ b/src/Orchard.Tests/ContentManagement/HqlExpressionTests.cs @@ -53,6 +53,7 @@ namespace Orchard.Tests.ContentManagement { builder.RegisterType().As().SingleInstance(); builder.RegisterType().As(); builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterInstance(new Mock().Object); builder.RegisterInstance(new Mock().Object); builder.RegisterInstance(new ShellSettings { Name = ShellSettings.DefaultName, DataProvider = "SqlCe" }); diff --git a/src/Orchard.Tests/Localization/CultureManagerTests.cs b/src/Orchard.Tests/Localization/CultureManagerTests.cs index 012e680d3..4a0d9e1ce 100644 --- a/src/Orchard.Tests/Localization/CultureManagerTests.cs +++ b/src/Orchard.Tests/Localization/CultureManagerTests.cs @@ -53,6 +53,7 @@ namespace Orchard.Tests.Localization { builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Web/Modules/Orchard.Projections/Tests/Services/FieldIndexServiceTests.cs b/src/Orchard.Web/Modules/Orchard.Projections/Tests/Services/FieldIndexServiceTests.cs index b52b0338e..979d2dceb 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/Tests/Services/FieldIndexServiceTests.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/Tests/Services/FieldIndexServiceTests.cs @@ -41,6 +41,7 @@ namespace Orchard.Projections.Tests.Services { // ContentDefinitionManager builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterInstance(new Mock().Object); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Web/Modules/Orchard.Projections/Tests/Services/FieldIndexStorageTests.cs b/src/Orchard.Web/Modules/Orchard.Projections/Tests/Services/FieldIndexStorageTests.cs index 5d371af2e..369be3238 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/Tests/Services/FieldIndexStorageTests.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/Tests/Services/FieldIndexStorageTests.cs @@ -48,6 +48,7 @@ namespace Orchard.Projections.Tests.Services { // ContentDefinitionManager builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterInstance(new Mock().Object); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard/ContentManagement/DefaultContentManager.cs b/src/Orchard/ContentManagement/DefaultContentManager.cs index 54873123e..bb27f4b2e 100644 --- a/src/Orchard/ContentManagement/DefaultContentManager.cs +++ b/src/Orchard/ContentManagement/DefaultContentManager.cs @@ -31,6 +31,7 @@ namespace Orchard.ContentManagement { private readonly IRepository _contentItemVersionRepository; private readonly IContentDefinitionManager _contentDefinitionManager; private readonly ICacheManager _cacheManager; + private readonly Func _contentManagerSession; private readonly Lazy _contentDisplay; private readonly Lazy _sessionLocator; private readonly Lazy> _handlers; @@ -49,6 +50,7 @@ namespace Orchard.ContentManagement { IRepository contentItemVersionRepository, IContentDefinitionManager contentDefinitionManager, ICacheManager cacheManager, + Func contentManagerSession, Lazy contentDisplay, Lazy sessionLocator, Lazy> handlers, @@ -62,6 +64,7 @@ namespace Orchard.ContentManagement { _contentItemVersionRepository = contentItemVersionRepository; _contentDefinitionManager = contentDefinitionManager; _cacheManager = cacheManager; + _contentManagerSession = contentManagerSession; _identityResolverSelectors = identityResolverSelectors; _sqlStatementProviders = sqlStatementProviders; _shellSettings = shellSettings; @@ -129,14 +132,29 @@ namespace Orchard.ContentManagement { } public virtual ContentItem Get(int id, VersionOptions options, QueryHints hints) { + var session = _contentManagerSession(); ContentItem contentItem; ContentItemVersionRecord versionRecord = null; // obtain the root records based on version options if (options.VersionRecordId != 0) { + // short-circuit if item held in session + if (session.RecallVersionRecordId(options.VersionRecordId, out contentItem)) { + return contentItem; + } + versionRecord = _contentItemVersionRepository.Get(options.VersionRecordId); } + else if (session.RecallContentRecordId(id, out contentItem)) { + // try to reload a previously loaded published content item + + if (options.IsPublished) { + return contentItem; + } + + versionRecord = contentItem.VersionRecord; + } else { // do a query to load the records in case Get is called directly var contentItemVersionRecords = GetManyImplementation(hints, @@ -189,10 +207,21 @@ namespace Orchard.ContentManagement { } } + // return item if obtained earlier in session + if (session.RecallVersionRecordId(versionRecord.Id, out contentItem)) { + if (options.IsDraftRequired && versionRecord.Published) { + return BuildNewVersion(contentItem); + } + return contentItem; + } + // allocate instance and set record property contentItem = New(versionRecord.ContentItemRecord.ContentType.Name); contentItem.VersionRecord = versionRecord; + // store in session prior to loading to avoid some problems with simple circular dependencies + session.Store(contentItem); + // create a context with a new instance to load var context = new LoadContentContext(contentItem); @@ -620,8 +649,9 @@ namespace Orchard.ContentManagement { } public void Clear() { - //var session = _sessionLocator.Value.For(typeof(ContentItemRecord)); - //session.Clear(); + var session = _sessionLocator.Value.For(typeof(ContentItemRecord)); + session.Clear(); + _contentManagerSession().Clear(); } public IContentQuery Query() { diff --git a/src/Orchard/ContentManagement/DefaultContentManagerSession.cs b/src/Orchard/ContentManagement/DefaultContentManagerSession.cs new file mode 100644 index 000000000..01c5572a6 --- /dev/null +++ b/src/Orchard/ContentManagement/DefaultContentManagerSession.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; + +namespace Orchard.ContentManagement { + public class DefaultContentManagerSession : IContentManagerSession { + private readonly IDictionary _itemByVersionRecordId = new Dictionary(); + private readonly IDictionary _publishedItemsByContentRecordId = new Dictionary(); + + public void Store(ContentItem item) { + _itemByVersionRecordId.Add(item.VersionRecord.Id, item); + + // is it the Published version ? + if (item.VersionRecord.Latest && item.VersionRecord.Published) { + _publishedItemsByContentRecordId[item.Id] = item; + } + } + + public bool RecallVersionRecordId(int id, out ContentItem item) { + return _itemByVersionRecordId.TryGetValue(id, out item); + } + + public bool RecallContentRecordId(int id, out ContentItem item) { + return _publishedItemsByContentRecordId.TryGetValue(id, out item); + } + + public void Clear() { + _itemByVersionRecordId.Clear(); + _publishedItemsByContentRecordId.Clear(); + } + } +} diff --git a/src/Orchard/ContentManagement/IContentManagerSession.cs b/src/Orchard/ContentManagement/IContentManagerSession.cs index b95dbd9b0..8de1a3b6b 100644 --- a/src/Orchard/ContentManagement/IContentManagerSession.cs +++ b/src/Orchard/ContentManagement/IContentManagerSession.cs @@ -1,6 +1,4 @@ -using System; -namespace Orchard.ContentManagement { - [Obsolete] +namespace Orchard.ContentManagement { public interface IContentManagerSession : IDependency { void Store(ContentItem item); bool RecallVersionRecordId(int id, out ContentItem item); diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 13c49eaae..7d9d4539a 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -382,6 +382,9 @@ Code + + Code + Code