gencomponents.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package javagen
  2. import (
  3. "errors"
  4. "fmt"
  5. "io"
  6. "path"
  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. apiutil "github.com/tal-tech/go-zero/tools/goctl/api/util"
  12. "github.com/tal-tech/go-zero/tools/goctl/util"
  13. )
  14. const (
  15. componentTemplate = `// Code generated by goctl. DO NOT EDIT.
  16. package com.xhb.logic.http.packet.{{.packet}}.model;
  17. import org.jetbrains.annotations.NotNull;
  18. import org.jetbrains.annotations.Nullable;
  19. {{.imports}}
  20. {{.componentType}}
  21. `
  22. httpResponseData = "import com.xhb.core.response.HttpResponseData;"
  23. httpData = "import com.xhb.core.packet.HttpData;"
  24. )
  25. type componentsContext struct {
  26. api *spec.ApiSpec
  27. requestTypes []spec.Type
  28. responseTypes []spec.Type
  29. imports []string
  30. }
  31. func genComponents(dir, packetName string, api *spec.ApiSpec) error {
  32. types := api.Types
  33. if len(types) == 0 {
  34. return nil
  35. }
  36. var requestTypes []spec.Type
  37. var responseTypes []spec.Type
  38. for _, group := range api.Service.Groups {
  39. for _, route := range group.Routes {
  40. if route.RequestType != nil {
  41. requestTypes = append(requestTypes, route.RequestType)
  42. }
  43. if route.ResponseType != nil {
  44. responseTypes = append(responseTypes, route.ResponseType)
  45. }
  46. }
  47. }
  48. context := componentsContext{api: api, requestTypes: requestTypes, responseTypes: responseTypes}
  49. for _, ty := range types {
  50. if err := context.createComponent(dir, packetName, ty); err != nil {
  51. return err
  52. }
  53. }
  54. return nil
  55. }
  56. func (c *componentsContext) createComponent(dir, packetName string, ty spec.Type) error {
  57. defineStruct, ok := ty.(spec.DefineStruct)
  58. if !ok {
  59. return errors.New("unsupported type %s" + ty.Name())
  60. }
  61. for _, item := range c.requestTypes {
  62. if item.Name() == defineStruct.Name() {
  63. if len(defineStruct.GetFormMembers())+len(defineStruct.GetBodyMembers()) == 0 {
  64. return nil
  65. }
  66. }
  67. }
  68. modelFile := util.Title(ty.Name()) + ".java"
  69. filename := path.Join(dir, modelDir, modelFile)
  70. if err := util.RemoveOrQuit(filename); err != nil {
  71. return err
  72. }
  73. fp, created, err := apiutil.MaybeCreateFile(dir, modelDir, modelFile)
  74. if err != nil {
  75. return err
  76. }
  77. if !created {
  78. return nil
  79. }
  80. defer fp.Close()
  81. tyString, err := c.buildType(defineStruct)
  82. if err != nil {
  83. return err
  84. }
  85. t := template.Must(template.New("componentType").Parse(componentTemplate))
  86. return t.Execute(fp, map[string]string{
  87. "componentType": tyString,
  88. "packet": packetName,
  89. "imports": strings.Join(c.imports, "\n"),
  90. })
  91. }
  92. func (c *componentsContext) buildType(ty spec.DefineStruct) (string, error) {
  93. var builder strings.Builder
  94. if err := c.writeType(&builder, ty); err != nil {
  95. return "", apiutil.WrapErr(err, "Type "+ty.Name()+" generate error")
  96. }
  97. return builder.String(), nil
  98. }
  99. func (c *componentsContext) writeType(writer io.Writer, defineStruct spec.DefineStruct) error {
  100. responseData := "HttpData"
  101. for _, item := range c.responseTypes {
  102. if item.Name() == defineStruct.Name() {
  103. responseData = "HttpResponseData"
  104. if !stringx.Contains(c.imports, httpResponseData) {
  105. c.imports = append(c.imports, httpResponseData)
  106. }
  107. break
  108. }
  109. }
  110. if responseData == "HttpData" && !stringx.Contains(c.imports, httpData) {
  111. c.imports = append(c.imports, httpData)
  112. }
  113. fmt.Fprintf(writer, "public class %s extends %s {\n", util.Title(defineStruct.Name()), responseData)
  114. err := c.writeMembers(writer, defineStruct, 1)
  115. if err != nil {
  116. return err
  117. }
  118. genGetSet(writer, defineStruct, 1)
  119. fmt.Fprintf(writer, "}")
  120. return nil
  121. }
  122. func (c *componentsContext) writeMembers(writer io.Writer, ty spec.DefineStruct, indent int) error {
  123. for _, member := range ty.Members {
  124. if member.IsInline {
  125. defineStruct, ok := member.Type.(spec.DefineStruct)
  126. if ok {
  127. err := c.writeMembers(writer, defineStruct, indent)
  128. if err != nil {
  129. return err
  130. }
  131. continue
  132. }
  133. return errors.New("unsupported inline type %s" + member.Type.Name())
  134. }
  135. if member.IsBodyMember() || member.IsFormMember() {
  136. if err := writeProperty(writer, member, indent); err != nil {
  137. return err
  138. }
  139. }
  140. }
  141. return nil
  142. }