From 4b669dc6880a9cfb9dce1712ecf6d9637ac73259 Mon Sep 17 00:00:00 2001 From: Tarun Jain Date: Wed, 8 Jul 2020 04:29:31 +0530 Subject: [PATCH] Hexagonal architecture in Java --- hexagonal-architecture-java/README.md | 3 ++ hexagonal-architecture-java/pom.xml | 19 ++++++++++++ .../java/com/baeldung/hexagonal/Main.java | 21 ++++++++++++++ .../hexagonal/adapters/FileWriterAdapter.java | 21 ++++++++++++++ .../adapters/InMemorySportsDataAdapter.java | 27 +++++++++++++++++ .../adapters/UserRequestAdapter.java | 21 ++++++++++++++ .../baeldung/hexagonal/core/SportsApp.java | 21 ++++++++++++++ .../hexagonal/model/SportRevenue.java | 29 +++++++++++++++++++ .../hexagonal/ports/FetchSportsRevenue.java | 7 +++++ .../baeldung/hexagonal/ports/UserRequest.java | 5 ++++ .../hexagonal/ports/WriteSportsRevenue.java | 7 +++++ pom.xml | 1 + 12 files changed, 182 insertions(+) create mode 100644 hexagonal-architecture-java/README.md create mode 100644 hexagonal-architecture-java/pom.xml create mode 100644 hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/Main.java create mode 100644 hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/adapters/FileWriterAdapter.java create mode 100644 hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/adapters/InMemorySportsDataAdapter.java create mode 100644 hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/adapters/UserRequestAdapter.java create mode 100644 hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/core/SportsApp.java create mode 100644 hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/model/SportRevenue.java create mode 100644 hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/ports/FetchSportsRevenue.java create mode 100644 hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/ports/UserRequest.java create mode 100644 hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/ports/WriteSportsRevenue.java diff --git a/hexagonal-architecture-java/README.md b/hexagonal-architecture-java/README.md new file mode 100644 index 0000000000..35fe97a6ef --- /dev/null +++ b/hexagonal-architecture-java/README.md @@ -0,0 +1,3 @@ +## Hexagonal Architecture + +This module contains article about Hexagonal Architecture \ No newline at end of file diff --git a/hexagonal-architecture-java/pom.xml b/hexagonal-architecture-java/pom.xml new file mode 100644 index 0000000000..24a198279d --- /dev/null +++ b/hexagonal-architecture-java/pom.xml @@ -0,0 +1,19 @@ + + 4.0.0 + hcom.baeldung + hexagonal-architecture-java + 0.0.1-SNAPSHOT + + src + + + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + + + + + \ No newline at end of file diff --git a/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/Main.java b/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/Main.java new file mode 100644 index 0000000000..9feb12e37c --- /dev/null +++ b/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/Main.java @@ -0,0 +1,21 @@ +package com.baeldung.hexagonal; + +import com.baeldung.hexagonal.adapters.FileWriterAdapter; +import com.baeldung.hexagonal.adapters.InMemorySportsDataAdapter; +import com.baeldung.hexagonal.adapters.UserRequestAdapter; +import com.baeldung.hexagonal.ports.FetchSportsRevenue; +import com.baeldung.hexagonal.ports.UserRequest; +import com.baeldung.hexagonal.ports.WriteSportsRevenue; + +public class Main { + + public static void main(String[] args) { + FetchSportsRevenue sportsRevenue = new InMemorySportsDataAdapter(); + WriteSportsRevenue writeSportsRevenue = new FileWriterAdapter(); + UserRequest userReq = new UserRequestAdapter(sportsRevenue, writeSportsRevenue); + + userReq.processRequest("Football"); + userReq.processRequest("Cricket"); + } + +} diff --git a/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/adapters/FileWriterAdapter.java b/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/adapters/FileWriterAdapter.java new file mode 100644 index 0000000000..879cf18bc2 --- /dev/null +++ b/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/adapters/FileWriterAdapter.java @@ -0,0 +1,21 @@ +package com.baeldung.hexagonal.adapters; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +import com.baeldung.hexagonal.model.SportRevenue; +import com.baeldung.hexagonal.ports.WriteSportsRevenue; + +public class FileWriterAdapter implements WriteSportsRevenue { + + @Override + public void writeSportsReveue(SportRevenue sportRevenue) { + try (FileWriter fw = new FileWriter(new File("revenue.txt"),true)) { + fw.write(sportRevenue.toString()); + fw.write(System.lineSeparator()); + } catch (IOException e) { + + } + } +} diff --git a/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/adapters/InMemorySportsDataAdapter.java b/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/adapters/InMemorySportsDataAdapter.java new file mode 100644 index 0000000000..1d0c8c4611 --- /dev/null +++ b/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/adapters/InMemorySportsDataAdapter.java @@ -0,0 +1,27 @@ +package com.baeldung.hexagonal.adapters; + +import java.util.Arrays; +import java.util.List; + +import com.baeldung.hexagonal.model.SportRevenue; +import com.baeldung.hexagonal.ports.FetchSportsRevenue; + +public class InMemorySportsDataAdapter implements FetchSportsRevenue { + + List data; + + public InMemorySportsDataAdapter() { + data = Arrays.asList( + new SportRevenue("Football",2200000), + new SportRevenue("Cricket", 1700000), + new SportRevenue("Baseball",1567000)); + } + + @Override + public SportRevenue retrieveSportRevenue(String sportName) { + return data.stream() + .filter(category -> sportName.equals(category.getName())) + .findAny().orElse(null); + } + +} diff --git a/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/adapters/UserRequestAdapter.java b/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/adapters/UserRequestAdapter.java new file mode 100644 index 0000000000..0158b52576 --- /dev/null +++ b/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/adapters/UserRequestAdapter.java @@ -0,0 +1,21 @@ +package com.baeldung.hexagonal.adapters; + +import com.baeldung.hexagonal.core.SportsApp; +import com.baeldung.hexagonal.ports.FetchSportsRevenue; +import com.baeldung.hexagonal.ports.UserRequest; +import com.baeldung.hexagonal.ports.WriteSportsRevenue; + +public class UserRequestAdapter implements UserRequest { + + private SportsApp sportsApp; + + public UserRequestAdapter(FetchSportsRevenue sportsRevenue, WriteSportsRevenue writeSportsRevenue) { + sportsApp = new SportsApp(sportsRevenue, writeSportsRevenue); + } + + @Override + public void processRequest(String sportName) { + sportsApp.fetchAndWrite(sportName); + } + +} diff --git a/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/core/SportsApp.java b/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/core/SportsApp.java new file mode 100644 index 0000000000..fc7591aee9 --- /dev/null +++ b/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/core/SportsApp.java @@ -0,0 +1,21 @@ +package com.baeldung.hexagonal.core; + +import com.baeldung.hexagonal.model.SportRevenue; +import com.baeldung.hexagonal.ports.FetchSportsRevenue; +import com.baeldung.hexagonal.ports.WriteSportsRevenue; + +public class SportsApp { + + private FetchSportsRevenue sportsRevenue; + private WriteSportsRevenue writeSportsRevenue; + + public SportsApp(FetchSportsRevenue sportsCategories, WriteSportsRevenue writeSportsRevenue) { + this.sportsRevenue = sportsCategories; + this.writeSportsRevenue = writeSportsRevenue; + } + + public void fetchAndWrite(String sportName) { + SportRevenue sportRevenue = sportsRevenue.retrieveSportRevenue(sportName); + writeSportsRevenue.writeSportsReveue(sportRevenue); + } +} diff --git a/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/model/SportRevenue.java b/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/model/SportRevenue.java new file mode 100644 index 0000000000..62a09a738c --- /dev/null +++ b/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/model/SportRevenue.java @@ -0,0 +1,29 @@ +package com.baeldung.hexagonal.model; + +public class SportRevenue { + private String name; + private double revenue; + + public SportRevenue(String name, double revenue) { + this.name = name; + this.revenue = revenue; + } + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public double getRevenue() { + return revenue; + } + public void setRevenue(double revenue) { + this.revenue = revenue; + } + @Override + public String toString() { + return "SportRevenue [name=" + name + ", revenue=" + revenue + "]"; + } + +} diff --git a/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/ports/FetchSportsRevenue.java b/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/ports/FetchSportsRevenue.java new file mode 100644 index 0000000000..ede4f2420d --- /dev/null +++ b/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/ports/FetchSportsRevenue.java @@ -0,0 +1,7 @@ +package com.baeldung.hexagonal.ports; + +import com.baeldung.hexagonal.model.SportRevenue; + +public interface FetchSportsRevenue { + public SportRevenue retrieveSportRevenue(String sportName); +} diff --git a/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/ports/UserRequest.java b/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/ports/UserRequest.java new file mode 100644 index 0000000000..1ff7d4d1c6 --- /dev/null +++ b/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/ports/UserRequest.java @@ -0,0 +1,5 @@ +package com.baeldung.hexagonal.ports; + +public interface UserRequest { + public void processRequest(String sportName); +} diff --git a/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/ports/WriteSportsRevenue.java b/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/ports/WriteSportsRevenue.java new file mode 100644 index 0000000000..2aa48d6a92 --- /dev/null +++ b/hexagonal-architecture-java/src/main/java/com/baeldung/hexagonal/ports/WriteSportsRevenue.java @@ -0,0 +1,7 @@ +package com.baeldung.hexagonal.ports; + +import com.baeldung.hexagonal.model.SportRevenue; + +public interface WriteSportsRevenue { + public void writeSportsReveue(SportRevenue sportRevenue); +} diff --git a/pom.xml b/pom.xml index 1db715147a..44dd9f2467 100644 --- a/pom.xml +++ b/pom.xml @@ -558,6 +558,7 @@ rxjava-operators atomikos + hexagonal-architecture-java