x/jni: New Syncbase API Changes.
-Re-enabling the JNI module for Syncbase.
-Removing the Batching and Conflict resolution
part of JNI. Batching is now done in Java and
Conflict resolution is disabled to be reimplemented
in Java.
MultiPart:2/3
Change-Id: Ie6be7cf9886a328e4620d18e3bf525def85cd2ec
diff --git a/impl/google/services/jni.go b/impl/google/services/jni.go
index 4ef77a1..0ea7dd8 100644
--- a/impl/google/services/jni.go
+++ b/impl/google/services/jni.go
@@ -9,8 +9,7 @@
import (
jgroups "v.io/x/jni/impl/google/services/groups"
jmounttable "v.io/x/jni/impl/google/services/mounttable"
- // See TODO below.
- //jsyncbase "v.io/x/jni/impl/google/services/syncbase"
+ jsyncbase "v.io/x/jni/impl/google/services/syncbase"
jutil "v.io/x/jni/util"
)
@@ -27,12 +26,9 @@
if err := jmounttable.Init(env); err != nil {
return err
}
- // TODO(sadovsky): Temporarily disable Syncbase Java code (as of 2016-03-28),
- // while we update the code to the simplified API.
- /*
- if err := jsyncbase.Init(env); err != nil {
- return err
- }
- */
+ if err := jsyncbase.Init(env); err != nil {
+ return err
+ }
+
return nil
}
diff --git a/v23/jni.go b/v23/jni.go
index f658aa6..671e6fe 100644
--- a/v23/jni.go
+++ b/v23/jni.go
@@ -14,8 +14,6 @@
jsecurity "v.io/x/jni/v23/security"
jaccess "v.io/x/jni/v23/security/access"
jgroups "v.io/x/jni/v23/services/groups"
- // See TODO below.
- //jsyncbase "v.io/x/jni/v23/syncbase"
)
// #include "jni.h"
@@ -43,12 +41,6 @@
if err := jgroups.Init(env); err != nil {
return err
}
- // TODO(sadovsky): Temporarily disable Syncbase Java code (as of 2016-03-28),
- // while we update the code to the simplified API.
- /*
- if err := jsyncbase.Init(env); err != nil {
- return err
- }
- */
+
return nil
}
diff --git a/v23/syncbase/jni.go b/v23/syncbase/jni.go
deleted file mode 100644
index 01d04f8..0000000
--- a/v23/syncbase/jni.go
+++ /dev/null
@@ -1,135 +0,0 @@
-// 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 syncbase
-
-import (
- "unsafe"
-
- wire "v.io/v23/services/syncbase"
- "v.io/v23/syncbase"
-
- jutil "v.io/x/jni/util"
- jcontext "v.io/x/jni/v23/context"
-)
-
-// #include "jni.h"
-import "C"
-
-var (
- // Global reference for io.v.v23.syncbase.DatabaseImpl class.
- jDatabaseImplClass jutil.Class
- // Global reference for io.v.v23.syncbase.Conflict class.
- jConflictClass jutil.Class
- // Global reference for io.v.v23.syncbase.Resolution class.
- jResolutionClass jutil.Class
- // Global reference for io.v.v23.services.syncbase.BatchOptions class.
- jBatchOptionsClass jutil.Class
- // Global reference for io.v.v23.services.syncbase.SchemaMetadata class.
- jSchemaMetadataClass jutil.Class
-)
-
-// Init initializes the JNI code with the given Java environment. This method
-// must be invoked before any other method in this package and must be called
-// from the main Java thread (e.g., On_Load()).
-func Init(env jutil.Env) error {
- var err error
- jDatabaseImplClass, err = jutil.JFindClass(env, "io/v/v23/syncbase/DatabaseImpl")
- if err != nil {
- return err
- }
- jConflictClass, err = jutil.JFindClass(env, "io/v/v23/syncbase/Conflict")
- if err != nil {
- return err
- }
- jResolutionClass, err = jutil.JFindClass(env, "io/v/v23/syncbase/Resolution")
- if err != nil {
- return err
- }
- jBatchOptionsClass, err = jutil.JFindClass(env, "io/v/v23/services/syncbase/BatchOptions")
- if err != nil {
- return err
- }
- jSchemaMetadataClass, err = jutil.JFindClass(env, "io/v/v23/services/syncbase/SchemaMetadata")
- if err != nil {
- return err
- }
- return nil
-}
-
-//export Java_io_v_v23_syncbase_DatabaseImpl_nativeCreate
-func Java_io_v_v23_syncbase_DatabaseImpl_nativeCreate(jenv *C.JNIEnv, jDatabaseImplClass C.jclass, jParentFullName C.jstring, jRelativeName C.jstring, jSchemaObj C.jobject) C.jobject {
- env := jutil.Env(uintptr(unsafe.Pointer(jenv)))
- parentFullName := jutil.GoString(env, jutil.Object(uintptr(unsafe.Pointer(jParentFullName))))
- relativeName := jutil.GoString(env, jutil.Object(uintptr(unsafe.Pointer(jRelativeName))))
- jSchema := jutil.Object(uintptr(unsafe.Pointer(jSchemaObj)))
- schema, err := GoSchema(env, jSchema)
- if err != nil {
- jutil.JThrowV(env, err)
- return nil
- }
- db := syncbase.NewDatabase(parentFullName, relativeName, schema)
- jdb := newJNIDatabase(env, db, parentFullName, schema, jSchema)
- jDatabase, err := javaDatabase(env, jdb)
- if err != nil {
- jutil.JThrowV(env, err)
- return nil
- }
- return C.jobject(unsafe.Pointer(jDatabase))
-}
-
-//export Java_io_v_v23_syncbase_DatabaseImpl_nativeBeginBatch
-func Java_io_v_v23_syncbase_DatabaseImpl_nativeBeginBatch(jenv *C.JNIEnv, jDatabaseImpl C.jobject, goRef C.jlong, jContext C.jobject, jBatchOptsObj C.jobject, jCallbackObj C.jobject) {
- env := jutil.Env(uintptr(unsafe.Pointer(jenv)))
- jCallback := jutil.Object(uintptr(unsafe.Pointer(jCallbackObj)))
- jBatchOpts := jutil.Object(uintptr(unsafe.Pointer(jBatchOptsObj)))
- jdb := (*jniDatabase)(jutil.GoRefValue(jutil.Ref(goRef)))
- var batchOpts wire.BatchOptions
- if err := jutil.GoVomCopy(env, jBatchOpts, jBatchOptionsClass, &batchOpts); err != nil {
- jutil.CallbackOnFailure(env, jCallback, err)
- return
- }
- ctx, _, err := jcontext.GoContext(env, jutil.Object(uintptr(unsafe.Pointer(jContext))))
- if err != nil {
- jutil.CallbackOnFailure(env, jCallback, err)
- return
- }
- jutil.DoAsyncCall(env, jCallback, func() (jutil.Object, error) {
- batchDB, err := jdb.BeginBatch(ctx, batchOpts)
- if err != nil {
- return jutil.NullObject, err
- }
- env, freeFunc := jutil.GetEnv()
- defer freeFunc()
- jBatchDB, err := javaBatchDatabase(env, batchDB, jdb.parentFullName, jdb.jSchema)
- if err != nil {
- return jutil.NullObject, err
- }
- // Must grab a global reference as we free up the env and all local references that come
- // along with it.
- return jutil.NewGlobalRef(env, jBatchDB), nil
- })
-}
-
-//export Java_io_v_v23_syncbase_DatabaseImpl_nativeEnforceSchema
-func Java_io_v_v23_syncbase_DatabaseImpl_nativeEnforceSchema(jenv *C.JNIEnv, jDatabaseImpl C.jobject, goRef C.jlong, jContext C.jobject, jCallbackObj C.jobject) {
- env := jutil.Env(uintptr(unsafe.Pointer(jenv)))
- jCallback := jutil.Object(uintptr(unsafe.Pointer(jCallbackObj)))
- jdb := (*jniDatabase)(jutil.GoRefValue(jutil.Ref(goRef)))
- ctx, _, err := jcontext.GoContext(env, jutil.Object(uintptr(unsafe.Pointer(jContext))))
- if err != nil {
- jutil.CallbackOnFailure(env, jCallback, err)
- return
- }
- jutil.DoAsyncCall(env, jCallback, func() (jutil.Object, error) {
- return jutil.NullObject, jdb.EnforceSchema(ctx)
- })
-}
-
-//export Java_io_v_v23_syncbase_DatabaseImpl_nativeFinalize
-func Java_io_v_v23_syncbase_DatabaseImpl_nativeFinalize(jenv *C.JNIEnv, jDatabaseImpl C.jobject, goRef C.jlong) {
- jutil.GoDecRef(jutil.Ref(goRef))
-}
diff --git a/v23/syncbase/resolver.go b/v23/syncbase/resolver.go
deleted file mode 100644
index 509341a..0000000
--- a/v23/syncbase/resolver.go
+++ /dev/null
@@ -1,67 +0,0 @@
-// 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 syncbase
-
-import (
- "runtime"
-
- "v.io/v23/context"
- "v.io/v23/syncbase"
-
- 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) syncbase.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 *syncbase.Conflict) syncbase.Resolution {
- env, freeFunc := jutil.GetEnv()
- defer freeFunc()
- jContext, err := jcontext.JavaContext(env, ctx, nil)
- 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.Conflict")
- resolutionSign := jutil.ClassSign("io.v.v23.syncbase.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 syncbase.Resolution
- if err := jutil.GoVomCopy(env, jResolution, jResolutionClass, &resolution); err != nil {
- panic("Couldn't create Go Resolution: " + err.Error())
- }
- return resolution
-}
diff --git a/v23/syncbase/util.go b/v23/syncbase/util.go
deleted file mode 100644
index d8ff179..0000000
--- a/v23/syncbase/util.go
+++ /dev/null
@@ -1,85 +0,0 @@
-// 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 syncbase
-
-import (
- "runtime"
-
- wire "v.io/v23/services/syncbase"
- "v.io/v23/syncbase"
-
- jutil "v.io/x/jni/util"
-)
-
-type jniDatabase struct {
- syncbase.Database
- parentFullName string
- schema *syncbase.Schema
- jSchema jutil.Object
-}
-
-func newJNIDatabase(env jutil.Env, db syncbase.Database, parentFullName string, schema *syncbase.Schema, jSchema jutil.Object) *jniDatabase {
- // Reference Java schema; it will be de-referenced when the Go database
- // created below is garbage-collected (through the finalizer callback we
- // setup just below).
- jSchema = jutil.NewGlobalRef(env, jSchema)
- jdb := &jniDatabase{
- Database: db,
- parentFullName: parentFullName,
- schema: schema,
- jSchema: jSchema,
- }
- runtime.SetFinalizer(jdb, func(jdb *jniDatabase) {
- env, freeFunc := jutil.GetEnv()
- defer freeFunc()
- jutil.DeleteGlobalRef(env, jdb.jSchema)
- })
- return jdb
-}
-
-func javaDatabase(env jutil.Env, jdb *jniDatabase) (jutil.Object, error) {
- schemaSign := jutil.ClassSign("io.v.v23.syncbase.Schema")
- ref := jutil.GoNewRef(jdb) // Un-refed when jDatabase is finalized
- jDatabase, err := jutil.NewObject(env, jDatabaseImplClass, []jutil.Sign{jutil.LongSign, jutil.StringSign, jutil.StringSign, jutil.StringSign, schemaSign}, int64(ref), jdb.parentFullName, jdb.FullName(), jdb.Name(), jdb.jSchema)
- if err != nil {
- jutil.GoDecRef(ref)
- return jutil.NullObject, err
- }
- return jDatabase, nil
-}
-
-func javaBatchDatabase(env jutil.Env, batchDB syncbase.BatchDatabase, parentFullName string, jSchema jutil.Object) (jutil.Object, error) {
- schemaSign := jutil.ClassSign("io.v.v23.syncbase.Schema")
- return jutil.NewObject(env, jDatabaseImplClass, []jutil.Sign{jutil.LongSign, jutil.StringSign, jutil.StringSign, jutil.StringSign, schemaSign}, 0, parentFullName, batchDB.FullName(), batchDB.Name(), jSchema)
-}
-
-// GoSchema converts the provided Java Schema object into a Go syncbase.Schema
-// type.
-func GoSchema(env jutil.Env, jSchema jutil.Object) (*syncbase.Schema, error) {
- if jSchema.IsNull() {
- return nil, nil
- }
- metadataSign := jutil.ClassSign("io.v.v23.services.syncbase.SchemaMetadata")
- jMetadata, err := jutil.CallObjectMethod(env, jSchema, "getMetadata", nil, metadataSign)
- if err != nil {
- return nil, err
- }
- var metadata wire.SchemaMetadata
- if err := jutil.GoVomCopy(env, jMetadata, jSchemaMetadataClass, &metadata); err != nil {
- return nil, err
- }
- resolverSign := jutil.ClassSign("io.v.v23.syncbase.ConflictResolver")
- jResolver, err := jutil.CallObjectMethod(env, jSchema, "getResolver", nil, resolverSign)
- if err != nil {
- return nil, err
- }
- resolver := GoResolver(env, jResolver)
- return &syncbase.Schema{
- Metadata: metadata,
- Resolver: resolver,
- }, nil
-}