diff --git a/src/Spring/Spring.Core/Objects/Factory/Config/ConstructorArgumentValues.cs b/src/Spring/Spring.Core/Objects/Factory/Config/ConstructorArgumentValues.cs index 28e8198e..d37438ee 100644 --- a/src/Spring/Spring.Core/Objects/Factory/Config/ConstructorArgumentValues.cs +++ b/src/Spring/Spring.Core/Objects/Factory/Config/ConstructorArgumentValues.cs @@ -188,12 +188,24 @@ namespace Spring.Objects.Factory.Config } } foreach (DictionaryEntry entry in other.NamedArgumentValues) - { - NamedArgumentValues.Add(entry.Key, entry.Value); + { + AddOrMergeNamedArgumentValues(entry.Key, entry.Value); + //NamedArgumentValues.Add(entry.Key, entry.Value); } } } + private void AddOrMergeNamedArgumentValues(object key, object newValue) + { + if (_namedArgumentValues.Contains(key) ) + { + _namedArgumentValues[key] = newValue; + } else + { + _namedArgumentValues.Add(key, newValue); + } + } + private void AddOrMergeIndexedArgumentValues(int key, ValueHolder newValue) { ValueHolder currentValue = _indexedArgumentValues[key] as ValueHolder; diff --git a/src/Spring/Spring.Core/Objects/Factory/Config/ObjectDefinitionVisitor.cs b/src/Spring/Spring.Core/Objects/Factory/Config/ObjectDefinitionVisitor.cs index 9fe056b8..bd327416 100644 --- a/src/Spring/Spring.Core/Objects/Factory/Config/ObjectDefinitionVisitor.cs +++ b/src/Spring/Spring.Core/Objects/Factory/Config/ObjectDefinitionVisitor.cs @@ -324,19 +324,39 @@ namespace Spring.Objects.Factory.Config } Hashtable mods = new Hashtable(); + bool entriesModified = false; foreach (DictionaryEntry entry in dictVal) { + /* + object oldValue = entry.Value; object newValue = ResolveValue(oldValue); if (!ObjectUtils.NullSafeEquals(newValue, oldValue)) { mods[entry.Key] = newValue; + }*/ + + object key = entry.Key; + object newKey = ResolveValue(key); + object oldValue = entry.Value; + object newValue = ResolveValue(oldValue); + + if (!ObjectUtils.NullSafeEquals(newValue, oldValue) || key != newKey) + { + entriesModified = true; } + mods[newKey] = newValue; + + } + if (entriesModified) + { + dictVal.Clear(); + foreach (DictionaryEntry entry in mods) + { + dictVal[entry.Key] = entry.Value; + } } - foreach (DictionaryEntry entry in mods) - { - dictVal[entry.Key] = entry.Value; - } + } /// diff --git a/test/Spring/Spring.Core.Tests/Data/Spring/Objects/Factory/Config/PPCWithTypesTests.xml b/test/Spring/Spring.Core.Tests/Data/Spring/Objects/Factory/Config/PPCWithTypesTests.xml index 731cdff2..942f9783 100644 --- a/test/Spring/Spring.Core.Tests/Data/Spring/Objects/Factory/Config/PPCWithTypesTests.xml +++ b/test/Spring/Spring.Core.Tests/Data/Spring/Objects/Factory/Config/PPCWithTypesTests.xml @@ -25,7 +25,7 @@ limitations under the License. - + @@ -45,6 +45,7 @@ limitations under the License. + diff --git a/test/Spring/Spring.Core.Tests/Data/Spring/Objects/Factory/Xml/child.xml b/test/Spring/Spring.Core.Tests/Data/Spring/Objects/Factory/Xml/child.xml index 80fd52f7..647fc9b8 100644 --- a/test/Spring/Spring.Core.Tests/Data/Spring/Objects/Factory/Xml/child.xml +++ b/test/Spring/Spring.Core.Tests/Data/Spring/Objects/Factory/Xml/child.xml @@ -11,6 +11,11 @@ + + + + + + + + + + parent 1 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 ee0dab6c..cc8fde20 100644 --- a/test/Spring/Spring.Core.Tests/Objects/Factory/Config/PropertyPlaceholderConfigurerTests.cs +++ b/test/Spring/Spring.Core.Tests/Objects/Factory/Config/PropertyPlaceholderConfigurerTests.cs @@ -597,6 +597,7 @@ namespace Spring.Objects.Factory.Config Assert.AreEqual(2, to.Pets.Count); Assert.AreEqual(2, to.PeriodicTable.Count); Assert.AreEqual(2, to.Computers.Count); + Assert.IsTrue(to.PeriodicTable.Contains("C")); } } } diff --git a/test/Spring/Spring.Core.Tests/Objects/Factory/Xml/XmlObjectFactoryTests.cs b/test/Spring/Spring.Core.Tests/Objects/Factory/Xml/XmlObjectFactoryTests.cs index a81c2b65..f490ea08 100644 --- a/test/Spring/Spring.Core.Tests/Objects/Factory/Xml/XmlObjectFactoryTests.cs +++ b/test/Spring/Spring.Core.Tests/Objects/Factory/Xml/XmlObjectFactoryTests.cs @@ -667,7 +667,21 @@ namespace Spring.Objects.Factory.Xml // Age property is inherited from object in parent factory Assert.IsTrue(inherits.Age == 1); TestObject inherits2 = (TestObject) child.GetObject("inheritsFromParentFactory"); - Assert.IsTrue(inherits2 == inherits); + Assert.AreSame(inherits2,inherits); + } + + [Test] + public void SingletonInheritanceFromParentFactorySingletonUsingCtor() + { + XmlObjectFactory parent = new XmlObjectFactory(new ReadOnlyXmlTestResource("parent.xml", GetType())); + XmlObjectFactory child = new XmlObjectFactory(new ReadOnlyXmlTestResource("child.xml", GetType()), parent); + TestObject inherits = (TestObject)child.GetObject("inheritsFromParentFactoryUsingCtor"); + // Name property value is overriden + Assert.IsTrue(inherits.Name.Equals("child-name")); + // Age property is inherited from object in parent factory + Assert.IsTrue(inherits.Age == 1); + TestObject inherits2 = (TestObject)child.GetObject("inheritsFromParentFactoryUsingCtor"); + Assert.AreSame(inherits2,inherits); } [Test] @@ -681,7 +695,7 @@ namespace Spring.Objects.Factory.Xml // Age property is inherited from object in parent factory Assert.IsTrue(inherits.Age == 2); TestObject inherits2 = (TestObject) child.GetObject("prototypeInheritsFromParentFactoryPrototype"); - Assert.IsFalse(inherits2 == inherits); + Assert.AreNotSame(inherits2,inherits); inherits2.Age = 13; Assert.IsTrue(inherits2.Age == 13); // Shouldn't have changed first instance @@ -699,7 +713,7 @@ namespace Spring.Objects.Factory.Xml // Age property is inherited from object in parent factory Assert.IsTrue(inherits.Age == 1); TestObject inherits2 = (TestObject) child.GetObject("protoypeInheritsFromParentFactorySingleton"); - Assert.IsFalse(inherits2 == inherits); + Assert.AreNotSame(inherits2,inherits); inherits2.Age = 13; Assert.IsTrue(inherits2.Age == 13); // Shouldn't have changed first instance