func GoRpcServerOpts(env jutil.Env, obj jutil.Object) ([]rpc.ServerOpt, error) { var opts []rpc.ServerOpt if opt, err := jutil.JBoolField(env, obj, "servesMountTable"); err != nil { return nil, err } else { opts = append(opts, options.ServesMountTable(opt)) } if opt, err := getDuration(env, obj, "lameDuckTimeout"); err != nil { return nil, err } else if opt != nil { opts = append(opts, options.LameDuckTimeout(*opt)) } if opt, err := jutil.JBoolField(env, obj, "isLeaf"); err != nil { return nil, err } else { opts = append(opts, options.IsLeaf(opt)) } if opt, err := getDuration(env, obj, "channelTimeout"); err != nil { return nil, err } else if opt != nil { opts = append(opts, options.ChannelTimeout(*opt)) } return opts, nil }
//export Java_io_v_impl_google_services_mounttable_MountTableServer_nativeWithNewServer func Java_io_v_impl_google_services_mounttable_MountTableServer_nativeWithNewServer(jenv *C.JNIEnv, jMountTableServerClass C.jclass, jContext C.jobject, jMountTableServerParams C.jobject) C.jobject { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) jCtx := jutil.Object(uintptr(unsafe.Pointer(jContext))) jParams := jutil.Object(uintptr(unsafe.Pointer(jMountTableServerParams))) // Read and translate all of the server params. mountName, err := jutil.CallStringMethod(env, jParams, "getName", nil) if err != nil { jutil.JThrowV(env, err) return nil } rootDir, err := jutil.CallStringMethod(env, jParams, "getStorageRootDir", nil) if err != nil { jutil.JThrowV(env, err) return nil } permsJMap, err := jutil.CallMapMethod(env, jParams, "getPermissions", nil) if err != nil { jutil.JThrowV(env, err) return nil } permsMap := make(map[string]access.Permissions) for jPath, jPerms := range permsJMap { path := jutil.GoString(env, jPath) perms, err := jaccess.GoPermissions(env, jPerms) if err != nil { jutil.JThrowV(env, err) return nil } permsMap[path] = perms } // Write JSON-encoded permissions to a file. jsonPerms, err := json.Marshal(permsMap) if err != nil { jutil.JThrowV(env, fmt.Errorf("Couldn't JSON-encode path-permissions: %v", err)) return nil } permsFile, err := ioutil.TempFile(rootDir, "jni_permissions") if err != nil { jutil.JThrowV(env, fmt.Errorf("Couldn't create permissions file: %v", err)) return nil } w := bufio.NewWriter(permsFile) if _, err := w.Write(jsonPerms); err != nil { jutil.JThrowV(env, fmt.Errorf("Couldn't write to permissions file: %v", err)) return nil } if err := w.Flush(); err != nil { jutil.JThrowV(env, fmt.Errorf("Couldn't flush to permissions file: %v", err)) } statsPrefix, err := jutil.CallStringMethod(env, jParams, "getStatsPrefix", nil) if err != nil { jutil.JThrowV(env, err) return nil } // Start the mounttable server. ctx, cancel, err := jcontext.GoContext(env, jCtx) if err != nil { jutil.JThrowV(env, err) return nil } d, err := mounttablelib.NewMountTableDispatcher(ctx, permsFile.Name(), rootDir, statsPrefix) if err != nil { jutil.JThrowV(env, err) return nil } newCtx, s, err := v23.WithNewDispatchingServer(ctx, mountName, d, options.ServesMountTable(true)) if err != nil { jutil.JThrowV(env, err) return nil } jNewCtx, err := jcontext.JavaContext(env, newCtx, cancel) if err != nil { jutil.JThrowV(env, err) return nil } jServer, err := jrpc.JavaServer(env, s) if err != nil { jutil.JThrowV(env, err) return nil } // Attach a server to the new context. jServerAttCtx, err := jutil.CallStaticObjectMethod(env, jVRuntimeImplClass, "withServer", []jutil.Sign{contextSign, serverSign}, contextSign, jNewCtx, jServer) if err != nil { jutil.JThrowV(env, err) return nil } return C.jobject(unsafe.Pointer(jServerAttCtx)) }