ONOS-2097: Ensure updates made via transactional map result in state change notifications

Change-Id: Iecc1b54d2c4c976278e77dbd825d3e3954c53602
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabaseState.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabaseState.java
index bd9cf69..219b847 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabaseState.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabaseState.java
@@ -31,11 +31,10 @@
 import org.onosproject.store.service.DatabaseUpdate;
 import org.onosproject.store.service.Transaction;
 import org.onosproject.store.service.Versioned;
-import org.onosproject.store.service.DatabaseUpdate.Type;
-
 import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
 import net.kuujo.copycat.state.Initializer;
@@ -239,11 +238,11 @@
     }
 
     @Override
-    public boolean prepareAndCommit(Transaction transaction) {
+    public CommitResponse prepareAndCommit(Transaction transaction) {
         if (prepare(transaction)) {
             return commit(transaction);
         }
-        return false;
+        return CommitResponse.failure();
     }
 
     @Override
@@ -263,9 +262,9 @@
     }
 
     @Override
-    public boolean commit(Transaction transaction) {
-        transaction.updates().forEach(update -> commitProvisionalUpdate(update, transaction.id()));
-        return true;
+    public CommitResponse commit(Transaction transaction) {
+        return CommitResponse.success(Lists.transform(transaction.updates(),
+                                                      update -> commitProvisionalUpdate(update, transaction.id())));
     }
 
     @Override
@@ -334,32 +333,16 @@
         }
     }
 
-    private void commitProvisionalUpdate(DatabaseUpdate update, long transactionId) {
+    private UpdateResult<String, byte[]> commitProvisionalUpdate(DatabaseUpdate update, long transactionId) {
         String mapName = update.mapName();
         String key = update.key();
-        Type type = update.type();
         Update provisionalUpdate = getLockMap(mapName).get(key);
         if (Objects.equal(transactionId, provisionalUpdate.transactionId()))  {
             getLockMap(mapName).remove(key);
         } else {
-            return;
+            throw new IllegalStateException("Invalid transaction Id");
         }
-
-        switch (type) {
-        case PUT:
-        case PUT_IF_ABSENT:
-        case PUT_IF_VERSION_MATCH:
-        case PUT_IF_VALUE_MATCH:
-            mapUpdate(mapName, key, Match.any(), Match.any(), provisionalUpdate.value());
-            break;
-        case REMOVE:
-        case REMOVE_IF_VERSION_MATCH:
-        case REMOVE_IF_VALUE_MATCH:
-            mapUpdate(mapName, key, Match.any(), Match.any(), null);
-            break;
-        default:
-            break;
-        }
+        return mapUpdate(mapName, key, Match.any(), Match.any(), provisionalUpdate.value()).value();
     }
 
     private void undoProvisionalUpdate(DatabaseUpdate update, long transactionId) {