More IetfInetUtil methods 31/35631/3
authorRobert Varga <robert.varga@pantheon.sk>
Mon, 22 Feb 2016 13:37:40 +0000 (14:37 +0100)
committerRobert Varga <rovarga@cisco.com>
Wed, 2 Mar 2016 23:47:42 +0000 (00:47 +0100)
Fix IPv6 address formatting and introduce more conversion methods.

Change-Id: Ib032166819bed9c31932ad6b7c33db6263b12f6c
Signed-off-by: Robert Varga <robert.varga@pantheon.sk>
(cherry picked from commit 465dde89392d109af701c8f617a840bfbfd95834)

model/ietf/ietf-inet-types-2013-07-15/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IetfInetUtil.java
model/ietf/ietf-inet-types/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev100924/IetfInetUtil.java
model/ietf/ietf-type-util/src/main/java/org/opendaylight/mdsal/model/ietf/util/AbstractIetfInetUtil.java

index 6f7f7854d63f0d8b6dd5b5ca5d6522844d905afd..fa2291f89adca8034cda8dba464dc8c2a3ed49e6 100644 (file)
@@ -12,8 +12,6 @@ import org.opendaylight.mdsal.model.ietf.util.AbstractIetfInetUtil;
 
 /**
  * A set of utility methods to efficiently instantiate various ietf-inet-types DTOs.
- *
- * FIXME: IPv6 addresses are not emitted in canonical format as specified by the model.
  */
 @Beta
 public final class IetfInetUtil extends AbstractIetfInetUtil<Ipv4Address, Ipv4Prefix, Ipv6Address, Ipv6Prefix, IpAddress> {
@@ -32,4 +30,24 @@ public final class IetfInetUtil extends AbstractIetfInetUtil<Ipv4Address, Ipv4Pr
     protected IpAddress ipv6Address(final Ipv6Address addr) {
         return new IpAddress(addr);
     }
+
+    @Override
+    protected String ipv4AddressString(final Ipv4Address addr) {
+        return addr.getValue();
+    }
+
+    @Override
+    protected String ipv6AddressString(final Ipv6Address addr) {
+        return addr.getValue();
+    }
+
+    @Override
+    protected String ipv4PrefixString(final Ipv4Prefix prefix) {
+        return prefix.getValue();
+    }
+
+    @Override
+    protected String ipv6PrefixString(final Ipv6Prefix prefix) {
+        return prefix.getValue();
+    }
 }
index 76f75361dd179331a11f4507c7161e5866b7f52d..ac146883e2b1a46eb1d6d51d071ad0a0e337ca5e 100644 (file)
@@ -12,8 +12,6 @@ import org.opendaylight.mdsal.model.ietf.util.AbstractIetfInetUtil;
 
 /**
  * A set of utility methods to efficiently instantiate various ietf-inet-types DTOs.
- *
- * FIXME: IPv6 addresses are not emitted in canonical format as specified by the model.
  */
 @Beta
 public final class IetfInetUtil extends AbstractIetfInetUtil<Ipv4Address, Ipv4Prefix, Ipv6Address, Ipv6Prefix, IpAddress> {
@@ -32,4 +30,24 @@ public final class IetfInetUtil extends AbstractIetfInetUtil<Ipv4Address, Ipv4Pr
     protected IpAddress ipv6Address(final Ipv6Address addr) {
         return new IpAddress(addr);
     }
+
+    @Override
+    protected String ipv4AddressString(final Ipv4Address addr) {
+        return addr.getValue();
+    }
+
+    @Override
+    protected String ipv6AddressString(final Ipv6Address addr) {
+        return addr.getValue();
+    }
+
+    @Override
+    protected String ipv4PrefixString(final Ipv4Prefix prefix) {
+        return prefix.getValue();
+    }
+
+    @Override
+    protected String ipv6PrefixString(final Ipv6Prefix prefix) {
+        return prefix.getValue();
+    }
 }
index be279ee1682d31b5695caeb25bc4359d8a3e9789..3590a7a6932dc875c817d679104ffb89d9ec37ea 100644 (file)
@@ -15,13 +15,13 @@ import java.net.Inet4Address;
 import java.net.Inet6Address;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.util.AbstractMap.SimpleImmutableEntry;
