Skip to content

Instantly share code, notes, and snippets.

@rdmueller
Created August 14, 2015 08:30
Show Gist options
  • Save rdmueller/acee3a5db5ea3273652b to your computer and use it in GitHub Desktop.
Save rdmueller/acee3a5db5ea3273652b to your computer and use it in GitHub Desktop.
// Copyright 2015
// Licensed under the Apache License, Version 2.0 (the "License")
// original source https://gist.github.com/rdmueller/acee3a5db5ea3273652b
import org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass
import grails.util.GrailsNameUtils
//includeTargets << grailsScript("_Init")
includeTargets << grailsScript("_GrailsPackage")
includeTargets << grailsScript("_GrailsBootstrap")
includeTargets << grailsScript("_GrailsCreateArtifacts")
target(exportDomainModel: "export Grails Domain Model as Java-Code") {
//have to fire up the Grails core in order to access domain class infos
depends(checkVersion, parseArguments, packageApp,loadApp)
def convertType = {def type->
def types= ['[B':'Byte[]','[C':'Char[]','[I':'Integer']
def res = type.toString()-"class "-"java.lang."-"java.util."-"java.math."
res = types[res]?:res
if (res.startsWith('[L')) {
res = convertType(res[2..-1])
}
return res
}
println " starting domain class export ".center(80,"=")
def domainClasses = grailsApp.domainClasses
if (!domainClasses) {
println "No domain classes found in grails-app/domain, trying hibernate mapped classes..."
bootstrap()
domainClasses = grailsApp.domainClasses
}
def superClass = [:]
def s = ""
grailsApp.domainClasses.each { dc ->
dc.getSubClasses().each { clazz ->
superClass[clazz]=dc
}
}
grailsApp.domainClasses.each { dc ->
def code = new StringBuilder()
def packageName = dc.clazz.name-".${dc.clazz.simpleName}"
// try to extract class documentation directly from source code
def fileName = "./grails-app/domain/"+packageName.replaceAll('[.]','/')+"/"+dc.clazz.simpleName+'.groovy'
def source = new File(fileName).getText('utf-8')
def comment = (source =~ '(?ms)(/[*][*].*[*]/)')
//did we find a comment? then extract it
if (comment.size()>0) {
comment = comment[0][0].replaceAll('<br[/ ]*>','\n')
//that's dirty:
//only get first comment
comment = comment.replaceAll("(?ms)[*]/.*",'*/')
} else {
comment = ""
}
def superName = ""
if (superClass[dc]) {
superName = superClass[dc].name
def superPackage = superClass[dc].fullName - ".${superClass[dc].name}"
if (superPackage!=packageName) {
superName = superPackage+'.'+superName
}
superName = " extends "+superName
}
code << "package ${packageName};\n\n"
code << comment+"\n\n"
code << "public class ${dc.clazz.simpleName}$superName {\n"
def domainInstance = new DefaultGrailsDomainClass(grailsApp.classLoader.loadClass("${dc.fullName}"))
domainInstance.getPersistentProperties().each {prop ->
if (! dc.associationMap[prop.name]) {
if (!superClass[dc]|| !(prop in superClass[dc].getPersistentProperties())) {
code << " public ${convertType(prop.type)} ${prop.name};\n"
}
}
}
dc.associationMap.each {name,type->
code << " public ${convertType(type)}[] ${name};\n"
}
code << "\n}\n"
def path = "target/docs/domain/"+packageName.replaceAll(/[.]/,'/')+"/"
new File(path).mkdirs()
new File(path+dc.clazz.simpleName+".java").write(code.toString(),'iso-8859-1')
}
}
setDefaultTarget(exportDomainModel)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment