[ONOS-4014] Refactor *Id classes to extend from Identifier class

- Refactor all of *Id classes in apps package

Change-Id: I31fafbf7f15aee3a1b3b37b7c281b3f99eae0883
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/BindingHostId.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/BindingHostId.java
index 7dca32d..b2e23ee 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/BindingHostId.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/BindingHostId.java
@@ -15,17 +15,14 @@
  */
 package org.onosproject.vtnrsc;
 
+import org.onlab.util.Identifier;
+
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import java.util.Objects;
-
-public final class BindingHostId {
-    private final String bindingHostId;
-
+public final class BindingHostId extends Identifier<String> {
     // Public construction is prohibited
     private BindingHostId(String bindingHostId) {
-        checkNotNull(bindingHostId, "BindingHosttId cannot be null");
-        this.bindingHostId = bindingHostId;
+        super(checkNotNull(bindingHostId, "BindingHosttId cannot be null"));
     }
 
     /**
@@ -44,29 +41,6 @@
      * @return the bindingHostId identifier
      */
     public String bindingHostId() {
-        return bindingHostId;
-    }
-
-    @Override
-    public int hashCode() {
-        return bindingHostId.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof BindingHostId) {
-            final BindingHostId that = (BindingHostId) obj;
-            return this.getClass() == that.getClass()
-                    && Objects.equals(this.bindingHostId, that.bindingHostId);
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return bindingHostId;
+        return identifier;
     }
 }
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/FloatingIpId.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/FloatingIpId.java
index 1b48c7d..0fc3c05 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/FloatingIpId.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/FloatingIpId.java
@@ -15,21 +15,19 @@
  */
 package org.onosproject.vtnrsc;
 
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
+import org.onlab.util.Identifier;
 
-import java.util.Objects;
 import java.util.UUID;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 /**
  * Immutable representation of a floating IP identifier.
  */
-public final class FloatingIpId {
-    private final UUID floatingIpId;
-
+public final class FloatingIpId extends Identifier<UUID> {
     // Public construction is prohibited
     private FloatingIpId(UUID floatingIpId) {
-        this.floatingIpId = checkNotNull(floatingIpId, "floatingIpId cannot be null");
+        super(checkNotNull(floatingIpId, "floatingIpId cannot be null"));
     }
 
     /**
@@ -58,28 +56,6 @@
      * @return the floating IP identifier
      */
     public UUID floatingIpId() {
-        return floatingIpId;
-    }
-
-    @Override
-    public int hashCode() {
-        return floatingIpId.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof FloatingIpId) {
-            final FloatingIpId that = (FloatingIpId) obj;
-            return Objects.equals(this.floatingIpId, that.floatingIpId);
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this).add("floatingIpId", floatingIpId).toString();
+        return identifier;
     }
 }
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/FlowClassifierId.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/FlowClassifierId.java
index df180eb..cb0f2e6 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/FlowClassifierId.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/FlowClassifierId.java
@@ -15,28 +15,23 @@
  */
 package org.onosproject.vtnrsc;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.base.MoreObjects;
+import org.onlab.util.Identifier;
 
 import java.util.UUID;
-import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Flow classification identifier.
  */
-public final class FlowClassifierId {
-
-    private final UUID flowClassifierId;
-
+public final class FlowClassifierId extends Identifier<UUID> {
     /**
      * Constructor to create flow classifier id.
      *
      * @param flowClassifierId flow classifier id.
      */
     private FlowClassifierId(final UUID flowClassifierId) {
-        checkNotNull(flowClassifierId, "Flow classifier id can not be null");
-        this.flowClassifierId = flowClassifierId;
+        super(checkNotNull(flowClassifierId, "Flow classifier id can not be null"));
     }
 
     /**
@@ -65,30 +60,6 @@
      * @return flow classifier id.
      */
     public UUID value() {
-        return flowClassifierId;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(this.flowClassifierId);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof FlowClassifierId) {
-            final FlowClassifierId other = (FlowClassifierId) obj;
-            return Objects.equals(this.flowClassifierId, other.flowClassifierId);
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("FlowClassifierId", flowClassifierId)
-                .toString();
+        return identifier;
     }
 }
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/LoadBalanceId.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/LoadBalanceId.java
index 83d1df2..1273023 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/LoadBalanceId.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/LoadBalanceId.java
@@ -15,19 +15,16 @@
  */
 package org.onosproject.vtnrsc;
 
+import org.onlab.util.Identifier;
+
 import static com.google.common.base.Preconditions.checkArgument;
 
-import java.util.Objects;
-
-import com.google.common.base.MoreObjects;
-
 /*
  * Representation of 5 bit load balance identifier for a service function
  */
-public final class LoadBalanceId {
+public final class LoadBalanceId extends Identifier<Byte> {
 
     private static final byte MAX_ID = 0x1F;
-    private final byte loadBalanceId;
 
     /**
      * Default constructor.
@@ -35,8 +32,8 @@
      * @param loadBalanceId service function chain path's load balance identifier
      */
     private LoadBalanceId(byte loadBalanceId) {
+        super(loadBalanceId);
         checkArgument(loadBalanceId <= MAX_ID, "Load balance id should not be more than 5 bit identifier");
-        this.loadBalanceId = (loadBalanceId);
     }
 
     /**
@@ -56,31 +53,6 @@
      * @return loadBalanceId
      */
     public byte loadBalanceId() {
-        return loadBalanceId;
-    }
-
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(loadBalanceId);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof LoadBalanceId)) {
-            return false;
-        }
-        final LoadBalanceId other = (LoadBalanceId) obj;
-        return   Objects.equals(this.loadBalanceId, other.loadBalanceId);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("loadBalanceId", loadBalanceId)
-                .toString();
+        return identifier;
     }
 }
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortChainId.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortChainId.java
index a42a700..a959b53 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortChainId.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortChainId.java
@@ -15,27 +15,23 @@
  */
 package org.onosproject.vtnrsc;
 
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
+import org.onlab.util.Identifier;
 
 import java.util.UUID;
