github.com/keysonZZZ/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgRpc/kmgRpcJava/kmgRpcJava.go (about)

     1  package kmgRpcJava
     2  
     3  import (
     4  	"github.com/bronze1man/kmg/kmgCache"
     5  	"github.com/bronze1man/kmg/kmgConfig"
     6  	"github.com/bronze1man/kmg/kmgFile"
     7  	"github.com/bronze1man/kmg/kmgGoSource/kmgFormat"
     8  	"path/filepath"
     9  	"strings"
    10  )
    11  
    12  type GenerateRequest struct {
    13  	ObjectPkgPath   string
    14  	ObjectName      string
    15  	ObjectIsPointer bool
    16  	OutFilePath     string //输出的文件路径,仅用于写入文件  如 /root/xxx/src/com/demo/testPackage/RpcDemo.java
    17  	OutPackageName  string // java package full name. 如 com.demo.testPackage
    18  	OutClassName    string // java的类的名字 如 RpcDemo
    19  	ApiNameFilterCb func(name string) bool
    20  }
    21  
    22  //生成代码
    23  // 此处只生成java代码,不生成golang代码.
    24  // 限制: 输出只能有一个参数,
    25  func MustGenerateCode(req *GenerateRequest) {
    26  	config := reflectToTplConfig(req)
    27  	outBs := tplGenerateCode(config)
    28  	outB := kmgFormat.RemoteEmptyLine([]byte(outBs))
    29  	kmgFile.MustWriteFileWithMkdir(req.OutFilePath, outB)
    30  }
    31  
    32  type tplConfig struct {
    33  	OutPackageName string        //生成的package的名字 如 com.demo.testPackage
    34  	ClassName      string        //类名称 如 RpcDemo
    35  	InnerClassList []*InnerClass //里面包含的类的类型定义的名称 包括rpc辅助类,如 xxxRequest 和 golang里面用户定义的struct.
    36  	innerClassMap  map[string]*InnerClass
    37  	ApiList        []Api //api列表 包括所有大写开头额Api名称
    38  }
    39  
    40  func (config *tplConfig) addInnerClass(class *InnerClass) {
    41  	_, ok := config.innerClassMap[class.Name]
    42  	if ok {
    43  		panic("InnerClass name repeat [" + class.Name + "]")
    44  	}
    45  	config.innerClassMap[class.Name] = class
    46  	config.InnerClassList = append(config.InnerClassList, class)
    47  }
    48  
    49  type Api struct {
    50  	Name             string         //在这个系统里面的名字
    51  	InArgsList       []NameTypePair //输入变量列表
    52  	OutTypeString    string         // 有可能是void
    53  	OutTypeFieldName string         // 输出的那个变量的在response里面的名字,如果没有表示直接返回response
    54  }
    55  
    56  func (api *Api) getClientFuncInParameter() string {
    57  	outputList := []string{}
    58  	for _, arg := range api.InArgsList {
    59  		outputList = append(outputList, arg.TypeStr+" "+arg.Name)
    60  	}
    61  	return strings.Join(outputList, ",")
    62  }
    63  
    64  type NameTypePair struct {
    65  	Name    string
    66  	TypeStr string
    67  }
    68  
    69  type InnerClass struct {
    70  	Name      string //此处只有一个层次的名称,如果原先有package会被直接灭掉.
    71  	FieldList []NameTypePair
    72  	IsPublic  bool
    73  }
    74  
    75  // 使用缓存 生成代码
    76  func MustGenerateCodeWithCache(req *GenerateRequest) {
    77  	pkgFilePath := kmgConfig.DefaultEnv().PathInProject(filepath.Join("src", req.ObjectPkgPath))
    78  	kmgCache.MustMd5FileChangeCache("kmgRpc_"+req.OutFilePath, []string{req.OutFilePath, pkgFilePath}, func() {
    79  		MustGenerateCode(req)
    80  	})
    81  }