CodeToLive

Groovy Builders

Groovy builders provide a convenient way to create hierarchical or nested structures like XML, HTML, JSON, or UI layouts using a clean DSL (Domain Specific Language) syntax.

MarkupBuilder (XML/HTML)

import groovy.xml.MarkupBuilder

def writer = new StringWriter()
def xml = new MarkupBuilder(writer)

xml.person {
    name('Alice')
    age(30)
    address {
        street('123 Main St')
        city('Boston')
    }
}

println writer.toString()

Output:

<person>
  <name>Alice</name>
  <age>30</age>
  <address>
    <street>123 Main St</street>
    <city>Boston</city>
  </address>
</person>

JsonBuilder

import groovy.json.JsonBuilder

def json = new JsonBuilder()

json {
    person {
        name 'Alice'
        age 30
        address {
            street '123 Main St'
            city 'Boston'
        }
    }
}

println json.toPrettyString()

Output:

{
    "person": {
        "name": "Alice",
        "age": 30,
        "address": {
            "street": "123 Main St",
            "city": "Boston"
        }
    }
}

SwingBuilder (GUI)

import groovy.swing.SwingBuilder
import javax.swing.*
import java.awt.*

def swing = new SwingBuilder()

swing.edt {  // edt ensures UI updates happen on Event Dispatch Thread
    frame(title: 'Groovy GUI', size: [300, 200], show: true) {
        borderLayout()
        panel(constraints: BorderLayout.CENTER) {
            label(text: 'Welcome to Groovy!')
            button(text: 'Click Me', actionPerformed: {
                JOptionPane.showMessageDialog(null, 'Button clicked!')
            })
        }
    }
}

Custom Builders

You can create your own builders by implementing the Builder interface or using the FactoryBuilderSupport class:

class PersonBuilder extends FactoryBuilderSupport {
    def createNode(Object name, Map attributes) {
        switch(name) {
            case 'person':
                return new Person()
            case 'name':
                return attributes.value
            case 'age':
                return attributes.value as int
        }
    }
    
    void setParent(Object parent, Object child) {
        if (parent instanceof Person) {
            switch(child) {
                case String: parent.name = child; break
                case Integer: parent.age = child; break
            }
        }
    }
}

def builder = new PersonBuilder()
def person = builder.person {
    name 'Alice'
    age 30
}

println person
← Back to Tutorials