-import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Representation of a Port Chain ID.
  */
-public final class PortChainId {
-
-    private final UUID portChainId;
-
+public final class PortChainId extends Identifier<UUID> {
     /**
      * Private constructor for port chain id.
      *
      * @param id UUID id of port chain
      */
     private PortChainId(UUID id) {
-        checkNotNull(id, "Port chain id can not be null");
-        this.portChainId = id;
+        super(checkNotNull(id, "Port chain id can not be null"));
     }
 
     /**
@@ -64,28 +60,6 @@
      * @return port chain id
      */
     public UUID value() {
-        return portChainId;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof PortChainId) {
-            final PortChainId other = (PortChainId) obj;
-            return Objects.equals(this.portChainId, other.portChainId);
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(this.portChainId);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this).add("portChainId", portChainId).toString();
+        return identifier;
     }
 }
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortPairGroupId.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortPairGroupId.java
index a52a2bb..93ba2b4 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortPairGroupId.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortPairGroupId.java
@@ -15,27 +15,23 @@
  */
 package org.onosproject.vtnrsc;
 
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
+import org.onlab.util.Identifier;
 
 import java.util.UUID;
-import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Representation of a Port Pair Group ID.
  */
-public final class PortPairGroupId {
-
-    private final UUID portPairGroupId;
-
+public final class PortPairGroupId extends Identifier<UUID> {
     /**
      * Private constructor for port pair group id.
      *
      * @param id UUID id of port pair group
      */
     private PortPairGroupId(UUID id) {
-        checkNotNull(id, "Port pair group id can not be null");
-        this.portPairGroupId = id;
+        super(checkNotNull(id, "Port pair group id can not be null"));
     }
 
     /**
@@ -64,29 +60,6 @@
      * @return port pair group id
      */
     public UUID value() {
-        return portPairGroupId;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof PortPairGroupId) {
-            final PortPairGroupId other = (PortPairGroupId) obj;
-            return Objects.equals(this.portPairGroupId, other.portPairGroupId);
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(this.portPairGroupId);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this).add("portPairGroupId", portPairGroupId)
-                .toString();
+        return identifier;
     }
 }
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortPairId.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortPairId.java
index 1f45e80..9a2ad9a 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortPairId.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortPairId.java
@@ -15,27 +15,23 @@
  */
 package org.onosproject.vtnrsc;
 
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
+import org.onlab.util.Identifier;
 
 import java.util.UUID;
