[Groovy]astah* の ER図からliquibase の createtable を生成したい

と思ったので。間に合せで書いてみた。

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
import com.change_vision.jude.api.inf.model.*;
import com.change_vision.jude.api.inf.project.*;
import groovy.xml.MarkupBuilder
def PROJECT_PATH = args[0]
def OUTPUT_FILE = args[1]
println("Opening project...");
def prjAccessor = ProjectAccessorFactory.getProjectAccessor();
prjAccessor.open(PROJECT_PATH, true, false, true);
// 起点となるモデルを取得する。
def project = prjAccessor.getProject();
def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
project.ownedElements.each(){ diagram ->
diagram.ownedElements.each(){ schema ->
if(schema instanceof IERSchema){
schema.entities.each(){ entity ->
xml.createTable(tableName : entity.physicalName.trim(),
remarks:"${entity.logicalName.trim()}\t${entity.definition.replace('\n',' ').trim()}"){
def columns = []
columns.addAll(entity.primaryKeys)
columns.addAll(entity.nonPrimaryKeys)
columns.each{ attr ->
columnAttr = [name: attr.physicalName.trim()]
if(attr.lengthPrecision){
columnAttr.type = "${attr.datatype}(${attr.lengthPrecision})"
}else{
columnAttr.type = "${attr.datatype}"
}
if(attr.defaultValue) {
columnAttr.defaultValue = attr.defaultValue
}
if(attr.definition){
columnAttr.remarks =
"${attr.logicalName.trim()}\t${attr.definition.replace('\n',' ').trim()}"
}else{
columnAttr.remarks = "${attr.logicalName.trim()}"
}
//データ型の読み替え処理とか
if("TIMESTAMP" == attr.datatype.name){
columnAttr.type = " TIMESTAMP"
}
//PKならautoincrement とか
if(attr.primaryKey){
columnAttr.autoIncrement = true
}
column(columnAttr){
if(attr.primaryKey) constraints(primaryKey:"true", nullable:"false")
if(! attr.primaryKey && attr.notNull) constraints(nullable:"false")
}
}
//共通カラム
column(name:"regist_date", type:" TIMESTAMP", remarks:"登録日")
}
}
}
}
}
// プロジェクトを閉じる
prjAccessor.close();
//結果を出力
if(OUTPUT_FILE){
new File(OUTPUT_FILE).withWriter(){
it << writer.toString()
}
}
println("Finished");