Implement multiton support for primitives accessed via primitive getters

Change-Id: Ib5eda427f29336c0496780f36a70f9a24ed838ea
diff --git a/core/api/src/main/java/org/onosproject/store/service/PrimitiveService.java b/core/api/src/main/java/org/onosproject/store/service/PrimitiveService.java
index 7be0480..aa65a86 100644
--- a/core/api/src/main/java/org/onosproject/store/service/PrimitiveService.java
+++ b/core/api/src/main/java/org/onosproject/store/service/PrimitiveService.java
@@ -107,6 +107,13 @@
     <V> AtomicValueBuilder<V> atomicValueBuilder();
 
     /**
+     * Creates a new DistributedLockBuilder.
+     *
+     * @return lock builder
+     */
+    DistributedLockBuilder lockBuilder();
+
+    /**
      * Creates a new LeaderElectorBuilder.
      *
      * @return leader elector builder
@@ -126,9 +133,7 @@
      *
      * @return AsyncAtomicCounter instance
      */
-    default AsyncAtomicCounter getAsyncAtomicCounter(String name) {
-        return atomicCounterBuilder().withName(name).build();
-    }
+    AsyncAtomicCounter getAsyncAtomicCounter(String name);
 
     /**
      * Returns an instance of {@code AsyncAtomicIdGenerator} with specified name.
@@ -136,9 +141,7 @@
      * @param name ID generator name
      * @return AsyncAtomicIdGenerator instance
      */
-    default AsyncAtomicIdGenerator getAsyncAtomicIdGenerator(String name) {
-        return atomicIdGeneratorBuilder().withName(name).build();
-    }
+    AsyncAtomicIdGenerator getAsyncAtomicIdGenerator(String name);
 
     /**
      * Returns an instance of {@code AtomicCounter} with specified name.
@@ -180,17 +183,17 @@
      */
     <V> AsyncDocumentTree<V> getDocumentTree(String name, Serializer serializer);
 
-     /** Returns a set backed instance of {@code AsyncConsistentMultimap} with
+    /**
+     * Returns a set backed instance of {@code AsyncConsistentMultimap} with
      * the specified name.
      *
-     * @param name the multimap name
+     * @param name       the multimap name
      * @param serializer serializer
-     * @param <K> key type
-     * @param <V> value type
+     * @param <K>        key type
+     * @param <V>        value type
      * @return set backed {@code AsyncConsistentMultimap} instance
      */
-    <K, V> AsyncConsistentMultimap<K, V> getAsyncSetMultimap(String name,
-            Serializer serializer);
+    <K, V> AsyncConsistentMultimap<K, V> getAsyncSetMultimap(String name, Serializer serializer);
 
     /**
      * Returns an instance of {@code AsyncConsistentTreeMap} with the specified
@@ -201,8 +204,7 @@
      * @param <V> value type
      * @return set backed {@code AsyncConsistentTreeMap} instance
      */
