From 55449766bc5ad2d27bafc1d2c719572aab055765 Mon Sep 17 00:00:00 2001 From: aalmiray Date: Mon, 17 Mar 2014 21:53:40 +0100 Subject: [PATCH] GROOVY-6158 ObjectGraphBuilder.NewInstanceResolver disregards node value This fix introduces a binary incompatibility as a method signature was changed from Object newInstance(Class klass, Map attributes) to Object newInstance(Class klass, Object value, Map attributes) Merge with caution (into 2.2 or greater) or wait until 3.0 --- src/main/groovy/util/ObjectGraphBuilder.java | 10 +++++----- .../groovy/util/ObjectGraphBuilderTest.groovy | 20 ++++++++++++++++++- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/main/groovy/util/ObjectGraphBuilder.java b/src/main/groovy/util/ObjectGraphBuilder.java index 47c59aef99..141e2fe56e 100644 --- a/src/main/groovy/util/ObjectGraphBuilder.java +++ b/src/main/groovy/util/ObjectGraphBuilder.java @@ -266,11 +266,11 @@ public void setNewInstanceResolver(final Object newInstanceResolver) { } else if (newInstanceResolver instanceof Closure) { final ObjectGraphBuilder self = this; this.newInstanceResolver = new NewInstanceResolver() { - public Object newInstance(Class klass, Map attributes) + public Object newInstance(Class klass, Object value, Map attributes) throws InstantiationException, IllegalAccessException { Closure cls = (Closure) newInstanceResolver; cls.setDelegate(self); - return cls.call(new Object[]{klass, attributes}); + return cls.call(new Object[]{klass, value, attributes}); } }; } else { @@ -466,7 +466,7 @@ public String getIdentifierFor(String nodeName) { * Default impl that calls Class.newInstance() */ public static class DefaultNewInstanceResolver implements NewInstanceResolver { - public Object newInstance(Class klass, Map attributes) throws InstantiationException, + public Object newInstance(Class klass, Object value, Map attributes) throws InstantiationException, IllegalAccessException { return klass.newInstance(); } @@ -539,7 +539,7 @@ public interface NewInstanceResolver { * @param klass the resolved class name * @param attributes the attribute Map available for the node */ - Object newInstance(Class klass, Map attributes) throws InstantiationException, + Object newInstance(Class klass, Object value, Map attributes) throws InstantiationException, IllegalAccessException; } @@ -665,7 +665,7 @@ protected Object resolveInstance(FactoryBuilderSupport builder, Object name, Obj return value; } - return ogbuilder.newInstanceResolver.newInstance(klass, properties); + return ogbuilder.newInstanceResolver.newInstance(klass, value, properties); } public void setChild(FactoryBuilderSupport builder, Object parent, Object child) { diff --git a/src/test/groovy/util/ObjectGraphBuilderTest.groovy b/src/test/groovy/util/ObjectGraphBuilderTest.groovy index 71f54b55f3..c9eca13aac 100644 --- a/src/test/groovy/util/ObjectGraphBuilderTest.groovy +++ b/src/test/groovy/util/ObjectGraphBuilderTest.groovy @@ -317,6 +317,24 @@ class ObjectGraphBuilderTest extends GroovyTestCase { reflectionBuilder = new ObjectGraphBuilder() reflectionBuilder.classNameResolver = [ name: 'reflection', root: "groovy.util" ] } + + void testGroovy6185() { + builder.newInstanceResolver = { klass, value, attributes -> + if (klass.simpleName == 'Company' && value instanceof String) { + klass.newInstance(name: value) + } else { + klass.newInstance() + } + } + + def expected = new Company(name: 'ACME', employees: []) + def actual = builder.company('ACME', employees: []) + assert actual != null + //assert actual.class == Company + assert actual.name == expected.name + assert actual.address == expected.address + assert actual.employees == expected.employees + } } class Company { @@ -374,4 +392,4 @@ class PetMonkey { String name String toString() { "PetMonkey=[name:${name}]" } -} +}