2011-09-26 81 views
1

如何使用Groovy生成器支持Groovy的生成器支持

emp = empFileFactory.root() 
{ 
    emp(id: '3', value: '1') 

    emp(id:'24') 
    { 
    emp(id: '1', value: '2') 
    emp(id: '6', value: '7') 
    emp(id: '7', value: '1') 
    } 

    emp(id: '25') 
    { 
    emp(id: '1', value: '1') 
    emp(id: '6', value: '7') 
    } 

} 

我试图建立在Groovy上述strucutre可有人解释我怎么能acieve这

回答

4

你可以做这样的事情(这没有任何错误处理,只是返回null,我不希望被调用的方法):

// First define our class to hold our created 'Emp' objects 
@groovy.transform.Canonical 
class Emp { 
    String id 
    String value 
    List<Emp> children = [] 
} 

class EmpBuilder extends BuilderSupport{ 
    def children = [] 
    protected void setParent(Object parent, Object child){ 
    parent.children << child 
    } 
    protected Object createNode(Object name){ 
    if(name == 'root') { 
     this 
    } 
    else { 
     null 
    } 
    } 
    protected Object createNode(Object name, Object value){ 
    null 
    } 
    protected Object createNode(Object name, Map attributes){ 
    if(name == 'emp') { 
     new Emp(attributes) 
    } 
    else { 
     null 
    } 
    } 
    protected Object createNode(Object name, Map attributes, Object value){ 
    null 
    } 
    protected void nodeCompleted(Object parent, Object node) { 
    } 
    Iterator iterator() { children.iterator() } 
} 

那么,如果我们把这个与你的要求建设者代码如下所示:

b = new EmpBuilder().root() { 
    emp(id: '3', value: '1') 

    emp(id:'24') { 
    emp(id: '1', value: '2') 
    emp(id: '6', value: '7') 
    emp(id: '7', value: '1') 
    } 

    emp(id: '25') { 
    emp(id: '1', value: '1') 
    emp(id: '6', value: '7') 
    } 
} 

我们可以打印出 '树',像这样

b.each { println it } 

和s ee值,我们得到我们要求的结构:

Emp(3, 1, []) 
Emp(24, null, [Emp(1, 2, []), Emp(6, 7, []), Emp(7, 1, [])]) 
Emp(25, null, [Emp(1, 1, []), Emp(6, 7, [])]) 
+0

打印树我一定要发出db.each {调用println它} – anish

+0

烨...我忘了粘贴在该位到/ –

+0

当应该代码会来其他如果(名称=='根'){ 这 } – anish

0

你要我建上面的图案实施延伸BuilderSupport班,这很容易做到。有a pretty nice tutorial here

您需要实现几个方法,但命名应该是不言自明:

  • createNode创建一个节点(每个节点都有一个名称和可选的属性和/或值)
  • setParent指定一个节点作为另一个节点父节点

这就好比它。

+0

我怎么可以在这里设置父 – anish