-    <V> AsyncConsistentTreeMap<V> getAsyncTreeMap(String name,
-            Serializer serializer);
+    <V> AsyncConsistentTreeMap<V> getAsyncTreeMap(String name, Serializer serializer);
 
     /**
      * Returns an instance of {@code Topic} with specified name.
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 2dd42fa..94843fc 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
@@ -24,201 +24,4 @@
  * this service for their distributed state management and coordination.
  */
 public interface StorageService extends PrimitiveService {
-
-    /**
-     * Creates a new EventuallyConsistentMapBuilder.
-     *
-     * @param <K> key type
-     * @param <V> value type
-     * @return builder for an eventually consistent map
-     */
-    <K, V> EventuallyConsistentMapBuilder<K, V> eventuallyConsistentMapBuilder();
-
-    /**
-     * Creates a new ConsistentMapBuilder.
-     *
-     * @param <K> key type
-     * @param <V> value type
-     * @return builder for a consistent map
-     */
-    <K, V> ConsistentMapBuilder<K, V> consistentMapBuilder();
-
-    /**
-     * Creates a new ConsistentMapBuilder.
-     *
-     * @param <V> value type
-     * @return builder for a consistent map
-     */
-    <V> DocumentTreeBuilder<V> documentTreeBuilder();
-
-    /**
-     * Creates a new {@code AsyncConsistentTreeMapBuilder}.
-     *
-     * @param <V> value type
-     * @return builder for a async consistent tree map
-     */
-    <V> ConsistentTreeMapBuilder<V> consistentTreeMapBuilder();
-
-    /**
-     * Creates a new {@code AsyncConsistentSetMultimapBuilder}.
-     *
-     * @param <K> key type
-     * @param <V> value type
-     * @return builder for a set based async consistent multimap
-     */
-    <K, V> ConsistentMultimapBuilder<K, V> consistentMultimapBuilder();
-
-    /**
-     * Creates a new {@code AtomicCounterMapBuilder}.
-     *
-     * @param <K> key type
-     * @return builder for an atomic counter map
-     */
-    <K> AtomicCounterMapBuilder<K> atomicCounterMapBuilder();
-
-    /**
-     * Creates a new DistributedSetBuilder.
-     *
-     * @param <E> set element type
-     * @return builder for an distributed set
-     */
-    <E> DistributedSetBuilder<E> setBuilder();
-
-    /**
-     * Creates a new AtomicCounterBuilder.
-     *
-     * @return atomic counter builder
-     */
-    AtomicCounterBuilder atomicCounterBuilder();
-
-    /**
-     * Creates a new AtomicIdGeneratorBuilder.
-     *
-     * @return atomic ID generator builder
-     */
-    AtomicIdGeneratorBuilder atomicIdGeneratorBuilder();
-
-    /**
-     * Creates a new AtomicValueBuilder.
-     *
-     * @param <V> atomic value type
-     * @return atomic value builder
-     */
-    <V> AtomicValueBuilder<V> atomicValueBuilder();
-
-    /**
-     * Creates a new DistributedLockBuilder.
-     *
-     * @return lock builder
-     */
-    DistributedLockBuilder lockBuilder();
-
-    /**
-     * Creates a new LeaderElectorBuilder.
-     *
-     * @return leader elector builder
-     */
-    LeaderElectorBuilder leaderElectorBuilder();
-
-    /**
-     * Creates a new transaction context builder.
-     *
-     * @return a builder for a transaction context.
-     */
-    TransactionContextBuilder transactionContextBuilder();
-
-    /**
-     * Returns an instance of {@code AsyncAtomicCounter} with specified name.
-     * @param name counter name
-     *
-     * @return AsyncAtomicCounter instance
-     */
-    default AsyncAtomicCounter getAsyncAtomicCounter(String name) {
-        return atomicCounterBuilder().withName(name).build();
-    }
-
-    /**
-     * Returns an instance of {@code AsyncAtomicIdGenerator} with specified name.
-     *
-     * @param name ID generator name
-     * @return AsyncAtomicIdGenerator instance
-     */
-    default AsyncAtomicIdGenerator getAsyncAtomicIdGenerator(String name) {
-        return atomicIdGeneratorBuilder().withName(name).build();
-    }
-
-    /**
-     * Returns an instance of {@code AtomicCounter} with specified name.
-     * @param name counter name
-     *
-     * @return AtomicCounter instance
-     */
-    default AtomicCounter getAtomicCounter(String name) {
-        return getAsyncAtomicCounter(name).asAtomicCounter();
-    }
-
-    /**
-     * Returns an instance of {@code AtomicIdGenerator} with specified name.
-     *
-     * @param name ID generator name
-     * @return AtomicIdGenerator instance
-     */
-    default AtomicIdGenerator getAtomicIdGenerator(String name) {
-        return getAsyncAtomicIdGenerator(name).asAtomicIdGenerator();
-    }
-
-    /**
-     * Returns an instance of {@code WorkQueue} with specified name.
-     *
-     * @param <E> work element type
-     * @param name work queue name
-     * @param serializer serializer
-     * @return WorkQueue instance
-     */
-    <E> WorkQueue<E> getWorkQueue(String name, Serializer serializer);
-
-    /**
-     * Returns an instance of {@code AsyncDocumentTree} with specified name.
-     *
-     * @param <V> tree node value type
-     * @param name document tree name
-     * @param serializer serializer
-     * @return AsyncDocumentTree instance
-     */
-    <V> AsyncDocumentTree<V> getDocumentTree(String name, Serializer serializer);
-
-     /** Returns a set backed instance of {@code AsyncConsistentMultimap} with
-     * the specified name.
-     *
-     * @param name the multimap name
-     * @param serializer serializer
-     * @param <K> key type
-     * @param <V> value type
-     * @return set backed {@code AsyncConsistentMultimap} instance
-     */
-    <K, V> AsyncConsistentMultimap<K, V> getAsyncSetMultimap(String name,
-                                                             Serializer serializer);
-
-    /**
-     * Returns an instance of {@code AsyncConsistentTreeMap} with the specified
-     * name.
-     *
-     * @param name the treemap name
-     * @param serializer serializer
-     * @param <V> value type
-     * @return set backed {@code AsyncConsistentTreeMap} instance
-     */
-    <V> AsyncConsistentTreeMap<V> getAsyncTreeMap(String name,
-                                                  Serializer serializer);
-
-    /**
-     * Returns an instance of {@code Topic} with specified name.
-     *
-     * @param <T> topic message type
-     * @param name topic name
-     * @param serializer serializer
-     *
-     * @return Topic instance
-     */
-    <T> Topic<T> getTopic(String name, Serializer serializer);
 }
