Magnesium platform upgrade
[lispflowmapping.git] / mappingservice / lisp-proto / src / main / java / org / opendaylight / lispflowmapping / lisp / util / LispAddressStringifier.java
index 9934937af92c33286acf2a8e7a1098fe43ac9b68..29e2409077818fff41ac68a0df89c26daf0e2916 100644 (file)
@@ -7,8 +7,13 @@
  */
 package org.opendaylight.lispflowmapping.lisp.util;
 
+import com.google.common.io.BaseEncoding;
+import com.google.common.net.InetAddresses;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.UnknownHostException;
 import java.util.List;
-
+import java.util.Set;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SimpleAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
@@ -25,14 +30,18 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.addres
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Mac;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.NoAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePath;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.SourceDestKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.Hop;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.Hop.LrsBits;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePath;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4Binary;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4PrefixBinary;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6Binary;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6PrefixBinary;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.XtrId;
-
-import com.google.common.base.Preconditions;
-import com.google.common.io.BaseEncoding;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Utility class with static methods returning string representations of
@@ -42,14 +51,17 @@ import com.google.common.io.BaseEncoding;
  * @author Lorand Jakab
  *
  */
-public class LispAddressStringifier {
+public final class LispAddressStringifier {
+    protected static final Logger LOG = LoggerFactory.getLogger(LispAddressStringifier.class);
 
     private static final String PREFIX_SEPARATOR = ":";
+
     /*
      * In the unlikely event that a AFI 0 address is used a key, we use a
      * sequence number to ensure uniqueness
      */
     protected static int noAddrSeq = 0;
+
     /*
      * There are three possible destinations for rendering an address as a
      * string:
@@ -67,26 +79,48 @@ public class LispAddressStringifier {
         URL;
     }
 
+    // Utility class, should not be instantiated
+    private LispAddressStringifier() {
+    }
+
     public static String getString(LispAddress lispAddress) {
         return getAddrString(Destination.USER, lispAddress);
     }
 
-    public static String getURIString(LispAddress lispAddress) {
-        return getAddrString(Destination.URI, lispAddress);
+    public static String getString(Set<Eid> eids) {
+        StringBuilder sb = new StringBuilder("{");
+        boolean first = true;
+        for (Eid eid : eids) {
+            if (!first) {
+                sb.append(", ");
+            }
+            sb.append(getString(eid));
+            first = false;
+        }
+        sb.append("}");
+        return sb.toString();
     }
 
-    public static String getURLString(LispAddress lispAddress) {
-        return getAddrString(Destination.URL, lispAddress);
+    public static String getString(Address address) {
+        return getAddrString(Destination.USER, address, null);
     }
 
     public static String getString(XtrId xtrId) {
         return getXtrIdString(xtrId);
     }
 
+    public static String getURIString(LispAddress lispAddress) {
+        return getAddrString(Destination.URI, lispAddress);
+    }
+
     public static String getURIString(XtrId xtrId) {
         return getXtrIdString(xtrId);
     }
 
+    public static String getURLString(LispAddress lispAddress) {
+        return getAddrString(Destination.URL, lispAddress);
+    }
+
     public static String getURLString(XtrId xtrId) {
         return getXtrIdString(xtrId);
     }
@@ -96,28 +130,53 @@ public class LispAddressStringifier {
     }
 
     private static String getAddrString(Destination dst, LispAddress lispAddress) {
-        Preconditions.checkNotNull(lispAddress, "lispAddress should not be null");
+        if (lispAddress == null) {
+            return "null";
+        }
+
         Address addr = lispAddress.getAddress();
+        Long vni = null;
+
+        if (lispAddress.getVirtualNetworkId() != null) {
+            vni = lispAddress.getVirtualNetworkId().getValue().toJava();
+        }
+
+        return getAddrString(dst, addr, vni);
+    }
+
+    private static String getAddrString(Destination dst, Address addr, Long virtualNetworkId) {
         String prefix = "";
         String vni = "";
         String address = "";
 
-        if (lispAddress.getVirtualNetworkId() != null) {
-            vni = "[" + lispAddress.getVirtualNetworkId().getValue() + "] ";
+        if (virtualNetworkId != null) {
+            vni = "[" + virtualNetworkId + "] ";
         }
 
         if (addr instanceof Ipv4) {
             prefix = "ipv4" + PREFIX_SEPARATOR;
             address = getStringFromIpv4(dst, (Ipv4) addr);
+        } else if (addr instanceof Ipv4Binary) {
+            prefix = "ipv4" + PREFIX_SEPARATOR;
+            address = getStringFromIpv4Binary(dst, (Ipv4Binary) addr);
         } else if (addr instanceof Ipv4Prefix) {
             prefix = "ipv4" + PREFIX_SEPARATOR;
             address = getStringFromIpv4Prefix(dst, (Ipv4Prefix) addr);
+        } else if (addr instanceof Ipv4PrefixBinary) {
+            prefix = "ipv4" + PREFIX_SEPARATOR;
+            address = getStringFromIpv4PrefixBinary(dst, (Ipv4PrefixBinary) addr);
         } else if (addr instanceof Ipv6) {
             prefix = "ipv6" + PREFIX_SEPARATOR;
             address = getStringFromIpv6(dst, (Ipv6) addr);
+        } else if (addr instanceof Ipv6Binary) {
+            prefix = "ipv6" + PREFIX_SEPARATOR;
+            address = getStringFromIpv6Binary(dst, (Ipv6Binary) addr);
         } else if (addr instanceof Ipv6Prefix) {
             prefix = "ipv6" + PREFIX_SEPARATOR;
             address = getStringFromIpv6Prefix(dst, (Ipv6Prefix) addr);
+        } else if (addr instanceof Ipv6PrefixBinary) {
+            prefix = "ipv6" + PREFIX_SEPARATOR;
+            address = getStringFromIpv6PrefixBinary(dst, (Ipv6PrefixBinary) addr);
         } else if (addr instanceof Mac) {
             prefix = "mac" + PREFIX_SEPARATOR;
             address = getStringFromMac(dst, (Mac) addr);
@@ -187,22 +246,70 @@ public class LispAddressStringifier {
         return addr.getIpv4().getValue();
     }
 
+    protected static String getStringFromIpv4Binary(Destination dst, Ipv4Binary addr) {
+        // AFI = 1; IPv4
+        try {
+            return InetAddresses.toAddrString(Inet4Address.getByAddress(addr.getIpv4Binary().getValue()));
+        } catch (UnknownHostException e) {
+            LOG.debug("Cannot convert binary IPv4 to string", e);
+        }
+        return null;
+    }
+
     protected static String getStringFromIpv4Prefix(Destination dst, Ipv4Prefix addr) {
         // AFI = 1; IPv4
         String prefix = addr.getIpv4Prefix().getValue();
         return getPrefixString(dst, prefix);
     }
 
+    protected static String getStringFromIpv4PrefixBinary(Destination dst, Ipv4PrefixBinary addr) {
+        // AFI = 1; IPv4
+        try {
+            StringBuilder prefixBuilder = new StringBuilder(InetAddresses.toAddrString(
+                    Inet4Address.getByAddress(addr.getIpv4AddressBinary().getValue())));
+            prefixBuilder.append('/');
+            prefixBuilder.append(addr.getIpv4MaskLength().toString());
+            return getPrefixString(dst, prefixBuilder.toString());
+        } catch (UnknownHostException e) {
+            LOG.debug("Cannot convert binary IPv4 prefix to string", e);
+        }
+        return null;
+    }
+
     protected static String getStringFromIpv6(Destination dst, Ipv6 addr) {
         // AFI = 2; IPv6
         return addr.getIpv6().getValue();
     }
 
+    protected static String getStringFromIpv6Binary(Destination dst, Ipv6Binary addr) {
+        // AFI = 2; IPv6
+        try {
+            return InetAddresses.toAddrString(Inet6Address.getByAddress(addr.getIpv6Binary().getValue()));
+        } catch (UnknownHostException e) {
+            LOG.debug("Cannot convert binary IPv6 to string", e);
+        }
+        return null;
+    }
+
     protected static String getStringFromIpv6Prefix(Destination dst, Ipv6Prefix addr) {
         // AFI = 2; IPv6
         return addr.getIpv6Prefix().getValue();
     }
 
+    protected static String getStringFromIpv6PrefixBinary(Destination dst, Ipv6PrefixBinary addr) {
+        // AFI = 2; IPv5
+        try {
+            StringBuilder prefixBuilder = new StringBuilder(InetAddresses.toAddrString(
+                    Inet6Address.getByAddress(addr.getIpv6AddressBinary().getValue())));
+            prefixBuilder.append('/');
+            prefixBuilder.append(addr.getIpv6MaskLength().toString());
+            return getPrefixString(dst, prefixBuilder.toString());
+        } catch (UnknownHostException e) {
+            LOG.debug("Cannot convert binary IPv6 prefix to string", e);
+        }
+        return null;
+    }
+
     protected static String getStringFromDistinguishedName(Destination dst, DistinguishedName addr) {
         // AFI = 17; Distinguished Name
         return addr.getDistinguishedName().getValue();
@@ -212,6 +319,7 @@ public class LispAddressStringifier {
         // AFI = 18; Autonomous System Number
         return "AS" + addr.getAsNumber().getValue();
     }
+
     protected static String getStringFromAfiList(Destination dst, AfiList addr) {
         // AFI 16387, LCAF Type 1; Address List
         // Example rendering:
@@ -223,7 +331,7 @@ public class LispAddressStringifier {
             if (needComma) {
                 sb.append(",");
             }
-            sb.append(a.getValue());
+            sb.append(a.stringValue());
             needComma = true;
         }
         sb.append("}");
@@ -292,16 +400,16 @@ public class LispAddressStringifier {
         // AFI = 16387, LCAF Type 12, Source/Destination Key
         // Example rendering:
         //    192.0.2.1/32|192.0.2.2/32
-        return getPrefixString(dst, (new String(addr.getSourceDestKey().getSource().getValue()))
-                + "|" + getPrefixString(dst, new String(addr.getSourceDestKey().getDest().getValue())));
+        return getPrefixString(dst, addr.getSourceDestKey().getSource().stringValue()
+                + "|" + getPrefixString(dst, addr.getSourceDestKey().getDest().stringValue()));
     }
 
     protected static String getStringFromKeyValueAddress(Destination dst, KeyValueAddress addr) {
         // AFI = 16387, LCAF Type 15, Key/Value Address Pair
         // Example rendering:
         //    192.0.2.1=>192.0.2.2
-        return getPrefixString(dst, new String(addr.getKeyValueAddress().getKey().getValue())
-                + "=>" + getPrefixString(dst, new String(addr.getKeyValueAddress().getValue().getValue())));
+        return getPrefixString(dst, addr.getKeyValueAddress().getKey().stringValue()
+                + "=>" + getPrefixString(dst, addr.getKeyValueAddress().getValue().stringValue()));
     }
 
     protected static String getStringFromMac(Destination dst, Mac addr) {