Make JDBC metadata class for Querydsl on Gradle with settings written by YAML

This is an example of build.gradle to make JDBC metadata class for Querydsl. JDBC settings are written in ../config.yaml. The target RDBMS of JDBC is MySQL. It’s not smart, although it works well.

// vim: set expandtab ts=2 sw=2 nowrap ft=groovy ff=unix : */
sourceCompatibility = 1.6 // TODO: 1.7
version = '1.0'
group = 'jp.co.wktk.apiserver'

apply plugin: 'java'
apply plugin: 'jetty'

jettyRun.contextPath = ''
jettyRunWar.contextPath = ''

task wrapper(type: Wrapper) {
  gradleVersion = '1.0-milestone-8a'
}

import groovy.sql.Sql
import com.mysema.query.sql.MetaDataExporter

sourceSets {
  main {
    java {
      srcDir getGeneratedSrcPath()
    }
  }
}

// This build script uses snakeyaml for load YAML settings about database for Querydsl.
import org.yaml.snakeyaml.Yaml
buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath group: 'org.yaml', name: 'snakeyaml', version: '1.10'
    classpath group: 'com.mysema.querydsl', name: 'querydsl-sql', version: '2.3.1'
  }
}

repositories {
  mavenCentral()
  maven {
    url 'http://source.mysema.com/maven2/releases/' // for Querydsl
  }
  maven {
    url 'http://mvnrepository.com/' // for MySQL
  }
}

configurations {
  mysqlDriver
}

dependencies {
  compile(
    // for querydsl
    [group: 'com.mysema.querydsl', name: 'querydsl-sql', version: '2.3.1'],
    [group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.6.1'],
    // for yaml
    [group: 'org.yaml', name: 'snakeyaml', version: '1.10']
  )
  testCompile(
    [group: 'org.testng', name: 'testng', version: '6.4']
  )
  runtime(
    // for MySQL
    [group: 'mysql', name: 'mysql-connector-java', version: '5.1.18']
  )
  mysqlDriver group: 'mysql', name: 'mysql-connector-java', version: '5.1.18' // for MySQL
}

compileJava {
  doFirst {
    // load config from YAML
    File configFile = new File('../config.yaml')
    Yaml yaml = new Yaml();
    def config = yaml.load(configFile.newReader())
    def dbConfig = config.database;

    // Load MySQL Driver
    configurations.mysqlDriver.each {file ->
      gradle.class.classLoader.addURL(file.toURI().toURL())
    }

    // Create classes for Querydsl
    def sql = Sql.newInstance("jdbc:mysql://${dbConfig.host}:${dbConfig.port}/apiserver",
      dbConfig.username,
      dbConfig.password,
      'com.mysql.jdbc.Driver')
    MetaDataExporter exporter = new MetaDataExporter();
    exporter.setPackageName('jp.co.wktk.apiserver.persistence')
    exporter.setTargetFolder(getGeneratedSrcPath())
    exporter.export(sql.getConnection().getMetaData())
  }
}

test {
  useTestNG()
}

def getGeneratedSrcPath() {
  new File(
    buildDir.absolutePath + File.separator +
    'generated-src' + File.separator +
    'java')
}