Add utility methods to strip zone from Ipv{4,6}Address 91/86791/1
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 7 Jan 2020 11:25:33 +0000 (12:25 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 7 Jan 2020 13:14:44 +0000 (14:14 +0100)
Most callers really want to operate of Ipv4AddressNoZone, as a zone
does not make sense. Some amount of translation may be needed when
dealing with models which we have no control over, hence ensuring
no zone is present needs to be done quickly.

This adds ipv4AddressNoZoneFor(Ipv4Address), which does an efficient
check (for the case where the source is already a NoZone) and strips
the zone.

Change-Id: Ieada4625637d0216983b515324bb5d33f5d33a99
JIRA: MDSAL-510
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 6c02ae5ce070dfeeeaae878dc5436c601d305886)

model/ietf/ietf-type-util/src/main/java/org/opendaylight/mdsal/model/ietf/util/AbstractIetfInetUtil.java
model/ietf/rfc6991-ietf-inet-types/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IetfInetUtilTest.java

index aca74d459f89f2629f3e8bb066580dd48e86dc0f..f03970f66b759962c906aafe844de8edf6a761d8 100644 (file)
@@ -37,10 +37,14 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
     private final StringValueObjectFactory<A6> address6Factory;
     private final StringValueObjectFactory<A6NZ> address6NoZoneFactory;
     private final StringValueObjectFactory<P6> prefix6Factory;
+    private final Class<A4NZ> addr4nzClass;
+    private final Class<A6NZ> addr6nzClass;
 
     protected AbstractIetfInetUtil(final Class<A4> addr4Class, final Class<A4NZ> addr4nzClass,
             final Class<P4> prefix4Class, final Class<A6> addr6Class, final Class<A6NZ> addr6nzClass,
             final Class<P6> prefix6Class) {
+        this.addr4nzClass = requireNonNull(addr4nzClass);
+        this.addr6nzClass = requireNonNull(addr6nzClass);
         this.address4Factory = StringValueObjectFactory.create(addr4Class, "0.0.0.0");
         this.address4NoZoneFactory = StringValueObjectFactory.create(addr4nzClass, "0.0.0.0");
         this.prefix4Factory = StringValueObjectFactory.create(prefix4Class, "0.0.0.0/0");
@@ -296,6 +300,19 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
         return address4NoZoneFactory.newInstance(Ipv4Utils.addressString(bits));
     }
 
+    /**
+     * Create an Ipv4AddressNoZone by interpreting an Ipv4Address.
+     *
+     * @param addr An Ipv4Address
+     * @return An Ipv4AddressNoZone object
+     * @throws NullPointerException if addr is null
+     */
+    public final @NonNull A4NZ ipv4AddressNoZoneFor(final @NonNull A4 addr) {
+        requireNonNull(addr, "Address must not be null");
+        return addr4nzClass.isInstance(addr) ? addr4nzClass.cast(addr)
+                : address4NoZoneFactory.newInstance(stripZone(ipv4AddressString(addr)));
+    }
+
     public final @NonNull A4 ipv4AddressFrom(final @NonNull P4 prefix) {
         return prefixToAddress(address4Factory, ipv4PrefixString(prefix));
     }
@@ -505,6 +522,19 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
         return address6NoZoneFactory.newInstance(addressStringV6(addr));
     }
 
+    /**
+     * Create an Ipv6AddressNoZone by interpreting an Ipv6Address.
+     *
+     * @param addr An Ipv6Address
+     * @return An Ipv6AddressNoZone object
+     * @throws NullPointerException if addr is null
+     */
+    public final @NonNull A6NZ ipv6AddressNoZoneFor(final @NonNull A6 addr) {
+        requireNonNull(addr, "Address must not be null");
+        return addr6nzClass.isInstance(addr) ? addr6nzClass.cast(addr)
+                : address6NoZoneFactory.newInstance(stripZone(ipv6AddressString(addr)));
+    }
+
     public final @NonNull A6 ipv6AddressFrom(final @NonNull P6 prefix) {
         return prefixToAddress(address6Factory, ipv6PrefixString(prefix));
     }
index 2a4ada40fd7169a595086f4226eaeb82cab22341..141c5fa509ed898507e1492e79ca51c876ec412e 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertSame;
 
 import java.lang.reflect.Constructor;
 import org.junit.Test;
@@ -63,4 +64,28 @@ public class IetfInetUtilTest {
         assertEquals(new Ipv4Prefix("1.2.3.4/8"), IetfInetUtil.INSTANCE.ipv4PrefixFor(new Ipv4Address("1.2.3.4%1"), 8));
         assertEquals(new Ipv6Prefix("ff00::/8"), IetfInetUtil.INSTANCE.ipv6PrefixFor(new Ipv6Address("ff00::%bar"), 8));
     }
-}
\ No newline at end of file
+
+    @Test
+    public void testIpv4ZoneStripping() {
+        final Ipv4AddressNoZone noZone = new Ipv4AddressNoZone("1.2.3.4");
+        assertSame(noZone, IetfInetUtil.INSTANCE.ipv4AddressNoZoneFor(noZone));
+
+        final Ipv4Address withoutZone = new Ipv4Address(noZone);
+        final Ipv4AddressNoZone stripped = IetfInetUtil.INSTANCE.ipv4AddressNoZoneFor(withoutZone);
+        assertSame(withoutZone.getValue(), stripped.getValue());
+
+        assertEquals(noZone, IetfInetUtil.INSTANCE.ipv4AddressNoZoneFor(new Ipv4Address("1.2.3.4%1")));
+    }
+
+    @Test
+    public void testIpv6ZoneStripping() {
+        final Ipv6AddressNoZone noZone = new Ipv6AddressNoZone("ff00::");
+        assertSame(noZone, IetfInetUtil.INSTANCE.ipv6AddressNoZoneFor(noZone));
+
+        final Ipv6Address withoutZone = new Ipv6Address(noZone);
+        final Ipv6AddressNoZone stripped = IetfInetUtil.INSTANCE.ipv6AddressNoZoneFor(withoutZone);
+        assertSame(withoutZone.getValue(), stripped.getValue());
+
+        assertEquals(noZone, IetfInetUtil.INSTANCE.ipv6AddressNoZoneFor(new Ipv6Address("ff00::%1")));
+    }
+}