/*
* JBoss, Home of Professional Open Source
* Copyright 2005, JBoss Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jbpm.configuration;
import java.util.List;
import java.util.Map;
import org.jbpm.AbstractJbpmTestCase;
public class BeanFactoryTest extends AbstractJbpmTestCase {
protected ObjectFactoryImpl objectFactory;
protected void parse(String xml) {
objectFactory = ObjectFactoryParser.parseXmlString(xml);
}
public static class MyBean {
String text;
Integer number;
boolean isSetterUsed;
public MyBean() {
}
public MyBean(String text, Integer number) {
this.text = text;
this.number = number;
}
public void setNumber(Integer number) {
this.number = number;
isSetterUsed = true;
}
public void setText(String text) {
this.text = text;
isSetterUsed = true;
}
}
public void testBeanDefaultConstructor() {
parse("<beans>"
+ " <bean name='mybean' class='" + MyBean.class.getName() + "' />"
+ "</beans>");
MyBean myBean = (MyBean) objectFactory.createObject("mybean");
assertNull(myBean.text);
}
public void testBeanConstructor() {
parse("<beans>"
+ " <bean name='mybean' class='" + MyBean.class.getName() + "'>"
+ " <constructor>"
+ " <parameter class='java.lang.String'>"
+ " <string>hello</string>"
+ " </parameter>"
+ " <parameter class='java.lang.Integer'>"
+ " <integer>6</integer>"
+ " </parameter>"
+ " </constructor>"
+ " </bean>"
+ "</beans>");
MyBean myBean = (MyBean) objectFactory.createObject("mybean");
assertEquals("hello", myBean.text);
assertEquals(new Integer(6), myBean.number);
assertFalse(myBean.isSetterUsed);
}
public static class MyBeanFactory {
public MyBean createMyBean(String text, Integer number) {
return new MyBean(text, number);
}
}
public void testBeanFactory() {
parse("<beans>"
+ " <bean name='mybeanfactory' class='" + MyBeanFactory.class.getName() + "' />"
+ " <bean name='mybean' >"
+ " <constructor factory='mybeanfactory' method='createMyBean'>"
+ " <parameter class='java.lang.String'>"
+ " <string>hello</string>"
+ " </parameter>"
+ " <parameter class='java.lang.Integer'>"
+ " <integer>6</integer>"
+ " </parameter>"
+ " </constructor>"
+ " </bean>"
+ "</beans>");
MyBean myBean = (MyBean) objectFactory.createObject("mybean");
assertEquals("hello", myBean.text);
assertEquals(new Integer(6), myBean.number);
assertFalse(myBean.isSetterUsed);
}
public static class MyBeanStaticFactory {
public static MyBean createMyBean(String text, Integer number) {
return new MyBean(text, number);
}
}
public void testBeanFactoryStaticMethod() {
parse("<beans>"
+ " <bean name='mybean' >"
+ " <constructor factory-class='" + MyBeanStaticFactory.class.getName()
+ "' method='createMyBean'>"
+ " <parameter class='java.lang.String'>"
+ " <string>hello</string>"
+ " </parameter>"
+ " <parameter class='java.lang.Integer'>"
+ " <integer>6</integer>"
+ " </parameter>"
+ " </constructor>"
+ " </bean>"
+ "</beans>");
MyBean myBean = (MyBean) objectFactory.createObject("mybean");
assertEquals("hello", myBean.text);
assertEquals(new Integer(6), myBean.number);
assertFalse(myBean.isSetterUsed);
}
public void testFieldInjection() {
parse("<beans>"
+ " <bean name='mybean' class='" + MyBean.class.getName() + "'>"
+ " <field name='text'><string>hello</string></field>"
+ " <field name='number'><integer>6</integer></field>"
+ " </bean>"
+ "</beans>");
MyBean myBean = (MyBean) objectFactory.createObject("mybean");
assertEquals("hello", myBean.text);
assertEquals(new Integer(6), myBean.number);
assertFalse(myBean.isSetterUsed);
}
public void testPropertyInjection() {
parse("<beans>"
+ " <bean name='mybean' class='" + MyBean.class.getName() + "'>"
+ " <property name='text'><string>hello</string></property>"
+ " <property name='number'><integer>6</integer></property>"
+ " </bean>"
+ "</beans>");
MyBean myBean = (MyBean) objectFactory.createObject("mybean");
assertEquals("hello", myBean.text);
assertEquals(new Integer(6), myBean.number);
assertTrue(myBean.isSetterUsed);
}
public void testBeanRef() {
parse("<beans>"
+ " <bean name='original' class='" + MyBean.class.getName() + "' singleton='true'>"
+ " <property name='text'><string>hello</string></property>"
+ " </bean>"
+ " <ref name='referencer' bean='original' />"
+ "</beans>");
MyBean original = (MyBean) objectFactory.createObject("original");
MyBean referencer = (MyBean) objectFactory.createObject("referencer");
assertSame(original, referencer);
referencer = (MyBean) objectFactory.createObject("referencer");
original = (MyBean) objectFactory.createObject("original");
assertSame(original, referencer);
}
public static class DependingBean {
DependingBean anotherBean;
}
public void testCircularReference() {
parse("<beans>"
+ " <bean name='first' class='" + DependingBean.class.getName() + "'>"
+ " <field name='anotherBean'>"
+ " <ref bean='second' />"
+ " </field>"
+ " </bean>"
+ " <bean name='second' class='" + DependingBean.class.getName() + "'>"
+ " <field name='anotherBean'>"
+ " <ref bean='third' />"
+ " </field>"
+ " </bean>"
+ " <bean name='third' class='" + DependingBean.class.getName() + "'>"
+ " <field name='anotherBean'>"
+ " <ref bean='first' />"
+ " </field>"
+ " </bean>"
+ "</beans>");
try {
objectFactory.createObject("first");
fail("expected exception");
}
catch (ConfigurationException e) {
assertTrue(e.getMessage().indexOf("first") != -1);
}
try {
objectFactory.createObject("second");
fail("expected exception");
}
catch (ConfigurationException e) {
assertTrue(e.getMessage().indexOf("second") != -1);
}
try {
objectFactory.createObject("third");
fail("expected exception");
}
catch (ConfigurationException e) {
assertTrue(e.getMessage().indexOf("third") != -1);
}
}
public static class A {
}
public void testListWithBeanRef() {
parse("<beans>"
+ " <list name='mylist'>"
+ " <bean name='a' class='" + A.class.getName() + "' />"
+ " <ref bean='a' />"
+ " </list>"
+ "</beans>");
List list = (List) objectFactory.createObject("mylist");
assertEquals(2, list.size());
assertSame(list.get(0), list.get(1));
}
public void testMapWithBeanRef() {
parse("<beans>"
+ " <map name='mymap'>"
+ " <entry>"
+ " <key><string value='1st'/></key>"
+ " <value><bean name='a' class='" + A.class.getName() + "'/></value>"
+ " </entry>"
+ " <entry>"
+ " <key><string value='2nd'/></key>"
+ " <value><ref bean='a'/></value>"
+ " </entry>"
+ " </map>"
+ "</beans>");
Map map = (Map) objectFactory.createObject("mymap");
assertEquals(2, map.size());
assertSame(map.get("1st"), map.get("2nd"));
}
public static class Shape {
String color;
int lineSize = -1;
public void setLineSize(int lineSize) {
this.lineSize = lineSize;
}
}
public static class Square extends Shape {
}
public void testInheritedFieldInjection() {
parse("<beans>"
+ " <bean name='s' class='" + Square.class.getName() + "'>"
+ " <field name='color'><string value='red' /></field>"
+ " </bean>"
+ "</beans>");
Square square = (Square) objectFactory.createObject("s");
assertNotNull(square);
assertEquals("red", square.color);
}
public void testInheritedSetterInjection() {
parse("<beans>"
+ " <bean name='s' class='" + Square.class.getName() + "'>"
+ " <property name='lineSize'><int value='5' /></property>"
+ " </bean>"
+ "</beans>");
Square square = (Square) objectFactory.createObject("s");
assertNotNull(square);
assertEquals(5, square.lineSize);
}
}