util.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. package javagen
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "io"
  7. "strings"
  8. "text/template"
  9. "zero/tools/goctl/api/spec"
  10. apiutil "zero/tools/goctl/api/util"
  11. "zero/tools/goctl/util"
  12. )
  13. const getSetTemplate = `
  14. {{.indent}}{{.decorator}}
  15. {{.indent}}public {{.returnType}} get{{.property}}() {
  16. {{.indent}} return this.{{.propertyValue}};
  17. {{.indent}}}
  18. {{.indent}}public void set{{.property}}({{.type}} {{.propertyValue}}) {
  19. {{.indent}} this.{{.propertyValue}} = {{.propertyValue}};
  20. {{.indent}}}
  21. `
  22. func writeProperty(writer io.Writer, member spec.Member, indent int) error {
  23. writeIndent(writer, indent)
  24. ty, err := goTypeToJava(member.Type)
  25. ty = strings.Replace(ty, "*", "", 1)
  26. if err != nil {
  27. return err
  28. }
  29. name, err := member.GetPropertyName()
  30. if err != nil {
  31. return err
  32. }
  33. _, err = fmt.Fprintf(writer, "private %s %s", ty, name)
  34. if err != nil {
  35. return err
  36. }
  37. writeDefaultValue(writer, member)
  38. fmt.Fprint(writer, ";\n")
  39. return err
  40. }
  41. func writeDefaultValue(writer io.Writer, member spec.Member) error {
  42. switch member.Type {
  43. case "string":
  44. _, err := fmt.Fprintf(writer, " = \"\"")
  45. return err
  46. }
  47. return nil
  48. }
  49. func writeIndent(writer io.Writer, indent int) {
  50. for i := 0; i < indent; i++ {
  51. fmt.Fprint(writer, "\t")
  52. }
  53. }
  54. func indentString(indent int) string {
  55. var result = ""
  56. for i := 0; i < indent; i++ {
  57. result += "\t"
  58. }
  59. return result
  60. }
  61. func writeBreakline(writer io.Writer) {
  62. fmt.Fprint(writer, "\n")
  63. }
  64. func isPrimitiveType(tp string) bool {
  65. switch tp {
  66. case "int", "int32", "int64":
  67. return true
  68. case "float", "float32", "float64":
  69. return true
  70. case "bool":
  71. return true
  72. }
  73. return false
  74. }
  75. func goTypeToJava(tp string) (string, error) {
  76. if len(tp) == 0 {
  77. return "", errors.New("property type empty")
  78. }
  79. if strings.HasPrefix(tp, "*") {
  80. tp = tp[1:]
  81. }
  82. switch tp {
  83. case "string":
  84. return "String", nil
  85. case "int64":
  86. return "long", nil
  87. case "int", "int8", "int32":
  88. return "int", nil
  89. case "float", "float32", "float64":
  90. return "double", nil
  91. case "bool":
  92. return "boolean", nil
  93. }
  94. if strings.HasPrefix(tp, "[]") {
  95. tys, err := apiutil.DecomposeType(tp)
  96. if err != nil {
  97. return "", err
  98. }
  99. if len(tys) == 0 {
  100. return "", fmt.Errorf("%s tp parse error", tp)
  101. }
  102. return fmt.Sprintf("java.util.ArrayList<%s>", util.Title(tys[0])), nil
  103. } else if strings.HasPrefix(tp, "map") {
  104. tys, err := apiutil.DecomposeType(tp)
  105. if err != nil {
  106. return "", err
  107. }
  108. if len(tys) == 2 {
  109. return "", fmt.Errorf("%s tp parse error", tp)
  110. }
  111. return fmt.Sprintf("java.util.HashMap<String, %s>", util.Title(tys[1])), nil
  112. }
  113. return util.Title(tp), nil
  114. }
  115. func genGetSet(writer io.Writer, tp spec.Type, indent int) error {
  116. t := template.Must(template.New("getSetTemplate").Parse(getSetTemplate))
  117. for _, member := range tp.Members {
  118. var tmplBytes bytes.Buffer
  119. oty, err := goTypeToJava(member.Type)
  120. if err != nil {
  121. return err
  122. }
  123. tyString := oty
  124. decorator := ""
  125. if !isPrimitiveType(member.Type) {
  126. if member.IsOptional() {
  127. decorator = "@org.jetbrains.annotations.Nullable "
  128. } else {
  129. decorator = "@org.jetbrains.annotations.NotNull "
  130. }
  131. tyString = decorator + tyString
  132. }
  133. err = t.Execute(&tmplBytes, map[string]string{
  134. "property": util.Title(member.Name),
  135. "propertyValue": util.Untitle(member.Name),
  136. "type": tyString,
  137. "decorator": decorator,
  138. "returnType": oty,
  139. "indent": indentString(indent),
  140. })
  141. if err != nil {
  142. return err
  143. }
  144. r := tmplBytes.String()
  145. r = strings.Replace(r, " boolean get", " boolean is", 1)
  146. writer.Write([]byte(r))
  147. }
  148. return nil
  149. }