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/api/flowmanager/Flow.java b/src/main/java/net/onrc/onos/api/flowmanager/Flow.java
index 8608adb..65dc00e 100644
--- a/src/main/java/net/onrc/onos/api/flowmanager/Flow.java
+++ b/src/main/java/net/onrc/onos/api/flowmanager/Flow.java
@@ -5,10 +5,11 @@
 import java.util.List;
 
 import net.onrc.onos.api.batchoperation.BatchOperationTarget;
-import net.onrc.onos.core.matchaction.MatchActionIdGenerator;
+import net.onrc.onos.core.matchaction.MatchActionId;
 import net.onrc.onos.core.matchaction.MatchActionOperations;
-import net.onrc.onos.core.matchaction.MatchActionOperationsIdGenerator;
+import net.onrc.onos.core.matchaction.MatchActionOperationsId;
 import net.onrc.onos.core.matchaction.match.Match;
+import net.onrc.onos.core.util.IdGenerator;
 
 /**
  * An abstract class to define flow object which is managed by
@@ -67,8 +68,8 @@
      */
     public abstract List<MatchActionOperations> compile(
             FlowBatchOperation.Operator op,
-            MatchActionIdGenerator maIdGenerator,
-            MatchActionOperationsIdGenerator maoIdGenerator);
+            IdGenerator<MatchActionId> maIdGenerator,
+            IdGenerator<MatchActionOperationsId> maoIdGenerator);
 
     /**
      * Generates a hash code using the FlowId.
diff --git a/src/main/java/net/onrc/onos/api/flowmanager/FlowId.java b/src/main/java/net/onrc/onos/api/flowmanager/FlowId.java
index 3e94c7b..3bf9a30 100644
--- a/src/main/java/net/onrc/onos/api/flowmanager/FlowId.java
+++ b/src/main/java/net/onrc/onos/api/flowmanager/FlowId.java
@@ -26,7 +26,8 @@
     /**
      * Creates new instance with string ID.
      * <p>
-     * This FlowId instance should be generated with {@link FlowIdGenerator}.
+     * This FlowId instance should be generated with
+     * {@link net.onrc.onos.core.util.IdGenerator} of flow ID.
      *
      * @param id String representation of the ID.
      */
diff --git a/src/main/java/net/onrc/onos/api/flowmanager/FlowIdGenerator.java b/src/main/java/net/onrc/onos/api/flowmanager/FlowIdGenerator.java
deleted file mode 100644
index 9b85e22..0000000
--- a/src/main/java/net/onrc/onos/api/flowmanager/FlowIdGenerator.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package net.onrc.onos.api.flowmanager;
-
-/**
- * An generator of {@link FlowId}.
- */
-public interface FlowIdGenerator {
-    /**
-     * Generates a global unique {@link FlowId} instance.
-     *
-     * @return a global unique {@link FlowId} instance.
-     */
-    FlowId getNewId();
-}
diff --git a/src/main/java/net/onrc/onos/api/flowmanager/FlowManagerService.java b/src/main/java/net/onrc/onos/api/flowmanager/FlowManagerService.java
index 93a4e6c..4c19cbd 100644
--- a/src/main/java/net/onrc/onos/api/flowmanager/FlowManagerService.java
+++ b/src/main/java/net/onrc/onos/api/flowmanager/FlowManagerService.java
@@ -1,5 +1,7 @@
 package net.onrc.onos.api.flowmanager;
 
+import net.onrc.onos.core.util.IdGenerator;
+
 import java.util.Collection;
 
 /**
@@ -65,7 +67,7 @@
      * Gets ID generator for Flow objects.
      * @return the ID generator for Flow objects
      */
-    FlowIdGenerator getFlowIdGenerator();
+    IdGenerator<FlowId> getFlowIdGenerator();
 
     /**
      * Sets a conflict detection policy.
diff --git a/src/main/java/net/onrc/onos/api/flowmanager/OpticalPathFlow.java b/src/main/java/net/onrc/onos/api/flowmanager/OpticalPathFlow.java
index 51dce43..a352f05 100644
--- a/src/main/java/net/onrc/onos/api/flowmanager/OpticalPathFlow.java
+++ b/src/main/java/net/onrc/onos/api/flowmanager/OpticalPathFlow.java
@@ -3,12 +3,13 @@
 import java.util.List;
 
 import net.onrc.onos.api.flowmanager.FlowBatchOperation.Operator;
-import net.onrc.onos.core.matchaction.MatchActionIdGenerator;
+import net.onrc.onos.core.matchaction.MatchActionId;
 import net.onrc.onos.core.matchaction.MatchActionOperations;
-import net.onrc.onos.core.matchaction.MatchActionOperationsIdGenerator;
+import net.onrc.onos.core.matchaction.MatchActionOperationsId;
 import net.onrc.onos.core.matchaction.action.Action;
 import net.onrc.onos.core.matchaction.match.PacketMatch;
 import net.onrc.onos.core.matchaction.match.PacketMatchBuilder;
+import net.onrc.onos.core.util.IdGenerator;
 import net.onrc.onos.core.util.PortNumber;
 
 /**
@@ -67,8 +68,8 @@
 
     @Override
     public List<MatchActionOperations> compile(Operator op,
-            MatchActionIdGenerator maIdGenerator,
-            MatchActionOperationsIdGenerator maoIdGenerator) {
+            IdGenerator<MatchActionId> maIdGenerator,
+            IdGenerator<MatchActionOperationsId> maoIdGenerator) {
         // TODO Auto-generated method stub
         return null;
     }
diff --git a/src/main/java/net/onrc/onos/api/flowmanager/PacketPathFlow.java b/src/main/java/net/onrc/onos/api/flowmanager/PacketPathFlow.java
index 37820fb..34d6776 100644
--- a/src/main/java/net/onrc/onos/api/flowmanager/PacketPathFlow.java
+++ b/src/main/java/net/onrc/onos/api/flowmanager/PacketPathFlow.java
@@ -10,13 +10,14 @@
 
 import net.onrc.onos.api.flowmanager.FlowBatchOperation.Operator;
 import net.onrc.onos.core.matchaction.MatchAction;
-import net.onrc.onos.core.matchaction.MatchActionIdGenerator;
+import net.onrc.onos.core.matchaction.MatchActionId;
 import net.onrc.onos.core.matchaction.MatchActionOperationEntry;
 import net.onrc.onos.core.matchaction.MatchActionOperations;
-import net.onrc.onos.core.matchaction.MatchActionOperationsIdGenerator;
+import net.onrc.onos.core.matchaction.MatchActionOperationsId;
 import net.onrc.onos.core.matchaction.action.Action;
 import net.onrc.onos.core.matchaction.action.OutputAction;
 import net.onrc.onos.core.matchaction.match.PacketMatch;
+import net.onrc.onos.core.util.IdGenerator;
 import net.onrc.onos.core.util.PortNumber;
 import net.onrc.onos.core.util.SwitchPort;
 
@@ -86,8 +87,8 @@
 
     @Override
     public List<MatchActionOperations> compile(Operator op,
-            MatchActionIdGenerator maIdGenerator,
-            MatchActionOperationsIdGenerator maoIdGenerator) {
+            IdGenerator<MatchActionId> maIdGenerator,
+            IdGenerator<MatchActionOperationsId> maoIdGenerator) {
         switch (op) {
         case ADD:
             return compileAddOperation(maIdGenerator, maoIdGenerator);
@@ -108,7 +109,7 @@
      */
     private MatchAction createNextMatchAction(Iterator<SwitchPort> portIterator,
             Iterator<List<Action>> actionsIterator,
-            MatchActionIdGenerator maIdGenerator) {
+            IdGenerator<MatchActionId> maIdGenerator) {
         if (portIterator == null || actionsIterator == null ||
                 !portIterator.hasNext() || !actionsIterator.hasNext()) {
             return null;
@@ -128,8 +129,8 @@
      * @return the list of {@link MatchActionOperations} objects
      */
     private List<MatchActionOperations> compileAddOperation(
-            MatchActionIdGenerator maIdGenerator,
-            MatchActionOperationsIdGenerator maoIdGenerator) {
+            IdGenerator<MatchActionId> maIdGenerator,
+            IdGenerator<MatchActionOperationsId> maoIdGenerator) {
         Path path = checkNotNull(getPath());
         checkState(path.size() > 0, "Path object has no link.");
 
@@ -183,8 +184,8 @@
      * @return the list of {@link MatchActionOperations} objects
      */
     private List<MatchActionOperations> compileRemoveOperation(
-            MatchActionIdGenerator maIdGenerator,
-            MatchActionOperationsIdGenerator maoIdGenerator) {
+            IdGenerator<MatchActionId> maIdGenerator,
+            IdGenerator<MatchActionOperationsId> maoIdGenerator) {
         // TODO implement it
         throw new UnsupportedOperationException(
                 "REMOVE operation is not implemented yet.");
diff --git a/src/main/java/net/onrc/onos/api/flowmanager/SingleDstTreeFlow.java b/src/main/java/net/onrc/onos/api/flowmanager/SingleDstTreeFlow.java
index 0caef51..d02351b 100644
--- a/src/main/java/net/onrc/onos/api/flowmanager/SingleDstTreeFlow.java
+++ b/src/main/java/net/onrc/onos/api/flowmanager/SingleDstTreeFlow.java
@@ -18,14 +18,15 @@
 
 import net.onrc.onos.api.flowmanager.FlowBatchOperation.Operator;
 import net.onrc.onos.core.matchaction.MatchAction;
-import net.onrc.onos.core.matchaction.MatchActionIdGenerator;
+import net.onrc.onos.core.matchaction.MatchActionId;
 import net.onrc.onos.core.matchaction.MatchActionOperationEntry;
 import net.onrc.onos.core.matchaction.MatchActionOperations;
-import net.onrc.onos.core.matchaction.MatchActionOperationsIdGenerator;
+import net.onrc.onos.core.matchaction.MatchActionOperationsId;
 import net.onrc.onos.core.matchaction.action.Action;
 import net.onrc.onos.core.matchaction.action.OutputAction;
 import net.onrc.onos.core.matchaction.match.PacketMatch;
 import net.onrc.onos.core.util.Dpid;
+import net.onrc.onos.core.util.IdGenerator;
 import net.onrc.onos.core.util.PortNumber;
 import net.onrc.onos.core.util.SwitchPort;
 
@@ -110,8 +111,8 @@
 
     @Override
     public List<MatchActionOperations> compile(Operator op,
-            MatchActionIdGenerator maIdGenerator,
-            MatchActionOperationsIdGenerator maoIdGenerator) {
+            IdGenerator<MatchActionId> maIdGenerator,
+            IdGenerator<MatchActionOperationsId> maoIdGenerator) {
         switch (op) {
         case ADD:
             return compileAddOperation(maIdGenerator, maoIdGenerator);
@@ -123,7 +124,7 @@
     }
 
     private MatchAction createMatchAction(SwitchPort port, List<Action> actions,
-            MatchActionIdGenerator maIdGenerator) {
+            IdGenerator<MatchActionId> maIdGenerator) {
         checkNotNull(port);
         checkNotNull(actions);
 
@@ -145,8 +146,8 @@
             Dpid egressSwitch,
             Map<Dpid, Set<PortNumber>> inPorts,
             Map<Dpid, PortNumber> outPorts,
-            MatchActionIdGenerator maIdGenerator,
-            MatchActionOperationsIdGenerator maoIdGenerator) {
+            IdGenerator<MatchActionId> maIdGenerator,
+            IdGenerator<MatchActionOperationsId> maoIdGenerator) {
         MatchActionOperations firstOps =
                 new MatchActionOperations(maoIdGenerator.getNewId());
         for (Entry<Dpid, Set<PortNumber>> innerSw : inPorts.entrySet()) {
@@ -183,8 +184,8 @@
     private MatchActionOperations generateSecondAddOperations(
             Dpid egressSwitch,
             Map<Dpid, PortNumber> outPorts,
-            MatchActionIdGenerator maIdGenerator,
-            MatchActionOperationsIdGenerator maoIdGenerator) {
+            IdGenerator<MatchActionId> maIdGenerator,
+            IdGenerator<MatchActionOperationsId> maoIdGenerator) {
         MatchActionOperations secondOps =
                 new MatchActionOperations(maoIdGenerator.getNewId());
         for (SwitchPort port : getIngressPorts()) {
@@ -213,8 +214,8 @@
     }
 
     private List<MatchActionOperations> compileAddOperation(
-            MatchActionIdGenerator maIdGenerator,
-            MatchActionOperationsIdGenerator maoIdGenerator) {
+            IdGenerator<MatchActionId> maIdGenerator,
+            IdGenerator<MatchActionOperationsId> maoIdGenerator) {
         checkNotNull(tree);
         checkState(tree.size() > 0, "Tree object has no link.");
 
diff --git a/src/main/java/net/onrc/onos/api/flowmanager/SingleSrcTreeFlow.java b/src/main/java/net/onrc/onos/api/flowmanager/SingleSrcTreeFlow.java
index 3e70f4b..89f1efd 100644
--- a/src/main/java/net/onrc/onos/api/flowmanager/SingleSrcTreeFlow.java
+++ b/src/main/java/net/onrc/onos/api/flowmanager/SingleSrcTreeFlow.java
@@ -6,12 +6,13 @@
 import java.util.Set;
 
 import net.onrc.onos.api.flowmanager.FlowBatchOperation.Operator;
-import net.onrc.onos.core.matchaction.MatchActionIdGenerator;
+import net.onrc.onos.core.matchaction.MatchActionId;
 import net.onrc.onos.core.matchaction.MatchActionOperations;
-import net.onrc.onos.core.matchaction.MatchActionOperationsIdGenerator;
+import net.onrc.onos.core.matchaction.MatchActionOperationsId;
 import net.onrc.onos.core.matchaction.action.OutputAction;
 import net.onrc.onos.core.matchaction.match.PacketMatch;
 import net.onrc.onos.core.util.Dpid;
+import net.onrc.onos.core.util.IdGenerator;
 import net.onrc.onos.core.util.SwitchPort;
 
 import org.apache.commons.lang3.tuple.Pair;
@@ -84,8 +85,8 @@
 
     @Override
     public List<MatchActionOperations> compile(Operator op,
-            MatchActionIdGenerator maIdGenerator,
-            MatchActionOperationsIdGenerator maoIdGenerator) {
+            IdGenerator<MatchActionId> maIdGenerator,
+            IdGenerator<MatchActionOperationsId> maoIdGenerator) {
         // TODO Auto-generated method stub
         return null;
     }
diff --git a/src/main/java/net/onrc/onos/api/newintent/IntentIdGenerator.java b/src/main/java/net/onrc/onos/api/newintent/IntentIdGenerator.java
deleted file mode 100644
index ec75c7b..0000000
--- a/src/main/java/net/onrc/onos/api/newintent/IntentIdGenerator.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package net.onrc.onos.api.newintent;
-
-/**
- * This interface is for generator of IntentId.
- *
- * <p>
- * {@link #getNewId()} generates a globally unique {@link IntentId} instance
- * on each invocation. Application developers should not generate IntentId
- * by themselves. Instead use an implementation of this interface.
- * </p>
- */
-public interface IntentIdGenerator {
-    /**
-     * Generates a globally unique {@link IntentId} instance.
-     *
-     * @return a globally unique {@link IntentId} instance.
-     */
-    public IntentId getNewId();
-}