Added a builder for TransactionContexts

Change-Id: I22b467ed0b1e691f3df4ccc5e414b8f4c3bf18f4
diff --git a/core/api/src/main/java/org/onosproject/store/service/StorageService.java b/core/api/src/main/java/org/onosproject/store/service/StorageService.java
index 91cc273..b836ce8 100644
--- a/core/api/src/main/java/org/onosproject/store/service/StorageService.java
+++ b/core/api/src/main/java/org/onosproject/store/service/StorageService.java
@@ -63,9 +63,9 @@
     AtomicCounterBuilder atomicCounterBuilder();
 
     /**
-     * Creates a new transaction context.
+     * Creates a new transaction context builder.
      *
-     * @return transaction context
+     * @return a builder for a transaction context.
      */
-    TransactionContext createTransactionContext();
+    TransactionContextBuilder transactionContextBuilder();
 }
diff --git a/core/api/src/main/java/org/onosproject/store/service/TransactionContextBuilder.java b/core/api/src/main/java/org/onosproject/store/service/TransactionContextBuilder.java
new file mode 100644
index 0000000..4ae6b0f
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/store/service/TransactionContextBuilder.java
@@ -0,0 +1,32 @@
+package org.onosproject.store.service;
+
+/**
+ * Interface definition for a transaction context builder.
+ */
+public interface TransactionContextBuilder {
+
+    /**
+     * Disables distribution of map entries across multiple database partitions.
+     * <p>
+     * When partitioning is disabled, the returned map will have a single
+     * partition that spans the entire cluster. Furthermore, the changes made to
+     * the map are ephemeral and do not survive a full cluster restart.
+     * </p>
+     * <p>
+     * Note: By default, partitions are enabled. This feature is intended to
+     * simplify debugging.
+     * </p>
+     *
+     * @return this TransactionalContextBuilder
+     */
+    public TransactionContextBuilder withPartitionsDisabled();
+
+    /**
+     * Builds a TransactionContext based on configuration options supplied to this
+     * builder.
+     *
+     * @return a new TransactionalContext
+     * @throws java.lang.RuntimeException if a mandatory parameter is missing
+     */
+    public TransactionContext build();
+}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseManager.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseManager.java
index 7c4ddb5..71d1961 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseManager.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseManager.java
@@ -59,7 +59,7 @@
 import org.onosproject.store.service.StorageAdminService;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.Transaction;
-import org.onosproject.store.service.TransactionContext;
+import org.onosproject.store.service.TransactionContextBuilder;
 import org.slf4j.Logger;
 
 import java.io.File;
@@ -217,8 +217,9 @@
     }
 
     @Override
-    public TransactionContext createTransactionContext() {
-        return new DefaultTransactionContext(partitionedDatabase, transactionIdGenerator.getNewId());
+    public TransactionContextBuilder transactionContextBuilder() {
+        return new DefaultTransactionContextBuilder(
+                inMemoryDatabase, partitionedDatabase, transactionIdGenerator.getNewId());
     }
 
     @Override
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultTransactionContextBuilder.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultTransactionContextBuilder.java
new file mode 100644
index 0000000..a3484cf
--- /dev/null
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultTransactionContextBuilder.java
@@ -0,0 +1,37 @@
+package org.onosproject.store.consistent.impl;
+
+import org.onosproject.store.service.TransactionContext;
+import org.onosproject.store.service.TransactionContextBuilder;
+
+/**
+ * The default implementation of a transaction context builder. This builder
+ * generates a {@link DefaultTransactionContext}.
+ */
+public class DefaultTransactionContextBuilder implements TransactionContextBuilder {
+
+    private boolean partitionsEnabled = true;
+    private final Database partitionedDatabase;
+    private final Database inMemoryDatabase;
+    private final long transactionId;
+
+    public DefaultTransactionContextBuilder(
+            Database inMemoryDatabase, Database partitionedDatabase, long transactionId) {
+        this.partitionedDatabase = partitionedDatabase;
+        this.inMemoryDatabase = inMemoryDatabase;
+        this.transactionId = transactionId;
+    }
+
+    @Override
+    public TransactionContextBuilder withPartitionsDisabled() {
+        partitionsEnabled = false;
+        return this;
+    }
+
+    @Override
+    public TransactionContext build() {
+        return new DefaultTransactionContext(
+                partitionsEnabled ? partitionedDatabase : inMemoryDatabase,
+                transactionId);
+    }
+
+}