Browse Source

Merge pull request #125 from jeffbrown/beanbuilder

GRAILS-4995 - Improve the handling of List and Map ctor args
beanbuilder
Chris Beams 12 years ago
parent
commit
b0acb588e5
  1. 7
      spring-lang-groovy/src/main/java/org/springframework/context/groovy/GroovyBeanDefinitionReader.java
  2. 163
      spring-lang-groovy/src/test/groovy/org/springframework/context/groovy/GroovyBeanDefinitionReaderTests.groovy

7
spring-lang-groovy/src/main/java/org/springframework/context/groovy/GroovyBeanDefinitionReader.java

@ -714,6 +714,13 @@ public class GroovyBeanDefinitionReader extends GroovyObjectSupport {
protected List resolveConstructorArguments(Object[] args, int start, int end) { protected List resolveConstructorArguments(Object[] args, int start, int end) {
Object[] constructorArgs = subarray(args, start, end); Object[] constructorArgs = subarray(args, start, end);
filterGStringReferences(constructorArgs); filterGStringReferences(constructorArgs);
for(int i = 0; i < constructorArgs.length; i++) {
if(constructorArgs[i] instanceof List) {
constructorArgs[i] = manageListIfNecessary(constructorArgs[i]);
} else if(constructorArgs[i] instanceof Map){
constructorArgs[i] = manageMapIfNecessary(constructorArgs[i]);
}
}
List constructorArgsList = Arrays.asList(constructorArgs); List constructorArgsList = Arrays.asList(constructorArgs);
return constructorArgsList; return constructorArgsList;
} }

163
spring-lang-groovy/src/test/groovy/org/springframework/context/groovy/GroovyBeanDefinitionReaderTests.groovy

@ -133,69 +133,61 @@ class GroovyBeanDefinitionReaderTests extends GroovyTestCase {
void testUseTwoSpringNamespaces() { void testUseTwoSpringNamespaces() {
def beanReader = new GroovyBeanDefinitionReader() def beanReader = new GroovyBeanDefinitionReader()
SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder() TestScope scope = new TestScope()
try {
builder.bind("bar", "success")
builder.activate()
TestScope scope = new TestScope()
GenericApplicationContext appCtx = beanReader.getSpringConfig().getUnrefreshedApplicationContext()
appCtx.getBeanFactory().registerScope("test", scope)
beanReader.beans {
xmlns aop:"http://www.springframework.org/schema/aop"
xmlns jee:"http://www.springframework.org/schema/jee"
scopedList(ArrayList) { bean ->
bean.scope = "test"
aop.'scoped-proxy'()
}
jee.'jndi-lookup'(id:"foo", 'jndi-name':"bar")
GenericApplicationContext appCtx = beanReader.getSpringConfig().getUnrefreshedApplicationContext()
appCtx.getBeanFactory().registerScope("test", scope)
beanReader.beans {
xmlns aop:"http://www.springframework.org/schema/aop"
xmlns util:"http://www.springframework.org/schema/util"
scopedList(ArrayList) { bean ->
bean.scope = "test"
aop.'scoped-proxy'()
} }
util.list(id: 'foo') {
value 'one'
value 'two'
}
}
appCtx = beanReader.createApplicationContext() appCtx = beanReader.createApplicationContext()
assertEquals "success", appCtx.getBean("foo")
assertNotNull appCtx.getBean("scopedList")
assertNotNull appCtx.getBean("scopedList").size()
assertNotNull appCtx.getBean("scopedList").size()
// should only be true because bean not initialized until proxy called assert ['one', 'two'] == appCtx.getBean("foo")
assertEquals 2, scope.instanceCount
beanReader = new GroovyBeanDefinitionReader() assertNotNull appCtx.getBean("scopedList")
assertNotNull appCtx.getBean("scopedList").size()
assertNotNull appCtx.getBean("scopedList").size()
appCtx = beanReader.getSpringConfig().getUnrefreshedApplicationContext() // should only be true because bean not initialized until proxy called
appCtx.getBeanFactory().registerScope("test", scope) assertEquals 2, scope.instanceCount
beanReader.beans {
xmlns aop:"http://www.springframework.org/schema/aop",
jee:"http://www.springframework.org/schema/jee"
scopedList(ArrayList) { bean ->
bean.scope = "test"
aop.'scoped-proxy'()
}
jee.'jndi-lookup'(id:"foo", 'jndi-name':"bar") beanReader = new GroovyBeanDefinitionReader()
appCtx = beanReader.getSpringConfig().getUnrefreshedApplicationContext()
appCtx.getBeanFactory().registerScope("test", scope)
beanReader.beans {
xmlns aop:"http://www.springframework.org/schema/aop",
util:"http://www.springframework.org/schema/util"
scopedList(ArrayList) { bean ->
bean.scope = "test"
aop.'scoped-proxy'()
} }
appCtx = beanReader.createApplicationContext()
assertEquals "success", appCtx.getBean("foo")
assertNotNull appCtx.getBean("scopedList") util.list(id: 'foo') {
assertNotNull appCtx.getBean("scopedList").size() value 'one'
assertNotNull appCtx.getBean("scopedList").size() value 'two'
}
// should only be true because bean not initialized until proxy called }
assertEquals 4, scope.instanceCount appCtx = beanReader.createApplicationContext()
assert ['one', 'two'] == appCtx.getBean("foo")
assertNotNull appCtx.getBean("scopedList")
assertNotNull appCtx.getBean("scopedList").size()
assertNotNull appCtx.getBean("scopedList").size()
} // should only be true because bean not initialized until proxy called
finally { assertEquals 4, scope.instanceCount
builder.deactivate()
}
} }
void testSpringAOPSupport() { void testSpringAOPSupport() {
@ -262,24 +254,17 @@ class GroovyBeanDefinitionReaderTests extends GroovyTestCase {
void testSpringNamespaceBean() { void testSpringNamespaceBean() {
def beanReader = new GroovyBeanDefinitionReader() def beanReader = new GroovyBeanDefinitionReader()
SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder() beanReader.beans {
try { xmlns util: 'http://www.springframework.org/schema/util'
util.list(id: 'foo') {
builder.bind("bar", "success") value 'one'
builder.activate() value 'two'
beanReader.beans {
xmlns jee:"http://www.springframework.org/schema/jee"
jee.'jndi-lookup'(id:"foo", 'jndi-name':"bar")
} }
ApplicationContext appCtx = beanReader.createApplicationContext()
assertEquals "success", appCtx.getBean("foo")
}
finally {
builder.deactivate()
} }
def ctx = beanReader.createApplicationContext()
assert ['one', 'two'] == ctx.getBean('foo')
} }
void testNamedArgumentConstructor() { void testNamedArgumentConstructor() {
@ -772,9 +757,7 @@ beanReader.createApplicationContext()
assertEquals "Fred", appCtx.getBean("personA").name assertEquals "Fred", appCtx.getBean("personA").name
} }
// test for GRAILS-4995
void testListOfBeansAsConstructorArg() { void testListOfBeansAsConstructorArg() {
if(notYetImplemented()) return
def beanReader = new GroovyBeanDefinitionReader() def beanReader = new GroovyBeanDefinitionReader()
beanReader.beans { beanReader.beans {
@ -790,6 +773,34 @@ beanReader.createApplicationContext()
assert ctx.containsBean('someotherbean2') assert ctx.containsBean('someotherbean2')
assert ctx.containsBean('somebean') assert ctx.containsBean('somebean')
} }
void testBeanWithListAndMapConstructor() {
def beanReader = new GroovyBeanDefinitionReader()
beanReader.beans {
bart(Bean1) {
person = "bart"
age = 11
}
lisa(Bean1) {
person = "lisa"
age = 9
}
beanWithList(Bean5, [bart, lisa])
// test runtime references both as ref() and as plain name
beanWithMap(Bean6, [bart:bart, lisa:ref('lisa')])
}
def ctx = beanReader.createApplicationContext()
def beanWithList = ctx.getBean("beanWithList")
assertEquals 2, beanWithList.people.size()
assertEquals "bart", beanWithList.people[0].person
def beanWithMap = ctx.getBean("beanWithMap")
assertEquals 9, beanWithMap.peopleByName.lisa.age
assertEquals "bart", beanWithMap.peopleByName.bart.person
}
void testAnonymousInnerBeanViaBeanMethod() { void testAnonymousInnerBeanViaBeanMethod() {
def beanReader = new GroovyBeanDefinitionReader() def beanReader = new GroovyBeanDefinitionReader()
@ -903,6 +914,20 @@ class Bean4 {
} }
String person String person
} }
// bean with List-valued constructor arg
class Bean5 {
Bean5(List<Bean1> people) {
this.people = people
}
List<Bean1> people
}
// bean with Map-valued constructor arg
class Bean6 {
Bean6(Map<String, Bean1> peopleByName) {
this.peopleByName = peopleByName
}
Map<String, Bean1> peopleByName
}
// a factory bean // a factory bean
class Bean1Factory { class Bean1Factory {
Bean1 newInstance() { Bean1 newInstance() {

Loading…
Cancel
Save