[ https://issues.apache.org/jira/browse/GROOVY-7445?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Marc Hadfield updated GROOVY-7445: ---------------------------------- Attachment: NestedCustomFactoryTest.groovy > FactoryBuilder fails with customized handlers > --------------------------------------------- > > Key: GROOVY-7445 > URL: https://issues.apache.org/jira/browse/GROOVY-7445 > Project: Groovy > Issue Type: Bug > Components: groovy-jdk, groovy-runtime > Affects Versions: 2.3.7, 2.4.3 > Reporter: Marc Hadfield > Assignee: Guillaume Laforge > Labels: builder > Attachments: NestedCustomFactoryTest.groovy > > > nested nodes with custom factories test. > only TestBuilder1 works, > builders 2 and 4 throw "No signature of method..." exceptions > In builder number 3 the parent of C is mysteriously switched to A. > <code> > package groovy.issues.builder > import groovy.lang.Closure; > import groovy.util.FactoryBuilderSupport; > import java.util.Map; > //domain classes > class A { > B bField > } > class B { > C cField > } > class C {} > //factories > class AFactory extends AbstractFactory { > > @Override > public Object newInstance(FactoryBuilderSupport builder, > Object name, Object value, Map attributes > ) throws InstantiationException, IllegalAccessException { > return attributes != null ? new A(attributes) : new A() > } > } > > class AFactoryCustom extends AFactory { > > @Override > public boolean isHandlesNodeChildren() { > return true > } > @Override > public boolean onNodeChildren(FactoryBuilderSupport builder, > Object node, Closure childContent) { > > assert node instanceof A > > def resolved = childContent.call() > > assert resolved instanceof B > > ((A)node).bField = resolved > > return false > > } > } > class BFactory extends AbstractFactory { > > @Override > public Object newInstance(FactoryBuilderSupport builder, > Object name, Object value, Map attributes > ) throws InstantiationException, IllegalAccessException { > return attributes != null ? new B(attributes) : new B() > } > > @Override > public void setParent(FactoryBuilderSupport builder, Object parent, > Object child) { > assert parent instanceof A > assert child instanceof B > ((A)parent).bField = child > } > } > class BFactoryCustom extends BFactory { > @Override > public boolean isHandlesNodeChildren() { > return true > } > @Override > public boolean onNodeChildren(FactoryBuilderSupport builder, > Object node, Closure childContent) { > assert node instanceof B > > def resolved = childContent.call() > > assert resolved instanceof C > > ((B)node).cField = resolved > > return false > } > } > class CFactory extends AbstractFactory { > > @Override > public Object newInstance(FactoryBuilderSupport builder, > Object name, Object value, Map attributes > ) throws InstantiationException, IllegalAccessException { > return attributes != null ? new C(attributes) : new C() > } > > @Override > public void setParent(FactoryBuilderSupport builder, Object parent, > Object child) { > assert parent instanceof B > assert child instanceof C > ((B)parent).cField = child > } > } > class TestBuilder1 extends FactoryBuilderSupport { > public TestBuilder1(boolean init = true) { > super(init); > } > def registerObjectFactories() { > registerFactory("A", new AFactory()) > registerFactory("B", new BFactory()) > registerFactory("C", new CFactory()) > } > } > class TestBuilder2 extends FactoryBuilderSupport { > public TestBuilder2(boolean init = true) { > super(init); > } > def registerObjectFactories() { > registerFactory("A", new AFactoryCustom()) > registerFactory("B", new BFactory()) > registerFactory("C", new CFactory()) > } > } > class TestBuilder3 extends FactoryBuilderSupport { > public TestBuilder3(boolean init = true) { > super(init); > } > def registerObjectFactories() { > registerFactory("A", new AFactory()) > registerFactory("B", new BFactoryCustom()) > registerFactory("C", new CFactory()) > } > } > class TestBuilder4 extends FactoryBuilderSupport { > public TestBuilder4(boolean init = true) { > super(init); > } > def registerObjectFactories() { > registerFactory("A", new AFactoryCustom()) > registerFactory("B", new BFactoryCustom()) > registerFactory("C", new CFactory()) > } > } > class NestedCustomFactoryTest { > static main(args) { > > try { > > def a1 = new TestBuilder1().A { > > B { > C { > > } > } > > } > > assert a1 instanceof A > assert a1.bField instanceof B > assert a1.bField.cField instanceof C > println "TestBuilder1: OK" > } catch(Throwable e) { > println "TestBuilder1 failed: ${e.localizedMessage}" > } > > > try { > > def a2 = new TestBuilder2().A { > > B { > > C { > > } > } > > } > > assert a2 instanceof A > assert a2.bField instanceof B > assert a2.bField.cField instanceof C > println "TestBuilder2: OK" > } catch(Throwable e) { > println "TestBuilder2 failed: ${e.localizedMessage}" > } > > > try { > def a3 = new TestBuilder3().A { > > B { > > C { > > } > } > > } > > assert a3 instanceof A > assert a3.bField instanceof B > assert a3.bField.cField instanceof C > println "TestBuilder3: OK" > } catch(Throwable e) { > println "TestBuilder3 failed: ${e.localizedMessage}" > } > > > try { > def a4 = new TestBuilder4().A { > > B { > > C { > > } > } > > } > > assert a4 instanceof A > assert a4.bField instanceof B > assert a4.bField.cField instanceof C > println "TestBuilder4: OK" > } catch(Throwable e) { > println "TestBuilder4 failed: ${e.localizedMessage}" > } > > } > } > </code> -- This message was sent by Atlassian JIRA (v6.3.4#6332)