Changing Intent Ids to use explicit id assignment

Change-Id: I5a4bff87842c37a869e7691b353529eaefc929db
diff --git a/core/net/src/main/java/org/onlab/onos/core/impl/BlockAllocatorBasedIdGenerator.java b/core/net/src/main/java/org/onlab/onos/core/impl/BlockAllocatorBasedIdGenerator.java
new file mode 100644
index 0000000..e231394
--- /dev/null
+++ b/core/net/src/main/java/org/onlab/onos/core/impl/BlockAllocatorBasedIdGenerator.java
@@ -0,0 +1,36 @@
+package org.onlab.onos.core.impl;
+
+import org.onlab.onos.core.IdBlock;
+import org.onlab.onos.core.IdGenerator;
+import org.onlab.onos.core.UnavailableIdException;
+
+/**
+ * Base class of {@link IdGenerator} implementations which use {@link IdBlockAllocator} as
+ * backend.
+ */
+public class BlockAllocatorBasedIdGenerator implements IdGenerator {
+    protected final IdBlockAllocator allocator;
+    protected IdBlock idBlock;
+
+    /**
+     * Constructs an ID generator which use {@link IdBlockAllocator} as backend.
+     *
+     * @param allocator
+     */
+    protected BlockAllocatorBasedIdGenerator(IdBlockAllocator allocator) {
+        this.allocator = allocator;
+        this.idBlock = allocator.allocateUniqueIdBlock();
+    }
+
+    @Override
+    public long getNewId() {
+        try {
+            return idBlock.getNextId();
+        } catch (UnavailableIdException e) {
+            synchronized (allocator) {
+                idBlock = allocator.allocateUniqueIdBlock();
+                return idBlock.getNextId();
+            }
+        }
+    }
+}