diff --git a/core/api/src/test/java/org/onosproject/store/service/CoordinationServiceAdapter.java b/core/api/src/test/java/org/onosproject/store/service/CoordinationServiceAdapter.java
index f05d9aa..927cd27 100644
--- a/core/api/src/test/java/org/onosproject/store/service/CoordinationServiceAdapter.java
+++ b/core/api/src/test/java/org/onosproject/store/service/CoordinationServiceAdapter.java
@@ -70,6 +70,11 @@
     }
 
     @Override
+    public DistributedLockBuilder lockBuilder() {
+        return null;
+    }
+
+    @Override
     public LeaderElectorBuilder leaderElectorBuilder() {
         return null;
     }
@@ -80,6 +85,16 @@
     }
 
     @Override
+    public AsyncAtomicCounter getAsyncAtomicCounter(String name) {
+        return null;
+    }
+
+    @Override
+    public AsyncAtomicIdGenerator getAsyncAtomicIdGenerator(String name) {
+        return null;
+    }
+
+    @Override
     public <E> WorkQueue<E> getWorkQueue(String name, Serializer serializer) {
         return null;
     }
diff --git a/core/api/src/test/java/org/onosproject/store/service/StorageServiceAdapter.java b/core/api/src/test/java/org/onosproject/store/service/StorageServiceAdapter.java
index 4d528e2..8ead51c 100644
--- a/core/api/src/test/java/org/onosproject/store/service/StorageServiceAdapter.java
+++ b/core/api/src/test/java/org/onosproject/store/service/StorageServiceAdapter.java
@@ -70,6 +70,16 @@
     }
 
     @Override
+    public AsyncAtomicCounter getAsyncAtomicCounter(String name) {
+        return null;
+    }
+
+    @Override
+    public AsyncAtomicIdGenerator getAsyncAtomicIdGenerator(String name) {
+        return null;
+    }
+
+    @Override
     public <E> WorkQueue<E> getWorkQueue(String name, Serializer serializer) {
         return null;
     }
diff --git a/core/api/src/test/java/org/onosproject/store/service/TestStorageService.java b/core/api/src/test/java/org/onosproject/store/service/TestStorageService.java
index e41d2ad..f250bfe 100644
--- a/core/api/src/test/java/org/onosproject/store/service/TestStorageService.java
+++ b/core/api/src/test/java/org/onosproject/store/service/TestStorageService.java
@@ -59,6 +59,16 @@
     }
 
     @Override
