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()
 }