From 489e932e3843f5d14e5b5867a7532f674a06ca61 Mon Sep 17 00:00:00 2001 From: "ICKostiantyn.Ivanov" Date: Sun, 28 Jan 2024 10:05:13 +0100 Subject: [PATCH 1/3] BAEL-6716 - Storing UUID as Base64 String in Java --- core-java-modules/core-java-uuid/pom.xml | 10 +++ .../uuid/DecodeUUIDStringFromBase64Test.java | 61 +++++++++++++++++++ .../uuid/EncodeUUIDToBase64StringTest.java | 59 ++++++++++++++++++ 3 files changed, 130 insertions(+) create mode 100644 core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/DecodeUUIDStringFromBase64Test.java create mode 100644 core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/EncodeUUIDToBase64StringTest.java diff --git a/core-java-modules/core-java-uuid/pom.xml b/core-java-modules/core-java-uuid/pom.xml index e6710dbdf2..76154033c2 100644 --- a/core-java-modules/core-java-uuid/pom.xml +++ b/core-java-modules/core-java-uuid/pom.xml @@ -29,6 +29,16 @@ tsid-creator 5.2.3 + + commons-codec + commons-codec + 1.16.0 + + + org.apache.commons + commons-lang3 + 3.14.0 + diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/DecodeUUIDStringFromBase64Test.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/DecodeUUIDStringFromBase64Test.java new file mode 100644 index 0000000000..043ec59fb5 --- /dev/null +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/DecodeUUIDStringFromBase64Test.java @@ -0,0 +1,61 @@ +package com.baeldung.uuid; + +import static org.apache.commons.codec.binary.Base64.decodeBase64; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.nio.ByteBuffer; +import java.util.Base64; +import java.util.UUID; + +import org.apache.commons.lang3.Conversion; +import org.junit.jupiter.api.Test; + +public class DecodeUUIDStringFromBase64Test { + private final UUID originalUUID = UUID.fromString("cc5f93f7-8cf1-4a51-83c6-e740313a0c6c"); + + @Test + public void shouldDecodeUUIDUsingByteArrayAndBase64Decoder() { + byte[] decodedBytes = Base64.getDecoder() + .decode("UUrxjPeTX8xsDDoxQOfGgw"); + UUID uuid = convertToUUID(decodedBytes); + assertEquals(originalUUID, uuid); + } + + @Test + public void shouldDecodeUUIDUsingByteBufferAndBase64UrlDecoder() { + byte[] decodedBytes = Base64.getUrlDecoder() + .decode("zF-T94zxSlGDxudAMToMbA"); + ByteBuffer byteBuffer = ByteBuffer.wrap(decodedBytes); + long mostSignificantBits = byteBuffer.getLong(); + long leastSignificantBits = byteBuffer.getLong(); + UUID uuid = new UUID(mostSignificantBits, leastSignificantBits); + assertEquals(originalUUID, uuid); + } + + @Test + public void shouldDecodeUUIDUsingApacheUtils() { + byte[] decodedBytes = decodeBase64("UUrxjPeTX8xsDDoxQOfGgw"); + UUID uuid = Conversion.byteArrayToUuid(decodedBytes, 0); + assertEquals(originalUUID, uuid); + } + + private UUID convertToUUID(byte[] src) { + long mostSignificantBits = convertBytesToLong(src, 0); + long leastSignificantBits = convertBytesToLong(src, 8); + + return new UUID(mostSignificantBits, leastSignificantBits); + } + + private long convertBytesToLong(byte[] uuidBytes, int start) { + long result = 0; + + for(int i = 0; i < 8; i++) { + int shift = i * 8; + long bits = (255L & (long)uuidBytes[i + start]) << shift; + long mask = 255L << shift; + result = result & ~mask | bits; + } + + return result; + } +} diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/EncodeUUIDToBase64StringTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/EncodeUUIDToBase64StringTest.java new file mode 100644 index 0000000000..cef80cdc24 --- /dev/null +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/EncodeUUIDToBase64StringTest.java @@ -0,0 +1,59 @@ +package com.baeldung.uuid; + +import static org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.nio.ByteBuffer; +import java.util.Base64; +import java.util.UUID; + +import org.apache.commons.lang3.Conversion; +import org.junit.jupiter.api.Test; + +public class EncodeUUIDToBase64StringTest { + private final UUID originalUUID = UUID.fromString("cc5f93f7-8cf1-4a51-83c6-e740313a0c6c"); + + @Test + public void shouldEncodeUUIDUsingByteArrayAndBase64Encoder() { + byte[] uuidBytes = convertToByteArray(originalUUID); + String encodedUUID = Base64.getEncoder().withoutPadding() + .encodeToString(uuidBytes); + assertEquals("UUrxjPeTX8xsDDoxQOfGgw", encodedUUID); + } + + @Test + public void shouldEncodeUUIDUsingByteBufferAndBase64UrlEncoder() { + ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[16]); + byteBuffer.putLong(originalUUID.getMostSignificantBits()); + byteBuffer.putLong(originalUUID.getLeastSignificantBits()); + String encodedUUID = Base64.getUrlEncoder().withoutPadding() + .encodeToString(byteBuffer.array()); + assertEquals("zF-T94zxSlGDxudAMToMbA", encodedUUID); + } + + @Test + public void shouldEncodeUUIDUsingApacheUtils() { + byte[] bytes = Conversion.uuidToByteArray(originalUUID, new byte[16], 0, 16); + String encodedUUID = encodeBase64URLSafeString(bytes); + assertEquals("UUrxjPeTX8xsDDoxQOfGgw", encodedUUID); + } + + private byte[] convertToByteArray(UUID uuid) { + byte[] result = new byte[16]; + + long mostSignificantBits = uuid.getMostSignificantBits(); + fillByteArray(0, 8, result, mostSignificantBits); + + long leastSignificantBits = uuid.getLeastSignificantBits(); + fillByteArray(8, 16, result, leastSignificantBits); + + return result; + } + + private static void fillByteArray(int start, int end, byte[] result, long bits) { + for (int i = start; i < end; i++) { + int shift = i * 8; + result[i] = (byte) ((int) (255L & bits >> shift)); + } + } +} From 11970c9909040b228ebcf071011595bca037db63 Mon Sep 17 00:00:00 2001 From: "ICKostiantyn.Ivanov" Date: Mon, 29 Jan 2024 13:00:43 +0100 Subject: [PATCH 2/3] BAEL-6716 - Add expectedEncodedString variable --- .../baeldung/uuid/DecodeUUIDStringFromBase64Test.java | 9 ++++++--- .../com/baeldung/uuid/EncodeUUIDToBase64StringTest.java | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/DecodeUUIDStringFromBase64Test.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/DecodeUUIDStringFromBase64Test.java index 043ec59fb5..c3bb715c83 100644 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/DecodeUUIDStringFromBase64Test.java +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/DecodeUUIDStringFromBase64Test.java @@ -15,16 +15,18 @@ public class DecodeUUIDStringFromBase64Test { @Test public void shouldDecodeUUIDUsingByteArrayAndBase64Decoder() { + String expectedEncodedString = "UUrxjPeTX8xsDDoxQOfGgw"; byte[] decodedBytes = Base64.getDecoder() - .decode("UUrxjPeTX8xsDDoxQOfGgw"); + .decode(expectedEncodedString); UUID uuid = convertToUUID(decodedBytes); assertEquals(originalUUID, uuid); } @Test public void shouldDecodeUUIDUsingByteBufferAndBase64UrlDecoder() { + String expectedEncodedString = "zF-T94zxSlGDxudAMToMbA"; byte[] decodedBytes = Base64.getUrlDecoder() - .decode("zF-T94zxSlGDxudAMToMbA"); + .decode(expectedEncodedString); ByteBuffer byteBuffer = ByteBuffer.wrap(decodedBytes); long mostSignificantBits = byteBuffer.getLong(); long leastSignificantBits = byteBuffer.getLong(); @@ -34,7 +36,8 @@ public class DecodeUUIDStringFromBase64Test { @Test public void shouldDecodeUUIDUsingApacheUtils() { - byte[] decodedBytes = decodeBase64("UUrxjPeTX8xsDDoxQOfGgw"); + String expectedEncodedString = "UUrxjPeTX8xsDDoxQOfGgw"; + byte[] decodedBytes = decodeBase64(expectedEncodedString); UUID uuid = Conversion.byteArrayToUuid(decodedBytes, 0); assertEquals(originalUUID, uuid); } diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/EncodeUUIDToBase64StringTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/EncodeUUIDToBase64StringTest.java index cef80cdc24..19c220faf7 100644 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/EncodeUUIDToBase64StringTest.java +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/EncodeUUIDToBase64StringTest.java @@ -15,27 +15,30 @@ public class EncodeUUIDToBase64StringTest { @Test public void shouldEncodeUUIDUsingByteArrayAndBase64Encoder() { + String expectedEncodedString = "UUrxjPeTX8xsDDoxQOfGgw"; byte[] uuidBytes = convertToByteArray(originalUUID); String encodedUUID = Base64.getEncoder().withoutPadding() .encodeToString(uuidBytes); - assertEquals("UUrxjPeTX8xsDDoxQOfGgw", encodedUUID); + assertEquals(expectedEncodedString, encodedUUID); } @Test public void shouldEncodeUUIDUsingByteBufferAndBase64UrlEncoder() { + String expectedEncodedString = "zF-T94zxSlGDxudAMToMbA"; ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[16]); byteBuffer.putLong(originalUUID.getMostSignificantBits()); byteBuffer.putLong(originalUUID.getLeastSignificantBits()); String encodedUUID = Base64.getUrlEncoder().withoutPadding() .encodeToString(byteBuffer.array()); - assertEquals("zF-T94zxSlGDxudAMToMbA", encodedUUID); + assertEquals(expectedEncodedString, encodedUUID); } @Test public void shouldEncodeUUIDUsingApacheUtils() { + String expectedEncodedString = "UUrxjPeTX8xsDDoxQOfGgw"; byte[] bytes = Conversion.uuidToByteArray(originalUUID, new byte[16], 0, 16); String encodedUUID = encodeBase64URLSafeString(bytes); - assertEquals("UUrxjPeTX8xsDDoxQOfGgw", encodedUUID); + assertEquals(expectedEncodedString, encodedUUID); } private byte[] convertToByteArray(UUID uuid) { From 4c129ead6164b4e23f9906b34514cb16004bd371 Mon Sep 17 00:00:00 2001 From: "ICKostiantyn.Ivanov" Date: Mon, 29 Jan 2024 21:42:14 +0100 Subject: [PATCH 3/3] BAEL-6716 - Fix pmd violations --- ...mBase64Test.java => DecodeUUIDStringFromBase64UnitTest.java} | 2 +- ...e64StringTest.java => EncodeUUIDToBase64StringUnitTest.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/{DecodeUUIDStringFromBase64Test.java => DecodeUUIDStringFromBase64UnitTest.java} (97%) rename core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/{EncodeUUIDToBase64StringTest.java => EncodeUUIDToBase64StringUnitTest.java} (97%) diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/DecodeUUIDStringFromBase64Test.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/DecodeUUIDStringFromBase64UnitTest.java similarity index 97% rename from core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/DecodeUUIDStringFromBase64Test.java rename to core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/DecodeUUIDStringFromBase64UnitTest.java index c3bb715c83..177f231b53 100644 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/DecodeUUIDStringFromBase64Test.java +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/DecodeUUIDStringFromBase64UnitTest.java @@ -10,7 +10,7 @@ import java.util.UUID; import org.apache.commons.lang3.Conversion; import org.junit.jupiter.api.Test; -public class DecodeUUIDStringFromBase64Test { +public class DecodeUUIDStringFromBase64UnitTest { private final UUID originalUUID = UUID.fromString("cc5f93f7-8cf1-4a51-83c6-e740313a0c6c"); @Test diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/EncodeUUIDToBase64StringTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/EncodeUUIDToBase64StringUnitTest.java similarity index 97% rename from core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/EncodeUUIDToBase64StringTest.java rename to core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/EncodeUUIDToBase64StringUnitTest.java index 19c220faf7..a1ba921d4a 100644 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/EncodeUUIDToBase64StringTest.java +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/EncodeUUIDToBase64StringUnitTest.java @@ -10,7 +10,7 @@ import java.util.UUID; import org.apache.commons.lang3.Conversion; import org.junit.jupiter.api.Test; -public class EncodeUUIDToBase64StringTest { +public class EncodeUUIDToBase64StringUnitTest { private final UUID originalUUID = UUID.fromString("cc5f93f7-8cf1-4a51-83c6-e740313a0c6c"); @Test