+    public AsyncAtomicCounter getAsyncAtomicCounter(String name) {
+        return atomicCounterBuilder().withName(name).build();
+    }
+
+    @Override
+    public AsyncAtomicIdGenerator getAsyncAtomicIdGenerator(String name) {
+        return atomicIdGeneratorBuilder().withName(name).build();
+    }
+
+    @Override
     public <T> Topic<T> getTopic(String name, Serializer serializer) {
         return new TestTopic(name);
     }
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/CoordinationManager.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/CoordinationManager.java
index e7ed20a..2355e35 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/CoordinationManager.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/CoordinationManager.java
@@ -33,7 +33,8 @@
 import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
 import org.onosproject.store.primitives.DistributedPrimitiveCreator;
 import org.onosproject.store.serializers.KryoNamespaces;
-import org.onosproject.store.service.AsyncAtomicValue;
+import org.onosproject.store.service.AsyncAtomicCounter;
+import org.onosproject.store.service.AsyncAtomicIdGenerator;
 import org.onosproject.store.service.AsyncConsistentMultimap;
 import org.onosproject.store.service.AsyncConsistentTreeMap;
 import org.onosproject.store.service.AsyncDocumentTree;
@@ -45,6 +46,7 @@
 import org.onosproject.store.service.ConsistentMultimapBuilder;
 import org.onosproject.store.service.ConsistentTreeMapBuilder;
 import org.onosproject.store.service.CoordinationService;
+import org.onosproject.store.service.DistributedLockBuilder;
 import org.onosproject.store.service.DistributedSetBuilder;
 import org.onosproject.store.service.DocumentTreeBuilder;
 import org.onosproject.store.service.EventuallyConsistentMapBuilder;
@@ -82,6 +84,7 @@
 
     private StoragePartition partition;
     private DistributedPrimitiveCreator primitiveCreator;
+    private DistributedPrimitiveManager primitiveManager;
 
     @Activate
     public void activate() {
@@ -97,6 +100,7 @@
                 clusterService);
         partition.open().join();
         primitiveCreator = partition.client();
+        primitiveManager = new DistributedPrimitiveManager(primitiveCreator);
         log.info("Started");
     }
 
@@ -190,6 +194,12 @@
     }
 
     @Override
+    public DistributedLockBuilder lockBuilder() {
+        checkPermission(STORAGE_WRITE);
+        return new DefaultDistributedLockBuilder(primitiveCreator);
+    }
+
+    @Override
     public TransactionContextBuilder transactionContextBuilder() {
         throw new UnsupportedOperationException();
     }
@@ -201,38 +211,43 @@
     }
 
     @Override
+    public AsyncAtomicCounter getAsyncAtomicCounter(String name) {
+        checkPermission(STORAGE_WRITE);
+        return primitiveManager.getAsyncAtomicCounter(name);
+    }
+
+    @Override
+    public AsyncAtomicIdGenerator getAsyncAtomicIdGenerator(String name) {
+        checkPermission(STORAGE_WRITE);
+        return primitiveManager.getAsyncAtomicIdGenerator(name);
+    }
+
+    @Override
     public <E> WorkQueue<E> getWorkQueue(String name, Serializer serializer) {
         checkPermission(STORAGE_WRITE);
-        return primitiveCreator.newWorkQueue(name, serializer);
+        return primitiveManager.getWorkQueue(name, serializer);
     }
 
     @Override
     public <V> AsyncDocumentTree<V> getDocumentTree(String name, Serializer serializer) {
         checkPermission(STORAGE_WRITE);
-        return primitiveCreator.newAsyncDocumentTree(name, serializer);
+        return primitiveManager.getDocumentTree(name, serializer);
     }
 
     @Override
