diff --git a/core-java-modules/core-java-uuid/src/main/resources/log4jstructuraldp.properties b/core-java-modules/core-java-uuid/src/main/resources/log4jstructuraldp.properties
new file mode 100644
index 0000000000..5bc2bfe4b9
--- /dev/null
+++ b/core-java-modules/core-java-uuid/src/main/resources/log4jstructuraldp.properties
@@ -0,0 +1,9 @@
+
+# Root logger
+log4j.rootLogger=INFO, file, stdout
+
+# Write to console
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
\ No newline at end of file
diff --git a/core-java-modules/core-java-uuid/src/main/resources/logback.xml b/core-java-modules/core-java-uuid/src/main/resources/logback.xml
new file mode 100644
index 0000000000..56af2d397e
--- /dev/null
+++ b/core-java-modules/core-java-uuid/src/main/resources/logback.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/DecodeUUIDStringFromBase64UnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/DecodeUUIDStringFromBase64UnitTest.java
new file mode 100644
index 0000000000..a0fffb1027
--- /dev/null
+++ b/core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/DecodeUUIDStringFromBase64UnitTest.java
@@ -0,0 +1,64 @@
+package com.ossez.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 DecodeUUIDStringFromBase64UnitTest {
+ private final UUID originalUUID = UUID.fromString("cc5f93f7-8cf1-4a51-83c6-e740313a0c6c");
+
+ @Test
+ public void givenEncodedString_whenDecodingUsingBase64Decoder_thenGiveExpectedUUID() {
+ String expectedEncodedString = "UUrxjPeTX8xsDDoxQOfGgw";
+ byte[] decodedBytes = Base64.getDecoder()
+ .decode(expectedEncodedString);
+ UUID uuid = convertToUUID(decodedBytes);
+ assertEquals(originalUUID, uuid);
+ }
+
+ @Test
+ public void givenEncodedString_whenDecodingUsingByteBufferAndBase64UrlDecoder_thenGiveExpectedUUID() {
+ String expectedEncodedString = "zF-T94zxSlGDxudAMToMbA";
+ byte[] decodedBytes = Base64.getUrlDecoder()
+ .decode(expectedEncodedString);
+ 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 givenEncodedString_whenDecodingUsingApacheUtils_thenGiveExpectedUUID() {
+ String expectedEncodedString = "UUrxjPeTX8xsDDoxQOfGgw";
+ byte[] decodedBytes = decodeBase64(expectedEncodedString);
+ 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/ossez/uuid/EncodeUUIDToBase64StringUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/EncodeUUIDToBase64StringUnitTest.java
new file mode 100644
index 0000000000..d8f1b4a13f
--- /dev/null
+++ b/core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/EncodeUUIDToBase64StringUnitTest.java
@@ -0,0 +1,62 @@
+package com.ossez.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 EncodeUUIDToBase64StringUnitTest {
+ private final UUID originalUUID = UUID.fromString("cc5f93f7-8cf1-4a51-83c6-e740313a0c6c");
+
+ @Test
+ public void givenUUID_whenEncodingUsingBase64Encoder_thenGiveExpectedEncodedString() {
+ String expectedEncodedString = "UUrxjPeTX8xsDDoxQOfGgw";
+ byte[] uuidBytes = convertToByteArray(originalUUID);
+ String encodedUUID = Base64.getEncoder().withoutPadding()
+ .encodeToString(uuidBytes);
+ assertEquals(expectedEncodedString, encodedUUID);
+ }
+
+ @Test
+ public void givenUUID_whenEncodingUsingByteBufferAndBase64UrlEncoder_thenGiveExpectedEncodedString() {
+ 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(expectedEncodedString, encodedUUID);
+ }
+
+ @Test
+ public void givenUUID_whenEncodingUsingApacheUtils_thenGiveExpectedEncodedString() {
+ String expectedEncodedString = "UUrxjPeTX8xsDDoxQOfGgw";
+ byte[] bytes = Conversion.uuidToByteArray(originalUUID, new byte[16], 0, 16);
+ String encodedUUID = encodeBase64URLSafeString(bytes);
+ assertEquals(expectedEncodedString, 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));
+ }
+ }
+}
diff --git a/core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/UUIDPositiveLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/UUIDPositiveLongGeneratorUnitTest.java
new file mode 100644
index 0000000000..e16c866c34
--- /dev/null
+++ b/core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/UUIDPositiveLongGeneratorUnitTest.java
@@ -0,0 +1,22 @@
+package com.ossez.uuid;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.UUID;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class UUIDPositiveLongGeneratorUnitTest {
+
+ @Test
+ public void whenGetMostSignificantBits_thenAssertPositive() {
+ long randomPositiveLong = Math.abs(UUID.randomUUID().getMostSignificantBits());
+ assertThat(randomPositiveLong).isNotNegative();
+ }
+
+ @Test
+ public void whenGetLeastSignificantBits_thenAssertPositive() {
+ long randomPositiveLong = Math.abs(UUID.randomUUID().getLeastSignificantBits());
+ assertThat(randomPositiveLong).isNotNegative();
+ }
+}
diff --git a/core-java-modules/core-java-uuid/src/test/resources/logback.xml b/core-java-modules/core-java-uuid/src/test/resources/logback.xml
new file mode 100644
index 0000000000..a076f8db47
--- /dev/null
+++ b/core-java-modules/core-java-uuid/src/test/resources/logback.xml
@@ -0,0 +1,18 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file