1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| import com.intellij.database.model.DasTable import com.intellij.database.model.ObjectKind import com.intellij.database.util.Case import com.intellij.database.util.DasUtil
import java.text.DateFormat import java.text.SimpleDateFormat
packageName = "com.xxx.po;" typeMapping = [ (~/(?i)int/) : "Integer", (~/(?i)float|double|decimal|real/): "Double", (~/(?i)bool|boolean/) : "Boolean", (~/(?i)datetime|timestamp/) : "java.util.Date", (~/(?i)date/) : "java.sql.Date", (~/(?i)time/) : "java.sql.Time", (~/(?i)/) : "String" ]
FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir -> SELECTION.filter { it instanceof DasTable && it.getKind() == ObjectKind.TABLE }.each { generate(it, dir) } }
def generate(table, dir) { def className = javaName(table.getName(), true) + "PO" def fields = calcFields(table) new File(dir, className + ".java").withPrintWriter("utf-8") { out -> generate(out, table, className, fields) } }
def generate(out, table, className, fields) { def tableName = table.getName() out.println "package $packageName" out.println "" out.println "import lombok.*;" out.println "" out.println "import javax.persistence.*;" out.println "" out.println "/**" out.println " * @author xxx" out.println " **/" out.println "@Data" out.println "@Entity" out.println "@Table(name = \"$tableName\")" out.println "public class $className {" out.println "" if ((tableName + "_id").equalsIgnoreCase(fields[0].colum) || "id".equalsIgnoreCase(fields[0].colum)) { out.println " @Id" out.println " @GeneratedValue(strategy=GenerationType.IDENTITY)" } fields.each() { if (it.comment != "" && it.comment != null) { out.println " /**" out.println " * ${it.comment}" out.println " **/" } if (it.annos != "") out.println " ${it.annos}" if (it.colum != it.name) { out.println " @Column(name = \"${it.colum}\")" }
out.println " private ${it.type} ${it.name};" out.println "" } out.println "}" }
def calcFields(table) { DasUtil.getColumns(table).reduce([]) { fields, col -> def spec = Case.LOWER.apply(col.getDataType().getSpecification()) def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value fields += [[ name : javaName(col.getName(), false), colum : col.getName(), type : typeStr, comment: col.getComment(), annos : ""]] } }
def javaName(str, capitalize) { def s = str.split(/(?<=[^\p{IsLetter}])/).collect { Case.LOWER.apply(it).capitalize() } .join("").replaceAll(/[^\p{javaJavaIdentifierPart}]/, "_").replaceAll(/_/, "") capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1] }
|