-    public <K, V> AsyncConsistentMultimap<K, V> getAsyncSetMultimap(
-            String name, Serializer serializer) {
+    public <K, V> AsyncConsistentMultimap<K, V> getAsyncSetMultimap(String name, Serializer serializer) {
         checkPermission(STORAGE_WRITE);
-        return primitiveCreator.newAsyncConsistentSetMultimap(name,
-                                                                serializer);
+        return primitiveManager.getAsyncSetMultimap(name, serializer);
     }
 
     @Override
-    public <V> AsyncConsistentTreeMap<V> getAsyncTreeMap(
-            String name, Serializer serializer) {
+    public <V> AsyncConsistentTreeMap<V> getAsyncTreeMap(String name, Serializer serializer) {
         checkPermission(STORAGE_WRITE);
-        return primitiveCreator.newAsyncConsistentTreeMap(name, serializer);
+        return primitiveManager.getAsyncTreeMap(name, serializer);
     }
 
     @Override
     public <T> Topic<T> getTopic(String name, Serializer serializer) {
-        AsyncAtomicValue<T> atomicValue = this.<T>atomicValueBuilder()
-                                              .withName("topic-" + name)
-                                              .withSerializer(serializer)
-                                              .build();
-        return new DefaultDistributedTopic<>(atomicValue);
+        return primitiveManager.getTopic(name, serializer);
     }
 }
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DistributedPrimitiveManager.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DistributedPrimitiveManager.java
new file mode 100644
index 0000000..bddae9b
--- /dev/null
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DistributedPrimitiveManager.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.store.primitives.impl;
+
+import java.util.Map;
+import java.util.function.Function;
+
+import com.google.common.collect.Maps;
+import org.onosproject.store.primitives.DistributedPrimitiveCreator;
+import org.onosproject.store.service.AsyncAtomicCounter;
+import org.onosproject.store.service.AsyncAtomicIdGenerator;
+import org.onosproject.store.service.AsyncAtomicValue;
+import org.onosproject.store.service.AsyncConsistentMultimap;
+import org.onosproject.store.service.AsyncConsistentTreeMap;
+import org.onosproject.store.service.AsyncDocumentTree;
+import org.onosproject.store.service.DistributedPrimitive;
+import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.Topic;
+import org.onosproject.store.service.WorkQueue;
+
+/**
+ * Primitive instance manager.
+ */
+public class DistributedPrimitiveManager {
+    private final Map<String, DistributedPrimitive> primitives = Maps.newConcurrentMap();
+    private final DistributedPrimitiveCreator primitiveCreator;
+
+    DistributedPrimitiveManager(DistributedPrimitiveCreator primitiveCreator) {
+        this.primitiveCreator = primitiveCreator;
+    }
+
+    /**
+     * Returns a cached primitive instance.
+     *
+     * @param name    the primitive name
+     * @param factory the primitive factory
+     * @param <T>     the primitive type
+     * @return the primitive instance
+     */
+    @SuppressWarnings("unchecked")
+    private <T extends DistributedPrimitive> T getPrimitive(String name, Function<String, T> factory) {
+        return (T) primitives.computeIfAbsent(name, factory);
+    }
+
+    /**
+     * Returns an instance of {@code AsyncAtomicCounter} with specified name.
+     * @param name counter name
+     *
+     * @return AsyncAtomicCounter instance
+     */
+    public AsyncAtomicCounter getAsyncAtomicCounter(String name) {
+        return getPrimitive(name, primitiveCreator::newAsyncCounter);
+    }
+
+    /**
+     * Returns an instance of {@code AsyncAtomicIdGenerator} with specified name.
+     *
+     * @param name ID generator name
+     * @return AsyncAtomicIdGenerator instance
+     */
+    public AsyncAtomicIdGenerator getAsyncAtomicIdGenerator(String name) {
+        return getPrimitive(name, primitiveCreator::newAsyncIdGenerator);
+    }
+
+    /**
+     * Returns an instance of {@code WorkQueue} with specified name.
+     *
+     * @param <E> work element type
+     * @param name work queue name
+     * @param serializer serializer
+     * @return WorkQueue instance
+     */
+    public <E> WorkQueue<E> getWorkQueue(String name, Serializer serializer) {
+        return getPrimitive(name, n -> primitiveCreator.newWorkQueue(n, serializer));
+    }
+
+    /**
+     * Returns an instance of {@code AsyncDocumentTree} with specified name.
+     *
+     * @param <V> tree node value type
+     * @param name document tree name
+     * @param serializer serializer
+     * @return AsyncDocumentTree instance
+     */
+    public <V> AsyncDocumentTree<V> getDocumentTree(String name, Serializer serializer) {
+        return getPrimitive(name, n -> primitiveCreator.newAsyncDocumentTree(n, serializer));
+    }
+
+    /**
+     * Returns a set backed instance of {@code AsyncConsistentMultimap} with
+     * the specified name.
+     *
+     * @param name       the multimap name
+     * @param serializer serializer
+     * @param <K>        key type
+     * @param <V>        value type
+     * @return set backed {@code AsyncConsistentMultimap} instance
+     */
+    public <K, V> AsyncConsistentMultimap<K, V> getAsyncSetMultimap(String name, Serializer serializer) {
+        return getPrimitive(name, n -> primitiveCreator.newAsyncConsistentSetMultimap(n, serializer));
+    }
+
+    /**
+     * Returns an instance of {@code AsyncConsistentTreeMap} with the specified
+     * name.
+     *
+     * @param name the treemap name
+     * @param serializer serializer
+     * @param <V> value type
+     * @return set backed {@code AsyncConsistentTreeMap} instance
+     */
+    public <V> AsyncConsistentTreeMap<V> getAsyncTreeMap(String name, Serializer serializer) {
+        return getPrimitive(name, n -> primitiveCreator.newAsyncConsistentTreeMap(n, serializer));
+    }
+
+    /**
+     * Returns an instance of {@code Topic} with specified name.
+     *
+     * @param <T> topic message type
+     * @param name topic name
+     * @param serializer serializer
+     *
+     * @return Topic instance
+     */
+    public <T> Topic<T> getTopic(String name, Serializer serializer) {
+        AsyncAtomicValue<T> atomicValue =
+            getPrimitive(name, n -> primitiveCreator.newAsyncAtomicValue("topic-" + n, serializer));
+        return new DefaultDistributedTopic<>(atomicValue);
+    }
+}
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/StorageManager.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/StorageManager.java
index e90d802..57676eb 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/StorageManager.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/StorageManager.java
@@ -35,7 +35,8 @@
 import org.onosproject.store.primitives.PartitionService;
 import org.onosproject.store.primitives.TransactionId;
 import org.onosproject.store.serializers.KryoNamespaces;
-import org.onosproject.store.service.AsyncAtomicValue;
+import org.onosproject.store.service.AsyncAtomicCounter;
+import org.onosproject.store.service.AsyncAtomicIdGenerator;
 import org.onosproject.store.service.AsyncConsistentMultimap;
 import org.onosproject.store.service.AsyncConsistentTreeMap;
 import org.onosproject.store.service.AsyncDocumentTree;
@@ -107,6 +108,7 @@
             () -> TransactionId.from(UUID.randomUUID().toString());
     private DistributedPrimitiveCreator federatedPrimitiveCreator;
     private TransactionManager transactionManager;
+    private DistributedPrimitiveManager primitiveManager;
 
     @Activate
     public void activate() {
@@ -116,6 +118,7 @@
             .forEach(id -> partitionMap.put(id, partitionService.getDistributedPrimitiveCreator(id)));
         federatedPrimitiveCreator = new FederatedDistributedPrimitiveCreator(partitionMap, BUCKETS);
         transactionManager = new TransactionManager(this, partitionService, BUCKETS);
+        primitiveManager = new DistributedPrimitiveManager(federatedPrimitiveCreator);
         log.info("Started");
     }
 
@@ -184,8 +187,7 @@
     @Override
     public <K, V> ConsistentMultimapBuilder<K, V> consistentMultimapBuilder() {
         checkPermission(STORAGE_WRITE);
-        return new DefaultConsistentMultimapBuilder<K, V>(
-                federatedPrimitiveCreator);
+        return new DefaultConsistentMultimapBuilder<>(federatedPrimitiveCreator);
     }
 
     @Override
@@ -241,31 +243,47 @@
     }
 
     @Override
