diff --git a/src/Orchard.Tests/ContentManagement/DefaultContentManagerTests.cs b/src/Orchard.Tests/ContentManagement/DefaultContentManagerTests.cs index d9613db7f..2f6f706fc 100644 --- a/src/Orchard.Tests/ContentManagement/DefaultContentManagerTests.cs +++ b/src/Orchard.Tests/ContentManagement/DefaultContentManagerTests.cs @@ -532,13 +532,13 @@ namespace Orchard.Tests.ContentManagement { } - [Test, Ignore("Fix pending")] + [Test] public void ExistingTypeAndPartDefinitionShouldBeUsed() { var alphaType = new ContentTypeDefinitionBuilder() .Named(DefaultAlphaName) .WithSetting("x", "1") .WithPart("foo") - .WithPart("Flavored", part => part.WithSetting("spin", "clockwise")) + .WithPart("FlavoredPart", part => part.WithSetting("spin", "clockwise")) .Build(); _contentDefinitionManager diff --git a/src/Orchard.Tests/DisplayManagement/DefaultDisplayManagerTests.cs b/src/Orchard.Tests/DisplayManagement/DefaultDisplayManagerTests.cs index bb5b9bef6..e05bec7c3 100644 --- a/src/Orchard.Tests/DisplayManagement/DefaultDisplayManagerTests.cs +++ b/src/Orchard.Tests/DisplayManagement/DefaultDisplayManagerTests.cs @@ -25,7 +25,6 @@ namespace Orchard.Tests.DisplayManagement { CurrentTheme = new ExtensionDescriptor { Id = "Hello" } }; - builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Tests/Environment/Extensions/ExtensionManagerTests.cs b/src/Orchard.Tests/Environment/Extensions/ExtensionManagerTests.cs index b2e7dd2c7..70ea3f52f 100644 --- a/src/Orchard.Tests/Environment/Extensions/ExtensionManagerTests.cs +++ b/src/Orchard.Tests/Environment/Extensions/ExtensionManagerTests.cs @@ -309,10 +309,12 @@ Features: } } - [Test, Ignore("This assertion appears to be inconsistent with the comment in extension manager - an empty feature is returned")] - public void ExtensionManagerShouldThrowIfFeatureDoesNotExist() { - var featureDescriptor = new FeatureDescriptor { Id = "NoSuchFeature", Extension = new ExtensionDescriptor { Name = "NoSuchFeature" } }; - Assert.Throws(() => _manager.LoadFeatures(new[] { featureDescriptor })); + [Test] + public void ExtensionManagerShouldReturnEmptyFeatureIfFeatureDoesNotExist() { + var featureDescriptor = new FeatureDescriptor { Id = "NoSuchFeature", Extension = new ExtensionDescriptor { Id = "NoSuchFeature" } }; + Feature feature = _manager.LoadFeatures(new[] { featureDescriptor }).First(); + Assert.AreEqual(featureDescriptor, feature.Descriptor); + Assert.AreEqual(0, feature.ExportedTypes.Count()); } [Test] diff --git a/src/Orchard.Tests/Mvc/OrchardControllerFactoryTests.cs b/src/Orchard.Tests/Mvc/OrchardControllerFactoryTests.cs index 6b6ee4950..38ec3b36c 100644 --- a/src/Orchard.Tests/Mvc/OrchardControllerFactoryTests.cs +++ b/src/Orchard.Tests/Mvc/OrchardControllerFactoryTests.cs @@ -25,6 +25,7 @@ namespace Orchard.Tests.Mvc { .Keyed(typeof(FooController)) .WithMetadata("ControllerType", typeof(FooController)) .InstancePerDependency(); + builder.RegisterType() .Keyed("/bar") .Keyed(typeof(BarController)) @@ -59,8 +60,7 @@ namespace Orchard.Tests.Mvc { Assert.That(controller, Is.TypeOf()); } - [Test] - [Ignore("OrchardControllerFactory depends on metadata, calling base when no context is causing errors.")] + [Test, Ignore("OrchardControllerFactory depends on metadata, calling base when no context is causing errors.")] public void WhenNullOrMissingContainerNormalControllerFactoryRulesShouldBeUsedAsFallback() { var requestContext = GetRequestContext(null); var controller = _controllerFactory.CreateController(requestContext, "foo"); diff --git a/src/Orchard.Tests/Stubs/StubCacheManager.cs b/src/Orchard.Tests/Stubs/StubCacheManager.cs index 36d215d1b..0537ef6e0 100644 --- a/src/Orchard.Tests/Stubs/StubCacheManager.cs +++ b/src/Orchard.Tests/Stubs/StubCacheManager.cs @@ -16,4 +16,4 @@ namespace Orchard.Tests.Stubs { return _defaultCacheManager.GetCache(); } } -} \ No newline at end of file +} diff --git a/src/Orchard/Caching/DefaultCacheHolder.cs b/src/Orchard/Caching/DefaultCacheHolder.cs index 972882b1a..d30d886e9 100644 --- a/src/Orchard/Caching/DefaultCacheHolder.cs +++ b/src/Orchard/Caching/DefaultCacheHolder.cs @@ -2,6 +2,10 @@ using System; using System.Collections.Concurrent; namespace Orchard.Caching { + /// + /// Provides the default implementation for a cache holder. + /// The cache holder is responsible for actually storing the references to cached entities. + /// public class DefaultCacheHolder : ICacheHolder { private readonly ConcurrentDictionary _caches = new ConcurrentDictionary(); @@ -11,10 +15,17 @@ namespace Orchard.Caching { } } + /// + /// Gets a Cache entry from the cache. If none is found, an empty one is created and returned. + /// + /// The type of the key within the component. + /// The type of the result. + /// The component context. + /// An entry from the cache, or a new, empty one, if none is found. public ICache GetCache(Type component) { var cacheKey = new CacheKey(component, typeof(TKey), typeof(TResult)); var result = _caches.GetOrAdd(cacheKey, k => new Cache()); return (Cache)result; } } -} \ No newline at end of file +} diff --git a/src/Orchard/Caching/DefaultCacheManager.cs b/src/Orchard/Caching/DefaultCacheManager.cs index 8fdb2eebc..a77303028 100644 --- a/src/Orchard/Caching/DefaultCacheManager.cs +++ b/src/Orchard/Caching/DefaultCacheManager.cs @@ -1,15 +1,30 @@ using System; namespace Orchard.Caching { + /// + /// Provides the default implementation for a cache manager. + /// The cache manager provides an abstraction over the cache holder allowing it to be easily swaped and isolating it within a component context. + /// public class DefaultCacheManager : ICacheManager { private readonly Type _component; private readonly ICacheHolder _cacheHolder; + /// + /// Constructs a new cache manager for a given component type and with a specific cache holder implementation. + /// + /// The component to which the cache applies (context). + /// The cache holder that contains the entities cached. public DefaultCacheManager(Type component, ICacheHolder cacheHolder) { _component = component; _cacheHolder = cacheHolder; } + /// + /// Gets a cache entry from the cache holder. + /// + /// The type of the key to be used to fetch the cache entry. + /// The type of the entry to be obtained from the cache. + /// The entry from the cache. public ICache GetCache() { return _cacheHolder.GetCache(_component); } diff --git a/src/Orchard/ContentManagement/ContentItem.cs b/src/Orchard/ContentManagement/ContentItem.cs index a6f751230..b34545a2d 100644 --- a/src/Orchard/ContentManagement/ContentItem.cs +++ b/src/Orchard/ContentManagement/ContentItem.cs @@ -10,7 +10,6 @@ namespace Orchard.ContentManagement { _parts = new List(); } - private readonly IList _parts; ContentItem IContent.ContentItem { get { return this; } } diff --git a/src/Orchard/ContentManagement/DefaultContentManager.cs b/src/Orchard/ContentManagement/DefaultContentManager.cs index 7081bd87c..032e04756 100644 --- a/src/Orchard/ContentManagement/DefaultContentManager.cs +++ b/src/Orchard/ContentManagement/DefaultContentManager.cs @@ -128,7 +128,6 @@ namespace Orchard.ContentManagement { return contentItem; } - // allocate instance and set record property contentItem = New(versionRecord.ContentItemRecord.ContentType.Name); contentItem.VersionRecord = versionRecord; @@ -398,13 +397,8 @@ namespace Orchard.ContentManagement { Handlers.Invoke(handler => handler.Indexed(indexContentContext), Logger); } - - //public ISearchBuilder Search() { - // return _indexManager.HasIndexProvider() - // ? _indexManager.GetSearchIndexProvider().CreateSearchBuilder("Search") - // : new NullSearchBuilder(); - //} } + class CallSiteCollection : ConcurrentDictionary>> { readonly Func>> _valueFactory; diff --git a/src/Orchard/ContentManagement/Handlers/ContentItemBuilder.cs b/src/Orchard/ContentManagement/Handlers/ContentItemBuilder.cs index 1d2498493..621bfb92a 100644 --- a/src/Orchard/ContentManagement/Handlers/ContentItemBuilder.cs +++ b/src/Orchard/ContentManagement/Handlers/ContentItemBuilder.cs @@ -2,12 +2,21 @@ using Orchard.ContentManagement.MetaData.Models; namespace Orchard.ContentManagement.Handlers { + /// + /// Builds a contentitem based on its the type definition (). + /// public class ContentItemBuilder { private readonly ContentTypeDefinition _definition; private readonly ContentItem _item; + /// + /// Constructs a new Content Item Builder instance. + /// + /// The definition for the content item to be built. public ContentItemBuilder(ContentTypeDefinition definition) { _definition = definition; + + // TODO: could / should be done on the build method ? _item = new ContentItem { ContentType = definition.Name, TypeDefinition = definition @@ -18,23 +27,37 @@ namespace Orchard.ContentManagement.Handlers { return _item; } + /// + /// Welds a new part to the content item. If a part of the same type is already welded nothing is done. + /// + /// The type of the part to be welded. + /// A new Content Item Builder with the item having the new part welded. public ContentItemBuilder Weld() where TPart : ContentPart, new() { - var partName = typeof(TPart).Name; - var typePartDefinition = _definition.Parts.FirstOrDefault(p => p.PartDefinition.Name == partName); - if (typePartDefinition == null) { - typePartDefinition = new ContentTypePartDefinition( - new ContentPartDefinition(partName), - new SettingsDictionary()); + // if the part hasn't be weld yet + if (_item.Parts.FirstOrDefault(part => part.GetType().Equals(typeof(TPart))) == null) { + var partName = typeof(TPart).Name; - var part = new TPart { - TypePartDefinition = typePartDefinition - }; + // obtain the type definition for the part + var typePartDefinition = _definition.Parts.FirstOrDefault(p => p.PartDefinition.Name == partName); + if (typePartDefinition == null) { + // If the content item's type definition does not define the part; use an empty type definition. + typePartDefinition = new ContentTypePartDefinition( + new ContentPartDefinition(partName), + new SettingsDictionary()); + } + + // build and weld the part + var part = new TPart { TypePartDefinition = typePartDefinition }; _item.Weld(part); } + return this; } + /// + /// Welds a part to the content item. + /// public ContentItemBuilder Weld(ContentPart contentPart) { _item.Weld(contentPart); return this; diff --git a/src/Orchard/ContentManagement/MetaData/Builders/ContentTypeDefinitionBuilder.cs b/src/Orchard/ContentManagement/MetaData/Builders/ContentTypeDefinitionBuilder.cs index bc9630647..8092f7dd7 100644 --- a/src/Orchard/ContentManagement/MetaData/Builders/ContentTypeDefinitionBuilder.cs +++ b/src/Orchard/ContentManagement/MetaData/Builders/ContentTypeDefinitionBuilder.cs @@ -27,10 +27,6 @@ namespace Orchard.ContentManagement.MetaData.Builders { } } - private void Init(ContentTypeDefinition existing) { - - } - public ContentTypeDefinition Build() { return new ContentTypeDefinition(_name, _displayName, _parts, _settings); } @@ -92,6 +88,5 @@ namespace Orchard.ContentManagement.MetaData.Builders { return new ContentTypePartDefinition(_partDefinition, _settings); } } - } } diff --git a/src/Orchard/ContentManagement/MetaData/Builders/ContentTypePartDefinitionBuilder.cs b/src/Orchard/ContentManagement/MetaData/Builders/ContentTypePartDefinitionBuilder.cs index 479443729..04c2d008e 100644 --- a/src/Orchard/ContentManagement/MetaData/Builders/ContentTypePartDefinitionBuilder.cs +++ b/src/Orchard/ContentManagement/MetaData/Builders/ContentTypePartDefinitionBuilder.cs @@ -17,4 +17,4 @@ namespace Orchard.ContentManagement.MetaData.Builders { return this; } } -} \ No newline at end of file +} diff --git a/src/Orchard/Environment/Extensions/ExtensionManager.cs b/src/Orchard/Environment/Extensions/ExtensionManager.cs index 72e9f6b22..4b02ddd40 100644 --- a/src/Orchard/Environment/Extensions/ExtensionManager.cs +++ b/src/Orchard/Environment/Extensions/ExtensionManager.cs @@ -73,7 +73,6 @@ namespace Orchard.Environment.Extensions { } private Feature LoadFeature(FeatureDescriptor featureDescriptor) { - var extensionDescriptor = featureDescriptor.Extension; var featureId = featureDescriptor.Id; var extensionId = extensionDescriptor.Id; @@ -94,6 +93,7 @@ namespace Orchard.Environment.Extensions { Logger.Error(ex, "Error loading extension '{0}'", extensionId); throw new OrchardException(T("Error while loading extension '{0}'.", extensionId), ex); } + if (extensionEntry == null) { // If the feature could not be compiled for some reason, // return a "null" feature, i.e. a feature with no exported types. diff --git a/src/Orchard/Mvc/OrchardControllerFactory.cs b/src/Orchard/Mvc/OrchardControllerFactory.cs index 66342d054..e0330a326 100644 --- a/src/Orchard/Mvc/OrchardControllerFactory.cs +++ b/src/Orchard/Mvc/OrchardControllerFactory.cs @@ -42,6 +42,7 @@ namespace Orchard.Mvc { return (Type) info.Metadata["ControllerType"]; } + // fail as appropriate for MVC's expectations return null; } @@ -52,6 +53,7 @@ namespace Orchard.Mvc { return controller; } + // fail as appropriate for MVC's expectations return null; }