java/syncbase: Hide Root Watch Change and Fix Test

Note: We may eventually hide the userdata collection too. However,
efforts to do that are a separate issue.
See https://github.com/vanadium/issues/issues/1372 for that.

Closes https://github.com/vanadium/issues/issues/1373

Change-Id: I825ecc7b0797ec3b06a92521afa7f49da5913d95
diff --git a/syncbase/src/main/java/io/v/syncbase/Database.java b/syncbase/src/main/java/io/v/syncbase/Database.java
index 4837017..1fea773 100644
--- a/syncbase/src/main/java/io/v/syncbase/Database.java
+++ b/syncbase/src/main/java/io/v/syncbase/Database.java
@@ -413,7 +413,10 @@
                     @Override
                     public void onChange(io.v.syncbase.core.WatchChange coreWatchChange) {
                         // TODO(razvanm): Ignore changes to userdata collection.
-                        mBatch.add(new WatchChange(coreWatchChange));
+                        if (coreWatchChange.entityType !=
+                                io.v.syncbase.core.WatchChange.EntityType.ROOT) {
+                            mBatch.add(new WatchChange(coreWatchChange));
+                        }
                         if (!coreWatchChange.continued) {
                             final SettableFuture<Boolean> setFuture = SettableFuture.create();
                             if (!mGotFirstBatch) {
diff --git a/syncbase/src/main/java/io/v/syncbase/WatchChange.java b/syncbase/src/main/java/io/v/syncbase/WatchChange.java
index 46c236c..5160de1 100644
--- a/syncbase/src/main/java/io/v/syncbase/WatchChange.java
+++ b/syncbase/src/main/java/io/v/syncbase/WatchChange.java
@@ -13,7 +13,6 @@
  */
 public class WatchChange {
     public enum EntityType {
-        ROOT,
         COLLECTION,
         ROW
     }
@@ -33,9 +32,7 @@
     private final boolean mContinued;
 
     WatchChange(io.v.syncbase.core.WatchChange change) {
-        if (change.entityType == io.v.syncbase.core.WatchChange.EntityType.ROOT) {
-            mEntityType = EntityType.ROOT;
-        } else if (change.entityType == io.v.syncbase.core.WatchChange.EntityType.COLLECTION) {
+        if (change.entityType == io.v.syncbase.core.WatchChange.EntityType.COLLECTION) {
             mEntityType = EntityType.COLLECTION;
         } else if (change.entityType == io.v.syncbase.core.WatchChange.EntityType.ROW) {
             mEntityType = EntityType.ROW;
diff --git a/syncbase/src/test/java/io/v/syncbase/SyncbaseTest.java b/syncbase/src/test/java/io/v/syncbase/SyncbaseTest.java
index 311ce91..72a2431 100644
--- a/syncbase/src/test/java/io/v/syncbase/SyncbaseTest.java
+++ b/syncbase/src/test/java/io/v/syncbase/SyncbaseTest.java
@@ -188,18 +188,13 @@
             @Override
             public void onInitialState(Iterator<WatchChange> values) {
                 // TODO(razvanm): Check the entire contents of each change.
-                // 1st change: the root entity.
+                // 1st change: the collection entity for the "c" collection.
                 assertTrue(values.hasNext());
-                WatchChange watchChange = values.next();
-                assertEquals(WatchChange.EntityType.ROOT, watchChange.getEntityType());
-                assertEquals(WatchChange.ChangeType.PUT, watchChange.getChangeType());
-                // 2nd change: the collection entity for the "c" collection.
-                assertTrue(values.hasNext());
-                watchChange = (WatchChange) values.next();
+                WatchChange watchChange = (WatchChange) values.next();
                 assertEquals(WatchChange.EntityType.COLLECTION, watchChange.getEntityType());
                 assertEquals(WatchChange.ChangeType.PUT, watchChange.getChangeType());
                 assertEquals("c", watchChange.getCollectionId().getName());
-                // 3nd change: the row for the "foo" key.
+                // 2nd change: the row for the "foo" key.
                 assertTrue(values.hasNext());
                 watchChange = (WatchChange) values.next();
                 assertEquals(WatchChange.EntityType.ROW, watchChange.getEntityType());
@@ -208,12 +203,18 @@
                 assertEquals("foo", watchChange.getRowKey());
                 // TODO(razvanm): Uncomment after the POJO start working.
                 //assertEquals(1, watchChange.getValue());
-                // 4nd change: the collection entity for the userdata collection.
+                // 3rd change: the collection entity for the userdata collection.
                 assertTrue(values.hasNext());
                 watchChange = (WatchChange) values.next();
                 assertEquals(WatchChange.EntityType.COLLECTION, watchChange.getEntityType());
                 assertEquals(WatchChange.ChangeType.PUT, watchChange.getChangeType());
-                assertFalse(values.hasNext());
+                // 4th change: the userdata collection has a row for "c"'s syncgroup.
+                assertTrue(values.hasNext());
+                watchChange = (WatchChange) values.next();
+                assertEquals(WatchChange.EntityType.ROW, watchChange.getEntityType());
+                assertEquals(WatchChange.ChangeType.PUT, watchChange.getChangeType());
+                assertEquals("userdata__", watchChange.getCollectionId().getName());
+                assertTrue(watchChange.getRowKey().endsWith("c"));
                 waitOnInitialState.set(null);
             }