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
-}