// GoBlessingStore creates an instance of security.BlessingStore that uses the // provided Java BlessingStore as its underlying implementation. func GoBlessingStore(env jutil.Env, jBlessingStore jutil.Object) (security.BlessingStore, error) { if jBlessingStore.IsNull() { return nil, nil } if jutil.IsInstanceOf(env, jBlessingStore, jBlessingStoreImplClass) { // Called with our implementation of BlessingStore, which maintains a Go reference - use it. ref, err := jutil.JLongField(env, jBlessingStore, "nativeRef") if err != nil { return nil, err } return (*(*security.BlessingStore)(jutil.GoRefValue(jutil.Ref(ref)))), nil } // Reference Java BlessingStore; it will be de-referenced when the Go // BlessingStore created below is garbage-collected (through the finalizer // callback we setup just below). jBlessingStore = jutil.NewGlobalRef(env, jBlessingStore) s := &blessingStore{ jBlessingStore: jBlessingStore, } runtime.SetFinalizer(s, func(s *blessingStore) { env, freeFunc := jutil.GetEnv() defer freeFunc() jutil.DeleteGlobalRef(env, s.jBlessingStore) }) return s, nil }
// GoAuthorizer converts the given Java authorizer into a Go authorizer. func GoAuthorizer(env jutil.Env, jAuth jutil.Object) (security.Authorizer, error) { if jAuth.IsNull() { return nil, nil } if jutil.IsInstanceOf(env, jAuth, jPermissionsAuthorizerClass) { // Called with our implementation of Authorizer, which maintains a Go reference - use it. ref, err := jutil.JLongField(env, jAuth, "nativeRef") if err != nil { return nil, err } return *(*security.Authorizer)(jutil.GoRefValue(jutil.Ref(ref))), nil } // Reference Java dispatcher; it will be de-referenced when the go // dispatcher created below is garbage-collected (through the finalizer // callback we setup below). jAuth = jutil.NewGlobalRef(env, jAuth) a := &authorizer{ jAuth: jAuth, } runtime.SetFinalizer(a, func(a *authorizer) { env, freeFunc := jutil.GetEnv() defer freeFunc() jutil.DeleteGlobalRef(env, a.jAuth) }) return a, nil }