diff --git a/src/Orchard.Tests/ContentManagement/ContentIdentityTests.cs b/src/Orchard.Tests/ContentManagement/ContentIdentityTests.cs index 31e5c807b..669aad366 100644 --- a/src/Orchard.Tests/ContentManagement/ContentIdentityTests.cs +++ b/src/Orchard.Tests/ContentManagement/ContentIdentityTests.cs @@ -39,6 +39,30 @@ namespace Orchard.Tests.ContentManagement { var identity2 = new ContentIdentity(@"/foo=bar/abaz=quux\/fr\\ed=foo/yarg=yiu=foo"); Assert.That(comparer.Equals(identity2, new ContentIdentity(identity2.ToString()))); } + + [Test] + public void ContentIdentityCanSeePartialMatchesAreEquivalent() { + var identity1 = new ContentIdentity("/bar=baz/a=b"); + var identity2 = new ContentIdentity(@"/foo=bar/bar=baz/glop=glop"); + Assert.That(ContentIdentity.ContentIdentityEqualityComparer.AreEquivalent(identity1, identity2)); + Assert.That(ContentIdentity.ContentIdentityEqualityComparer.AreEquivalent(identity2, identity1)); + } + + [Test] + public void ContentIdentityCanSeeFullMatchesAreEquivalent() { + var identity1 = new ContentIdentity(@"/foo=bar/bar=baz/glop=glop"); + var identity2 = new ContentIdentity(@"/foo=bar/bar=baz/glop=glop"); + Assert.That(ContentIdentity.ContentIdentityEqualityComparer.AreEquivalent(identity1, identity2)); + Assert.That(ContentIdentity.ContentIdentityEqualityComparer.AreEquivalent(identity2, identity1)); + } + + [Test] + public void ContentIdentityCanSeeNonMatchesAreNotEquivalent() { + var identity1 = new ContentIdentity(@"/a=b/foo=baz"); + var identity2 = new ContentIdentity(@"/foo=bar/bar=baz/glop=glop"); + Assert.IsFalse(ContentIdentity.ContentIdentityEqualityComparer.AreEquivalent(identity1, identity2)); + Assert.IsFalse(ContentIdentity.ContentIdentityEqualityComparer.AreEquivalent(identity2, identity1)); + } } } diff --git a/src/Orchard.Web/Core/Common/Services/IdentifierResolverSelector.cs b/src/Orchard.Web/Core/Common/Services/IdentifierResolverSelector.cs index 7fa7a182d..1dff609c5 100644 --- a/src/Orchard.Web/Core/Common/Services/IdentifierResolverSelector.cs +++ b/src/Orchard.Web/Core/Common/Services/IdentifierResolverSelector.cs @@ -29,12 +29,12 @@ namespace Orchard.Core.Common.Services { return null; } - var comparer = new ContentIdentity.ContentIdentityEqualityComparer(); return _contentManager .Query() .Where(p => p.Identifier == identifier) .List() - .Where(c => comparer.Equals(identity, _contentManager.GetItemMetadata(c).Identity)); + .Where(c => ContentIdentity.ContentIdentityEqualityComparer.AreEquivalent( + identity, _contentManager.GetItemMetadata(c).Identity)); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/DataRecipeHandler.cs b/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/DataRecipeHandler.cs index 8d681cb50..d0ef41e92 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/DataRecipeHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/DataRecipeHandler.cs @@ -37,7 +37,7 @@ namespace Orchard.Recipes.RecipeHandlers { //Populate import session with all identities to be imported foreach (var identity in elementDictionary.Keys) { - importContentSession.Set(identity.ToString(), elementDictionary[identity].Name.LocalName); + importContentSession.Set(identity, elementDictionary[identity].Name.LocalName); } //Determine if the import is to be batched in multiple transactions @@ -45,16 +45,17 @@ namespace Orchard.Recipes.RecipeHandlers { int batchSize = GetBatchSizeForDataStep(recipeContext.RecipeStep.Step); //Run the import - ContentIdentity nextIdentity = null; try { while (startIndex < elementDictionary.Count) { importContentSession.InitializeBatch(startIndex, batchSize); //the session determines which items are included in the current batch //so that dependencies can be managed within the same transaction - nextIdentity = importContentSession.GetNextInBatch(); + var nextIdentity = importContentSession.GetNextInBatch(); while (nextIdentity != null) { - _orchardServices.ContentManager.Import(elementDictionary[nextIdentity], importContentSession); + _orchardServices.ContentManager.Import( + elementDictionary[nextIdentity.ToString()], + importContentSession); nextIdentity = importContentSession.GetNextInBatch(); } @@ -75,13 +76,14 @@ namespace Orchard.Recipes.RecipeHandlers { recipeContext.Executed = true; } - private Dictionary CreateElementDictionary(XElement step) { - var elementDictionary = new Dictionary(new ContentIdentity.ContentIdentityEqualityComparer()); + private Dictionary CreateElementDictionary(XElement step) { + var elementDictionary = new Dictionary(); foreach (var element in step.Elements()) { - if (element.Attribute("Id") == null || string.IsNullOrEmpty(element.Attribute("Id").Value)) + if (element.Attribute("Id") == null + || string.IsNullOrEmpty(element.Attribute("Id").Value)) continue; - var identity = new ContentIdentity(element.Attribute("Id").Value); + var identity = new ContentIdentity(element.Attribute("Id").Value).ToString(); elementDictionary[identity] = element; } return elementDictionary; diff --git a/src/Orchard.Web/Modules/Orchard.Users/Services/UserResolverSelector.cs b/src/Orchard.Web/Modules/Orchard.Users/Services/UserResolverSelector.cs index 1c6feb7c5..0641551cc 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Services/UserResolverSelector.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/Services/UserResolverSelector.cs @@ -29,12 +29,12 @@ namespace Orchard.Users.Services { return null; } - var comparer = new ContentIdentity.ContentIdentityEqualityComparer(); return _contentManager .Query() .Where(p => p.UserName == identifier) .List() - .Where(c => comparer.Equals(identity, _contentManager.GetItemMetadata(c).Identity)); + .Where(c => ContentIdentity.ContentIdentityEqualityComparer.AreEquivalent( + identity, _contentManager.GetItemMetadata(c).Identity)); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Services/LayerResolverSelector.cs b/src/Orchard.Web/Modules/Orchard.Widgets/Services/LayerResolverSelector.cs index aa9de0020..9b4b95c13 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/Services/LayerResolverSelector.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Services/LayerResolverSelector.cs @@ -29,12 +29,12 @@ namespace Orchard.Widgets.Services { return null; } - var comparer = new ContentIdentity.ContentIdentityEqualityComparer(); return _contentManager .Query() .Where(p => p.Name == identifier) .List() - .Where(c => comparer.Equals(identity, _contentManager.GetItemMetadata(c).Identity)); + .Where(c => ContentIdentity.ContentIdentityEqualityComparer.AreEquivalent( + identity, _contentManager.GetItemMetadata(c).Identity)); } } } \ No newline at end of file diff --git a/src/Orchard/ContentManagement/ContentIdentity.cs b/src/Orchard/ContentManagement/ContentIdentity.cs index a7e093b7b..aafe76ac0 100644 --- a/src/Orchard/ContentManagement/ContentIdentity.cs +++ b/src/Orchard/ContentManagement/ContentIdentity.cs @@ -144,6 +144,17 @@ namespace Orchard.ContentManagement { public class ContentIdentityEqualityComparer : IEqualityComparer { + public static bool AreEquivalent(ContentIdentity contentIdentity1, ContentIdentity contentIdentity2) { + if (contentIdentity1 == null) return contentIdentity2 == null; + if (contentIdentity2 == null) return false; + return contentIdentity1._dictionary.Keys + .Any(k => { + var other = contentIdentity2.Get(k); + if (other == null) return false; + return contentIdentity1._dictionary[k] == other; + }); + } + public bool Equals(ContentIdentity contentIdentity1, ContentIdentity contentIdentity2) { if (contentIdentity1._dictionary.Keys.Count != contentIdentity2._dictionary.Keys.Count) return false; diff --git a/src/Orchard/ContentManagement/ImportContentSession.cs b/src/Orchard/ContentManagement/ImportContentSession.cs index cd2d2ac6f..0eeacf361 100644 --- a/src/Orchard/ContentManagement/ImportContentSession.cs +++ b/src/Orchard/ContentManagement/ImportContentSession.cs @@ -6,7 +6,6 @@ namespace Orchard.ContentManagement { // Maps content identities to content items on the importer. public class ImportContentSession { private readonly IContentManager _contentManager; - private readonly ContentIdentity.ContentIdentityEqualityComparer _identityComparer; private readonly Dictionary _identities; private readonly Dictionary _contentTypes; @@ -21,15 +20,15 @@ namespace Orchard.ContentManagement { private int _currentIndex; public ImportContentSession(IContentManager contentManager) { - _identityComparer = new ContentIdentity.ContentIdentityEqualityComparer(); + var identityComparer = new ContentIdentity.ContentIdentityEqualityComparer(); _contentManager = contentManager; - _identities = new Dictionary(_identityComparer); - _contentTypes = new Dictionary(_identityComparer); + _identities = new Dictionary(identityComparer); + _contentTypes = new Dictionary(identityComparer); _draftVersionRecordIds = new Dictionary(); _allIdentitiesForImport = new List(); - _allIdentitiesForImportStatus = new Dictionary(_identityComparer); + _allIdentitiesForImportStatus = new Dictionary(identityComparer); _dependencyIdentities = new Queue(); }