From 7cbd12d8894b1703b19e70b07436a937a7b8d0bf Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 5 Jan 2020 13:33:34 +0100 Subject: [PATCH] Add HexString/DottedQuad/Uuid support to IetfYangUtil HexString is similar to a MacAddress and PhysAddress, hence it is very simple to support it. DottedQuad is essentially an Ipv4Address, hence it is almost as simple to support it, too. Uuid can be created from java.util.UUID, so that is the input we are expecting. JIRA: MDSAL-508 Change-Id: I82abd68b23bf857deeb9a64eefb69164fe6c8b24 Signed-off-by: Robert Varga --- .../model/ietf/util/AbstractIetfInetUtil.java | 2 +- .../model/ietf/util/AbstractIetfYangUtil.java | 42 +++++++++++++++- .../ietf/util/AbstractIetfYangUtilTest.java | 34 ++++++++++++- .../mdsal/model/ietf/util/HexClass.java | 27 +++++++++++ .../mdsal/model/ietf/util/MacUtil.java | 19 ++++++-- .../mdsal/model/ietf/util/QuadClass.java | 27 +++++++++++ .../mdsal/model/ietf/util/UuidClass.java | 27 +++++++++++ .../yang/types/rev130715/IetfYangUtil.java | 14 +++++- .../types/rev130715/IetfYangUtilTest.java | 48 +++++++++++++++++++ 9 files changed, 229 insertions(+), 11 deletions(-) create mode 100644 model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/HexClass.java create mode 100644 model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/QuadClass.java create mode 100644 model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/UuidClass.java create mode 100644 model/ietf/rfc6991-ietf-yang-types/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/yang/types/rev130715/IetfYangUtilTest.java diff --git a/model/ietf/ietf-type-util/src/main/java/org/opendaylight/mdsal/model/ietf/util/AbstractIetfInetUtil.java b/model/ietf/ietf-type-util/src/main/java/org/opendaylight/mdsal/model/ietf/util/AbstractIetfInetUtil.java index 85dc1c6323..a67cc8f13e 100644 --- a/model/ietf/ietf-type-util/src/main/java/org/opendaylight/mdsal/model/ietf/util/AbstractIetfInetUtil.java +++ b/model/ietf/ietf-type-util/src/main/java/org/opendaylight/mdsal/model/ietf/util/AbstractIetfInetUtil.java @@ -648,7 +648,7 @@ public abstract class AbstractIetfInetUtil phys-address type */ @Beta -public abstract class AbstractIetfYangUtil { +public abstract class AbstractIetfYangUtil { private static final int MAC_BYTE_LENGTH = 6; private static final char[] HEX_CHARS = "0123456789abcdef".toCharArray(); private static final byte @NonNull[] EMPTY_BYTES = new byte[0]; @@ -47,10 +48,17 @@ public abstract class AbstractIetfYangUtil { private final StringValueObjectFactory macFactory; private final StringValueObjectFactory

physFactory; + private final StringValueObjectFactory hexFactory; + private final StringValueObjectFactory quadFactory; + private final StringValueObjectFactory uuidFactory; - protected AbstractIetfYangUtil(final Class macClass, final Class

physClass) { + protected AbstractIetfYangUtil(final Class macClass, final Class

physClass, final Class hexClass, + final Class quadClass, final Class uuidClass) { this.macFactory = StringValueObjectFactory.create(macClass, "00:00:00:00:00:00"); this.physFactory = StringValueObjectFactory.create(physClass, "00:00"); + this.hexFactory = StringValueObjectFactory.create(hexClass, "00"); + this.quadFactory = StringValueObjectFactory.create(quadClass, "0.0.0.0"); + this.uuidFactory = StringValueObjectFactory.create(uuidClass, "f81d4fae-7dec-11d0-a765-00a0c91e6bf6"); } /** @@ -118,10 +126,40 @@ public abstract class AbstractIetfYangUtil { return macAddressBytes(macAddress); } + public final @NonNull H hexStringFor(final byte @NonNull[] bytes) { + checkArgument(bytes.length > 0, "Hex string should have at least one byte"); + return hexFactory.newInstance(bytesToString(bytes, bytes.length * 3 - 1)); + } + + public final byte @NonNull[] hexStringBytes(final @NonNull H hexString) { + final String str = getHexValue(hexString); + return stringToBytes(str, str.length() / 3 + 1); + } + + public final @NonNull Q dottedQuadFor(final byte @NonNull[] bytes) { + checkArgument(bytes.length == 4, "Dotted-quad should have 4 bytes"); + return quadFactory.newInstance(AbstractIetfInetUtil.addressStringV4(bytes)); + } + + public final byte @NonNull[] dottedQuadBytes(final @NonNull Q hexString) { + final String str = getQuadValue(hexString); + final byte[] bytes = new byte[4]; + Ipv4Utils.fillIpv4Bytes(bytes, 0, str, 0, str.length()); + return bytes; + } + + public final @NonNull U uuidFor(final @NonNull UUID uuid) { + return uuidFactory.newInstance(uuid.toString()); + } + protected abstract String getValue(M macAddress); protected abstract String getPhysValue(P physAddress); + protected abstract String getHexValue(H hexString); + + protected abstract String getQuadValue(Q dottedQuad); + static byte hexValue(final char ch) { byte value; try { diff --git a/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/AbstractIetfYangUtilTest.java b/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/AbstractIetfYangUtilTest.java index 29ea958b82..2b44c9d040 100644 --- a/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/AbstractIetfYangUtilTest.java +++ b/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/AbstractIetfYangUtilTest.java @@ -11,6 +11,7 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; +import java.util.UUID; import org.junit.Test; public class AbstractIetfYangUtilTest { @@ -34,7 +35,22 @@ public class AbstractIetfYangUtilTest { } @Test - public void testPhysToBytes() throws Exception { + public void testBytesToHex() { + final HexClass hex = UTIL.hexStringFor(BYTES); + assertEquals(CANON, hex.getValue()); + } + + @Test + public void testHexToBytes() { + final byte[] bytes1 = UTIL.hexStringBytes(new HexClass(CANON)); + assertArrayEquals(BYTES, bytes1); + + final byte[] bytes2 = UTIL.hexStringBytes(new HexClass("01:02:1E:5a:Fb:88")); + assertArrayEquals(BYTES, bytes2); + } + + @Test + public void testPhysToBytes() { final byte[] bytes1 = UTIL.physAddressBytes(new PhysClass(CANON)); assertArrayEquals(BYTES, bytes1); @@ -46,6 +62,22 @@ public class AbstractIetfYangUtilTest { assertArrayEquals(new byte[] { (byte) 0xaa, (byte) 0xbb }, UTIL.physAddressBytes(new PhysClass("aa:bb"))); } + @Test + public void testQuadBytes() { + assertArrayEquals(new byte[] { 1, 2, 3, 4 }, UTIL.dottedQuadBytes(new QuadClass("1.2.3.4"))); + } + + @Test + public void testQuadFor() { + assertEquals("1.2.3.4", UTIL.dottedQuadFor(new byte[] { 1, 2, 3, 4 }).getValue()); + } + + @Test + public void testUuidFor() { + final UUID uuid = UUID.fromString("f81d4fae-7dec-11d0-a765-00a0c91e6bf6"); + assertEquals("f81d4fae-7dec-11d0-a765-00a0c91e6bf6", UTIL.uuidFor(uuid).getValue()); + } + @Test public void canonizeMACTest() throws Exception { assertEquals(CANON, UTIL.canonizeMacAddress(new MacClass("01:02:1E:5A:FB:88")).getValue()); diff --git a/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/HexClass.java b/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/HexClass.java new file mode 100644 index 0000000000..00ddd88275 --- /dev/null +++ b/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/HexClass.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.mdsal.model.ietf.util; + +import static java.util.Objects.requireNonNull; + +@SuppressWarnings("checkstyle:memberName") +public final class HexClass { + private final String _value; + + public HexClass(final String value) { + this._value = requireNonNull(value); + } + + public HexClass(final HexClass template) { + this._value = template._value; + } + + String getValue() { + return _value; + } +} \ No newline at end of file diff --git a/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/MacUtil.java b/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/MacUtil.java index 6861734aaa..2130d4c8e7 100644 --- a/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/MacUtil.java +++ b/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/MacUtil.java @@ -5,12 +5,11 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.mdsal.model.ietf.util; -final class MacUtil extends AbstractIetfYangUtil { +final class MacUtil extends AbstractIetfYangUtil { MacUtil() { - super(MacClass.class, PhysClass.class); + super(MacClass.class, PhysClass.class, HexClass.class, QuadClass.class, UuidClass.class); } @Override @@ -19,7 +18,17 @@ final class MacUtil extends AbstractIetfYangUtil { } @Override - protected String getPhysValue(PhysClass physAddress) { + protected String getPhysValue(final PhysClass physAddress) { return physAddress.getValue(); } -} \ No newline at end of file + + @Override + protected String getHexValue(final HexClass hexString) { + return hexString.getValue(); + } + + @Override + protected String getQuadValue(final QuadClass dottedQuad) { + return dottedQuad.getValue(); + } +} diff --git a/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/QuadClass.java b/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/QuadClass.java new file mode 100644 index 0000000000..9495670b18 --- /dev/null +++ b/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/QuadClass.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.mdsal.model.ietf.util; + +import static java.util.Objects.requireNonNull; + +@SuppressWarnings("checkstyle:memberName") +public final class QuadClass { + private final String _value; + + public QuadClass(final String value) { + this._value = requireNonNull(value); + } + + public QuadClass(final QuadClass template) { + this._value = template._value; + } + + String getValue() { + return _value; + } +} \ No newline at end of file diff --git a/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/UuidClass.java b/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/UuidClass.java new file mode 100644 index 0000000000..c6446ba802 --- /dev/null +++ b/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/UuidClass.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.mdsal.model.ietf.util; + +import static java.util.Objects.requireNonNull; + +@SuppressWarnings("checkstyle:memberName") +public final class UuidClass { + private final String _value; + + public UuidClass(final String value) { + this._value = requireNonNull(value); + } + + public UuidClass(final UuidClass template) { + this._value = template._value; + } + + String getValue() { + return _value; + } +} \ No newline at end of file diff --git a/model/ietf/rfc6991-ietf-yang-types/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/yang/types/rev130715/IetfYangUtil.java b/model/ietf/rfc6991-ietf-yang-types/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/yang/types/rev130715/IetfYangUtil.java index d10452e19d..0bc92bc5af 100644 --- a/model/ietf/rfc6991-ietf-yang-types/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/yang/types/rev130715/IetfYangUtil.java +++ b/model/ietf/rfc6991-ietf-yang-types/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/yang/types/rev130715/IetfYangUtil.java @@ -14,11 +14,11 @@ import org.opendaylight.mdsal.model.ietf.util.AbstractIetfYangUtil; * Utility methods for working with types defined in ietf-yang-types. */ @Beta -public final class IetfYangUtil extends AbstractIetfYangUtil { +public final class IetfYangUtil extends AbstractIetfYangUtil { public static final IetfYangUtil INSTANCE = new IetfYangUtil(); private IetfYangUtil() { - super(MacAddress.class, PhysAddress.class); + super(MacAddress.class, PhysAddress.class, HexString.class, DottedQuad.class, Uuid.class); } @Override @@ -30,4 +30,14 @@ public final class IetfYangUtil extends AbstractIetfYangUtil