-import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Representation of a Port Pair ID.
  */
-public final class PortPairId {
-
-    private final UUID portPairId;
-
+public final class PortPairId extends Identifier<UUID> {
     /**
      * Private constructor for port pair id.
      *
      * @param id UUID id of port pair
      */
     private PortPairId(UUID id) {
-        checkNotNull(id, "Port chain id can not be null");
-        this.portPairId = id;
+        super(checkNotNull(id, "Port chain id can not be null"));
     }
 
     /**
@@ -64,30 +60,6 @@
      * @return port pair id
      */
     public UUID value() {
-        return portPairId;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof PortPairId) {
-            final PortPairId other = (PortPairId) obj;
-            return Objects.equals(this.portPairId, other.portPairId);
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(this.portPairId);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this)
-                .add("portPairId", portPairId)
-                .toString();
+        return identifier;
     }
 }
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/RouterId.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/RouterId.java
index d396c0d..2f77517 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/RouterId.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/RouterId.java
@@ -15,22 +15,17 @@
  */
 package org.onosproject.vtnrsc;
 
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
+import org.onlab.util.Identifier;
 
-import java.util.Objects;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Immutable representation of a router identifier.
  */
-public final class RouterId {
-
-    private final String routerId;
-
+public final class RouterId extends Identifier<String> {
     // Public construction is prohibited
     private RouterId(String routerId) {
-        checkNotNull(routerId, "routerId cannot be null");
-        this.routerId = routerId;
+        super(checkNotNull(routerId, "routerId cannot be null"));
     }
 
     /**
@@ -49,29 +44,7 @@
      * @return the router identifier
      */
     public String routerId() {
-        return routerId;
-    }
-
-    @Override
-    public int hashCode() {
-        return routerId.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof RouterId) {
-            final RouterId that = (RouterId) obj;
-            return Objects.equals(this.routerId, that.routerId);
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this).add("routerId", routerId).toString();
+        return identifier;
     }
 }
 
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/SegmentationId.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/SegmentationId.java
index 651ebd8..7ca9db7 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/SegmentationId.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/SegmentationId.java
@@ -15,21 +15,17 @@
  */
 package org.onosproject.vtnrsc;
 
-import java.util.Objects;
+import org.onlab.util.Identifier;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Immutable representation of a Segmentation identifier.
  */