+    public AsyncAtomicCounter getAsyncAtomicCounter(String name) {
+        checkPermission(STORAGE_WRITE);
+        return primitiveManager.getAsyncAtomicCounter(name);
+    }
+
+    @Override
+    public AsyncAtomicIdGenerator getAsyncAtomicIdGenerator(String name) {
+        checkPermission(STORAGE_WRITE);
+        return primitiveManager.getAsyncAtomicIdGenerator(name);
+    }
+
+    @Override
     public <E> WorkQueue<E> getWorkQueue(String name, Serializer serializer) {
         checkPermission(STORAGE_WRITE);
-        return federatedPrimitiveCreator.newWorkQueue(name, serializer);
+        return primitiveManager.getWorkQueue(name, serializer);
     }
 
     @Override
     public <V> AsyncDocumentTree<V> getDocumentTree(String name, Serializer serializer) {
         checkPermission(STORAGE_WRITE);
-        return federatedPrimitiveCreator.newAsyncDocumentTree(name, serializer);
+        return primitiveManager.getDocumentTree(name, serializer);
     }
 
     @Override
     public <K, V> AsyncConsistentMultimap<K, V> getAsyncSetMultimap(
             String name, Serializer serializer) {
         checkPermission(STORAGE_WRITE);
-        return federatedPrimitiveCreator.newAsyncConsistentSetMultimap(name,
-                                                                serializer);
+        return primitiveManager.getAsyncSetMultimap(name, serializer);
     }
 
     @Override
     public <V> AsyncConsistentTreeMap<V> getAsyncTreeMap(
             String name, Serializer serializer) {
         checkPermission(STORAGE_WRITE);
-        return federatedPrimitiveCreator.newAsyncConsistentTreeMap(name,
-                                                                   serializer);
+        return primitiveManager.getAsyncTreeMap(name, serializer);
+    }
+
+    @Override
+    public <T> Topic<T> getTopic(String name, Serializer serializer) {
+        checkPermission(STORAGE_WRITE);
+        return primitiveManager.getTopic(name, serializer);
     }
 
     @Override
