Поддержка Groovy Builder - PullRequest
       15

Поддержка Groovy Builder

1 голос
/ 26 сентября 2011

Как я могу построить вышеуказанный шаблон, используя поддержку Groovy Builder

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')
  }

}

Я пытаюсь построить вышеупомянутый Structre в Groovy, может кто-нибудь объяснить, как я могу добиться этого

Ответы [ 2 ]

4 голосов
/ 26 сентября 2011

Вы можете сделать что-то вроде этого (это не обрабатывает ошибки, а просто возвращает 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 }

и мы видим структуру, которую мы просили:

Emp(3, 1, [])
Emp(24, null, [Emp(1, 2, []), Emp(6, 7, []), Emp(7, 1, [])])
Emp(25, null, [Emp(1, 1, []), Emp(6, 7, [])])
1 голос
/ 26 сентября 2011

Вы хотите реализовать расширение класса BuilderSupport, что довольно просто.Здесь есть довольно хороший учебник .

Вам нужно реализовать несколько методов, но наименование должно быть довольно понятным:

  • createNode создаетузел (каждый узел имеет имя и необязательные атрибуты и / или значение)
  • setParent назначает узел как родительский узел другого узла

Вот и все.

...