[ONOS-5916] Add various MappingAddress impl classes with unit tests

Change-Id: Ie373601d1406d161e8071e78cd584e5cc8b8f5af
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMappingKey.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMappingKey.java
index 965767b..a7c3f7f 100644
--- a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMappingKey.java
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMappingKey.java
@@ -15,7 +15,7 @@
  */
 package org.onosproject.mapping;
 
-import org.onosproject.mapping.address.MappingAddress;
+import org.onosproject.mapping.addresses.MappingAddress;
 
 /**
  * Default mapping key implementation.
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMappingValue.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMappingValue.java
index 2575764..d38b782 100644
--- a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMappingValue.java
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMappingValue.java
@@ -15,7 +15,7 @@
  */
 package org.onosproject.mapping;
 
-import org.onosproject.mapping.address.MappingAddress;
+import org.onosproject.mapping.addresses.MappingAddress;
 import org.onosproject.mapping.instructions.MappingInstruction;
 
 import java.util.List;
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingKey.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingKey.java
index cbce738..146fbf9 100644
--- a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingKey.java
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingKey.java
@@ -15,7 +15,7 @@
  */
 package org.onosproject.mapping;
 
-import org.onosproject.mapping.address.MappingAddress;
+import org.onosproject.mapping.addresses.MappingAddress;
 
 /**
  * Abstraction of network mapping key.
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingValue.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingValue.java
index a41d749..07f4594 100644
--- a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingValue.java
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingValue.java
@@ -15,7 +15,7 @@
  */
 package org.onosproject.mapping;
 
