Add NoZone support 69/70769/7
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 11 Apr 2018 01:28:40 +0000 (03:28 +0200)
committerTom Pantelis <tompantelis@gmail.com>
Tue, 17 Apr 2018 22:12:03 +0000 (22:12 +0000)
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 <robert.varga@pantheon.tech>
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/util/StringValueObjectFactory.java
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-2013-07-15/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/HostBuilderTest.java
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
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
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
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
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 c55b9621d1821ac73a7eb3e3d6c835bdbe2e623e..865ad626b2e5ebb242b2e314dc35c61c15098340 100644 (file)
@@ -74,12 +74,7 @@ public final class StringValueObjectFactory<T> {
             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<T> ret;
@@ -115,6 +110,24 @@ public final class StringValueObjectFactory<T> {
         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");
index ea7e4a0235b9d07207812ce9cdf199fbd308451c..10c018979971b47815df4fa6877e2ad8fdc7b825 100644 (file)
@@ -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<Ipv4Address, Ipv4Prefix, Ipv6Address, Ipv6Prefix, IpAddress, IpPrefix> {
+public final class IetfInetUtil extends AbstractIetfInetUtil<Ipv4Address, Ipv4AddressNoZone, Ipv4Prefix, Ipv6Address,
+        Ipv6AddressNoZone, Ipv6Prefix, IpAddress, IpAddressNoZone, IpPrefix> {
     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<Ipv4Address, Ipv4Pr
         return new IpAddress(addr);
     }
 
+    @Override
+    protected IpAddressNoZone ipv4AddressNoZone(final Ipv4AddressNoZone addr) {
+        return new IpAddressNoZone(addr);
+    }
+
     @Override
     protected IpAddress ipv6Address(final Ipv6Address addr) {
         return new IpAddress(addr);
     }
 
     @Override
-    protected IpPrefix ipv4Prefix(Ipv4Prefix addr) {
+    protected IpAddressNoZone ipv6AddressNoZone(final Ipv6AddressNoZone addr) {
+        return new IpAddressNoZone(addr);
+    }
+
+    @Override
+    protected IpPrefix ipv4Prefix(final Ipv4Prefix addr) {
         return new IpPrefix(addr);
     }
 
     @Override
-    protected IpPrefix ipv6Prefix(Ipv6Prefix addr) {
+    protected IpPrefix ipv6Prefix(final Ipv6Prefix addr) {
         return new IpPrefix(addr);
     }
 
index be36aaca01e9cad1022b38acf5b16282fe98e930..1c38ce208b12b49511fd952dc3e9a17bd4226f6e 100644 (file)
@@ -19,10 +19,10 @@ public class HostBuilderTest {
 
     @Test
     public void testGetDefaultInstance() throws Exception {
-        final Constructor constructor = HostBuilder.class.getDeclaredConstructor();
+        final Constructor<HostBuilder> 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");
index 5e50cf446ddf0619ec4d7402c8feca5009d18b25..974d5ff9dfe790f73b733cb0d8884e4df0dea64e 100644 (file)
@@ -19,17 +19,17 @@ public class IetfInetUtilTest {
 
     @Test
     public void testIetfInetUtilConstructor() throws Exception {
-        final Constructor constructor = IetfInetUtil.class.getDeclaredConstructor();
+        final Constructor<IetfInetUtil> 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);
index d12a7cd466e861bd1e2db4518c137f83850cd8b6..db91a41f0154f960b91bbcff5198942c090b2c85 100644 (file)
@@ -19,10 +19,10 @@ public class IpAddressBuilderTest {
 
     @Test
     public void testGetDefaultInstance() throws Exception {
-        final Constructor constructor = IpAddressBuilder.class.getDeclaredConstructor();
+        final Constructor<IpAddressBuilder> 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");
index 30de24fce9b796ac4eb0ad14c16b76eef127b615..c00103b0ea926faafa77c9672398dca4eab22eb2 100644 (file)
@@ -19,10 +19,10 @@ public class IpAddressNoZoneBuilderTest {
 
     @Test
     public void testGetDefaultInstance() throws Exception {
-        final Constructor constructor = IpAddressNoZoneBuilder.class.getDeclaredConstructor();
+        final Constructor<IpAddressNoZoneBuilder> 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");
index a56b109f2425e10c791b70c983ac0243925e8e4a..0f49557fe8e0adf388f398ef4fa19a841cd323d1 100644 (file)
@@ -19,10 +19,10 @@ public class IpPrefixBuilderTest {
 
     @Test
     public void testGetDefaultInstance() throws Exception {
-        final Constructor constructor = IpPrefixBuilder.class.getDeclaredConstructor();
+        final Constructor<IpPrefixBuilder> 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");
index 1549b6e0f920e7d0a6bcdadb0261bb83a3b0d2ef..41b9ec1e3151c498d95fc32282f2430d9da5a7c8 100644 (file)
@@ -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<Ipv4Address, Ipv4Prefix, Ipv6Address, Ipv6Prefix, IpAddress, IpPrefix> {
+public final class IetfInetUtil extends AbstractIetfInetUtil<Ipv4Address, Ipv4Address, Ipv4Prefix, Ipv6Address,
+        Ipv6Address, Ipv6Prefix, IpAddress, IpAddress, IpPrefix> {
     public static final IetfInetUtil INSTANCE = new IetfInetUtil();
 
     private IetfInetUtil() {
@@ -26,18 +27,28 @@ public final class IetfInetUtil extends AbstractIetfInetUtil<Ipv4Address, Ipv4Pr
         return new IpAddress(addr);
     }
 
+    @Override
+    protected IpAddress ipv4AddressNoZone(final Ipv4Address addr) {
+        return new IpAddress(addr);
+    }
+
     @Override
     protected IpAddress ipv6Address(final Ipv6Address addr) {
         return new IpAddress(addr);
     }
 
     @Override
-    protected IpPrefix ipv4Prefix(Ipv4Prefix addr) {
+    protected IpAddress ipv6AddressNoZone(final Ipv6Address addr) {
+        return new IpAddress(addr);
+    }
+
+    @Override
+    protected IpPrefix ipv4Prefix(final Ipv4Prefix addr) {
         return new IpPrefix(addr);
     }
 
     @Override
-    protected IpPrefix ipv6Prefix(Ipv6Prefix addr) {
+    protected IpPrefix ipv6Prefix(final Ipv6Prefix addr) {
         return new IpPrefix(addr);
     }
 
index 9114644585a9077d856e521829b55d342f4950d1..51e9638791c933f8a1f8e4f9ca9efa1260622d8b 100644 (file)
@@ -24,24 +24,27 @@ 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, P> {
-    private static final int INET4_LENGTH = 4;
-    private static final int INET6_LENGTH = 16;
-    private final StringValueObjectFactory<A4> address4Factory;
+public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ extends A6, P6, A, ANZ, P> {
+    protected static final int INET4_LENGTH = 4;
+    protected static final int INET6_LENGTH = 16;
+    private final StringValueObjectFactory<A4NZ> nozone4Factory;
     private final StringValueObjectFactory<P4> prefix4Factory;
-    private final StringValueObjectFactory<A6> address6Factory;
+    private final StringValueObjectFactory<A6NZ> nozone6Factory;
     private final StringValueObjectFactory<P6> prefix6Factory;
 
-    protected AbstractIetfInetUtil(final Class<A4> addr4Class, final Class<P4> prefix4Class,
-            final Class<A6> addr6Class, final Class<P6> prefix6Class) {
-        this.address4Factory = StringValueObjectFactory.create(addr4Class, "0.0.0.0");
+    protected AbstractIetfInetUtil(final Class<A4NZ> nozone4Class, final Class<P4> prefix4Class,
+            final Class<A6NZ> nozone6Class, final Class<P6> 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<A4, P4, A6, P6, A, P> {
         }
     }
 
+    /**
+     * 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<A4, P4, A6, P6, A, P> {
         }
     }
 
+    @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<A4, P4, A6, P6, A, P> {
      *         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<A4, P4, A6, P6, A, P> {
      * @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<A4, P4, A6, P6, A, P> {
      * @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<A4, P4, A6, P6, A, P> {
          * 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<A4, P4, A6, P6, A, P> {
             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<A4, P4, A6, P6, A, P> {
             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<A4, P4, A6, P6, A, P> {
         return prefix4Factory.newInstance(ipv4AddressString(addr) + '/' + mask);
     }
 
-    @Nonnull public final Entry<A4, Integer> splitIpv4Prefix(@Nonnull final P4 prefix) {
-        return splitPrefix(address4Factory, ipv4PrefixString(prefix));
+    @Nonnull public final Entry<A4NZ, Integer> 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<A4, P4, A6, P6, A, P> {
      * @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<A4, P4, A6, P6, A, P> {
      * @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<A4, P4, A6, P6, A, P> {
         }
 
         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<A4, P4, A6, P6, A, P> {
         return prefix6Factory.newInstance(ipv6AddressString(addr) + '/' + mask);
     }
 
-    @Nonnull public final Entry<A6, Integer> splitIpv6Prefix(@Nonnull final P6 prefix) {
-        return splitPrefix(address6Factory, ipv6PrefixString(prefix));
+    @Nonnull public final Entry<A6NZ, Integer> splitIpv6Prefix(@Nonnull final P6 prefix) {
+        return splitPrefix(nozone6Factory, ipv6PrefixString(prefix));
     }
 
     private static <T> T prefixToAddress(final StringValueObjectFactory<T> factory, final String str) {
index ca4d227f7d820303c207f31c8c7c666306426888..51b08681ac551e771b087d18aa7679265f663276 100644 (file)
@@ -12,7 +12,8 @@ import java.util.regex.Pattern;
 import javax.annotation.Nonnull;
 import javax.annotation.RegEx;
 
-final class IpUtil extends AbstractIetfInetUtil<IpClass, IpClass, IpClass, IpClass, IpClass, IpClass> {
+final class IpUtil extends AbstractIetfInetUtil<IpClass, IpClass, IpClass, IpClass, IpClass, IpClass, IpClass,
+        IpClass, IpClass> {
 
     @RegEx
     private static final String IP_V4_REGEX = "^\\d+\\.\\d+\\.\\d+\\.\\d+$";
@@ -28,21 +29,31 @@ final class IpUtil extends AbstractIetfInetUtil<IpClass, IpClass, IpClass, IpCla
         return addr;
     }
 
+    @Override
+    protected IpClass ipv4AddressNoZone(final IpClass addr) {
+        return addr;
+    }
+
     @Override
     @Nonnull
     protected IpClass ipv6Address(final IpClass addr) {
         return addr;
     }
 
+    @Override
+    protected IpClass ipv6AddressNoZone(final IpClass addr) {
+        return addr;
+    }
+
     @Override
     @Nonnull
-    protected IpClass ipv4Prefix(IpClass addr) {
+    protected IpClass ipv4Prefix(final IpClass addr) {
         return addr;
     }
 
     @Override
     @Nonnull
-    protected IpClass ipv6Prefix(IpClass addr) {
+    protected IpClass ipv6Prefix(final IpClass addr) {
         return addr;
     }
 
@@ -71,12 +82,12 @@ final class IpUtil extends AbstractIetfInetUtil<IpClass, IpClass, IpClass, IpCla
     }
 
     @Override
-    protected IpClass maybeIpv4Address(IpClass addr) {
+    protected IpClass maybeIpv4Address(final IpClass addr) {
         return IP_V4_PATTERN.matcher(addr.getValue()).matches() ? addr : null;
     }
 
     @Override
-    protected IpClass maybeIpv6Address(IpClass addr) {
+    protected IpClass maybeIpv6Address(final IpClass addr) {
         return addr.getValue().indexOf(':') != -1 ? addr : null;
     }
 }
\ No newline at end of file