+ private final StringValueObjectFactory<M> macFactory;
+ private final StringValueObjectFactory<P> physFactory;
+ private final StringValueObjectFactory<H> hexFactory;
+ private final StringValueObjectFactory<Q> quadFactory;
+ private final StringValueObjectFactory<U> uuidFactory;
+
+ protected AbstractIetfYangUtil(final Class<M> macClass, final Class<P> physClass, final Class<H> hexClass,
+ final Class<Q> quadClass, final Class<U> 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");
+ }
+
+ /**
+ * Convert the value of a MacAddress into the canonical representation.
+ *
+ * @param macAddress Input MAC address
+ * @return A MacAddress containing the canonical representation.
+ * @throws NullPointerException if macAddress is null
+ */
+ public final @NonNull M canonizeMacAddress(final @NonNull M macAddress) {
+ final char[] input = getValue(macAddress).toCharArray();
+ return ensureLowerCase(input) ? macFactory.newInstance(String.valueOf(input)) : macAddress;
+ }
+
+ /**
+ * Create a MacAddress object holding the canonical representation of the 6 bytes
+ * passed in as argument.
+ * @param bytes 6-byte input array
+ * @return MacAddress with canonical string derived from input bytes
+ * @throws NullPointerException if bytes is null
+ * @throws IllegalArgumentException if length of input is not 6 bytes
+ */
+ public final @NonNull M macAddressFor(final byte @NonNull[] bytes) {
+ checkArgument(bytes.length == MAC_BYTE_LENGTH, "MAC address should have 6 bytes, not %s",
+ bytes.length);
+ return macFactory.newInstance(bytesToString(bytes, 17));
+ }
+
+ public final byte @NonNull[] macAddressBytes(final @NonNull M macAddress) {
+ return stringToBytes(getValue(macAddress), MAC_BYTE_LENGTH);
+ }
+
+ /**
+ * Convert the value of a PhysAddress into the canonical representation.
+ *
+ * @param physAddress Input MAC address
+ * @return A PhysAddress containing the canonical representation.
+ * @throws NullPointerException if physAddress is null
+ */
+ public final @NonNull P canonizePhysAddress(final @NonNull P physAddress) {
+ final char[] input = getPhysValue(physAddress).toCharArray();
+ return ensureLowerCase(input) ? physFactory.newInstance(String.valueOf(input)) : physAddress;
+ }
+
+ /**
+ * Create a PhysAddress object holding the canonical representation of the bytes passed in as argument.
+ *
+ * @param bytes input array
+ * @return PhysAddress with canonical string derived from input bytes
+ * @throws NullPointerException if bytes is null
+ * @throws IllegalArgumentException if length of input is not at least 1 byte
+ */
+ public final @NonNull P physAddressFor(final byte @NonNull[] bytes) {
+ checkArgument(bytes.length > 0, "Physical address should have at least one byte");
+ return physFactory.newInstance(bytesToString(bytes, bytes.length * 3 - 1));
+ }
+
+ public final byte @NonNull[] physAddressBytes(final @NonNull P physAddress) {
+ final String str = getPhysValue(physAddress);
+ return str.isEmpty() ? EMPTY_BYTES : stringToBytes(str, str.length() / 3 + 1);
+ }
+
+ @Deprecated
+ public final byte @NonNull[] bytesFor(final @NonNull M macAddress) {
+ 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;
+ }