diff --git a/src/Spring/Spring.Aop/Aop/Framework/AutoProxy/InheritanceBasedAopConfigurer.cs b/src/Spring/Spring.Aop/Aop/Framework/AutoProxy/InheritanceBasedAopConfigurer.cs index 3269320b..7c98814c 100644 --- a/src/Spring/Spring.Aop/Aop/Framework/AutoProxy/InheritanceBasedAopConfigurer.cs +++ b/src/Spring/Spring.Aop/Aop/Framework/AutoProxy/InheritanceBasedAopConfigurer.cs @@ -182,8 +182,7 @@ namespace Spring.Aop.Framework.AutoProxy string name = objectDefinitionNames[i]; if (IsObjectNameMatch(name)) { - IConfigurableObjectDefinition definition = - factory.GetObjectDefinition(name) as IConfigurableObjectDefinition; + var definition = factory.GetObjectDefinition(name) as IConfigurableObjectDefinition; if (definition == null || IsInfrastructureType(definition.ObjectType, name)) { diff --git a/src/Spring/Spring.Core/Context/Support/AbstractApplicationContext.cs b/src/Spring/Spring.Core/Context/Support/AbstractApplicationContext.cs index 85944326..57776920 100644 --- a/src/Spring/Spring.Core/Context/Support/AbstractApplicationContext.cs +++ b/src/Spring/Spring.Core/Context/Support/AbstractApplicationContext.cs @@ -1338,7 +1338,21 @@ namespace Spring.Context.Support /// public IList GetObjectDefinitionNames() { - return ObjectFactory.GetObjectDefinitionNames(); + return GetObjectDefinitionNames(false); + } + + /// + /// Return the names of all objects defined in this factory, if includeAncestorsis true + /// includes all parent factories. + /// + /// to include parent factories into result + /// + /// The names of all objects defined in this factory, if includeAncestors is true includes all + /// objects defined in parent factories, or an empty array if none are defined. + /// + public IList GetObjectDefinitionNames(bool includeAncestors) + { + return ObjectFactory.GetObjectDefinitionNames(includeAncestors); } /// diff --git a/src/Spring/Spring.Core/Objects/Factory/Config/ISingletonObjectRegistry.cs b/src/Spring/Spring.Core/Objects/Factory/Config/ISingletonObjectRegistry.cs index e1019486..311346ed 100644 --- a/src/Spring/Spring.Core/Objects/Factory/Config/ISingletonObjectRegistry.cs +++ b/src/Spring/Spring.Core/Objects/Factory/Config/ISingletonObjectRegistry.cs @@ -20,6 +20,8 @@ using System.Collections.Generic; +using Spring.Objects.Factory.Support; + namespace Spring.Objects.Factory.Config { /// @@ -138,8 +140,8 @@ namespace Spring.Objects.Factory.Config /// /// The list of names as String array (never null). /// - /// - /// + /// + /// IList SingletonNames { get; diff --git a/src/Spring/Spring.Core/Objects/Factory/Config/PropertyPlaceholderConfigurer.cs b/src/Spring/Spring.Core/Objects/Factory/Config/PropertyPlaceholderConfigurer.cs index a0c862cd..13dd40e9 100644 --- a/src/Spring/Spring.Core/Objects/Factory/Config/PropertyPlaceholderConfigurer.cs +++ b/src/Spring/Spring.Core/Objects/Factory/Config/PropertyPlaceholderConfigurer.cs @@ -161,6 +161,7 @@ namespace Spring.Objects.Factory.Config private string placeholderPrefix = DefaultPlaceholderPrefix; private string placeholderSuffix = DefaultPlaceholderSuffix; private EnvironmentVariableMode environmentVariableMode = EnvironmentVariableMode.Fallback; + private bool includeAncestors; /// /// Initializes the new instance @@ -171,6 +172,7 @@ namespace Spring.Objects.Factory.Config } #region Properties + /// /// The placeholder prefix (the default is ${). /// @@ -214,6 +216,11 @@ namespace Spring.Objects.Factory.Config set { environmentVariableMode = value; } } + public bool IncludeAncestors + { + set { includeAncestors = value; } + } + #endregion /// @@ -233,12 +240,19 @@ namespace Spring.Objects.Factory.Config PlaceholderResolveHandlerAdapter resolveAdapter = new PlaceholderResolveHandlerAdapter(this, props); ObjectDefinitionVisitor visitor = new ObjectDefinitionVisitor(resolveAdapter.ParseAndResolveVariables); - IList objectDefinitionNames = factory.GetObjectDefinitionNames(); + IList objectDefinitionNames = factory.GetObjectDefinitionNames(includeAncestors); for (int i = 0; i < objectDefinitionNames.Count; ++i) { string name = objectDefinitionNames[i]; - IObjectDefinition definition = factory.GetObjectDefinition(name); - try + IObjectDefinition definition = factory.GetObjectDefinition(name, includeAncestors); + + if (definition == null) + { + logger.ErrorFormat("'{0}' can't be found in factorys' '{1}' object definition (includeAncestor {2})", name, factory, includeAncestors); + continue; + } + + try { visitor.VisitObjectDefinition(definition); } diff --git a/src/Spring/Spring.Core/Objects/Factory/Config/VariablePlaceholderConfigurer.cs b/src/Spring/Spring.Core/Objects/Factory/Config/VariablePlaceholderConfigurer.cs index bbb18561..bdade2da 100644 --- a/src/Spring/Spring.Core/Objects/Factory/Config/VariablePlaceholderConfigurer.cs +++ b/src/Spring/Spring.Core/Objects/Factory/Config/VariablePlaceholderConfigurer.cs @@ -1,19 +1,19 @@ #region License -/* - * Copyright 2002-2010 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ #endregion @@ -79,6 +79,7 @@ namespace Spring.Objects.Factory.Config private int order = Int32.MaxValue; // default: same as non-Ordered + private bool includeAncestors; private bool ignoreUnresolvablePlaceholders; private string placeholderPrefix = DefaultPlaceholderPrefix; private string placeholderSuffix = DefaultPlaceholderSuffix; @@ -160,6 +161,11 @@ namespace Spring.Objects.Factory.Config set { ignoreUnresolvablePlaceholders = value; } } + public bool IncludeAncestors + { + set { includeAncestors = value; } + } + #endregion #region IObjectFactoryPostProcessor Members @@ -246,11 +252,15 @@ namespace Spring.Objects.Factory.Config TextProcessor tp = new TextProcessor(this, compositeVariableSource); ObjectDefinitionVisitor visitor = new ObjectDefinitionVisitor(new ObjectDefinitionVisitor.ResolveHandler(tp.ParseAndResolveVariables)); - IList objectDefinitionNames = factory.GetObjectDefinitionNames(); + IList objectDefinitionNames = factory.GetObjectDefinitionNames(includeAncestors); for (int i = 0; i < objectDefinitionNames.Count; ++i) { string name = objectDefinitionNames[i]; - IObjectDefinition definition = factory.GetObjectDefinition( name ); + IObjectDefinition definition = factory.GetObjectDefinition( name, includeAncestors ); + + if (definition == null) + continue; + try { visitor.VisitObjectDefinition( definition ); diff --git a/src/Spring/Spring.Core/Objects/Factory/IListableObjectFactory.cs b/src/Spring/Spring.Core/Objects/Factory/IListableObjectFactory.cs index c7a832b6..98650096 100644 --- a/src/Spring/Spring.Core/Objects/Factory/IListableObjectFactory.cs +++ b/src/Spring/Spring.Core/Objects/Factory/IListableObjectFactory.cs @@ -96,6 +96,17 @@ namespace Spring.Objects.Factory /// IList GetObjectDefinitionNames(); + /// + /// Return the names of all objects defined in this factory, if includeAncestors is true + /// includes all parent factories. + /// + /// to include parent factories in result + /// + /// The names of all objects defined in this factory, if includeAncestors is true includes all + /// objects defined in parent factories, or an empty array if none are defined. + /// + IList GetObjectDefinitionNames(bool includeAncestors); + /// /// Return the names of objects matching the given /// (including subclasses), judging from the object definitions. @@ -121,7 +132,6 @@ namespace Spring.Objects.Factory /// IList GetObjectNamesForType(Type type); - /// /// Return the names of objects matching the given /// (including subclasses), judging from the object definitions. diff --git a/src/Spring/Spring.Core/Objects/Factory/ObjectFactoryUtils.cs b/src/Spring/Spring.Core/Objects/Factory/ObjectFactoryUtils.cs index 99887898..41b8fe7c 100644 --- a/src/Spring/Spring.Core/Objects/Factory/ObjectFactoryUtils.cs +++ b/src/Spring/Spring.Core/Objects/Factory/ObjectFactoryUtils.cs @@ -142,7 +142,7 @@ namespace Spring.Objects.Factory /// If this isn't also an /// , /// this method will return the same as it's own - /// + /// /// method. /// /// @@ -197,11 +197,8 @@ namespace Spring.Objects.Factory ///

/// /// - /// If this isn't also an - /// , - /// this method will return the same as it's own - /// - /// method. + /// If this isn't also an , + /// this method will return the same as it's own method. /// /// /// The that objects must match. @@ -209,8 +206,7 @@ namespace Spring.Objects.Factory /// /// The array of object names, or an empty array if none. /// - public static IList ObjectNamesForTypeIncludingAncestors( - IListableObjectFactory factory, Type type) + public static IList ObjectNamesForTypeIncludingAncestors(IListableObjectFactory factory, Type type) { return factory.GetObjectNamesForType(type); } diff --git a/src/Spring/Spring.Core/Objects/Factory/Support/AbstractObjectFactory.cs b/src/Spring/Spring.Core/Objects/Factory/Support/AbstractObjectFactory.cs index 4cd65361..2f47c01b 100644 --- a/src/Spring/Spring.Core/Objects/Factory/Support/AbstractObjectFactory.cs +++ b/src/Spring/Spring.Core/Objects/Factory/Support/AbstractObjectFactory.cs @@ -2739,8 +2739,8 @@ namespace Spring.Objects.Factory.Support /// /// /// - /// - /// + /// + /// public IList SingletonNames { get diff --git a/src/Spring/Spring.Core/Objects/Factory/Support/DefaultListableObjectFactory.cs b/src/Spring/Spring.Core/Objects/Factory/Support/DefaultListableObjectFactory.cs index f1504089..8f7083c7 100644 --- a/src/Spring/Spring.Core/Objects/Factory/Support/DefaultListableObjectFactory.cs +++ b/src/Spring/Spring.Core/Objects/Factory/Support/DefaultListableObjectFactory.cs @@ -181,7 +181,7 @@ namespace Spring.Objects.Factory.Support /// ///

/// Called by autowiring. If a subclass cannot obtain information about object - /// names by , a corresponding exception should be thrown. + /// -pnames by , a corresponding exception should be thrown. ///

///
/// @@ -275,31 +275,16 @@ namespace Spring.Objects.Factory.Support return (objectType != null && type.IsAssignableFrom(objectType)); } - private bool IsObjectDefinitionTypeMatch(string name, Type checkedType) + private bool IsObjectDefinitionTypeMatch(string name, Type checkedType, bool includeAncestor = false) { if (checkedType == null) { return true; } - RootObjectDefinition rod = GetMergedObjectDefinition(name, false); + RootObjectDefinition rod = GetMergedObjectDefinition(name, includeAncestor); return (rod.HasObjectType && checkedType.IsAssignableFrom(rod.ObjectType)); } - /* - /// - /// Merges the object definitions. - /// - /// Object definition name. - /// The parent definition. - /// The child definition. - /// Merged object definition. - protected override RootObjectDefinition MergeObjectDefinitions(string name, IObjectDefinition parentDefinition, - IObjectDefinition childDefinition) - { - RootObjectDefinition rootDefinition = base.MergeObjectDefinitions(name, parentDefinition, childDefinition); - RegisterObjectDefinition(name, rootDefinition); - return rootDefinition; - } - */ + #endregion #region Fields @@ -598,6 +583,7 @@ namespace Spring.Objects.Factory.Support #region IListableObjectFactory Members + /// /// Return the names of all objects defined in this factory. /// @@ -607,14 +593,28 @@ namespace Spring.Objects.Factory.Support /// /// public IList GetObjectDefinitionNames() + { + return GetObjectDefinitionNames(false); + } + + /// + /// Return the names of all objects defined in this factory, if includeAncestors is true + /// includes all parent factories. + /// + /// to include parent factories in result + /// + /// The names of all objects defined in this factory, if includeAncestors is true includes all + /// objects defined in parent factories, or an empty array if none are defined. + /// + public IList GetObjectDefinitionNames(bool includeAncestors) { IList results = new List(objectDefinitionNames); var listableObjectFactory = ParentObjectFactory as IListableObjectFactory; - if (listableObjectFactory != null) + if (includeAncestors && listableObjectFactory != null) { - foreach (var name in listableObjectFactory.GetObjectDefinitionNames()) + foreach (var name in listableObjectFactory.GetObjectDefinitionNames(includeAncestors)) { if (!results.Contains(name)) { @@ -640,16 +640,21 @@ namespace Spring.Objects.Factory.Support /// /// public IList GetObjectDefinitionNames(Type type) + { + return GetObjectDefinitionNames(type, false); + } + + public IList GetObjectDefinitionNames(Type type, bool includeAncestor) { List matches = new List(); - foreach (string name in objectDefinitionNames) + foreach (string name in GetObjectDefinitionNames(includeAncestor)) { - if (IsObjectDefinitionTypeMatch(name, type)) + if (IsObjectDefinitionTypeMatch(name, type, includeAncestor)) { matches.Add(name); } } - return matches; + return matches; } /// @@ -1013,7 +1018,7 @@ namespace Spring.Objects.Factory.Support protected List DoGetObjectNamesForType(Type type, bool includeNonSingletons, bool allowEagerInit) { List result = new List(); - IList objectNames = GetObjectDefinitionNames(); + IList objectNames = GetObjectDefinitionNames(true); foreach (string s in objectNames) { string objectName = s; diff --git a/src/Spring/Spring.Core/Objects/Factory/Support/IObjectDefinitionRegistry.cs b/src/Spring/Spring.Core/Objects/Factory/Support/IObjectDefinitionRegistry.cs index 25ca92cc..e2eebc12 100644 --- a/src/Spring/Spring.Core/Objects/Factory/Support/IObjectDefinitionRegistry.cs +++ b/src/Spring/Spring.Core/Objects/Factory/Support/IObjectDefinitionRegistry.cs @@ -71,8 +71,20 @@ namespace Spring.Objects.Factory.Support /// The names of all objects defined in this registry, or an empty array /// if none defined /// - IList GetObjectDefinitionNames (); - + IList GetObjectDefinitionNames(); + + /// + /// Return the names of all objects defined in this registry. + /// If includeAncestors is true it includes all objects in the defined parent factories. + /// + /// to include parent factories in result + /// + /// The names of all objects defined in this registry, if includeAncestors is true it includes + /// all objects in the defined parent factories, or an empty array if none defined + /// + IList GetObjectDefinitionNames(bool includeAncestors); + + /// /// Check if this registry contains a object definition with the given name. /// diff --git a/src/Spring/Spring.Core/Objects/Factory/Support/StaticListableObjectFactory.cs b/src/Spring/Spring.Core/Objects/Factory/Support/StaticListableObjectFactory.cs index 445fbd52..ec5b1295 100644 --- a/src/Spring/Spring.Core/Objects/Factory/Support/StaticListableObjectFactory.cs +++ b/src/Spring/Spring.Core/Objects/Factory/Support/StaticListableObjectFactory.cs @@ -557,6 +557,20 @@ namespace Spring.Objects.Factory.Support return names; } + /// + /// Return the names of all objects defined in this factory, if includeAncestors is true + /// includes all parent factories. + /// + /// to include parent factories in result + /// + /// The names of all objects defined in this factory, if includeAncestors is true includes all + /// objects defined in parent factories, or an empty array if none are defined. + /// + public IList GetObjectDefinitionNames(bool includeAncestors) + { + throw new NotSupportedException("StaticListableObjectFactory does not contain object definitions."); + } + /// /// Return the names of objects matching the given /// (including subclasses), judging from the object definitions. diff --git a/test/Spring/Spring.Core.Tests/Context/Support/ApplicationObjectSupportTests.cs b/test/Spring/Spring.Core.Tests/Context/Support/ApplicationObjectSupportTests.cs index b2141921..2294ad81 100644 --- a/test/Spring/Spring.Core.Tests/Context/Support/ApplicationObjectSupportTests.cs +++ b/test/Spring/Spring.Core.Tests/Context/Support/ApplicationObjectSupportTests.cs @@ -114,6 +114,11 @@ namespace Spring.Context.Support return null; } + public IList GetObjectDefinitionNames(bool includeAncestors) + { + return null; + } + public string[] GetObjectDefinitionNames(Type type) { return null; diff --git a/test/Spring/Spring.Core.Tests/Objects/Factory/AbstractListableObjectFactoryTests.cs b/test/Spring/Spring.Core.Tests/Objects/Factory/AbstractListableObjectFactoryTests.cs index 6288fcdc..15d70b9e 100644 --- a/test/Spring/Spring.Core.Tests/Objects/Factory/AbstractListableObjectFactoryTests.cs +++ b/test/Spring/Spring.Core.Tests/Objects/Factory/AbstractListableObjectFactoryTests.cs @@ -63,7 +63,7 @@ namespace Spring.Objects.Factory { protected internal void AssertCount (int count) { - IList defnames = ListableObjectFactory.GetObjectDefinitionNames(); + IList defnames = ListableObjectFactory.GetObjectDefinitionNames(true); Assert.IsTrue ( defnames.Count == count, string.Format ("We should have {0} objects, not {1}.", count, defnames.Count)); @@ -78,7 +78,7 @@ namespace Spring.Objects.Factory { public virtual void AssertTestObjectCount (int count) { IList defnames = - ListableObjectFactory.GetObjectNamesForType (typeof (TestObject)); + ListableObjectFactory.GetObjectNamesForType(typeof (TestObject)); Assert.IsTrue ( defnames.Count == count, string.Format ("We should have {0} objects for class {1}, not {2}.", count, typeof (TestObject).FullName, defnames.Count)); diff --git a/test/Spring/Spring.Core.Tests/Objects/Factory/Config/PropertyPlaceholderConfigurerTests.cs b/test/Spring/Spring.Core.Tests/Objects/Factory/Config/PropertyPlaceholderConfigurerTests.cs index 02e5a183..61549b9f 100644 --- a/test/Spring/Spring.Core.Tests/Objects/Factory/Config/PropertyPlaceholderConfigurerTests.cs +++ b/test/Spring/Spring.Core.Tests/Objects/Factory/Config/PropertyPlaceholderConfigurerTests.cs @@ -104,7 +104,7 @@ namespace Spring.Objects.Factory.Config cfg.Location = mockResource; cfg.ConfigSections = new string[] { "" }; IConfigurableListableObjectFactory mockFactory = (IConfigurableListableObjectFactory)mocks.DynamicMock(typeof(IConfigurableListableObjectFactory)); - Expect.Call(mockFactory.GetObjectDefinitionNames()).Return(new string[] {}); + Expect.Call(mockFactory.GetObjectDefinitionNames(false)).Return(new string[] {}); mocks.ReplayAll(); cfg.PostProcessObjectFactory(mockFactory); @@ -148,8 +148,8 @@ namespace Spring.Objects.Factory.Config RootObjectDefinition def = new RootObjectDefinition(typeof(TestObject), pvs); IConfigurableListableObjectFactory mock = (IConfigurableListableObjectFactory) mocks.CreateMock(typeof(IConfigurableListableObjectFactory)); - Expect.Call(mock.GetObjectDefinitionNames()).Return(new string [] {defName}); - Expect.Call(mock.GetObjectDefinition(defName)).Return(def); + Expect.Call(mock.GetObjectDefinitionNames(false)).Return(new string [] {defName}); + Expect.Call(mock.GetObjectDefinition(defName, false)).Return(def); Expect.Call(delegate { mock.AddEmbeddedValueResolver(null); }).IgnoreArguments(); mocks.ReplayAll(); @@ -165,6 +165,38 @@ namespace Spring.Objects.Factory.Config mocks.VerifyAll(); } + [Test] + public void IncludingAncestors() + { + const string defName = "foo"; + const string placeholder = "${name}"; + MutablePropertyValues pvs = new MutablePropertyValues(); + + + const string theProperty = "name"; + pvs.Add(theProperty, placeholder); + RootObjectDefinition def = new RootObjectDefinition(typeof(TestObject), pvs); + + IConfigurableListableObjectFactory mock = (IConfigurableListableObjectFactory)mocks.CreateMock(typeof(IConfigurableListableObjectFactory)); + Expect.Call(mock.GetObjectDefinitionNames(true)).Return(new string[] { defName }); + Expect.Call(mock.GetObjectDefinition(defName, true)).Return(def); + Expect.Call(delegate { mock.AddEmbeddedValueResolver(null); }).IgnoreArguments(); + mocks.ReplayAll(); + + PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer(); + cfg.IncludeAncestors = true; + + NameValueCollection defaultProperties = new NameValueCollection(); + const string expectedName = "Rick Evans"; + defaultProperties.Add(theProperty, expectedName); + cfg.Properties = defaultProperties; + cfg.PostProcessObjectFactory(mock); + Assert.AreEqual(expectedName, def.PropertyValues.GetPropertyValue(theProperty).Value, + "Property placeholder value was not replaced with the resolved value."); + + mocks.VerifyAll(); + } + /// /// Fallback is the default mode. Check if the PROCESSOR_ARCHITECTURE /// variable is replaced. @@ -390,8 +422,8 @@ namespace Spring.Objects.Factory.Config properties.Add("foo", expectedName); IConfigurableListableObjectFactory mock = (IConfigurableListableObjectFactory) mocks.CreateMock(typeof (IConfigurableListableObjectFactory)); - Expect.Call(mock.GetObjectDefinitionNames()).Return(new string[] {"foo"}); - Expect.Call(mock.GetObjectDefinition(null)).IgnoreArguments().Return(def); + Expect.Call(mock.GetObjectDefinitionNames(false)).Return(new string[] {"foo"}); + Expect.Call(mock.GetObjectDefinition(null, false)).IgnoreArguments().Return(def); mocks.ReplayAll(); PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer(); @@ -421,8 +453,8 @@ namespace Spring.Objects.Factory.Config properties.Add("hope.floats", expectedName); IConfigurableListableObjectFactory mock = (IConfigurableListableObjectFactory) mocks.CreateMock(typeof (IConfigurableListableObjectFactory)); - Expect.Call(mock.GetObjectDefinitionNames()).Return(new string[] {"foo"}); - Expect.Call(mock.GetObjectDefinition(null)).IgnoreArguments().Return(def); + Expect.Call(mock.GetObjectDefinitionNames(false)).Return(new string[] {"foo"}); + Expect.Call(mock.GetObjectDefinition(null, false)).IgnoreArguments().Return(def); Expect.Call(delegate { mock.AddEmbeddedValueResolver(null); }).IgnoreArguments(); mocks.ReplayAll(); @@ -451,8 +483,8 @@ namespace Spring.Objects.Factory.Config properties.Add("hope.floats", expectedName); IConfigurableListableObjectFactory mock = (IConfigurableListableObjectFactory) mocks.CreateMock(typeof (IConfigurableListableObjectFactory)); - Expect.Call(mock.GetObjectDefinitionNames()).Return(new string[] {"foo"}); - Expect.Call(mock.GetObjectDefinition(null)).IgnoreArguments().Return(def); + Expect.Call(mock.GetObjectDefinitionNames(false)).Return(new string[] {"foo"}); + Expect.Call(mock.GetObjectDefinition(null, false)).IgnoreArguments().Return(def); Expect.Call(delegate { mock.AddEmbeddedValueResolver(null); }).IgnoreArguments(); mocks.ReplayAll(); @@ -549,8 +581,8 @@ namespace Spring.Objects.Factory.Config RootObjectDefinition def = new RootObjectDefinition(typeof(TestObject), pvs); IConfigurableListableObjectFactory mock = (IConfigurableListableObjectFactory) mocks.CreateMock(typeof(IConfigurableListableObjectFactory)); - Expect.Call(mock.GetObjectDefinitionNames()).Return(new string [] {defName}); - Expect.Call(mock.GetObjectDefinition(defName)).Return(def); + Expect.Call(mock.GetObjectDefinitionNames(false)).Return(new string [] {defName}); + Expect.Call(mock.GetObjectDefinition(defName, false)).Return(def); Expect.Call(delegate { mock.AddEmbeddedValueResolver(null); }).IgnoreArguments(); mocks.ReplayAll(); diff --git a/test/Spring/Spring.Core.Tests/Objects/Factory/Config/VariablePlaceholderConfigurerTests.cs b/test/Spring/Spring.Core.Tests/Objects/Factory/Config/VariablePlaceholderConfigurerTests.cs index 508ff850..d56fec8d 100644 --- a/test/Spring/Spring.Core.Tests/Objects/Factory/Config/VariablePlaceholderConfigurerTests.cs +++ b/test/Spring/Spring.Core.Tests/Objects/Factory/Config/VariablePlaceholderConfigurerTests.cs @@ -20,7 +20,12 @@ using System; using System.Collections; +using System.Collections.Specialized; + using NUnit.Framework; + +using Rhino.Mocks; + using Spring.Context.Support; using Spring.Objects.Factory.Support; @@ -33,6 +38,13 @@ namespace Spring.Objects.Factory.Config [TestFixture] public class VariablePlaceholderConfigurerTests { + private MockRepository mocks; + + [SetUp] + public void SetUp() + { + mocks = new MockRepository(); + } [Test] public void ThrowsOnMissingVariableSources() @@ -276,5 +288,32 @@ namespace Spring.Objects.Factory.Config Assert.AreEqual("Erich", tb1.Name); Assert.AreEqual("${nickname}", tb1.Nickname); } + + [Test] + public void InlcludeAncestors() + { + const string defName = "foo"; + const string placeholder = "${name}"; + MutablePropertyValues pvs = new MutablePropertyValues(); + + + const string theProperty = "name"; + pvs.Add(theProperty, placeholder); + RootObjectDefinition def = new RootObjectDefinition(typeof(TestObject), pvs); + + IConfigurableListableObjectFactory mock = (IConfigurableListableObjectFactory)mocks.CreateMock(typeof(IConfigurableListableObjectFactory)); + Expect.Call(mock.GetObjectDefinitionNames(true)).Return(new string[] { defName }); + Expect.Call(mock.GetObjectDefinition(defName, true)).Return(def); + mocks.ReplayAll(); + + VariablePlaceholderConfigurer vpc = new VariablePlaceholderConfigurer(); + vpc.IgnoreUnresolvablePlaceholders = true; + vpc.VariableSource = new DictionaryVariableSource(new string[] { "name", "Erich" }); + vpc.IncludeAncestors = true; + + vpc.PostProcessObjectFactory(mock); + + mocks.VerifyAll(); + } } } \ No newline at end of file diff --git a/test/Spring/Spring.Core.Tests/Objects/Factory/DefaultListableObjectFactoryTests.cs b/test/Spring/Spring.Core.Tests/Objects/Factory/DefaultListableObjectFactoryTests.cs index 94869bd5..b99c2f59 100644 --- a/test/Spring/Spring.Core.Tests/Objects/Factory/DefaultListableObjectFactoryTests.cs +++ b/test/Spring/Spring.Core.Tests/Objects/Factory/DefaultListableObjectFactoryTests.cs @@ -1773,6 +1773,66 @@ namespace Spring.Objects.Factory #endregion + [Test] + public void GetObjectDefinitionNamesOnlyFromChild() + { + DefaultListableObjectFactory parent = new DefaultListableObjectFactory(); + parent.RegisterObjectDefinition("testChild", new RootObjectDefinition(typeof(TestObject), null)); + DefaultListableObjectFactory child = new DefaultListableObjectFactory(parent); + child.RegisterObjectDefinition("testParent", new RootObjectDefinition(typeof(NestedTestObject), null)); + + var names = child.GetObjectDefinitionNames(); + + Assert.That(names, Has.Count.EqualTo(1), "GetObjectDefinitionNames() should only return object definition names from this factory"); + + names = child.GetObjectDefinitionNames(false); + + Assert.That(names, Has.Count.EqualTo(1), "GetObjectDefinitionNames(false) should only return object definition names from this factory"); + } + + [Test] + public void GetObjectDefinitionNamesIncludingParent() + { + DefaultListableObjectFactory parent = new DefaultListableObjectFactory(); + parent.RegisterObjectDefinition("testChild", new RootObjectDefinition(typeof(TestObject), null)); + DefaultListableObjectFactory child = new DefaultListableObjectFactory(parent); + child.RegisterObjectDefinition("testParent", new RootObjectDefinition(typeof(NestedTestObject), null)); + + var names = child.GetObjectDefinitionNames(true); + + Assert.That(names, Has.Count.EqualTo(2), "GetObjectDefinitionNames(true) should return object definition names from this factory and parents"); + } + + [Test] + public void GetObjectDefinitionNamesByTypeExcludingParent() + { + DefaultListableObjectFactory parent = new DefaultListableObjectFactory(); + parent.RegisterObjectDefinition("testChild", new RootObjectDefinition(typeof(TestObject), null)); + DefaultListableObjectFactory child = new DefaultListableObjectFactory(parent); + child.RegisterObjectDefinition("testParent", new RootObjectDefinition(typeof(NestedTestObject), null)); + + var names1 = child.GetObjectDefinitionNames(typeof(NestedTestObject)); + var names2 = child.GetObjectDefinitionNames(typeof(TestObject)); + + Assert.That(names1, Has.Count.EqualTo(1), "Should return only child object definitions"); + Assert.That(names2, Has.Count.EqualTo(0), "Should not return the parent object definitions"); + } + + [Test] + public void GetObjectDefinitionNamesByTypeIncludingParent() + { + DefaultListableObjectFactory parent = new DefaultListableObjectFactory(); + parent.RegisterObjectDefinition("testChild", new RootObjectDefinition(typeof(TestObject), null)); + DefaultListableObjectFactory child = new DefaultListableObjectFactory(parent); + child.RegisterObjectDefinition("testParent", new RootObjectDefinition(typeof(NestedTestObject), null)); + + var names1 = child.GetObjectDefinitionNames(typeof(NestedTestObject), true); + var names2 = child.GetObjectDefinitionNames(typeof(TestObject), true); + + Assert.That(names1, Has.Count.EqualTo(1), "Should return child object definitions"); + Assert.That(names2, Has.Count.EqualTo(1), "Should return the parent object definitions"); + } + [Test] public void GetObjectNamesForTypeFindsFactoryObjects() { diff --git a/test/Spring/Spring.Core.Tests/Objects/Factory/ObjectFactoryUtilsTests.cs b/test/Spring/Spring.Core.Tests/Objects/Factory/ObjectFactoryUtilsTests.cs index 7f0aafe2..6328c212 100644 --- a/test/Spring/Spring.Core.Tests/Objects/Factory/ObjectFactoryUtilsTests.cs +++ b/test/Spring/Spring.Core.Tests/Objects/Factory/ObjectFactoryUtilsTests.cs @@ -46,12 +46,9 @@ namespace Spring.Objects.Factory [SetUp] public void SetUp() { - IObjectFactory grandparent - = new XmlObjectFactory(new ReadOnlyXmlTestResource("root.xml", GetType())); - IObjectFactory parent - = new XmlObjectFactory(new ReadOnlyXmlTestResource("middle.xml", GetType()), grandparent); - IConfigurableListableObjectFactory child - = new XmlObjectFactory(new ReadOnlyXmlTestResource("leaf.xml", GetType()), parent); + IObjectFactory grandparent = new XmlObjectFactory(new ReadOnlyXmlTestResource("root.xml", GetType())); + IObjectFactory parent = new XmlObjectFactory(new ReadOnlyXmlTestResource("middle.xml", GetType()), grandparent); + IConfigurableListableObjectFactory child = new XmlObjectFactory(new ReadOnlyXmlTestResource("leaf.xml", GetType()), parent); _factory = child; } diff --git a/test/Spring/Spring.Core.Tests/Validation/HelperClasses.cs b/test/Spring/Spring.Core.Tests/Validation/HelperClasses.cs index d77d56d2..fc7200aa 100644 --- a/test/Spring/Spring.Core.Tests/Validation/HelperClasses.cs +++ b/test/Spring/Spring.Core.Tests/Validation/HelperClasses.cs @@ -97,6 +97,11 @@ namespace Spring.Validation return new List(this.objects.Keys); } + public IList GetObjectDefinitionNames(bool includeAncestor) + { + return new List(this.objects.Keys); + } + public IList GetObjectDefinitions() { return new List(this.objects.Values);