/// <summary> /// Merges the current value set with that of the supplied object. /// </summary> /// <remarks>The supplied object is considered the parent, and values in the /// callee's value set must override those of the supplied object. /// </remarks> /// <param name="parent">The parent object to merge with</param> /// <returns>The result of the merge operation</returns> /// <exception cref="ArgumentNullException">If the supplied parent is <code>null</code></exception> /// <exception cref="InvalidOperationException">If merging is not enabled for this instance, /// (i.e. <code>MergeEnabled</code> equals <code>false</code>.</exception> public object Merge(object parent) { if (!this.mergeEnabled) { throw new InvalidOperationException( "Not allowed to merge when the 'MergeEnabled' property is set to 'false'"); } if (parent == null) { return(this); } IList plist = parent as IList; if (plist == null) { throw new InvalidOperationException("Cannot merge with object of type [" + parent.GetType() + "]"); } IList merged = new ManagedList(); foreach (object element in plist) { merged.Add(element); } foreach (object o in this) { merged.Add(o); } return(merged); }
public void VisitManagedList() { IObjectDefinition od = new RootObjectDefinition(); ManagedList ml = new ManagedList(); ml.ElementTypeName = "$Property"; ml.Add("$Property"); od.PropertyValues.Add("PropertyName", ml); ObjectDefinitionVisitor odv = new ObjectDefinitionVisitor(new ObjectDefinitionVisitor.ResolveHandler(ParseAndResolveVariables)); odv.VisitObjectDefinition(od); ManagedList list = od.PropertyValues.GetPropertyValue("PropertyName").Value as ManagedList; Assert.IsNotNull(list, "Property value is not of type ManagedList. Type = [" + od.PropertyValues.GetPropertyValue("PropertyName").Value.GetType() + "]"); Assert.AreEqual("Value", list.ElementTypeName); Assert.AreEqual("Value", list[0]); }
/// <summary> /// Visits the ManagedList property ElementTypeName and /// calls <see cref="ResolveValue"/> for list element. /// </summary> protected virtual void VisitManagedList(ManagedList listVal) { string elementTypeName = listVal.ElementTypeName; if (elementTypeName != null) { string resolvedName = ResolveStringValue(elementTypeName); if (!elementTypeName.Equals(resolvedName)) { listVal.ElementTypeName = resolvedName; } } for (int i = 0; i < listVal.Count; ++i) { object oldValue = listVal[i]; object newValue = ResolveValue(oldValue); if (!ObjectUtils.NullSafeEquals(newValue, oldValue)) { listVal[i] = newValue; } } }
public void SunnyDay() { StaticApplicationContext ac = new StaticApplicationContext(); MutablePropertyValues pvs = new MutablePropertyValues(); pvs.Add("age", "${age}"); RootObjectDefinition def = new RootObjectDefinition("${fqn}", new ConstructorArgumentValues(), pvs); ac.RegisterObjectDefinition("tb3", def); pvs = new MutablePropertyValues(); pvs.Add("age", "${age}"); pvs.Add("name", "name${var}${"); pvs.Add("spouse", new RuntimeObjectReference("${ref}")); ac.RegisterSingleton("tb1", typeof(TestObject), pvs); ConstructorArgumentValues cas = new ConstructorArgumentValues(); cas.AddIndexedArgumentValue(1, "${age}"); cas.AddGenericArgumentValue("${var}name${age}"); pvs = new MutablePropertyValues(); ArrayList friends = new ManagedList(); friends.Add("na${age}me"); friends.Add(new RuntimeObjectReference("${ref}")); pvs.Add("friends", friends); ISet someSet = new ManagedSet(); someSet.Add("na${age}me"); someSet.Add(new RuntimeObjectReference("${ref}")); pvs.Add("someSet", someSet); IDictionary someDictionary = new ManagedDictionary(); someDictionary["key1"] = new RuntimeObjectReference("${ref}"); someDictionary["key2"] = "${age}name"; MutablePropertyValues innerPvs = new MutablePropertyValues(); someDictionary["key3"] = new RootObjectDefinition(typeof(TestObject), innerPvs); someDictionary["key4"] = new ChildObjectDefinition("tb1", innerPvs); pvs.Add("someMap", someDictionary); RootObjectDefinition definition = new RootObjectDefinition(typeof(TestObject), cas, pvs); ac.DefaultListableObjectFactory.RegisterObjectDefinition("tb2", definition); pvs = new MutablePropertyValues(); pvs.Add("Properties", "<spring-config><add key=\"age\" value=\"98\"/><add key=\"var\" value=\"${m}var\"/><add key=\"ref\" value=\"tb2\"/><add key=\"m\" value=\"my\"/><add key=\"fqn\" value=\"Oragon.Spring.Objects.TestObject, Oragon.Spring.Core.Tests\"/></spring-config>"); ac.RegisterSingleton("configurer", typeof(PropertyPlaceholderConfigurer), pvs); ac.Refresh(); TestObject tb1 = (TestObject)ac.GetObject("tb1"); TestObject tb2 = (TestObject)ac.GetObject("tb2"); TestObject tb3 = (TestObject)ac.GetObject("tb3"); Assert.AreEqual(98, tb1.Age); Assert.AreEqual(98, tb2.Age); Assert.AreEqual(98, tb3.Age); Assert.AreEqual("namemyvar${", tb1.Name); Assert.AreEqual("myvarname98", tb2.Name); Assert.AreEqual(tb2, tb1.Spouse); Assert.AreEqual(2, tb2.Friends.Count); IEnumerator ie = tb2.Friends.GetEnumerator(); ie.MoveNext(); Assert.AreEqual("na98me", ie.Current); ie.MoveNext(); Assert.AreEqual(tb2, ie.Current); Assert.AreEqual(2, tb2.SomeSet.Count); Assert.IsTrue(tb2.SomeSet.Contains("na98me")); Assert.IsTrue(tb2.SomeSet.Contains(tb2)); Assert.AreEqual(4, tb2.SomeMap.Count); Assert.AreEqual(tb2, tb2.SomeMap["key1"]); Assert.AreEqual("98name", tb2.SomeMap["key2"]); TestObject inner1 = (TestObject)tb2.SomeMap["key3"]; TestObject inner2 = (TestObject)tb2.SomeMap["key4"]; Assert.AreEqual(0, inner1.Age); Assert.AreEqual(null, inner1.Name); Assert.AreEqual(98, inner2.Age); Assert.AreEqual("namemyvar${", inner2.Name); }