1 /*
2  * Copyright 2002-2007 the original author or authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package org.springframework.beans.factory.xml;
18 
19 import java.util.Arrays;
20 import java.util.HashMap;
21 import java.util.List;
22 import java.util.Map;
23 
24 import junit.framework.Assert;
25 
26 import org.springframework.beans.BeansException;
27 import org.springframework.beans.MutablePropertyValues;
28 import org.springframework.beans.factory.BeanFactory;
29 import org.springframework.beans.factory.config.BeanPostProcessor;
30 import org.springframework.beans.factory.support.DefaultListableBeanFactory;
31 import org.springframework.beans.factory.support.RootBeanDefinition;
32 import org.springframework.core.io.ClassPathResource;
33 
34 import test.beans.DummyFactory;
35 import test.beans.ITestBean;
36 import test.beans.LifecycleBean;
37 import test.beans.TestBean;
38 
39 /**
40  * @author Juergen Hoeller
41  * @since 09.11.2003
42  */
43 public class XmlListableBeanFactoryTests extends AbstractListableBeanFactoryTests {
44 
45 	private DefaultListableBeanFactory parent;
46 
47 	private XmlBeanFactory factory;
48 
setUp()49 	protected void setUp() {
50 		parent = new DefaultListableBeanFactory();
51 		Map m = new HashMap();
52 		m.put("name", "Albert");
53 		parent.registerBeanDefinition("father",
54 			new RootBeanDefinition(TestBean.class, new MutablePropertyValues(m)));
55 		m = new HashMap();
56 		m.put("name", "Roderick");
57 		parent.registerBeanDefinition("rod",
58 			new RootBeanDefinition(TestBean.class, new MutablePropertyValues(m)));
59 
60 		this.factory = new XmlBeanFactory(new ClassPathResource("test.xml", getClass()), parent);
61 		this.factory.addBeanPostProcessor(new BeanPostProcessor() {
62 			public Object postProcessBeforeInitialization(Object bean, String name) throws BeansException {
63 				if (bean instanceof TestBean) {
64 					((TestBean) bean).setPostProcessed(true);
65 				}
66 				if (bean instanceof DummyFactory) {
67 					((DummyFactory) bean).setPostProcessed(true);
68 				}
69 				return bean;
70 			}
71 			public Object postProcessAfterInitialization(Object bean, String name) throws BeansException {
72 				return bean;
73 			}
74 		});
75 		this.factory.addBeanPostProcessor(new LifecycleBean.PostProcessor());
76 		this.factory.addBeanPostProcessor(new ProtectedLifecycleBean.PostProcessor());
77 		//this.factory.preInstantiateSingletons();
78 	}
79 
getBeanFactory()80 	protected BeanFactory getBeanFactory() {
81 		return factory;
82 	}
83 
testCount()84 	public void testCount() {
85 		assertCount(24);
86 	}
87 
testTestBeanCount()88 	public void testTestBeanCount() {
89 		assertTestBeanCount(13);
90 	}
91 
testLifecycleMethods()92 	public void testLifecycleMethods() throws Exception {
93 		LifecycleBean bean = (LifecycleBean) getBeanFactory().getBean("lifecycle");
94 		bean.businessMethod();
95 	}
96 
testProtectedLifecycleMethods()97 	public void testProtectedLifecycleMethods() throws Exception {
98 		ProtectedLifecycleBean bean = (ProtectedLifecycleBean) getBeanFactory().getBean("protectedLifecycle");
99 		bean.businessMethod();
100 	}
101 
testDescriptionButNoProperties()102 	public void testDescriptionButNoProperties() throws Exception {
103 		TestBean validEmpty = (TestBean) getBeanFactory().getBean("validEmptyWithDescription");
104 		Assert.assertEquals(0, validEmpty.getAge());
105 	}
106 
107 	/**
108 	 * Test that properties with name as well as id creating an alias up front.
109 	 */
testAutoAliasing()110 	public void testAutoAliasing() throws Exception {
111 		List beanNames = Arrays.asList(getListableBeanFactory().getBeanDefinitionNames());
112 
113 		TestBean tb1 = (TestBean) getBeanFactory().getBean("aliased");
114 		TestBean alias1 = (TestBean) getBeanFactory().getBean("myalias");
115 		Assert.assertTrue(tb1 == alias1);
116 		List tb1Aliases = Arrays.asList(getBeanFactory().getAliases("aliased"));
117 		Assert.assertEquals(2, tb1Aliases.size());
118 		Assert.assertTrue(tb1Aliases.contains("myalias"));
119 		Assert.assertTrue(tb1Aliases.contains("youralias"));
120 		Assert.assertTrue(beanNames.contains("aliased"));
121 		Assert.assertFalse(beanNames.contains("myalias"));
122 		Assert.assertFalse(beanNames.contains("youralias"));
123 
124 		TestBean tb2 = (TestBean) getBeanFactory().getBean("multiAliased");
125 		TestBean alias2 = (TestBean) getBeanFactory().getBean("alias1");
126 		TestBean alias3 = (TestBean) getBeanFactory().getBean("alias2");
127 		TestBean alias3a = (TestBean) getBeanFactory().getBean("alias3");
128 		TestBean alias3b = (TestBean) getBeanFactory().getBean("alias4");
129 		Assert.assertTrue(tb2 == alias2);
130 		Assert.assertTrue(tb2 == alias3);
131 		Assert.assertTrue(tb2 == alias3a);
132 		Assert.assertTrue(tb2 == alias3b);
133 
134 		List tb2Aliases = Arrays.asList(getBeanFactory().getAliases("multiAliased"));
135 		Assert.assertEquals(4, tb2Aliases.size());
136 		Assert.assertTrue(tb2Aliases.contains("alias1"));
137 		Assert.assertTrue(tb2Aliases.contains("alias2"));
138 		Assert.assertTrue(tb2Aliases.contains("alias3"));
139 		Assert.assertTrue(tb2Aliases.contains("alias4"));
140 		Assert.assertTrue(beanNames.contains("multiAliased"));
141 		Assert.assertFalse(beanNames.contains("alias1"));
142 		Assert.assertFalse(beanNames.contains("alias2"));
143 		Assert.assertFalse(beanNames.contains("alias3"));
144 		Assert.assertFalse(beanNames.contains("alias4"));
145 
146 		TestBean tb3 = (TestBean) getBeanFactory().getBean("aliasWithoutId1");
147 		TestBean alias4 = (TestBean) getBeanFactory().getBean("aliasWithoutId2");
148 		TestBean alias5 = (TestBean) getBeanFactory().getBean("aliasWithoutId3");
149 		Assert.assertTrue(tb3 == alias4);
150 		Assert.assertTrue(tb3 == alias5);
151 		List tb3Aliases = Arrays.asList(getBeanFactory().getAliases("aliasWithoutId1"));
152 		Assert.assertEquals(2, tb3Aliases.size());
153 		Assert.assertTrue(tb3Aliases.contains("aliasWithoutId2"));
154 		Assert.assertTrue(tb3Aliases.contains("aliasWithoutId3"));
155 		Assert.assertTrue(beanNames.contains("aliasWithoutId1"));
156 		Assert.assertFalse(beanNames.contains("aliasWithoutId2"));
157 		Assert.assertFalse(beanNames.contains("aliasWithoutId3"));
158 
159 		TestBean tb4 = (TestBean) getBeanFactory().getBean(TestBean.class.getName() + "#0");
160 		Assert.assertEquals(null, tb4.getName());
161 
162 		Map drs = getListableBeanFactory().getBeansOfType(DummyReferencer.class, false, false);
163 		Assert.assertEquals(5, drs.size());
164 		Assert.assertTrue(drs.containsKey(DummyReferencer.class.getName() + "#0"));
165 		Assert.assertTrue(drs.containsKey(DummyReferencer.class.getName() + "#1"));
166 		Assert.assertTrue(drs.containsKey(DummyReferencer.class.getName() + "#2"));
167 	}
168 
testFactoryNesting()169 	public void testFactoryNesting() {
170 		ITestBean father = (ITestBean) getBeanFactory().getBean("father");
171 		Assert.assertTrue("Bean from root context", father != null);
172 
173 		TestBean rod = (TestBean) getBeanFactory().getBean("rod");
174 		Assert.assertTrue("Bean from child context", "Rod".equals(rod.getName()));
175 		Assert.assertTrue("Bean has external reference", rod.getSpouse() == father);
176 
177 		rod = (TestBean) parent.getBean("rod");
178 		Assert.assertTrue("Bean from root context", "Roderick".equals(rod.getName()));
179 	}
180 
testFactoryReferences()181 	public void testFactoryReferences() {
182 		DummyFactory factory = (DummyFactory) getBeanFactory().getBean("&singletonFactory");
183 
184 		DummyReferencer ref = (DummyReferencer) getBeanFactory().getBean("factoryReferencer");
185 		Assert.assertTrue(ref.getTestBean1() == ref.getTestBean2());
186 		Assert.assertTrue(ref.getDummyFactory() == factory);
187 
188 		DummyReferencer ref2 = (DummyReferencer) getBeanFactory().getBean("factoryReferencerWithConstructor");
189 		Assert.assertTrue(ref2.getTestBean1() == ref2.getTestBean2());
190 		Assert.assertTrue(ref2.getDummyFactory() == factory);
191 	}
192 
testPrototypeReferences()193 	public void testPrototypeReferences() {
194 		// check that not broken by circular reference resolution mechanism
195 		DummyReferencer ref1 = (DummyReferencer) getBeanFactory().getBean("prototypeReferencer");
196 		Assert.assertTrue("Not referencing same bean twice", ref1.getTestBean1() != ref1.getTestBean2());
197 		DummyReferencer ref2 = (DummyReferencer) getBeanFactory().getBean("prototypeReferencer");
198 		Assert.assertTrue("Not the same referencer", ref1 != ref2);
199 		Assert.assertTrue("Not referencing same bean twice", ref2.getTestBean1() != ref2.getTestBean2());
200 		Assert.assertTrue("Not referencing same bean twice", ref1.getTestBean1() != ref2.getTestBean1());
201 		Assert.assertTrue("Not referencing same bean twice", ref1.getTestBean2() != ref2.getTestBean2());
202 		Assert.assertTrue("Not referencing same bean twice", ref1.getTestBean1() != ref2.getTestBean2());
203 	}
204 
testBeanPostProcessor()205 	public void testBeanPostProcessor() throws Exception {
206 		TestBean kerry = (TestBean) getBeanFactory().getBean("kerry");
207 		TestBean kathy = (TestBean) getBeanFactory().getBean("kathy");
208 		DummyFactory factory = (DummyFactory) getBeanFactory().getBean("&singletonFactory");
209 		TestBean factoryCreated = (TestBean) getBeanFactory().getBean("singletonFactory");
210 		Assert.assertTrue(kerry.isPostProcessed());
211 		Assert.assertTrue(kathy.isPostProcessed());
212 		Assert.assertTrue(factory.isPostProcessed());
213 		Assert.assertTrue(factoryCreated.isPostProcessed());
214 	}
215 
testEmptyValues()216 	public void testEmptyValues() {
217 		TestBean rod = (TestBean) getBeanFactory().getBean("rod");
218 		TestBean kerry = (TestBean) getBeanFactory().getBean("kerry");
219 		Assert.assertTrue("Touchy is empty", "".equals(rod.getTouchy()));
220 		Assert.assertTrue("Touchy is empty", "".equals(kerry.getTouchy()));
221 	}
222 
testCommentsAndCdataInValue()223 	public void testCommentsAndCdataInValue() {
224 		TestBean bean = (TestBean) getBeanFactory().getBean("commentsInValue");
225 		Assert.assertEquals("Failed to handle comments and CDATA properly", "this is a <!--comment-->", bean.getName());
226 	}
227 
228 }
229