123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- package javagen
- import (
- "bytes"
- "errors"
- "fmt"
- "io"
- "strings"
- "text/template"
- "zero/tools/goctl/api/spec"
- apiutil "zero/tools/goctl/api/util"
- "zero/tools/goctl/util"
- )
- const getSetTemplate = `
- {{.indent}}{{.decorator}}
- {{.indent}}public {{.returnType}} get{{.property}}() {
- {{.indent}} return this.{{.propertyValue}};
- {{.indent}}}
- {{.indent}}public void set{{.property}}({{.type}} {{.propertyValue}}) {
- {{.indent}} this.{{.propertyValue}} = {{.propertyValue}};
- {{.indent}}}
- `
- func writeProperty(writer io.Writer, member spec.Member, indent int) error {
- writeIndent(writer, indent)
- ty, err := goTypeToJava(member.Type)
- ty = strings.Replace(ty, "*", "", 1)
- if err != nil {
- return err
- }
- name, err := member.GetPropertyName()
- if err != nil {
- return err
- }
- _, err = fmt.Fprintf(writer, "private %s %s", ty, name)
- if err != nil {
- return err
- }
- writeDefaultValue(writer, member)
- fmt.Fprint(writer, ";\n")
- return err
- }
- func writeDefaultValue(writer io.Writer, member spec.Member) error {
- switch member.Type {
- case "string":
- _, err := fmt.Fprintf(writer, " = \"\"")
- return err
- }
- return nil
- }
- func writeIndent(writer io.Writer, indent int) {
- for i := 0; i < indent; i++ {
- fmt.Fprint(writer, "\t")
- }
- }
- func indentString(indent int) string {
- var result = ""
- for i := 0; i < indent; i++ {
- result += "\t"
- }
- return result
- }
- func writeBreakline(writer io.Writer) {
- fmt.Fprint(writer, "\n")
- }
- func isPrimitiveType(tp string) bool {
- switch tp {
- case "int", "int32", "int64":
- return true
- case "float", "float32", "float64":
- return true
- case "bool":
- return true
- }
- return false
- }
- func goTypeToJava(tp string) (string, error) {
- if len(tp) == 0 {
- return "", errors.New("property type empty")
- }
- if strings.HasPrefix(tp, "*") {
- tp = tp[1:]
- }
- switch tp {
- case "string":
- return "String", nil
- case "int64":
- return "long", nil
- case "int", "int8", "int32":
- return "int", nil
- case "float", "float32", "float64":
- return "double", nil
- case "bool":
- return "boolean", nil
- }
- if strings.HasPrefix(tp, "[]") {
- tys, err := apiutil.DecomposeType(tp)
- if err != nil {
- return "", err
- }
- if len(tys) == 0 {
- return "", fmt.Errorf("%s tp parse error", tp)
- }
- return fmt.Sprintf("java.util.ArrayList<%s>", util.Title(tys[0])), nil
- } else if strings.HasPrefix(tp, "map") {
- tys, err := apiutil.DecomposeType(tp)
- if err != nil {
- return "", err
- }
- if len(tys) == 2 {
- return "", fmt.Errorf("%s tp parse error", tp)
- }
- return fmt.Sprintf("java.util.HashMap<String, %s>", util.Title(tys[1])), nil
- }
- return util.Title(tp), nil
- }
- func genGetSet(writer io.Writer, tp spec.Type, indent int) error {
- t := template.Must(template.New("getSetTemplate").Parse(getSetTemplate))
- for _, member := range tp.Members {
- var tmplBytes bytes.Buffer
- oty, err := goTypeToJava(member.Type)
- if err != nil {
- return err
- }
- tyString := oty
- decorator := ""
- if !isPrimitiveType(member.Type) {
- if member.IsOptional() {
- decorator = "@org.jetbrains.annotations.Nullable "
- } else {
- decorator = "@org.jetbrains.annotations.NotNull "
- }
- tyString = decorator + tyString
- }
- err = t.Execute(&tmplBytes, map[string]string{
- "property": util.Title(member.Name),
- "propertyValue": util.Untitle(member.Name),
- "type": tyString,
- "decorator": decorator,
- "returnType": oty,
- "indent": indentString(indent),
- })
- if err != nil {
- return err
- }
- r := tmplBytes.String()
- r = strings.Replace(r, " boolean get", " boolean is", 1)
- writer.Write([]byte(r))
- }
- return nil
- }
|