java: Implement 6 more JNI syncbase internal functions

The functions added in this CL are:

  Service.GetPermissions
  Service.SetPermissions
  Database.GetPermissions
  Database.SetPermissions
  Collection.GetPermissions
  Collection.SetPermissions

This CL also makes the newVBytesFromJava more resilient (works when a
nil is passed in) and reorders the bottom part of the jni.go to be in
alphabetical order of the v23_syncbase_ types they are operating on.

MultiPart: 2/2
Change-Id: Ib855a53b1ff317fae851a282aea6a4fdae2ecb20
diff --git a/syncbase/src/test/java/io/v/syncbase/internal/CollectionTest.java b/syncbase/src/test/java/io/v/syncbase/internal/CollectionTest.java
index db07d1d..a5fb7b5 100644
--- a/syncbase/src/test/java/io/v/syncbase/internal/CollectionTest.java
+++ b/syncbase/src/test/java/io/v/syncbase/internal/CollectionTest.java
@@ -92,6 +92,31 @@
     }
 
     @Test
+    public void permissions() {
+        Id dbId = new Id("idp:a:angrybirds", "permissions_collection");
+        String dbName = dbId.encode();
+        Id collectionId = new Id("idp:u:alice", "collection");
+        String collectionName = Util.NamingJoin(Arrays.asList(dbName, collectionId.encode()));
+        try {
+            Database.Create(dbName, null);
+            String batchHandle = Database.BeginBatch(dbId.encode(), null);
+            Collection.Create(collectionName, batchHandle, null);
+            Permissions permissions = Collection.GetPermissions(collectionName, batchHandle);
+            assertNotNull(permissions);
+            String json = new String(permissions.json);
+            assertTrue(json.contains("Admin"));
+            Database.Commit(dbName, batchHandle);
+
+            batchHandle = Database.BeginBatch(dbId.encode(), null);
+            Collection.SetPermissions(collectionName, batchHandle, permissions);
+            Database.Commit(dbName, batchHandle);
+        } catch (VError vError) {
+            vError.printStackTrace();
+            fail(vError.toString());
+        }
+    }
+
+    @Test
     public void deleteRangeCollection() {
         Id dbId = new Id("idp:a:angrybirds", "delete_range_collection");
         String dbName = dbId.encode();
diff --git a/syncbase/src/test/java/io/v/syncbase/internal/DatabaseTest.java b/syncbase/src/test/java/io/v/syncbase/internal/DatabaseTest.java
index 23f7591..aa97ff2 100644
--- a/syncbase/src/test/java/io/v/syncbase/internal/DatabaseTest.java
+++ b/syncbase/src/test/java/io/v/syncbase/internal/DatabaseTest.java
@@ -14,6 +14,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -83,6 +84,28 @@
     }
 
     @Test
+    public void permissions() {
+        Id dbId = new Id("idp:a:angrybirds", "permissions_db");
+        String dbName = dbId.encode();
+        try {
+            Database.Create(dbName, null);
+            VersionedPermissions versionedPermissions1 = Database.GetPermissions(dbName);
+            assertNotNull(versionedPermissions1);
+            assertTrue(versionedPermissions1.version.length() > 0);
+            String json = new String(versionedPermissions1.permissions.json);
+            assertTrue(json.contains("Admin"));
+
+            Database.SetPermissions(dbName, versionedPermissions1);
+            VersionedPermissions versionedPermissions2 = Database.GetPermissions(dbName);
+            assertNotEquals(versionedPermissions1.version, versionedPermissions2.version);
+            assertEquals(json, new String(versionedPermissions2.permissions.json));
+        } catch (VError vError) {
+            vError.printStackTrace();
+            fail(vError.toString());
+        }
+    }
+
+    @Test
     public void abortDatabase() {
         Id dbId = new Id("idp:a:angrybirds", "abort_db");
         String dbName = dbId.encode();
diff --git a/syncbase/src/test/java/io/v/syncbase/internal/ServiceTest.java b/syncbase/src/test/java/io/v/syncbase/internal/ServiceTest.java
index 58e5ebb..da6b8d9 100644
--- a/syncbase/src/test/java/io/v/syncbase/internal/ServiceTest.java
+++ b/syncbase/src/test/java/io/v/syncbase/internal/ServiceTest.java
@@ -7,7 +7,10 @@
 import org.junit.Before;
 import org.junit.Test;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 public class ServiceTest {
     @Before
@@ -19,4 +22,23 @@
     public void listDatabases() {
         assertTrue(Service.ListDatabases().isEmpty());
     }
+
+    @Test
+    public void getPermissions() {
+        VersionedPermissions versionedPermissions1 = Service.GetPermissions();
+        assertNotNull(versionedPermissions1);
+        assertTrue(versionedPermissions1.version.length() > 0);
+        String json = new String(versionedPermissions1.permissions.json);
+        assertTrue(json.contains("Admin"));
+
+        try {
+            Service.SetPermissions(versionedPermissions1);
+            VersionedPermissions versionedPermissions2 = Service.GetPermissions();
+            assertEquals("1", versionedPermissions2.version);
+            assertEquals(json, new String(versionedPermissions2.permissions.json));
+        } catch (VError vError) {
+            vError.printStackTrace();
+            fail(vError.toString());
+        }
+    }
 }