Skip to content

Commit

Permalink
Merge pull request #60 from chinkong83/mywork
Browse files Browse the repository at this point in the history
Mywork
  • Loading branch information
chinkong83 authored Sep 7, 2018
2 parents 0decd2f + f9ef580 commit 5b24f48
Show file tree
Hide file tree
Showing 5 changed files with 142 additions and 92 deletions.
8 changes: 4 additions & 4 deletions cmd/rdl-gen-parsec-java-client/gentemplate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ func TestGenerateInterface(test *testing.T) {

buf := new (bytes.Buffer)
writer := bufio.NewWriter(buf)
gen := &javaClientGenerator{reg, &schema, cName, writer, nil, "test", "", ""}
gen := &javaClientGenerator{reg, &schema, cName, writer, nil, "test", "", "", false}
gen.processTemplate(javaClientInterfaceTemplate)
writer.Flush()
realClientInterface := buf.String()
Expand Down Expand Up @@ -61,7 +61,7 @@ func TestGenerateImpl(test *testing.T) {

buf := new (bytes.Buffer)
writer := bufio.NewWriter(buf)
gen := &javaClientGenerator{reg, &schema, cName, writer, nil, "test", "", ""}
gen := &javaClientGenerator{reg, &schema, cName, writer, nil, "test", "", "", false}
gen.processTemplate(javaClientTemplate)
writer.Flush()
realClientImpl := buf.String()
Expand Down Expand Up @@ -90,7 +90,7 @@ func TestGenerateImpl2(test *testing.T) {

buf := new (bytes.Buffer)
writer := bufio.NewWriter(buf)
gen := &javaClientGenerator{reg, &schema, cName, writer, nil, "test", "", ""}
gen := &javaClientGenerator{reg, &schema, cName, writer, nil, "test", "", "", false}
gen.processTemplate(javaClientTemplate)
writer.Flush()
realClientImpl := buf.String()
Expand All @@ -102,7 +102,7 @@ func TestGenerateImpl2(test *testing.T) {
}

func TestUriConstruct(test *testing.T) {
gen := &javaClientGenerator{nil, nil, "", nil, nil, "test", "", ""}
gen := &javaClientGenerator{nil, nil, "", nil, nil, "test", "", "", false}
inputs := []*rdl.ResourceInput{{Name: "id", PathParam: true}}
r := &rdl.Resource{Inputs: inputs}
realOut := gen.builderExt(r)
Expand Down
60 changes: 38 additions & 22 deletions cmd/rdl-gen-parsec-java-client/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,41 +15,55 @@ import (
"os"
"github.com/yahoo/parsec-rdl-gen/utils"
"text/template"
"strconv"
)

type javaClientGenerator struct {
registry rdl.TypeRegistry
schema *rdl.Schema
name string
writer *bufio.Writer
err error
banner string
ns string
base string
registry rdl.TypeRegistry
schema *rdl.Schema
name string
writer *bufio.Writer
err error
banner string
ns string
base string
isPcSuffix bool
}

func main() {
pOutdir := flag.String("o", ".", "Output directory")
flag.String("s", "", "RDL source file")
namespace := flag.String("ns", "", "Namespace")
pc := flag.String("pc", "false", "add '_Pc' postfix to the generated java class")
flag.Parse()

isPcSuffix, err := strconv.ParseBool(*pc)
checkErr(err)

data, err := ioutil.ReadAll(os.Stdin)
banner := "parsec-rdl-gen (development version)"

if err == nil {
var schema rdl.Schema
err = json.Unmarshal(data, &schema)
if err == nil {
GenerateJavaClient(banner, &schema, *pOutdir, *namespace, "")
GenerateJavaClient(banner, &schema, *pOutdir, *namespace, "", isPcSuffix)
os.Exit(0)
}
}
fmt.Fprintf(os.Stderr, "*** %v\n", err)
os.Exit(1)
}

func checkErr(err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "*** %v\n", err)
os.Exit(1)
}
}

// GenerateJavaClient generates the client code to talk to the server
func GenerateJavaClient(banner string, schema *rdl.Schema, outdir string, ns string, base string) error {
func GenerateJavaClient(banner string, schema *rdl.Schema, outdir string, ns string, base string, isPcSuffix bool) error {

reg := rdl.NewTypeRegistry(schema)

Expand All @@ -64,7 +78,7 @@ func GenerateJavaClient(banner string, schema *rdl.Schema, outdir string, ns str
if err != nil {
return err
}
gen := &javaClientGenerator{reg, schema, cName, out, nil, banner, ns, base}
gen := &javaClientGenerator{reg, schema, cName, out, nil, banner, ns, base, isPcSuffix}
gen.processTemplate(javaClientTemplate)
out.Flush()
file.Close()
Expand All @@ -76,7 +90,7 @@ func GenerateJavaClient(banner string, schema *rdl.Schema, outdir string, ns str
if err != nil {
return err
}
gen = &javaClientGenerator{reg, schema, cName, out, nil, banner, ns, base}
gen = &javaClientGenerator{reg, schema, cName, out, nil, banner, ns, base, isPcSuffix}
gen.processTemplate(javaClientInterfaceTemplate)
out.Flush()
file.Close()
Expand Down Expand Up @@ -112,14 +126,14 @@ func (gen *javaClientGenerator) processTemplate(templateSource string) error {
return utils.FormatComment(s, 0, 80)
}
needExpectFunc := func(r *rdl.Resource) bool {
if (r.Expected != "OK" || len(r.Alternatives) > 0) {
if (r.Expected != "OK") || (len(r.Alternatives) > 0) {
return true
}
return false
}
needImportHashSetFunc := func(rs []*rdl.Resource) bool {
for _,r := range rs {
if (needExpectFunc(r)) {
if needExpectFunc(r) {
return true
}
}
Expand Down Expand Up @@ -154,7 +168,7 @@ func (gen *javaClientGenerator) processTemplate(templateSource string) error {
"builderExt": func(r *rdl.Resource) string { return gen.builderExt(r) },
"origPackage": func() string { return utils.JavaGenerationOrigPackage(gen.schema, gen.ns) },
"origHeader": func() string { return utils.JavaGenerationOrigHeader(gen.banner) },
"returnType": func(r *rdl.Resource) string { return utils.JavaType(gen.registry, r.Type, true, "", "")},
"returnType": func(r *rdl.Resource) string { return gen.javaType(gen.registry, r.Type, true, "", "")},
"needExpect": needExpectFunc,
"needImportHashSet": needImportHashSetFunc,
"needImportJsonProcessingException": needImportJsonProcessingExceptionFunc,
Expand Down Expand Up @@ -393,7 +407,7 @@ func safeTypeVarName(rtype rdl.TypeRef) rdl.TypeName {
}

// todo: duplicate with server code, need integrate
func javaMethodName(reg rdl.TypeRegistry, r *rdl.Resource, needParamWithType bool) (string, []string) {
func (gen *javaClientGenerator) javaMethodName(reg rdl.TypeRegistry, r *rdl.Resource, needParamWithType bool) (string, []string) {
var params []string
bodyType := string(safeTypeVarName(r.Type))
for _, v := range r.Inputs {
Expand All @@ -408,7 +422,7 @@ func javaMethodName(reg rdl.TypeRegistry, r *rdl.Resource, needParamWithType boo
}
optional := true
if (needParamWithType) {
params = append(params, utils.JavaType(reg, v.Type, optional, "", "") + " " + javaName(k))
params = append(params, gen.javaType(reg, v.Type, optional, "", "") + " " + javaName(k))
} else {
params = append(params, javaName(k))
}
Expand All @@ -432,9 +446,8 @@ func javaName(name rdl.Identifier) string {

func (gen *javaClientGenerator) clientMethodSignature(r *rdl.Resource, needHeader bool) string {
reg := gen.registry
returnType := utils.JavaType(reg, r.Type, true, "", "")
needParamWithType := true
methName, params := javaMethodName(reg, r, needParamWithType)
returnType := gen.javaType(reg, r.Type, true, "", "")
methName, params := gen.javaMethodName(reg, r, true)
sparams := ""
if (needHeader) {
sparams = "Map<String, List<String>> headers"
Expand All @@ -450,11 +463,14 @@ func (gen *javaClientGenerator) clientMethodSignature(r *rdl.Resource, needHeade

func (gen *javaClientGenerator) clientMethodOverloadContent(r *rdl.Resource) string {
reg := gen.registry
needParamWithType := false
methName, params := javaMethodName(reg, r, needParamWithType)
methName, params := gen.javaMethodName(reg, r, false)
paramsWithEmptyMap := "Collections.emptyMap()"
if len(params) > 0 {
paramsWithEmptyMap = paramsWithEmptyMap + ", " + strings.Join(params, ", ")
}
return "return " + methName + "(" + paramsWithEmptyMap + ");"
}

func (gen *javaClientGenerator) javaType(reg rdl.TypeRegistry, rdlType rdl.TypeRef, optional bool, items rdl.TypeRef, keys rdl.TypeRef) string {
return utils.JavaType(reg, rdlType, optional, items, keys, gen.isPcSuffix)
}
52 changes: 31 additions & 21 deletions cmd/rdl-gen-parsec-java-model/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ const (
ValidationGroupsKey = "groups"
ValidationGroupsClass = "ParsecValidationGroups"
ValidationGroupsRegexPattern = "(^|[ ,])" + ValidationGroupsKey + "\\s?="
JavaClassSuffix = utils.JavaParsecClassSuffix
)

var (
Expand All @@ -46,14 +47,15 @@ var BuildDate string
var validationGroups map[string]struct{}

type javaModelGenerator struct {
registry rdl.TypeRegistry
schema *rdl.Schema
name string
writer *bufio.Writer
err error
header []string
imports []string
body []string
registry rdl.TypeRegistry
schema *rdl.Schema
name string
writer *bufio.Writer
err error
header []string
imports []string
body []string
isPcSuffix bool
}

func main() {
Expand All @@ -67,7 +69,8 @@ func main() {

generateAnnotations, err := strconv.ParseBool(*generateAnnotationsString)
checkErr(err)
avoidClashing, err := strconv.ParseBool(*pc)
isPcSuffix, err := strconv.ParseBool(*pc)
checkErr(err)

var data []byte
if *dataFile != "" {
Expand All @@ -84,7 +87,7 @@ func main() {
var schema rdl.Schema
err = json.Unmarshal(data, &schema)
if err == nil {
GenerateJavaModel(banner, &schema, *pOutdir, generateAnnotations, *namespace, avoidClashing)
GenerateJavaModel(banner, &schema, *pOutdir, generateAnnotations, *namespace, isPcSuffix)
os.Exit(0)
}
}
Expand All @@ -100,15 +103,15 @@ func checkErr(err error) {
}

// GenerateJavaModel generates the model code for the types defined in the RDL schema.
func GenerateJavaModel(banner string, schema *rdl.Schema, outdir string, genAnnotations bool, namespace string, avoidClashing bool) error {
func GenerateJavaModel(banner string, schema *rdl.Schema, outdir string, genAnnotations bool, namespace string, isPcSuffix bool) error {
packageDir, err := utils.JavaGenerationDir(outdir, schema, namespace)
if err != nil {
return err
}
validationGroups = make(map[string]struct{}, 0)
registry := rdl.NewTypeRegistry(schema)
for _, t := range schema.Types {
err := generateJavaType(banner, schema, registry, packageDir, t, genAnnotations, namespace, avoidClashing)
err := generateJavaType(banner, schema, registry, packageDir, t, genAnnotations, namespace, isPcSuffix)
if err != nil {
return err
}
Expand All @@ -118,7 +121,7 @@ func GenerateJavaModel(banner string, schema *rdl.Schema, outdir string, genAnno
}

func generateJavaType(banner string, schema *rdl.Schema, registry rdl.TypeRegistry, outdir string, t *rdl.Type,
genAnnotations bool, namespace string, avoidClashing bool) error {
genAnnotations bool, namespace string, isPcSuffix bool) error {

tName, _, _ := rdl.TypeInfo(t)
bt := registry.BaseType(t)
Expand All @@ -132,8 +135,8 @@ func generateJavaType(banner string, schema *rdl.Schema, registry rdl.TypeRegist
return nil
}
cName := utils.Capitalize(string(tName))
if (avoidClashing) {
cName += "_Pc"
if isPcSuffix {
cName += JavaClassSuffix
}
out, file, _, err := utils.OutputWriter(outdir, cName, ".java")
if err != nil {
Expand All @@ -142,7 +145,7 @@ func generateJavaType(banner string, schema *rdl.Schema, registry rdl.TypeRegist
if file != nil {
defer file.Close()
}
gen := &javaModelGenerator{registry, schema, string(tName), out, nil, nil, nil, nil}
gen := &javaModelGenerator{registry, schema, string(tName), out, nil, nil, nil, nil, isPcSuffix}
gen.generateHeader(banner, namespace)
switch bt {
case rdl.BaseTypeStruct:
Expand Down Expand Up @@ -288,7 +291,7 @@ func (gen *javaModelGenerator) generateUnion(t *rdl.Type) {
gen.appendToBody(fmt.Sprintf("\t%s %sVariantTag\n", s, uName))
for _, v := range ut.Variants {
uV := utils.Capitalize(string(v))
vType := utils.JavaType(gen.registry, v, false, "", "")
vType := gen.javaType(gen.registry, v, false, "", "")
s := utils.LeftJustified(uV, maxKeyLen)
gen.appendToBody(fmt.Sprintf("\t%s *%s\n", s, vType))
}
Expand Down Expand Up @@ -530,11 +533,11 @@ func (gen *javaModelGenerator) generateArray(t *rdl.Type) {
case rdl.TypeVariantArrayTypeDef:
at := t.ArrayTypeDef
gen.generateTypeComment(t)
ftype := utils.JavaType(gen.registry, at.Type, false, at.Items, "")
ftype := gen.javaType(gen.registry, at.Type, false, at.Items, "")
gen.appendToBody(fmt.Sprintf("type %s %s\n\n", at.Name, ftype))
default:
tName, tType, _ := rdl.TypeInfo(t)
gtype := utils.JavaType(gen.registry, tType, false, "", "")
gtype := gen.javaType(gen.registry, tType, false, "", "")
gen.generateTypeComment(t)
gen.appendToBody(fmt.Sprintf("type %s %s\n\n", tName, gtype))
}
Expand Down Expand Up @@ -580,6 +583,9 @@ func (gen *javaModelGenerator) generateEnum(t *rdl.Type) {
}
et := t.EnumTypeDef
name := utils.Capitalize(string(et.Name))
if (gen.isPcSuffix) {
name += JavaClassSuffix
}
gen.appendToBody(fmt.Sprintf("public enum %s {", name))
for i, elem := range et.Elements {
sym := elem.Symbol
Expand Down Expand Up @@ -627,7 +633,7 @@ func (gen *javaModelGenerator) generateStructFields(fields []*rdl.StructFieldDef
fnames = append(fnames, fname)
optional := f.Optional

ftype := utils.JavaType(gen.registry, f.Type, optional, f.Items, f.Keys)
ftype := gen.javaType(gen.registry, f.Type, optional, f.Items, f.Keys)
ftypes = append(ftypes, ftype)

gen.appendToBody(" private ")
Expand Down Expand Up @@ -703,7 +709,7 @@ func (gen *javaModelGenerator) generateStructFieldType(rdlType rdl.TypeRef, opti
gen.generateStructFieldParamType(i, true, "", "")
gen.appendToBody(">")
default:
gen.appendToBody(utils.JavaType(gen.registry, rdlType, optional, items, keys))
gen.appendToBody(gen.javaType(gen.registry, rdlType, optional, items, keys))
}
}

Expand Down Expand Up @@ -895,6 +901,10 @@ func (gen *javaModelGenerator) getValidationGroupValue(annotationValue string) s
return strings.TrimRight(outputBuffer.String(), "\n ") + "\n "
}

func (gen *javaModelGenerator) javaType(reg rdl.TypeRegistry, rdlType rdl.TypeRef, optional bool, items rdl.TypeRef, keys rdl.TypeRef) string {
return utils.JavaType(reg, rdlType, optional, items, keys, gen.isPcSuffix)
}

func javaFieldName(n rdl.Identifier) string {
if n == "default" {
return "_default"
Expand Down
Loading

0 comments on commit 5b24f48

Please sign in to comment.