From c4301c2e5439da8538769bdee0cf6c9bb56209ef Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 11 Apr 2018 03:28:40 +0200 Subject: [PATCH] Add NoZone support inet-inet-types@2013-07-15 defines no-zone versions of ip-address, ipv4-address and ipv6-address. These are guaranteed to not contain a zone, hence are stricter versions of the same types, making them better candidates for dealing with normal addresses. Retrofit IetfInetUtil so they return no-zone versions of objects and also add more efficient convertors to bytes. Change-Id: I2b0f4775b1656a7b80929e62f03940b1247e1b95 Signed-off-by: Robert Varga --- .../util/StringValueObjectFactory.java | 25 ++++- .../inet/types/rev130715/IetfInetUtil.java | 62 ++++++++++- .../inet/types/rev130715/HostBuilderTest.java | 4 +- .../types/rev130715/IetfInetUtilTest.java | 8 +- .../types/rev130715/IpAddressBuilderTest.java | 4 +- .../rev130715/IpAddressNoZoneBuilderTest.java | 4 +- .../types/rev130715/IpPrefixBuilderTest.java | 4 +- .../inet/types/rev100924/IetfInetUtil.java | 17 ++- .../model/ietf/util/AbstractIetfInetUtil.java | 105 ++++++++++++------ .../mdsal/model/ietf/util/IpUtil.java | 21 +++- 10 files changed, 191 insertions(+), 63 deletions(-) diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/util/StringValueObjectFactory.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/util/StringValueObjectFactory.java index c55b9621d1..865ad626b2 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/util/StringValueObjectFactory.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/util/StringValueObjectFactory.java @@ -74,12 +74,7 @@ public final class StringValueObjectFactory { throw new IllegalArgumentException(String.format("%s does not have a copy constructor", clazz), e); } - final Field f; - try { - f = clazz.getDeclaredField("_value"); - } catch (NoSuchFieldException e) { - throw new IllegalArgumentException(String.format("%s does not have required internal field", clazz), e); - } + final Field f = findValueField(clazz); f.setAccessible(true); final StringValueObjectFactory ret; @@ -115,6 +110,24 @@ public final class StringValueObjectFactory { return false; } + private static Field findValueField(final Class orig) { + NoSuchFieldException cause = null; + Class clazz = orig; + do { + try { + return clazz.getDeclaredField("_value"); + } catch (NoSuchFieldException e) { + if (cause != null) { + e.addSuppressed(cause); + } + cause = e; + } + clazz = clazz.getSuperclass(); + } while (clazz != null); + + throw new IllegalArgumentException(orig + " nor its superclasses define required internal field _value", cause); + } + @SuppressWarnings("checkstyle:illegalCatch") public T newInstance(final String string) { Preconditions.checkNotNull(string, "Argument may not be null"); 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 ea7e4a0235..10c0189799 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,18 +8,60 @@ package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715; import com.google.common.annotations.Beta; - +import com.google.common.base.Preconditions; +import java.net.Inet4Address; +import java.net.Inet6Address; +import java.net.InetAddress; +import java.net.UnknownHostException; +import javax.annotation.Nonnull; 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() { - super(Ipv4Address.class, Ipv4Prefix.class, Ipv6Address.class, Ipv6Prefix.class); + super(Ipv4AddressNoZone.class, Ipv4Prefix.class, Ipv6AddressNoZone.class, Ipv6Prefix.class); + } + + @Nonnull public static InetAddress inetAddressFor(@Nonnull final IpAddressNoZone addr) { + final Ipv4AddressNoZone v4 = addr.getIpv4AddressNoZone(); + if (v4 != null) { + return inet4AddressFor(v4); + } + final Ipv6AddressNoZone v6 = addr.getIpv6AddressNoZone(); + Preconditions.checkArgument(v6 != null, "Address %s is neither IPv4 nor IPv6", addr); + return inet6AddressFor(v6); + } + + @Nonnull public static Inet4Address inet4AddressFor(@Nonnull final Ipv4AddressNoZone addr) { + try { + return (Inet4Address) InetAddress.getByAddress(ipv4AddressBytes(addr)); + } catch (UnknownHostException e) { + throw new IllegalArgumentException("Invalid address " + addr, e); + } + } + + @Nonnull public static Inet6Address inet6AddressFor(@Nonnull final Ipv6AddressNoZone addr) { + try { + return (Inet6Address) InetAddress.getByAddress(ipv6AddressBytes(addr)); + } catch (UnknownHostException e) { + throw new IllegalArgumentException("Invalid address " + addr, e); + } + } + + @Nonnull public static byte[] ipv4AddressBytes(@Nonnull final Ipv4AddressNoZone addr) { + final String str = addr.getValue(); + return ipv4AddressBytes(str, str.length()); + } + + @Nonnull public static byte[] ipv6AddressBytes(@Nonnull final Ipv6AddressNoZone addr) { + final String str = addr.getValue(); + return ipv6AddressBytes(str, str.length()); } @Override @@ -27,18 +69,28 @@ public final class IetfInetUtil extends AbstractIetfInetUtil constructor = HostBuilder.class.getDeclaredConstructor(); assertFalse(constructor.isAccessible()); constructor.setAccessible(true); - final HostBuilder newInstance = (HostBuilder) constructor.newInstance(); + final HostBuilder newInstance = constructor.newInstance(); assertNotNull(newInstance); testIpv4("1.1.1.1"); diff --git a/model/ietf/ietf-inet-types-2013-07-15/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IetfInetUtilTest.java b/model/ietf/ietf-inet-types-2013-07-15/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IetfInetUtilTest.java index 5e50cf446d..974d5ff9df 100644 --- a/model/ietf/ietf-inet-types-2013-07-15/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IetfInetUtilTest.java +++ b/model/ietf/ietf-inet-types-2013-07-15/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IetfInetUtilTest.java @@ -19,17 +19,17 @@ public class IetfInetUtilTest { @Test public void testIetfInetUtilConstructor() throws Exception { - final Constructor constructor = IetfInetUtil.class.getDeclaredConstructor(); + final Constructor constructor = IetfInetUtil.class.getDeclaredConstructor(); assertFalse(constructor.isAccessible()); constructor.setAccessible(true); - final IetfInetUtil newInstance = (IetfInetUtil) constructor.newInstance(); + final IetfInetUtil newInstance = constructor.newInstance(); assertNotNull(newInstance); } @Test public void testIpv4Address() { - final Ipv4Address ipv4Address = new Ipv4Address("192.168.1.1"); + final Ipv4AddressNoZone ipv4Address = new Ipv4AddressNoZone("192.168.1.1"); final Ipv4Prefix ipv4Prefix = new Ipv4Prefix("192.0.2.1/24"); final IpAddress ipAddress = IetfInetUtil.INSTANCE.ipv4Address(ipv4Address); final String ipv4AddressString = IetfInetUtil.INSTANCE.ipv4AddressString(ipv4Address); @@ -45,7 +45,7 @@ public class IetfInetUtilTest { @Test public void testIpv6Address() { - final Ipv6Address ipv6Address = new Ipv6Address("ABCD:EF01:2345:6789:ABCD:EF01:2345:6789"); + final Ipv6AddressNoZone ipv6Address = new Ipv6AddressNoZone("ABCD:EF01:2345:6789:ABCD:EF01:2345:6789"); final Ipv6Prefix ipv6Prefix = new Ipv6Prefix("ff00::/8"); final IpAddress ipAddress = IetfInetUtil.INSTANCE.ipv6Address(ipv6Address); final String ipv6AddressString = IetfInetUtil.INSTANCE.ipv6AddressString(ipv6Address); diff --git a/model/ietf/ietf-inet-types-2013-07-15/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressBuilderTest.java b/model/ietf/ietf-inet-types-2013-07-15/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressBuilderTest.java index d12a7cd466..db91a41f01 100644 --- a/model/ietf/ietf-inet-types-2013-07-15/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressBuilderTest.java +++ b/model/ietf/ietf-inet-types-2013-07-15/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressBuilderTest.java @@ -19,10 +19,10 @@ public class IpAddressBuilderTest { @Test public void testGetDefaultInstance() throws Exception { - final Constructor constructor = IpAddressBuilder.class.getDeclaredConstructor(); + final Constructor constructor = IpAddressBuilder.class.getDeclaredConstructor(); assertFalse(constructor.isAccessible()); constructor.setAccessible(true); - final IpAddressBuilder newInstance = (IpAddressBuilder) constructor.newInstance(); + final IpAddressBuilder newInstance = constructor.newInstance(); assertNotNull(newInstance); testIpv4("1.1.1.1"); diff --git a/model/ietf/ietf-inet-types-2013-07-15/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressNoZoneBuilderTest.java b/model/ietf/ietf-inet-types-2013-07-15/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressNoZoneBuilderTest.java index 30de24fce9..c00103b0ea 100644 --- a/model/ietf/ietf-inet-types-2013-07-15/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressNoZoneBuilderTest.java +++ b/model/ietf/ietf-inet-types-2013-07-15/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressNoZoneBuilderTest.java @@ -19,10 +19,10 @@ public class IpAddressNoZoneBuilderTest { @Test public void testGetDefaultInstance() throws Exception { - final Constructor constructor = IpAddressNoZoneBuilder.class.getDeclaredConstructor(); + final Constructor constructor = IpAddressNoZoneBuilder.class.getDeclaredConstructor(); assertFalse(constructor.isAccessible()); constructor.setAccessible(true); - final IpAddressNoZoneBuilder newInstance = (IpAddressNoZoneBuilder) constructor.newInstance(); + final IpAddressNoZoneBuilder newInstance = constructor.newInstance(); assertNotNull(newInstance); testIpv4("1.1.1.1"); diff --git a/model/ietf/ietf-inet-types-2013-07-15/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpPrefixBuilderTest.java b/model/ietf/ietf-inet-types-2013-07-15/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpPrefixBuilderTest.java index a56b109f24..0f49557fe8 100644 --- a/model/ietf/ietf-inet-types-2013-07-15/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpPrefixBuilderTest.java +++ b/model/ietf/ietf-inet-types-2013-07-15/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpPrefixBuilderTest.java @@ -19,10 +19,10 @@ public class IpPrefixBuilderTest { @Test public void testGetDefaultInstance() throws Exception { - final Constructor constructor = IpPrefixBuilder.class.getDeclaredConstructor(); + final Constructor constructor = IpPrefixBuilder.class.getDeclaredConstructor(); assertFalse(constructor.isAccessible()); constructor.setAccessible(true); - final IpPrefixBuilder newInstance = (IpPrefixBuilder) constructor.newInstance(); + final IpPrefixBuilder newInstance = constructor.newInstance(); assertNotNull(newInstance); testIpv6("ff00::/8"); diff --git a/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 b/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 index 1549b6e0f9..41b9ec1e31 100644 --- a/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 +++ b/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 @@ -14,7 +14,8 @@ 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() { @@ -26,18 +27,28 @@ public final class IetfInetUtil extends AbstractIetfInetUtil { - private static final int INET4_LENGTH = 4; - private static final int INET6_LENGTH = 16; - private final StringValueObjectFactory address4Factory; +public abstract class AbstractIetfInetUtil { + protected static final int INET4_LENGTH = 4; + protected static final int INET6_LENGTH = 16; + private final StringValueObjectFactory nozone4Factory; private final StringValueObjectFactory prefix4Factory; - private final StringValueObjectFactory address6Factory; + private final StringValueObjectFactory nozone6Factory; private final StringValueObjectFactory prefix6Factory; - protected AbstractIetfInetUtil(final Class addr4Class, final Class prefix4Class, - final Class addr6Class, final Class prefix6Class) { - this.address4Factory = StringValueObjectFactory.create(addr4Class, "0.0.0.0"); + protected AbstractIetfInetUtil(final Class nozone4Class, final Class prefix4Class, + final Class nozone6Class, final Class prefix6Class) { + this.nozone4Factory = StringValueObjectFactory.create(nozone4Class, "0.0.0.0"); this.prefix4Factory = StringValueObjectFactory.create(prefix4Class, "0.0.0.0/0"); - this.address6Factory = StringValueObjectFactory.create(addr6Class, "::0"); + this.nozone6Factory = StringValueObjectFactory.create(nozone6Class, "::0"); this.prefix6Factory = StringValueObjectFactory.create(prefix6Class, "::0/0"); } @Nonnull protected abstract A ipv4Address(@Nonnull A4 addr); @Nonnull protected abstract A ipv6Address(@Nonnull A6 addr); + @Nonnull protected abstract ANZ ipv4AddressNoZone(@Nonnull A4NZ addr); + @Nonnull protected abstract ANZ ipv6AddressNoZone(@Nonnull A6NZ 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); @@ -70,6 +73,25 @@ public abstract class AbstractIetfInetUtil { } } + /** + * 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 A no-zone IpAddress object + * @throws IllegalArgumentException if bytes has length different from 4 or 6 + * @throws NullPointerException if bytes is null + */ + @Nonnull public final ANZ ipAddressNoZoneFor(@Nonnull final byte[] bytes) { + switch (bytes.length) { + case INET4_LENGTH: + return ipv4AddressNoZone(ipv4AddressFor(bytes)); + case INET6_LENGTH: + return ipv6AddressNoZone(ipv6AddressFor(bytes)); + default: + throw new IllegalArgumentException("Invalid array length " + bytes.length); + } + } + @Nonnull public final A ipAddressFor(@Nonnull final InetAddress addr) { Preconditions.checkNotNull(addr, "Address must not be null"); if (addr instanceof Inet4Address) { @@ -81,6 +103,17 @@ public abstract class AbstractIetfInetUtil { } } + @Nonnull public final ANZ ipAddressNoZoneFor(@Nonnull final InetAddress addr) { + Preconditions.checkNotNull(addr, "Address must not be null"); + if (addr instanceof Inet4Address) { + return ipv4AddressNoZone(ipv4AddressFor(addr)); + } else if (addr instanceof Inet6Address) { + return ipv6AddressNoZone(ipv6AddressFor(addr)); + } else { + throw new IllegalArgumentException("Unhandled address " + addr); + } + } + /** * 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 @@ -93,7 +126,6 @@ public abstract class AbstractIetfInetUtil { * 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: @@ -150,8 +182,8 @@ public abstract class AbstractIetfInetUtil { * @throws IllegalArgumentException if bytes has length different from 4 * @throws NullPointerException if bytes is null */ - @Nonnull public final A4 ipv4AddressFor(@Nonnull final byte[] bytes) { - return address4Factory.newInstance(addressStringV4(bytes)); + @Nonnull public final A4NZ ipv4AddressFor(@Nonnull final byte[] bytes) { + return nozone4Factory.newInstance(addressStringV4(bytes)); } /** @@ -162,14 +194,14 @@ public abstract class AbstractIetfInetUtil { * @throws IllegalArgumentException if addr is not an {@link Inet4Address} * @throws NullPointerException if addr is null */ - @Nonnull public final A4 ipv4AddressFor(@Nonnull final InetAddress addr) { + @Nonnull public final A4NZ ipv4AddressFor(@Nonnull final InetAddress addr) { Preconditions.checkNotNull(addr, "Address must not be null"); Preconditions.checkArgument(addr instanceof Inet4Address, "Address has to be an Inet4Address"); - return address4Factory.newInstance(addr.getHostAddress()); + return nozone4Factory.newInstance(addr.getHostAddress()); } - @Nonnull public final A4 ipv4AddressFrom(@Nonnull final P4 prefix) { - return prefixToAddress(address4Factory, ipv4PrefixString(prefix)); + @Nonnull public final A4NZ ipv4AddressFrom(@Nonnull final P4 prefix) { + return prefixToAddress(nozone4Factory, ipv4PrefixString(prefix)); } @Nonnull public final byte[] ipv4AddressBytes(@Nonnull final A4 addr) { @@ -178,9 +210,13 @@ public abstract class AbstractIetfInetUtil { * the Ipv4Address pattern, which may include a zone index. */ final String str = ipv4AddressString(addr); - final byte[] bytes = new byte[INET4_LENGTH]; final int percent = str.indexOf('%'); - Ipv4Utils.fillIpv4Bytes(bytes, 0, str, 0, percent == -1 ? str.length() : percent); + return ipv4AddressBytes(str, percent == -1 ? str.length() : percent); + } + + protected static final byte[] ipv4AddressBytes(@Nonnull final String str, final int length) { + final byte[] bytes = new byte[INET4_LENGTH]; + Ipv4Utils.fillIpv4Bytes(bytes, 0, str, 0, length); return bytes; } @@ -218,7 +254,7 @@ public abstract class AbstractIetfInetUtil { return prefix4Factory.getTemplate(); } - return v4PrefixForShort(address, 0, (mask / Byte.SIZE) + ((mask % Byte.SIZE == 0) ? 0 : 1), mask); + return v4PrefixForShort(address, 0, mask / Byte.SIZE + (mask % Byte.SIZE == 0 ? 0 : 1), mask); } @Nonnull public final P4 ipv4PrefixForShort(@Nonnull final byte[] array, final int startOffset, final int mask) { @@ -227,7 +263,7 @@ public abstract class AbstractIetfInetUtil { return prefix4Factory.getTemplate(); } - return v4PrefixForShort(array, startOffset, (mask / Byte.SIZE) + ((mask % Byte.SIZE == 0) ? 0 : 1), mask); + return v4PrefixForShort(array, startOffset, mask / Byte.SIZE + (mask % Byte.SIZE == 0 ? 0 : 1), mask); } /** @@ -271,8 +307,8 @@ public abstract class AbstractIetfInetUtil { return prefix4Factory.newInstance(ipv4AddressString(addr) + '/' + mask); } - @Nonnull public final Entry splitIpv4Prefix(@Nonnull final P4 prefix) { - return splitPrefix(address4Factory, ipv4PrefixString(prefix)); + @Nonnull public final Entry splitIpv4Prefix(@Nonnull final P4 prefix) { + return splitPrefix(nozone4Factory, ipv4PrefixString(prefix)); } @Nonnull public final byte[] ipv4PrefixToBytes(@Nonnull final P4 prefix) { @@ -293,8 +329,8 @@ public abstract class AbstractIetfInetUtil { * @throws IllegalArgumentException if bytes has length different from 16 * @throws NullPointerException if bytes is null */ - @Nonnull public final A6 ipv6AddressFor(@Nonnull final byte[] bytes) { - return address6Factory.newInstance(addressStringV6(bytes)); + @Nonnull public final A6NZ ipv6AddressFor(@Nonnull final byte[] bytes) { + return nozone6Factory.newInstance(addressStringV6(bytes)); } /** @@ -305,24 +341,29 @@ public abstract class AbstractIetfInetUtil { * @throws IllegalArgumentException if addr is not an {@link Inet6Address} * @throws NullPointerException if addr is null */ - @Nonnull public final A6 ipv6AddressFor(@Nonnull final InetAddress addr) { + @Nonnull public final A6NZ 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(addressStringV6(addr)); + return nozone6Factory.newInstance(addressStringV6(addr)); } @Nonnull public final A6 ipv6AddressFrom(@Nonnull final P6 prefix) { - return prefixToAddress(address6Factory, ipv6PrefixString(prefix)); + return prefixToAddress(nozone6Factory, ipv6PrefixString(prefix)); } @Nonnull public final byte[] ipv6AddressBytes(@Nonnull final A6 addr) { final String str = ipv6AddressString(addr); - final byte[] bytes = new byte[INET6_LENGTH]; final int percent = str.indexOf('%'); - Ipv6Utils.fillIpv6Bytes(bytes, str, percent == -1 ? str.length() : percent); + return ipv6AddressBytes(str, percent == -1 ? str.length() : percent); + } + + protected static final byte[] ipv6AddressBytes(@Nonnull final String str, final int length) { + final byte[] bytes = new byte[INET6_LENGTH]; + Ipv6Utils.fillIpv6Bytes(bytes, str, length); return bytes; } + /** * Create a /128 Ipv6Prefix by interpreting input bytes as an IPv6 address. * @@ -362,7 +403,7 @@ public abstract class AbstractIetfInetUtil { } Preconditions.checkArgument(mask > 0 && mask <= 128, "Invalid mask %s", mask); - final int size = (mask / Byte.SIZE) + ((mask % Byte.SIZE == 0) ? 0 : 1); + final int size = mask / Byte.SIZE + (mask % Byte.SIZE == 0 ? 0 : 1); // Until we can instantiate an IPv6 address for a partial array, use a temporary buffer byte[] tmp = new byte[INET6_LENGTH]; @@ -411,8 +452,8 @@ public abstract class AbstractIetfInetUtil { return prefix6Factory.newInstance(ipv6AddressString(addr) + '/' + mask); } - @Nonnull public final Entry splitIpv6Prefix(@Nonnull final P6 prefix) { - return splitPrefix(address6Factory, ipv6PrefixString(prefix)); + @Nonnull public final Entry splitIpv6Prefix(@Nonnull final P6 prefix) { + return splitPrefix(nozone6Factory, ipv6PrefixString(prefix)); } private static T prefixToAddress(final StringValueObjectFactory factory, final String str) { 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 ca4d227f7d..51b08681ac 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 @@ -12,7 +12,8 @@ import java.util.regex.Pattern; import javax.annotation.Nonnull; import javax.annotation.RegEx; -final class IpUtil extends AbstractIetfInetUtil { +final class IpUtil extends AbstractIetfInetUtil { @RegEx private static final String IP_V4_REGEX = "^\\d+\\.\\d+\\.\\d+\\.\\d+$"; @@ -28,21 +29,31 @@ final class IpUtil extends AbstractIetfInetUtil