From d6adfb8bfca43cffa7df55bb6e41b402db0374ae Mon Sep 17 00:00:00 2001 From: Lorand Jakab Date: Thu, 24 Mar 2016 13:17:14 +0200 Subject: [PATCH] Add ipPrefixFor() methods to IetfInetUtil Change-Id: I64458af9ba68041baba2e65cc53a21595b561a53 Signed-off-by: Lorand Jakab --- .../inet/types/rev130715/IetfInetUtil.java | 13 ++++- .../inet/types/rev100924/IetfInetUtil.java | 12 ++++- .../model/ietf/util/AbstractIetfInetUtil.java | 53 +++++++++++++++++-- .../mdsal/model/ietf/util/IpUtil.java | 12 ++++- 4 files changed, 83 insertions(+), 7 deletions(-) diff --git a/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 b/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 index 5d79b229cf..ea7e4a0235 100644 --- a/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 +++ b/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 @@ -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 { +public final class IetfInetUtil extends AbstractIetfInetUtil { public static final IetfInetUtil INSTANCE = new IetfInetUtil(); private IetfInetUtil() { @@ -31,6 +32,16 @@ public final class IetfInetUtil extends AbstractIetfInetUtil { +public final class IetfInetUtil extends AbstractIetfInetUtil { public static final IetfInetUtil INSTANCE = new IetfInetUtil(); private IetfInetUtil() { @@ -31,6 +31,16 @@ public final class IetfInetUtil extends AbstractIetfInetUtil { +public abstract class AbstractIetfInetUtil { private static final int INET4_LENGTH = 4; private static final int INET6_LENGTH = 16; private final StringValueObjectFactory address4Factory; @@ -42,6 +42,8 @@ public abstract class AbstractIetfInetUtil { @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 { @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 { } } + /** + * 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 { * 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 diff --git a/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/IpUtil.java b/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/IpUtil.java index 1e1cd9d350..f98a00c6cb 100644 --- a/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/IpUtil.java +++ b/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/IpUtil.java @@ -8,7 +8,7 @@ package org.opendaylight.mdsal.model.ietf.util; -final class IpUtil extends AbstractIetfInetUtil { +final class IpUtil extends AbstractIetfInetUtil { IpUtil() { super(IpClass.class, IpClass.class, IpClass.class, IpClass.class); } @@ -23,6 +23,16 @@ final class IpUtil extends AbstractIetfInetUtil