123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- package javagen
- import (
- "bytes"
- "fmt"
- "strings"
- "text/template"
- "git.i2edu.net/i2/go-zero/core/stringx"
- "git.i2edu.net/i2/go-zero/tools/goctl/api/spec"
- apiutil "git.i2edu.net/i2/go-zero/tools/goctl/api/util"
- "git.i2edu.net/i2/go-zero/tools/goctl/util"
- )
- const packetTemplate = `package com.xhb.logic.http.packet.{{.packet}};
- import com.xhb.core.packet.HttpPacket;
- import com.xhb.core.network.HttpRequestClient;
- {{.imports}}
- {{.doc}}
- public class {{.packetName}} extends HttpPacket<{{.responseType}}> {
- {{.paramsDeclaration}}
- public {{.packetName}}({{.params}}{{if .HasRequestBody}}{{.requestType}} request{{end}}) {
- {{if .HasRequestBody}}super(request);{{else}}super(EmptyRequest.instance);{{end}}
- {{if .HasRequestBody}}this.request = request;{{end}}{{.paramsSetter}}
- }
- @Override
- public HttpRequestClient.Method requestMethod() {
- return HttpRequestClient.Method.{{.method}};
- }
- @Override
- public String requestUri() {
- return {{.uri}};
- }
- }
- `
- func genPacket(dir, packetName string, api *spec.ApiSpec) error {
- for _, route := range api.Service.Routes() {
- if err := createWith(dir, api, route, packetName); err != nil {
- return err
- }
- }
- return nil
- }
- func createWith(dir string, api *spec.ApiSpec, route spec.Route, packetName string) error {
- packet := route.Handler
- packet = strings.Replace(packet, "Handler", "Packet", 1)
- packet = strings.Title(packet)
- if !strings.HasSuffix(packet, "Packet") {
- packet += "Packet"
- }
- javaFile := packet + ".java"
- fp, created, err := apiutil.MaybeCreateFile(dir, "", javaFile)
- if err != nil {
- return err
- }
- if !created {
- return nil
- }
- defer fp.Close()
- hasRequestBody := false
- if route.RequestType != nil {
- if defineStruct, ok := route.RequestType.(spec.DefineStruct); ok {
- hasRequestBody = len(defineStruct.GetBodyMembers()) > 0 || len(defineStruct.GetFormMembers()) > 0
- }
- }
- params := strings.TrimSpace(paramsForRoute(route))
- if len(params) > 0 && hasRequestBody {
- params += ", "
- }
- paramsDeclaration := declarationForRoute(route)
- paramsSetter := paramsSet(route)
- imports := getImports(api, packetName)
- if len(route.ResponseTypeName()) == 0 {
- imports += fmt.Sprintf("\v%s", "import com.xhb.core.response.EmptyResponse;")
- }
- t := template.Must(template.New("packetTemplate").Parse(packetTemplate))
- var tmplBytes bytes.Buffer
- err = t.Execute(&tmplBytes, map[string]interface{}{
- "packetName": packet,
- "method": strings.ToUpper(route.Method),
- "uri": processUri(route),
- "responseType": stringx.TakeOne(util.Title(route.ResponseTypeName()), "EmptyResponse"),
- "params": params,
- "paramsDeclaration": strings.TrimSpace(paramsDeclaration),
- "paramsSetter": paramsSetter,
- "packet": packetName,
- "requestType": util.Title(route.RequestTypeName()),
- "HasRequestBody": hasRequestBody,
- "imports": imports,
- "doc": doc(route),
- })
- if err != nil {
- return err
- }
- _, err = fp.WriteString(formatSource(tmplBytes.String()))
- return err
- }
- func doc(route spec.Route) string {
- comment := route.JoinedDoc()
- if len(comment) > 0 {
- formatter := `
- /*
- %s
- */`
- return fmt.Sprintf(formatter, comment)
- }
- return ""
- }
- func getImports(api *spec.ApiSpec, packetName string) string {
- var builder strings.Builder
- allTypes := api.Types
- if len(allTypes) > 0 {
- fmt.Fprintf(&builder, "import com.xhb.logic.http.packet.%s.model.*;\n", packetName)
- }
- return builder.String()
- }
- func paramsSet(route spec.Route) string {
- path := route.Path
- cops := strings.Split(path, "/")
- var builder strings.Builder
- for _, cop := range cops {
- if len(cop) == 0 {
- continue
- }
- if strings.HasPrefix(cop, ":") {
- param := cop[1:]
- builder.WriteString("\n")
- builder.WriteString(fmt.Sprintf("\t\tthis.%s = %s;", param, param))
- }
- }
- result := builder.String()
- return result
- }
- func paramsForRoute(route spec.Route) string {
- path := route.Path
- cops := strings.Split(path, "/")
- var builder strings.Builder
- for _, cop := range cops {
- if len(cop) == 0 {
- continue
- }
- if strings.HasPrefix(cop, ":") {
- builder.WriteString(fmt.Sprintf("String %s, ", cop[1:]))
- }
- }
- return strings.TrimSuffix(builder.String(), ", ")
- }
- func declarationForRoute(route spec.Route) string {
- path := route.Path
- cops := strings.Split(path, "/")
- var builder strings.Builder
- writeIndent(&builder, 1)
- for _, cop := range cops {
- if len(cop) == 0 {
- continue
- }
- if strings.HasPrefix(cop, ":") {
- writeIndent(&builder, 1)
- builder.WriteString(fmt.Sprintf("private String %s;\n", cop[1:]))
- }
- }
- result := strings.TrimSpace(builder.String())
- if len(result) > 0 {
- result = "\n" + result
- }
- return result
- }
- func processUri(route spec.Route) string {
- path := route.Path
- var builder strings.Builder
- cops := strings.Split(path, "/")
- for index, cop := range cops {
- if len(cop) == 0 {
- continue
- }
- if strings.HasPrefix(cop, ":") {
- builder.WriteString("/\" + " + cop[1:] + " + \"")
- } else {
- builder.WriteString("/" + cop)
- if index == len(cops)-1 {
- builder.WriteString("\"")
- }
- }
- }
- result := builder.String()
- if strings.HasSuffix(result, " + \"") {
- result = result[:len(result)-4]
- }
- if strings.HasPrefix(result, "/") {
- result = strings.TrimPrefix(result, "/")
- result = "\"" + result
- }
- return result + formString(route)
- }
- func formString(route spec.Route) string {
- var keyValues []string
- if defineStruct, ok := route.RequestType.(spec.DefineStruct); ok {
- forms := defineStruct.GetFormMembers()
- for _, item := range forms {
- name, err := item.GetPropertyName()
- if err != nil {
- panic(err)
- }
- strcat := "?"
- if len(keyValues) > 0 {
- strcat = "&"
- }
- if item.Type.Name() == "bool" {
- name = strings.TrimPrefix(name, "Is")
- name = strings.TrimPrefix(name, "is")
- keyValues = append(keyValues, fmt.Sprintf(`"%s%s=" + request.is%s()`, strcat, name, strings.Title(name)))
- } else {
- keyValues = append(keyValues, fmt.Sprintf(`"%s%s=" + request.get%s()`, strcat, name, strings.Title(name)))
- }
- }
- if len(keyValues) > 0 {
- return " + " + strings.Join(keyValues, " + ")
- }
- }
- return ""
- }
|