From 057b969be9a259628acfec651238fa435284192e Mon Sep 17 00:00:00 2001 From: Rich Date: Fri, 24 Dec 2021 16:39:23 -0500 Subject: [PATCH 1/2] Code for Hexagonal Architecture article. --- hexagonal/pom.xml | 8 ++++ .../baeldung/hexagonal/bo/BusinessLogic.java | 27 ++++++++++++ .../java/com/baeldung/hexagonal/dto/User.java | 41 +++++++++++++++++++ .../factory/UserRepositoryFactory.java | 23 +++++++++++ .../repository/FileBasedUserRespository.java | 22 ++++++++++ .../hexagonal/repository/UserRepository.java | 19 +++++++++ 6 files changed, 140 insertions(+) create mode 100644 hexagonal/pom.xml create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/bo/BusinessLogic.java create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/dto/User.java create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/factory/UserRepositoryFactory.java create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/repository/FileBasedUserRespository.java create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/repository/UserRepository.java 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/bo/BusinessLogic.java b/hexagonal/src/main/java/com/baeldung/hexagonal/bo/BusinessLogic.java new file mode 100644 index 000000000000..5673aec4e50d --- /dev/null +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/bo/BusinessLogic.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * + * Copyright 2017-2021, Bemindt Consulting Group, Inc. + * + * BusinessLogic.java + * rich + * Dec 23, 2021 + * + *******************************************************************************/ + +package com.baeldung.hexagonal.bo; + +import java.util.List; + +import com.baeldung.hexagonal.dto.User; +import com.baeldung.hexagonal.factory.UserRepositoryFactory; +import com.baeldung.hexagonal.repository.UserRepository; + +public class BusinessLogic { + public void processUsers() { + // Use factory to get an adapter for reading users + UserRepository repo = UserRepositoryFactory.getUserRepository(); + // Get Users + List userList = repo.getUsers(); + // Perform business logic + } +} 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..028e04974c85 --- /dev/null +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/dto/User.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * + * Copyright 2017-2021, Bemindt Consulting Group, Inc. + * + * User.java + * rich + * Dec 23, 2021 + * + *******************************************************************************/ + +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/UserRepositoryFactory.java b/hexagonal/src/main/java/com/baeldung/hexagonal/factory/UserRepositoryFactory.java new file mode 100644 index 000000000000..404e20dcd4e7 --- /dev/null +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/factory/UserRepositoryFactory.java @@ -0,0 +1,23 @@ +/******************************************************************************* + * + * Copyright 2017-2021, Bemindt Consulting Group, Inc. + * + * UserRepositoryFactory.java + * rich + * Dec 23, 2021 + * + *******************************************************************************/ + +package com.baeldung.hexagonal.factory; + +import com.baeldung.hexagonal.repository.FileBasedUserRespository; +import com.baeldung.hexagonal.repository.UserRepository; + +public class UserRepositoryFactory { + 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 FileBasedUserRespository(); + } +} diff --git a/hexagonal/src/main/java/com/baeldung/hexagonal/repository/FileBasedUserRespository.java b/hexagonal/src/main/java/com/baeldung/hexagonal/repository/FileBasedUserRespository.java new file mode 100644 index 000000000000..0499b413da49 --- /dev/null +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/repository/FileBasedUserRespository.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * + * Copyright 2017-2021, Bemindt Consulting Group, Inc. + * + * FileBasedUserRespository.java + * rich + * Dec 23, 2021 + * + *******************************************************************************/ + +package com.baeldung.hexagonal.repository; + +import java.util.List; + +import com.baeldung.hexagonal.dto.User; + +public class FileBasedUserRespository implements UserRepository { + + public List getUsers() { + 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..2d186c0f69f8 --- /dev/null +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/repository/UserRepository.java @@ -0,0 +1,19 @@ +/******************************************************************************* + * + * Copyright 2017-2021, Bemindt Consulting Group, Inc. + * + * UserRepository.java + * rich + * Dec 23, 2021 + * + *******************************************************************************/ + +package com.baeldung.hexagonal.repository; + +import java.util.List; + +import com.baeldung.hexagonal.dto.User; + +public interface UserRepository { + public List getUsers(); +} From 5c52b7944698b93a8f687a822a57c1b7c54ade0c Mon Sep 17 00:00:00 2001 From: Rich Date: Fri, 31 Dec 2021 09:32:58 -0500 Subject: [PATCH 2/2] Updated code and added test cases --- .../com/baeldung/hexagonal/Hexagonal.java | 11 ++++++ .../baeldung/hexagonal/bo/BusinessLogic.java | 17 +++------ .../java/com/baeldung/hexagonal/dto/User.java | 10 ----- .../hexagonal/factory/RepositoryFactory.java | 13 +++++++ .../factory/UserRepositoryFactory.java | 23 ------------ .../repository/FileBasedUserRepository.java | 37 +++++++++++++++++++ .../repository/FileBasedUserRespository.java | 22 ----------- .../hexagonal/repository/UserRepository.java | 10 ----- .../factory/RepositoryFactoryTest.java | 15 ++++++++ .../FileBasedUserRepositoryTest.java | 17 +++++++++ hexagonal/users.csv | 4 ++ 11 files changed, 102 insertions(+), 77 deletions(-) create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/Hexagonal.java create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/factory/RepositoryFactory.java delete mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/factory/UserRepositoryFactory.java create mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/repository/FileBasedUserRepository.java delete mode 100644 hexagonal/src/main/java/com/baeldung/hexagonal/repository/FileBasedUserRespository.java create mode 100644 hexagonal/src/test/java/com/baeldung/hexagonal/factory/RepositoryFactoryTest.java create mode 100644 hexagonal/src/test/java/com/baeldung/hexagonal/repository/FileBasedUserRepositoryTest.java create mode 100644 hexagonal/users.csv 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 index 5673aec4e50d..c5d57f271dce 100644 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/bo/BusinessLogic.java +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/bo/BusinessLogic.java @@ -1,27 +1,20 @@ -/******************************************************************************* - * - * Copyright 2017-2021, Bemindt Consulting Group, Inc. - * - * BusinessLogic.java - * rich - * Dec 23, 2021 - * - *******************************************************************************/ - package com.baeldung.hexagonal.bo; import java.util.List; import com.baeldung.hexagonal.dto.User; -import com.baeldung.hexagonal.factory.UserRepositoryFactory; +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 = UserRepositoryFactory.getUserRepository(); + 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 index 028e04974c85..d73b42b661d4 100644 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/dto/User.java +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/dto/User.java @@ -1,13 +1,3 @@ -/******************************************************************************* - * - * Copyright 2017-2021, Bemindt Consulting Group, Inc. - * - * User.java - * rich - * Dec 23, 2021 - * - *******************************************************************************/ - package com.baeldung.hexagonal.dto; public class User { 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/factory/UserRepositoryFactory.java b/hexagonal/src/main/java/com/baeldung/hexagonal/factory/UserRepositoryFactory.java deleted file mode 100644 index 404e20dcd4e7..000000000000 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/factory/UserRepositoryFactory.java +++ /dev/null @@ -1,23 +0,0 @@ -/******************************************************************************* - * - * Copyright 2017-2021, Bemindt Consulting Group, Inc. - * - * UserRepositoryFactory.java - * rich - * Dec 23, 2021 - * - *******************************************************************************/ - -package com.baeldung.hexagonal.factory; - -import com.baeldung.hexagonal.repository.FileBasedUserRespository; -import com.baeldung.hexagonal.repository.UserRepository; - -public class UserRepositoryFactory { - 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 FileBasedUserRespository(); - } -} 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/FileBasedUserRespository.java b/hexagonal/src/main/java/com/baeldung/hexagonal/repository/FileBasedUserRespository.java deleted file mode 100644 index 0499b413da49..000000000000 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/repository/FileBasedUserRespository.java +++ /dev/null @@ -1,22 +0,0 @@ -/******************************************************************************* - * - * Copyright 2017-2021, Bemindt Consulting Group, Inc. - * - * FileBasedUserRespository.java - * rich - * Dec 23, 2021 - * - *******************************************************************************/ - -package com.baeldung.hexagonal.repository; - -import java.util.List; - -import com.baeldung.hexagonal.dto.User; - -public class FileBasedUserRespository implements UserRepository { - - public List getUsers() { - 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 index 2d186c0f69f8..9173ea0370d1 100644 --- a/hexagonal/src/main/java/com/baeldung/hexagonal/repository/UserRepository.java +++ b/hexagonal/src/main/java/com/baeldung/hexagonal/repository/UserRepository.java @@ -1,13 +1,3 @@ -/******************************************************************************* - * - * Copyright 2017-2021, Bemindt Consulting Group, Inc. - * - * UserRepository.java - * rich - * Dec 23, 2021 - * - *******************************************************************************/ - package com.baeldung.hexagonal.repository; import java.util.List; 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