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; + } +}