Vous pouvez faire quelque chose comme ça (cela n'a pas la gestion des erreurs, et juste renvoie null pour les méthodes que je ne pense pas être appelé):
// 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() }
}
Ensuite, si nous appelons cela avec votre nécessaire code constructeur comme ceci:
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')
}
}
Nous pouvons imprimer le 'arbre' comme si
b.each { println it }
et s ee nous obtenons la structure que nous avons demandé:
Emp(3, 1, [])
Emp(24, null, [Emp(1, 2, []), Emp(6, 7, []), Emp(7, 1, [])])
Emp(25, null, [Emp(1, 1, []), Emp(6, 7, [])])
pour l'impression de l'arbre dois-je émettre db.each {println it} – anish
yup ... J'ai oublié de coller ce bit à la réponse: -/ –
quand le code devrait venir à else if (nom == 'root') { this } – anish