-import org.onosproject.mapping.address.MappingAddress;
+import org.onosproject.mapping.addresses.MappingAddress;
 import org.onosproject.mapping.instructions.MappingInstruction;
 
 import java.util.List;
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/ASMappingAddress.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/ASMappingAddress.java
new file mode 100644
index 0000000..b98d790
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/ASMappingAddress.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.mapping.addresses;
+
+import java.util.Objects;
+
+/**
+ * Implementation of AS mapping address.
+ */
+public final class ASMappingAddress implements MappingAddress {
+
+    private final String asNumber;
+
+    /**
+     * Default constructor of ASMappingAddress.
+     *
+     * @param asNumber AS number
+     */
+    ASMappingAddress(String asNumber) {
+        this.asNumber = asNumber;
+    }
+
+    @Override
+    public Type type() {
+        return Type.AS;
+    }
+
+    /**
+     * Obtains AS number.
+     *
+     * @return AS number
+     */
+    public String asNumber() {
+        return this.asNumber;
+    }
+
+    @Override
+    public String toString() {
+        return type().toString() + TYPE_SEPARATOR + asNumber;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type().ordinal(), asNumber);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof ASMappingAddress) {
+            ASMappingAddress that = (ASMappingAddress) obj;
+            return Objects.equals(asNumber, that.asNumber);
+        }
+        return false;
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/DNMappingAddress.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/DNMappingAddress.java
new file mode 100644
index 0000000..320f118
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/DNMappingAddress.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.mapping.addresses;
+
+import java.util.Objects;
+
+/**
+ * Implementation of distinguished name mapping address.
+ */
+public final class DNMappingAddress implements MappingAddress {
+
+    private final String name;
+
+    /**
+     * Default constructor of DNMappingAddress.
+     *
+     * @param name distinguished name
+     */
+    DNMappingAddress(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public Type type() {
+        return Type.DN;
+    }
+
+    /**
+     * Obtains distinguished name.
+     *
+     * @return distinguished name
+     */
+    public String name() {
+        return this.name;
+    }
+
+    @Override
+    public String toString() {
+        return type().toString() + TYPE_SEPARATOR + name;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type().ordinal(), name);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DNMappingAddress) {
+            DNMappingAddress that = (DNMappingAddress) obj;
+            return Objects.equals(name, that.name);
+        }
+        return false;
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/EthMappingAddress.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/EthMappingAddress.java
new file mode 100644
index 0000000..805f92a
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/EthMappingAddress.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.mapping.addresses;
+
+import org.onlab.packet.MacAddress;
+
+import java.util.Objects;
+
+/**
+ * Implementation of MAC mapping address.
+ */
+public final class EthMappingAddress implements MappingAddress {
+    private final MacAddress mac;
+
+    /**
+     * Default constructor of EthMappingAddress.
+     *
+     * @param mac the MAC address to look up
+     */
+    EthMappingAddress(MacAddress mac) {
+        this.mac = mac;
+    }
+
+    @Override
+    public Type type() {
+        return Type.ETH;
+    }
+
+    /**
+     * Obtains the MAC address to look up.
+     *
+     * @return the MAC address to look up
+     */
+    public MacAddress mac() {
+        return this.mac;
+    }
+
+    @Override
+    public String toString() {
+        return type().toString() + TYPE_SEPARATOR + mac;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(Type.ETH, mac);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof EthMappingAddress) {
+            EthMappingAddress that = (EthMappingAddress) obj;
+            return Objects.equals(mac, that.mac);
+        }
+        return false;
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/ExtensionMappingAddress.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/ExtensionMappingAddress.java
new file mode 100644
index 0000000..853fd97
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/ExtensionMappingAddress.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.mapping.addresses;
+
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.flow.criteria.ExtensionSelector;
+
+import java.util.Objects;
+
+/**
+ * Mapping address for implementing extensions.
+ */
+public final class ExtensionMappingAddress implements MappingAddress {
+
+    private final ExtensionSelector extensionSelector;
+    private final DeviceId deviceId;
+
+    /**
+     * Default constructor of ExtensionMappingAddress.
+     *
+     * @param extensionSelector extension selector
+     * @param deviceId          device identifier
+     */
+    public ExtensionMappingAddress(ExtensionSelector extensionSelector, DeviceId deviceId) {
+        this.extensionSelector = extensionSelector;
+        this.deviceId = deviceId;
+    }
+
+    @Override
+    public Type type() {
+        return Type.EXTENSION;
+    }
+
+    /**
+     * Returns the extension selector.
+     *
+     * @return extension selector
+     */
+    public ExtensionSelector extensionSelector() {
+        return extensionSelector;
+    }
+
+    /**
+     * Returns the device identifier.
+     *
+     * @return the device identifier
+     */
+    public DeviceId deviceId() {
+        return deviceId;
+    }
+
+    @Override
+    public String toString() {
+        return type().toString() + TYPE_SEPARATOR + deviceId + "/" + extensionSelector;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type().ordinal(), extensionSelector, deviceId);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof ExtensionMappingAddress) {
+            ExtensionMappingAddress that = (ExtensionMappingAddress) obj;
+            return Objects.equals(extensionSelector, that.extensionSelector) &&
+                    Objects.equals(deviceId, that.deviceId);
+        }
+        return false;
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/IPMappingAddress.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/IPMappingAddress.java
new file mode 100644
index 0000000..89b652a
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/IPMappingAddress.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.mapping.addresses;
+
+import org.onlab.packet.IpPrefix;
+
+import java.util.Objects;
+
+/**
+ * Implementation of IP mapping address.
+ */
+public final class IPMappingAddress implements MappingAddress {
+
+    private final IpPrefix ip;
+    private final Type type;
+
+    /**
+     * Default constructor of IPMappingAddress.
+     *
+     * @param ip   the IP prefix to match. Could be either IPv4 or IPv6
+     * @param type the match type, the type can be one of the following:
+     *             Type.IPV4, Type.IPV6
+     */
+    IPMappingAddress(IpPrefix ip, Type type) {
+        this.ip = ip;
+        this.type = type;
+    }
+
+    @Override
+    public Type type() {
+        return type;
+    }
+
+    /**
+     * Obtains the IP prefix to look up.
+     *
+     * @return the IP prefix to look up
+     */
+    public IpPrefix ip() {
+        return this.ip;
+    }
+
+    @Override
+    public String toString() {
+        return type().toString() + TYPE_SEPARATOR + ip;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type().ordinal(), ip);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof IPMappingAddress) {
+            IPMappingAddress that = (IPMappingAddress) obj;
+            return Objects.equals(ip, that.ip) &&
+                    Objects.equals(type, that.type);
+        }
+        return false;
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/address/MappingAddress.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/MappingAddress.java
similarity index 93%
rename from apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/address/MappingAddress.java
rename to apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/MappingAddress.java
index c1473e9..5c7775b 100644
--- a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/address/MappingAddress.java
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/MappingAddress.java
@@ -13,13 +13,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.mapping.address;
+package org.onosproject.mapping.addresses;
 
 /**
  * Presentation of a single mapping selection.
  */
 public interface MappingAddress {
 
+    String TYPE_SEPARATOR = ":";
+
     /**
      * Types of address to which the mapping criterion may apply.
      */
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/MappingAddresses.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/MappingAddresses.java
new file mode 100644
index 0000000..6683190
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/MappingAddresses.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.mapping.addresses;
+
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.flow.criteria.ExtensionSelector;
+
+/**
+ * Factory class for creating various mapping addresses.
+ */
+public final class MappingAddresses {
+
+    /**
+     * Prevents instantiation from external.
+     */
+    private MappingAddresses() {}
+
+    /**
+     * Creates an ASMappingAddress using the specified value.
+     *
+     * @param asn Autonomous System Number
+     * @return mapping address
+     */
+    public static ASMappingAddress asMappingAddress(String asn) {
+        return new ASMappingAddress(asn);
+    }
+
+    /**
+     * Creates a DNMappingAddress using the specified value.
+     *
+     * @param dn Distinguished Name
+     * @return mapping address
+     */
+    public static DNMappingAddress dnMappingAddress(String dn) {
+        return new DNMappingAddress(dn);
+    }
+
+    /**
+     * Creates an EthMappingAddress using the specified value.
+     *
+     * @param mac MAC address
+     * @return mapping address
+     */
+    public static EthMappingAddress ethMappingAddress(MacAddress mac) {
+        return new EthMappingAddress(mac);
+    }
+
+    /**
+     * Creates an IPv4MappingAddress using the specified value.
+     *
+     * @param ip IP address
+     * @return mapping address
+     */
+    public static IPMappingAddress ipv4MappingAddress(IpPrefix ip) {
+        return new IPMappingAddress(ip, MappingAddress.Type.IPV4);
+    }
+
+    /**
+     * Creates an IPv6MappingAddress using the specified value.
+     *
+     * @param ip IP address
+     * @return mapping address
+     */
+    public static IPMappingAddress ipv6MappingAddress(IpPrefix ip) {
+        return new IPMappingAddress(ip, MappingAddress.Type.IPV6);
+    }
+
+    /**
+     * Creates an ExtensionMappingAddress using the specified value.
+     *
+     * @param selector extension selector
+     * @param deviceId device identifier
+     * @return mapping address
+     */
+    public static ExtensionMappingAddress extension(ExtensionSelector selector,
+                                                    DeviceId deviceId) {
+        return new ExtensionMappingAddress(selector, deviceId);
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/address/package-info.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/package-info.java
similarity index 93%
rename from apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/address/package-info.java
rename to apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/package-info.java
index 8fb2106..fa16171 100644
--- a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/address/package-info.java
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/addresses/package-info.java
@@ -17,4 +17,4 @@
 /**
  * Mapping address package.
  */
-package org.onosproject.mapping.address;
\ No newline at end of file
+package org.onosproject.mapping.addresses;
\ No newline at end of file