diff --git a/core-java-modules/core-java-io-2/README.md b/core-java-modules/core-java-io-2/README.md
index 84cabc5992..b078a66a7a 100644
--- a/core-java-modules/core-java-io-2/README.md
+++ b/core-java-modules/core-java-io-2/README.md
@@ -13,4 +13,4 @@ This module contains articles about core Java input and output (IO)
- [How to Copy a File with Java](https://www.baeldung.com/java-copy-file)
- [Create a Directory in Java](https://www.baeldung.com/java-create-directory)
- [Java IO vs NIO](https://www.baeldung.com/java-io-vs-nio)
-- [[<-- Prev]](/core-java-modules/core-java-io)
+- [[<-- Prev]](/core-java-modules/core-java-io)[[More -->]](/core-java-modules/core-java-io-3)
diff --git a/core-java-modules/core-java-io-3/README.md b/core-java-modules/core-java-io-3/README.md
new file mode 100644
index 0000000000..39752346d3
--- /dev/null
+++ b/core-java-modules/core-java-io-3/README.md
@@ -0,0 +1,7 @@
+## Core Java IO
+
+This module contains articles about core Java input and output (IO)
+
+### Relevant Articles:
+- [Java – Create a File](https://www.baeldung.com/java-how-to-create-a-file)
+- [[<-- Prev]](/core-java-modules/core-java-io-2)
diff --git a/core-java-modules/core-java-io-3/pom.xml b/core-java-modules/core-java-io-3/pom.xml
new file mode 100644
index 0000000000..cb341ca2ae
--- /dev/null
+++ b/core-java-modules/core-java-io-3/pom.xml
@@ -0,0 +1,86 @@
+
+
+ 4.0.0
+ core-java-io-3
+ 0.1.0-SNAPSHOT
+ core-java-io-3
+ jar
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+ ../
+
+
+
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+ org.slf4j
+ log4j-over-slf4j
+ ${org.slf4j.version}
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+ com.github.tomakehurst
+ wiremock
+ ${wiremock.version}
+ test
+
+
+
+
+
+ core-java-io-3
+
+
+ src/main/resources
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ ${maven-javadoc-plugin.version}
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+
+
+
+
+
+
+ 3.6.1
+ 3.0.0-M1
+ 2.26.3
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-3/src/test/java/com/baeldung/createfile/CreateFileUnitTest.java b/core-java-modules/core-java-io-3/src/test/java/com/baeldung/createfile/CreateFileUnitTest.java
new file mode 100644
index 0000000000..f3cdb22f4d
--- /dev/null
+++ b/core-java-modules/core-java-io-3/src/test/java/com/baeldung/createfile/CreateFileUnitTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.createfile;
+
+import org.apache.commons.io.FileUtils;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class CreateFileUnitTest {
+
+ private final String FILE_NAME = "src/test/resources/fileToCreate.txt";
+
+ @AfterEach
+ @BeforeEach
+ public void cleanUpFiles() {
+ File targetFile = new File(FILE_NAME);
+ targetFile.delete();
+ }
+
+ @Test
+ public void givenUsingNio_whenCreatingFile_thenCorrect() throws IOException {
+ Path newFilePath = Paths.get(FILE_NAME);
+ Files.createFile(newFilePath);
+ }
+
+ @Test
+ public void givenUsingFile_whenCreatingFile_thenCorrect() throws IOException {
+ File newFile = new File(FILE_NAME);
+ boolean success = newFile.createNewFile();
+ assertTrue(success);
+ }
+
+ @Test
+ public void givenUsingGuava_whenCreatingFile_thenCorrect() throws IOException {
+ com.google.common.io.Files.touch(new File(FILE_NAME));
+ }
+
+ @Test
+ public void givenUsingCommonsIo_whenCreatingFile_thenCorrect() throws IOException {
+ FileUtils.touch(new File(FILE_NAME));
+ }
+
+}
diff --git a/core-java-modules/core-java-io-3/src/test/resources/dummy.txt b/core-java-modules/core-java-io-3/src/test/resources/dummy.txt
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/core-java-modules/core-java-lang-3/pom.xml b/core-java-modules/core-java-lang-3/pom.xml
index 2a2856a80a..de290717b1 100644
--- a/core-java-modules/core-java-lang-3/pom.xml
+++ b/core-java-modules/core-java-lang-3/pom.xml
@@ -39,4 +39,4 @@
3.12.2
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-3/src/main/java/com/baeldung/staticvariables/StaticVariableDemo.java b/core-java-modules/core-java-lang-3/src/main/java/com/baeldung/staticvariables/StaticVariableDemo.java
new file mode 100644
index 0000000000..917e9b0953
--- /dev/null
+++ b/core-java-modules/core-java-lang-3/src/main/java/com/baeldung/staticvariables/StaticVariableDemo.java
@@ -0,0 +1,23 @@
+package com.baeldung.staticvariables;
+
+public class StaticVariableDemo {
+ public static int i;
+ public static int j = 20;
+ public static int z;
+
+ static {
+ z = 30;
+ a = 40;
+ }
+
+ public static int a = 50;
+
+ public static final int b = 100;
+
+ public StaticVariableDemo() {
+ }
+
+ static class Nested {
+ public static String nestedClassStaticVariable = "test";
+ }
+}
diff --git a/core-java-modules/core-java-lang-3/src/test/java/com/baeldung/staticvariables/StaticVariableUnitTest.java b/core-java-modules/core-java-lang-3/src/test/java/com/baeldung/staticvariables/StaticVariableUnitTest.java
new file mode 100644
index 0000000000..06711a888b
--- /dev/null
+++ b/core-java-modules/core-java-lang-3/src/test/java/com/baeldung/staticvariables/StaticVariableUnitTest.java
@@ -0,0 +1,113 @@
+package com.baeldung.staticvariables;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.lang.reflect.Field;
+
+import org.junit.jupiter.api.Test;
+
+public class StaticVariableUnitTest {
+
+ @Test
+ public void initializeStaticVariable_checkAssignedValues() {
+
+ try {
+ Class> staticVariableDemo = this.getClass()
+ .getClassLoader()
+ .loadClass("com.baeldung.staticvariables.StaticVariableDemo");
+
+ Field field1 = staticVariableDemo.getField("i");
+
+ assertThat(field1.getInt(staticVariableDemo)).isEqualTo(0);
+
+ Field field2 = staticVariableDemo.getField("j");
+
+ assertThat(field2.getInt(staticVariableDemo)).isEqualTo(20);
+
+ } catch (ClassNotFoundException | NoSuchFieldException | SecurityException e) {
+ e.printStackTrace();
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ @Test
+ public void initializeStaticVariable_checkStaticBlock() {
+
+ try {
+ Class> staticVariableDemo = this.getClass()
+ .getClassLoader()
+ .loadClass("com.baeldung.staticvariables.StaticVariableDemo");
+
+ Field field1 = staticVariableDemo.getField("z");
+
+ assertThat(field1.getInt(staticVariableDemo)).isEqualTo(30);
+
+ Field field2 = staticVariableDemo.getField("a");
+
+ assertThat(field2.getInt(staticVariableDemo)).isEqualTo(50);
+
+ } catch (ClassNotFoundException | NoSuchFieldException | SecurityException e) {
+ e.printStackTrace();
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ @Test
+ public void initializeStaticVariable_checkFinalValues() {
+
+ try {
+ Class> staticVariableDemo = this.getClass()
+ .getClassLoader()
+ .loadClass("com.baeldung.staticvariables.StaticVariableDemo");
+
+ Field field1 = staticVariableDemo.getField("b");
+
+ assertThat(field1.getInt(staticVariableDemo)).isEqualTo(100);
+
+ } catch (ClassNotFoundException | NoSuchFieldException | SecurityException e) {
+ e.printStackTrace();
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ @Test
+ public void initializeStaticVariable_checkInnerClassValues() {
+
+ try {
+ Class> staticVariableDemo = this.getClass()
+ .getClassLoader()
+ .loadClass("com.baeldung.staticvariables.StaticVariableDemo");
+
+ Class>[] nestedClasses = staticVariableDemo.getClasses();
+
+ for (Class> nestedClass : nestedClasses) {
+ if (nestedClass.getName()
+ .equals("Nested")) {
+
+ Field field1 = nestedClass.getField("nestedClassStaticVariable");
+ assertThat(field1.get(nestedClass)).isEqualTo("test");
+ }
+ }
+
+ } catch (ClassNotFoundException | NoSuchFieldException | SecurityException e) {
+ e.printStackTrace();
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+
+ }
+}
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index 03b15f60d6..589097cf48 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -72,6 +72,7 @@
core-java-io
core-java-io-2
+ core-java-io-3
core-java-io-apis
core-java-io-conversions
core-java-io-conversions-2
diff --git a/ddd/src/main/java/com/baeldung/ddd/order/config/CustomMongoConfiguration.java b/ddd/src/main/java/com/baeldung/ddd/order/config/CustomMongoConfiguration.java
new file mode 100644
index 0000000000..fcc6a50267
--- /dev/null
+++ b/ddd/src/main/java/com/baeldung/ddd/order/config/CustomMongoConfiguration.java
@@ -0,0 +1,46 @@
+package com.baeldung.ddd.order.config;
+
+import org.bson.Document;
+import org.joda.money.CurrencyUnit;
+import org.joda.money.Money;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.convert.converter.Converter;
+import org.springframework.data.convert.ReadingConverter;
+import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
+
+import java.math.BigDecimal;
+import java.util.Collections;
+
+@Configuration
+public class CustomMongoConfiguration {
+
+ @Bean
+ public MongoCustomConversions customConversions() {
+ return new MongoCustomConversions(Collections.singletonList(DocumentToMoneyConverter.INSTANCE));
+ }
+
+ @ReadingConverter
+ enum DocumentToMoneyConverter implements Converter {
+
+ INSTANCE;
+
+ @Override
+ public Money convert(Document source) {
+ Document money = source.get("money", Document.class);
+
+ return Money.of(getCurrency(money), getAmount(money));
+ }
+
+ private CurrencyUnit getCurrency(Document money) {
+ Document currency = money.get("currency", Document.class);
+ String currencyCode = currency.getString("code");
+ return CurrencyUnit.of(currencyCode);
+ }
+
+ private BigDecimal getAmount(Document money) {
+ String amount = money.getString("amount");
+ return BigDecimal.valueOf(Double.parseDouble(amount));
+ }
+ }
+}
diff --git a/ddd/src/test/java/com/baeldung/ddd/order/jpa/PersistOrderIntegrationTest.java b/ddd/src/test/java/com/baeldung/ddd/order/jpa/PersistOrderLiveTest.java
similarity index 84%
rename from ddd/src/test/java/com/baeldung/ddd/order/jpa/PersistOrderIntegrationTest.java
rename to ddd/src/test/java/com/baeldung/ddd/order/jpa/PersistOrderLiveTest.java
index c503c9960b..8f30bc14a7 100644
--- a/ddd/src/test/java/com/baeldung/ddd/order/jpa/PersistOrderIntegrationTest.java
+++ b/ddd/src/test/java/com/baeldung/ddd/order/jpa/PersistOrderLiveTest.java
@@ -1,19 +1,24 @@
package com.baeldung.ddd.order.jpa;
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.math.BigDecimal;
-import java.util.Arrays;
-
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
+import java.math.BigDecimal;
+import java.util.Arrays;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/*
+ To run this test we need to run the databases first.
+ A dedicated docker-compose.yml file is located under the resources directory.
+ We can run it by simple executing `docker-compose up`.
+ */
@SpringJUnitConfig
@SpringBootTest
-public class PersistOrderIntegrationTest {
+public class PersistOrderLiveTest {
@Autowired
private JpaOrderRepository repository;
diff --git a/ddd/src/test/java/com/baeldung/ddd/order/mongo/OrderMongoIntegrationTest.java b/ddd/src/test/java/com/baeldung/ddd/order/mongo/OrderMongoLiveTest.java
similarity index 87%
rename from ddd/src/test/java/com/baeldung/ddd/order/mongo/OrderMongoIntegrationTest.java
rename to ddd/src/test/java/com/baeldung/ddd/order/mongo/OrderMongoLiveTest.java
index ca4315c416..38e00be0b0 100644
--- a/ddd/src/test/java/com/baeldung/ddd/order/mongo/OrderMongoIntegrationTest.java
+++ b/ddd/src/test/java/com/baeldung/ddd/order/mongo/OrderMongoLiveTest.java
@@ -17,9 +17,14 @@ import com.baeldung.ddd.order.Order;
import com.baeldung.ddd.order.OrderLine;
import com.baeldung.ddd.order.Product;
+/*
+ To run this test we need to run the databases first.
+ A dedicated docker-compose.yml file is located under the resources directory.
+ We can run it by simple executing `docker-compose up`.
+ */
@SpringJUnitConfig
@SpringBootTest
-public class OrderMongoIntegrationTest {
+public class OrderMongoLiveTest {
@Autowired
private OrderMongoRepository repo;
diff --git a/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/CassandraDbOrderRepositoryIntegrationTest.java b/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/CassandraDbOrderRepositoryLiveTest.java
similarity index 87%
rename from ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/CassandraDbOrderRepositoryIntegrationTest.java
rename to ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/CassandraDbOrderRepositoryLiveTest.java
index 668d1e5e34..4b44e1d7b4 100644
--- a/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/CassandraDbOrderRepositoryIntegrationTest.java
+++ b/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/CassandraDbOrderRepositoryLiveTest.java
@@ -18,10 +18,15 @@ import com.baeldung.dddhexagonalspring.domain.Product;
import com.baeldung.dddhexagonalspring.domain.repository.OrderRepository;
import com.baeldung.dddhexagonalspring.infrastracture.repository.cassandra.SpringDataCassandraOrderRepository;
+/*
+ To run this test we need to run the databases first.
+ A dedicated docker-compose.yml file is located under the resources directory.
+ We can run it by simple executing `docker-compose up`.
+ */
@SpringJUnitConfig
@SpringBootTest
@TestPropertySource("classpath:ddd-layers-test.properties")
-class CassandraDbOrderRepositoryIntegrationTest {
+class CassandraDbOrderRepositoryLiveTest {
@Autowired
private SpringDataCassandraOrderRepository cassandraOrderRepository;
diff --git a/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryIntegrationTest.java b/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryLiveTest.java
similarity index 87%
rename from ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryIntegrationTest.java
rename to ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryLiveTest.java
index 9a7736c419..3cb3528448 100644
--- a/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryIntegrationTest.java
+++ b/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryLiveTest.java
@@ -18,10 +18,15 @@ import com.baeldung.dddhexagonalspring.domain.Product;
import com.baeldung.dddhexagonalspring.domain.repository.OrderRepository;
import com.baeldung.dddhexagonalspring.infrastracture.repository.mongo.SpringDataMongoOrderRepository;
+/*
+ To run this test we need to run the databases first.
+ A dedicated docker-compose.yml file is located under the resources directory.
+ We can run it by simple executing `docker-compose up`.
+ */
@SpringJUnitConfig
@SpringBootTest
@TestPropertySource("classpath:ddd-layers-test.properties")
-class MongoDbOrderRepositoryIntegrationTest {
+class MongoDbOrderRepositoryLiveTest {
@Autowired
private SpringDataMongoOrderRepository mongoOrderRepository;
diff --git a/libraries-6/README.md b/libraries-6/README.md
index 5f74517ab5..3748522b9d 100644
--- a/libraries-6/README.md
+++ b/libraries-6/README.md
@@ -15,4 +15,5 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m
- [A Guide to the Reflections Library](https://www.baeldung.com/reflections-library)
- [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once)
- [Introduction to Protonpack](https://www.baeldung.com/java-protonpack)
+- [Java-R Integration](https://www.baeldung.com/java-r-integration)
- More articles [[<-- prev]](/libraries-5)
diff --git a/libraries-6/pom.xml b/libraries-6/pom.xml
index 030e5aa77b..2f8cc385cb 100644
--- a/libraries-6/pom.xml
+++ b/libraries-6/pom.xml
@@ -92,8 +92,50 @@
${commonsio.version}
test
+
+ org.rosuda.REngine
+ Rserve
+ ${rserve.version}
+
+
+ com.github.jbytecode
+ RCaller
+ ${rcaller.version}
+
+
+ org.renjin
+ renjin-script-engine
+ ${renjin.version}
+
+
+
+
+ bedatadriven
+ bedatadriven public repo
+ https://nexus.bedatadriven.com/content/groups/public/
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+
+ com/baeldung/r/FastRMean.java
+
+
+ com/baeldung/r/FastRMeanUnitTest.java
+
+
+
+
+
+
2.0.0
1.10.0
@@ -105,6 +147,9 @@
3.6
3.6.2
2.6
+ RELEASE
+ 3.0
+ 1.8.1
diff --git a/libraries-data-2/src/main/java/com/baeldung/r/FastRMean.java b/libraries-6/src/main/java/com/baeldung/r/FastRMean.java
similarity index 92%
rename from libraries-data-2/src/main/java/com/baeldung/r/FastRMean.java
rename to libraries-6/src/main/java/com/baeldung/r/FastRMean.java
index 8348bfa403..1202cfaa2a 100644
--- a/libraries-data-2/src/main/java/com/baeldung/r/FastRMean.java
+++ b/libraries-6/src/main/java/com/baeldung/r/FastRMean.java
@@ -1,8 +1,5 @@
package com.baeldung.r;
-import java.io.IOException;
-import java.net.URISyntaxException;
-
/**
* FastR showcase.
*
diff --git a/libraries-data-2/src/main/java/com/baeldung/r/RCallerMean.java b/libraries-6/src/main/java/com/baeldung/r/RCallerMean.java
similarity index 99%
rename from libraries-data-2/src/main/java/com/baeldung/r/RCallerMean.java
rename to libraries-6/src/main/java/com/baeldung/r/RCallerMean.java
index 99edb8c043..d07a989444 100644
--- a/libraries-data-2/src/main/java/com/baeldung/r/RCallerMean.java
+++ b/libraries-6/src/main/java/com/baeldung/r/RCallerMean.java
@@ -1,12 +1,12 @@
package com.baeldung.r;
-import java.io.IOException;
-import java.net.URISyntaxException;
-
import com.github.rcaller.rstuff.RCaller;
import com.github.rcaller.rstuff.RCallerOptions;
import com.github.rcaller.rstuff.RCode;
+import java.io.IOException;
+import java.net.URISyntaxException;
+
/**
* RCaller showcase.
*
diff --git a/libraries-data-2/src/main/java/com/baeldung/r/RUtils.java b/libraries-6/src/main/java/com/baeldung/r/RUtils.java
similarity index 100%
rename from libraries-data-2/src/main/java/com/baeldung/r/RUtils.java
rename to libraries-6/src/main/java/com/baeldung/r/RUtils.java
diff --git a/libraries-data-2/src/main/java/com/baeldung/r/RenjinMean.java b/libraries-6/src/main/java/com/baeldung/r/RenjinMean.java
similarity index 99%
rename from libraries-data-2/src/main/java/com/baeldung/r/RenjinMean.java
rename to libraries-6/src/main/java/com/baeldung/r/RenjinMean.java
index 4576ec5fb4..22cfad3a6f 100644
--- a/libraries-data-2/src/main/java/com/baeldung/r/RenjinMean.java
+++ b/libraries-6/src/main/java/com/baeldung/r/RenjinMean.java
@@ -1,13 +1,12 @@
package com.baeldung.r;
-import java.io.IOException;
-import java.net.URISyntaxException;
-
-import javax.script.ScriptException;
-
import org.renjin.script.RenjinScriptEngine;
import org.renjin.sexp.DoubleArrayVector;
+import javax.script.ScriptException;
+import java.io.IOException;
+import java.net.URISyntaxException;
+
/**
* Renjin showcase.
*
diff --git a/libraries-data-2/src/main/java/com/baeldung/r/RserveMean.java b/libraries-6/src/main/java/com/baeldung/r/RserveMean.java
similarity index 100%
rename from libraries-data-2/src/main/java/com/baeldung/r/RserveMean.java
rename to libraries-6/src/main/java/com/baeldung/r/RserveMean.java
diff --git a/libraries-data-2/src/test/java/com/baeldung/r/FastRMeanUnitTest.java b/libraries-6/src/test/java/com/baeldung/r/FastRMeanUnitTest.java
similarity index 100%
rename from libraries-data-2/src/test/java/com/baeldung/r/FastRMeanUnitTest.java
rename to libraries-6/src/test/java/com/baeldung/r/FastRMeanUnitTest.java
diff --git a/libraries-data-2/src/test/java/com/baeldung/r/RCallerMeanIntegrationTest.java b/libraries-6/src/test/java/com/baeldung/r/RCallerMeanIntegrationTest.java
similarity index 99%
rename from libraries-data-2/src/test/java/com/baeldung/r/RCallerMeanIntegrationTest.java
rename to libraries-6/src/test/java/com/baeldung/r/RCallerMeanIntegrationTest.java
index ce6b3a4332..94dd9b89e5 100644
--- a/libraries-data-2/src/test/java/com/baeldung/r/RCallerMeanIntegrationTest.java
+++ b/libraries-6/src/test/java/com/baeldung/r/RCallerMeanIntegrationTest.java
@@ -1,14 +1,13 @@
package com.baeldung.r;
-import java.io.IOException;
-import java.net.URISyntaxException;
-
-import javax.script.ScriptException;
-
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
+import javax.script.ScriptException;
+import java.io.IOException;
+import java.net.URISyntaxException;
+
/**
* Test for {@link RCallerMean}.
*
diff --git a/libraries-data-2/src/test/java/com/baeldung/r/RenjinMeanUnitTest.java b/libraries-6/src/test/java/com/baeldung/r/RenjinMeanUnitTest.java
similarity index 99%
rename from libraries-data-2/src/test/java/com/baeldung/r/RenjinMeanUnitTest.java
rename to libraries-6/src/test/java/com/baeldung/r/RenjinMeanUnitTest.java
index f52d37d614..49472aaee6 100644
--- a/libraries-data-2/src/test/java/com/baeldung/r/RenjinMeanUnitTest.java
+++ b/libraries-6/src/test/java/com/baeldung/r/RenjinMeanUnitTest.java
@@ -1,13 +1,11 @@
package com.baeldung.r;
-import java.io.IOException;
-import java.net.URISyntaxException;
-
-import javax.script.ScriptException;
-
+import org.junit.Assert;
import org.junit.Test;
-import org.junit.Assert;
+import javax.script.ScriptException;
+import java.io.IOException;
+import java.net.URISyntaxException;
/**
* Test for {@link RenjinMean}.
diff --git a/libraries-data-2/src/test/java/com/baeldung/r/RserveMeanIntegrationTest.java b/libraries-6/src/test/java/com/baeldung/r/RserveMeanIntegrationTest.java
similarity index 100%
rename from libraries-data-2/src/test/java/com/baeldung/r/RserveMeanIntegrationTest.java
rename to libraries-6/src/test/java/com/baeldung/r/RserveMeanIntegrationTest.java
diff --git a/libraries-data-2/src/test/resources/script.R b/libraries-6/src/test/resources/script.R
similarity index 100%
rename from libraries-data-2/src/test/resources/script.R
rename to libraries-6/src/test/resources/script.R
diff --git a/libraries-data-2/README.md b/libraries-data-2/README.md
index 3fd9242d82..a8f2a0cb37 100644
--- a/libraries-data-2/README.md
+++ b/libraries-data-2/README.md
@@ -8,10 +8,8 @@ This module contains articles about libraries for data processing in Java.
- [Introduction to Conflict-Free Replicated Data Types](https://www.baeldung.com/java-conflict-free-replicated-data-types)
- [Introduction to javax.measure](https://www.baeldung.com/javax-measure)
- [A Guide to Infinispan in Java](https://www.baeldung.com/infinispan)
-- [Guide to JMapper](https://www.baeldung.com/jmapper)
- [An Introduction to SuanShu](https://www.baeldung.com/suanshu)
- [Intro to Derive4J](https://www.baeldung.com/derive4j)
-- [Java-R Integration](https://www.baeldung.com/java-r-integration)
- [Univocity Parsers](https://www.baeldung.com/java-univocity-parsers)
- [Using Kafka MockConsumer](https://www.baeldung.com/kafka-mockconsumer)
- [Using Kafka MockProducer](https://www.baeldung.com/kafka-mockproducer)
diff --git a/libraries-data-2/pom.xml b/libraries-data-2/pom.xml
index 93a2f28167..26d8651cdd 100644
--- a/libraries-data-2/pom.xml
+++ b/libraries-data-2/pom.xml
@@ -86,11 +86,6 @@
spring-web
${spring.version}
-
- com.googlecode.jmapper-framework
- jmapper-core
- ${jmapper.version}
-
com.numericalmethod
suanshu
@@ -126,6 +121,11 @@
kafka-clients
${kafka.version}
+
+ com.google.guava
+ guava
+ ${guava.version}
+
org.awaitility
awaitility
@@ -138,21 +138,6 @@
${awaitility.version}
test
-
- org.rosuda.REngine
- Rserve
- ${rserve.version}
-
-
- com.github.jbytecode
- RCaller
- ${rcaller.version}
-
-
- org.renjin
- renjin-script-engine
- ${renjin.version}
-
net.bytebuddy
byte-buddy
@@ -175,33 +160,8 @@
http://repo.numericalmethod.com/maven/
default
-
-
-
- bedatadriven
- bedatadriven public repo
- https://nexus.bedatadriven.com/content/groups/public/
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
-
-
- com/baeldung/r/FastRMean.java
-
-
- com/baeldung/r/FastRMeanUnitTest.java
-
-
-
-
-
-
1.5.0
1.6.0
@@ -210,17 +170,14 @@
9.1.5.Final
2.9.8
4.3.8.RELEASE
- 1.6.0.1
4.0.0
1.1.0
3.6.2
1.7.25
3.0.0
2.8.4
- RELEASE
- 3.0
- 1.8.1
2.5.0
+ 29.0-jre
\ No newline at end of file
diff --git a/libraries-data/README.md b/libraries-data/README.md
index 7614d11b16..44fddfd90e 100644
--- a/libraries-data/README.md
+++ b/libraries-data/README.md
@@ -12,4 +12,5 @@ This module contains articles about libraries for data processing in Java.
- [Introduction to Kafka Connectors](https://www.baeldung.com/kafka-connectors-guide)
- [Kafka Connect Example with MQTT and MongoDB](https://www.baeldung.com/kafka-connect-mqtt-mongodb)
- [Building a Data Pipeline with Flink and Kafka](https://www.baeldung.com/kafka-flink-data-pipeline)
+- [Guide to JMapper](https://www.baeldung.com/jmapper)
More articles: [[next -->]](/../libraries-data-2)
\ No newline at end of file
diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml
index 1267982c49..95d771ce4e 100644
--- a/libraries-data/pom.xml
+++ b/libraries-data/pom.xml
@@ -126,6 +126,11 @@
+
+ com.googlecode.jmapper-framework
+ jmapper-core
+ ${jmapper.version}
+
@@ -172,6 +177,7 @@
0.15.0
2.2.0
1.7.25
+ 1.6.0.1
diff --git a/libraries-data-2/src/main/java/com/baeldung/jmapper/User.java b/libraries-data/src/main/java/com/baeldung/jmapper/User.java
similarity index 100%
rename from libraries-data-2/src/main/java/com/baeldung/jmapper/User.java
rename to libraries-data/src/main/java/com/baeldung/jmapper/User.java
diff --git a/libraries-data-2/src/main/java/com/baeldung/jmapper/UserDto.java b/libraries-data/src/main/java/com/baeldung/jmapper/UserDto.java
similarity index 100%
rename from libraries-data-2/src/main/java/com/baeldung/jmapper/UserDto.java
rename to libraries-data/src/main/java/com/baeldung/jmapper/UserDto.java
diff --git a/libraries-data-2/src/main/java/com/baeldung/jmapper/UserDto1.java b/libraries-data/src/main/java/com/baeldung/jmapper/UserDto1.java
similarity index 100%
rename from libraries-data-2/src/main/java/com/baeldung/jmapper/UserDto1.java
rename to libraries-data/src/main/java/com/baeldung/jmapper/UserDto1.java
diff --git a/libraries-data-2/src/main/java/com/baeldung/jmapper/relational/User.java b/libraries-data/src/main/java/com/baeldung/jmapper/relational/User.java
similarity index 100%
rename from libraries-data-2/src/main/java/com/baeldung/jmapper/relational/User.java
rename to libraries-data/src/main/java/com/baeldung/jmapper/relational/User.java
diff --git a/libraries-data-2/src/main/java/com/baeldung/jmapper/relational/UserDto1.java b/libraries-data/src/main/java/com/baeldung/jmapper/relational/UserDto1.java
similarity index 100%
rename from libraries-data-2/src/main/java/com/baeldung/jmapper/relational/UserDto1.java
rename to libraries-data/src/main/java/com/baeldung/jmapper/relational/UserDto1.java
diff --git a/libraries-data-2/src/main/java/com/baeldung/jmapper/relational/UserDto2.java b/libraries-data/src/main/java/com/baeldung/jmapper/relational/UserDto2.java
similarity index 100%
rename from libraries-data-2/src/main/java/com/baeldung/jmapper/relational/UserDto2.java
rename to libraries-data/src/main/java/com/baeldung/jmapper/relational/UserDto2.java
diff --git a/libraries-data-2/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java b/libraries-data/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java
similarity index 95%
rename from libraries-data-2/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java
rename to libraries-data/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java
index 177ef08d41..0b7a7c95f4 100644
--- a/libraries-data-2/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java
+++ b/libraries-data/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java
@@ -7,6 +7,9 @@ import org.junit.Test;
import java.time.LocalDate;
import static com.googlecode.jmapper.api.JMapperAPI.*;
+import static com.googlecode.jmapper.api.JMapperAPI.attribute;
+import static com.googlecode.jmapper.api.JMapperAPI.global;
+import static com.googlecode.jmapper.api.JMapperAPI.mappedClass;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
diff --git a/libraries-data-2/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java b/libraries-data/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java
similarity index 97%
rename from libraries-data-2/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java
rename to libraries-data/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java
index a44d608a0a..7a497c4a83 100644
--- a/libraries-data-2/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java
+++ b/libraries-data/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java
@@ -55,8 +55,8 @@ public class JMapperRelationalIntegrationTest {
public void givenUser_whenUseApi_thenConverted(){
JMapperAPI jmapperApi = new JMapperAPI()
.add(mappedClass(User.class)
- .add(attribute("id").value("id").targetClasses(UserDto1.class,UserDto2.class))
- .add(attribute("email").targetAttributes("username","email").targetClasses(UserDto1.class,UserDto2.class)) )
+ .add(attribute("id").value("id").targetClasses(UserDto1.class, UserDto2.class))
+ .add(attribute("email").targetAttributes("username","email").targetClasses(UserDto1.class, UserDto2.class)) )
;
RelationalJMapper relationalMapper = new RelationalJMapper<>(User.class,jmapperApi);
diff --git a/libraries-data-2/src/test/resources/user_jmapper.xml b/libraries-data/src/test/resources/user_jmapper.xml
similarity index 100%
rename from libraries-data-2/src/test/resources/user_jmapper.xml
rename to libraries-data/src/test/resources/user_jmapper.xml
diff --git a/libraries-data-2/src/test/resources/user_jmapper1.xml b/libraries-data/src/test/resources/user_jmapper1.xml
similarity index 100%
rename from libraries-data-2/src/test/resources/user_jmapper1.xml
rename to libraries-data/src/test/resources/user_jmapper1.xml
diff --git a/libraries-data-2/src/test/resources/user_jmapper2.xml b/libraries-data/src/test/resources/user_jmapper2.xml
similarity index 100%
rename from libraries-data-2/src/test/resources/user_jmapper2.xml
rename to libraries-data/src/test/resources/user_jmapper2.xml
diff --git a/patterns/hexagonal-architecture/pom.xml b/patterns/hexagonal-architecture/pom.xml
new file mode 100644
index 0000000000..9317a25e56
--- /dev/null
+++ b/patterns/hexagonal-architecture/pom.xml
@@ -0,0 +1,59 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.3.0.RELEASE
+
+
+ com.baeldung
+ hexagonal-architecture
+ 1.0
+ hexagonal-architecture
+ Project for hexagonal architecture in java
+
+
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-mongodb
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+
+
+
+
+ org.mockito
+ mockito-core
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/HexArchApplicationDemo.java b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/HexArchApplicationDemo.java
new file mode 100644
index 0000000000..52aaefaaf7
--- /dev/null
+++ b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/HexArchApplicationDemo.java
@@ -0,0 +1,13 @@
+package com.baeldung.pattern.hexagonal;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class HexArchApplicationDemo {
+
+ public static void main(String[] args) {
+ SpringApplication.run(HexArchApplicationDemo.class, args);
+ }
+
+}
diff --git a/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/config/AppConfig.java b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/config/AppConfig.java
new file mode 100644
index 0000000000..ee8a01d0e2
--- /dev/null
+++ b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/config/AppConfig.java
@@ -0,0 +1,15 @@
+package com.baeldung.pattern.hexagonal.config;
+
+import com.baeldung.pattern.hexagonal.domain.services.EmployeeService;
+import com.baeldung.pattern.hexagonal.domain.services.EmployeeServiceImpl;
+import com.baeldung.pattern.hexagonal.persistence.EmployeeRepository;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class AppConfig {
+ @Bean
+ public EmployeeService getEmployeeService(EmployeeRepository employeeRepository) {
+ return new EmployeeServiceImpl(employeeRepository);
+ }
+}
diff --git a/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/config/MongoConfig.java b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/config/MongoConfig.java
new file mode 100644
index 0000000000..fa6980824a
--- /dev/null
+++ b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/config/MongoConfig.java
@@ -0,0 +1,10 @@
+package com.baeldung.pattern.hexagonal.config;
+
+import com.baeldung.pattern.hexagonal.persistence.MongoRepoEx;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
+
+@Configuration
+@EnableMongoRepositories(basePackageClasses = MongoRepoEx.class)
+public class MongoConfig {
+}
diff --git a/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/controller/EmployeeController.java b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/controller/EmployeeController.java
new file mode 100644
index 0000000000..077fc6fdea
--- /dev/null
+++ b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/controller/EmployeeController.java
@@ -0,0 +1,25 @@
+package com.baeldung.pattern.hexagonal.controller;
+
+import com.baeldung.pattern.hexagonal.domain.model.Employee;
+import com.baeldung.pattern.hexagonal.domain.services.EmployeeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/employees")
+public class EmployeeController {
+ @Autowired
+ EmployeeService employeeService;
+
+ @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
+ @ResponseBody
+ public Employee addEmployee(@RequestBody Employee employee) {
+ return employeeService.addEmployee(employee);
+ }
+
+ @GetMapping(path = "/{employeeId}")
+ public Employee getEmployee(@PathVariable("employeeId") String employeeId) {
+ return employeeService.getEmployee(employeeId);
+ }
+}
diff --git a/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/model/Employee.java b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/model/Employee.java
new file mode 100644
index 0000000000..de1f15cf53
--- /dev/null
+++ b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/model/Employee.java
@@ -0,0 +1,51 @@
+package com.baeldung.pattern.hexagonal.domain.model;
+
+import org.springframework.data.annotation.Id;
+
+import java.util.Objects;
+
+public class Employee {
+ @Id
+ private String empId;
+ private String empName;
+ private String empJobTitle;
+
+ public String getEmpId() {
+ return empId;
+ }
+
+ public void setEmpId(String empId) {
+ this.empId = empId;
+ }
+
+ public String getEmpName() {
+ return empName;
+ }
+
+ public void setEmpName(String empName) {
+ this.empName = empName;
+ }
+
+ public String getEmpJobTitle() {
+ return empJobTitle;
+ }
+
+ public void setEmpJobTitle(String empJobTitle) {
+ this.empJobTitle = empJobTitle;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+ Employee employee = (Employee) o;
+ return empId.equals(employee.empId);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(empId);
+ }
+}
\ No newline at end of file
diff --git a/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeService.java b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeService.java
new file mode 100644
index 0000000000..902abefabb
--- /dev/null
+++ b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeService.java
@@ -0,0 +1,10 @@
+package com.baeldung.pattern.hexagonal.domain.services;
+
+import com.baeldung.pattern.hexagonal.domain.model.Employee;
+
+public interface EmployeeService {
+
+ Employee addEmployee(Employee employee);
+
+ Employee getEmployee(String employeeId);
+}
diff --git a/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeServiceImpl.java b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeServiceImpl.java
new file mode 100644
index 0000000000..cd7c30ff30
--- /dev/null
+++ b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeServiceImpl.java
@@ -0,0 +1,34 @@
+package com.baeldung.pattern.hexagonal.domain.services;
+
+import com.baeldung.pattern.hexagonal.domain.model.Employee;
+import com.baeldung.pattern.hexagonal.persistence.EmployeeRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Optional;
+
+public class EmployeeServiceImpl implements EmployeeService {
+
+ private EmployeeRepository employeeRepository;
+
+ @Autowired
+ public EmployeeServiceImpl(EmployeeRepository employeeRepository) {
+ this.employeeRepository = employeeRepository;
+ }
+
+ @Override
+ public Employee addEmployee(Employee employee) {
+ return employeeRepository.add(employee);
+ }
+
+ @Override
+ public Employee getEmployee(String employeeId) {
+ Optional employee = employeeRepository.findById(employeeId);
+
+ if (employee.isPresent()) {
+ return employee.get();
+ } else {
+ // throw
+ }
+ return null;
+ }
+}
diff --git a/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/EmployeeRepository.java b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/EmployeeRepository.java
new file mode 100644
index 0000000000..53b4b6d276
--- /dev/null
+++ b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/EmployeeRepository.java
@@ -0,0 +1,15 @@
+package com.baeldung.pattern.hexagonal.persistence;
+
+import com.baeldung.pattern.hexagonal.domain.model.Employee;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface EmployeeRepository {
+
+ Employee add(Employee employee);
+
+ Optional findById(String id);
+
+}
diff --git a/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/MongoDBRepository.java b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/MongoDBRepository.java
new file mode 100644
index 0000000000..08f0c96ab0
--- /dev/null
+++ b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/MongoDBRepository.java
@@ -0,0 +1,24 @@
+package com.baeldung.pattern.hexagonal.persistence;
+
+import com.baeldung.pattern.hexagonal.domain.model.Employee;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public class MongoDBRepository implements EmployeeRepository {
+
+ @Autowired
+ MongoRepoEx mongoRepository;
+
+ @Override
+ public Employee add(Employee employee) {
+ return mongoRepository.insert(employee);
+ }
+
+ @Override
+ public Optional findById(String id) {
+ return mongoRepository.findById(id);
+ }
+}
diff --git a/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/MongoRepoEx.java b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/MongoRepoEx.java
new file mode 100644
index 0000000000..766444c22f
--- /dev/null
+++ b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/MongoRepoEx.java
@@ -0,0 +1,9 @@
+package com.baeldung.pattern.hexagonal.persistence;
+
+import com.baeldung.pattern.hexagonal.domain.model.Employee;
+import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface MongoRepoEx extends MongoRepository {
+}
diff --git a/patterns/hexagonal-architecture/src/main/resources/application.properties b/patterns/hexagonal-architecture/src/main/resources/application.properties
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/patterns/hexagonal-architecture/src/main/resources/application.properties
@@ -0,0 +1 @@
+
diff --git a/patterns/hexagonal-architecture/src/test/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeServiceImplTest.java b/patterns/hexagonal-architecture/src/test/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeServiceImplTest.java
new file mode 100644
index 0000000000..cadb3b094b
--- /dev/null
+++ b/patterns/hexagonal-architecture/src/test/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeServiceImplTest.java
@@ -0,0 +1,46 @@
+package com.baeldung.pattern.hexagonal.domain.services;
+
+import com.baeldung.pattern.hexagonal.domain.model.Employee;
+import com.baeldung.pattern.hexagonal.persistence.EmployeeRepository;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import java.util.Optional;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+class EmployeeServiceImplTest {
+
+ private EmployeeRepository employeeRepository;
+ private EmployeeService testService;
+ private Employee testModel;
+
+ @BeforeEach
+ void setUp() {
+ employeeRepository = mock(EmployeeRepository.class);
+
+ testService = new EmployeeServiceImpl(employeeRepository);
+ testModel = new Employee();
+ testModel.setEmpId("2000");
+ testModel.setEmpName("Test user 1");
+ testModel.setEmpJobTitle("Software engineer");
+ }
+
+ @Test
+ void addEmployee() {
+ when(employeeRepository.add(any(Employee.class))).thenReturn(testModel);
+
+ Employee testResponse = testService.addEmployee(testModel);
+ assertEquals(testModel, testResponse);
+ }
+
+ @Test
+ void getEmployee() {
+ when(employeeRepository.findById("2000")).thenReturn(Optional.of(testModel));
+
+ Employee testResponse = testService.getEmployee("2000");
+ assertEquals(testModel, testResponse);
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/DatasourceFactory.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/DatasourceFactory.java
new file mode 100644
index 0000000000..adbdc66030
--- /dev/null
+++ b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/DatasourceFactory.java
@@ -0,0 +1,23 @@
+package com.baeldung.statmentVsPreparedstatment;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+public class DatasourceFactory {
+
+ private Connection connection;
+
+ public Connection getConnection() throws ClassNotFoundException, SQLException {
+ Class.forName("org.h2.Driver");
+ connection = DriverManager.getConnection("jdbc:h2:mem:db_basic", "SA", "");
+ connection.setAutoCommit(false);
+ return connection;
+ }
+
+ public boolean createTables() throws SQLException {
+ String query = "create table if not exists PERSONS (ID INT, NAME VARCHAR(45))";
+ return connection.createStatement().executeUpdate(query) == 0;
+ }
+
+}
diff --git a/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/PersonEntity.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/PersonEntity.java
new file mode 100644
index 0000000000..72fc0c1e24
--- /dev/null
+++ b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/PersonEntity.java
@@ -0,0 +1,42 @@
+package com.baeldung.statmentVsPreparedstatment;
+
+import java.util.Objects;
+
+public class PersonEntity {
+ private int id;
+ private String name;
+
+ public PersonEntity(int id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+ PersonEntity that = (PersonEntity) o;
+ return id == that.id && Objects.equals(name, that.name);
+ }
+
+ @Override public int hashCode() {
+ return Objects.hash(id, name);
+ }
+}
diff --git a/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/PreparedStatementPersonDao.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/PreparedStatementPersonDao.java
new file mode 100644
index 0000000000..47124d9139
--- /dev/null
+++ b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/PreparedStatementPersonDao.java
@@ -0,0 +1,88 @@
+package com.baeldung.statmentVsPreparedstatment;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+public class PreparedStatementPersonDao {
+
+ private final Connection connection;
+
+ public PreparedStatementPersonDao(Connection connection) {
+ this.connection = connection;
+ }
+
+ public Optional getById(int id) throws SQLException {
+ String query = "SELECT id, name FROM persons WHERE id = ?";
+
+ PreparedStatement preparedStatement = connection.prepareStatement(query);
+ preparedStatement.setInt(1, id);
+ ResultSet resultSet = preparedStatement.executeQuery();
+
+ if (resultSet.first()) {
+
+ PersonEntity result = new PersonEntity(resultSet.getInt("id"),
+ resultSet.getString("name"));
+
+ return Optional.of(result);
+ } else {
+ return Optional.empty();
+ }
+
+ }
+
+ public void insert(PersonEntity personEntity) throws SQLException {
+
+ String query = "INSERT INTO persons(id, name) VALUES( ?, ?)";
+
+ PreparedStatement preparedStatement = connection.prepareStatement(query);
+ preparedStatement.setInt(1, personEntity.getId());
+ preparedStatement.setString(2, personEntity.getName());
+ preparedStatement.executeUpdate();
+
+ }
+
+ public void insert(List personEntities) throws SQLException {
+ String query = "INSERT INTO persons(id, name) VALUES( ?, ?)";
+
+ PreparedStatement preparedStatement = connection.prepareStatement(query);
+ for (PersonEntity personEntity : personEntities) {
+ preparedStatement.setInt(1, personEntity.getId());
+ preparedStatement.setString(2, personEntity.getName());
+ preparedStatement.addBatch();
+ }
+ preparedStatement.executeBatch();
+
+ }
+
+ public void update(PersonEntity personEntity) throws SQLException {
+ String query = "UPDATE persons SET name = ? WHERE id = ?";
+ PreparedStatement preparedStatement = connection.prepareStatement(query);
+ preparedStatement.setString(1, personEntity.getName());
+ preparedStatement.setInt(2, personEntity.getId());
+ preparedStatement.executeUpdate();
+ }
+
+ public void deleteById(int id) throws SQLException {
+ String query = "DELETE FROM persons WHERE id = ?";
+ PreparedStatement preparedStatement = connection.prepareStatement(query);
+ preparedStatement.setInt(1, id);
+ preparedStatement.executeUpdate();
+ }
+
+ public List getAll() throws SQLException {
+ String query = "SELECT id, name FROM persons";
+
+ PreparedStatement preparedStatement = connection.prepareStatement(query);
+ ResultSet resultSet = preparedStatement.executeQuery();
+ List result = new ArrayList<>();
+ while (resultSet.next()) {
+ result.add(new PersonEntity(resultSet.getInt("id"), resultSet.getString("name")));
+ }
+ return result;
+ }
+}
diff --git a/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/StatementPersonDao.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/StatementPersonDao.java
new file mode 100644
index 0000000000..935ba8efa2
--- /dev/null
+++ b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/StatementPersonDao.java
@@ -0,0 +1,75 @@
+package com.baeldung.statmentVsPreparedstatment;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+public class StatementPersonDao {
+
+ private final Connection connection;
+
+ public StatementPersonDao(Connection connection) {
+ this.connection = connection;
+ }
+
+ public Optional getById(int id) throws SQLException {
+ String query = "SELECT id, name, FROM persons WHERE id = '" + id + "'";
+
+ Statement statement = connection.createStatement();
+ ResultSet resultSet = statement.executeQuery(query);
+
+ if (resultSet.first()) {
+ PersonEntity result = new PersonEntity(resultSet.getInt("id"),
+ resultSet.getString("name"));
+ return Optional.of(result);
+ } else {
+ return Optional.empty();
+ }
+ }
+
+ public void insert(PersonEntity personEntity) throws SQLException {
+ String query = "INSERT INTO persons(id, name) VALUES(" + personEntity.getId() + ", '"
+ + personEntity.getName() + "')";
+
+ Statement statement = connection.createStatement();
+ statement.executeUpdate(query);
+ }
+
+ public void insert(List personEntities) throws SQLException {
+ for (PersonEntity personEntity : personEntities) {
+ insert(personEntity);
+ }
+ }
+
+ public void update(PersonEntity personEntity) throws SQLException {
+
+ String query = "UPDATE persons SET name = '" + personEntity.getName() + "' WHERE id = "
+ + personEntity.getId();
+
+ Statement statement = connection.createStatement();
+ statement.executeUpdate(query);
+
+ }
+
+ public void deleteById(int id) throws SQLException {
+ String query = "DELETE FROM persons WHERE id = " + id;
+ Statement statement = connection.createStatement();
+ statement.executeUpdate(query);
+ }
+
+ public List getAll() throws SQLException {
+ String query = "SELECT id, name, FROM persons";
+
+ Statement statement = connection.createStatement();
+ ResultSet resultSet = statement.executeQuery(query);
+ List result = new ArrayList<>();
+ while (resultSet.next()) {
+ result.add(new PersonEntity(resultSet.getInt("id"), resultSet.getString("name")));
+ }
+ return result;
+ }
+}
diff --git a/persistence-modules/core-java-persistence/src/test/java/com/baeldung/statmentVsPreparedstatment/DatasourceFactoryUnitTest.java b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/statmentVsPreparedstatment/DatasourceFactoryUnitTest.java
new file mode 100644
index 0000000000..5d3b151d5d
--- /dev/null
+++ b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/statmentVsPreparedstatment/DatasourceFactoryUnitTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.statmentVsPreparedstatment;
+
+import org.junit.jupiter.api.Test;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class DatasourceFactoryUnitTest {
+
+ @Test
+ void whenCreateConnectionAndTables_thenConnectionIsOpenAndTableIsCreated()
+ throws SQLException, ClassNotFoundException {
+ DatasourceFactory factory = new DatasourceFactory();
+ Connection connection = factory.getConnection();
+
+ assertFalse(connection.isClosed());
+ assertTrue(factory.createTables());
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/core-java-persistence/src/test/java/com/baeldung/statmentVsPreparedstatment/PreparedStatementPersonDaoUnitTest.java b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/statmentVsPreparedstatment/PreparedStatementPersonDaoUnitTest.java
new file mode 100644
index 0000000000..ce79f47802
--- /dev/null
+++ b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/statmentVsPreparedstatment/PreparedStatementPersonDaoUnitTest.java
@@ -0,0 +1,94 @@
+package com.baeldung.statmentVsPreparedstatment;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class PreparedStatementPersonDaoUnitTest {
+ private PreparedStatementPersonDao dao;
+
+ @BeforeEach
+ void setup() throws SQLException, ClassNotFoundException {
+ DatasourceFactory datasourceFactory = new DatasourceFactory();
+ Connection connection = datasourceFactory.getConnection();
+ datasourceFactory.createTables();
+ dao = new PreparedStatementPersonDao(connection);
+ }
+
+ @Test
+ void whenInsertAPerson_thenItNeverThrowsAnException() {
+ assertDoesNotThrow(() -> dao.insert(new PersonEntity(1, "john")));
+ }
+
+ @Test
+ void whenInsertAPersonWithQuoteInText_thenItNeverThrowsAnException() {
+ assertDoesNotThrow(() -> dao.insert(new PersonEntity(1, "O'Brien")));
+ }
+
+ @Test
+ void whenGetAPersonById_thenItReturnThePersonInDatabase() throws SQLException {
+ dao.insert(new PersonEntity(1, "john"));
+
+ Optional maybeEmployee = dao.getById(1);
+ assertTrue(maybeEmployee.isPresent());
+
+ PersonEntity personEntity = maybeEmployee.get();
+
+ assertEquals(1, personEntity.getId());
+ assertEquals("john", personEntity.getName());
+ }
+
+ @Test
+ void whenInsertAndGetMultiplePersons_thenItNeverThrowsAnException() throws SQLException {
+ assertDoesNotThrow(() -> dao.insert(
+ Arrays.asList(new PersonEntity(1, "john"), new PersonEntity(2, "skit"))));
+
+ List result = dao.getAll();
+
+ assertEquals(Arrays.asList(new PersonEntity(1, "john"), new PersonEntity(2, "skit")),
+ result);
+ }
+
+ @Test
+ void whenUpdateAnExistentPerson_thenItReturnsTheUpdatedPerson() throws SQLException {
+ dao.insert(new PersonEntity(1, "john"));
+ dao.update(new PersonEntity(1, "johnny"));
+
+ Optional maybePerson = dao.getById(1);
+
+ assertTrue(maybePerson.isPresent());
+
+ PersonEntity personEntity = maybePerson.get();
+
+ assertEquals(1, personEntity.getId());
+ assertEquals("johnny", personEntity.getName());
+ }
+
+ @Test
+ void whenDeleteAPersonById_thenItWillBeAbsentInDatabase() throws SQLException {
+ dao.insert(new PersonEntity(1, "john"));
+ dao.deleteById(1);
+
+ Optional maybePerson = dao.getById(1);
+
+ assertFalse(maybePerson.isPresent());
+ }
+
+ @Test
+ void whenAHackerUpdateAPerson_thenItUpdatesTheTargetPerson() throws SQLException {
+ dao.insert(Arrays.asList(new PersonEntity(1, "john"), new PersonEntity(2, "skeet")));
+ dao.update(new PersonEntity(1, "hacker' --"));
+
+ List result = dao.getAll();
+
+ assertEquals(Arrays.asList(new PersonEntity(1, "hacker' --"), new PersonEntity(2, "skeet")),
+ result);
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/core-java-persistence/src/test/java/com/baeldung/statmentVsPreparedstatment/StatementPersonDaoUnitTest.java b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/statmentVsPreparedstatment/StatementPersonDaoUnitTest.java
new file mode 100644
index 0000000000..b31bdcc296
--- /dev/null
+++ b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/statmentVsPreparedstatment/StatementPersonDaoUnitTest.java
@@ -0,0 +1,96 @@
+package com.baeldung.statmentVsPreparedstatment;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class StatementPersonDaoUnitTest {
+
+ private StatementPersonDao dao;
+
+ @BeforeEach
+ void setup() throws SQLException, ClassNotFoundException {
+ DatasourceFactory datasourceFactory = new DatasourceFactory();
+ Connection connection = datasourceFactory.getConnection();
+ datasourceFactory.createTables();
+ dao = new StatementPersonDao(connection);
+ }
+
+ @Test
+ void whenInsertAPerson_thenItNeverThrowsAnException() {
+ assertDoesNotThrow(() -> dao.insert(new PersonEntity(1, "john")));
+ }
+
+ @Test
+ void whenInsertAPersonWithQuoteInText_thenItWillThrowAnException() {
+ assertThrows(SQLException.class, () -> dao.insert(new PersonEntity(1, "O'Brien")));
+ }
+
+ @Test
+ void whenGetAPersonById_thenItReturnThePersonInDatabase() throws SQLException {
+ dao.insert(new PersonEntity(1, "john"));
+
+ Optional maybeEmployee = dao.getById(1);
+
+ assertTrue(maybeEmployee.isPresent());
+
+ PersonEntity personEntity = maybeEmployee.get();
+
+ assertEquals(1, personEntity.getId());
+ assertEquals("john", personEntity.getName());
+ }
+
+ @Test
+ void whenInsertAndGetMultiplePersons_thenItNeverThrowsAnException() throws SQLException {
+ assertDoesNotThrow(() -> dao.insert(
+ Arrays.asList(new PersonEntity(1, "john"), new PersonEntity(2, "skeet"))));
+
+ List result = dao.getAll();
+
+ assertEquals(Arrays.asList(new PersonEntity(1, "john"), new PersonEntity(2, "skeet")),
+ result);
+ }
+
+ @Test
+ void whenUpdateAnExistentPerson_thenItReturnsTheUpdatedPerson() throws SQLException {
+ dao.insert(new PersonEntity(1, "john"));
+ dao.update(new PersonEntity(1, "johnny"));
+
+ Optional maybePerson = dao.getById(1);
+
+ assertTrue(maybePerson.isPresent());
+
+ PersonEntity personEntity = maybePerson.get();
+
+ assertEquals(1, personEntity.getId());
+ assertEquals("johnny", personEntity.getName());
+ }
+
+ @Test
+ void whenDeleteAPersonById_thenItWillBeAbsentInDatabase() throws SQLException {
+ dao.insert(new PersonEntity(1, "john"));
+ dao.deleteById(1);
+
+ Optional maybePerson = dao.getById(1);
+
+ assertFalse(maybePerson.isPresent());
+ }
+
+ @Test
+ void whenAHackerUpdateAPerson_thenItAllPersonsAreUpdated() throws SQLException {
+ dao.insert(Arrays.asList(new PersonEntity(1, "john"), new PersonEntity(2, "skeet")));
+ dao.update(new PersonEntity(1, "hacker' --"));
+
+ List result = dao.getAll();
+
+ assertEquals(Arrays.asList(new PersonEntity(1, "hacker"), new PersonEntity(2, "hacker")),
+ result);
+ }
+}
\ No newline at end of file
diff --git a/testing-modules/junit-4/src/test/java/com/baeldung/assume/ConditionallyIgnoreTestsUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/assume/ConditionallyIgnoreTestsUnitTest.java
new file mode 100644
index 0000000000..0aa184f2e1
--- /dev/null
+++ b/testing-modules/junit-4/src/test/java/com/baeldung/assume/ConditionallyIgnoreTestsUnitTest.java
@@ -0,0 +1,41 @@
+package com.baeldung.assume;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assume.assumeFalse;
+import static org.junit.Assume.assumeThat;
+import static org.junit.Assume.assumeTrue;
+
+import org.junit.Test;
+
+public class ConditionallyIgnoreTestsUnitTest {
+
+
+ @Test
+ public void whenAssumeThatCodeVersionIsNot2_thenIgnore() {
+ final int codeVersion = 1;
+ assumeThat(codeVersion, is(2));
+
+ assertEquals("hello", "HELLO".toLowerCase());
+ }
+
+ @Test
+ public void whenAssumeTrueOnCondition_thenIgnore() {
+ final int codeVersion = 1;
+ assumeTrue(isCodeVersion2(codeVersion));
+
+ assertEquals("hello", "HELLO".toLowerCase());
+ }
+
+ @Test
+ public void whenAssumeFalseOnCondition_thenIgnore() {
+ final int codeVersion = 2;
+ assumeFalse(isCodeVersion2(codeVersion));
+
+ assertEquals("hello", "HELLO".toLowerCase());
+ }
+
+ private boolean isCodeVersion2(final int codeVersion) {
+ return codeVersion == 2;
+ }
+}