+import java.util.Map.Entry;
 import javax.annotation.Nonnull;
 import org.opendaylight.yangtools.yang.binding.util.StringValueObjectFactory;
 
 /**
  * A set of utility methods to efficiently instantiate various ietf-inet-types DTOs.
- *
- * FIXME: IPv6 addresses are not emitted in canonical format as specified by the model.
  */
 @Beta
 public abstract class AbstractIetfInetUtil<A4, P4, A6, P6, A> {
@@ -40,6 +40,10 @@ public abstract class AbstractIetfInetUtil<A4, P4, A6, P6, A> {
 
     protected abstract A ipv4Address(A4 addr);
     protected abstract A ipv6Address(A6 addr);
+    protected abstract String ipv4AddressString(A4 addr);
+    protected abstract String ipv6AddressString(A6 addr);
+    protected abstract String ipv4PrefixString(P4 prefix);
+    protected abstract String ipv6PrefixString(P6 prefix);
 
     @Nonnull public final A ipAddressFor(@Nonnull final byte[] bytes) {
         switch (bytes.length) {
@@ -89,6 +93,10 @@ public abstract class AbstractIetfInetUtil<A4, P4, A6, P6, A> {
         return address4Factory.newInstance(addr.getHostAddress());
     }
 
+    @Nonnull public final A4 ipv4AddressFrom(@Nonnull final P4 prefix) {
+        return prefixToAddress(address4Factory, ipv4PrefixString(prefix));
+    }
+
     /**
      * Create a /32 Ipv4Prefix by interpreting input bytes as an IPv4 address.
      *
@@ -147,6 +155,24 @@ public abstract class AbstractIetfInetUtil<A4, P4, A6, P6, A> {
         return prefix4Factory.newInstance(addr.getHostAddress() + '/' + mask);
     }
 
+    @Nonnull public final P4 ipv4PrefixFor(@Nonnull final A4 addr) {
+        Preconditions.checkNotNull(addr, "Address must not be null");
+        return prefix4Factory.newInstance(ipv4AddressString(addr) + "/32");
+    }
+
+    @Nonnull public final P4 ipv4PrefixFor(@Nonnull final A4 addr, final int mask) {
+        Preconditions.checkNotNull(addr, "Address must not be null");
+        Preconditions.checkArgument(mask >= 0 && mask <= 32, "Invalid mask %s", mask);
+        return prefix4Factory.newInstance(ipv4AddressString(addr) + '/' + mask);
+    }
+
+    @Nonnull public final Entry<A4, Integer> splitIpv4Prefix(@Nonnull final P4 prefix) {
+        final String str = ipv4PrefixString(prefix);
+        final int slash = str.lastIndexOf('/');
+        final A4 addr = address4Factory.newInstance(str.substring(0, slash));
+        return new SimpleImmutableEntry<>(addr, Integer.valueOf(str.substring(slash + 1)));
+    }
+
     /**
      * Create an Ipv6Address by interpreting input bytes as an IPv6 address.
      *
@@ -170,7 +196,11 @@ public abstract class AbstractIetfInetUtil<A4, P4, A6, P6, A> {
     @Nonnull public final A6 ipv6AddressFor(@Nonnull final InetAddress addr) {
         Preconditions.checkNotNull(addr, "Address must not be null");
         Preconditions.checkArgument(addr instanceof Inet6Address, "Address has to be an Inet6Address");
-        return address6Factory.newInstance(addr.getHostAddress());
+        return address6Factory.newInstance(addressStringV6(addr));
+    }
+
+    @Nonnull public final A6 ipv6AddressFrom(@Nonnull final P6 prefix) {
+        return prefixToAddress(address6Factory, ipv6PrefixString(prefix));
     }
 
     /**
@@ -231,6 +261,28 @@ public abstract class AbstractIetfInetUtil<A4, P4, A6, P6, A> {
         return prefix6Factory.newInstance(addressStringV6(addr) + '/' + mask);
     }
 
+    @Nonnull public final P6 ipv6PrefixFor(@Nonnull final A6 addr) {
+        Preconditions.checkNotNull(addr, "Address must not be null");
+        return prefix6Factory.newInstance(ipv6AddressString(addr) + "/128");
+    }
+
+    @Nonnull public final P6 ipv6PrefixFor(@Nonnull final A6 addr, final int mask) {
+        Preconditions.checkNotNull(addr, "Address must not be null");
+        Preconditions.checkArgument(mask >= 0 && mask <= 128, "Invalid mask %s", mask);
+        return prefix6Factory.newInstance(ipv6AddressString(addr) + '/' + mask);
+    }
+
+    @Nonnull public final Entry<A6, Integer> splitIpv6Prefix(@Nonnull final P6 prefix) {
+        final String str = ipv6PrefixString(prefix);
+        final int slash = str.lastIndexOf('/');
+        final A6 addr = address6Factory.newInstance(str.substring(0, slash));
+        return new SimpleImmutableEntry<>(addr, Integer.valueOf(str.substring(slash + 1)));
+    }
+
+    private static <T> T prefixToAddress(final StringValueObjectFactory<T> factory, final String str) {
+        return factory.newInstance(str.substring(0, str.lastIndexOf('/')));
+    }
+
     private static void appendIpv4String(final StringBuilder sb, final byte[] bytes) {
         Preconditions.checkArgument(bytes.length == 4, "IPv4 address length is 4 bytes");