diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/ByteHexadecimalConversionUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/ByteHexadecimalConversionUnitTest.java
new file mode 100644
index 0000000000..29b6eb1bee
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/ByteHexadecimalConversionUnitTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.hexformat;
+
+import java.util.HexFormat;
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class ByteHexadecimalConversionUnitTest {
+
+ private HexFormat hexFormat = HexFormat.of();
+
+ @Test
+ void givenInitialisedHexFormat_whenHexStringIsPassed_thenByteArrayRepresentationIsReturned() {
+ byte[] hexBytes = hexFormat.parseHex("ABCDEF0123456789");
+ assertArrayEquals(new byte[] { -85, -51, -17, 1, 35, 69, 103, -119 }, hexBytes);
+ }
+
+ @Test
+ void givenInitialisedHexFormat_whenByteArrayIsPassed_thenHexStringRepresentationIsReturned() {
+ String bytesAsString = hexFormat.formatHex(new byte[] { -85, -51, -17, 1, 35, 69, 103, -119});
+ assertEquals("abcdef0123456789", bytesAsString);
+ }
+}
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/PrimitiveTypeHexadecimalConversionUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/PrimitiveTypeHexadecimalConversionUnitTest.java
new file mode 100644
index 0000000000..6f26a8351c
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/PrimitiveTypeHexadecimalConversionUnitTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.hexformat;
+
+import java.util.HexFormat;
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class PrimitiveTypeHexadecimalConversionUnitTest {
+
+ private HexFormat hexFormat = HexFormat.of();
+
+ @Test
+ void givenInitialisedHexFormat_whenPrimitiveByteIsPassed_thenHexStringRepresentationIsReturned() {
+ String fromByte = hexFormat.toHexDigits((byte)64);
+ assertEquals("40", fromByte);
+ }
+
+ @Test
+ void givenInitialisedHexFormat_whenPrimitiveLongIsPassed_thenHexStringRepresentationIsReturned() {
+ String fromLong = hexFormat.toHexDigits(1234_5678_9012_3456L);
+ assertEquals("000462d53c8abac0", fromLong);
+ }
+}
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/StringFormattingUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/StringFormattingUnitTest.java
new file mode 100644
index 0000000000..28189d0e8c
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/StringFormattingUnitTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.hexformat;
+
+import java.util.HexFormat;
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class StringFormattingUnitTest {
+
+ private HexFormat hexFormat = HexFormat.of().withPrefix("[").withSuffix("]").withDelimiter(", ");
+
+ @Test
+ public void givenInitialisedHexFormatWithFormattedStringOptions_whenByteArrayIsPassed_thenHexStringRepresentationFormattedCorrectlyIsReturned() {
+ assertEquals("[48], [0c], [11]", hexFormat.formatHex(new byte[] {72, 12, 17}));
+ }
+}
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/UppercaseLowercaseOutputUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/UppercaseLowercaseOutputUnitTest.java
new file mode 100644
index 0000000000..c2a33fb4b5
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/UppercaseLowercaseOutputUnitTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.hexformat;
+
+import java.util.HexFormat;
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class UppercaseLowercaseOutputUnitTest {
+
+ @Test
+ public void givenInitialisedHexFormat_whenByteArrayIsPassed_thenLowerCaseHexStringRepresentationIsReturned() {
+ HexFormat hexFormat = HexFormat.of();
+ String bytesAsString = hexFormat.formatHex(new byte[] { -85, -51, -17, 1, 35, 69, 103, -119});
+ assertTrue(isLowerCase(bytesAsString));
+ }
+
+ @Test
+ public void givenInitialisedHexFormatWithUpperCaseOption_whenByteArrayIsPassed_thenLowerCaseHexStringRepresentationIsReturned() {
+ HexFormat hexFormat = HexFormat.of().withUpperCase();
+ String bytesAsString = hexFormat.formatHex(new byte[] { -85, -51, -17, 1, 35, 69, 103, -119});
+ assertTrue(isUpperCase(bytesAsString));
+ }
+
+ private boolean isLowerCase(String str) {
+ char[] charArray = str.toCharArray();
+ for (int i=0; i < charArray.length; i++) {
+ if (Character.isUpperCase(charArray[i]))
+ return false;
+ }
+ return true;
+ }
+
+ private boolean isUpperCase(String str) {
+ char[] charArray = str.toCharArray();
+ for (int i=0; i < charArray.length; i++) {
+ if (Character.isLowerCase(charArray[i]))
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/docker/docker-sample-app/Dockerfile b/docker/docker-sample-app/Dockerfile
new file mode 100644
index 0000000000..71fc1a29d9
--- /dev/null
+++ b/docker/docker-sample-app/Dockerfile
@@ -0,0 +1,3 @@
+FROM openjdk:11
+COPY target/docker-sample-app-0.0.1.jar app.jar
+ENTRYPOINT ["java","-jar","/app.jar"]
diff --git a/docker/docker-sample-app/README.md b/docker/docker-sample-app/README.md
new file mode 100644
index 0000000000..6aeaa1d2a3
--- /dev/null
+++ b/docker/docker-sample-app/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- How to Get Docker-Compose to Always Use the Latest Image
diff --git a/docker/docker-sample-app/docker-compose-build-image.yaml b/docker/docker-sample-app/docker-compose-build-image.yaml
new file mode 100644
index 0000000000..27c1d8ee44
--- /dev/null
+++ b/docker/docker-sample-app/docker-compose-build-image.yaml
@@ -0,0 +1,8 @@
+version: '2.4'
+services:
+ db:
+ image: postgres
+ my_app:
+ build: .
+ ports:
+ - "8080:8080"
diff --git a/docker/docker-sample-app/docker-compose-with-image.yaml b/docker/docker-sample-app/docker-compose-with-image.yaml
new file mode 100644
index 0000000000..9a8822f762
--- /dev/null
+++ b/docker/docker-sample-app/docker-compose-with-image.yaml
@@ -0,0 +1,9 @@
+version: '2.4'
+services:
+ db:
+ image: postgres
+ my_app:
+ image: "eugen/test-app:latest"
+ ports:
+ - "8080:8080"
+
diff --git a/docker/docker-sample-app/pom.xml b/docker/docker-sample-app/pom.xml
new file mode 100644
index 0000000000..6841fabcee
--- /dev/null
+++ b/docker/docker-sample-app/pom.xml
@@ -0,0 +1,45 @@
+
+
+ 4.0.0
+
+ com.baeldung.docker
+ docker
+ 0.0.1
+
+
+ docker-sample-app
+ docker-sample-app
+ Demo project for Spring Boot and Docker
+
+
+ 11
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/docker/docker-sample-app/src/main/java/com/baeldung/docker/app/DockAppApplication.java b/docker/docker-sample-app/src/main/java/com/baeldung/docker/app/DockAppApplication.java
new file mode 100644
index 0000000000..e7ff52015c
--- /dev/null
+++ b/docker/docker-sample-app/src/main/java/com/baeldung/docker/app/DockAppApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.docker.app;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DockAppApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DockAppApplication.class, args);
+ }
+
+}
diff --git a/docker/docker-sample-app/src/main/java/com/baeldung/docker/app/endpoint/MyController.java b/docker/docker-sample-app/src/main/java/com/baeldung/docker/app/endpoint/MyController.java
new file mode 100644
index 0000000000..d46c57e606
--- /dev/null
+++ b/docker/docker-sample-app/src/main/java/com/baeldung/docker/app/endpoint/MyController.java
@@ -0,0 +1,13 @@
+package com.baeldung.docker.app.endpoint;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class MyController {
+
+ @GetMapping
+ public String version() {
+ return "1.7";
+ }
+}
diff --git a/docker/docker-sample-app/src/main/resources/application.properties b/docker/docker-sample-app/src/main/resources/application.properties
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/docker/docker-sample-app/src/main/resources/application.properties
@@ -0,0 +1 @@
+
diff --git a/docker/docker-sample-app/src/test/java/com/baeldung/docker/app/DockAppApplicationUnitTest.java b/docker/docker-sample-app/src/test/java/com/baeldung/docker/app/DockAppApplicationUnitTest.java
new file mode 100644
index 0000000000..7220766988
--- /dev/null
+++ b/docker/docker-sample-app/src/test/java/com/baeldung/docker/app/DockAppApplicationUnitTest.java
@@ -0,0 +1,13 @@
+package com.baeldung.docker.app;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class DockAppApplicationUnitTest {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
diff --git a/docker/pom.xml b/docker/pom.xml
index 3fcc9ca94f..f481f1b8b7 100644
--- a/docker/pom.xml
+++ b/docker/pom.xml
@@ -25,6 +25,7 @@
docker-internal-dto
docker-spring-boot
+ docker-sample-app