func (i *invoker) Prepare(ctx *context.T, method string, numArgs int) (argptrs []interface{}, tags []*vdl.Value, err error) { env, freeFunc := jutil.GetEnv() jContext, err := jcontext.JavaContext(env, ctx, nil) if err != nil { freeFunc() return nil, nil, err } // Have all input arguments be decoded into *vdl.Value. argptrs = make([]interface{}, numArgs) for i := 0; i < numArgs; i++ { value := new(vdl.Value) argptrs[i] = &value } // This method will invoke the freeFunc(). jVomTags, err := jutil.CallStaticFutureMethod(env, freeFunc, jServerRPCHelperClass, "prepare", []jutil.Sign{invokerSign, contextSign, jutil.StringSign}, i.jInvoker, jContext, jutil.CamelCase(method)) if err != nil { return nil, nil, err } env, freeFunc = jutil.GetEnv() defer freeFunc() defer jutil.DeleteGlobalRef(env, jVomTags) vomTags, err := jutil.GoByteArrayArray(env, jVomTags) if err != nil { return nil, nil, err } tags = make([]*vdl.Value, len(vomTags)) for i, vomTag := range vomTags { var err error if tags[i], err = jutil.VomDecodeToValue(vomTag); err != nil { return nil, nil, err } } return }
func (i *invoker) Invoke(ctx *context.T, call rpc.StreamServerCall, method string, argptrs []interface{}) (results []interface{}, err error) { env, freeFunc := jutil.GetEnv() jContext, err := jcontext.JavaContext(env, ctx, nil) if err != nil { freeFunc() return nil, err } jStreamServerCall, err := javaStreamServerCall(env, jContext, call) if err != nil { freeFunc() return nil, err } vomArgs := make([][]byte, len(argptrs)) for i, argptr := range argptrs { arg := interface{}(jutil.DerefOrDie(argptr)) var err error if vomArgs[i], err = vom.Encode(arg); err != nil { freeFunc() return nil, err } } // This method will invoke the freeFunc(). jResult, err := jutil.CallStaticFutureMethod(env, freeFunc, jServerRPCHelperClass, "invoke", []jutil.Sign{invokerSign, contextSign, streamServerCallSign, jutil.StringSign, jutil.ArraySign(jutil.ArraySign(jutil.ByteSign))}, i.jInvoker, jContext, jStreamServerCall, jutil.CamelCase(method), vomArgs) if err != nil { return nil, err } env, freeFunc = jutil.GetEnv() defer freeFunc() defer jutil.DeleteGlobalRef(env, jResult) vomResults, err := jutil.GoByteArrayArray(env, jResult) if err != nil { return nil, err } results = make([]interface{}, len(vomResults)) for i, vomResult := range vomResults { var err error if results[i], err = jutil.VomDecodeToValue(vomResult); err != nil { return nil, err } } return results, nil }
func (j javaGlobber) Glob__(ctx *context.T, call rpc.GlobServerCall, g *glob.Glob) error { // TODO(sjr,rthellend): Update the Java API to match the new GO API. env, freeFunc := jutil.GetEnv() jContext, err := jcontext.JavaContext(env, ctx, nil) if err != nil { freeFunc() return err } jServerCall, err := JavaServerCall(env, call) if err != nil { freeFunc() return err } convert := func(input jutil.Object) (interface{}, error) { env, freeFunc := jutil.GetEnv() defer freeFunc() var reply naming.GlobReply if err := jutil.GoVomCopy(env, input, jGlobReplyClass, &reply); err != nil { return nil, err } return reply, nil } send := func(item interface{}) error { reply, ok := item.(naming.GlobReply) if !ok { return fmt.Errorf("Expected item of type naming.GlobReply, got: %T", reply) } return call.SendStream().Send(reply) } close := func() error { return nil } jOutputChannel, err := jchannel.JavaOutputChannel(env, ctx, nil, convert, send, close) if err != nil { freeFunc() return err } channelSign := jutil.ClassSign("io.v.v23.OutputChannel") // This method will invoke the freeFunc(). _, err = jutil.CallStaticFutureMethod(env, freeFunc, jServerRPCHelperClass, "glob", []jutil.Sign{invokerSign, contextSign, serverCallSign, jutil.StringSign, channelSign}, j.i.jInvoker, jContext, jServerCall, g.String(), jOutputChannel) return err }