util.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package javagen
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "io"
  7. "strings"
  8. "text/template"
  9. "github.com/tal-tech/go-zero/core/stringx"
  10. "github.com/tal-tech/go-zero/tools/goctl/api/spec"
  11. "github.com/tal-tech/go-zero/tools/goctl/util"
  12. )
  13. const getSetTemplate = `
  14. {{.indent}}{{.decorator}}
  15. {{.indent}}public {{.returnType}} get{{.property}}() {
  16. {{.indent}} return this.{{.tagValue}};
  17. {{.indent}}}
  18. {{.indent}}public void set{{.property}}({{.type}} {{.propertyValue}}) {
  19. {{.indent}} this.{{.tagValue}} = {{.propertyValue}};
  20. {{.indent}}}
  21. `
  22. const boolTemplate = `
  23. {{.indent}}{{.decorator}}
  24. {{.indent}}public {{.returnType}} is{{.property}}() {
  25. {{.indent}} return this.{{.tagValue}};
  26. {{.indent}}}
  27. {{.indent}}public void set{{.property}}({{.type}} {{.propertyValue}}) {
  28. {{.indent}} this.{{.tagValue}} = {{.propertyValue}};
  29. {{.indent}}}
  30. `
  31. func writeProperty(writer io.Writer, member spec.Member, indent int) error {
  32. writeIndent(writer, indent)
  33. ty, err := goTypeToJava(member.Type)
  34. ty = strings.Replace(ty, "*", "", 1)
  35. if err != nil {
  36. return err
  37. }
  38. name, err := member.GetPropertyName()
  39. if err != nil {
  40. return err
  41. }
  42. _, err = fmt.Fprintf(writer, "private %s %s", ty, name)
  43. if err != nil {
  44. return err
  45. }
  46. writeDefaultValue(writer, member)
  47. fmt.Fprint(writer, ";\n")
  48. return err
  49. }
  50. func writeDefaultValue(writer io.Writer, member spec.Member) error {
  51. javaType, err := goTypeToJava(member.Type)
  52. if err != nil {
  53. return err
  54. }
  55. if javaType == "String" {
  56. _, err := fmt.Fprintf(writer, " = \"\"")
  57. return err
  58. }
  59. return nil
  60. }
  61. func writeIndent(writer io.Writer, indent int) {
  62. for i := 0; i < indent; i++ {
  63. fmt.Fprint(writer, "\t")
  64. }
  65. }
  66. func indentString(indent int) string {
  67. var result = ""
  68. for i := 0; i < indent; i++ {
  69. result += "\t"
  70. }
  71. return result
  72. }
  73. func goTypeToJava(tp spec.Type) (string, error) {
  74. switch v := tp.(type) {
  75. case spec.DefineStruct:
  76. return util.Title(tp.Name()), nil
  77. case spec.PrimitiveType:
  78. r, ok := primitiveType(tp.Name())
  79. if !ok {
  80. return "", errors.New("unsupported primitive type " + tp.Name())
  81. }
  82. return r, nil
  83. case spec.MapType:
  84. valueType, err := goTypeToJava(v.Value)
  85. if err != nil {
  86. return "", err
  87. }
  88. return fmt.Sprintf("java.util.HashMap<String, %s>", util.Title(valueType)), nil
  89. case spec.ArrayType:
  90. if tp.Name() == "[]byte" {
  91. return "byte[]", nil
  92. }
  93. valueType, err := goTypeToJava(v.Value)
  94. if err != nil {
  95. return "", err
  96. }
  97. return fmt.Sprintf("java.util.ArrayList<%s>", util.Title(valueType)), nil
  98. case spec.InterfaceType:
  99. return "Object", nil
  100. case spec.PointerType:
  101. return goTypeToJava(v.Type)
  102. }
  103. return "", errors.New("unsupported primitive type " + tp.Name())
  104. }
  105. func primitiveType(tp string) (string, bool) {
  106. switch tp {
  107. case "string":
  108. return "String", true
  109. case "int64", "uint64":
  110. return "long", true
  111. case "int", "int8", "int32", "uint", "uint8", "uint16", "uint32":
  112. return "int", true
  113. case "float", "float32", "float64":
  114. return "double", true
  115. case "bool":
  116. return "boolean", true
  117. }
  118. return "", false
  119. }
  120. func genGetSet(writer io.Writer, defineStruct spec.DefineStruct, indent int) error {
  121. var members = defineStruct.GetBodyMembers()
  122. members = append(members, defineStruct.GetFormMembers()...)
  123. for _, member := range members {
  124. javaType, err := goTypeToJava(member.Type)
  125. if err != nil {
  126. return nil
  127. }
  128. var property = util.Title(member.Name)
  129. var templateStr = getSetTemplate
  130. if javaType == "boolean" {
  131. templateStr = boolTemplate
  132. property = strings.TrimPrefix(property, "Is")
  133. property = strings.TrimPrefix(property, "is")
  134. }
  135. t := template.Must(template.New(templateStr).Parse(getSetTemplate))
  136. var tmplBytes bytes.Buffer
  137. tyString := javaType
  138. decorator := ""
  139. javaPrimitiveType := []string{"int", "long", "boolean", "float", "double", "short"}
  140. if !stringx.Contains(javaPrimitiveType, javaType) {
  141. if member.IsOptional() || member.IsOmitEmpty() {
  142. decorator = "@Nullable "
  143. } else {
  144. decorator = "@NotNull "
  145. }
  146. tyString = decorator + tyString
  147. }
  148. tagName, err := member.GetPropertyName()
  149. if err != nil {
  150. return err
  151. }
  152. err = t.Execute(&tmplBytes, map[string]string{
  153. "property": property,
  154. "propertyValue": util.Untitle(member.Name),
  155. "tagValue": tagName,
  156. "type": tyString,
  157. "decorator": decorator,
  158. "returnType": javaType,
  159. "indent": indentString(indent),
  160. })
  161. if err != nil {
  162. return err
  163. }
  164. r := tmplBytes.String()
  165. r = strings.Replace(r, " boolean get", " boolean is", 1)
  166. writer.Write([]byte(r))
  167. }
  168. return nil
  169. }