You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Marc Hadfield (JIRA)" <ji...@apache.org> on 2015/05/31 18:44:17 UTC

[jira] [Updated] (GROOVY-7445) FactoryBuilder fails with customized handlers

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