2011-09-26 82 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