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 }