blob: 31abce130b9225ac58aaff57ba254beb708e62e7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package groovy.util
import groovy.test.GroovyTestCase
/**
* Test for FactoryBuilderSupport based in BuilderSupportTest
* as it should comply with the same contract
*/
class FactoryBuilderSupportTest extends GroovyTestCase {
void testSimpleNode() {
def b = new SpoofFactoryBuilder()
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
]
def node = b.foo()
def log = b.@log
def expected = [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', null,
'handle_node_attributes', node,
'node_completed', null, node,
'post_node_completion', null, node
]
assert log == expected
}
void testSimpleNodeWithValue() {
def b = new SpoofFactoryBuilder()
def node = b.foo('value')
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', 'value',
'handle_node_attributes', node,
'node_completed', null, node,
'post_node_completion', null, node
]
}
void testSimpleNodeWithOneAttribute() {
def b = new SpoofFactoryBuilder()
def node = b.foo(name:'value')
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', null, 'name', 'value',
'handle_node_attributes', node, 'name', 'value',
'node_completed', null, node,
'post_node_completion', null, node
]
}
void testSimpleNodeWithClosure() {
def b = new SpoofFactoryBuilder()
b.foo(){
b.bar()
}
def log = b.@log
def expected = [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', null,
'handle_node_attributes', 'x',
'new_instance', 'bar', null,
'handle_node_attributes', 'x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed', 'x', 'x',
'post_node_completion', 'x', 'x',
'node_completed', null, 'x',
'post_node_completion', null, 'x'
]
assert log == expected
}
void testSimpleNodeWithOneAttributeAndValue() {
def b = new SpoofFactoryBuilder()
def node = b.foo(bar:'baz', 'value')
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', 'value', 'bar', 'baz',
'handle_node_attributes', node, 'bar', 'baz',
'node_completed', null, node,
'post_node_completion', null, node
]
}
void testSimpleNodeWithValueAndOneAttribute() {
def b = new SpoofFactoryBuilder()
def node = b.foo('value', bar:'baz')
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', 'value', 'bar', 'baz',
'handle_node_attributes', node, 'bar', 'baz',
'node_completed', null, node,
'post_node_completion', null, node
]
}
void testSimpleNodeWithOneAttributeAndValueAndClosure() {
def b = new SpoofFactoryBuilder()
def node = b.foo(bar:'baz', 'value') { 1 }
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', 'value', 'bar', 'baz',
'handle_node_attributes', node, 'bar', 'baz',
'node_completed', null, node,
'post_node_completion', null, node
]
}
void testSimpleNodeWithValueAndOneAttributeAndClosure() {
def b = new SpoofFactoryBuilder()
def node = b.foo('value', bar:'baz') { 1 }
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', 'value', 'bar', 'baz',
'handle_node_attributes', node, 'bar', 'baz',
'node_completed', null, node,
'post_node_completion', null, node
]
}
void testSimpleNodeTwoValues() {
def b = new SpoofFactoryBuilder()
def node = b.foo('arg1', 'arg2')
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', ['arg1', 'arg2'],
'handle_node_attributes',node,
'node_completed',null,node,
'post_node_completion',null, node
]
}
void testSimpleNodeTwoValuesClosure() {
def b = new SpoofFactoryBuilder()
def node = b.foo('arg1', 'arg2') { 1 }
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', ['arg1', 'arg2'],
'handle_node_attributes',node,
'node_completed',null,node,
'post_node_completion',null, node
]
}
void testSimpleNodeThreeValues() {
def b = new SpoofFactoryBuilder()
def node = b.foo('arg1', 'arg2', 'arg3')
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', ['arg1', 'arg2', 'arg3'],
'handle_node_attributes',node,
'node_completed',null,node,
'post_node_completion',null, node
]
}
void testSimpleNodeFourValues() {
def b = new SpoofFactoryBuilder()
def node = b.foo('arg1', 'arg2', 'arg3', 'arg4')
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', ['arg1', 'arg2', 'arg3', 'arg4'],
'handle_node_attributes',node,
'node_completed',null,node,
'post_node_completion',null, node
]
}
void testNestedMethodCallsResolution() {
def b = new SpoofFactoryBuilder()
b.outest {
b.outer {
nestedBuilderCall(b)
}
}
assert b.@log.contains('inner')
}
void nestedBuilderCall(builder) {
builder.inner()
}
void testExplicitProperty() {
def b = new SpoofFactoryBuilder();
// property neither set in the binding or explicitly, should fail
shouldFail { b.exp }
// setting first should set the value in the binding and make it usable
b.notExp = 1
assert b.notExp == 1
int val = 0
b.registerExplicitProperty ('exp', {val++}, {val = it ^ 1})
// test getter
assert b.exp == 0
assert b.exp == 1
assert b.exp == val - 1
// test setter
b.exp = 3
assert val == 2
b.exp = 4
assert val == 5
// symbols in the property closure shold also resolve to the builder...
b.registerExplicitProperty ('exp2', {exp}, {exp = it })
assert b.exp2 == val - 1
b.exp2 = 4
assert val == 5
}
void testExplicitMethod() {
def b = new SpoofFactoryBuilder();
// property neither set in the binding or explicitly, should fail
shouldFail { b.exp() }
int val = 0
b.registerExplicitMethod ('exp', {it -> val+= it})
// test calls
assert b.exp(0) == 0
assert b.exp(1) == 1
assert (val - 1) == b.exp(-1)
b.exp(3 - val)
assert val == 3
b.exp(5)
assert val == 8
// symbols in the method closure shold also resolve to the builder...
b.registerExplicitMethod ('exp2', {exp(it)})
assert b.exp2(-2) == 6
b.exp2(4 - val)
assert val == 4
}
// ==================================
void testNestedBuilderSimpleNode() {
def n = new SpoofFactoryBuilder()
def b = new SpoofFactoryBuilder(proxyBuilder:n)
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
]
assert n.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
]
def node = b.foo()
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
]
assert n.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', null,
'handle_node_attributes', node,
'node_completed', null, node,
'post_node_completion', null, node
]
}
void testNestedBuilderSimpleNodeWithValue() {
def n = new SpoofFactoryBuilder()
def b = new SpoofFactoryBuilder(proxyBuilder:n)
def node = b.foo('value')
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
]
assert n.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', 'value',
'handle_node_attributes', node,
'node_completed', null, node,
'post_node_completion', null, node
]
}
void testNestedBuilderSimpleNodeWithOneAttribute() {
def n = new SpoofFactoryBuilder()
def b = new SpoofFactoryBuilder(proxyBuilder:n)
def node = b.foo(name:'value')
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
]
assert n.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', null, 'name', 'value',
'handle_node_attributes', node, 'name', 'value',
'node_completed', null, node,
'post_node_completion', null, node
]
}
void testNestedBuilderSimpleNodeWithClosure() {
def n = new SpoofFactoryBuilder()
def b = new SpoofFactoryBuilder(proxyBuilder:n)
b.foo(){
b.bar()
}
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
]
assert n.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', null,
'handle_node_attributes', 'x',
'new_instance', 'bar', null,
'handle_node_attributes', 'x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed', 'x', 'x',
'post_node_completion', 'x', 'x',
'node_completed', null, 'x',
'post_node_completion', null, 'x'
]
}
void testNestedBuilderSimpleNodeWithOneAttributeAndValue() {
def n = new SpoofFactoryBuilder()
def b = new SpoofFactoryBuilder(proxyBuilder:n)
def node = b.foo(bar:'baz', 'value')
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
]
assert n.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', 'value', 'bar', 'baz',
'handle_node_attributes', node, 'bar', 'baz',
'node_completed', null, node,
'post_node_completion', null, node
]
}
void testNestedBuilderSimpleNodeWithValueAndOneAttribute() {
def n = new SpoofFactoryBuilder()
def b = new SpoofFactoryBuilder(proxyBuilder:n)
def node = b.foo('value', bar:'baz')
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
]
assert n.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', 'value', 'bar', 'baz',
'handle_node_attributes', node, 'bar', 'baz',
'node_completed', null, node,
'post_node_completion', null, node
]
}
void testNestedBuilderSimpleNodeWithOneAttributeAndValueAndClosure() {
def n = new SpoofFactoryBuilder()
def b = new SpoofFactoryBuilder(proxyBuilder:n)
def node = b.foo(bar:'baz', 'value') { 1 }
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
]
assert n.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', 'value', 'bar', 'baz',
'handle_node_attributes', node, 'bar', 'baz',
'node_completed', null, node,
'post_node_completion', null, node
]
}
void testNestedBuilderSimpleNodeWithValueAndOneAttributeAndClosure() {
def n = new SpoofFactoryBuilder()
def b = new SpoofFactoryBuilder(proxyBuilder:n)
def node = b.foo('value', bar:'baz') { 1 }
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
]
assert n.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', 'value', 'bar', 'baz',
'handle_node_attributes', node, 'bar', 'baz',
'node_completed', null, node,
'post_node_completion', null, node
]
}
void testWithBuilder() {
def b = new SpoofFactoryBuilder()
def c = new SpoofFactoryBuilder()
def factory = new XFactory( builder:c )
c.registerFactory( "fooz", factory )
c.registerFactory( "baz", factory )
b.foo(){
bar()
withBuilder(c){
fooz(){
baz()
}
}
}
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', null,
'handle_node_attributes', 'x',
'new_instance', 'bar', null,
'handle_node_attributes', 'x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed', 'x', 'x',
'post_node_completion', 'x', 'x',
'node_completed', null, 'x',
'post_node_completion', null, 'x'
]
assert c.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'register', 'fooz', '',
'register', 'baz', '',
'new_instance', 'fooz', null,
'handle_node_attributes', 'x',
'new_instance', 'baz', null,
'handle_node_attributes', 'x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed', 'x', 'x',
'post_node_completion', 'x', 'x',
'node_completed', null, 'x',
'post_node_completion', null, 'x'
]
}
void testWithBuilderAndName() {
def b = new SpoofFactoryBuilder()
def c = new SpoofFactoryBuilder()
def factory = new XFactory( builder:c )
c.registerFactory( "fooz", factory )
c.registerFactory( "baz", factory )
b.foo(){
bar()
withBuilder(c,'foo'){
fooz(){
baz()
}
}
}
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', null,
'handle_node_attributes', 'x',
'new_instance', 'bar', null,
'handle_node_attributes', 'x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed', 'x', 'x',
'post_node_completion', 'x', 'x',
'new_instance', 'foo', 'x',
'handle_node_attributes', 'x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed', 'x', 'x',
'post_node_completion', 'x', 'x',
'node_completed', null, 'x',
'post_node_completion', null, 'x'
]
assert c.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'register', 'fooz', '',
'register', 'baz', '',
'new_instance', 'fooz', null,
'handle_node_attributes', 'x',
'new_instance', 'baz', null,
'handle_node_attributes', 'x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed', 'x', 'x',
'post_node_completion', 'x', 'x',
'node_completed', null, 'x',
'post_node_completion', null, 'x'
]
}
void testWithBuilderAndNameAndAttributes() {
def b = new SpoofFactoryBuilder()
def c = new SpoofFactoryBuilder()
def factory = new XFactory( builder:c )
c.registerFactory( "fooz", factory )
c.registerFactory( "baz", factory )
b.foo(){
bar()
withBuilder(c,'foo',bar:'baz'){
fooz(){
baz()
}
}
}
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', null,
'handle_node_attributes', 'x',
'new_instance', 'bar', null,
'handle_node_attributes', 'x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed', 'x', 'x',
'post_node_completion', 'x', 'x',
'new_instance', 'foo', 'x', 'bar', 'baz',
'handle_node_attributes', 'x', 'bar', 'baz',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed', 'x', 'x',
'post_node_completion', 'x', 'x',
'node_completed', null, 'x',
'post_node_completion', null, 'x'
]
assert c.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'register', 'fooz', '',
'register', 'baz', '',
'new_instance', 'fooz', null,
'handle_node_attributes', 'x',
'new_instance', 'baz', null,
'handle_node_attributes', 'x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed', 'x', 'x',
'post_node_completion', 'x', 'x',
'node_completed', null, 'x',
'post_node_completion', null, 'x'
]
}
void testWithBuilderAndThrowAnException() {
def b = new SpoofFactoryBuilder()
def c = new SpoofFactoryBuilder()
shouldFail( RuntimeException ) {
b.foo(){
bar()
withBuilder(c){
throw new RuntimeException("expected")
}
}
}
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', null,
'handle_node_attributes', 'x',
'new_instance', 'bar', null,
'handle_node_attributes', 'x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed', 'x', 'x',
'post_node_completion', 'x', 'x'/*,
'node_completed',null,'x',
'post_node_completion',null, 'x'*/
// node foo() was not completed successfuly
]
assert c.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
]
}
void testHandlesChildren() {
def b = new SpoofFactoryBuilder()
b.getFactories().foo.handlesNodeChildren = true
b.foo {
b.bar()
}
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', null,
'handle_node_attributes', 'x',
'node_children', 'foo',
'new_instance', 'bar', null,
'handle_node_attributes', 'x',
'set_parent', 'x', 'x',
'set_child', 'x', 'x',
'node_completed', 'x', 'x',
'post_node_completion', 'x', 'x',
'node_completed', null, 'x',
'post_node_completion', null, 'x'
]
}
void testInteceptsChildren() {
def b = new SpoofFactoryBuilder()
b.getFactories().foo.handlesNodeChildren = true
b.getFactories().foo.processNodeChildren = false
b.foo {
b.bar()
}
assert b.@log == [
'register', 'outest', 'Layers',
'register', 'outer', 'Layers',
'register', 'inner', 'Layers',
'register', 'foo', 'Meta',
'register', 'bar', 'Meta',
'new_instance', 'foo', null,
'handle_node_attributes', 'x',
'node_children', 'foo',
'node_completed', null, 'x',
'post_node_completion', null, 'x'
]
}
void testErrorMessage_checkValueIsType() {
def msg = shouldFail(Exception) {
FactoryBuilderSupport.checkValueIsType('message', 'prop', Integer)
}
assert msg.contains('prop')
assert msg.contains('Integer')
assert msg.contains('String')
}
void testErrorMessage_checkValueIsTypeNotString() {
def msg = shouldFail(Exception) {
FactoryBuilderSupport.checkValueIsTypeNotString(123G, 'prop', Integer)
}
assert msg.contains('prop')
assert msg.contains('Integer')
assert msg.contains('String')
assert msg.contains('BigInteger')
}
// void testMultiThreaded() {
// def b = new SpoofFactoryBuilder()
// Thread t1 = Thread.start {
// b.foo {
// Thread.sleep(100)
// bar()
// }
// }
// Thread t2 = Thread.start {
// Thread.sleep(50)
// b.outer()
// }
//
// t1.join()
// t2.join()
// def log = b.@log
// assert log == [
// 'register', 'foo', 'Meta',
// 'register', 'bar', 'Meta',
// 'register', 'outest', 'Layers',
// 'register', 'outer', 'Layers',
// 'register', 'inner', 'Layers',
// 'new_instance','foo', null,
// 'handle_node_attributes','x',
// 'new_instance','bar', null,
// 'handle_node_attributes','x',
// 'set_parent', 'x', 'x',
// 'set_child', 'x', 'x',
// 'node_completed','x','x',
// 'post_node_completion', 'x', 'x',
// 'node_completed', null,'x',
// 'post_node_completion', null, 'x',
// 'new_instance','outer', null,
// 'handle_node_attributes', 'x',
// 'node_completed', null, 'x',
// 'post_node_completion', null, 'x'
// ]
// }
//TODO registration groups test
}
/**
The SpoofFactoryBuilder is a sample instance of the abstract FactoryBuilderSupport class
that does nothing but logging how it was called, returning 'x' for each node.
**/
class SpoofFactoryBuilder extends FactoryBuilderSupport{
protected List log = []
SpoofFactoryBuilder() {
autoRegisterNodes()
}
public void registerMeta() {
def factory = new XFactory( builder:this )
registerFactory( "foo", factory )
registerFactory( "bar", factory )
}
public void registerLayers() {
def factory = new XFactory( builder:this )
registerFactory( "outest", factory )
registerFactory( "outer", factory )
registerFactory( "inner", factory )
}
protected Object postNodeCompletion(Object parent, Object node) {
log << 'post_node_completion'
log << parent
log << node
node
}
}
class XFactory extends AbstractFactory {
SpoofFactoryBuilder builder
boolean leaf = false
boolean handlesNodeChildren = false
boolean processNodeChildren = true
public boolean onNodeChildren(FactoryBuilderSupport builder, Object node, Closure childContent) {
builder.@log << 'node_children'
builder.@log << builder.currentName
return processNodeChildren && super.onNodeChildren(builder, node, childContent)
}
public void onFactoryRegistration(FactoryBuilderSupport builder, String registerdName, String groupName) {
builder.@log << 'register'
builder.@log << registerdName
builder.@log << groupName
}
public Object newInstance(
FactoryBuilderSupport builder, Object name, Object value, Map properties
) throws InstantiationException, IllegalAccessException {
builder.@log << 'new_instance'
builder.@log << name
builder.@log << value
properties.each{entry -> builder.@log << entry.key; builder.@log << entry.value}
return 'x'
}
public boolean onHandleNodeAttributes( FactoryBuilderSupport builder, Object node, Map attributes ) {
builder.@log << 'handle_node_attributes'
builder.@log << node
attributes.each{entry -> builder.@log << entry.key; builder.@log << entry.value}
return false
}
public void onNodeCompleted( FactoryBuilderSupport builder, Object parent, Object node ) {
builder.@log << 'node_completed'
builder.@log << parent
builder.@log << node
}
public void setParent( FactoryBuilderSupport builder, Object parent, Object child ) {
builder.@log << "set_parent"
builder.@log << parent
builder.@log << child
}
public void setChild( FactoryBuilderSupport builder, Object parent, Object child ) {
builder.@log << "set_child"
builder.@log << parent
builder.@log << child
}
}