Created
August 14, 2015 08:30
-
-
Save rdmueller/acee3a5db5ea3273652b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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