Generate POJOs.clj 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. (def package "com.my.db")
  2. (def default-type "String")
  3. (def type-mappings
  4. [
  5. [["int"] "Long"]
  6. [["float" "double" "decimal" "real"] "Double"]
  7. [["datetime" "timestamp"] "java.sql.Timestamp"]
  8. [["date"] "java.sql.Date"]
  9. [["time"] "java.sql.Time"]
  10. ])
  11. (defn- first-to-lower-case [name]
  12. (if (< (count name) 2) (.toLowerCase name) (str (.toLowerCase (subs name 0 1)) (subs name 1))))
  13. (defn- java-name [name]
  14. (apply str (map clojure.string/capitalize (re-seq #"\w+" name))))
  15. (defn- java-type [data-type]
  16. (let [spec (.. data-type getSpecification toLowerCase)
  17. spec-matches? (fn [pattern] (.contains spec pattern))
  18. mapping-matches? (fn [[ps t]] (when (some spec-matches? ps) t))
  19. type (some mapping-matches? type-mappings)]
  20. (or type default-type)))
  21. (defn- field-infos [table]
  22. (let [columns (com.intellij.database.util.DasUtil/getColumns table)
  23. field-info (fn [column] {:name (java-name (.getName column))
  24. :type (java-type (.getDataType column))})]
  25. (map field-info columns)))
  26. (defn- field-text [field-info]
  27. (let [type (:type field-info)
  28. fname (first-to-lower-case (:name field-info))]
  29. (str " private " type " " fname ";\n")))
  30. (defn- getter-text [field-info]
  31. (let [type (:type field-info)
  32. name (:name field-info)
  33. fname (first-to-lower-case name)]
  34. (str " public " type " get" name "() {\n"
  35. " return " fname ";\n"
  36. " }\n")))
  37. (defn- setter-text [field-info]
  38. (let [type (:type field-info)
  39. name (:name field-info)
  40. fname (first-to-lower-case name)]
  41. (str " public void set" name "(" type " " fname ") {\n"
  42. " this." fname " = " fname ";\n"
  43. " }\n")))
  44. (defn- pojo-text [class-name fields]
  45. (apply str (flatten
  46. ["package " package ";\n\n"
  47. "public class " class-name " {\n"
  48. (map field-text fields)
  49. "\n"
  50. (interpose "\n" (interleave (map getter-text fields)
  51. (map setter-text fields)))
  52. "}\n"])))
  53. (defn- generate-pojo [directory table]
  54. (let [class-name (java-name (.getName table))
  55. fields (field-infos table)
  56. file (java.io.File. directory (str class-name ".java"))
  57. text (pojo-text class-name fields)]
  58. (com.intellij.openapi.util.io.FileUtil/writeToFile file text)))
  59. (defn- generate-pojos [directory]
  60. (let [table? (partial instance? com.intellij.database.model.DasTable)]
  61. (doseq [table (filter table? SELECTION)]
  62. (generate-pojo directory table))))
  63. (.chooseDirectoryAndSave FILES
  64. "Choose directory"
  65. "Choose where to generate POJOs to"
  66. (proxy [com.intellij.util.Consumer] []
  67. (consume [directory]
  68. (generate-pojos directory)
  69. (.refresh FILES directory))))