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)