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