jni: Add flow manager ListenStatus.

MultiPart: 2/4
Change-Id: I4878bff4e9c3a0ccdad0894684ef32c852f3bfec
diff --git a/impl/google/rpc/util.go b/impl/google/rpc/util.go
index a7c7ead..b87812a 100644
--- a/impl/google/rpc/util.go
+++ b/impl/google/rpc/util.go
@@ -122,23 +122,39 @@
 		eps[i] = ep.String()
 	}
 
-	// Create Java array of proxies.
-	proxarr := make([]jutil.Object, len(status.Proxies))
-	for i, proxy := range status.Proxies {
-		var err error
-		if proxarr[i], err = JavaProxyStatus(env, proxy); err != nil {
+	lnErrors := make(map[jutil.Object]jutil.Object)
+	for addr, lerr := range status.ListenErrors {
+		jAddr, err := JavaListenAddr(env, addr.Protocol, addr.Address)
+		if err != nil {
 			return jutil.NullObject, err
 		}
+		jVExp, err := jutil.JVException(env, lerr)
+		if err != nil {
+			return jutil.NullObject, err
+		}
+		lnErrors[jAddr] = jVExp
 	}
-	jProxies, err := jutil.JObjectArray(env, proxarr, jProxyStatusClass)
+	jLnErrors, err := jutil.JObjectMap(env, lnErrors)
+	if err != nil {
+		return jutil.NullObject, err
+	}
+
+	proxyErrors := make(map[jutil.Object]jutil.Object)
+	for s, perr := range status.ProxyErrors {
+		jVExp, err := jutil.JVException(env, perr)
+		if err != nil {
+			return jutil.NullObject, err
+		}
+		proxyErrors[jutil.JString(env, s)] = jVExp
+	}
+	jProxyErrors, err := jutil.JObjectMap(env, proxyErrors)
 	if err != nil {
 		return jutil.NullObject, err
 	}
 
 	// Create final server status.
 	mountStatusSign := jutil.ClassSign("io.v.v23.rpc.MountStatus")
-	proxyStatusSign := jutil.ClassSign("io.v.v23.rpc.ProxyStatus")
-	jServerStatus, err := jutil.NewObject(env, jServerStatusClass, []jutil.Sign{serverStateSign, jutil.BoolSign, jutil.ArraySign(mountStatusSign), jutil.ArraySign(jutil.StringSign), jutil.ArraySign(proxyStatusSign)}, jState, status.ServesMountTable, jMounts, eps, jProxies)
+	jServerStatus, err := jutil.NewObject(env, jServerStatusClass, []jutil.Sign{serverStateSign, jutil.BoolSign, jutil.ArraySign(mountStatusSign), jutil.ArraySign(jutil.StringSign), jutil.MapSign, jutil.MapSign}, jState, status.ServesMountTable, jMounts, eps, jLnErrors, jProxyErrors)
 	if err != nil {
 		return jutil.NullObject, err
 	}
@@ -176,16 +192,6 @@
 	return jStatus, nil
 }
 
-// JavaProxyStatus converts the provided rpc.ProxyStatus value into a Java
-// ProxyStatus object.
-func JavaProxyStatus(env jutil.Env, status rpc.ProxyStatus) (jutil.Object, error) {
-	jStatus, err := jutil.NewObject(env, jProxyStatusClass, []jutil.Sign{jutil.StringSign, jutil.StringSign, jutil.VExceptionSign}, status.Proxy, status.Endpoint.String(), status.Error)
-	if err != nil {
-		return jutil.NullObject, err
-	}
-	return jStatus, nil
-}
-
 // GoListenSpec converts the provided Java ListenSpec into a Go ListenSpec.
 func GoListenSpec(env jutil.Env, jSpec jutil.Object) (rpc.ListenSpec, error) {
 	jAddrs, err := jutil.CallObjectMethod(env, jSpec, "getAddresses", nil, jutil.ArraySign(listenAddrSign))
@@ -230,13 +236,17 @@
 	return jSpec, nil
 }
 
+func JavaListenAddr(env jutil.Env, protocol, address string) (jutil.Object, error) {
+	return jutil.NewObject(env, jListenSpecAddressClass, []jutil.Sign{jutil.StringSign, jutil.StringSign}, protocol, address)
+}
+
 // JavaListenAddrArray converts Go rpc.ListenAddrs into a Java
 // ListenSpec$Address array.
 func JavaListenAddrArray(env jutil.Env, addrs rpc.ListenAddrs) (jutil.Object, error) {
 	addrarr := make([]jutil.Object, len(addrs))
 	for i, addr := range addrs {
 		var err error
-		if addrarr[i], err = jutil.NewObject(env, jListenSpecAddressClass, []jutil.Sign{jutil.StringSign, jutil.StringSign}, addr.Protocol, addr.Address); err != nil {
+		if addrarr[i], err = JavaListenAddr(env, addr.Protocol, addr.Address); err != nil {
 			return jutil.NullObject, err
 		}
 	}