diff --git a/hexagonal/pom.xml b/hexagonal/pom.xml
new file mode 100644
index 000000000000..2cb27a626676
--- /dev/null
+++ b/hexagonal/pom.xml
@@ -0,0 +1,8 @@
+
+ 4.0.0
+ com.baeldung
+ hexagonal
+ 0.0.1-SNAPSHOT
+ Hexagonal
+ Hexagonal Architecture
+
\ No newline at end of file
diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/Hexagonal.java b/hexagonal/src/main/java/com/baeldung/hexagonal/Hexagonal.java
new file mode 100644
index 000000000000..5cd19cac2dcd
--- /dev/null
+++ b/hexagonal/src/main/java/com/baeldung/hexagonal/Hexagonal.java
@@ -0,0 +1,11 @@
+package com.baeldung.hexagonal;
+
+import com.baeldung.hexagonal.bo.BusinessLogic;
+
+public class Hexagonal {
+
+ public static void main(String[] args) {
+ BusinessLogic logic = new BusinessLogic();
+ logic.processUsers();
+ }
+}
diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/bo/BusinessLogic.java b/hexagonal/src/main/java/com/baeldung/hexagonal/bo/BusinessLogic.java
new file mode 100644
index 000000000000..c5d57f271dce
--- /dev/null
+++ b/hexagonal/src/main/java/com/baeldung/hexagonal/bo/BusinessLogic.java
@@ -0,0 +1,20 @@
+package com.baeldung.hexagonal.bo;
+
+import java.util.List;
+
+import com.baeldung.hexagonal.dto.User;
+import com.baeldung.hexagonal.factory.RepositoryFactory;
+import com.baeldung.hexagonal.repository.UserRepository;
+
+public class BusinessLogic {
+ public void processUsers() {
+ // Use factory to get an adapter for reading users
+ UserRepository repo = RepositoryFactory.getUserRepository();
+ // Get Users
+ List userList = repo.getUsers();
+ // Perform business logic
+ userList.forEach(user -> {
+ System.out.println(user.getLastName()+", "+user.getFirstName());
+ });
+ }
+}
diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/dto/User.java b/hexagonal/src/main/java/com/baeldung/hexagonal/dto/User.java
new file mode 100644
index 000000000000..d73b42b661d4
--- /dev/null
+++ b/hexagonal/src/main/java/com/baeldung/hexagonal/dto/User.java
@@ -0,0 +1,31 @@
+package com.baeldung.hexagonal.dto;
+
+public class User {
+ public int id;
+ public String firstName;
+ public String lastName;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+}
diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/factory/RepositoryFactory.java b/hexagonal/src/main/java/com/baeldung/hexagonal/factory/RepositoryFactory.java
new file mode 100644
index 000000000000..538609689d32
--- /dev/null
+++ b/hexagonal/src/main/java/com/baeldung/hexagonal/factory/RepositoryFactory.java
@@ -0,0 +1,13 @@
+package com.baeldung.hexagonal.factory;
+
+import com.baeldung.hexagonal.repository.FileBasedUserRepository;
+import com.baeldung.hexagonal.repository.UserRepository;
+
+public class RepositoryFactory {
+ public static UserRepository getUserRepository() {
+ // Here we would implement the logic to determine the type of
+ // UserRepository to return, presumably based on some configuration
+ // or environmental setting.
+ return new FileBasedUserRepository();
+ }
+}
diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/repository/FileBasedUserRepository.java b/hexagonal/src/main/java/com/baeldung/hexagonal/repository/FileBasedUserRepository.java
new file mode 100644
index 000000000000..59c7de251bb0
--- /dev/null
+++ b/hexagonal/src/main/java/com/baeldung/hexagonal/repository/FileBasedUserRepository.java
@@ -0,0 +1,37 @@
+package com.baeldung.hexagonal.repository;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.baeldung.hexagonal.dto.User;
+
+public class FileBasedUserRepository implements UserRepository {
+
+ @Override
+ public List getUsers() {
+ String line = "";
+ List userList = new ArrayList<>();
+ try
+ {
+ //parsing a CSV file into BufferedReader class constructor
+ BufferedReader br = new BufferedReader(new FileReader("users.csv"));
+ while ((line = br.readLine()) != null) //returns a Boolean value
+ {
+ String[] userComponents = line.split(","); // use comma as separator
+ User user = new User();
+ user.setId(Integer.valueOf(userComponents[0]));
+ user.setFirstName(userComponents[1]);
+ user.setLastName(userComponents[2]);
+ userList.add(user);
+ }
+ br.close();
+ return userList;
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+}
diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/repository/UserRepository.java b/hexagonal/src/main/java/com/baeldung/hexagonal/repository/UserRepository.java
new file mode 100644
index 000000000000..9173ea0370d1
--- /dev/null
+++ b/hexagonal/src/main/java/com/baeldung/hexagonal/repository/UserRepository.java
@@ -0,0 +1,9 @@
+package com.baeldung.hexagonal.repository;
+
+import java.util.List;
+
+import com.baeldung.hexagonal.dto.User;
+
+public interface UserRepository {
+ public List getUsers();
+}
diff --git a/hexagonal/src/test/java/com/baeldung/hexagonal/factory/RepositoryFactoryTest.java b/hexagonal/src/test/java/com/baeldung/hexagonal/factory/RepositoryFactoryTest.java
new file mode 100644
index 000000000000..969dcd31c32b
--- /dev/null
+++ b/hexagonal/src/test/java/com/baeldung/hexagonal/factory/RepositoryFactoryTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.hexagonal.factory;
+
+import org.junit.jupiter.api.Test;
+
+import com.baeldung.hexagonal.repository.UserRepository;
+
+class RepositoryFactoryTest {
+
+ @Test
+ void test() {
+ UserRepository repo = RepositoryFactory.getUserRepository();
+ assert(repo != null);
+ }
+
+}
diff --git a/hexagonal/src/test/java/com/baeldung/hexagonal/repository/FileBasedUserRepositoryTest.java b/hexagonal/src/test/java/com/baeldung/hexagonal/repository/FileBasedUserRepositoryTest.java
new file mode 100644
index 000000000000..881051d6b92f
--- /dev/null
+++ b/hexagonal/src/test/java/com/baeldung/hexagonal/repository/FileBasedUserRepositoryTest.java
@@ -0,0 +1,17 @@
+package com.baeldung.hexagonal.repository;
+
+import java.util.List;
+
+import org.junit.jupiter.api.Test;
+
+import com.baeldung.hexagonal.dto.User;
+
+class FileBasedUserRepositoryTest {
+
+ @Test
+ void test() {
+ UserRepository repo = new FileBasedUserRepository();
+ List userList = repo.getUsers();
+ assert(userList != null && userList.size() > 0);
+ }
+}
diff --git a/hexagonal/users.csv b/hexagonal/users.csv
new file mode 100644
index 000000000000..f781ef1d36ad
--- /dev/null
+++ b/hexagonal/users.csv
@@ -0,0 +1,4 @@
+1,Rachel,Grey
+2,Laura,Jenkins
+3,Craig,Booker
+4,Mary,Smith