[ 
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)

Reply via email to