v.io/x/ref/vdl/codegen/java: vdl changes for the Java invoker interface
Simplifies the multi-return case.
Change-Id: I1d990e9b63b10d5740e1164dc22f50263b01b150
diff --git a/lib/vdl/codegen/java/file_client_interface.go b/lib/vdl/codegen/java/file_client_interface.go
index db4366f..ffc17c8 100644
--- a/lib/vdl/codegen/java/file_client_interface.go
+++ b/lib/vdl/codegen/java/file_client_interface.go
@@ -23,6 +23,7 @@
{{ range $method := .Methods }}
{{/* If this method has multiple return arguments, generate the class. */}}
{{ if $method.IsMultipleRet }}
+ @io.v.v23.vdl.MultiReturn
public static class {{ $method.UppercaseMethodName }}Out {
{{ range $retArg := $method.RetArgs }}
public {{ $retArg.Type }} {{ $retArg.Name }};
@@ -47,8 +48,8 @@
AccessModifier string
Args string
Doc string
- IsMultipleRet bool
Name string
+ IsMultipleRet bool
RetArgs []clientInterfaceArg
RetType string
UppercaseMethodName string
@@ -66,8 +67,8 @@
}
}
-func clientInterfaceOutArg(iface *compile.Interface, method *compile.Method, isService bool, env *compile.Env) string {
- if isStreamingMethod(method) && !isService {
+func clientInterfaceOutArg(iface *compile.Interface, method *compile.Method, env *compile.Env) string {
+ if isStreamingMethod(method) {
return fmt.Sprintf("io.v.v23.vdl.ClientStream<%s, %s, %s>", javaType(method.InStream, true, env), javaType(method.OutStream, true, env), clientInterfaceNonStreamingOutArg(iface, method, true, env))
}
return clientInterfaceNonStreamingOutArg(iface, method, false, env)
@@ -87,10 +88,10 @@
AccessModifier: accessModifierForName(method.Name),
Args: javaDeclarationArgStr(method.InArgs, env, true),
Doc: method.Doc,
- IsMultipleRet: len(retArgs) > 1,
Name: vdlutil.FirstRuneToLower(method.Name),
+ IsMultipleRet: len(retArgs) > 1,
RetArgs: retArgs,
- RetType: clientInterfaceOutArg(iface, method, false, env),
+ RetType: clientInterfaceOutArg(iface, method, env),
UppercaseMethodName: method.Name,
}
}
diff --git a/lib/vdl/codegen/java/file_client_stub.go b/lib/vdl/codegen/java/file_client_stub.go
index 4f8c3dc..fd28e07 100644
--- a/lib/vdl/codegen/java/file_client_stub.go
+++ b/lib/vdl/codegen/java/file_client_stub.go
@@ -43,24 +43,6 @@
}
- // Methods from interface UniversalServiceMethods.
- @Override
- public io.v.v23.vdlroot.signature.Interface getSignature(io.v.v23.context.VContext context) throws io.v.v23.verror.VException {
- return getSignature(context, null);
- }
- @Override
- public io.v.v23.vdlroot.signature.Interface getSignature(io.v.v23.context.VContext context, io.v.v23.Options vOpts) throws io.v.v23.verror.VException {
- // Start the call.
- final io.v.v23.rpc.Client.Call _call = getClient(context).startCall(context, this.vName, "signature", new java.lang.Object[0], new java.lang.reflect.Type[0], vOpts);
-
- // Finish the call.
- final java.lang.reflect.Type[] _resultTypes = new java.lang.reflect.Type[]{
- new com.google.common.reflect.TypeToken<io.v.v23.vdlroot.signature.Interface>() {}.getType(),
- };
- final java.lang.Object[] _results = _call.finish(_resultTypes);
- return (io.v.v23.vdlroot.signature.Interface)_results[0];
- }
-
// Methods from interface {{ .ServiceName }}Client.
{{/* Iterate over methods defined directly in the body of this service */}}
{{ range $method := .Methods }}
@@ -218,7 +200,7 @@
NotStreaming: !isStreamingMethod(method),
OutArgs: outArgs,
RecvType: javaType(method.OutStream, true, env),
- RetType: clientInterfaceOutArg(iface, method, false, env),
+ RetType: clientInterfaceOutArg(iface, method, env),
Returns: len(method.OutArgs) >= 1 || isStreamingMethod(method),
SendType: javaType(method.InStream, true, env),
ServiceName: vdlutil.FirstRuneToUpper(iface.Name),
@@ -232,7 +214,7 @@
DeclarationArgs: javaDeclarationArgStr(embedMethod.InArgs, env, true),
LocalStubVarName: vdlutil.FirstRuneToLower(iface.Name) + "ClientStub",
Name: vdlutil.FirstRuneToLower(embedMethod.Name),
- RetType: clientInterfaceOutArg(iface, embedMethod, false, env),
+ RetType: clientInterfaceOutArg(iface, embedMethod, env),
Returns: len(embedMethod.OutArgs) >= 1 || isStreamingMethod(embedMethod),
}
}
diff --git a/lib/vdl/codegen/java/file_server_interface.go b/lib/vdl/codegen/java/file_server_interface.go
index 947fa66..d3d8891 100644
--- a/lib/vdl/codegen/java/file_server_interface.go
+++ b/lib/vdl/codegen/java/file_server_interface.go
@@ -24,6 +24,16 @@
)
{{ .AccessModifier }} interface {{ .ServiceName }}Server {{ .Extends }} {
{{ range $method := .Methods }}
+ {{/* If this method has multiple return arguments, generate the class. */}}
+ {{ if $method.IsMultipleRet }}
+ @io.v.v23.vdl.MultiReturn
+ public static class {{ $method.UppercaseMethodName }}Out {
+ {{ range $retArg := $method.RetArgs }}
+ public {{ $retArg.Type }} {{ $retArg.Name }};
+ {{ end }}
+ }
+ {{ end }}
+
{{/* Generate the method signature. */}}
{{ $method.Doc }}
{{ $method.AccessModifier }} {{ $method.RetType }} {{ $method.Name }}(final io.v.v23.context.VContext ctx, final io.v.v23.rpc.ServerCall call{{ $method.Args }}) throws io.v.v23.verror.VException;
@@ -31,23 +41,31 @@
}
`
-func serverInterfaceOutArg(method *compile.Method, iface *compile.Interface, env *compile.Env) string {
+func serverInterfaceOutArg(iface *compile.Interface, method *compile.Method, env *compile.Env) string {
switch len(method.OutArgs) {
case 0:
return "void"
case 1:
return javaType(method.OutArgs[0].Type, false, env)
default:
- return javaPath(path.Join(interfaceFullyQualifiedName(iface)+"Client", method.Name+"Out"))
+ return javaPath(path.Join(interfaceFullyQualifiedName(iface)+"Server", method.Name+"Out"))
}
}
+type serverInterfaceArg struct {
+ Type string
+ Name string
+}
+
type serverInterfaceMethod struct {
- AccessModifier string
- Args string
- Doc string
- Name string
- RetType string
+ AccessModifier string
+ Args string
+ Doc string
+ Name string
+ IsMultipleRet bool
+ RetArgs []serverInterfaceArg
+ RetType string
+ UppercaseMethodName string
}
func processServerInterfaceMethod(method *compile.Method, iface *compile.Interface, env *compile.Env) serverInterfaceMethod {
@@ -55,12 +73,25 @@
if isStreamingMethod(method) {
args += fmt.Sprintf(", io.v.v23.vdl.Stream<%s, %s> stream", javaType(method.OutStream, true, env), javaType(method.InStream, true, env))
}
+ retArgs := make([]serverInterfaceArg, len(method.OutArgs))
+ for i := 0; i < len(method.OutArgs); i++ {
+ if method.OutArgs[i].Name != "" {
+ retArgs[i].Name = vdlutil.FirstRuneToLower(method.OutArgs[i].Name)
+ } else {
+ retArgs[i].Name = fmt.Sprintf("ret%d", i+1)
+ }
+ retArgs[i].Type = javaType(method.OutArgs[i].Type, false, env)
+ }
+
return serverInterfaceMethod{
- AccessModifier: accessModifierForName(method.Name),
- Args: args,
- Doc: method.Doc,
- Name: vdlutil.FirstRuneToLower(method.Name),
- RetType: serverInterfaceOutArg(method, iface, env),
+ AccessModifier: accessModifierForName(method.Name),
+ Args: args,
+ Doc: method.Doc,
+ Name: vdlutil.FirstRuneToLower(method.Name),
+ IsMultipleRet: len(retArgs) > 1,
+ RetArgs: retArgs,
+ RetType: serverInterfaceOutArg(iface, method, env),
+ UppercaseMethodName: method.Name,
}
}
diff --git a/lib/vdl/codegen/java/file_server_wrapper.go b/lib/vdl/codegen/java/file_server_wrapper.go
index d7b69f9..5043d6d 100644
--- a/lib/vdl/codegen/java/file_server_wrapper.go
+++ b/lib/vdl/codegen/java/file_server_wrapper.go
@@ -39,7 +39,7 @@
/**
* Returns a description of this server.
*/
- public io.v.v23.vdlroot.signature.Interface signature(final io.v.v23.context.VContext ctx, final io.v.v23.rpc.ServerCall call) throws io.v.v23.verror.VException {
+ public io.v.v23.vdlroot.signature.Interface signature() {
java.util.List<io.v.v23.vdlroot.signature.Embed> embeds = new java.util.ArrayList<io.v.v23.vdlroot.signature.Embed>();
java.util.List<io.v.v23.vdlroot.signature.Method> methods = new java.util.ArrayList<io.v.v23.vdlroot.signature.Method>();
{{ range $method := .Methods }}
@@ -75,7 +75,7 @@
* by this server.
*/
@SuppressWarnings("unused")
- public io.v.v23.vdl.VdlValue[] getMethodTags(final io.v.v23.rpc.StreamServerCall call, final java.lang.String method) throws io.v.v23.verror.VException {
+ public io.v.v23.vdl.VdlValue[] getMethodTags(final java.lang.String method) throws io.v.v23.verror.VException {
{{ range $methodName, $tags := .MethodTags }}
if ("{{ $methodName }}".equals(method)) {
try {
@@ -89,7 +89,7 @@
{{ end }}
{{ range $embed := .Embeds }}
{
- final io.v.v23.vdl.VdlValue[] tags = this.{{ $embed.LocalWrapperVarName }}.getMethodTags(call, method);
+ final io.v.v23.vdl.VdlValue[] tags = this.{{ $embed.LocalWrapperVarName }}.getMethodTags(method);
if (tags != null) {
return tags;
}
@@ -195,7 +195,7 @@
IsStreaming: isStreamingMethod(method),
Name: vdlutil.FirstRuneToLower(method.Name),
RecvType: javaType(method.InStream, true, env),
- RetType: clientInterfaceOutArg(iface, method, true, env),
+ RetType: serverInterfaceOutArg(iface, method, env),
RetJavaTypes: retArgTypes,
Returns: len(method.OutArgs) >= 1,
SendType: javaType(method.OutStream, true, env),
@@ -211,7 +211,7 @@
DeclarationArgs: javaDeclarationArgStr(embedMethod.InArgs, env, true),
LocalWrapperVarName: vdlutil.FirstRuneToLower(iface.Name) + "Wrapper",
Name: vdlutil.FirstRuneToLower(embedMethod.Name),
- RetType: clientInterfaceOutArg(iface, embedMethod, true, env),
+ RetType: serverInterfaceOutArg(iface, embedMethod, env),
Returns: len(embedMethod.OutArgs) >= 1,
}
}
@@ -227,9 +227,6 @@
})
}
methodTags := make(map[string][]methodTag)
- // Add generated methods to the tag map:
- methodTags["signature"] = []methodTag{}
- methodTags["getMethodTags"] = []methodTag{}
// Copy method tags off of the interface.
methods := make([]serverWrapperMethod, len(iface.Methods))
for i, method := range iface.Methods {
diff --git a/lib/vdl/codegen/java/util_interface.go b/lib/vdl/codegen/java/util_interface.go
index 73bc317..9a35327 100644
--- a/lib/vdl/codegen/java/util_interface.go
+++ b/lib/vdl/codegen/java/util_interface.go
@@ -38,14 +38,18 @@
// javaClientExtendsStr creates an extends clause for a client interface
// e.g. "extends com.a.B, com.d.E"
func javaClientExtendsStr(embeds []*compile.Interface) string {
+ if len(embeds) == 0 {
+ return ""
+ }
var buf bytes.Buffer
buf.WriteString("extends ")
- for _, embed := range embeds {
+ for i, embed := range embeds {
+ if i > 0 {
+ buf.WriteString(", ")
+ }
buf.WriteString(javaPath(interfaceFullyQualifiedName(embed)))
buf.WriteString("Client")
- buf.WriteString(", ")
}
- buf.WriteString("io.v.v23.rpc.UniversalServiceMethods")
return buf.String()
}