123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- (def package "com.my.db")
- (def default-type "String")
- (def type-mappings
- [
- [["int"] "Long"]
- [["float" "double" "decimal" "real"] "Double"]
- [["datetime" "timestamp"] "java.sql.Timestamp"]
- [["date"] "java.sql.Date"]
- [["time"] "java.sql.Time"]
- ])
- (defn- first-to-lower-case [name]
- (if (< (count name) 2) (.toLowerCase name) (str (.toLowerCase (subs name 0 1)) (subs name 1))))
- (defn- java-name [name]
- (apply str (map clojure.string/capitalize (re-seq #"\w+" name))))
- (defn- java-type [data-type]
- (let [spec (.. data-type getSpecification toLowerCase)
- spec-matches? (fn [pattern] (.contains spec pattern))
- mapping-matches? (fn [[ps t]] (when (some spec-matches? ps) t))
- type (some mapping-matches? type-mappings)]
- (or type default-type)))
- (defn- field-infos [table]
- (let [columns (com.intellij.database.util.DasUtil/getColumns table)
- field-info (fn [column] {:name (java-name (.getName column))
- :type (java-type (.getDataType column))})]
- (map field-info columns)))
- (defn- field-text [field-info]
- (let [type (:type field-info)
- fname (first-to-lower-case (:name field-info))]
- (str " private " type " " fname ";\n")))
- (defn- getter-text [field-info]
- (let [type (:type field-info)
- name (:name field-info)
- fname (first-to-lower-case name)]
- (str " public " type " get" name "() {\n"
- " return " fname ";\n"
- " }\n")))
- (defn- setter-text [field-info]
- (let [type (:type field-info)
- name (:name field-info)
- fname (first-to-lower-case name)]
- (str " public void set" name "(" type " " fname ") {\n"
- " this." fname " = " fname ";\n"
- " }\n")))
- (defn- pojo-text [class-name fields]
- (apply str (flatten
- ["package " package ";\n\n"
- "public class " class-name " {\n"
- (map field-text fields)
- "\n"
- (interpose "\n" (interleave (map getter-text fields)
- (map setter-text fields)))
- "}\n"])))
- (defn- generate-pojo [directory table]
- (let [class-name (java-name (.getName table))
- fields (field-infos table)
- file (java.io.File. directory (str class-name ".java"))
- text (pojo-text class-name fields)]
- (com.intellij.openapi.util.io.FileUtil/writeToFile file text)))
- (defn- generate-pojos [directory]
- (let [table? (partial instance? com.intellij.database.model.DasTable)]
- (doseq [table (filter table? SELECTION)]
- (generate-pojo directory table))))
- (.chooseDirectoryAndSave FILES
- "Choose directory"
- "Choose where to generate POJOs to"
- (proxy [com.intellij.util.Consumer] []
- (consume [directory]
- (generate-pojos directory)
- (.refresh FILES directory))))
|