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