Permalink
Browse files

Merge pull request #125 from jeffbrown/beanbuilder

GRAILS-4995 - Improve the handling of List and Map ctor args
  • Loading branch information...
2 parents c463fd0 + a0b3da7 commit b0acb588e56227921edf096fa77d6dcbe998f29c @cbeams cbeams committed Aug 28, 2012
@@ -714,6 +714,13 @@ else if(args[0] instanceof Closure) {
protected List resolveConstructorArguments(Object[] args, int start, int end) {
Object[] constructorArgs = subarray(args, start, end);
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);
return constructorArgsList;
}
@@ -133,69 +133,61 @@ class GroovyBeanDefinitionReaderTests extends GroovyTestCase {
void testUseTwoSpringNamespaces() {
def beanReader = new GroovyBeanDefinitionReader()
- SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder()
- 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")
+ 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 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()
-
- assertEquals "success", appCtx.getBean("foo")
-
- assertNotNull appCtx.getBean("scopedList")
- assertNotNull appCtx.getBean("scopedList").size()
- assertNotNull appCtx.getBean("scopedList").size()
+ appCtx = beanReader.createApplicationContext()
- // should only be true because bean not initialized until proxy called
- assertEquals 2, scope.instanceCount
+ assert ['one', 'two'] == appCtx.getBean("foo")
- beanReader = new GroovyBeanDefinitionReader()
+ assertNotNull appCtx.getBean("scopedList")
+ assertNotNull appCtx.getBean("scopedList").size()
+ assertNotNull appCtx.getBean("scopedList").size()
- appCtx = beanReader.getSpringConfig().getUnrefreshedApplicationContext()
- appCtx.getBeanFactory().registerScope("test", scope)
- 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'()
- }
+ // should only be true because bean not initialized until proxy called
+ assertEquals 2, scope.instanceCount
- 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")
- assertNotNull appCtx.getBean("scopedList").size()
- assertNotNull appCtx.getBean("scopedList").size()
-
- // should only be true because bean not initialized until proxy called
- assertEquals 4, scope.instanceCount
+ util.list(id: 'foo') {
+ value 'one'
+ value 'two'
+ }
+ }
+ appCtx = beanReader.createApplicationContext()
+
+ assert ['one', 'two'] == appCtx.getBean("foo")
+ assertNotNull appCtx.getBean("scopedList")
+ assertNotNull appCtx.getBean("scopedList").size()
+ assertNotNull appCtx.getBean("scopedList").size()
- }
- finally {
- builder.deactivate()
- }
+ // should only be true because bean not initialized until proxy called
+ assertEquals 4, scope.instanceCount
}
void testSpringAOPSupport() {
@@ -262,24 +254,17 @@ class GroovyBeanDefinitionReaderTests extends GroovyTestCase {
void testSpringNamespaceBean() {
def beanReader = new GroovyBeanDefinitionReader()
- SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder()
- try {
-
- builder.bind("bar", "success")
- builder.activate()
-
- beanReader.beans {
- xmlns jee:"http://www.springframework.org/schema/jee"
- jee.'jndi-lookup'(id:"foo", 'jndi-name':"bar")
+ beanReader.beans {
+ xmlns util: 'http://www.springframework.org/schema/util'
+ util.list(id: 'foo') {
+ value 'one'
+ value 'two'
}
-
- ApplicationContext appCtx = beanReader.createApplicationContext()
-
- assertEquals "success", appCtx.getBean("foo")
- }
- finally {
- builder.deactivate()
}
+
+ def ctx = beanReader.createApplicationContext()
+
+ assert ['one', 'two'] == ctx.getBean('foo')
}
void testNamedArgumentConstructor() {
@@ -772,9 +757,7 @@ beanReader.createApplicationContext()
assertEquals "Fred", appCtx.getBean("personA").name
}
- // test for GRAILS-4995
void testListOfBeansAsConstructorArg() {
- if(notYetImplemented()) return
def beanReader = new GroovyBeanDefinitionReader()
beanReader.beans {
@@ -790,6 +773,34 @@ beanReader.createApplicationContext()
assert ctx.containsBean('someotherbean2')
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() {
def beanReader = new GroovyBeanDefinitionReader()
@@ -903,6 +914,20 @@ class Bean4 {
}
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
class Bean1Factory {
Bean1 newInstance() {

0 comments on commit b0acb58

Please sign in to comment.