@@ -315,13 +333,4 @@
                     return new MapInfo(name, map.size());
         }).collect(Collectors.toList());
     }
-
-    @Override
-    public <T> Topic<T> getTopic(String name, Serializer serializer) {
-        AsyncAtomicValue<T> atomicValue = this.<T>atomicValueBuilder()
-                                              .withName("topic-" + name)
-                                              .withSerializer(serializer)
-                                              .build();
-        return new DefaultDistributedTopic<>(atomicValue);
-    }
 }
diff --git a/protocols/pcep/server/ctl/src/test/java/org/onosproject/pcelabelstore/util/StorageServiceAdapter.java b/protocols/pcep/server/ctl/src/test/java/org/onosproject/pcelabelstore/util/StorageServiceAdapter.java
index 4ba8a2c..5c38e27 100644
--- a/protocols/pcep/server/ctl/src/test/java/org/onosproject/pcelabelstore/util/StorageServiceAdapter.java
+++ b/protocols/pcep/server/ctl/src/test/java/org/onosproject/pcelabelstore/util/StorageServiceAdapter.java
@@ -15,6 +15,8 @@
  */
 package org.onosproject.pcelabelstore.util;
 
+import org.onosproject.store.service.AsyncAtomicCounter;
+import org.onosproject.store.service.AsyncAtomicIdGenerator;
 import org.onosproject.store.service.AsyncDocumentTree;
 import org.onosproject.store.service.AsyncConsistentMultimap;
 import org.onosproject.store.service.AsyncConsistentTreeMap;
@@ -91,6 +93,16 @@
     }
 
     @Override
+    public AsyncAtomicCounter getAsyncAtomicCounter(String name) {
+        return null;
+    }
+
+    @Override
+    public AsyncAtomicIdGenerator getAsyncAtomicIdGenerator(String name) {
+        return null;
+    }
+
+    @Override
     public <E> WorkQueue<E> getWorkQueue(String name, Serializer serializer) {
         return null;
     }