Extract common ID generation logic using IdBlockAllocator

- Define IdGenerator<T> interface
- Implement AbstractIdBlockAllocatorBasedIdGenerator<T>, which
  has the common logic for the existing IntentId, FlowId, MatchActionId,
  and MatchActionOperationsId generator implementations.

Change-Id: I7aeea249df1710719760ed477bffe62853577e0f
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionIdGenerator.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionIdGenerator.java
deleted file mode 100644
index 4f36d7c..0000000
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionIdGenerator.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package net.onrc.onos.core.matchaction;
-/**
-  * A generator of MatchActionId.
-  */
-public interface MatchActionIdGenerator {
-    /**
-      * Generates a globally unique MatchActionId instance.
-      */
-    MatchActionId getNewId();
-}
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionIdGeneratorWithIdBlockAllocator.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionIdGeneratorWithIdBlockAllocator.java
index 14a09c2..ef255d0 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionIdGeneratorWithIdBlockAllocator.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionIdGeneratorWithIdBlockAllocator.java
@@ -1,19 +1,13 @@
 package net.onrc.onos.core.matchaction;
 
-import net.onrc.onos.core.util.IdBlock;
+import net.onrc.onos.core.util.AbstractBlockAllocatorBasedIdGenerator;
 import net.onrc.onos.core.util.IdBlockAllocator;
-import net.onrc.onos.core.util.UnavailableIdException;
-
-import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Generates a global unique MatchActionId.
  */
 public class MatchActionIdGeneratorWithIdBlockAllocator
-        implements MatchActionIdGenerator {
-
-    private final IdBlockAllocator allocator;
-    private IdBlock idBlock;
+        extends AbstractBlockAllocatorBasedIdGenerator<MatchActionId> {
 
     /**
      * Creates a FlowId generator instance using specified ID block allocator.
@@ -21,17 +15,11 @@
      * @param allocator the ID block allocator to be used
      */
     public MatchActionIdGeneratorWithIdBlockAllocator(IdBlockAllocator allocator) {
-        this.allocator = checkNotNull(allocator);
-        this.idBlock = allocator.allocateUniqueIdBlock();
+        super(allocator);
     }
 
     @Override
-    public synchronized MatchActionId getNewId() {
-        try {
-            return new MatchActionId(idBlock.getNextId());
-        } catch (UnavailableIdException e) {
-            idBlock = allocator.allocateUniqueIdBlock();
-            return new MatchActionId(idBlock.getNextId());
-        }
+    protected MatchActionId convertFrom(long value) {
+        return new MatchActionId(value);
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionModule.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionModule.java
index 78e528c..6ae5d5e 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionModule.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionModule.java
@@ -7,6 +7,7 @@
 import java.util.Set;
 
 import net.onrc.onos.api.flowmanager.ConflictDetectionPolicy;
+import net.onrc.onos.core.util.IdGenerator;
 
 /**
  * Manages Match-Action entries.
@@ -56,14 +57,14 @@
     }
 
     @Override
-    public MatchActionIdGenerator getMatchActionIdGenerator() {
+    public IdGenerator<MatchActionId> getMatchActionIdGenerator() {
         // TODO Auto-generated method stub
         // use MatchActionIdGeneratorWithIdBlockAllocator.
         return null;
     }
 
     @Override
-    public MatchActionOperationsIdGenerator getMatchActionOperationsIdGenerator() {
+    public IdGenerator<MatchActionOperationsId> getMatchActionOperationsIdGenerator() {
         // TODO Auto-generated method stub
         // use MatchActionOperationsIdGeneratorWithIdBlockAllocator.
         return null;
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsIdGenerator.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsIdGenerator.java
deleted file mode 100644
index 3274224..0000000
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsIdGenerator.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package net.onrc.onos.core.matchaction;
-/**
-  * A generator of MatchActionId.
-  */
-public interface MatchActionOperationsIdGenerator {
-    /**
-      * Generates a globally unique MatchActionId instance.
-      */
-    MatchActionOperationsId getNewId();
-}
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsIdGeneratorWithIdBlockAllocator.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsIdGeneratorWithIdBlockAllocator.java
index d1d5240..fd9efdc 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsIdGeneratorWithIdBlockAllocator.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsIdGeneratorWithIdBlockAllocator.java
@@ -1,37 +1,26 @@
 package net.onrc.onos.core.matchaction;
 
-import net.onrc.onos.core.util.IdBlock;
+import net.onrc.onos.core.util.AbstractBlockAllocatorBasedIdGenerator;
 import net.onrc.onos.core.util.IdBlockAllocator;
-import net.onrc.onos.core.util.UnavailableIdException;
 
-import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Generates a global unique MatchActionIdId.
  */
 public class MatchActionOperationsIdGeneratorWithIdBlockAllocator
-        implements MatchActionOperationsIdGenerator {
+        extends AbstractBlockAllocatorBasedIdGenerator<MatchActionOperationsId> {
 
-        private final IdBlockAllocator allocator;
-        private IdBlock idBlock;
+    /**
+     * Creates a FlowId generator instance using specified ID block allocator.
+     *
+     * @param allocator the ID block allocator to be used
+     */
+    public MatchActionOperationsIdGeneratorWithIdBlockAllocator(IdBlockAllocator allocator) {
+        super(allocator);
+    }
 
-        /**
-          * Creates a FlowId generator instance using specified ID block allocator.
-          *
-          * @param allocator the ID block allocator to be used
-          */
-        public MatchActionOperationsIdGeneratorWithIdBlockAllocator(IdBlockAllocator allocator) {
-            this.allocator = checkNotNull(allocator);
-            this.idBlock = allocator.allocateUniqueIdBlock();
-        }
-
-        @Override
-        public synchronized MatchActionOperationsId getNewId() {
-            try {
-                return new MatchActionOperationsId(idBlock.getNextId());
-            } catch (UnavailableIdException e) {
-                idBlock = allocator.allocateUniqueIdBlock();
-                return new MatchActionOperationsId(idBlock.getNextId());
-            }
-        }
+    @Override
+    protected MatchActionOperationsId convertFrom(long value) {
+        return new MatchActionOperationsId(value);
+    }
 }
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionService.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionService.java
index 161ed91..fa6b34f 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionService.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionService.java
@@ -4,6 +4,7 @@
 import java.util.Set;
 
 import net.onrc.onos.api.flowmanager.ConflictDetectionPolicy;
+import net.onrc.onos.core.util.IdGenerator;
 
 /**
  * An interface for the match-action service.
@@ -51,14 +52,14 @@
      *
      * @return the ID generator for MatchActionId
      */
-    MatchActionIdGenerator getMatchActionIdGenerator();
+    IdGenerator<MatchActionId> getMatchActionIdGenerator();
 
     /**
      * Gets the ID generator for MatchActionOperationsId.
      *
      * @return the ID generator for MatchActionOperationsId
      */
-    MatchActionOperationsIdGenerator getMatchActionOperationsIdGenerator();
+    IdGenerator<MatchActionOperationsId> getMatchActionOperationsIdGenerator();
 
     /**
      * Adds event listener to this service.