blob: e40a9e814edf05c9e55c47086bf2d0a55629b7ed [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build java android
package nosql
import (
"runtime"
"v.io/v23/context"
"v.io/v23/syncbase/nosql"
jutil "v.io/x/jni/util"
jcontext "v.io/x/jni/v23/context"
)
// GoResolver converts a provided Java ConflictResolver into a Go ConflictResolver.
func GoResolver(env jutil.Env, jResolver jutil.Object) nosql.ConflictResolver {
if jResolver.IsNull() {
return nil
}
// Reference Java resolver; it will be de-referenced when the Go resolver
// created below is garbage-collected (through the finalizer callback we
// setup just below).
jResolver = jutil.NewGlobalRef(env, jResolver)
resolver := &jniResolver{
jResolver: jResolver,
}
runtime.SetFinalizer(resolver, func(r *jniResolver) {
env, freeFunc := jutil.GetEnv()
defer freeFunc()
jutil.DeleteGlobalRef(env, r.jResolver)
})
return resolver
}
type jniResolver struct {
jResolver jutil.Object
}
func (r *jniResolver) OnConflict(ctx *context.T, conflict *nosql.Conflict) nosql.Resolution {
env, freeFunc := jutil.GetEnv()
defer freeFunc()
jContext, err := jcontext.JavaContext(env, ctx)
if err != nil {
panic("Couldn't create Java context: " + err.Error())
}
jConflict, err := jutil.JVomCopy(env, *conflict, jConflictClass)
if err != nil {
panic("Couldn't create Java Conflict object: " + err.Error())
}
contextSign := jutil.ClassSign("io.v.v23.context.VContext")
conflictSign := jutil.ClassSign("io.v.v23.syncbase.nosql.Conflict")
resolutionSign := jutil.ClassSign("io.v.v23.syncbase.nosql.Resolution")
jResolution, err := jutil.CallObjectMethod(env, r.jResolver, "onConflict", []jutil.Sign{contextSign, conflictSign}, resolutionSign, jContext, jConflict)
if err != nil {
panic("Error invoking Java ConflictResolver: " + err.Error())
}
var resolution nosql.Resolution
if err := jutil.GoVomCopy(env, jResolution, jResolutionClass, &resolution); err != nil {
panic("Couldn't create Go Resolution: " + err.Error())
}
return resolution
}