Add ipPrefixFor() methods to IetfInetUtil 44/36444/3
authorLorand Jakab <lojakab@cisco.com>
Thu, 24 Mar 2016 11:17:14 +0000 (13:17 +0200)
committerLorand Jakab <lojakab@cisco.com>
Thu, 24 Mar 2016 11:17:14 +0000 (13:17 +0200)
Change-Id: I64458af9ba68041baba2e65cc53a21595b561a53
Signed-off-by: Lorand Jakab <lojakab@cisco.com>
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
model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/IpUtil.java

index 5d79b229cfee4710f0a4663d644a539e3f128309..ea7e4a0235b9d07207812ce9cdf199fbd308451c 100644 (file)
@@ -8,13 +8,14 @@
 package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715;
 
 import com.google.common.annotations.Beta;
+
 import org.opendaylight.mdsal.model.ietf.util.AbstractIetfInetUtil;
 
 /**
  * A set of utility methods to efficiently instantiate various ietf-inet-types DTOs.
  */
 @Beta
-public final class IetfInetUtil extends AbstractIetfInetUtil<Ipv4Address, Ipv4Prefix, Ipv6Address, Ipv6Prefix, IpAddress> {
+public final class IetfInetUtil extends AbstractIetfInetUtil<Ipv4Address, Ipv4Prefix, Ipv6Address, Ipv6Prefix, IpAddress, IpPrefix> {
     public static final IetfInetUtil INSTANCE = new IetfInetUtil();
 
     private IetfInetUtil() {
@@ -31,6 +32,16 @@ public final class IetfInetUtil extends AbstractIetfInetUtil<Ipv4Address, Ipv4Pr
         return new IpAddress(addr);
     }
 
+    @Override
+    protected IpPrefix ipv4Prefix(Ipv4Prefix addr) {
+        return new IpPrefix(addr);
+    }
+
+    @Override
+    protected IpPrefix ipv6Prefix(Ipv6Prefix addr) {
+        return new IpPrefix(addr);
+    }
+
     @Override
     protected String ipv4AddressString(final Ipv4Address addr) {
         return addr.getValue();
index e5447a42d75001ca937ec6a5af548fe243df1873..1549b6e0f920e7d0a6bcdadb0261bb83a3b0d2ef 100644 (file)
@@ -14,7 +14,7 @@ import org.opendaylight.mdsal.model.ietf.util.AbstractIetfInetUtil;
  * A set of utility methods to efficiently instantiate various ietf-inet-types DTOs.
  */
 @Beta
-public final class IetfInetUtil extends AbstractIetfInetUtil<Ipv4Address, Ipv4Prefix, Ipv6Address, Ipv6Prefix, IpAddress> {
+public final class IetfInetUtil extends AbstractIetfInetUtil<Ipv4Address, Ipv4Prefix, Ipv6Address, Ipv6Prefix, IpAddress, IpPrefix> {
     public static final IetfInetUtil INSTANCE = new IetfInetUtil();
 
     private IetfInetUtil() {
@@ -31,6 +31,16 @@ public final class IetfInetUtil extends AbstractIetfInetUtil<Ipv4Address, Ipv4Pr
         return new IpAddress(addr);
     }
 
+    @Override
+    protected IpPrefix ipv4Prefix(Ipv4Prefix addr) {
+        return new IpPrefix(addr);
+    }
+
+    @Override
+    protected IpPrefix ipv6Prefix(Ipv6Prefix addr) {
+        return new IpPrefix(addr);
+    }
+
     @Override
     protected String ipv4AddressString(final Ipv4Address addr) {
         return addr.getValue();
index 780e06760270c4b6e7c1f1b8ade1d8c5580631d6..9114644585a9077d856e521829b55d342f4950d1 100644 (file)
@@ -24,7 +24,7 @@ import org.opendaylight.yangtools.yang.binding.util.StringValueObjectFactory;
  * A set of utility methods to efficiently instantiate various ietf-inet-types DTOs.
  */
 @Beta
-public abstract class AbstractIetfInetUtil<A4, P4, A6, P6, A> {
+public abstract class AbstractIetfInetUtil<A4, P4, A6, P6, A, P> {
     private static final int INET4_LENGTH = 4;
     private static final int INET6_LENGTH = 16;
     private final StringValueObjectFactory<A4> address4Factory;
@@ -42,6 +42,8 @@ public abstract class AbstractIetfInetUtil<A4, P4, A6, P6, A> {
 
     @Nonnull protected abstract A ipv4Address(@Nonnull A4 addr);
     @Nonnull protected abstract A ipv6Address(@Nonnull A6 addr);
+    @Nonnull protected abstract P ipv4Prefix(@Nonnull P4 addr);
+    @Nonnull protected abstract P ipv6Prefix(@Nonnull P6 addr);
     @Nullable protected abstract A4 maybeIpv4Address(@Nonnull A addr);
     @Nullable protected abstract A6 maybeIpv6Address(@Nonnull A addr);
     @Nonnull protected abstract String ipv4AddressString(@Nonnull A4 addr);
@@ -49,11 +51,19 @@ public abstract class AbstractIetfInetUtil<A4, P4, A6, P6, A> {
     @Nonnull protected abstract String ipv4PrefixString(@Nonnull P4 prefix);
     @Nonnull protected abstract String ipv6PrefixString(@Nonnull P6 prefix);
 
+    /**
+     * Create an IpAddress by interpreting input bytes as an IPv4 or IPv6 address, based on array length.
+     *
+     * @param bytes 4-byte (IPv4) or 6-byte (IPv6) array
+     * @return An IpAddress object
+     * @throws IllegalArgumentException if bytes has length different from 4 or 6
+     * @throws NullPointerException if bytes is null
+     */
     @Nonnull public final A ipAddressFor(@Nonnull final byte[] bytes) {
         switch (bytes.length) {
-            case 4:
+            case INET4_LENGTH:
                 return ipv4Address(ipv4AddressFor(bytes));
-            case 16:
+            case INET6_LENGTH:
                 return ipv6Address(ipv6AddressFor(bytes));
             default:
                 throw new IllegalArgumentException("Invalid array length " + bytes.length);
@@ -71,6 +81,41 @@ public abstract class AbstractIetfInetUtil<A4, P4, A6, P6, A> {
         }
     }
 
+    /**
+     * Create an IpPrefix by combining the address with a mask. The address
+     * bytes are interpreted as an address and the specified mask is concatenated to
+     * it. The address bytes are not masked.
+     *
+     * @param bytes Input address as a 4-byte (IPv4) or 16-byte (IPv6) array
+     * @param mask Prefix mask
+     * @return An IpPrefix object
+     * @throws IllegalArgumentException if bytes has length different from 4 or 16 or if mask is not
+     *         in range 0-32 or 0-128 respectively
+     * @throws NullPointerException if bytes is null
+     */
+
+    @Nonnull public final P ipPrefixFor(@Nonnull final byte[] bytes, final int mask) {
+        switch (bytes.length) {
+            case INET4_LENGTH:
+                return ipv4Prefix(ipv4PrefixFor(bytes, mask));
+            case INET6_LENGTH:
+                return ipv6Prefix(ipv6PrefixFor(bytes, mask));
+            default:
+                throw new IllegalArgumentException("Invalid array length " + bytes.length);
+        }
+    }
+
+    @Nonnull public final P ipPrefixFor(@Nonnull final InetAddress addr, final int mask) {
+        Preconditions.checkNotNull(addr, "Address must not be null");
+        if (addr instanceof Inet4Address) {
+            return ipv4Prefix(ipv4PrefixFor(addr, mask));
+        } else if (addr instanceof Inet6Address) {
+            return ipv6Prefix(ipv6PrefixFor(addr, mask));
+        } else {
+            throw new IllegalArgumentException("Unhandled address " + addr);
+        }
+    }
+
     @Nonnull public final InetAddress inetAddressFor(@Nonnull final A addr) {
         final A4 v4 = maybeIpv4Address(addr);
         if (v4 != null) {
@@ -295,7 +340,7 @@ public abstract class AbstractIetfInetUtil<A4, P4, A6, P6, A> {
      * bytes are interpreted as an address and the specified mask is concatenated to
      * it. The address bytes are not masked.
      *
-     * @param address Input address as a 4-byte array
+     * @param address Input address as a 16-byte array
      * @param mask Prefix mask
      * @return An Ipv6Prefix object
      * @throws IllegalArgumentException if bytes has length different from 16 or if mask is not in range 0-128
index 1e1cd9d35059b85ffc14001d4803a7e5559a3e35..f98a00c6cb7aaeb4851947c1d2d665515ccf0ab2 100644 (file)
@@ -8,7 +8,7 @@
 
 package org.opendaylight.mdsal.model.ietf.util;
 
-final class IpUtil extends AbstractIetfInetUtil<IpClass, IpClass, IpClass, IpClass, IpClass> {
+final class IpUtil extends AbstractIetfInetUtil<IpClass, IpClass, IpClass, IpClass, IpClass, IpClass> {
     IpUtil() {
         super(IpClass.class, IpClass.class, IpClass.class, IpClass.class);
     }
@@ -23,6 +23,16 @@ final class IpUtil extends AbstractIetfInetUtil<IpClass, IpClass, IpClass, IpCla
         return addr;
     }
 
+    @Override
+    protected IpClass ipv4Prefix(IpClass addr) {
+        return addr;
+    }
+
+    @Override
+    protected IpClass ipv6Prefix(IpClass addr) {
+        return addr;
+    }
+
     @Override
     protected String ipv4AddressString(final IpClass addr) {
         return addr._value;