-public final class SegmentationId {
-
-    private final String segmentationId;
-
+public final class SegmentationId extends Identifier<String> {
     // Public construction is prohibited
     private SegmentationId(String segmentationId) {
-        checkNotNull(segmentationId, "SegmentationId cannot be null");
-        this.segmentationId = segmentationId;
+        super(checkNotNull(segmentationId, "SegmentationId cannot be null"));
     }
 
     /**
@@ -48,30 +44,6 @@
      * @return segmentationId
      */
     public String segmentationId() {
-        return segmentationId;
+        return identifier;
     }
-
-    @Override
-    public int hashCode() {
-        return segmentationId.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof SegmentationId) {
-            final SegmentationId that = (SegmentationId) obj;
-            return this.getClass() == that.getClass()
-                    && Objects.equals(this.segmentationId, that.segmentationId);
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return segmentationId;
-    }
-
 }
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/SubnetId.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/SubnetId.java
index eb93d15..64ae0c2 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/SubnetId.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/SubnetId.java
@@ -15,21 +15,17 @@
  */
 package org.onosproject.vtnrsc;
 
-import static com.google.common.base.Preconditions.checkNotNull;
+import org.onlab.util.Identifier;
 
-import java.util.Objects;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Immutable representation of a subnet identifier.
  */
-public final class SubnetId {
-
-    private final String subnetId;
-
+public final class SubnetId extends Identifier<String> {
     // Public construction is prohibited
     private SubnetId(String subnetId) {
-        checkNotNull(subnetId, "SubnetId cannot be null");
-        this.subnetId = subnetId;
+        super(checkNotNull(subnetId, "SubnetId cannot be null"));
     }
 
     /**
@@ -48,29 +44,6 @@
      * @return the subnet identifier
      */
     public String subnetId() {
-        return subnetId;
-    }
-
-    @Override
-    public int hashCode() {
-        return subnetId.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof SubnetId) {
-            final SubnetId that = (SubnetId) obj;
-            return this.getClass() == that.getClass()
-                    && Objects.equals(this.subnetId, that.subnetId);
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return subnetId;
+        return identifier;
     }
 }
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/TenantId.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/TenantId.java
index 0e7c941..cd80b26 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/TenantId.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/TenantId.java
@@ -15,20 +15,17 @@
  */
 package org.onosproject.vtnrsc;
 
-import java.util.Objects;
+import org.onlab.util.Identifier;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Immutable representation of a tenant identifier.
  */
-public final class TenantId {
-
-    private final String tenantId;
-
+public final class TenantId extends Identifier<String> {
     // Public construction is prohibited
     private TenantId(String tenantId) {
-        this.tenantId = tenantId;
+        super(tenantId);
     }
 
     /**
@@ -38,7 +35,7 @@
      * @return TenantId
      */
     public static TenantId tenantId(String tenantid) {
-        checkNotNull(tenantid, "Tenantid can not be null");
+        checkNotNull(tenantid, "Tenant id can not be null");
         return new TenantId(tenantid);
     }
 
@@ -48,30 +45,6 @@
      * @return the tenant identifier
      */
     public String tenantId() {
-        return tenantId;
+        return identifier;
     }
-
-    @Override
-    public int hashCode() {
-        return tenantId.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof TenantId) {
-            final TenantId that = (TenantId) obj;
-            return this.getClass() == that.getClass()
-                    && Objects.equals(this.tenantId, that.tenantId);
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return tenantId;
-    }
-
 }
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/TenantNetworkId.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/TenantNetworkId.java
index 8680d28..0197533 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/TenantNetworkId.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/TenantNetworkId.java
@@ -15,19 +15,17 @@
  */
 package org.onosproject.vtnrsc;
 
-import java.util.Objects;
+import org.onlab.util.Identifier;
+
 import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Immutable representation of a tenantNetwork identity.
  */
-public final class TenantNetworkId {
-
-    private final String networkId;
-
+public final class TenantNetworkId extends Identifier<String> {
     // Public construction is prohibited
     private TenantNetworkId(String networkId) {
-        this.networkId = networkId;
+        super(networkId);
     }
 
     /**
@@ -47,30 +45,6 @@
      * @return the tenantNetwork identifier
      */
     public String networkId() {
-        return networkId;
+        return identifier;
     }
-
-    @Override
-    public int hashCode() {
-        return networkId.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof TenantNetworkId) {
-            final TenantNetworkId that = (TenantNetworkId) obj;
-            return this.getClass() == that.getClass()
-                    && Objects.equals(this.networkId, that.networkId);
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return networkId;
-    }
-
 }
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/VirtualPortId.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/VirtualPortId.java
index a386348..5496ad3 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/VirtualPortId.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/VirtualPortId.java
@@ -15,23 +15,21 @@
  */
 package org.onosproject.vtnrsc;
 
-import static com.google.common.base.Preconditions.checkNotNull;
+import org.onlab.util.Identifier;
 
-import java.util.Objects;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Immutable representation of a virtual port identifier.
  */
-public final class VirtualPortId {
-    private final String portId;
+public final class VirtualPortId extends Identifier<String> {
     // Public construction is prohibited
     private VirtualPortId(String virtualPortId) {
-        checkNotNull(virtualPortId, "VirtualPortId cannot be null");
-        this.portId = virtualPortId;
+        super(checkNotNull(virtualPortId, "VirtualPortId cannot be null"));
     }
 
     public String portId() {
-        return portId;
+        return identifier;
     }
 
     /**
@@ -43,28 +41,4 @@
     public static VirtualPortId portId(String portId) {
         return new VirtualPortId(portId);
     }
-
-    @Override
-    public int hashCode() {
-        return portId.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof VirtualPortId) {
-            final VirtualPortId that = (VirtualPortId) obj;
-            return this.getClass() == that.getClass()
-                    && Objects.equals(this.portId, that.portId);
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return portId;
-    }
-
 }