+ *
+ */
+@XmlType(name = "currency")
+@XmlEnum
+public enum Currency {
+
+ EUR,
+ INR,
+ USD;
+
+ public String value() {
+ return name();
+ }
+
+ public static Currency fromValue(String v) {
+ return valueOf(v);
+ }
+
+}
diff --git a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/ObjectFactory.java b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/ObjectFactory.java
new file mode 100644
index 0000000000..9ed85fe2b9
--- /dev/null
+++ b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/ObjectFactory.java
@@ -0,0 +1,40 @@
+
+package com.baeldung.soap.ws.client.generated;
+
+import javax.xml.bind.annotation.XmlRegistry;
+
+
+/**
+ * This object contains factory methods for each
+ * Java content interface and Java element interface
+ * generated in the com.baeldung.soap.ws.client.generated package.
+ *
An ObjectFactory allows you to programatically
+ * construct new instances of the Java representation
+ * for XML content. The Java representation of XML
+ * content can consist of schema derived interfaces
+ * and classes representing the binding of schema
+ * type definitions, element declarations and model
+ * groups. Factory methods for each of these are
+ * provided in this class.
+ *
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+
+ /**
+ * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: com.baeldung.soap.ws.client.generated
+ *
+ */
+ public ObjectFactory() {
+ }
+
+ /**
+ * Create an instance of {@link Country }
+ *
+ */
+ public Country createCountry() {
+ return new Country();
+ }
+
+}
diff --git a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/package-info.java b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/package-info.java
new file mode 100644
index 0000000000..dfc556859f
--- /dev/null
+++ b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/package-info.java
@@ -0,0 +1,2 @@
+@javax.xml.bind.annotation.XmlSchema(namespace = "http://server.ws.soap.baeldung.com/")
+package com.baeldung.soap.ws.client.generated;
diff --git a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/server/Country.java b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/server/Country.java
new file mode 100644
index 0000000000..62ea4a22ed
--- /dev/null
+++ b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/server/Country.java
@@ -0,0 +1,41 @@
+package com.baeldung.soap.ws.server;
+
+public class Country {
+ protected String name;
+ protected int population;
+ protected String capital;
+ protected Currency currency;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getPopulation() {
+ return population;
+ }
+
+ public void setPopulation(int population) {
+ this.population = population;
+ }
+
+ public String getCapital() {
+ return capital;
+ }
+
+ public void setCapital(String capital) {
+ this.capital = capital;
+ }
+
+ public Currency getCurrency() {
+ return currency;
+ }
+
+ public void setCurrency(Currency currency) {
+ this.currency = currency;
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/server/CountryRepository.java b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/server/CountryRepository.java
new file mode 100644
index 0000000000..558f7c1293
--- /dev/null
+++ b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/server/CountryRepository.java
@@ -0,0 +1,43 @@
+package com.baeldung.soap.ws.server;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class CountryRepository {
+
+ private static final Map countries = new HashMap<>();
+
+ {
+ initData();
+ }
+
+ private final static void initData() {
+ Country usa = new Country();
+ usa.setName("USA");
+ usa.setCapital("Washington D.C.");
+ usa.setCurrency(Currency.USD);
+ usa.setPopulation(323947000);
+
+ countries.put(usa.getName(), usa);
+
+ Country india = new Country();
+ india.setName("India");
+ india.setCapital("New Delhi");
+ india.setCurrency(Currency.INR);
+ india.setPopulation(1295210000);
+
+ countries.put(india.getName(), india);
+
+ Country france = new Country();
+ france.setName("France");
+ france.setCapital("Paris");
+ france.setCurrency(Currency.EUR);
+ france.setPopulation(66710000);
+
+ countries.put(france.getName(), france);
+ }
+
+ public Country findCountry(String name) {
+ return countries.get(name);
+ }
+}
diff --git a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/server/CountryService.java b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/server/CountryService.java
new file mode 100644
index 0000000000..b11765b326
--- /dev/null
+++ b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/server/CountryService.java
@@ -0,0 +1,15 @@
+package com.baeldung.soap.ws.server;
+
+import jakarta.jws.WebMethod;
+import jakarta.jws.WebService;
+import jakarta.jws.soap.SOAPBinding;
+import jakarta.jws.soap.SOAPBinding.Style;
+
+@WebService
+@SOAPBinding(style=Style.RPC)
+public interface CountryService {
+
+ @WebMethod
+ Country findByName(String name);
+
+}
diff --git a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/server/CountryServiceImpl.java b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/server/CountryServiceImpl.java
new file mode 100644
index 0000000000..da159a1475
--- /dev/null
+++ b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/server/CountryServiceImpl.java
@@ -0,0 +1,15 @@
+package com.baeldung.soap.ws.server;
+
+import jakarta.jws.WebService;
+
+@WebService(endpointInterface = "com.baeldung.soap.ws.server.CountryService")
+public class CountryServiceImpl implements CountryService {
+
+ private CountryRepository countryRepository = new CountryRepository();
+
+ @Override
+ public Country findByName(String name) {
+ return countryRepository.findCountry(name);
+ }
+
+}
diff --git a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/server/CountryServicePublisher.java b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/server/CountryServicePublisher.java
new file mode 100644
index 0000000000..314a91dc48
--- /dev/null
+++ b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/server/CountryServicePublisher.java
@@ -0,0 +1,19 @@
+package com.baeldung.soap.ws.server;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import jakarta.xml.ws.Endpoint;
+
+
+public class CountryServicePublisher {
+
+ private static final Logger logger = LoggerFactory.getLogger(CountryServicePublisher.class);
+
+ public static void main(String[] args) {
+ Endpoint endpoint = Endpoint.create(new CountryServiceImpl());
+ endpoint.publish("http://localhost:8888/ws/country");
+
+ logger.info("Country web service ready to consume requests!");
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/server/Currency.java b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/server/Currency.java
new file mode 100644
index 0000000000..d1b25a26c6
--- /dev/null
+++ b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/server/Currency.java
@@ -0,0 +1,15 @@
+package com.baeldung.soap.ws.server;
+
+public enum Currency {
+
+ EUR, INR, USD;
+
+ public String value() {
+ return name();
+ }
+
+ public static Currency fromValue(String v) {
+ return valueOf(v);
+ }
+
+}
diff --git a/core-java-modules/core-java-11-2/src/test/java/com/baeldung/version/VersionUnitTest.java b/core-java-modules/core-java-11-2/src/test/java/com/baeldung/version/VersionUnitTest.java
new file mode 100644
index 0000000000..fb7d5647a5
--- /dev/null
+++ b/core-java-modules/core-java-11-2/src/test/java/com/baeldung/version/VersionUnitTest.java
@@ -0,0 +1,48 @@
+package com.baeldung.version;
+
+import org.apache.commons.lang3.SystemUtils;
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+public class VersionUnitTest {
+
+ @Test
+ public void givenJava_whenUsingRuntime_thenGetVersion() {
+ String expectedVersion = "11";
+ Runtime.Version runtimeVersion = Runtime.version();
+ String version = String.valueOf(runtimeVersion.version().get(0));
+ Assertions.assertThat(version).isEqualTo(expectedVersion);
+ }
+
+ @Test
+ @Disabled("Only valid for Java 8 and lower")
+ public void givenJava_whenUsingCommonsLang_thenGetVersion() {
+ int expectedVersion = 8;
+ String[] versionElements = SystemUtils.JAVA_SPECIFICATION_VERSION.split("\\.");
+ int discard = Integer.parseInt(versionElements[0]);
+ int version;
+ if (discard == 1) {
+ version = Integer.parseInt(versionElements[1]);
+ } else {
+ version = discard;
+ }
+ Assertions.assertThat(version).isEqualTo(expectedVersion);
+ }
+
+ @Test
+ @Disabled("Only valid for Java 8 and lower")
+ public void givenJava_whenUsingSystemProp_thenGetVersion() {
+ int expectedVersion = 8;
+ String[] versionElements = System.getProperty("java.version").split("\\.");
+ int discard = Integer.parseInt(versionElements[0]);
+ int version;
+ if (discard == 1) {
+ version = Integer.parseInt(versionElements[1]);
+ } else {
+ version = discard;
+ }
+ Assertions.assertThat(version).isEqualTo(expectedVersion);
+ }
+}
+
diff --git a/core-java-modules/core-java-11/pom.xml b/core-java-modules/core-java-11/pom.xml
index 2f7f5a6bcf..def7ab43f7 100644
--- a/core-java-modules/core-java-11/pom.xml
+++ b/core-java-modules/core-java-11/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -32,12 +31,12 @@
org.openjdk.jmhjmh-core
- ${jmh.version}
+ ${jmh-core.version}org.openjdk.jmhjmh-generator-annprocess
- ${jmh.version}
+ ${jmh-generator.version}provided
@@ -76,10 +75,12 @@
${uberjar.name}
-
+ org.openjdk.jmh.Main
-
+
@@ -105,9 +106,8 @@
27.1-jre3.11.1benchmarks
- 1.2210.0.03.2.4
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-12/pom.xml b/core-java-modules/core-java-12/pom.xml
index 373f23488e..8f6abdda5b 100644
--- a/core-java-modules/core-java-12/pom.xml
+++ b/core-java-modules/core-java-12/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
diff --git a/core-java-modules/core-java-13/pom.xml b/core-java-modules/core-java-13/pom.xml
index 4537067567..6369976580 100644
--- a/core-java-modules/core-java-13/pom.xml
+++ b/core-java-modules/core-java-13/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
diff --git a/core-java-modules/core-java-14/pom.xml b/core-java-modules/core-java-14/pom.xml
index e977f39e9d..f3382f6577 100644
--- a/core-java-modules/core-java-14/pom.xml
+++ b/core-java-modules/core-java-14/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -15,6 +14,7 @@
1.0.0-SNAPSHOT../../
+
org.assertj
@@ -35,6 +35,7 @@
test
+
diff --git a/core-java-modules/core-java-15/pom.xml b/core-java-modules/core-java-15/pom.xml
index 3b0d324d10..091f0568a7 100644
--- a/core-java-modules/core-java-15/pom.xml
+++ b/core-java-modules/core-java-15/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
diff --git a/core-java-modules/core-java-8-2/README.md b/core-java-modules/core-java-8-2/README.md
index c1c09d2192..7f2245ccc0 100644
--- a/core-java-modules/core-java-8-2/README.md
+++ b/core-java-modules/core-java-8-2/README.md
@@ -7,4 +7,5 @@ This module contains articles about Java 8 core features
- [Run a Java Application from the Command Line](https://www.baeldung.com/java-run-jar-with-arguments)
- [Java 8 Stream skip() vs limit()](https://www.baeldung.com/java-stream-skip-vs-limit)
- [Guide to Java BiFunction Interface](https://www.baeldung.com/java-bifunction-interface)
+- [Interface With Default Methods vs Abstract Class](https://www.baeldung.com/java-interface-default-method-vs-abstract-class)
- [[<-- Prev]](/core-java-modules/core-java-8)
diff --git a/core-java-modules/core-java-8-2/pom.xml b/core-java-modules/core-java-8-2/pom.xml
index 48474a5eef..e1a861a63c 100644
--- a/core-java-modules/core-java-8-2/pom.xml
+++ b/core-java-modules/core-java-8-2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-8-2jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -34,4 +34,4 @@
3.12.2
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-8-2/src/main/java/com/baeldung/interfaceVsAbstractClass/ChidlCircleInterfaceImpl.java b/core-java-modules/core-java-8-2/src/main/java/com/baeldung/interfaceVsAbstractClass/ChidlCircleInterfaceImpl.java
new file mode 100644
index 0000000000..2aadf2e2e8
--- /dev/null
+++ b/core-java-modules/core-java-8-2/src/main/java/com/baeldung/interfaceVsAbstractClass/ChidlCircleInterfaceImpl.java
@@ -0,0 +1,14 @@
+package com.baeldung.interfaceVsAbstractClass;
+
+public class ChidlCircleInterfaceImpl implements CircleInterface {
+ private String color;
+
+ @Override
+ public String getColor() {
+ return color;
+ }
+
+ public void setColor(String color) {
+ this.color = color;
+ }
+}
diff --git a/core-java-modules/core-java-8-2/src/main/java/com/baeldung/interfaceVsAbstractClass/ChildCircleClass.java b/core-java-modules/core-java-8-2/src/main/java/com/baeldung/interfaceVsAbstractClass/ChildCircleClass.java
new file mode 100644
index 0000000000..8d26bda306
--- /dev/null
+++ b/core-java-modules/core-java-8-2/src/main/java/com/baeldung/interfaceVsAbstractClass/ChildCircleClass.java
@@ -0,0 +1,5 @@
+package com.baeldung.interfaceVsAbstractClass;
+
+public class ChildCircleClass extends CircleClass {
+
+}
diff --git a/core-java-modules/core-java-8-2/src/main/java/com/baeldung/interfaceVsAbstractClass/CircleClass.java b/core-java-modules/core-java-8-2/src/main/java/com/baeldung/interfaceVsAbstractClass/CircleClass.java
new file mode 100644
index 0000000000..048ffa4fe9
--- /dev/null
+++ b/core-java-modules/core-java-8-2/src/main/java/com/baeldung/interfaceVsAbstractClass/CircleClass.java
@@ -0,0 +1,23 @@
+package com.baeldung.interfaceVsAbstractClass;
+
+import java.util.Arrays;
+import java.util.List;
+
+public abstract class CircleClass {
+
+ private String color;
+ private List allowedColors = Arrays.asList("RED", "GREEN", "BLUE");
+
+ public boolean isValid() {
+ return allowedColors.contains(getColor());
+ }
+
+ public String getColor() {
+ return color;
+ }
+
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+}
diff --git a/core-java-modules/core-java-8-2/src/main/java/com/baeldung/interfaceVsAbstractClass/CircleInterface.java b/core-java-modules/core-java-8-2/src/main/java/com/baeldung/interfaceVsAbstractClass/CircleInterface.java
new file mode 100644
index 0000000000..a0c3a6d9c6
--- /dev/null
+++ b/core-java-modules/core-java-8-2/src/main/java/com/baeldung/interfaceVsAbstractClass/CircleInterface.java
@@ -0,0 +1,14 @@
+package com.baeldung.interfaceVsAbstractClass;
+
+import java.util.Arrays;
+import java.util.List;
+
+public interface CircleInterface {
+ List allowedColors = Arrays.asList("RED", "GREEN", "BLUE");
+
+ String getColor();
+
+ public default boolean isValid() {
+ return allowedColors.contains(getColor());
+ }
+}
diff --git a/core-java-modules/core-java-8-2/src/test/java/com/baeldung/interfaceVsAbstractClass/InterfaceVsAbstractClassUnitTest.java b/core-java-modules/core-java-8-2/src/test/java/com/baeldung/interfaceVsAbstractClass/InterfaceVsAbstractClassUnitTest.java
new file mode 100644
index 0000000000..8cba13ddeb
--- /dev/null
+++ b/core-java-modules/core-java-8-2/src/test/java/com/baeldung/interfaceVsAbstractClass/InterfaceVsAbstractClassUnitTest.java
@@ -0,0 +1,21 @@
+package com.baeldung.interfaceVsAbstractClass;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class InterfaceVsAbstractClassUnitTest {
+ @Test
+ public void givenAbstractClass_whenValidCircleUsed_thenPass() {
+ CircleClass redCircle = new ChildCircleClass();
+ redCircle.setColor("RED");
+ assertTrue(redCircle.isValid());
+ }
+
+ @Test
+ public void givenInterface_whenValidCircleWithoutStateUsed_thenPass() {
+ ChidlCircleInterfaceImpl redCircleWithoutState = new ChidlCircleInterfaceImpl();
+ redCircleWithoutState.setColor("RED");
+ assertTrue(redCircleWithoutState.isValid());
+ }
+}
diff --git a/core-java-modules/core-java-8-datetime-2/pom.xml b/core-java-modules/core-java-8-datetime-2/pom.xml
index 0e60941cc7..9972122544 100644
--- a/core-java-modules/core-java-8-datetime-2/pom.xml
+++ b/core-java-modules/core-java-8-datetime-2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
${project.parent.version}core-java-8-datetime-2jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -47,7 +47,6 @@
true
-
org.apache.maven.plugins
@@ -69,4 +68,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-8-datetime/pom.xml b/core-java-modules/core-java-8-datetime/pom.xml
index 629ce5234d..48b2d062b0 100644
--- a/core-java-modules/core-java-8-datetime/pom.xml
+++ b/core-java-modules/core-java-8-datetime/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
${project.parent.version}core-java-8-datetimejar
+
com.baeldung.core-java-modulescore-java-modules
@@ -41,14 +41,13 @@
- core-java-datetime-java8
+ core-java-8-datetimesrc/main/resourcestrue
-
org.apache.maven.plugins
@@ -70,4 +69,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/pom.xml b/core-java-modules/core-java-8/pom.xml
index 557f9e0dce..13b2fbcf89 100644
--- a/core-java-modules/core-java-8/pom.xml
+++ b/core-java-modules/core-java-8/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-8jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -58,4 +58,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-improvements/pom.xml b/core-java-modules/core-java-9-improvements/pom.xml
index bf68cfbd47..b047e15969 100644
--- a/core-java-modules/core-java-9-improvements/pom.xml
+++ b/core-java-modules/core-java-9-improvements/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -78,4 +77,4 @@
25.1-jre
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-improvements/src/test/java/com/baeldung/java9/io/conversion/InputStreamToByteArrayUnitTest.java b/core-java-modules/core-java-9-improvements/src/test/java/com/baeldung/java9/io/conversion/InputStreamToByteArrayUnitTest.java
index b64709be09..3450ac5627 100644
--- a/core-java-modules/core-java-9-improvements/src/test/java/com/baeldung/java9/io/conversion/InputStreamToByteArrayUnitTest.java
+++ b/core-java-modules/core-java-9-improvements/src/test/java/com/baeldung/java9/io/conversion/InputStreamToByteArrayUnitTest.java
@@ -15,24 +15,43 @@ public class InputStreamToByteArrayUnitTest {
@Test
public final void givenUsingPlainJavaOnFixedSizeStream_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException {
- final InputStream initialStream = new ByteArrayInputStream(new byte[] { 0, 1, 2 });
- final byte[] targetArray = new byte[initialStream.available()];
- initialStream.read(targetArray);
+ final InputStream is = new ByteArrayInputStream(new byte[] { 0, 1, 2 });
+ final byte[] targetArray = new byte[is.available()];
+
+ is.read(targetArray);
}
@Test
public final void givenUsingPlainJavaOnUnknownSizeStream_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException {
- final InputStream is = new ByteArrayInputStream(new byte[] { 0, 1, 2 });
-
+ final InputStream is = new ByteArrayInputStream(new byte[] { 0, 1, 2, 3, 4, 5, 6 });
final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+
int nRead;
- final byte[] data = new byte[1024];
+ final byte[] data = new byte[4];
+
while ((nRead = is.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
- final byte[] byteArray = buffer.toByteArray();
+ final byte[] targetArray = buffer.toByteArray();
+ }
+
+ @Test
+ public final void givenUsingPlainJava9OnUnknownSizeStream_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws IOException {
+ final InputStream is = new ByteArrayInputStream(new byte[] { 0, 1, 2, 3, 4, 5, 6 });
+ final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+
+ int nRead;
+ final byte[] data = new byte[4];
+
+ while ((nRead = is.readNBytes(data, 0, data.length)) != 0) {
+ System.out.println("here " + nRead);
+ buffer.write(data, 0, nRead);
+ }
+
+ buffer.flush();
+ final byte[] targetArray = buffer.toByteArray();
}
@Test
diff --git a/core-java-modules/core-java-9-jigsaw/pom.xml b/core-java-modules/core-java-9-jigsaw/pom.xml
index 6ad4c3d510..a26a88f4b0 100644
--- a/core-java-modules/core-java-9-jigsaw/pom.xml
+++ b/core-java-modules/core-java-9-jigsaw/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -35,4 +34,4 @@
1.9
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-new-features/pom.xml b/core-java-modules/core-java-9-new-features/pom.xml
index 2f07a665a4..2f174002bb 100644
--- a/core-java-modules/core-java-9-new-features/pom.xml
+++ b/core-java-modules/core-java-9-new-features/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -40,6 +39,7 @@
test
+
incubator-features
@@ -131,6 +131,7 @@
+
core-java-9-new-features
@@ -164,4 +165,4 @@
3.2.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-streams/pom.xml b/core-java-modules/core-java-9-streams/pom.xml
index 8c1af89b24..aeaf2c7f57 100644
--- a/core-java-modules/core-java-9-streams/pom.xml
+++ b/core-java-modules/core-java-9-streams/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-9-streamsjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -25,4 +25,4 @@
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-9/README.md b/core-java-modules/core-java-9/README.md
index cab02369cc..8203755417 100644
--- a/core-java-modules/core-java-9/README.md
+++ b/core-java-modules/core-java-9/README.md
@@ -10,3 +10,4 @@ This module contains articles about Java 9 core features
- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
- [Immutable ArrayList in Java](https://www.baeldung.com/java-immutable-list)
- [Easy Ways to Write a Java InputStream to an OutputStream](https://www.baeldung.com/java-inputstream-to-outputstream)
+- [Private Methods in Java Interfaces](https://www.baeldung.com/java-interface-private-methods)
diff --git a/core-java-modules/core-java-9/pom.xml b/core-java-modules/core-java-9/pom.xml
index 001faf88cb..543c3891ee 100644
--- a/core-java-modules/core-java-9/pom.xml
+++ b/core-java-modules/core-java-9/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -90,4 +89,4 @@
3.2.2
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-9/src/main/java/com/baeldung/java9/interfaces/CustomFoo.java b/core-java-modules/core-java-9/src/main/java/com/baeldung/java9/interfaces/CustomFoo.java
new file mode 100644
index 0000000000..388927fbfe
--- /dev/null
+++ b/core-java-modules/core-java-9/src/main/java/com/baeldung/java9/interfaces/CustomFoo.java
@@ -0,0 +1,10 @@
+package com.baeldung.java9.interfaces;
+
+public class CustomFoo implements Foo {
+
+ public static void main(String... args) {
+ Foo customFoo = new CustomFoo();
+ customFoo.bar(); // 'Hello world!'
+ Foo.buzz(); // 'Hello static world!'
+ }
+}
diff --git a/core-java-modules/core-java-9/src/main/java/com/baeldung/java9/interfaces/Foo.java b/core-java-modules/core-java-9/src/main/java/com/baeldung/java9/interfaces/Foo.java
new file mode 100644
index 0000000000..8ccee83b7e
--- /dev/null
+++ b/core-java-modules/core-java-9/src/main/java/com/baeldung/java9/interfaces/Foo.java
@@ -0,0 +1,22 @@
+package com.baeldung.java9.interfaces;
+
+public interface Foo {
+
+ public default void bar() {
+ System.out.print("Hello");
+ baz();
+ }
+
+ public static void buzz() {
+ System.out.print("Hello");
+ staticBaz();
+ }
+
+ private void baz() {
+ System.out.print(" world!");
+ }
+
+ private static void staticBaz() {
+ System.out.print(" static world!");
+ }
+}
diff --git a/core-java-modules/core-java-9/src/test/java/com/baeldung/java9/interfaces/CustomFooUnitTest.java b/core-java-modules/core-java-9/src/test/java/com/baeldung/java9/interfaces/CustomFooUnitTest.java
new file mode 100644
index 0000000000..d107c091fb
--- /dev/null
+++ b/core-java-modules/core-java-9/src/test/java/com/baeldung/java9/interfaces/CustomFooUnitTest.java
@@ -0,0 +1,38 @@
+package com.baeldung.java9.interfaces;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class CustomFooUnitTest {
+ private ByteArrayOutputStream outContent = new ByteArrayOutputStream();
+ private PrintStream originalOut = System.out;
+
+ @BeforeEach
+ void setup() {
+ System.setOut(new PrintStream(outContent));
+ }
+
+ @AfterEach
+ void tearDown() {
+ System.setOut(originalOut);
+ }
+
+ @Test
+ void givenACustomFooObject_whenCallingDefaultMethodBar_thenExpectedStringIsWrittenToSystemOut() {
+ CustomFoo customFoo = new CustomFoo();
+ customFoo.bar();
+ assertThat(outContent.toString()).isEqualTo("Hello world!");
+ }
+
+ @Test
+ void givenAFooInterface_whenCallingStaticMethodBuzz_thenExpectedStringIsWrittenToSystemOut() {
+ Foo.buzz();
+ assertThat(outContent.toString()).isEqualTo("Hello static world!");
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-annotations/pom.xml b/core-java-modules/core-java-annotations/pom.xml
index 92ba4991bb..6c35aea668 100644
--- a/core-java-modules/core-java-annotations/pom.xml
+++ b/core-java-modules/core-java-annotations/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
diff --git a/core-java-modules/core-java-annotations/src/test/java/com/baeldung/customannotations/JsonSerializerUnitTest.java b/core-java-modules/core-java-annotations/src/test/java/com/baeldung/customannotations/ObjectToJsonConverterUnitTest.java
similarity index 95%
rename from core-java-modules/core-java-annotations/src/test/java/com/baeldung/customannotations/JsonSerializerUnitTest.java
rename to core-java-modules/core-java-annotations/src/test/java/com/baeldung/customannotations/ObjectToJsonConverterUnitTest.java
index fd8f8ba8b3..6c22b1bb73 100644
--- a/core-java-modules/core-java-annotations/src/test/java/com/baeldung/customannotations/JsonSerializerUnitTest.java
+++ b/core-java-modules/core-java-annotations/src/test/java/com/baeldung/customannotations/ObjectToJsonConverterUnitTest.java
@@ -5,7 +5,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
import org.junit.jupiter.api.Test;
-public class JsonSerializerUnitTest {
+public class ObjectToJsonConverterUnitTest {
@Test
public void givenObjectNotSerializedThenExceptionThrown() throws JsonSerializationException {
diff --git a/core-java-modules/core-java-arrays-convert/pom.xml b/core-java-modules/core-java-arrays-convert/pom.xml
index 67dc645936..4cb2946ac9 100644
--- a/core-java-modules/core-java-arrays-convert/pom.xml
+++ b/core-java-modules/core-java-arrays-convert/pom.xml
@@ -1,17 +1,17 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-arrays-convert
+ core-java-arrays-convert
+ jar
+
core-java-modulescom.baeldung.core-java-modules0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-arrays-convert
- core-java-arrays-convert
- jar
@@ -24,4 +24,5 @@
28.2-jre
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-arrays-guides/README.md b/core-java-modules/core-java-arrays-guides/README.md
index 7338ff9523..00bb6b53c8 100644
--- a/core-java-modules/core-java-arrays-guides/README.md
+++ b/core-java-modules/core-java-arrays-guides/README.md
@@ -8,3 +8,4 @@ This module contains complete guides about arrays in Java
- [What is \[Ljava.lang.Object;?](https://www.baeldung.com/java-tostring-array)
- [Guide to ArrayStoreException](https://www.baeldung.com/java-arraystoreexception)
- [Creating a Generic Array in Java](https://www.baeldung.com/java-generic-array)
+- [Maximum Size of Java Arrays](https://www.baeldung.com/java-arrays-max-size)
diff --git a/core-java-modules/core-java-arrays-guides/pom.xml b/core-java-modules/core-java-arrays-guides/pom.xml
index 263954445e..3dba2dc05f 100644
--- a/core-java-modules/core-java-arrays-guides/pom.xml
+++ b/core-java-modules/core-java-arrays-guides/pom.xml
@@ -1,28 +1,28 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-arrays-guides
+ core-java-arrays-guides
+ jar
+
core-java-modulescom.baeldung.core-java-modules0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-arrays-guides
- core-java-arrays-guides
- jarorg.openjdk.jmhjmh-core
- ${jmh.version}
+ ${jmh-core.version}org.openjdk.jmhjmh-generator-annprocess
- ${jmh.version}
+ ${jmh-generator.version}org.assertj
@@ -32,7 +32,4 @@
-
- 1.19
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-arrays-guides/src/main/java/com/baeldung/array/MaxSizeArray.java b/core-java-modules/core-java-arrays-guides/src/main/java/com/baeldung/array/MaxSizeArray.java
new file mode 100644
index 0000000000..76a6a9290a
--- /dev/null
+++ b/core-java-modules/core-java-arrays-guides/src/main/java/com/baeldung/array/MaxSizeArray.java
@@ -0,0 +1,15 @@
+package com.baeldung.array;
+
+public class MaxSizeArray {
+
+ public static void main(String... strings) {
+ for (int i = 2; i >= 0; i--) {
+ try {
+ int[] arr = new int[Integer.MAX_VALUE - i];
+ System.out.println("Max-Size : "+ arr.length);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/core-java-modules/core-java-arrays-guides/src/test/java/com/baeldung/arrays/MaxArrySizeUnitTest.java b/core-java-modules/core-java-arrays-guides/src/test/java/com/baeldung/arrays/MaxArrySizeUnitTest.java
new file mode 100644
index 0000000000..ab79e83247
--- /dev/null
+++ b/core-java-modules/core-java-arrays-guides/src/test/java/com/baeldung/arrays/MaxArrySizeUnitTest.java
@@ -0,0 +1,30 @@
+package com.baeldung.arrays;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class MaxArrySizeUnitTest {
+
+ @Test
+ public void whenInitialArrayMoreThanMaxSize_thenThrowArray() {
+ boolean initalized = false;
+ try {
+ int[] arr = new int[Integer.MAX_VALUE - 1];
+ initalized = true;
+ } catch (Throwable e) {
+ Assert.assertTrue(e.getMessage().contains("Requested array size exceeds VM limit"));
+ }
+ Assert.assertFalse(initalized);
+ }
+
+ @Test
+ public void whenInitialArrayLessThanMaxSize_thenThrowArray() {
+ int[] arr = null;
+ try {
+ arr = new int[Integer.MAX_VALUE - 2];
+ } catch (Throwable e) {
+ Assert.assertTrue(e.getMessage().contains("Java heap space"));
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-arrays-multidimensional/pom.xml b/core-java-modules/core-java-arrays-multidimensional/pom.xml
index d90853678c..d314b07d85 100644
--- a/core-java-modules/core-java-arrays-multidimensional/pom.xml
+++ b/core-java-modules/core-java-arrays-multidimensional/pom.xml
@@ -1,15 +1,16 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-arrays-multidimensional
+ core-java-arrays-multidimensional
+ jar
+
core-java-modulescom.baeldung.core-java-modules0.0.1-SNAPSHOT
- 4.0.0
- core-java-arrays-multidimensional
- core-java-arrays-multidimensional
- jar
\ No newline at end of file
diff --git a/core-java-modules/core-java-arrays-operations-advanced/README.md b/core-java-modules/core-java-arrays-operations-advanced/README.md
index c8ec3e74bc..0e003b5cd9 100644
--- a/core-java-modules/core-java-arrays-operations-advanced/README.md
+++ b/core-java-modules/core-java-arrays-operations-advanced/README.md
@@ -9,3 +9,4 @@ This module contains articles about advanced operations on arrays in Java. They
- [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average)
- [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection)
- [Comparing Arrays in Java](https://www.baeldung.com/java-comparing-arrays)
+- [Concatenate Two Arrays in Java](https://www.baeldung.com/java-concatenate-arrays)
diff --git a/core-java-modules/core-java-arrays-operations-advanced/pom.xml b/core-java-modules/core-java-arrays-operations-advanced/pom.xml
index c7ea09c616..5663a7d1ca 100644
--- a/core-java-modules/core-java-arrays-operations-advanced/pom.xml
+++ b/core-java-modules/core-java-arrays-operations-advanced/pom.xml
@@ -1,17 +1,17 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-arrays-operations-advanced
+ core-java-arrays-operations-advanced
+ jar
+
core-java-modulescom.baeldung.core-java-modules0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-arrays-operations-advanced
- core-java-arrays-operations-advanced
- jar
@@ -31,4 +31,5 @@
3.10.0
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/arrayconcat/ArrayConcatUtil.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/arrayconcat/ArrayConcatUtil.java
new file mode 100644
index 0000000000..15ac48ea7d
--- /dev/null
+++ b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/arrayconcat/ArrayConcatUtil.java
@@ -0,0 +1,65 @@
+package com.baeldung.arrayconcat;
+
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+public class ArrayConcatUtil {
+ private ArrayConcatUtil() {}
+
+ static T[] concatWithCollection(T[] array1, T[] array2) {
+ List resultList = new ArrayList<>(array1.length + array2.length);
+ Collections.addAll(resultList, array1);
+ Collections.addAll(resultList, array2);
+
+ @SuppressWarnings("unchecked")
+ //the type cast is safe as the array1 has the type T[]
+ T[] resultArray = (T[]) Array.newInstance(array1.getClass().getComponentType(), 0);
+ return resultList.toArray(resultArray);
+ }
+
+ static T[] concatWithArrayCopy(T[] array1, T[] array2) {
+ T[] result = Arrays.copyOf(array1, array1.length + array2.length);
+ System.arraycopy(array2, 0, result, array1.length, array2.length);
+ return result;
+ }
+
+ static T concatWithCopy2(T array1, T array2) {
+ if (!array1.getClass().isArray() || !array2.getClass().isArray()) {
+ throw new IllegalArgumentException("Only arrays are accepted.");
+ }
+
+ Class> compType1 = array1.getClass().getComponentType();
+ Class> compType2 = array2.getClass().getComponentType();
+
+ if (!compType1.equals(compType2)) {
+ throw new IllegalArgumentException("Two arrays have different types.");
+ }
+
+ int len1 = Array.getLength(array1);
+ int len2 = Array.getLength(array2);
+
+ @SuppressWarnings("unchecked")
+ //the cast is safe due to the previous checks
+ T result = (T) Array.newInstance(compType1, len1 + len2);
+
+ System.arraycopy(array1, 0, result, 0, len1);
+ System.arraycopy(array2, 0, result, len1, len2);
+
+ return result;
+ }
+
+ @SuppressWarnings("unchecked")
+ static T[] concatWithStream(T[] array1, T[] array2) {
+ return Stream.concat(Arrays.stream(array1), Arrays.stream(array2))
+ .toArray(size -> (T[]) Array.newInstance(array1.getClass().getComponentType(), size));
+ }
+
+ static int[] concatIntArraysWithIntStream(int[] array1, int[] array2) {
+ return IntStream.concat(Arrays.stream(array1), Arrays.stream(array2)).toArray();
+ }
+}
diff --git a/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arrayconcat/ArrayConcatUtilUnitTest.java b/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arrayconcat/ArrayConcatUtilUnitTest.java
new file mode 100644
index 0000000000..77c368d763
--- /dev/null
+++ b/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arrayconcat/ArrayConcatUtilUnitTest.java
@@ -0,0 +1,99 @@
+package com.baeldung.arrayconcat;
+
+
+import com.google.common.collect.ObjectArrays;
+import com.google.common.primitives.Ints;
+import org.apache.commons.lang3.ArrayUtils;
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.fail;
+
+public class ArrayConcatUtilUnitTest {
+ private final String[] strArray1 = { "element 1", "element 2", "element 3" };
+ private final String[] strArray2 = { "element 4", "element 5" };
+ private final String[] expectedStringArray = { "element 1", "element 2", "element 3", "element 4", "element 5" };
+
+ private final int[] intArray1 = { 0, 1, 2, 3 };
+ private final int[] intArray2 = { 4, 5, 6, 7 };
+ private final int[] expectedIntArray = { 0, 1, 2, 3, 4, 5, 6, 7 };
+
+ @Test
+ public void givenTwoStringArrays_whenConcatWithList_thenGetExpectedResult() {
+ String[] result = ArrayConcatUtil.concatWithCollection(strArray1, strArray2);
+ assertThat(result).isEqualTo(expectedStringArray);
+ }
+
+ @Test
+ public void givenTwoStringArrays_whenConcatWithCopy_thenGetExpectedResult() {
+ String[] result = ArrayConcatUtil.concatWithArrayCopy(strArray1, strArray2);
+ assertThat(result).isEqualTo(expectedStringArray);
+ }
+
+ @Test
+ public void givenTwoStrings_whenConcatWithCopy2_thenGetException() {
+ String exMsg = "Only arrays are accepted.";
+ try {
+ ArrayConcatUtil.concatWithCopy2("String Nr. 1", "String Nr. 2");
+ fail(String.format("IllegalArgumentException with message:'%s' should be thrown. But it didn't", exMsg));
+ } catch (IllegalArgumentException e) {
+ assertThat(e).hasMessage(exMsg);
+ }
+ }
+
+ @Test
+ public void givenTwoArraysInDifferentTypes_whenConcatWithCopy2_thenGetException() {
+ String[] strArray = new String[] { "test 1", "test 2" };
+ Integer[] integerArray = new Integer[] { 7, 11 };
+ String exMsg = "Two arrays have different types.";
+
+ try {
+ ArrayConcatUtil.concatWithCopy2(strArray, integerArray);
+ fail(String.format("IllegalArgumentException with message:'%s' should be thrown. But it didn't", exMsg));
+ } catch (IllegalArgumentException e) {
+ assertThat(e).hasMessage(exMsg);
+ }
+ }
+
+ @Test
+ public void givenTwoArrays_whenConcatWithCopy2_thenGetExpectedResult() {
+ String[] result = ArrayConcatUtil.concatWithCopy2(strArray1, strArray2);
+ assertThat(result).isEqualTo(expectedStringArray);
+
+ int[] intResult = ArrayConcatUtil.concatWithCopy2(intArray1, intArray2);
+ assertThat(intResult).isEqualTo(expectedIntArray);
+ }
+
+ @Test
+ public void givenTwoStringArrays_whenConcatWithStream_thenGetExpectedResult() {
+ String[] result = ArrayConcatUtil.concatWithStream(strArray1, strArray2);
+ assertThat(result).isEqualTo(expectedStringArray);
+ }
+
+ @Test
+ public void givenTwoIntArrays_whenConcatWithIntStream_thenGetExpectedResult() {
+ int[] intResult = ArrayConcatUtil.concatIntArraysWithIntStream(intArray1, intArray2);
+ assertThat(intResult).isEqualTo(expectedIntArray);
+ }
+
+ @Test
+ public void givenTwoArrays_whenConcatWithCommonsLang_thenGetExpectedResult() {
+ String[] result = ArrayUtils.addAll(strArray1, strArray2);
+ assertThat(result).isEqualTo(expectedStringArray);
+
+ int[] intResult = ArrayUtils.addAll(intArray1, intArray2);
+ assertThat(intResult).isEqualTo(expectedIntArray);
+ }
+
+ @Test
+ public void givenTwoStringArrays_whenConcatWithGuava_thenGetExpectedResult() {
+ String[] result = ObjectArrays.concat(strArray1, strArray2, String.class);
+ assertThat(result).isEqualTo(expectedStringArray);
+ }
+
+ @Test
+ public void givenTwoIntArrays_whenConcatWithGuava_thenGetExpectedResult() {
+ int[] intResult = Ints.concat(intArray1, intArray2);
+ assertThat(intResult).isEqualTo(expectedIntArray);
+ }
+}
diff --git a/core-java-modules/core-java-arrays-operations-basic/pom.xml b/core-java-modules/core-java-arrays-operations-basic/pom.xml
index dcee6547a0..382cee102d 100644
--- a/core-java-modules/core-java-arrays-operations-basic/pom.xml
+++ b/core-java-modules/core-java-arrays-operations-basic/pom.xml
@@ -1,17 +1,17 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-arrays-operations-basic
+ core-java-arrays-operations-basic
+ jar
+
core-java-modulescom.baeldung.core-java-modules0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-arrays-operations-basic
- core-java-arrays-operations-basic
- jar
@@ -19,19 +19,17 @@
commons-lang3${commons-lang3.version}
-
org.openjdk.jmhjmh-core
- ${jmh.version}
+ ${jmh-core.version}org.openjdk.jmhjmh-generator-annprocess
- ${jmh.version}
+ ${jmh-generator.version}
-
org.assertjassertj-core
@@ -55,7 +53,8 @@
benchmarks
-
+ org.openjdk.jmh.Main
@@ -68,7 +67,7 @@
3.2.0
- 1.193.10.0
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-arrays-sorting/pom.xml b/core-java-modules/core-java-arrays-sorting/pom.xml
index 9b900c3de6..d30e2bfabc 100644
--- a/core-java-modules/core-java-arrays-sorting/pom.xml
+++ b/core-java-modules/core-java-arrays-sorting/pom.xml
@@ -1,18 +1,18 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-arrays-sorting
+ core-java-arrays-sorting
+ jar
+
core-java-modulescom.baeldung.core-java-modules0.0.1-SNAPSHOT../
- 4.0.0
-
- core-java-arrays-sorting
- core-java-arrays-sorting
- jar
@@ -26,19 +26,17 @@
guava${guava.version}
-
org.openjdk.jmhjmh-core
- ${jmh.version}
+ ${jmh-core.version}org.openjdk.jmhjmh-generator-annprocess
- ${jmh.version}
+ ${jmh-generator.version}
-
org.assertj
@@ -63,7 +61,8 @@
benchmarks
-
+ org.openjdk.jmh.Main
@@ -77,7 +76,6 @@
3.2.028.2-jre
- 1.193.10.0
\ No newline at end of file
diff --git a/core-java-modules/core-java-char/pom.xml b/core-java-modules/core-java-char/pom.xml
index 3691079482..ef356d9542 100644
--- a/core-java-modules/core-java-char/pom.xml
+++ b/core-java-modules/core-java-char/pom.xml
@@ -1,13 +1,13 @@
-
+4.0.0core-java-char0.1.0-SNAPSHOTcore-java-charjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -25,18 +25,17 @@
org.openjdk.jmhjmh-core
- ${openjdk.jmh.version}
+ ${jmh-core.version}org.openjdk.jmhjmh-generator-annprocess
- ${openjdk.jmh.version}
+ ${jmh-generator.version}
- 1.193.11.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-2/pom.xml b/core-java-modules/core-java-collections-2/pom.xml
index d163aabdbc..421ba9abac 100644
--- a/core-java-modules/core-java-collections-2/pom.xml
+++ b/core-java-modules/core-java-collections-2/pom.xml
@@ -1,12 +1,12 @@
-4.0.0core-java-collections-2core-java-collections-2jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -57,4 +57,4 @@
1.3
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-3/pom.xml b/core-java-modules/core-java-collections-3/pom.xml
index 602fcf60f4..c7b1284d5c 100644
--- a/core-java-modules/core-java-collections-3/pom.xml
+++ b/core-java-modules/core-java-collections-3/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-collections-3jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -24,7 +24,7 @@
org.openjdk.jmhjmh-core
- ${openjdk.jmh.version}
+ ${jmh-core.version}org.assertj
@@ -40,9 +40,8 @@
- 1.193.11.10.10
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-4/pom.xml b/core-java-modules/core-java-collections-4/pom.xml
index b4f8aa6320..daf2588ece 100644
--- a/core-java-modules/core-java-collections-4/pom.xml
+++ b/core-java-modules/core-java-collections-4/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-collections-4jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -28,4 +28,4 @@
3.19.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-array-list/pom.xml b/core-java-modules/core-java-collections-array-list/pom.xml
index 81ee4eff55..2e4ab30b8a 100644
--- a/core-java-modules/core-java-collections-array-list/pom.xml
+++ b/core-java-modules/core-java-collections-array-list/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-collections-array-listjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -34,4 +34,4 @@
3.11.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-list-2/pom.xml b/core-java-modules/core-java-collections-list-2/pom.xml
index 230787d14d..abddeb9014 100644
--- a/core-java-modules/core-java-collections-list-2/pom.xml
+++ b/core-java-modules/core-java-collections-list-2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-collections-list-2jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -40,4 +40,4 @@
3.11.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-list-3/pom.xml b/core-java-modules/core-java-collections-list-3/pom.xml
index e1cf645c8a..b05fc46928 100644
--- a/core-java-modules/core-java-collections-list-3/pom.xml
+++ b/core-java-modules/core-java-collections-list-3/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-collections-list-3jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -33,7 +33,6 @@
${assertj.version}test
-
net.sf.trove4jtrove4j
@@ -49,7 +48,6 @@
colt${colt.version}
-
org.openjdk.jmhjmh-core
@@ -58,7 +56,7 @@
org.openjdk.jmhjmh-generator-annprocess
- ${jmh-core.version}
+ ${jmh-generator.version}
@@ -70,4 +68,4 @@
1.2.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-list/pom.xml b/core-java-modules/core-java-collections-list/pom.xml
index 76ca66fe70..f1b6bc3965 100644
--- a/core-java-modules/core-java-collections-list/pom.xml
+++ b/core-java-modules/core-java-collections-list/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-collections-listjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -39,4 +39,4 @@
3.11.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/collections/JavaCollectionCleanupUnitTest.java b/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/collections/JavaCollectionCleanupUnitTest.java
index 96813df862..5ef08a9337 100644
--- a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/collections/JavaCollectionCleanupUnitTest.java
+++ b/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/collections/JavaCollectionCleanupUnitTest.java
@@ -1,11 +1,14 @@
package com.baeldung.collections;
+import static org.hamcrest.Matchers.containsInAnyOrder;
+import static org.hamcrest.Matchers.containsInRelativeOrder;
import static org.hamcrest.Matchers.hasSize;
import static org.junit.Assert.assertThat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
+import java.util.LinkedHashSet;
import java.util.List;
import org.apache.commons.collections4.CollectionUtils;
@@ -22,7 +25,7 @@ public class JavaCollectionCleanupUnitTest {
// tests - removing nulls
@Test
- public final void givenListContainsNulls_whenRemovingNullsWithPlainJava_thenCorrect() {
+ public void givenListContainsNulls_whenRemovingNullsWithPlainJava_thenCorrect() {
final List list = Lists.newArrayList(null, 1, null);
while (list.remove(null))
;
@@ -31,7 +34,7 @@ public class JavaCollectionCleanupUnitTest {
}
@Test
- public final void givenListContainsNulls_whenRemovingNullsWithPlainJavaAlternative_thenCorrect() {
+ public void givenListContainsNulls_whenRemovingNullsWithPlainJavaAlternative_thenCorrect() {
final List list = Lists.newArrayList(null, 1, null);
list.removeAll(Collections.singleton(null));
@@ -39,7 +42,7 @@ public class JavaCollectionCleanupUnitTest {
}
@Test
- public final void givenListContainsNulls_whenRemovingNullsWithGuavaV1_thenCorrect() {
+ public void givenListContainsNulls_whenRemovingNullsWithGuavaV1_thenCorrect() {
final List list = Lists.newArrayList(null, 1, null);
Iterables.removeIf(list, Predicates.isNull());
@@ -47,7 +50,7 @@ public class JavaCollectionCleanupUnitTest {
}
@Test
- public final void givenListContainsNulls_whenRemovingNullsWithGuavaV2_thenCorrect() {
+ public void givenListContainsNulls_whenRemovingNullsWithGuavaV2_thenCorrect() {
final List list = Lists.newArrayList(null, 1, null, 2, 3);
final List listWithoutNulls = Lists.newArrayList(Iterables.filter(list, Predicates.notNull()));
@@ -55,7 +58,7 @@ public class JavaCollectionCleanupUnitTest {
}
@Test
- public final void givenListContainsNulls_whenRemovingNullsWithCommonsCollections_thenCorrect() {
+ public void givenListContainsNulls_whenRemovingNullsWithCommonsCollections_thenCorrect() {
final List list = Lists.newArrayList(null, 1, 2, null, 3, null);
CollectionUtils.filter(list, PredicateUtils.notNullPredicate());
@@ -65,19 +68,38 @@ public class JavaCollectionCleanupUnitTest {
// tests - remove duplicates
@Test
- public final void givenListContainsDuplicates_whenRemovingDuplicatesWithPlainJava_thenCorrect() {
- final List listWithDuplicates = Lists.newArrayList(0, 1, 2, 3, 0, 0);
+ public void givenListContainsDuplicates_whenRemovingDuplicatesWithPlainJava_thenCorrect() {
+ final List listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0);
final List listWithoutDuplicates = new ArrayList<>(new HashSet<>(listWithDuplicates));
- assertThat(listWithoutDuplicates, hasSize(4));
+ assertThat(listWithoutDuplicates, hasSize(5));
+ assertThat(listWithoutDuplicates, containsInAnyOrder(5, 0, 3, 1, 2));
}
@Test
- public final void givenListContainsDuplicates_whenRemovingDuplicatesWithGuava_thenCorrect() {
- final List listWithDuplicates = Lists.newArrayList(0, 1, 2, 3, 0, 0);
- final List listWithoutDuplicates = Lists.newArrayList(Sets.newHashSet(listWithDuplicates));
+ public void givenListContainsDuplicates_whenRemovingDuplicatesPreservingOrderWithPlainJava_thenCorrect() {
+ final List listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0);
+ final List listWithoutDuplicates = new ArrayList<>(new LinkedHashSet<>(listWithDuplicates));
- assertThat(listWithoutDuplicates, hasSize(4));
+ assertThat(listWithoutDuplicates, hasSize(5));
+ assertThat(listWithoutDuplicates, containsInRelativeOrder(5, 0, 3, 1, 2));
}
+ @Test
+ public void givenListContainsDuplicates_whenRemovingDuplicatesWithGuava_thenCorrect() {
+ final List listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0);
+ final List listWithoutDuplicates = Lists.newArrayList(Sets.newHashSet(listWithDuplicates));
+
+ assertThat(listWithoutDuplicates, hasSize(5));
+ assertThat(listWithoutDuplicates, containsInAnyOrder(5, 0, 3, 1, 2));
+ }
+
+ @Test
+ public void givenListContainsDuplicates_whenRemovingDuplicatesPreservingOrderWithGuava_thenCorrect() {
+ final List listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0);
+ final List listWithoutDuplicates = Lists.newArrayList(Sets.newLinkedHashSet(listWithDuplicates));
+
+ assertThat(listWithoutDuplicates, hasSize(5));
+ assertThat(listWithoutDuplicates, containsInRelativeOrder(5, 0, 3, 1, 2));
+ }
}
diff --git a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java b/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java
index ef7b642f89..5eb75f5cad 100644
--- a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java
+++ b/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java
@@ -7,6 +7,7 @@ import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
+import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.hasSize;
import static org.junit.Assert.assertThat;
@@ -40,10 +41,11 @@ public class Java8CollectionCleanupUnitTest {
@Test
public void givenListContainsDuplicates_whenRemovingDuplicatesWithJava8_thenCorrect() {
- final List listWithDuplicates = Lists.newArrayList(1, 1, 2, 2, 3, 3);
- final List listWithoutDuplicates = listWithDuplicates.parallelStream().distinct().collect(Collectors.toList());
+ final List listWithDuplicates = Lists.newArrayList(5, 0, 3, 1, 2, 3, 0, 0);
+ final List listWithoutDuplicates = listWithDuplicates.stream().distinct().collect(Collectors.toList());
- assertThat(listWithoutDuplicates, hasSize(3));
+ assertThat(listWithoutDuplicates, hasSize(5));
+ assertThat(listWithoutDuplicates, containsInAnyOrder(5, 0, 3, 1, 2));
}
}
diff --git a/core-java-modules/core-java-collections-maps-2/pom.xml b/core-java-modules/core-java-collections-maps-2/pom.xml
index 7c4ab19945..3ae1437054 100644
--- a/core-java-modules/core-java-collections-maps-2/pom.xml
+++ b/core-java-modules/core-java-collections-maps-2/pom.xml
@@ -1,12 +1,13 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0core-java-collections-maps-20.1.0-SNAPSHOTcore-java-collections-maps-2jar
+
com.baeldung.core-java-modulescore-java-modules
diff --git a/core-java-modules/core-java-collections-maps-3/pom.xml b/core-java-modules/core-java-collections-maps-3/pom.xml
index c9fda26fc3..892d0443c5 100644
--- a/core-java-modules/core-java-collections-maps-3/pom.xml
+++ b/core-java-modules/core-java-collections-maps-3/pom.xml
@@ -1,12 +1,13 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0core-java-collections-maps-30.1.0-SNAPSHOTcore-java-collections-maps-3jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -27,8 +28,4 @@
-
-
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-maps/pom.xml b/core-java-modules/core-java-collections-maps/pom.xml
index 742e264504..68e5c736cd 100644
--- a/core-java-modules/core-java-collections-maps/pom.xml
+++ b/core-java-modules/core-java-collections-maps/pom.xml
@@ -1,11 +1,13 @@
-
+4.0.0core-java-collections-maps0.1.0-SNAPSHOTcore-java-collections-mapsjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -31,4 +33,5 @@
4.13.6.1
+
diff --git a/core-java-modules/core-java-collections-set/pom.xml b/core-java-modules/core-java-collections-set/pom.xml
index 7c55f2ff2a..b8940f4a68 100644
--- a/core-java-modules/core-java-collections-set/pom.xml
+++ b/core-java-modules/core-java-collections-set/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-collections-setjar
+
com.baeldung.core-java-modulescore-java-modules
diff --git a/core-java-modules/core-java-collections/pom.xml b/core-java-modules/core-java-collections/pom.xml
index e1219c4713..81bcdc74aa 100644
--- a/core-java-modules/core-java-collections/pom.xml
+++ b/core-java-modules/core-java-collections/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-collectionsjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -25,18 +25,17 @@
org.openjdk.jmhjmh-core
- ${openjdk.jmh.version}
+ ${jmh-core.version}org.openjdk.jmhjmh-generator-annprocess
- ${openjdk.jmh.version}
+ ${jmh-generator.version}
- 1.193.11.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-concurrency-2/pom.xml b/core-java-modules/core-java-concurrency-2/pom.xml
index 253537bc2b..3a29101d0f 100644
--- a/core-java-modules/core-java-concurrency-2/pom.xml
+++ b/core-java-modules/core-java-concurrency-2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,14 +7,15 @@
0.1.0-SNAPSHOTcore-java-concurrency-2jar
+
com.baeldung.core-java-modulescore-java-modules0.0.1-SNAPSHOT../
-
-
+
+ junitjunit
@@ -55,8 +55,7 @@
true
-
-
+ org.apache.maven.pluginsmaven-compiler-plugin
@@ -67,7 +66,6 @@
${java.version}
-
org.apache.maven.pluginsmaven-shade-plugin
@@ -97,7 +95,7 @@
-
+
4.130.2
@@ -106,4 +104,4 @@
0.5
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-concurrency-advanced-2/pom.xml b/core-java-modules/core-java-concurrency-advanced-2/pom.xml
index 2f374bffac..0571598684 100644
--- a/core-java-modules/core-java-concurrency-advanced-2/pom.xml
+++ b/core-java-modules/core-java-concurrency-advanced-2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-concurrency-advanced-2jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -29,7 +29,7 @@
org.openjdk.jmhjmh-generator-annprocess
- ${jmh-generator-annprocess.version}
+ ${jmh-generator.version}
@@ -51,9 +51,7 @@
- 1.19
- 1.193.6.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-concurrency-advanced-3/pom.xml b/core-java-modules/core-java-concurrency-advanced-3/pom.xml
index 32267fb800..7a85672779 100644
--- a/core-java-modules/core-java-concurrency-advanced-3/pom.xml
+++ b/core-java-modules/core-java-concurrency-advanced-3/pom.xml
@@ -1,14 +1,13 @@
-
-
4.0.0core-java-concurrency-advanced-30.1.0-SNAPSHOTcore-java-concurrency-advanced-3jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -23,32 +22,27 @@
${assertj.version}test
-
com.jcabijcabi-aspects${jcabi-aspects.version}
-
org.aspectjaspectjrt${aspectjrt.version}runtime
-
com.google.guavaguava${guava.version}
-
org.cactooscactoos${cactoos.version}
-
com.ea.asyncea-async
@@ -114,4 +108,4 @@
1.9.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-concurrency-advanced-4/pom.xml b/core-java-modules/core-java-concurrency-advanced-4/pom.xml
index eb9ed3adc1..7f4a573664 100644
--- a/core-java-modules/core-java-concurrency-advanced-4/pom.xml
+++ b/core-java-modules/core-java-concurrency-advanced-4/pom.xml
@@ -1,14 +1,13 @@
-
-
4.0.0core-java-concurrency-advanced-40.1.0-SNAPSHOTcore-java-concurrency-advanced-4jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -44,4 +43,4 @@
1.8
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-concurrency-advanced/pom.xml b/core-java-modules/core-java-concurrency-advanced/pom.xml
index 67db486121..7dae0b17aa 100644
--- a/core-java-modules/core-java-concurrency-advanced/pom.xml
+++ b/core-java-modules/core-java-concurrency-advanced/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-concurrency-advancedjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -71,4 +71,4 @@
1.7.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-concurrency-basic-2/README.md b/core-java-modules/core-java-concurrency-basic-2/README.md
index bf973f7036..c4a6105c56 100644
--- a/core-java-modules/core-java-concurrency-basic-2/README.md
+++ b/core-java-modules/core-java-concurrency-basic-2/README.md
@@ -12,4 +12,5 @@ This module contains articles about basic Java concurrency
- [Guide to AtomicMarkableReference](https://www.baeldung.com/java-atomicmarkablereference)
- [Why are Local Variables Thread-Safe in Java](https://www.baeldung.com/java-local-variables-thread-safe)
- [How to Stop Execution After a Certain Time in Java](https://www.baeldung.com/java-stop-execution-after-certain-time)
+- [How to Handle InterruptedException in Java](https://www.baeldung.com/java-interrupted-exception)
- [[<-- Prev]](/core-java-modules/core-java-concurrency-basic)
diff --git a/core-java-modules/core-java-concurrency-basic-2/pom.xml b/core-java-modules/core-java-concurrency-basic-2/pom.xml
index adc4fd33e3..38c9c26c80 100644
--- a/core-java-modules/core-java-concurrency-basic-2/pom.xml
+++ b/core-java-modules/core-java-concurrency-basic-2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-concurrency-basic-2jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -25,4 +25,4 @@
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/interrupt/CustomInterruptedException.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/interrupt/CustomInterruptedException.java
new file mode 100644
index 0000000000..a4189df31d
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/interrupt/CustomInterruptedException.java
@@ -0,0 +1,10 @@
+package com.baeldung.concurrent.interrupt;
+
+public class CustomInterruptedException extends Exception {
+
+ private static final long serialVersionUID = 1L;
+
+ CustomInterruptedException(String message) {
+ super(message);
+ }
+}
diff --git a/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/interrupt/InterruptExample.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/interrupt/InterruptExample.java
new file mode 100644
index 0000000000..7d81769854
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/interrupt/InterruptExample.java
@@ -0,0 +1,47 @@
+package com.baeldung.concurrent.interrupt;
+
+public class InterruptExample extends Thread {
+
+ public static void propagateException() throws InterruptedException {
+ Thread.sleep(1000);
+ Thread.currentThread().interrupt();
+ if (Thread.interrupted()) {
+ throw new InterruptedException();
+ }
+ }
+
+ public static Boolean restoreTheState() {
+ InterruptExample thread1 = new InterruptExample();
+ thread1.start();
+ thread1.interrupt();
+ return thread1.isInterrupted();
+ }
+
+ public void run() {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ public static void throwCustomException() throws Exception {
+
+ Thread.sleep(1000);
+ Thread.currentThread().interrupt();
+ if (Thread.interrupted()) {
+ throw new CustomInterruptedException("This thread was interrupted");
+ }
+ }
+
+ public static Boolean handleWithCustomException() throws CustomInterruptedException{
+ try {
+ Thread.sleep(1000);
+ Thread.currentThread().interrupt();
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new CustomInterruptedException("This thread was interrupted...");
+ }
+ return Thread.currentThread().isInterrupted();
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/interrupt/InterruptExampleUnitTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/interrupt/InterruptExampleUnitTest.java
new file mode 100644
index 0000000000..1ea3f9aa9b
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/interrupt/InterruptExampleUnitTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.concurrent.interrupt;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import org.junit.jupiter.api.Test;
+
+public class InterruptExampleUnitTest {
+
+ @Test
+ public void whenPropagateException_thenThrowsInterruptedException() {
+ assertThrows(InterruptedException.class, () -> InterruptExample.propagateException());
+ }
+
+ @Test
+ public void whenRestoreTheState_thenReturnsTrue() {
+ assertTrue(InterruptExample.restoreTheState());
+ }
+
+ @Test
+ public void whenThrowCustomException_thenContainsExpectedMessage() {
+ Exception exception = assertThrows(CustomInterruptedException.class, () -> InterruptExample.throwCustomException());
+ String expectedMessage = "This thread was interrupted";
+ String actualMessage = exception.getMessage();
+
+ assertTrue(actualMessage.contains(expectedMessage));
+ }
+
+ @Test
+ public void whenHandleWithCustomException_thenReturnsTrue() throws CustomInterruptedException{
+ assertTrue(InterruptExample.handleWithCustomException());
+ }
+}
diff --git a/core-java-modules/core-java-concurrency-basic/pom.xml b/core-java-modules/core-java-concurrency-basic/pom.xml
index 29d393805b..3f69d1a73b 100644
--- a/core-java-modules/core-java-concurrency-basic/pom.xml
+++ b/core-java-modules/core-java-concurrency-basic/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-concurrency-basicjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -51,4 +51,4 @@
1.7.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-concurrency-collections-2/pom.xml b/core-java-modules/core-java-concurrency-collections-2/pom.xml
index f9ee41f6d5..020586e892 100644
--- a/core-java-modules/core-java-concurrency-collections-2/pom.xml
+++ b/core-java-modules/core-java-concurrency-collections-2/pom.xml
@@ -1,5 +1,4 @@
-4.0.0
@@ -7,6 +6,7 @@
0.1.0-SNAPSHOTcore-java-concurrency-collections-2jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -23,14 +23,14 @@
org.openjdk.jmhjmh-core
- ${jmh.version}
+ ${jmh-core.version}org.openjdk.jmhjmh-generator-annprocess
- ${jmh.version}
+ ${jmh-generator.version}
-
+ org.assertjassertj-core${assertj.version}
@@ -39,9 +39,8 @@
- 1.2128.2-jre
-
+
3.6.1
diff --git a/core-java-modules/core-java-concurrency-collections/pom.xml b/core-java-modules/core-java-concurrency-collections/pom.xml
index 31f5a0fca8..8a7fc58bfd 100644
--- a/core-java-modules/core-java-concurrency-collections/pom.xml
+++ b/core-java-modules/core-java-concurrency-collections/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-concurrency-collectionsjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -39,4 +39,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-console/pom.xml b/core-java-modules/core-java-console/pom.xml
index 1d58d8c253..6f9288f1a5 100644
--- a/core-java-modules/core-java-console/pom.xml
+++ b/core-java-modules/core-java-console/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-consolejar
+
com.baeldung.core-java-modulescore-java-modules
@@ -23,7 +23,6 @@
true
-
org.apache.maven.plugins
@@ -41,11 +40,9 @@
-
org.codehaus.mojoexec-maven-plugin
- ${exec-maven-plugin.version}javacom.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
@@ -58,7 +55,6 @@
-
org.apache.maven.pluginsmaven-javadoc-plugin
@@ -105,7 +101,6 @@
org.codehaus.mojoexec-maven-plugin
- ${exec-maven-plugin.version}run-benchmarks
@@ -134,9 +129,8 @@
3.0.0-M1
- 1.6.01.81.8
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-date-operations-1/pom.xml b/core-java-modules/core-java-date-operations-1/pom.xml
index e12e4aa4ee..ded6f062cf 100644
--- a/core-java-modules/core-java-date-operations-1/pom.xml
+++ b/core-java-modules/core-java-date-operations-1/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
${project.parent.version}core-java-date-operations-1jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -71,4 +71,4 @@
1.9
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-date-operations-2/pom.xml b/core-java-modules/core-java-date-operations-2/pom.xml
index 5861a9ab98..5766f39739 100644
--- a/core-java-modules/core-java-date-operations-2/pom.xml
+++ b/core-java-modules/core-java-date-operations-2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
${project.parent.version}core-java-date-operations-2jar
+
com.baeldung.core-java-modulescore-java-modules
diff --git a/core-java-modules/core-java-datetime-conversion/pom.xml b/core-java-modules/core-java-datetime-conversion/pom.xml
index 79d1394576..b494b307d0 100644
--- a/core-java-modules/core-java-datetime-conversion/pom.xml
+++ b/core-java-modules/core-java-datetime-conversion/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
${project.parent.version}core-java-datetime-conversionjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -70,4 +70,4 @@
1.9
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-datetime-string/pom.xml b/core-java-modules/core-java-datetime-string/pom.xml
index c1181f670a..dc0c5fd8b1 100644
--- a/core-java-modules/core-java-datetime-string/pom.xml
+++ b/core-java-modules/core-java-datetime-string/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
${project.parent.version}core-java-datetime-stringjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -60,7 +60,6 @@
true
-
org.apache.maven.plugins
@@ -83,4 +82,4 @@
1.9
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-exceptions-2/pom.xml b/core-java-modules/core-java-exceptions-2/pom.xml
index 4497874640..ce95553021 100644
--- a/core-java-modules/core-java-exceptions-2/pom.xml
+++ b/core-java-modules/core-java-exceptions-2/pom.xml
@@ -1,12 +1,13 @@
-4.0.0
-
core-java-exceptions-2core-java-exceptions-2jar
+
+ http://maven.apache.org
+
com.baeldung.core-java-modulescore-java-modules
@@ -29,13 +30,10 @@
-
- http://maven.apache.org
-
3.103.10.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-exceptions-3/README.md b/core-java-modules/core-java-exceptions-3/README.md
index e1372381a8..f79eb41a8b 100644
--- a/core-java-modules/core-java-exceptions-3/README.md
+++ b/core-java-modules/core-java-exceptions-3/README.md
@@ -8,3 +8,4 @@
- [Localizing Exception Messages in Java](https://www.baeldung.com/java-localize-exception-messages)
- [Explanation of ClassCastException in Java](https://www.baeldung.com/java-classcastexception)
- [NoSuchFieldError in Java](https://www.baeldung.com/java-nosuchfielderror)
+- [IllegalAccessError in Java](https://www.baeldung.com/java-illegalaccesserror)
diff --git a/core-java-modules/core-java-exceptions-3/pom.xml b/core-java-modules/core-java-exceptions-3/pom.xml
index 8c36fd0af1..6e35845c6a 100644
--- a/core-java-modules/core-java-exceptions-3/pom.xml
+++ b/core-java-modules/core-java-exceptions-3/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -9,6 +8,7 @@
0.1.0-SNAPSHOTcore-java-exceptions-3jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -17,14 +17,12 @@
-
com.h2databaseh21.4.191test
-
org.assertj
@@ -38,4 +36,4 @@
3.10.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/Class1.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/Class1.java
new file mode 100644
index 0000000000..d50d2bc5f5
--- /dev/null
+++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/Class1.java
@@ -0,0 +1,8 @@
+package com.baeldung.exceptions.illegalaccesserror;
+
+public class Class1 {
+
+ public void bar() {
+ System.out.println("SUCCESS");
+ }
+}
diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/Class2.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/Class2.java
new file mode 100644
index 0000000000..766ceccb6b
--- /dev/null
+++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/Class2.java
@@ -0,0 +1,10 @@
+package com.baeldung.exceptions.illegalaccesserror;
+
+public class Class2 {
+
+ public void foo() {
+ Class1 c1 = new Class1();
+ c1.bar();
+ }
+}
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorExample.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorExample.java
new file mode 100644
index 0000000000..2cc1abbb1d
--- /dev/null
+++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorExample.java
@@ -0,0 +1,20 @@
+package com.baeldung.exceptions.illegalaccesserror;
+
+public class IllegalAccessErrorExample {
+
+ interface Baeldung {
+ public default void foobar() {
+ System.out.println("This is a default method.");
+ }
+ }
+
+ class Super {
+ private void foobar() {
+ System.out.println("SuperClass method foobar");
+ }
+ }
+
+ class MySubClass extends Super implements Baeldung {
+
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorSolved.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorSolved.java
new file mode 100644
index 0000000000..8f6a4c14a4
--- /dev/null
+++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorSolved.java
@@ -0,0 +1,20 @@
+package com.baeldung.exceptions.illegalaccesserror;
+
+public class IllegalAccessErrorSolved {
+
+ interface BaeldungSolved {
+ public default void foobar() {
+ System.out.println("This is a default method.");
+ }
+ }
+
+ class SuperSolved {
+ public void foobar() {
+ System.out.println("SuperClass method foobar");
+ }
+ }
+
+ class MySubClassSolved extends SuperSolved implements BaeldungSolved {
+
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorExampleUnitTest.java b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorExampleUnitTest.java
new file mode 100644
index 0000000000..201e782229
--- /dev/null
+++ b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorExampleUnitTest.java
@@ -0,0 +1,21 @@
+package com.baeldung.exceptions.illegalaccesserror;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class IllegalAccessErrorExampleUnitTest {
+
+ @Test()
+ public void givenInterfaceDefaultMethOverriddenPrivateAccess_whenInvoked_thenIllegalAccessError() {
+ Assertions.assertThrows(IllegalAccessError.class, () -> {
+ new IllegalAccessErrorExample().new MySubClass().foobar();
+ });
+ }
+
+ @Test()
+ public void givenClass1Class2_whenSameClassDefintion_thenNoIllegalAccessError() {
+ Assertions.assertDoesNotThrow(() -> {
+ new Class2().foo();
+ });
+ }
+}
diff --git a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorSolvedUnitTest.java b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorSolvedUnitTest.java
new file mode 100644
index 0000000000..ad150334d4
--- /dev/null
+++ b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalaccesserror/IllegalAccessErrorSolvedUnitTest.java
@@ -0,0 +1,14 @@
+package com.baeldung.exceptions.illegalaccesserror;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class IllegalAccessErrorSolvedUnitTest {
+
+ @Test()
+ public void givenInterfaceDefaultMethOverriddenNonPrivateAccess_whenInvoked_thenNoIllegalAccessError() {
+ Assertions.assertDoesNotThrow(() -> {
+ new IllegalAccessErrorSolved().new MySubClassSolved().foobar();
+ });
+ }
+}
diff --git a/core-java-modules/core-java-exceptions/pom.xml b/core-java-modules/core-java-exceptions/pom.xml
index b708aff6b9..f2c6d001be 100644
--- a/core-java-modules/core-java-exceptions/pom.xml
+++ b/core-java-modules/core-java-exceptions/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -9,6 +8,7 @@
0.1.0-SNAPSHOTcore-java-exceptionsjar
+
com.baeldung.core-java-modulescore-java-modules
diff --git a/core-java-modules/core-java-function/pom.xml b/core-java-modules/core-java-function/pom.xml
index 0eb34bed7b..5db73d8796 100644
--- a/core-java-modules/core-java-function/pom.xml
+++ b/core-java-modules/core-java-function/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-functionjar
+
com.baeldung.core-java-modulescore-java-modules
diff --git a/core-java-modules/core-java-functional/pom.xml b/core-java-modules/core-java-functional/pom.xml
index f00600c794..87a08e1e3f 100644
--- a/core-java-modules/core-java-functional/pom.xml
+++ b/core-java-modules/core-java-functional/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-functionaljar
+
com.baeldung.core-java-modulescore-java-modules
diff --git a/core-java-modules/core-java-io-2/pom.xml b/core-java-modules/core-java-io-2/pom.xml
index c0aae2b1ce..a4168a8f1f 100644
--- a/core-java-modules/core-java-io-2/pom.xml
+++ b/core-java-modules/core-java-io-2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-io-2jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -53,7 +53,6 @@
${wiremock.version}test
-
diff --git a/core-java-modules/core-java-io-3/pom.xml b/core-java-modules/core-java-io-3/pom.xml
index cc4dca5fa5..f1b6412249 100644
--- a/core-java-modules/core-java-io-3/pom.xml
+++ b/core-java-modules/core-java-io-3/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-io-3jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -46,12 +46,8 @@
${assertj.version}test
-
-
-
-
3.6.1
diff --git a/core-java-modules/core-java-io-4/pom.xml b/core-java-modules/core-java-io-4/pom.xml
index ee31b35ba9..8327764c9f 100644
--- a/core-java-modules/core-java-io-4/pom.xml
+++ b/core-java-modules/core-java-io-4/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-io-4jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -42,9 +42,6 @@
-
-
-
3.6.1
diff --git a/core-java-modules/core-java-io-4/src/main/java/com/baeldung/deserialization/vulnerabilities/BadThing.java b/core-java-modules/core-java-io-4/src/main/java/com/baeldung/deserialization/vulnerabilities/BadThing.java
new file mode 100644
index 0000000000..ce13a9c372
--- /dev/null
+++ b/core-java-modules/core-java-io-4/src/main/java/com/baeldung/deserialization/vulnerabilities/BadThing.java
@@ -0,0 +1,28 @@
+package com.baeldung.deserialization.vulnerabilities;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.lang.reflect.Method;
+
+public class BadThing implements Serializable {
+ private static final long serialVersionUID = 0L;
+
+ Object looselyDefinedThing;
+ String methodName;
+
+ private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
+ ois.defaultReadObject();
+ try {
+ Method method = looselyDefinedThing.getClass().getMethod(methodName);
+ method.invoke(looselyDefinedThing);
+ } catch (Exception e) {
+ // handle error...
+ }
+ }
+
+ private void writeObject(ObjectOutputStream oos) throws IOException {
+ oos.defaultWriteObject();
+ }
+}
diff --git a/core-java-modules/core-java-io-4/src/main/java/com/baeldung/deserialization/vulnerabilities/MyCustomAttackObject.java b/core-java-modules/core-java-io-4/src/main/java/com/baeldung/deserialization/vulnerabilities/MyCustomAttackObject.java
new file mode 100644
index 0000000000..9b4e2d4b76
--- /dev/null
+++ b/core-java-modules/core-java-io-4/src/main/java/com/baeldung/deserialization/vulnerabilities/MyCustomAttackObject.java
@@ -0,0 +1,14 @@
+package com.baeldung.deserialization.vulnerabilities;
+
+import java.io.IOException;
+import java.io.Serializable;
+
+public class MyCustomAttackObject implements Serializable {
+ public static void methodThatTriggersAttack() {
+ try {
+ Runtime.getRuntime().exec("echo \"Oh, no! I've been hacked\"");
+ } catch (IOException e) {
+ // handle error...
+ }
+ }
+}
diff --git a/core-java-modules/core-java-io-4/src/test/java/com/baeldung/deserialization/vulnerabilities/BadThingUnitTest.java b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/deserialization/vulnerabilities/BadThingUnitTest.java
new file mode 100644
index 0000000000..ea2180d178
--- /dev/null
+++ b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/deserialization/vulnerabilities/BadThingUnitTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.deserialization.vulnerabilities;
+
+import org.junit.Test;
+import org.junit.jupiter.api.DisplayName;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+public class BadThingUnitTest {
+
+ @Test
+ @DisplayName("When a BadThing object is deserialized, then code execution in MyCustomAttackObject is run.")
+ public void givenABadThingObject_whenItsDeserialized_thenExecutionIsRun() throws Exception {
+ BadThing bt = new BadThing();
+
+ bt.looselyDefinedThing = new MyCustomAttackObject();
+ bt.methodName = "methodThatTriggersAttack";
+
+ byte[] serializedObject = serialize(bt);
+
+ try (InputStream bis = new ByteArrayInputStream(serializedObject);
+ ObjectInputStream ois = new ObjectInputStream(bis)) {
+
+ ois.readObject(); // malicious code is run
+ }
+ }
+
+ private static byte[] serialize(Object object) throws Exception {
+ try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(bos)) {
+
+ oos.writeObject(object);
+ oos.flush();
+ return bos.toByteArray();
+ }
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-apis/pom.xml b/core-java-modules/core-java-io-apis/pom.xml
index 9350e4b527..0984296ea1 100644
--- a/core-java-modules/core-java-io-apis/pom.xml
+++ b/core-java-modules/core-java-io-apis/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-io-apisjar
+
com.baeldung.core-java-modulescore-java-modules
diff --git a/core-java-modules/core-java-io-conversions-2/pom.xml b/core-java-modules/core-java-io-conversions-2/pom.xml
index b8b5074c7c..e594666b55 100644
--- a/core-java-modules/core-java-io-conversions-2/pom.xml
+++ b/core-java-modules/core-java-io-conversions-2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-io-conversions-2jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -35,7 +35,7 @@
- core-java-io-conversions
+ core-java-io-conversions-2src/main/resources
diff --git a/core-java-modules/core-java-io-conversions/pom.xml b/core-java-modules/core-java-io-conversions/pom.xml
index 0012b02d7e..14320f46b9 100644
--- a/core-java-modules/core-java-io-conversions/pom.xml
+++ b/core-java-modules/core-java-io-conversions/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
diff --git a/core-java-modules/core-java-io/pom.xml b/core-java-modules/core-java-io/pom.xml
index 0968536e65..67495f84f9 100644
--- a/core-java-modules/core-java-io/pom.xml
+++ b/core-java-modules/core-java-io/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-iojar
+
com.baeldung.core-java-modulescore-java-modules
@@ -60,7 +60,6 @@
org.codehaus.mojoexec-maven-plugin
- ${exec-maven-plugin.version}javacom.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
@@ -82,7 +81,6 @@
${maven.compiler.target}
-
org.apache.maven.plugins
@@ -99,7 +97,6 @@
-
integration
@@ -108,7 +105,6 @@
org.codehaus.mojoexec-maven-plugin
-
run-benchmarks
diff --git a/core-java-modules/core-java-jar/pom.xml b/core-java-modules/core-java-jar/pom.xml
index 6e9d713d7c..4e4a7ee465 100644
--- a/core-java-modules/core-java-jar/pom.xml
+++ b/core-java-modules/core-java-jar/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -72,7 +71,6 @@
true
-
org.apache.maven.plugins
@@ -90,7 +88,6 @@
-
org.apache.maven.pluginsmaven-jar-plugin
@@ -105,7 +102,6 @@
-
org.apache.maven.pluginsmaven-assembly-plugin
@@ -129,7 +125,6 @@
-
org.apache.maven.pluginsmaven-shade-plugin
@@ -142,7 +137,8 @@
true
-
+ com.baeldung.executable.ExecutableMavenJar
@@ -150,7 +146,6 @@
-
com.joliraonejar-maven-plugin
@@ -168,7 +163,6 @@
-
org.springframework.bootspring-boot-maven-plugin
@@ -185,11 +179,9 @@
-
org.codehaus.mojoexec-maven-plugin
- ${exec-maven-plugin.version}javacom.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
@@ -202,7 +194,6 @@
-
org.apache.maven.pluginsmaven-javadoc-plugin
@@ -249,7 +240,6 @@
org.codehaus.mojoexec-maven-plugin
- ${exec-maven-plugin.version}run-benchmarks
@@ -274,7 +264,6 @@
-
buildAgentLoader
@@ -385,21 +374,17 @@
0.41.8.7
-
3.10.0
-
1.1
-
3.0.0-M13.0.21.4.43.1.12.0.3.RELEASE
- 1.6.01.81.8
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-jndi/pom.xml b/core-java-modules/core-java-jndi/pom.xml
index 030a5f5d50..dae0e9bb35 100644
--- a/core-java-modules/core-java-jndi/pom.xml
+++ b/core-java-modules/core-java-jndi/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -82,4 +81,4 @@
1.8
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule/pom.xml b/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/pom.xml
similarity index 75%
rename from core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule/pom.xml
rename to core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/pom.xml
index fb6d2b1065..f82e72b85d 100644
--- a/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule/pom.xml
+++ b/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/pom.xml
@@ -1,17 +1,16 @@
-4.0.0
- consumermodule
+ consumermodule11.0jarcom.baeldung.decoupling-pattern1decoupling-pattern1
- 1.0
+ 1.0-SNAPSHOT
@@ -27,6 +26,10 @@
org.apache.maven.pluginsmaven-compiler-plugin
+
+ ${source.version}
+ ${target.version}
+
@@ -35,4 +38,4 @@
1.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule/src/main/java/com/baeldung/consumermodule/Application.java b/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/src/main/java/com/baeldung/consumermodule/Application.java
similarity index 100%
rename from core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule/src/main/java/com/baeldung/consumermodule/Application.java
rename to core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/src/main/java/com/baeldung/consumermodule/Application.java
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule/src/main/java/module-info.java b/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/src/main/java/module-info.java
similarity index 100%
rename from core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule/src/main/java/module-info.java
rename to core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule1/src/main/java/module-info.java
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/pom.xml b/core-java-modules/core-java-jpms/decoupling-pattern1/pom.xml
index fd59c151e6..2121b46b82 100644
--- a/core-java-modules/core-java-jpms/decoupling-pattern1/pom.xml
+++ b/core-java-modules/core-java-jpms/decoupling-pattern1/pom.xml
@@ -1,17 +1,22 @@
-4.0.0com.baeldung.decoupling-pattern1decoupling-pattern1
- 1.0
+ 1.0-SNAPSHOTpom
+
+ com.baeldung.core-java-modules
+ core-java-jpms
+ 0.0.1-SNAPSHOT
+
+
- servicemodule
- consumermodule
+ servicemodule1
+ consumermodule1
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/pom.xml b/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/pom.xml
similarity index 71%
rename from core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/pom.xml
rename to core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/pom.xml
index 4c811ea866..fc4b5854f9 100644
--- a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/pom.xml
+++ b/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/pom.xml
@@ -1,17 +1,17 @@
-4.0.0com.baeldung.servicemoduleservicemodule1
+ 1.0jarcom.baeldung.decoupling-pattern1decoupling-pattern1
- 1.0
+ 1.0-SNAPSHOT
@@ -19,6 +19,10 @@
org.apache.maven.pluginsmaven-compiler-plugin
+
+ ${source.version}
+ ${target.version}
+
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/external/TextService.java b/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextService.java
similarity index 100%
rename from core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/external/TextService.java
rename to core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextService.java
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/external/TextServiceFactory.java b/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextServiceFactory.java
similarity index 100%
rename from core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/external/TextServiceFactory.java
rename to core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/external/TextServiceFactory.java
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/internal/LowercaseTextService.java b/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/LowercaseTextService.java
similarity index 100%
rename from core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/internal/LowercaseTextService.java
rename to core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/LowercaseTextService.java
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/internal/UppercaseTextService.java b/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/UppercaseTextService.java
similarity index 100%
rename from core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/internal/UppercaseTextService.java
rename to core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/com/baeldung/servicemodule/internal/UppercaseTextService.java
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/module-info.java b/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/module-info.java
similarity index 100%
rename from core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/module-info.java
rename to core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule1/src/main/java/module-info.java
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule/pom.xml b/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/pom.xml
similarity index 80%
rename from core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule/pom.xml
rename to core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/pom.xml
index 816f5cf9e8..774319a067 100644
--- a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule/pom.xml
+++ b/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/pom.xml
@@ -1,11 +1,10 @@
-4.0.0com.baeldung.consumermodule
- consumermodule
+ consumermodule21.0
@@ -32,6 +31,11 @@
org.apache.maven.pluginsmaven-compiler-plugin
+ ${compiler.plugin.version}
+
+ ${source.version}
+ ${target.version}
+
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule/src/main/java/com/baeldung/consumermodule/Application.java b/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/src/main/java/com/baeldung/consumermodule/Application.java
similarity index 100%
rename from core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule/src/main/java/com/baeldung/consumermodule/Application.java
rename to core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/src/main/java/com/baeldung/consumermodule/Application.java
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule/src/main/java/module-info.java b/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/src/main/java/module-info.java
similarity index 100%
rename from core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule/src/main/java/module-info.java
rename to core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule2/src/main/java/module-info.java
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/pom.xml b/core-java-modules/core-java-jpms/decoupling-pattern2/pom.xml
index 17bca54edb..5b2e4cfc82 100644
--- a/core-java-modules/core-java-jpms/decoupling-pattern2/pom.xml
+++ b/core-java-modules/core-java-jpms/decoupling-pattern2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -9,10 +8,16 @@
1.0-SNAPSHOTpom
+
+ com.baeldung.core-java-modules
+ core-java-jpms
+ 0.0.1-SNAPSHOT
+
+
- servicemodule
+ servicemodule2providermodule
- consumermodule
+ consumermodule2
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/providermodule/pom.xml b/core-java-modules/core-java-jpms/decoupling-pattern2/providermodule/pom.xml
index 1e29df7053..ddb8aeccd1 100644
--- a/core-java-modules/core-java-jpms/decoupling-pattern2/providermodule/pom.xml
+++ b/core-java-modules/core-java-jpms/decoupling-pattern2/providermodule/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -27,6 +26,11 @@
org.apache.maven.pluginsmaven-compiler-plugin
+ ${compiler.plugin.version}
+
+ ${source.version}
+ ${target.version}
+
@@ -35,5 +39,4 @@
1.0
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule/pom.xml b/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/pom.xml
similarity index 73%
rename from core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule/pom.xml
rename to core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/pom.xml
index 9a687c9ae7..06ef900092 100644
--- a/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule/pom.xml
+++ b/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -19,6 +18,11 @@
org.apache.maven.pluginsmaven-compiler-plugin
+ ${compiler.plugin.version}
+
+ ${source.version}
+ ${target.version}
+
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule/src/main/java/com/baeldung/servicemodule/TextService.java b/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/src/main/java/com/baeldung/servicemodule/TextService.java
similarity index 100%
rename from core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule/src/main/java/com/baeldung/servicemodule/TextService.java
rename to core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/src/main/java/com/baeldung/servicemodule/TextService.java
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule/src/main/java/module-info.java b/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/src/main/java/module-info.java
similarity index 100%
rename from core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule/src/main/java/module-info.java
rename to core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule2/src/main/java/module-info.java
diff --git a/core-java-modules/core-java-jpms/pom.xml b/core-java-modules/core-java-jpms/pom.xml
index 5809c0f579..65f5afad47 100644
--- a/core-java-modules/core-java-jpms/pom.xml
+++ b/core-java-modules/core-java-jpms/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -20,4 +19,26 @@
decoupling-pattern2
-
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${compiler.plugin.version}
+
+ ${source.version}
+ ${target.version}
+
+
+
+
+
+
+
+ 3.8.0
+ 11
+ 11
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-jvm-2/pom.xml b/core-java-modules/core-java-jvm-2/pom.xml
index 71dca18094..f1d0a292c6 100644
--- a/core-java-modules/core-java-jvm-2/pom.xml
+++ b/core-java-modules/core-java-jvm-2/pom.xml
@@ -40,4 +40,4 @@
0.10
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-jvm/pom.xml b/core-java-modules/core-java-jvm/pom.xml
index 17ff2f658f..58934065a3 100644
--- a/core-java-modules/core-java-jvm/pom.xml
+++ b/core-java-modules/core-java-jvm/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -83,4 +82,4 @@
6.5.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lambdas/pom.xml b/core-java-modules/core-java-lambdas/pom.xml
index 318b04fcf5..87b315490a 100644
--- a/core-java-modules/core-java-lambdas/pom.xml
+++ b/core-java-modules/core-java-lambdas/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-lambdasjar
+
com.baeldung.core-java-modulescore-java-modules
diff --git a/core-java-modules/core-java-lang-2/pom.xml b/core-java-modules/core-java-lang-2/pom.xml
index d395e8efb1..d32f382506 100644
--- a/core-java-modules/core-java-lang-2/pom.xml
+++ b/core-java-modules/core-java-lang-2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-lang-2jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -65,11 +65,9 @@
- 1.19
- 1.193.12.21.9.429.0-jre
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-3/pom.xml b/core-java-modules/core-java-lang-3/pom.xml
index f98074ad1b..c9005e51ae 100644
--- a/core-java-modules/core-java-lang-3/pom.xml
+++ b/core-java-modules/core-java-lang-3/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -50,5 +49,5 @@
3.12.2
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-4/README.md b/core-java-modules/core-java-lang-4/README.md
index 77d14f0fc8..18bbf43647 100644
--- a/core-java-modules/core-java-lang-4/README.md
+++ b/core-java-modules/core-java-lang-4/README.md
@@ -3,3 +3,7 @@
This module contains articles about core features in the Java language
- [The Java final Keyword – Impact on Performance](https://www.baeldung.com/java-final-performance)
+- [The package-info.java File](https://www.baeldung.com/java-package-info)
+- [What are Compile-time Constants in Java?](https://www.baeldung.com/java-compile-time-constants)
+- [Java Objects.hash() vs Objects.hashCode()](https://www.baeldung.com/java-objects-hash-vs-objects-hashcode)
+- [Referencing a Method in Javadoc Comments](https://www.baeldung.com/java-method-in-javadoc)
diff --git a/core-java-modules/core-java-lang-4/pom.xml b/core-java-modules/core-java-lang-4/pom.xml
index 3e92e9f9c7..4e692ffa55 100644
--- a/core-java-modules/core-java-lang-4/pom.xml
+++ b/core-java-modules/core-java-lang-4/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -20,12 +19,12 @@
org.openjdk.jmhjmh-core
- ${jmh.version}
+ ${jmh-core.version}org.openjdk.jmhjmh-generator-annprocess
- ${jmh.version}
+ ${jmh-generator.version}test
@@ -39,9 +38,4 @@
-
-
- 1.28
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/Annotations.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/Annotations.java
new file mode 100644
index 0000000000..c46c511ea8
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/Annotations.java
@@ -0,0 +1,11 @@
+package com.baeldung.compiletimeconstants;
+
+public class Annotations {
+
+ private final String deprecatedDate = "20-02-14";
+ private final String deprecatedTime = "22:00";
+
+ //@Deprecated(since = deprecatedDate + " " + deprecatedTime) //TODO: Required JDK 9+
+ public void deprecatedMethod() {}
+
+}
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/ClassConstants.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/ClassConstants.java
new file mode 100644
index 0000000000..6c5995a4ea
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/ClassConstants.java
@@ -0,0 +1,19 @@
+package com.baeldung.compiletimeconstants;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class ClassConstants {
+
+ public static final int MAXIMUM_NUMBER_OF_USERS = 10;
+ public static final String DEFAULT_USERNAME = "unknown";
+
+ public static final Logger log = LoggerFactory.getLogger(ClassConstants.class);
+ public static final List contributorGroups = Arrays.asList("contributor", "author");
+
+ public static final int MAXIMUM_NUMBER_OF_GUESTS = MAXIMUM_NUMBER_OF_USERS * 10;
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/CompileTimeVariables.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/CompileTimeVariables.java
new file mode 100644
index 0000000000..c783a1368b
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/CompileTimeVariables.java
@@ -0,0 +1,21 @@
+package com.baeldung.compiletimeconstants;
+
+import java.io.PrintWriter;
+
+public class CompileTimeVariables {
+
+ public final String errorMessage = ClassConstants.DEFAULT_USERNAME + " not allowed here.";
+ public final int maximumLoginAttempts = 5;
+
+ public static void main(String[] args) {
+ PrintWriter printWriter = System.console().writer();
+ printWriter.println(ClassConstants.DEFAULT_USERNAME);
+
+ CompileTimeVariables instance = new CompileTimeVariables();
+ printWriter.println(instance.maximumLoginAttempts);
+
+ final String username = "baeldung" + "-" + "user";
+ printWriter.println(username);
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/RuntimeVariables.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/RuntimeVariables.java
new file mode 100644
index 0000000000..53e567fe54
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/RuntimeVariables.java
@@ -0,0 +1,16 @@
+package com.baeldung.compiletimeconstants;
+
+import java.io.Console;
+public class RuntimeVariables {
+
+ public static void main(String[] args) {
+ Console console = System.console();
+
+ final String input = console.readLine();
+ console.writer().println(input);
+
+ final double random = Math.random();
+ console.writer().println("Number: " + random);
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/SwitchStatement.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/SwitchStatement.java
new file mode 100644
index 0000000000..4242dc8d36
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/SwitchStatement.java
@@ -0,0 +1,17 @@
+package com.baeldung.compiletimeconstants;
+
+public class SwitchStatement {
+
+ private static final String VALUE_ONE = "value-one";
+
+ public static void main(String[] args) {
+ final String valueTwo = "value" + "-" + "two";
+ switch (args[0]) {
+ case VALUE_ONE:
+ break;
+ case valueTwo:
+ break;
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/finalkeyword/package-info.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/finalkeyword/package-info.java
new file mode 100644
index 0000000000..fd1e3cf8d8
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/finalkeyword/package-info.java
@@ -0,0 +1,13 @@
+/**
+* This module is about impact of the final keyword on performance
+ *
+ * This module explores if there are any performance benefits from
+ * using the final keyword in our code. This module examines the performance
+ * implications of using final on a variable, method, and class level.
+ *
+*
+* @since 1.0
+* @author baeldung
+* @version 1.1
+*/
+package com.baeldung.finalkeyword;
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/hash/Player.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/hash/Player.java
new file mode 100644
index 0000000000..79d2396816
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/hash/Player.java
@@ -0,0 +1,91 @@
+package com.baeldung.hash;
+
+import java.util.Objects;
+
+public class Player {
+ private String firstName;
+ private String lastName;
+ private String position;
+
+ public Player() {
+
+ }
+
+ public Player(String firstName, String lastName, String position) {
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.position = position;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getPosition() {
+ return position;
+ }
+
+ public void setPosition(String position) {
+ this.position = position;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(firstName, lastName, position);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+
+ if (obj == null) {
+ return false;
+ }
+
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+
+ Player other = (Player) obj;
+
+ if (firstName == null) {
+ if (other.firstName != null) {
+ return false;
+ }
+ } else if (!firstName.equals(other.firstName)) {
+ return false;
+ }
+
+ if (lastName == null) {
+ if (other.lastName != null) {
+ return false;
+ }
+ } else if (!lastName.equals(other.lastName)) {
+ return false;
+ }
+
+ if (position == null) {
+ if (other.position != null) {
+ return false;
+ }
+ } else if (!position.equals(other.position)) {
+ return false;
+ }
+ return true;
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/javadocmemberreference/Animal.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/javadocmemberreference/Animal.java
new file mode 100644
index 0000000000..b26b869a60
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/javadocmemberreference/Animal.java
@@ -0,0 +1,12 @@
+package com.baeldung.javadocmemberreference;
+
+public class Animal {
+
+ public void run() {
+
+ }
+
+ public void run(String direction) {
+
+ }
+}
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/javadocmemberreference/Person.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/javadocmemberreference/Person.java
new file mode 100644
index 0000000000..a2792e0304
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/javadocmemberreference/Person.java
@@ -0,0 +1,49 @@
+package com.baeldung.javadocmemberreference;
+
+import com.baeldung.vehicle.Car;
+
+public class Person {
+
+ Person() {
+
+ }
+
+ /**
+ * Also, check the {@link #move() Move} method for more movement details.
+ */
+ public void walk() {
+
+ }
+
+ /**
+ * Check this {@link #move(String) Move} method for direction oriented movement.
+ */
+ public void move() {
+
+ }
+
+ public void move(String direction) {
+
+ }
+
+ /**
+ * Additionally, check this {@link Animal#run(String) Run} method for direction based run.
+ */
+ public void run() {
+
+ }
+
+ /**
+ * Also consider checking {@link com.baeldung.vehicle.Vehicle#Vehicle() Vehicle} constructor to initialize vehicle object.
+ */
+ public void goToWork() {
+
+ }
+
+ /**
+ * Have a look at {@link Car#getNumberOfSeats() SeatsAvailability} method for checking the available seats needed for driving.
+ */
+ public void drive() {
+
+ }
+}
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/vehicle/Car.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/vehicle/Car.java
new file mode 100644
index 0000000000..4bacab82d6
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/vehicle/Car.java
@@ -0,0 +1,14 @@
+package com.baeldung.vehicle;
+
+public class Car {
+
+ public Car() {
+
+ }
+
+ public static int getNumberOfSeats() {
+ int availableSeats = 0;
+ // available seats calculation logic
+ return availableSeats;
+ }
+}
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/vehicle/Vehicle.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/vehicle/Vehicle.java
new file mode 100644
index 0000000000..e52ae7fc5c
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/vehicle/Vehicle.java
@@ -0,0 +1,8 @@
+package com.baeldung.vehicle;
+
+public class Vehicle {
+
+ public Vehicle() {
+
+ }
+}
diff --git a/core-java-modules/core-java-lang-4/src/test/java/com/baeldung/hash/HashCodeUnitTest.java b/core-java-modules/core-java-lang-4/src/test/java/com/baeldung/hash/HashCodeUnitTest.java
new file mode 100644
index 0000000000..d1a9e06611
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/test/java/com/baeldung/hash/HashCodeUnitTest.java
@@ -0,0 +1,67 @@
+package com.baeldung.hash;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import java.util.Objects;
+
+import org.junit.Test;
+
+public class HashCodeUnitTest {
+
+ @Test
+ public void whenCallingObjectsHashCodeOnIndenticalObjects_thenSameHashCodeReturned() {
+ String stringOne = "test";
+ String stringTwo = "test";
+ int hashCode1 = Objects.hashCode(stringOne);
+ int hashCode2 = Objects.hashCode(stringTwo);
+
+ assertEquals(hashCode1, hashCode2);
+ }
+
+ @Test
+ public void whenCallingObjectsHashCodeOnNullObject_thenZeroReturned() {
+ String nullString = null;
+ int hashCode = Objects.hashCode(nullString);
+ assertEquals(0, hashCode);
+ }
+
+ @Test
+ public void whenCallingObjectHashCodeOnIndenticalObjects_thenSameHashCodeReturned() {
+ Double valueOne = Double.valueOf(1.0012);
+ Double valueTwo = Double.valueOf(1.0012);
+
+ int hashCode1 = valueOne.hashCode();
+ int hashCode2 = valueTwo.hashCode();
+
+ assertEquals(hashCode1, hashCode2);
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void whenCallingObjectHashCodeOnNullObject_theNullPointerExceptionThrown() {
+ Double value = null;
+ value.hashCode();
+ }
+
+ @Test
+ public void whenCallingObjectsHashOnStrings_thenSameHashCodeReturned() {
+ String strOne = "one";
+ String strTwo = "two";
+ String strOne2 = "one";
+ String strTwo2 = "two";
+
+ int hashCode1 = Objects.hash(strOne, strTwo);
+ int hashCode2 = Objects.hash(strOne2, strTwo2);
+
+ assertEquals(hashCode1, hashCode2);
+ }
+
+ @Test
+ public void whenCallingObjectsHashOnSingleString_thenDifferentHashcodeFromObjectsHashCodeCallReturned() {
+ String testString = "test string";
+ int hashCode1 = Objects.hash(testString);
+ int hashCode2 = Objects.hashCode(testString);
+
+ assertNotEquals(hashCode1, hashCode2);
+ }
+}
diff --git a/core-java-modules/core-java-lang-4/src/test/java/com/baeldung/hash/PlayerUnitTest.java b/core-java-modules/core-java-lang-4/src/test/java/com/baeldung/hash/PlayerUnitTest.java
new file mode 100644
index 0000000000..fe0ef8a727
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/test/java/com/baeldung/hash/PlayerUnitTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.hash;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+
+import org.junit.Test;
+
+public class PlayerUnitTest {
+
+ @Test
+ public void whenCallingHashCodeOnIdenticalValue_thenSameHashCodeReturned() {
+ Player player = new Player("Eduardo", "Rodriguez", "Pitcher");
+ Player indenticalPlayer = new Player("Eduardo", "Rodriguez", "Pitcher");
+
+ int hashCode1 = player.hashCode();
+ int hashCode2 = player.hashCode();
+ int hashCode3 = indenticalPlayer.hashCode();
+
+ assertEquals(hashCode1, hashCode2);
+ assertEquals(hashCode1, hashCode3);
+ }
+
+ @Test
+ public void whenCallingHashCodeAndArraysHashCode_thenSameHashCodeReturned() {
+ Player player = new Player("Bobby", "Dalbec", "First Base");
+ int hashcode1 = player.hashCode();
+ String[] playerInfo = { "Bobby", "Dalbec", "First Base" };
+ int hashcode2 = Arrays.hashCode(playerInfo);
+
+ assertEquals(hashcode1, hashcode2);
+ }
+}
diff --git a/core-java-modules/core-java-lang-math-2/pom.xml b/core-java-modules/core-java-lang-math-2/pom.xml
index e2cced4fbf..098d77b59a 100644
--- a/core-java-modules/core-java-lang-math-2/pom.xml
+++ b/core-java-modules/core-java-lang-math-2/pom.xml
@@ -1,10 +1,12 @@
-
+4.0.0core-java-lang-math-20.0.1-SNAPSHOTcore-java-lang-math-2
+
com.baeldung.core-java-modulescore-java-modules
@@ -58,22 +60,10 @@
org.openjdk.jmhjmh-generator-annprocess
- ${jmh.version}
+ ${jmh-generator.version}
-
-
-
-
- org.codehaus.mojo
- exec-maven-plugin
- ${exec-maven-plugin.version}
-
-
-
-
-
3.6.13.9.0
@@ -83,7 +73,6 @@
1.0.0-beta41.2.00.6.0
- 1.19
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-math-3/pom.xml b/core-java-modules/core-java-lang-math-3/pom.xml
index 27c2372ab6..6779d0ecc6 100644
--- a/core-java-modules/core-java-lang-math-3/pom.xml
+++ b/core-java-modules/core-java-lang-math-3/pom.xml
@@ -6,6 +6,7 @@
core-java-lang-math-30.0.1-SNAPSHOTcore-java-lang-math-3
+
com.baeldung.core-java-modulescore-java-modules
@@ -19,7 +20,6 @@
exp4j0.4.8
-
com.fathzerjavaluator
@@ -27,9 +27,4 @@
-
-
-
-
-
diff --git a/core-java-modules/core-java-lang-math/pom.xml b/core-java-modules/core-java-lang-math/pom.xml
index 81ff0d43ea..0facdf2d8b 100644
--- a/core-java-modules/core-java-lang-math/pom.xml
+++ b/core-java-modules/core-java-lang-math/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-lang-mathjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -40,4 +40,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-constructors/pom.xml b/core-java-modules/core-java-lang-oop-constructors/pom.xml
index e54286a822..5635059fa9 100644
--- a/core-java-modules/core-java-lang-oop-constructors/pom.xml
+++ b/core-java-modules/core-java-lang-oop-constructors/pom.xml
@@ -1,17 +1,17 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-lang-oop-constructors
+ core-java-lang-oop-constructors
+ jar
+
core-java-modulescom.baeldung.core-java-modules0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-lang-oop-constructors
- core-java-lang-oop-constructors
- jar
@@ -25,4 +25,5 @@
3.10.0
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-generics/pom.xml b/core-java-modules/core-java-lang-oop-generics/pom.xml
index 1a538edac9..b13683d1cd 100644
--- a/core-java-modules/core-java-lang-oop-generics/pom.xml
+++ b/core-java-modules/core-java-lang-oop-generics/pom.xml
@@ -1,17 +1,17 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-lang-oop-generics
+ core-java-lang-oop-generics
+ jar
+
core-java-modulescom.baeldung.core-java-modules0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-lang-oop-generics
- core-java-lang-oop-generics
- jar
@@ -20,7 +20,6 @@
true
-
org.apache.maven.plugins
@@ -30,12 +29,13 @@
${maven.compiler.source}${maven.compiler.target}
-
+
+
1.81.8
diff --git a/core-java-modules/core-java-lang-oop-inheritance/pom.xml b/core-java-modules/core-java-lang-oop-inheritance/pom.xml
index ca828279db..e0272fb94e 100644
--- a/core-java-modules/core-java-lang-oop-inheritance/pom.xml
+++ b/core-java-modules/core-java-lang-oop-inheritance/pom.xml
@@ -1,17 +1,17 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-lang-oop-inheritance
+ core-java-lang-oop-inheritance
+ jar
+
core-java-modulescom.baeldung.core-java-modules0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-lang-oop-inheritance
- core-java-lang-oop-inheritance
- jar
@@ -25,4 +25,5 @@
3.10.0
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-methods/pom.xml b/core-java-modules/core-java-lang-oop-methods/pom.xml
index bcf561a6c2..e493f716ec 100644
--- a/core-java-modules/core-java-lang-oop-methods/pom.xml
+++ b/core-java-modules/core-java-lang-oop-methods/pom.xml
@@ -1,17 +1,17 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-lang-oop-methods
+ core-java-lang-oop-methods
+ jar
+
core-java-modulescom.baeldung.core-java-modules0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-lang-oop-methods
- core-java-lang-oop-methods
- jar
@@ -24,7 +24,6 @@
commons-lang${commons-lang.version}
-
org.assertjassertj-core
@@ -42,8 +41,8 @@
1.18.122.6
-
3.10.03.0.3
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-modifiers/pom.xml b/core-java-modules/core-java-lang-oop-modifiers/pom.xml
index 5f0be4545f..70c70608eb 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/pom.xml
+++ b/core-java-modules/core-java-lang-oop-modifiers/pom.xml
@@ -1,17 +1,17 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-lang-oop-modifiers
+ core-java-lang-oop-modifiers
+ jar
+
core-java-modulescom.baeldung.core-java-modules0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-lang-oop-modifiers
- core-java-lang-oop-modifiers
- jar
@@ -31,4 +31,5 @@
3.10.0
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-others/pom.xml b/core-java-modules/core-java-lang-oop-others/pom.xml
index ad5699d592..d9d147f34a 100644
--- a/core-java-modules/core-java-lang-oop-others/pom.xml
+++ b/core-java-modules/core-java-lang-oop-others/pom.xml
@@ -1,16 +1,16 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-lang-oop-others
+ core-java-lang-oop-others
+ jar
+
core-java-modulescom.baeldung.core-java-modules0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-lang-oop-others
- core-java-lang-oop-others
- jar
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-patterns/README.md b/core-java-modules/core-java-lang-oop-patterns/README.md
index 178a556a96..df68a1413a 100644
--- a/core-java-modules/core-java-lang-oop-patterns/README.md
+++ b/core-java-modules/core-java-lang-oop-patterns/README.md
@@ -7,3 +7,4 @@ This module contains articles about Object-oriented programming (OOP) patterns i
- [Inheritance and Composition (Is-a vs Has-a relationship) in Java](https://www.baeldung.com/java-inheritance-composition)
- [Immutable Objects in Java](https://www.baeldung.com/java-immutable-object)
- [How to Make a Deep Copy of an Object in Java](https://www.baeldung.com/java-deep-copy)
+- [Using an Interface vs. Abstract Class in Java](https://www.baeldung.com/java-interface-vs-abstract-class)
diff --git a/core-java-modules/core-java-lang-oop-patterns/pom.xml b/core-java-modules/core-java-lang-oop-patterns/pom.xml
index 0829295250..8b8b4a7b46 100644
--- a/core-java-modules/core-java-lang-oop-patterns/pom.xml
+++ b/core-java-modules/core-java-lang-oop-patterns/pom.xml
@@ -1,17 +1,17 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-lang-oop-patterns
+ core-java-lang-oop-patterns
+ jar
+
core-java-modulescom.baeldung.core-java-modules0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-lang-oop-patterns
- core-java-lang-oop-patterns
- jar
@@ -29,7 +29,6 @@
gson${gson.version}
-
org.assertjassertj-core
@@ -42,4 +41,5 @@
2.8.23.10.0
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/Car.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/Car.java
new file mode 100644
index 0000000000..6f17ecc536
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/Car.java
@@ -0,0 +1,42 @@
+package com.baeldung.interfacevsabstractclass;
+
+public class Car extends Vehicle {
+
+ public Car(String vechicleName) {
+ super(vechicleName);
+ }
+
+ public Car(String vechicleName, String vehicleModel) {
+ super(vechicleName, vehicleModel);
+ }
+
+ public Car(String vechicleName, String vehicleModel, Long makeYear) {
+ super(vechicleName, vehicleModel, makeYear);
+ }
+
+ @Override
+ protected void start() {
+ // code implementation details on starting a car.
+ }
+
+ @Override
+ protected void stop() {
+ // code implementation details on stopping a car.
+ }
+
+ @Override
+ protected void drive() {
+ // code implementation details on start driving a car.
+ }
+
+ @Override
+ protected void changeGear() {
+ // code implementation details on changing the car gear.
+ }
+
+ @Override
+ protected void reverse() {
+ // code implementation details on reverse driving a car.
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/ImageSender.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/ImageSender.java
new file mode 100644
index 0000000000..1948cc6583
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/ImageSender.java
@@ -0,0 +1,12 @@
+package com.baeldung.interfacevsabstractclass;
+
+import java.io.File;
+
+public class ImageSender implements Sender {
+
+ @Override
+ public void send(File fileToBeSent) {
+ // image sending implementation code.
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/Sender.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/Sender.java
new file mode 100644
index 0000000000..fde6527ef6
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/Sender.java
@@ -0,0 +1,8 @@
+package com.baeldung.interfacevsabstractclass;
+
+import java.io.File;
+
+public interface Sender {
+
+ void send(File fileToBeSent);
+}
diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/Vehicle.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/Vehicle.java
new file mode 100644
index 0000000000..d98b8ca93b
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/Vehicle.java
@@ -0,0 +1,57 @@
+package com.baeldung.interfacevsabstractclass;
+
+public abstract class Vehicle {
+
+ private String vehicleName;
+ private String vehicleModel;
+ private Long makeYear;
+
+ public Vehicle(String vehicleName) {
+ this.vehicleName = vehicleName;
+ }
+
+ public Vehicle(String vehicleName, String vehicleModel) {
+ this(vehicleName);
+ this.vehicleModel = vehicleModel;
+ }
+
+ public Vehicle(String vechicleName, String vehicleModel, Long makeYear) {
+ this(vechicleName, vehicleModel);
+ this.makeYear = makeYear;
+ }
+
+ public String getVehicleName() {
+ return vehicleName;
+ }
+
+ public void setVehicleName(String vehicleName) {
+ this.vehicleName = vehicleName;
+ }
+
+ public String getVehicleModel() {
+ return vehicleModel;
+ }
+
+ public void setVehicleModel(String vehicleModel) {
+ this.vehicleModel = vehicleModel;
+ }
+
+ public Long getMakeYear() {
+ return makeYear;
+ }
+
+ public void setMakeYear(Long makeYear) {
+ this.makeYear = makeYear;
+ }
+
+ protected abstract void start();
+
+ protected abstract void stop();
+
+ protected abstract void drive();
+
+ protected abstract void changeGear();
+
+ protected abstract void reverse();
+
+}
diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/VideoSender.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/VideoSender.java
new file mode 100644
index 0000000000..71f8050590
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/VideoSender.java
@@ -0,0 +1,12 @@
+package com.baeldung.interfacevsabstractclass;
+
+import java.io.File;
+
+public class VideoSender implements Sender {
+
+ @Override
+ public void send(File fileToBeSent) {
+ // video sending implementation code
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacevsabstractclass/SenderUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacevsabstractclass/SenderUnitTest.java
new file mode 100644
index 0000000000..6419721b3a
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacevsabstractclass/SenderUnitTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.interfacevsabstractclass;
+
+import static org.junit.jupiter.api.Assertions.*;
+import org.junit.jupiter.api.Test;
+
+import com.baeldung.interfacevsabstractclass.ImageSender;
+import com.baeldung.interfacevsabstractclass.Sender;
+
+import java.io.File;
+
+class SenderUnitTest {
+
+ public final static String IMAGE_FILE_PATH = "/sample_image_file_path/photo.jpg";
+
+ @Test
+ void givenImageUploaded_whenButtonClicked_thenSendImage() {
+ File imageFile = new File(IMAGE_FILE_PATH);
+
+ Sender sender = new ImageSender();
+ sender.send(imageFile);
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacevsabstractclass/VehicleUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacevsabstractclass/VehicleUnitTest.java
new file mode 100644
index 0000000000..1650ab9257
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacevsabstractclass/VehicleUnitTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.interfacevsabstractclass;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+
+import com.baeldung.interfacevsabstractclass.Car;
+import com.baeldung.interfacevsabstractclass.Vehicle;
+
+class VehicleUnitTest {
+
+ @Test
+ void givenVehicle_whenNeedToDrive_thenStart() {
+ Vehicle car = new Car("BMW");
+
+ car.start();
+ car.drive();
+ car.changeGear();
+ car.stop();
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-types-2/README.md b/core-java-modules/core-java-lang-oop-types-2/README.md
new file mode 100644
index 0000000000..a4e7b101c3
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-types-2/README.md
@@ -0,0 +1,7 @@
+## Core Java Lang OOP - Types
+
+This module contains articles about types in Java
+
+### Relevant Articles:
+
+- [Convert an Array of Primitives to an Array of Objects](https://www.baeldung.com/java-primitive-array-to-object-array)
diff --git a/core-java-modules/core-java-lang-oop-types-2/pom.xml b/core-java-modules/core-java-lang-oop-types-2/pom.xml
new file mode 100644
index 0000000000..d95123b39e
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-types-2/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+ core-java-lang-oop-types-2
+ jar
+
+
+ core-java-modules
+ com.baeldung.core-java-modules
+ 0.0.1-SNAPSHOT
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/conversions/PrimitiveToObjectArrayUnitTest.java b/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/conversions/PrimitiveToObjectArrayUnitTest.java
new file mode 100644
index 0000000000..e0f292f26e
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/conversions/PrimitiveToObjectArrayUnitTest.java
@@ -0,0 +1,81 @@
+package com.baeldung.conversions;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.junit.jupiter.api.Test;
+
+import java.util.Arrays;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class PrimitiveToObjectArrayUnitTest {
+
+ @Test
+ void givenUsingIteration_whenConvertingToObjects_thenSuccess() {
+ int[] input = new int[] { 0, 1, 2, 3, 4 };
+ Integer[] expected = new Integer[] { 0, 1, 2, 3, 4 };
+
+ Integer[] output = new Integer[input.length];
+ for (int i = 0; i < input.length; i++) {
+ output[i] = input[i];
+ }
+
+ assertArrayEquals(expected, output);
+ }
+
+ @Test
+ void givenUsingIteration_whenConvertingToPrimitives_thenSuccess() {
+ Integer[] input = new Integer[] { 0, 1, 2, 3, 4 };
+ int[] expected = new int[] { 0, 1, 2, 3, 4 };
+
+ int[] output = new int[input.length];
+ for (int i = 0; i < input.length; i++) {
+ output[i] = input[i];
+ }
+
+ assertArrayEquals(expected, output);
+ }
+
+ @Test
+ void givenUsingStreams_whenConvertingToObjects_thenSuccess() {
+ int[] input = new int[] { 0, 1, 2, 3, 4 };
+ Integer[] expected = new Integer[] { 0, 1, 2, 3, 4 };
+
+ Integer[] output = Arrays.stream(input)
+ .boxed()
+ .toArray(Integer[]::new);
+
+ assertArrayEquals(expected, output);
+ }
+
+ @Test
+ void givenUsingStreams_whenConvertingToPrimitives_thenSuccess() {
+ Integer[] input = new Integer[] { 0, 1, 2, 3, 4 };
+ int[] expected = new int[] { 0, 1, 2, 3, 4 };
+
+ int[] output = Arrays.stream(input)
+ .mapToInt(Integer::intValue)
+ .toArray();
+
+ assertArrayEquals(expected, output);
+ }
+
+ @Test
+ void givenUsingApacheCommons_whenConvertingToObjects_thenSuccess() {
+ int[] input = new int[] { 0, 1, 2, 3, 4 };
+ Integer[] expected = new Integer[] { 0, 1, 2, 3, 4 };
+
+ Integer[] output = ArrayUtils.toObject(input);
+
+ assertArrayEquals(expected, output);
+ }
+
+ @Test
+ void givenUsingApacheCommons_whenConvertingToPrimitives_thenSuccess() {
+ Integer[] input = new Integer[] { 0, 1, 2, 3, 4 };
+ int[] expected = new int[] { 0, 1, 2, 3, 4 };
+
+ int[] output = ArrayUtils.toPrimitive(input);
+
+ assertArrayEquals(expected, output);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-types/README.md b/core-java-modules/core-java-lang-oop-types/README.md
index 6c649877b3..1ac5a5c804 100644
--- a/core-java-modules/core-java-lang-oop-types/README.md
+++ b/core-java-modules/core-java-lang-oop-types/README.md
@@ -13,3 +13,4 @@ This module contains articles about types in Java
- [A Guide to Java Enums](https://www.baeldung.com/a-guide-to-java-enums)
- [Determine if an Object is of Primitive Type](https://www.baeldung.com/java-object-primitive-type)
- [Extending Enums in Java](https://www.baeldung.com/java-extending-enums)
+- [Java Class File Naming Conventions](https://www.baeldung.com/java-class-file-naming)
diff --git a/core-java-modules/core-java-lang-oop-types/pom.xml b/core-java-modules/core-java-lang-oop-types/pom.xml
index c4efd9b8d2..b770caf970 100644
--- a/core-java-modules/core-java-lang-oop-types/pom.xml
+++ b/core-java-modules/core-java-lang-oop-types/pom.xml
@@ -1,17 +1,17 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-lang-oop-types
+ core-java-lang-oop-types
+ jar
+
core-java-modulescom.baeldung.core-java-modules0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-lang-oop-types
- core-java-lang-oop-types
- jar
@@ -28,4 +28,5 @@
1.15
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-operators-2/README.md b/core-java-modules/core-java-lang-operators-2/README.md
new file mode 100644
index 0000000000..46c874f361
--- /dev/null
+++ b/core-java-modules/core-java-lang-operators-2/README.md
@@ -0,0 +1,5 @@
+## Core Java Operators
+
+This module contains articles about Java operators
+
+## Relevant Articles:
diff --git a/core-java-modules/core-java-lang-operators-2/pom.xml b/core-java-modules/core-java-lang-operators-2/pom.xml
new file mode 100644
index 0000000000..1e7e659e6d
--- /dev/null
+++ b/core-java-modules/core-java-lang-operators-2/pom.xml
@@ -0,0 +1,49 @@
+
+
+ 4.0.0
+ core-java-lang-operators-2
+ 0.1.0-SNAPSHOT
+ core-java-lang-operators-2
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+ ../
+
+
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
+
+
+
+ core-java-lang-operators-2
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ 3.10.0
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/oroperators/BitwiseAndLogicalOROperatorUnitTest.java b/core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/oroperators/BitwiseAndLogicalOROperatorUnitTest.java
new file mode 100644
index 0000000000..c04638991d
--- /dev/null
+++ b/core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/oroperators/BitwiseAndLogicalOROperatorUnitTest.java
@@ -0,0 +1,4 @@
+package com.baeldung.oroperators;
+
+public class BitwiseAndLogicalOROperatorUnitTest {
+}
diff --git a/core-java-modules/core-java-lang-operators/pom.xml b/core-java-modules/core-java-lang-operators/pom.xml
index 5b4c2fecaa..2d669bfa55 100644
--- a/core-java-modules/core-java-lang-operators/pom.xml
+++ b/core-java-modules/core-java-lang-operators/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-lang-operatorsjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -46,4 +46,4 @@
3.10.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-syntax-2/pom.xml b/core-java-modules/core-java-lang-syntax-2/pom.xml
index b88c86b047..b725089351 100644
--- a/core-java-modules/core-java-lang-syntax-2/pom.xml
+++ b/core-java-modules/core-java-lang-syntax-2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-lang-syntax-2jar
+
com.baeldung.core-java-modulescore-java-modules
diff --git a/core-java-modules/core-java-lang-syntax/pom.xml b/core-java-modules/core-java-lang-syntax/pom.xml
index c8f6524e0b..70b0600580 100644
--- a/core-java-modules/core-java-lang-syntax/pom.xml
+++ b/core-java-modules/core-java-lang-syntax/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-lang-syntaxjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -51,4 +51,4 @@
3.10.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang/pom.xml b/core-java-modules/core-java-lang/pom.xml
index 807d5f34d4..2a1a7a05b8 100644
--- a/core-java-modules/core-java-lang/pom.xml
+++ b/core-java-modules/core-java-lang/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-langjar
+
com.baeldung.core-java-modulescore-java-modules
diff --git a/core-java-modules/core-java-networking-2/README.md b/core-java-modules/core-java-networking-2/README.md
index 9def4c8eb6..fa49c35bf8 100644
--- a/core-java-modules/core-java-networking-2/README.md
+++ b/core-java-modules/core-java-networking-2/README.md
@@ -14,5 +14,4 @@ This module contains articles about networking in Java
- [Handling java.net.ConnectException](https://www.baeldung.com/java-net-connectexception)
- [Getting MAC addresses in Java](https://www.baeldung.com/java-mac-address)
- [Sending Emails with Attachments in Java](https://www.baeldung.com/java-send-emails-attachments)
-- [Finding a Free Port in Java](https://www.baeldung.com/java-free-port)
- [[<-- Prev]](/core-java-modules/core-java-networking)
diff --git a/core-java-modules/core-java-networking-2/pom.xml b/core-java-modules/core-java-networking-2/pom.xml
index 89a98bbf8b..893db2d85c 100644
--- a/core-java-modules/core-java-networking-2/pom.xml
+++ b/core-java-modules/core-java-networking-2/pom.xml
@@ -1,12 +1,12 @@
-4.0.0core-java-networking-2core-java-networking-2jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -53,4 +53,4 @@
2.4.5
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java
index 16017ee482..987a69582f 100644
--- a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java
+++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java
@@ -17,9 +17,9 @@ import static org.junit.Assert.assertTrue;
public class FileDownloadIntegrationTest {
- static String FILE_URL = "http://ovh.net/files/1Mio.dat";
+ static String FILE_URL = "https://s3.amazonaws.com/baeldung.com/Do+JSON+with+Jackson+by+Baeldung.pdf";
static String FILE_NAME = "file.dat";
- static String FILE_MD5_HASH = "6cb91af4ed4c60c11613b75cd1fc6116";
+ static String FILE_MD5_HASH = "c959feb066b37f5c4f0e0f45bbbb4f86";
@Test
public void givenJavaIO_whenDownloadingFile_thenDownloadShouldBeCorrect() throws NoSuchAlgorithmException, IOException {
diff --git a/core-java-modules/core-java-networking-3/README.md b/core-java-modules/core-java-networking-3/README.md
index a81e85751d..730231525f 100644
--- a/core-java-modules/core-java-networking-3/README.md
+++ b/core-java-modules/core-java-networking-3/README.md
@@ -4,5 +4,6 @@ This module contains articles about networking in Java
### Relevant Articles
-- TODO: add link once live
+- [Finding a Free Port in Java](https://www.baeldung.com/java-free-port)
+- [Downloading Email Attachments in Java](https://www.baeldung.com/java-download-email-attachments)
- [[<-- Prev]](/core-java-modules/core-java-networking-2)
diff --git a/core-java-modules/core-java-networking-3/pom.xml b/core-java-modules/core-java-networking-3/pom.xml
index d72981f862..0ad800e173 100644
--- a/core-java-modules/core-java-networking-3/pom.xml
+++ b/core-java-modules/core-java-networking-3/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -37,16 +36,29 @@
${assertj.version}test
+
+ junit
+ junit
+ 4.11
+ test
+
+
+ com.sun.mail
+ javax.mail
+ 1.6.2
+ core-java-networking-3
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
-
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+
@@ -56,4 +68,4 @@
3.11.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/downloadattachments/DownloadEmailAttachments.java b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/downloadattachments/DownloadEmailAttachments.java
new file mode 100644
index 0000000000..4030f3b983
--- /dev/null
+++ b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/downloadattachments/DownloadEmailAttachments.java
@@ -0,0 +1,112 @@
+package com.baeldung.downloadattachments;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import javax.mail.Address;
+import javax.mail.Folder;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.Multipart;
+import javax.mail.NoSuchProviderException;
+import javax.mail.Part;
+import javax.mail.Session;
+import javax.mail.Store;
+import javax.mail.internet.MimeBodyPart;
+
+public class DownloadEmailAttachments {
+ private String downloadDirectory;
+
+ public void setSaveDirectory(String dir) {
+ this.downloadDirectory = dir;
+ }
+
+ public void downloadEmailAttachments(String host, String port, String userName, String password) throws NoSuchProviderException, MessagingException, IOException {
+ Properties properties = setMailServerProperties(host, port);
+ Store store = setSessionStoreProperties(userName, password, properties);
+ Folder inbox = store.getFolder("INBOX");
+ inbox.open(Folder.READ_ONLY);
+ Message[] arrayMessages = inbox.getMessages();
+ for (int i = 0; i < arrayMessages.length; i++) {
+ Message message = arrayMessages[i];
+ Address[] fromAddress = message.getFrom();
+ String from = fromAddress[0].toString();
+ String subject = message.getSubject();
+ String sentDate = message.getSentDate().toString();
+ List attachments = new ArrayList();
+ if (message.getContentType().contains("multipart")) {
+ attachments = downloadAttachments(message);
+ }
+
+ System.out.println("Message #" + (i + 1) + ":");
+ System.out.println(" From: " + from);
+ System.out.println(" Subject: " + subject);
+ System.out.println(" Sent Date: " + sentDate);
+ System.out.println(" Attachments: " + attachments);
+ }
+ inbox.close(false);
+ store.close();
+ }
+
+ public List downloadAttachments(Message message) throws IOException, MessagingException {
+ List downloadedAttachments = new ArrayList();
+ Multipart multiPart = (Multipart) message.getContent();
+ int numberOfParts = multiPart.getCount();
+ for (int partCount = 0; partCount < numberOfParts; partCount++) {
+ MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(partCount);
+ if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {
+ String file = part.getFileName();
+ part.saveFile(downloadDirectory + File.separator + part.getFileName());
+ downloadedAttachments.add(file);
+ }
+ }
+
+ return downloadedAttachments;
+ }
+
+ public Store setSessionStoreProperties(String userName, String password, Properties properties) throws NoSuchProviderException, MessagingException {
+ Session session = Session.getDefaultInstance(properties);
+
+ Store store = session.getStore("pop3");
+ store.connect(userName, password);
+ return store;
+ }
+
+ public Properties setMailServerProperties(String host, String port) {
+ Properties properties = new Properties();
+
+ properties.put("mail.pop3.host", host);
+ properties.put("mail.pop3.port", port);
+
+ properties.setProperty("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
+ properties.setProperty("mail.pop3.socketFactory.fallback", "false");
+ properties.setProperty("mail.pop3.socketFactory.port", String.valueOf(port));
+ return properties;
+ }
+
+ public static void main(String[] args) {
+ String host = "pop.gmail.com";
+ String port = "995";
+ String userName = "your_email";
+ String password = "your_password";
+
+ String saveDirectory = "valid_folder_path";
+
+ DownloadEmailAttachments receiver = new DownloadEmailAttachments();
+ receiver.setSaveDirectory(saveDirectory);
+ try {
+ receiver.downloadEmailAttachments(host, port, userName, password);
+ } catch (NoSuchProviderException ex) {
+ System.out.println("No provider for pop3.");
+ ex.printStackTrace();
+ } catch (MessagingException ex) {
+ System.out.println("Could not connect to the message store");
+ ex.printStackTrace();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+}
diff --git a/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/downloadattachments/DownloadEmailAttachmentsLiveTest.java b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/downloadattachments/DownloadEmailAttachmentsLiveTest.java
new file mode 100644
index 0000000000..050790e6be
--- /dev/null
+++ b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/downloadattachments/DownloadEmailAttachmentsLiveTest.java
@@ -0,0 +1,25 @@
+package com.baeldung.downloadattachments;
+
+import static org.junit.Assert.fail;
+import org.junit.Test;
+
+public class DownloadEmailAttachmentsLiveTest {
+ @Test
+ public void when_Run_then_downloadAttachments() {
+
+ String host = "pop.gmail.com";
+ String port = "995";
+ String userName = "your_email";
+ String password = "your_password";
+
+ String saveDirectory = "valid_folder_path";
+
+ DownloadEmailAttachments receiver = new DownloadEmailAttachments();
+ receiver.setSaveDirectory(saveDirectory);
+ try {
+ receiver.downloadEmailAttachments(host, port, userName, password);
+ } catch (Exception ex) {
+ fail("Exception: " + ex);
+ }
+ }
+}
diff --git a/core-java-modules/core-java-networking/pom.xml b/core-java-modules/core-java-networking/pom.xml
index b81be2751a..3e69e03dcb 100644
--- a/core-java-modules/core-java-networking/pom.xml
+++ b/core-java-modules/core-java-networking/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-networkingjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -31,4 +31,4 @@
4.3.4.RELEASE
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-nio-2/README.md b/core-java-modules/core-java-nio-2/README.md
index ef73159f66..52efa0330a 100644
--- a/core-java-modules/core-java-nio-2/README.md
+++ b/core-java-modules/core-java-nio-2/README.md
@@ -9,4 +9,6 @@ This module contains articles about core Java non-blocking input and output (IO)
- [Introduction to the Java NIO Selector](https://www.baeldung.com/java-nio-selector)
- [Using Java MappedByteBuffer](https://www.baeldung.com/java-mapped-byte-buffer)
- [How to Lock a File in Java](https://www.baeldung.com/java-lock-files)
+- [Java NIO DatagramChannel](https://www.baeldung.com/java-nio-datagramchannel)
+- [Java – Path vs File](https://www.baeldung.com/java-path-vs-file)
- [[<-- Prev]](/core-java-modules/core-java-nio)
diff --git a/core-java-modules/core-java-nio-2/pom.xml b/core-java-modules/core-java-nio-2/pom.xml
index 7c4583476d..0f4107d536 100644
--- a/core-java-modules/core-java-nio-2/pom.xml
+++ b/core-java-modules/core-java-nio-2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,12 +7,14 @@
0.1.0-SNAPSHOTcore-java-nio-2jar
+
com.baeldung.core-java-modulescore-java-modules0.0.1-SNAPSHOT../
+
org.assertj
@@ -22,4 +23,5 @@
test
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramChannelBuilder.java b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramChannelBuilder.java
new file mode 100644
index 0000000000..43e0747622
--- /dev/null
+++ b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramChannelBuilder.java
@@ -0,0 +1,18 @@
+package com.baeldung.datagramchannel;
+
+import java.io.IOException;
+import java.net.SocketAddress;
+import java.nio.channels.DatagramChannel;
+
+public class DatagramChannelBuilder {
+
+ public static DatagramChannel openChannel() throws IOException {
+ DatagramChannel datagramChannel = DatagramChannel.open();
+ return datagramChannel;
+ }
+
+ public static DatagramChannel bindChannel(SocketAddress local) throws IOException {
+ return openChannel().bind(local);
+ }
+
+}
diff --git a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramClient.java b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramClient.java
new file mode 100644
index 0000000000..e377cc431c
--- /dev/null
+++ b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramClient.java
@@ -0,0 +1,31 @@
+package com.baeldung.datagramchannel;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.DatagramChannel;
+
+public class DatagramClient {
+
+ public static DatagramChannel startClient() throws IOException {
+ DatagramChannel client = DatagramChannelBuilder.bindChannel(null);
+ client.configureBlocking(false);
+ return client;
+ }
+
+ public static void sendMessage(DatagramChannel client, String msg, SocketAddress serverAddress) throws IOException {
+ ByteBuffer buffer = ByteBuffer.wrap(msg.getBytes());
+ client.send(buffer, serverAddress);
+ }
+
+ public static void main(String[] args) throws IOException {
+ DatagramChannel client = startClient();
+ String msg = "Hello, this is a Baeldung's DatagramChannel based UDP client!";
+ InetSocketAddress serverAddress = new InetSocketAddress("localhost", 7001);
+
+ sendMessage(client, msg, serverAddress);
+
+ }
+
+}
diff --git a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramServer.java b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramServer.java
new file mode 100644
index 0000000000..ed3345a26d
--- /dev/null
+++ b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramServer.java
@@ -0,0 +1,46 @@
+package com.baeldung.datagramchannel;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.DatagramChannel;
+
+public class DatagramServer {
+
+ public static DatagramChannel startServer() throws IOException {
+ InetSocketAddress address = new InetSocketAddress("localhost", 7001);
+ DatagramChannel server = DatagramChannelBuilder.bindChannel(address);
+
+ System.out.println("Server started at #" + address);
+
+ return server;
+ }
+
+ public static String receiveMessage(DatagramChannel server) throws IOException {
+ ByteBuffer buffer = ByteBuffer.allocate(1024);
+ SocketAddress remoteAdd = server.receive(buffer);
+ String message = extractMessage(buffer);
+
+ System.out.println("Client at #" + remoteAdd + " sent: " + message);
+
+ return message;
+ }
+
+ private static String extractMessage(ByteBuffer buffer) {
+ buffer.flip();
+
+ byte[] bytes = new byte[buffer.remaining()];
+ buffer.get(bytes);
+
+ String msg = new String(bytes);
+
+ return msg;
+ }
+
+ public static void main(String[] args) throws IOException {
+ DatagramChannel server = startServer();
+ receiveMessage(server);
+ }
+
+}
diff --git a/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/datagramchannel/DatagramChannelUnitTest.java b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/datagramchannel/DatagramChannelUnitTest.java
new file mode 100644
index 0000000000..f816072ee7
--- /dev/null
+++ b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/datagramchannel/DatagramChannelUnitTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.datagramchannel;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.channels.DatagramChannel;
+import org.junit.jupiter.api.Test;
+
+public class DatagramChannelUnitTest {
+
+ @Test
+ public void whenClientSendsAndServerReceivesUDPPacket_thenCorrect() throws IOException {
+ DatagramChannel server = DatagramServer.startServer();
+ DatagramChannel client = DatagramClient.startClient();
+
+ String msg1 = "Hello, this is a Baeldung's DatagramChannel based UDP client!";
+ String msg2 = "Hi again!, Are you there!";
+
+ InetSocketAddress serverAddress = new InetSocketAddress("localhost", 7001);
+
+ DatagramClient.sendMessage(client, msg1, serverAddress);
+ DatagramClient.sendMessage(client, msg2, serverAddress);
+
+ assertEquals("Hello, this is a Baeldung's DatagramChannel based UDP client!", DatagramServer.receiveMessage(server));
+ assertEquals("Hi again!, Are you there!", DatagramServer.receiveMessage(server));
+ }
+
+}
diff --git a/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/pathvsfile/PathVsFileUnitTest.java b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/pathvsfile/PathVsFileUnitTest.java
new file mode 100644
index 0000000000..7c1e910db8
--- /dev/null
+++ b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/pathvsfile/PathVsFileUnitTest.java
@@ -0,0 +1,98 @@
+package com.baeldung.pathvsfile;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.assertj.core.api.Assertions.catchThrowable;
+
+public class PathVsFileUnitTest {
+
+ @Test
+ public void whenCreateFileAndPath_thenShouldPointTheSame() {
+ File file = new File("baeldung/tutorial.txt");
+ Path path = Paths.get("baeldung/tutorial.txt");
+
+ assertThat(file.toString())
+ .isEqualTo(path.toString());
+ assertThat(file.toPath())
+ .isEqualTo(path);
+ assertThat(path.toFile())
+ .isEqualTo(file);
+ assertThat(file)
+ .isEqualTo(new File("baeldung", "tutorial.txt"));
+ assertThat(path)
+ .isEqualTo(Paths.get("baeldung", "tutorial.txt" ))
+ .isEqualTo(Paths.get("baeldung").resolve("tutorial.txt"));
+ }
+
+ @Test
+ public void givenNoFile_whenDelete_thenReportError() {
+ File file = new File("tutorial.txt");
+ Path path = Paths.get("tutorial.txt");
+
+ assertThat(file.delete()).isFalse();
+ assertThatThrownBy(() -> Files.delete(path))
+ .isInstanceOf(IOException.class)
+ .isInstanceOf(NoSuchFileException.class);
+ }
+
+ @Test
+ public void givenExistedFile_whenReadMetadata_thenShouldBeSame() throws IOException {
+ File file = new File("tutorial.txt");
+ Path path = Paths.get("tutorial.txt");
+
+ Throwable throwable = catchThrowable(() -> Files.createFile(path));
+ assertThat(throwable)
+ .isNull();
+
+ assertThat(file.exists())
+ .isEqualTo(Files.exists(path));
+ assertThat(file.isFile())
+ .isEqualTo(Files.isRegularFile(path));
+ assertThat(file.isDirectory())
+ .isEqualTo(Files.isDirectory(path));
+ assertThat(file.canRead())
+ .isEqualTo(Files.isReadable(path));
+ assertThat(file.canWrite())
+ .isEqualTo(Files.isWritable(path));
+ assertThat(file.canExecute())
+ .isEqualTo(Files.isExecutable(path));
+ assertThat(file.isHidden())
+ .isEqualTo(Files.isHidden(path));
+ }
+
+ @Test
+ public void givenExistedFile_whenUriPathOperations_thenShouldBeSame() throws IOException {
+ File file = new File("tutorial.txt");
+ Path path = Paths.get("tutorial.txt");
+
+ Throwable throwable = catchThrowable(() -> Files.createFile(path));
+ assertThat(throwable)
+ .isNull();
+
+ assertThat(file.toURI())
+ .isEqualTo(path.toUri());
+ assertThat(file.getAbsolutePath())
+ .isEqualTo(path.toAbsolutePath().toString());
+ assertThat(file.getCanonicalPath())
+ .isEqualTo(path.toRealPath().toString())
+ .isEqualTo(path.toRealPath().normalize().toString());
+ }
+
+ @AfterEach
+ public void afterEach() throws IOException {
+ Path path = Paths.get("tutorial.txt");
+ if (Files.exists(path)) {
+ Files.delete(path);
+ }
+ }
+}
diff --git a/core-java-modules/core-java-nio/pom.xml b/core-java-modules/core-java-nio/pom.xml
index 5b8baf6a70..1d267245a9 100644
--- a/core-java-modules/core-java-nio/pom.xml
+++ b/core-java-modules/core-java-nio/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-niojar
+
com.baeldung.core-java-modulescore-java-modules
diff --git a/core-java-modules/core-java-optional/pom.xml b/core-java-modules/core-java-optional/pom.xml
index 575ccb0759..dd5217df74 100644
--- a/core-java-modules/core-java-optional/pom.xml
+++ b/core-java-modules/core-java-optional/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -67,8 +66,6 @@
5.4.0.Final
- 1.19
- 1.1927.1-jre3.10.03.1.1
diff --git a/core-java-modules/core-java-os/pom.xml b/core-java-modules/core-java-os/pom.xml
index e17ddf9b37..5f00b709e3 100644
--- a/core-java-modules/core-java-os/pom.xml
+++ b/core-java-modules/core-java-os/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-osjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -63,7 +63,6 @@
true
-
org.apache.maven.plugins
@@ -81,7 +80,6 @@
4.14.01
-
3.6.11.8.9
@@ -92,4 +90,4 @@
1.8.7
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessAPIEnhancementsUnitTest.java b/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessAPIEnhancementsUnitTest.java
index a7a23fb6fc..c81f060150 100644
--- a/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessAPIEnhancementsUnitTest.java
+++ b/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessAPIEnhancementsUnitTest.java
@@ -20,7 +20,8 @@ public class ProcessAPIEnhancementsUnitTest {
Logger log = LoggerFactory.getLogger(ProcessAPIEnhancementsUnitTest.class);
- @Test
+ // @Test
+ // OS / Java version dependent
public void givenCurrentProcess_whenInvokeGetInfo_thenSuccess() throws IOException {
ProcessHandle processHandle = ProcessHandle.current();
ProcessHandle.Info processInfo = processHandle.info();
@@ -41,7 +42,8 @@ public class ProcessAPIEnhancementsUnitTest {
.isPresent());
}
- @Test
+ // @Test
+ // OS / Java version dependent
public void givenSpawnProcess_whenInvokeGetInfo_thenSuccess() throws IOException {
String javaCmd = ProcessUtils.getJavaCmd()
@@ -67,7 +69,8 @@ public class ProcessAPIEnhancementsUnitTest {
.isPresent());
}
- @Test
+ // @Test
+ // OS / Java version dependent
public void givenLiveProcesses_whenInvokeGetInfo_thenSuccess() {
Stream liveProcesses = ProcessHandle.allProcesses();
liveProcesses.filter(ProcessHandle::isAlive)
@@ -82,7 +85,8 @@ public class ProcessAPIEnhancementsUnitTest {
});
}
- @Test
+ // @Test
+ // OS / Java version dependent
public void givenProcess_whenGetChildProcess_thenSuccess() throws IOException {
int childProcessCount = 5;
for (int i = 0; i < childProcessCount; i++) {
@@ -105,7 +109,8 @@ public class ProcessAPIEnhancementsUnitTest {
.command()));
}
- @Test
+ // @Test
+ // OS / Java version dependent
public void givenProcess_whenAddExitCallback_thenSuccess() throws Exception {
String javaCmd = ProcessUtils.getJavaCmd()
.getAbsolutePath();
diff --git a/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessUnderstandingUnitTest.java b/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessUnderstandingUnitTest.java
index 69b65852cc..b3b9ca8bc6 100644
--- a/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessUnderstandingUnitTest.java
+++ b/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessUnderstandingUnitTest.java
@@ -90,18 +90,22 @@ class ProcessUnderstandingUnitTest {
}
@Test
- public void givenSourceProgram_whenReadingInputStream_thenFirstLineEquals3() throws IOException {
+ public void givenSourceProgram_whenReadingInputStream_thenFirstLineEquals3() throws IOException, InterruptedException {
Runtime.getRuntime()
.exec("javac -cp src src/main/java/com/baeldung/java9/process/OutputStreamExample.java"
- .replace("/", File.separator));
+ .replace("/", File.separator))
+ .waitFor(5, TimeUnit.SECONDS);
Process process = Runtime.getRuntime()
.exec("java -cp src/main/java com.baeldung.java9.process.OutputStreamExample"
.replace("/", File.separator));
+ process.waitFor(5, TimeUnit.SECONDS);
+
BufferedReader output = new BufferedReader(new InputStreamReader(process.getInputStream()));
- int value = Integer.parseInt(output.readLine());
+ String line = output.readLine();
+ int value = Integer.parseInt(line);
assertEquals(3, value);
}
diff --git a/core-java-modules/core-java-perf/pom.xml b/core-java-modules/core-java-perf/pom.xml
index 3956c7e9fb..bc82e92e34 100644
--- a/core-java-modules/core-java-perf/pom.xml
+++ b/core-java-modules/core-java-perf/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-perfjar
+
com.baeldung.core-java-modulescore-java-modules
diff --git a/core-java-modules/core-java-reflection-2/README.md b/core-java-modules/core-java-reflection-2/README.md
index 3195cddc42..4c888bdf58 100644
--- a/core-java-modules/core-java-reflection-2/README.md
+++ b/core-java-modules/core-java-reflection-2/README.md
@@ -5,3 +5,4 @@
- [Checking If a Method is Static Using Reflection in Java](https://www.baeldung.com/java-check-method-is-static)
- [Checking if a Java Class is ‘abstract’ Using Reflection](https://www.baeldung.com/java-reflection-is-class-abstract)
- [Invoking a Private Method in Java](https://www.baeldung.com/java-call-private-method)
+- [Finding All Classes in a Java Package](https://www.baeldung.com/java-find-all-classes-in-package)
diff --git a/core-java-modules/core-java-reflection-2/pom.xml b/core-java-modules/core-java-reflection-2/pom.xml
index 02a806f87c..347f986275 100644
--- a/core-java-modules/core-java-reflection-2/pom.xml
+++ b/core-java-modules/core-java-reflection-2/pom.xml
@@ -7,13 +7,14 @@
0.1.0-SNAPSHOTcore-java-reflection-2jar
+
com.baeldung.core-java-modulescore-java-modules0.0.1-SNAPSHOT../
-
+
org.springframework
@@ -21,8 +22,18 @@
${spring.version}test
+
+ org.reflections
+ reflections
+ 0.9.12
+
+
+ com.google.guava
+ guava
+ 30.1.1-jre
+
-
+
core-java-reflection-2
diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackage.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackage.java
new file mode 100644
index 0000000000..dfbfaca270
--- /dev/null
+++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackage.java
@@ -0,0 +1,58 @@
+package com.baeldung.reflection.access.packages;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.reflections.Reflections;
+import org.reflections.scanners.SubTypesScanner;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.reflect.ClassPath;
+
+@SuppressWarnings("rawtypes")
+public class AccessingAllClassesInPackage {
+
+ private static final Logger LOG = LoggerFactory.getLogger(AccessingAllClassesInPackage.class);
+
+ public Set findAllClassesUsingClassLoader(String packageName) {
+ InputStream stream = ClassLoader.getSystemClassLoader()
+ .getResourceAsStream(packageName.replaceAll("[.]", "/"));
+ BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
+ return reader.lines()
+ .filter(line -> line.endsWith(".class"))
+ .map(line -> getClass(line, packageName))
+ .collect(Collectors.toSet());
+ }
+
+ private Class getClass(String className, String packageName) {
+ try {
+ return Class.forName(packageName + "." + className.substring(0, className.lastIndexOf('.')));
+ } catch (ClassNotFoundException e) {
+ LOG.error("<>");
+ }
+ return null;
+ }
+
+ public Set findAllClassesUsingReflectionsLibrary(String packageName) {
+ Reflections reflections = new Reflections(packageName, new SubTypesScanner(false));
+ return reflections.getSubTypesOf(Object.class)
+ .stream()
+ .collect(Collectors.toSet());
+ }
+
+ public Set findAllClassesUsingGoogleGuice(String packageName) throws IOException {
+ return ClassPath.from(ClassLoader.getSystemClassLoader())
+ .getAllClasses()
+ .stream()
+ .filter(clazz -> clazz.getPackageName()
+ .equalsIgnoreCase(packageName))
+ .map(clazz -> clazz.load())
+ .collect(Collectors.toSet());
+ }
+
+}
diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/ClassExample.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/ClassExample.java
new file mode 100644
index 0000000000..d1ff027770
--- /dev/null
+++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/ClassExample.java
@@ -0,0 +1,6 @@
+package com.baeldung.reflection.access.packages.search;
+
+public class ClassExample {
+ class NestedClassExample {
+ }
+}
diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/InterfaceExample.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/InterfaceExample.java
new file mode 100644
index 0000000000..340c552da8
--- /dev/null
+++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/InterfaceExample.java
@@ -0,0 +1,4 @@
+package com.baeldung.reflection.access.packages.search;
+
+public interface InterfaceExample {
+}
diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/Searchable.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/Searchable.java
new file mode 100644
index 0000000000..6f4180a136
--- /dev/null
+++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/Searchable.java
@@ -0,0 +1,5 @@
+package com.baeldung.reflection.access.packages.search;
+
+public @interface Searchable {
+
+}
diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/package-info.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/package-info.java
new file mode 100644
index 0000000000..f920000b92
--- /dev/null
+++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/packages/search/package-info.java
@@ -0,0 +1,2 @@
+@Searchable
+package com.baeldung.reflection.access.packages.search;
\ No newline at end of file
diff --git a/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackageUnitTest.java b/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackageUnitTest.java
new file mode 100644
index 0000000000..5bee2c0f3e
--- /dev/null
+++ b/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/access/packages/AccessingAllClassesInPackageUnitTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.reflection.access.packages;
+
+import java.io.IOException;
+import java.util.Set;
+
+import org.junit.Rule;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.rules.ExpectedException;
+
+@SuppressWarnings("rawtypes")
+public class AccessingAllClassesInPackageUnitTest {
+ @Rule
+ public final ExpectedException exception = ExpectedException.none();
+
+ private static final String PACKAGE_NAME = "com.baeldung.reflection.access.packages.search";
+
+ @Test
+ public void when_findAllClassesUsingClassLoader_thenSuccess() {
+ AccessingAllClassesInPackage instance = new AccessingAllClassesInPackage();
+ Set classes = instance.findAllClassesUsingClassLoader(PACKAGE_NAME);
+ Assertions.assertEquals(5, classes.size());
+ }
+
+ @Test
+ public void when_findAllClassesUsingReflectionsLibrary_thenSuccess() {
+ AccessingAllClassesInPackage instance = new AccessingAllClassesInPackage();
+ Set classes = instance.findAllClassesUsingReflectionsLibrary(PACKAGE_NAME);
+ Assertions.assertEquals(5, classes.size());
+ }
+
+ @Test
+ public void when_findAllClassesUsingGoogleGuice_thenSuccess() throws IOException {
+ AccessingAllClassesInPackage instance = new AccessingAllClassesInPackage();
+ Set classes = instance.findAllClassesUsingGoogleGuice(PACKAGE_NAME);
+ Assertions.assertEquals(5, classes.size());
+ }
+
+}
diff --git a/core-java-modules/core-java-reflection/pom.xml b/core-java-modules/core-java-reflection/pom.xml
index 4ae7b26745..67922eec5b 100644
--- a/core-java-modules/core-java-reflection/pom.xml
+++ b/core-java-modules/core-java-reflection/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-reflectionjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -51,4 +51,5 @@
1.81.8
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-regex-2/README.md b/core-java-modules/core-java-regex-2/README.md
new file mode 100644
index 0000000000..7920ac456d
--- /dev/null
+++ b/core-java-modules/core-java-regex-2/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Non-Capturing Regex Groups in Java](https://www.baeldung.com/java-regex-non-capturing-groups)
diff --git a/core-java-modules/core-java-regex-2/pom.xml b/core-java-modules/core-java-regex-2/pom.xml
new file mode 100644
index 0000000000..45e19ba5a5
--- /dev/null
+++ b/core-java-modules/core-java-regex-2/pom.xml
@@ -0,0 +1,31 @@
+
+
+ 4.0.0
+ core-java-regex-2
+ 0.1.0-SNAPSHOT
+ core-java-regex-2
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+ ../
+
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
+
+
+
+ 3.15.0
+
+
+
diff --git a/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/regex/noncapturinggroups/NonCapturingGroupUnitTest.java b/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/regex/noncapturinggroups/NonCapturingGroupUnitTest.java
new file mode 100644
index 0000000000..281a550f34
--- /dev/null
+++ b/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/regex/noncapturinggroups/NonCapturingGroupUnitTest.java
@@ -0,0 +1,119 @@
+package com.baeldung.regex.noncapturinggroups;
+
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class NonCapturingGroupUnitTest {
+
+ private static final Pattern SIMPLE_URL_PATTERN = Pattern.compile("[^:]+://(?:[.a-z]+/?)+");
+ private static final Pattern SCOPED_CASE_INSENSITIVE_URL_PATTERN = Pattern.compile("[^:]+://(?i:[.a-z]+/?)+");
+ private static final Pattern SIMPLE_URL_PATTERN_WITH_SPECIFIC_ENDING_PATH = Pattern.compile("[^:]+://(?:[.a-z]+/?)+?/ending-path");
+ private static final Pattern SCOPED_CASE_INSENSTIIVE_URL_PATTERN_WITH_ENDING_PATH = Pattern.compile("[^:]://(?i:[.a-z]+/?)+?/ending-path");
+ private static final Pattern CASE_INSENSITIVE_URL_PATTERN = Pattern.compile("[^:]+://(?:[.a-z]+/?)+?(/ending-path)", Pattern.CASE_INSENSITIVE);
+ private static final Pattern SCOPED_CASE_SENSITIVE_URL_PATTERN = Pattern.compile("[^:]+://(?-i:[.a-z]+/?)+?(/ending-path)", Pattern.CASE_INSENSITIVE);
+ private static final Pattern INDEPENDENT_URL_PATTERN_WITH_ENDING_PATH = Pattern.compile("[^:]+://(?>[.a-z]+/?)+/ending-path");
+ private static final Pattern INDEPENDENT_URL_PATTERN_WITH_ENDING_PATH_AND_BACKTRACKING = Pattern.compile("[^:]+://(?>(?:[.a-z]+/?)+/)ending-path");
+
+ @Test
+ void givenSimpleUrlPattern_whenValidUrlProvided_thenMatches() {
+ Matcher urlMatcher = SIMPLE_URL_PATTERN.matcher("http://www.microsoft.com/");
+
+ Assertions.assertThat(urlMatcher.matches()).isTrue();
+ Assertions.assertThatThrownBy(() -> urlMatcher.group(1)).isInstanceOf(IndexOutOfBoundsException.class);
+ }
+
+ @Test
+ void whenSimpleUrlProvidedWithPathProvided_thenMatches() {
+ Matcher urlMatcher = SIMPLE_URL_PATTERN.matcher("http://www.microsoft.com/live");
+
+ Assertions.assertThat(urlMatcher.matches()).isTrue();
+ }
+
+ @Test
+ void whenSimpleUrlProvidedWithPathEndingWithSlashProvided_thenMatches() {
+ Matcher urlMatcher = SIMPLE_URL_PATTERN.matcher("http://www.microsoft.com/live/");
+
+ Assertions.assertThat(urlMatcher.matches()).isTrue();
+ }
+
+ @Test
+ void givenSimpleUrlPattern_whenUrlWithMultiplePathSegmentsProvided_thenMatches() {
+ Matcher urlMatcher = SIMPLE_URL_PATTERN.matcher("http://www.microsoft.com/some/other/url/path");
+
+ Assertions.assertThat(urlMatcher.matches()).isTrue();
+ }
+
+ @Test
+ void whenUrlWithUppercaseCharactersProvided_thenDoesNotMatch() {
+ Matcher urlMatcher = SIMPLE_URL_PATTERN.matcher("http://www.Microsoft.com/");
+
+ Assertions.assertThat(urlMatcher.matches()).isFalse();
+ }
+
+ @Test
+ void givenPatternWithCaseInsensitiveGroup_whenUrlHasUppercaseCharactersInsideOfScope_thenMatches() {
+ Matcher urlMatcher = SCOPED_CASE_INSENSITIVE_URL_PATTERN.matcher("http://www.Microsoft.com/");
+
+ Assertions.assertThat(urlMatcher.matches()).isTrue();
+ }
+
+ @Test
+ void givenCaseInsensitivePattern_whenUrlHasUppercaseCharacters_thenMatches() {
+ Matcher urlMatcher = CASE_INSENSITIVE_URL_PATTERN.matcher("http://www.Microsoft.com/Ending-path");
+
+ Assertions.assertThat(urlMatcher.matches()).isTrue();
+ Assertions.assertThat(urlMatcher.group(1)).isEqualTo("/Ending-path");
+ }
+
+ @Test
+ void givenPatternWithCaseInsensitiveGroup_whenUrlHasUppercaseCharactersOutsideOfScope_thenMatchFails() {
+ Matcher urlMatcher = SCOPED_CASE_INSENSTIIVE_URL_PATTERN_WITH_ENDING_PATH.matcher("http://www.Microsoft.com/Ending-path");
+
+ Assertions.assertThat(urlMatcher.matches()).isFalse();
+ }
+
+ @Test
+ void givenPatternAllowingBacktracking_whenUrlWithEndingPathCausingBacktrackingProvided_thenMatches() {
+ Matcher urlMatcher = SIMPLE_URL_PATTERN_WITH_SPECIFIC_ENDING_PATH.matcher("http://www.microsoft.com/ending-path");
+
+ Assertions.assertThat(urlMatcher.matches()).isTrue();
+ }
+
+ @Test
+ void givenPatternWithIndependentNonCapturingGroup_whenBacktrackingOccurs_thenDoesNotMatch() {
+ Matcher independentMatcher = INDEPENDENT_URL_PATTERN_WITH_ENDING_PATH.matcher("http://www.microsoft.com/ending-path");
+
+ Assertions.assertThat(independentMatcher.matches()).isFalse();
+ }
+
+ @Test
+ void givenPatternWithIndependentNonCapturingGroup_whenBacktrackingDoesNotOccur_thenMatches() {
+ Matcher independentMatcher = INDEPENDENT_URL_PATTERN_WITH_ENDING_PATH.matcher("http://www.microsoft.com//ending-path");
+
+ Assertions.assertThat(independentMatcher.matches()).isTrue();
+ }
+
+ @Test
+ void givenPatternWithIndependentNonCapturingGroup_whenBacktrackingOccursInsideGroup_thenMatches() {
+ Matcher independentMatcher = INDEPENDENT_URL_PATTERN_WITH_ENDING_PATH_AND_BACKTRACKING.matcher("http://www.microsoft.com/ending-path");
+
+ Assertions.assertThat(independentMatcher.matches()).isTrue();
+ }
+
+ @Test
+ void givenCaseInsensitivePatternWithCaseSensitivieSubPattern_whenUrlWithUppercaseCharactersOutsideOfScopeProvided_thenMatches() {
+ Matcher urlMatcher = SCOPED_CASE_SENSITIVE_URL_PATTERN.matcher("http://www.microsoft.com/ENDING-PATH");
+
+ Assertions.assertThat(urlMatcher.matches()).isTrue();
+ }
+
+ @Test
+ void givenCaseInsensitivePatternWithCaseSensitivieSubPattern_whenUrlWithUppercaseCharactersInsideOfScopeProvided_thenDoesNotMatch() {
+ Matcher urlMatcher = SCOPED_CASE_SENSITIVE_URL_PATTERN.matcher("http://www.Microsoft.com/ending-path");
+
+ Assertions.assertThat(urlMatcher.matches()).isFalse();
+ }
+}
diff --git a/core-java-modules/core-java-regex/README.md b/core-java-modules/core-java-regex/README.md
index 92321fa656..4c78f64d75 100644
--- a/core-java-modules/core-java-regex/README.md
+++ b/core-java-modules/core-java-regex/README.md
@@ -13,3 +13,5 @@
- [Regular Expressions \s and \s+ in Java](https://www.baeldung.com/java-regex-s-splus)
- [Validate Phone Numbers With Java Regex](https://www.baeldung.com/java-regex-validate-phone-numbers)
- [How to Count the Number of Matches for a Regex?](https://www.baeldung.com/java-count-regex-matches)
+- [Find All Numbers in a String in Java](https://www.baeldung.com/java-find-numbers-in-string)
+- [Understanding the Pattern.quote Method](https://www.baeldung.com/java-pattern-quote)
diff --git a/core-java-modules/core-java-regex/pom.xml b/core-java-modules/core-java-regex/pom.xml
index f26218877c..fc8c1a8385 100644
--- a/core-java-modules/core-java-regex/pom.xml
+++ b/core-java-modules/core-java-regex/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-regexjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -48,4 +48,4 @@
3.15.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/ignore/pattern/metacharacters/IgnoringPatternMetacharactersUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/ignore/pattern/metacharacters/IgnoringPatternMetacharactersUnitTest.java
new file mode 100644
index 0000000000..8c07282716
--- /dev/null
+++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/ignore/pattern/metacharacters/IgnoringPatternMetacharactersUnitTest.java
@@ -0,0 +1,54 @@
+package com.baeldung.ignore.pattern.metacharacters;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.junit.Test;
+
+public class IgnoringPatternMetacharactersUnitTest {
+ private static final String dollarAmounts = "$100.25, $100.50, $150.50, $100.50, $100.75";
+ private static final String patternStr = "$100.50";
+
+ @Test
+ public void whenMetacharactersNotEscaped_thenNoMatchesFound() {
+ Pattern pattern = Pattern.compile(patternStr);
+ Matcher matcher = pattern.matcher(dollarAmounts);
+
+ int matches = 0;
+ while (matcher.find()) {
+ matches++;
+ }
+
+ assertEquals(0, matches);
+ }
+
+ @Test
+ public void whenMetacharactersManuallyEscaped_thenMatchingSuccessful() {
+ String metaEscapedPatternStr = "\\Q" + patternStr + "\\E";
+ Pattern pattern = Pattern.compile(metaEscapedPatternStr);
+ Matcher matcher = pattern.matcher(dollarAmounts);
+
+ int matches = 0;
+ while (matcher.find()) {
+ matches++;
+ }
+
+ assertEquals(2, matches);
+ }
+
+ @Test
+ public void whenMetacharactersEscapedUsingPatternQuote_thenMatchingSuccessful() {
+ String literalPatternStr = Pattern.quote(patternStr);
+ Pattern pattern = Pattern.compile(literalPatternStr);
+ Matcher matcher = pattern.matcher(dollarAmounts);
+
+ int matches = 0;
+ while (matcher.find()) {
+ matches++;
+ }
+
+ assertEquals(2, matches);
+ }
+}
diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/countdigits/CountDigitsUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/countdigits/CountDigitsUnitTest.java
new file mode 100644
index 0000000000..e90d2e9f26
--- /dev/null
+++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/countdigits/CountDigitsUnitTest.java
@@ -0,0 +1,77 @@
+package com.baeldung.regex.countdigits;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.junit.jupiter.api.Test;
+
+import com.google.common.base.CharMatcher;
+
+/**
+ * Unit Test to count the number of digits in a String
+ */
+class CountDigitsUnitTest {
+
+ // Guava CharMatcher to match digits
+ private static final CharMatcher DIGIT_CHAR_MATCHER = CharMatcher.inRange('0', '9');
+
+ private static final String STR_WITH_ALL_DIGITS = "970987678607608";
+ private static final String STR_WITH_SINGLE_DIGITS_SEP_BY_NON_DIGITS = "9kjl()4f*(&6~3dfd8&5dfd8a";
+ private static final String STR_WITH_SEQUENCES_OF_1_OR_MORE_DIGITS_SEP_BY_NON_DIGITS
+ = "64.6lk.l~453lkdsf9wg038.68*()(k;95786fsd7986";
+
+ private static int countDigits(String stringToSearch) {
+ Matcher countEmailMatcher = Pattern.compile("\\d").matcher(stringToSearch);
+
+ int count = 0;
+ while (countEmailMatcher.find()) {
+ count++;
+ }
+
+ return count;
+ }
+
+ @Test
+ void givenStrOfAllDigits_whenRegexMatchByDigit_thenFifteenDigitsCounted() {
+ int count = countDigits(STR_WITH_ALL_DIGITS);
+
+ assertThat(count).isEqualTo(15);
+ }
+
+ @Test
+ void givenStrWithSingleDigitsSepByNonDigits_whenRegexMatchByDigit_thenSevenDigitsCounted() {
+ int count = countDigits(STR_WITH_SINGLE_DIGITS_SEP_BY_NON_DIGITS);
+
+ assertThat(count).isEqualTo(7);
+ }
+
+ @Test
+ void givenStrWithOneOrMoreDigitsSepByNonDigits_whenRegexMatchByDigit_thenTwentyOneDigitsCounted() {
+ int count = countDigits(STR_WITH_SEQUENCES_OF_1_OR_MORE_DIGITS_SEP_BY_NON_DIGITS);
+
+ assertThat(count).isEqualTo(21);
+ }
+
+ @Test
+ void givenStrOfAllDigits_whenGuavaCharMatchByDigit_thenFifteenDigitsCounted() {
+ int count = DIGIT_CHAR_MATCHER.countIn(STR_WITH_ALL_DIGITS);
+
+ assertThat(count).isEqualTo(15);
+ }
+
+ @Test
+ void givenStrWithSingleDigitsSepByNonDigits_whenGuavaCharMatchByDigit_thenSevenDigitsCounted() {
+ int count = DIGIT_CHAR_MATCHER.countIn(STR_WITH_SINGLE_DIGITS_SEP_BY_NON_DIGITS);
+
+ assertThat(count).isEqualTo(7);
+ }
+
+ @Test
+ void givenStrWithOneOrMoreDigitsSepByNonDigits_whenGuavaCharMatchByDigit_thenTwentyOneDigitsCounted() {
+ int count = DIGIT_CHAR_MATCHER.countIn(STR_WITH_SEQUENCES_OF_1_OR_MORE_DIGITS_SEP_BY_NON_DIGITS);
+
+ assertThat(count).isEqualTo(21);
+ }
+}
diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/findnumbers/FindNumbersUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/findnumbers/FindNumbersUnitTest.java
new file mode 100644
index 0000000000..128a326ae2
--- /dev/null
+++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/findnumbers/FindNumbersUnitTest.java
@@ -0,0 +1,128 @@
+package com.baeldung.regex.findnumbers;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.DoubleStream;
+import java.util.stream.LongStream;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * Unit Test to find Integers, Decimal Numbers, and Scientific Notation and Hexadecimal Numbers in a String
+ */
+class FindNumbersUnitTest {
+
+ private static List findIntegers(String stringToSearch) {
+ Pattern integerPattern = Pattern.compile("-?\\d+");
+ Matcher matcher = integerPattern.matcher(stringToSearch);
+
+ List integerList = new ArrayList<>();
+ while (matcher.find()) {
+ integerList.add(matcher.group());
+ }
+
+ return integerList;
+ }
+
+ private static List findDecimalNums(String stringToSearch) {
+ Pattern decimalNumPattern = Pattern.compile("-?\\d+(\\.\\d+)?");
+ Matcher matcher = decimalNumPattern.matcher(stringToSearch);
+
+ List decimalNumList = new ArrayList<>();
+ while (matcher.find()) {
+ decimalNumList.add(matcher.group());
+ }
+
+ return decimalNumList;
+ }
+
+ @Test
+ void givenStrOfAllDigits_whenRegexMatchByInt_thenWholeStrMatchedAsOneInt() {
+ List integersFound = findIntegers("970987678607608");
+
+ assertThat(integersFound).containsExactly("970987678607608");
+ }
+
+ @Test
+ void givenStrWithIntegersSepByPeriods_whenRegexMatchByInt_thenExpectedIntsFound() {
+ List integersFound = findIntegers("3453..5.-23532...32432.-2363.3454......345.-34.");
+
+ assertThat(integersFound).containsExactly("3453", "5", "-23532", "32432", "-2363", "3454", "345", "-34");
+ }
+
+ @Test
+ void givenStrWithIntegersSepByNonDigits_whenRegexMatchByInt_thenExpectedIntsFound() {
+ List integersFound = findIntegers("646lkl~4-53l-k34.fdsf.-ds-35.45f9wg3868*()(k;-95786fsd79-86");
+
+ assertThat(integersFound).containsExactly("646", "4", "-53", "34", "-35", "45", "9", "3868", "-95786", "79", "-86");
+ }
+
+ @Test
+ void givenStrOfAllDigits_whenRegexMatchByDecNum_thenWholeStrMatchedAsOneDecimalNumber() {
+ List decimalNumsFound = findDecimalNums("970987678607608");
+
+ assertThat(decimalNumsFound).containsExactly("970987678607608");
+ }
+
+ @Test
+ void givenStrOfDecNumsSepByNonDigits_whenRegexMatchByDecNum_thenExpectedNumsFound() {
+ List decimalNumsFound = findDecimalNums(".7854.455wo.rdy(do.g)-3.-553.00.53;good^night%o3456sdcardR%3567.4%£cat");
+
+ assertThat(decimalNumsFound).containsExactly("7854.455", "-3", "-553.00", "53", "3456", "3567.4");
+ }
+
+ @Test
+ void givenStrWithRandomDigitsDashesAndPeriods_whenRegexMatchByDecNum_thenExpectedNumsFound() {
+ List decimalNumsFound = findDecimalNums(".-..90834.345.--493-..-85.-875.345-.-.-355.345...345.-.636-5.6-3.");
+
+ assertThat(decimalNumsFound).containsExactly("90834.345", "-493", "-85", "-875.345", "-355.345", "345", "636", "-5.6", "-3");
+ }
+
+ @Test
+ void givenStrOfIntsSepByNonDigits_whenRegexMatchByInt_thenExpectedValuesFound() {
+ LongStream integerValuesFound = findIntegers(".7854.455wo.rdy(do.g)-3.ght%o34.56")
+ .stream().mapToLong(Long::valueOf);
+
+ assertThat(integerValuesFound).containsExactly(7854L, 455L, -3L, 34L, 56L);
+ }
+
+ @Test
+ void givenStrOfDecNumsSepByNonDigits_whenRegexMatchByDecNum_thenExpectedValuesFound() {
+ DoubleStream decimalNumValuesFound = findDecimalNums(".7854.455wo.rdy(do.g)-3.ght%o34.56")
+ .stream().mapToDouble(Double::valueOf);
+
+ assertThat(decimalNumValuesFound).containsExactly(7854.455, -3.0, 34.56);
+ }
+
+ @Test
+ void givenStrOfSciNotationNumsSepByNonDigits_whenRegexMatchBySciNotNum_thenExpectedNumsFound() {
+ String strToSearch = "}s1.25E-3>,/@l2e109he-70.96E+105d£d_-8.7312E-102=#;,.d919.3822e+31e]";
+
+ Matcher matcher = Pattern.compile("-?\\d+(\\.\\d+)?[eE][+-]?\\d+")
+ .matcher(strToSearch);
+ List sciNotationNums = new ArrayList<>();
+ while (matcher.find()) {
+ sciNotationNums.add(matcher.group());
+ }
+
+ assertThat(sciNotationNums).containsExactly("1.25E-3", "2e109", "-70.96E+105", "-8.7312E-102", "919.3822e+31");
+ }
+
+ @Test
+ void givenStrOfHexNumsSepByNonDigits_whenRegexMatchByHexNum_thenExpectedNumsFound() {
+ String strToSearch = "}saF851Bq-3f6Cm>,/@j-2Ad9eE>70ae19.>";
+
+ Matcher matcher = Pattern.compile("-?[0-9a-fA-F]+")
+ .matcher(strToSearch);
+ List hexNums = new ArrayList<>();
+ while (matcher.find()) {
+ hexNums.add(matcher.group());
+ }
+
+ assertThat(hexNums).containsExactly("aF851B", "-3f6C", "-2Ad9eE", "70ae19");
+ }
+}
diff --git a/core-java-modules/core-java-security-2/README.md b/core-java-modules/core-java-security-2/README.md
index 3f9520b888..684f2504cc 100644
--- a/core-java-modules/core-java-security-2/README.md
+++ b/core-java-modules/core-java-security-2/README.md
@@ -16,4 +16,5 @@ This module contains articles about core Java Security
- [Java AES Encryption and Decryption](https://www.baeldung.com/java-aes-encryption-decryption)
- [InvalidAlgorithmParameterException: Wrong IV Length](https://www.baeldung.com/java-invalidalgorithmparameter-exception)
- [The java.security.egd JVM Option](https://www.baeldung.com/java-security-egd)
+- [RSA in Java](https://www.baeldung.com/java-rsa)
- More articles: [[<-- prev]](/core-java-modules/core-java-security)
diff --git a/core-java-modules/core-java-security-2/pom.xml b/core-java-modules/core-java-security-2/pom.xml
index 895509410d..2520cee7f8 100644
--- a/core-java-modules/core-java-security-2/pom.xml
+++ b/core-java-modules/core-java-security-2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-security-2jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -16,45 +16,38 @@
-
commons-codeccommons-codec${commons-codec.version}
-
org.bouncycastlebcprov-jdk15on${bouncycastle.version}
-
-
+
org.assertjassertj-core${assertj-core.version}test
-
javax.xml.bindjaxb-api${jaxb-api.version}
-
-
-
+
1.601.11
-
3.18.02.3.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-security-2/src/test/java/com/baeldung/rsa/RsaUnitTest.java b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/rsa/RsaUnitTest.java
new file mode 100644
index 0000000000..ac93f71125
--- /dev/null
+++ b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/rsa/RsaUnitTest.java
@@ -0,0 +1,92 @@
+package com.baeldung.cipher;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import javax.crypto.Cipher;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+
+public class RsaUnitTest {
+
+ @Test
+ public void givenRsaKeyPair_whenEncryptAndDecryptString_thenCompareResults() throws Exception {
+ KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
+ generator.initialize(2048);
+ KeyPair pair = generator.generateKeyPair();
+ PrivateKey privateKey = pair.getPrivate();
+ PublicKey publicKey = pair.getPublic();
+
+ String secretMessage = "Baeldung secret message";
+ Cipher encryptCipher = Cipher.getInstance("RSA");
+ encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey);
+ byte[] secretMessageBytes = secretMessage.getBytes(StandardCharsets.UTF_8);
+ byte[] encryptedMessageBytes = encryptCipher.doFinal(secretMessageBytes);
+
+ Cipher decryptCipher = Cipher.getInstance("RSA");
+ decryptCipher.init(Cipher.DECRYPT_MODE, privateKey);
+ byte[] decryptedMessageBytes = decryptCipher.doFinal(encryptedMessageBytes);
+ String decryptedMessage = new String(decryptedMessageBytes, StandardCharsets.UTF_8);
+
+ Assertions.assertEquals(secretMessage, decryptedMessage);
+ }
+
+ @Test
+ public void givenRsaKeyPair_whenEncryptAndDecryptFile_thenCompareResults() throws Exception {
+ KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
+ generator.initialize(2048);
+ KeyPair pair = generator.generateKeyPair();
+ PrivateKey privateKey = pair.getPrivate();
+ PublicKey publicKey = pair.getPublic();
+
+ String originalContent = "some secret message";
+ Path tempFile = Files.createTempFile("temp", "txt");
+ writeString(tempFile, originalContent);
+
+ byte[] fileBytes = Files.readAllBytes(tempFile);
+ Cipher encryptCipher = Cipher.getInstance("RSA");
+ encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey);
+ byte[] encryptedFileBytes = encryptCipher.doFinal(fileBytes);
+ try (FileOutputStream stream = new FileOutputStream(tempFile.toFile())) {
+ stream.write(encryptedFileBytes);
+ }
+
+ encryptedFileBytes = Files.readAllBytes(tempFile);
+ Cipher decryptCipher = Cipher.getInstance("RSA");
+ decryptCipher.init(Cipher.DECRYPT_MODE, privateKey);
+ byte[] decryptedFileBytes = decryptCipher.doFinal(encryptedFileBytes);
+ try (FileOutputStream stream = new FileOutputStream(tempFile.toFile())) {
+ stream.write(decryptedFileBytes);
+ }
+
+ String fileContent = readString(tempFile);
+
+ Assertions.assertEquals(originalContent, fileContent);
+ }
+
+ private void writeString(Path path, String content) throws Exception {
+ try (BufferedWriter writer = Files.newBufferedWriter(path)) {
+ writer.write(content);
+ }
+ }
+
+ private String readString(Path path) throws Exception {
+ StringBuilder resultStringBuilder = new StringBuilder();
+ try (BufferedReader br = new BufferedReader(new FileReader(path.toFile()))) {
+ String line;
+ while ((line = br.readLine()) != null) {
+ resultStringBuilder.append(line);
+ }
+ }
+ return resultStringBuilder.toString();
+ }
+}
diff --git a/core-java-modules/core-java-security-3/README.md b/core-java-modules/core-java-security-3/README.md
new file mode 100644
index 0000000000..970faaac88
--- /dev/null
+++ b/core-java-modules/core-java-security-3/README.md
@@ -0,0 +1,8 @@
+## Core Java Security
+
+This module contains articles about core Java Security
+
+### Relevant Articles:
+
+- [Secret Key and String Conversion in Java](https://www.baeldung.com/java-secret-key-to-string)
+- More articles: [[<-- prev]](/core-java-modules/core-java-security-2)
diff --git a/core-java-modules/core-java-security-3/pom.xml b/core-java-modules/core-java-security-3/pom.xml
new file mode 100644
index 0000000000..2520cee7f8
--- /dev/null
+++ b/core-java-modules/core-java-security-3/pom.xml
@@ -0,0 +1,53 @@
+
+
+ 4.0.0
+ core-java-security-2
+ 0.1.0-SNAPSHOT
+ core-java-security-2
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+ ../
+
+
+
+
+ commons-codec
+ commons-codec
+ ${commons-codec.version}
+
+
+ org.bouncycastle
+ bcprov-jdk15on
+ ${bouncycastle.version}
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
+
+
+ javax.xml.bind
+ jaxb-api
+ ${jaxb-api.version}
+
+
+
+
+
+ 1.60
+ 1.11
+
+ 3.18.0
+ 2.3.1
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-security-3/src/main/java/com/baeldung/secretkeyandstringconversion/ConversionClassUtil.java b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/secretkeyandstringconversion/ConversionClassUtil.java
new file mode 100644
index 0000000000..8fdf682666
--- /dev/null
+++ b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/secretkeyandstringconversion/ConversionClassUtil.java
@@ -0,0 +1,53 @@
+package com.baeldung.secretkeyandstringconversion;
+
+import java.security.NoSuchAlgorithmException;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.KeySpec;
+import java.util.Base64;
+
+import javax.crypto.KeyGenerator;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+import javax.crypto.spec.SecretKeySpec;
+
+public class ConversionClassUtil {
+
+ /* Generating Secret key */
+
+ // Generating Secret Key using KeyGenerator class with 256
+ public static SecretKey generateKey(int n) throws NoSuchAlgorithmException {
+ KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
+ keyGenerator.init(n);
+ SecretKey originalKey = keyGenerator.generateKey();
+ return originalKey;
+ }
+
+ // Generating Secret Key using password and salt
+ public static SecretKey getKeyFromPassword(String password, String salt)
+ throws NoSuchAlgorithmException, InvalidKeySpecException {
+ SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
+ KeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), 65536, 256);
+ SecretKey originalKey = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
+ return originalKey;
+ }
+
+ /* Converting Secret key into String */
+ public static String convertSecretKeyToString(SecretKey secretKey) throws NoSuchAlgorithmException {
+ // Converting the Secret Key into byte array
+ byte[] rawData = secretKey.getEncoded();
+ // Getting String - Base64 encoded version of the Secret Key
+ String encodedKey = Base64.getEncoder().encodeToString(rawData);
+ return encodedKey;
+ }
+
+ /* Converting String into Secret key into */
+ public static SecretKey convertStringToSecretKeyto(String encodedKey) {
+ // Decoding the Base64 encoded string into byte array
+ byte[] decodedKey = Base64.getDecoder().decode(encodedKey);
+ // Rebuilding the Secret Key using SecretKeySpec Class
+ SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES");
+ return originalKey;
+ }
+
+}
diff --git a/core-java-modules/core-java-security-3/src/test/java/com/baeldung/secretkeyandstringconversion/ConversionClassUtilUnitTest.java b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/secretkeyandstringconversion/ConversionClassUtilUnitTest.java
new file mode 100644
index 0000000000..7a912dbf26
--- /dev/null
+++ b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/secretkeyandstringconversion/ConversionClassUtilUnitTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.secretkeyandstringconversion;
+
+import java.security.NoSuchAlgorithmException;
+import java.security.spec.InvalidKeySpecException;
+
+import javax.crypto.SecretKey;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class ConversionClassUtilUnitTest {
+
+ @Test
+ void givenPasswordAndSalt_whenCreateSecreKeyCheckConversion_thenSuccess()
+ throws NoSuchAlgorithmException, InvalidKeySpecException {
+ // given
+ String password = "Baeldung@2021";
+ String salt = "@$#baelDunG@#^$*";
+
+ // when
+ SecretKey encodedKey = ConversionClassUtil.getKeyFromPassword(password, salt);
+ String encodedString = ConversionClassUtil.convertSecretKeyToString(encodedKey);
+ SecretKey decodeKey = ConversionClassUtil.convertStringToSecretKeyto(encodedString);
+
+ // then
+ Assertions.assertEquals(encodedKey, decodeKey);
+ }
+
+ @Test
+ void givenSize_whenCreateSecreKeyCheckConversion_thenSuccess()
+ throws NoSuchAlgorithmException, InvalidKeySpecException {
+ // given
+ int size = 256;
+
+ // when
+ SecretKey encodedKey = ConversionClassUtil.generateKey(size);
+ String encodedString = ConversionClassUtil.convertSecretKeyToString(encodedKey);
+ SecretKey decodeKey = ConversionClassUtil.convertStringToSecretKeyto(encodedString);
+
+ // then
+ Assertions.assertEquals(encodedKey, decodeKey);
+ }
+
+}
diff --git a/core-java-modules/core-java-security/pom.xml b/core-java-modules/core-java-security/pom.xml
index 8ad120c8fc..7b49d08a37 100644
--- a/core-java-modules/core-java-security/pom.xml
+++ b/core-java-modules/core-java-security/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-securityjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -30,4 +30,4 @@
3.10.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams-2/pom.xml b/core-java-modules/core-java-streams-2/pom.xml
index 2a0a4348b0..f875e910db 100644
--- a/core-java-modules/core-java-streams-2/pom.xml
+++ b/core-java-modules/core-java-streams-2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
1.0core-java-streams-2jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -47,7 +47,6 @@
- UTF-81.91.93.11.1
diff --git a/core-java-modules/core-java-streams-3/README.md b/core-java-modules/core-java-streams-3/README.md
index 9adde005e6..48ebf145d2 100644
--- a/core-java-modules/core-java-streams-3/README.md
+++ b/core-java-modules/core-java-streams-3/README.md
@@ -10,4 +10,7 @@ This module contains articles about the Stream API in Java.
- [Debugging Java 8 Streams with IntelliJ](https://www.baeldung.com/intellij-debugging-java-streams)
- [Add BigDecimals using the Stream API](https://www.baeldung.com/java-stream-add-bigdecimals)
- [Should We Close a Java Stream?](https://www.baeldung.com/java-stream-close)
+- [Returning Stream vs. Collection](https://www.baeldung.com/java-return-stream-collection)
+- [Convert a Java Enumeration Into a Stream](https://www.baeldung.com/java-enumeration-to-stream)
+- [When to Use a Parallel Stream in Java](https://www.baeldung.com/java-when-to-use-parallel-stream)
- More articles: [[<-- prev>]](/../core-java-streams-2)
diff --git a/core-java-modules/core-java-streams-3/pom.xml b/core-java-modules/core-java-streams-3/pom.xml
index cbb7366a7d..01b83f229a 100644
--- a/core-java-modules/core-java-streams-3/pom.xml
+++ b/core-java-modules/core-java-streams-3/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-streams-3jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -27,6 +27,17 @@
${lombok.version}provided
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh.version}
+ test
+ org.assertj
@@ -44,13 +55,30 @@
true
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh.version}
+
+
+
+
+
+ 1.18.203.6.1
-
- 2.22.1
+ 1.29
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/conversion/EnumerationSpliterator.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/conversion/EnumerationSpliterator.java
new file mode 100644
index 0000000000..5227fcb6c4
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/conversion/EnumerationSpliterator.java
@@ -0,0 +1,30 @@
+package com.baeldung.streams.conversion;
+
+import java.util.Enumeration;
+import java.util.Spliterators.AbstractSpliterator;
+import java.util.function.Consumer;
+
+public class EnumerationSpliterator extends AbstractSpliterator {
+
+ private final Enumeration enumeration;
+
+ public EnumerationSpliterator(long est, int additionalCharacteristics, Enumeration enumeration) {
+ super(est, additionalCharacteristics);
+ this.enumeration = enumeration;
+ }
+
+ @Override
+ public boolean tryAdvance(Consumer super T> action) {
+ if (enumeration.hasMoreElements()) {
+ action.accept(enumeration.nextElement());
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void forEachRemaining(Consumer super T> action) {
+ while (enumeration.hasMoreElements())
+ action.accept(enumeration.nextElement());
+ }
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/conversion/EnumerationStreamConversion.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/conversion/EnumerationStreamConversion.java
new file mode 100644
index 0000000000..cf041b9426
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/conversion/EnumerationStreamConversion.java
@@ -0,0 +1,16 @@
+package com.baeldung.streams.conversion;
+
+import java.util.Enumeration;
+import java.util.Spliterator;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+
+public class EnumerationStreamConversion {
+
+ public static Stream convert(Enumeration enumeration) {
+ EnumerationSpliterator spliterator = new EnumerationSpliterator(Long.MAX_VALUE, Spliterator.ORDERED, enumeration);
+ Stream stream = StreamSupport.stream(spliterator, false);
+
+ return stream;
+ }
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/BenchmarkRunner.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/BenchmarkRunner.java
new file mode 100644
index 0000000000..461d728ad0
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/BenchmarkRunner.java
@@ -0,0 +1,9 @@
+package com.baeldung.streams.parallel;
+
+public class BenchmarkRunner {
+
+ public static void main(String[] args) throws Exception {
+ org.openjdk.jmh.Main.main(args);
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/DifferentSourceSplitting.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/DifferentSourceSplitting.java
new file mode 100644
index 0000000000..9ad569df30
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/DifferentSourceSplitting.java
@@ -0,0 +1,54 @@
+package com.baeldung.streams.parallel;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.IntStream;
+
+public class DifferentSourceSplitting {
+
+ private static final List arrayListOfNumbers = new ArrayList<>();
+ private static final List linkedListOfNumbers = new LinkedList<>();
+
+ static {
+ IntStream.rangeClosed(1, 1_000_000).forEach(i -> {
+ arrayListOfNumbers.add(i);
+ linkedListOfNumbers.add(i);
+ });
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void differentSourceArrayListSequential() {
+ arrayListOfNumbers.stream().reduce(0, Integer::sum);
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void differentSourceArrayListParallel() {
+ arrayListOfNumbers.parallelStream().reduce(0, Integer::sum);
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void differentSourceLinkedListSequential() {
+ linkedListOfNumbers.stream().reduce(0, Integer::sum);
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void differentSourceLinkedListParallel() {
+ linkedListOfNumbers.parallelStream().reduce(0, Integer::sum);
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MemoryLocalityCosts.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MemoryLocalityCosts.java
new file mode 100644
index 0000000000..bc5cbf491b
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MemoryLocalityCosts.java
@@ -0,0 +1,52 @@
+package com.baeldung.streams.parallel;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.IntStream;
+
+public class MemoryLocalityCosts {
+
+ private static final int[] intArray = new int[1_000_000];
+ private static final Integer[] integerArray = new Integer[1_000_000];
+
+ static {
+ IntStream.rangeClosed(1, 1_000_000).forEach(i -> {
+ intArray[i-1] = i;
+ integerArray[i-1] = i;
+ });
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void localityIntArraySequential() {
+ Arrays.stream(intArray).reduce(0, Integer::sum);
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void localityIntArrayParallel() {
+ Arrays.stream(intArray).parallel().reduce(0, Integer::sum);
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void localityIntegerArraySequential() {
+ Arrays.stream(integerArray).reduce(0, Integer::sum);
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void localityIntegerArrayParallel() {
+ Arrays.stream(integerArray).parallel().reduce(0, Integer::sum);
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MergingCosts.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MergingCosts.java
new file mode 100644
index 0000000000..a9919dbe72
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MergingCosts.java
@@ -0,0 +1,52 @@
+package com.baeldung.streams.parallel;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+public class MergingCosts {
+
+ private static final List arrayListOfNumbers = new ArrayList<>();
+
+ static {
+ IntStream.rangeClosed(1, 1_000_000).forEach(i -> {
+ arrayListOfNumbers.add(i);
+ });
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void mergingCostsSumSequential() {
+ arrayListOfNumbers.stream().reduce(0, Integer::sum);
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void mergingCostsSumParallel() {
+ arrayListOfNumbers.stream().parallel().reduce(0, Integer::sum);
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void mergingCostsGroupingSequential() {
+ arrayListOfNumbers.stream().collect(Collectors.toSet());
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void mergingCostsGroupingParallel() {
+ arrayListOfNumbers.stream().parallel().collect(Collectors.toSet());
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/ParallelStream.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/ParallelStream.java
new file mode 100644
index 0000000000..f236f418e8
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/ParallelStream.java
@@ -0,0 +1,15 @@
+package com.baeldung.streams.parallel;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class ParallelStream {
+
+ public static void main(String[] args) {
+ List listOfNumbers = Arrays.asList(1, 2, 3, 4);
+ listOfNumbers.parallelStream().forEach(number ->
+ System.out.println(number + " " + Thread.currentThread().getName())
+ );
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SequentialStream.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SequentialStream.java
new file mode 100644
index 0000000000..01379130fa
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SequentialStream.java
@@ -0,0 +1,15 @@
+package com.baeldung.streams.parallel;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class SequentialStream {
+
+ public static void main(String[] args) {
+ List listOfNumbers = Arrays.asList(1, 2, 3, 4);
+ listOfNumbers.stream().forEach(number ->
+ System.out.println(number + " " + Thread.currentThread().getName())
+ );
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SplittingCosts.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SplittingCosts.java
new file mode 100644
index 0000000000..d1e878df1f
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SplittingCosts.java
@@ -0,0 +1,27 @@
+package com.baeldung.streams.parallel;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+
+import java.util.concurrent.TimeUnit;
+import java.util.stream.IntStream;
+
+public class SplittingCosts {
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void sourceSplittingIntStreamSequential() {
+ IntStream.rangeClosed(1, 100).reduce(0, Integer::sum);
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void sourceSplittingIntStreamParallel() {
+ IntStream.rangeClosed(1, 100).parallel().reduce(0, Integer::sum);
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/conversion/EnumerationStreamConversionUnitTest.java b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/conversion/EnumerationStreamConversionUnitTest.java
new file mode 100644
index 0000000000..a075312fb5
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/conversion/EnumerationStreamConversionUnitTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.streams.conversion;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Vector;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.junit.Assert;
+import org.junit.jupiter.api.Test;
+
+public class EnumerationStreamConversionUnitTest {
+
+ @Test
+ public void givenEnumeration_whenConvertedToStream_thenNotNull() {
+ Vector input = new Vector<>(Arrays.asList(1, 2, 3, 4, 5));
+
+ Stream resultingStream = EnumerationStreamConversion.convert(input.elements());
+
+ Assert.assertNotNull(resultingStream);
+ }
+
+ @Test
+ public void whenConvertedToList_thenCorrect() {
+ Vector input = new Vector<>(Arrays.asList(1, 2, 3, 4, 5));
+
+ Stream stream = EnumerationStreamConversion.convert(input.elements());
+ List list = stream.filter(e -> e >= 3)
+ .collect(Collectors.toList());
+ assertThat(list, contains(3, 4, 5));
+ }
+}
diff --git a/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/parallel/ForkJoinUnitTest.java b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/parallel/ForkJoinUnitTest.java
new file mode 100644
index 0000000000..f9aab8ed6c
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/parallel/ForkJoinUnitTest.java
@@ -0,0 +1,46 @@
+package com.baeldung.streams.parallel;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ForkJoinPool;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class ForkJoinUnitTest {
+
+ @Test
+ void givenSequentialStreamOfNumbers_whenReducingSumWithIdentityFive_thenResultIsCorrect() {
+ List listOfNumbers = Arrays.asList(1, 2, 3, 4);
+ int sum = listOfNumbers.stream().reduce(5, Integer::sum);
+ assertThat(sum).isEqualTo(15);
+ }
+
+ @Test
+ void givenParallelStreamOfNumbers_whenReducingSumWithIdentityFive_thenResultIsNotCorrect() {
+ List listOfNumbers = Arrays.asList(1, 2, 3, 4);
+ int sum = listOfNumbers.parallelStream().reduce(5, Integer::sum);
+ assertThat(sum).isNotEqualTo(15);
+ }
+
+ @Test
+ void givenParallelStreamOfNumbers_whenReducingSumWithIdentityZero_thenResultIsCorrect() {
+ List listOfNumbers = Arrays.asList(1, 2, 3, 4);
+ int sum = listOfNumbers.parallelStream().reduce(0, Integer::sum) + 5;
+ assertThat(sum).isEqualTo(15);
+ }
+
+ @Test
+ public void givenParallelStreamOfNumbers_whenUsingCustomThreadPool_thenResultIsCorrect()
+ throws InterruptedException, ExecutionException {
+ List listOfNumbers = Arrays.asList(1, 2, 3, 4);
+ ForkJoinPool customThreadPool = new ForkJoinPool(4);
+ int sum = customThreadPool.submit(
+ () -> listOfNumbers.parallelStream().reduce(0, Integer::sum)).get();
+ customThreadPool.shutdown();
+ assertThat(sum).isEqualTo(10);
+ }
+
+}
diff --git a/core-java-modules/core-java-streams/pom.xml b/core-java-modules/core-java-streams/pom.xml
index f713fe7499..f02ba1c69a 100644
--- a/core-java-modules/core-java-streams/pom.xml
+++ b/core-java-modules/core-java-streams/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-streamsjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -121,4 +121,4 @@
1.8
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-algorithms-2/pom.xml b/core-java-modules/core-java-string-algorithms-2/pom.xml
index 2a84cebb4c..e263c1c79c 100644
--- a/core-java-modules/core-java-string-algorithms-2/pom.xml
+++ b/core-java-modules/core-java-string-algorithms-2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-string-algorithms-2jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -34,7 +34,7 @@
org.openjdk.jmhjmh-generator-annprocess
- ${jmh-core.version}
+ ${jmh-generator.version}org.assertj
@@ -65,4 +65,4 @@
1.2
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-algorithms-3/pom.xml b/core-java-modules/core-java-string-algorithms-3/pom.xml
index 610956588e..1048b796bc 100644
--- a/core-java-modules/core-java-string-algorithms-3/pom.xml
+++ b/core-java-modules/core-java-string-algorithms-3/pom.xml
@@ -1,5 +1,4 @@
-4.0.0
@@ -7,6 +6,7 @@
0.1.0-SNAPSHOTjarcore-java-string-algorithms-3
+
com.baeldung.core-java-modulescore-java-modules
@@ -43,7 +43,6 @@
true
-
org.apache.maven.plugins
@@ -63,4 +62,4 @@
28.1-jre
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-algorithms/pom.xml b/core-java-modules/core-java-string-algorithms/pom.xml
index 6ba9ae7bb3..0ad9ec4c66 100644
--- a/core-java-modules/core-java-string-algorithms/pom.xml
+++ b/core-java-modules/core-java-string-algorithms/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-string-algorithmsjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -39,7 +39,7 @@
org.openjdk.jmhjmh-generator-annprocess
- ${jmh-core.version}
+ ${jmh-generator.version}com.vdurmont
@@ -71,4 +71,4 @@
4.0.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-apis/pom.xml b/core-java-modules/core-java-string-apis/pom.xml
index 449092bacb..b09d59fc10 100644
--- a/core-java-modules/core-java-string-apis/pom.xml
+++ b/core-java-modules/core-java-string-apis/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-string-apisjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -54,4 +54,4 @@
1.4
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-conversions-2/README.md b/core-java-modules/core-java-string-conversions-2/README.md
index afdd7e5760..3bd3ba927e 100644
--- a/core-java-modules/core-java-string-conversions-2/README.md
+++ b/core-java-modules/core-java-string-conversions-2/README.md
@@ -6,4 +6,5 @@ This module contains articles about string conversions from/to another type.
- [Java String Conversions](https://www.baeldung.com/java-string-conversions)
- [Convert String to Byte Array and Reverse in Java](https://www.baeldung.com/java-string-to-byte-array)
- [Convert Character Array to String in Java](https://www.baeldung.com/java-char-array-to-string)
+- [Converting String to BigDecimal in Java](https://www.baeldung.com/java-string-to-bigdecimal)
- More articles: [[<-- prev]](/core-java-string-conversions)
diff --git a/core-java-modules/core-java-string-conversions-2/pom.xml b/core-java-modules/core-java-string-conversions-2/pom.xml
index cd7381d822..8a222a6b5d 100644
--- a/core-java-modules/core-java-string-conversions-2/pom.xml
+++ b/core-java-modules/core-java-string-conversions-2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-string-conversions-2jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -45,4 +45,4 @@
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/stringtobigdecimal/StringToBigDecimalConversionUnitTest.java b/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/stringtobigdecimal/StringToBigDecimalConversionUnitTest.java
new file mode 100644
index 0000000000..cd8ef6c70f
--- /dev/null
+++ b/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/stringtobigdecimal/StringToBigDecimalConversionUnitTest.java
@@ -0,0 +1,74 @@
+package com.baeldung.stringtobigdecimal;
+
+import static org.junit.Assert.assertEquals;
+
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.text.ParseException;
+
+import org.junit.Test;
+
+public class StringToBigDecimalConversionUnitTest {
+
+ @Test
+ public void givenValidString_WhenBigDecimalObjectWithStringParameter_ThenResultIsDecimalObject() {
+ BigDecimal bigDecimal = new BigDecimal("123");
+ assertEquals(new BigDecimal(123), bigDecimal);
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void givenNullString_WhenBigDecimalObjectWithStringParameter_ThenNullPointerExceptionIsThrown() {
+ String bigDecimal = null;
+ new BigDecimal(bigDecimal);
+ }
+
+ @Test(expected = NumberFormatException.class)
+ public void givenInalidString_WhenBigDecimalObjectWithStringParameter_ThenNumberFormatExceptionIsThrown() {
+ new BigDecimal("&");
+ }
+
+ @Test
+ public void givenValidString_WhenValueOfDoubleFromString_ThenResultIsDecimalObject() {
+ BigDecimal bigDecimal = BigDecimal.valueOf(Double.valueOf("123.42"));
+ assertEquals(new BigDecimal(123.42).setScale(2, BigDecimal.ROUND_HALF_UP), bigDecimal);
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void givenNullString_WhenValueOfDoubleFromString_ThenNullPointerExceptionIsThrown() {
+ BigDecimal.valueOf(Double.valueOf(null));
+ }
+
+ @Test(expected = NumberFormatException.class)
+ public void givenInalidString_WhenValueOfDoubleFromString_ThenNumberFormatExceptionIsThrown() {
+ BigDecimal.valueOf(Double.valueOf("&"));
+ }
+
+ @Test
+ public void givenValidString_WhenDecimalFormatOfString_ThenResultIsDecimalObject() throws ParseException {
+ BigDecimal bigDecimal = new BigDecimal(10692467440017.111).setScale(3, BigDecimal.ROUND_HALF_UP);
+
+ DecimalFormatSymbols symbols = new DecimalFormatSymbols();
+ symbols.setGroupingSeparator(',');
+ symbols.setDecimalSeparator('.');
+ String pattern = "#,##0.0#";
+ DecimalFormat decimalFormat = new DecimalFormat(pattern, symbols);
+ decimalFormat.setParseBigDecimal(true);
+
+ // parse the string value
+ BigDecimal parsedStringValue = (BigDecimal) decimalFormat.parse("10,692,467,440,017.111");
+
+ assertEquals(bigDecimal, parsedStringValue);
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void givenNullString_WhenDecimalFormatOfString_ThenNullPointerExceptionIsThrown() throws ParseException {
+ new DecimalFormat("#").parse(null);
+ }
+
+ @Test(expected = ParseException.class)
+ public void givenInalidString_WhenDecimalFormatOfString_ThenNumberFormatExceptionIsThrown() throws ParseException {
+ new DecimalFormat("#").parse("&");
+ }
+
+}
diff --git a/core-java-modules/core-java-string-conversions/pom.xml b/core-java-modules/core-java-string-conversions/pom.xml
index 7d8977d2a5..ccbeb69768 100644
--- a/core-java-modules/core-java-string-conversions/pom.xml
+++ b/core-java-modules/core-java-string-conversions/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-string-conversionsjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -66,4 +66,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-operations-2/pom.xml b/core-java-modules/core-java-string-operations-2/pom.xml
index 5865d9a776..b7187d2fdf 100644
--- a/core-java-modules/core-java-string-operations-2/pom.xml
+++ b/core-java-modules/core-java-string-operations-2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-string-operations-2jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -57,7 +57,6 @@
jmh-core${jmh-core.version}
-
org.openjdk.jmhjmh-generator-annprocess
@@ -68,7 +67,6 @@
commons-codec${commons-codec.version}
-
org.assertjassertj-core
@@ -92,7 +90,8 @@
-
+ org.openjdk.jmh.Main
@@ -119,4 +118,4 @@
1.14
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-operations-3/README.md b/core-java-modules/core-java-string-operations-3/README.md
index 7f391ee056..ad4ada3a68 100644
--- a/core-java-modules/core-java-string-operations-3/README.md
+++ b/core-java-modules/core-java-string-operations-3/README.md
@@ -2,3 +2,5 @@
- [Version Comparison in Java](https://www.baeldung.com/java-comparing-versions)
- [Java (String) or .toString()?](https://www.baeldung.com/java-string-casting-vs-tostring)
+- [Split Java String by Newline](https://www.baeldung.com/java-string-split-by-newline)
+- [Split a String in Java and Keep the Delimiters](https://www.baeldung.com/java-split-string-keep-delimiters)
diff --git a/core-java-modules/core-java-string-operations-3/pom.xml b/core-java-modules/core-java-string-operations-3/pom.xml
index 5edff0e090..00b37d2899 100644
--- a/core-java-modules/core-java-string-operations-3/pom.xml
+++ b/core-java-modules/core-java-string-operations-3/pom.xml
@@ -1,13 +1,14 @@
-4.0.0core-java-string-operations-30.1.0-SNAPSHOT
+
core-java-string-operations-3jar
+
com.baeldung.core-java-modulescore-java-modules
@@ -44,7 +45,22 @@
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+
+
+
+
+
+ 11
+ 113.6.13.6.36.1.1
@@ -52,10 +68,10 @@
3.1.0
-
-
- gradle-repo
- https://repo.gradle.org/gradle/libs-releases-local/
-
-
-
+
+
+ gradle-repo
+ https://repo.gradle.org/gradle/libs-releases-local/
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/splitkeepdelimiters/SplitAndKeepDelimitersUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/splitkeepdelimiters/SplitAndKeepDelimitersUnitTest.java
new file mode 100644
index 0000000000..ede8be4c05
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/splitkeepdelimiters/SplitAndKeepDelimitersUnitTest.java
@@ -0,0 +1,59 @@
+package com.baeldung.splitkeepdelimiters;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.Test;
+
+import com.google.common.base.Splitter;
+
+public class SplitAndKeepDelimitersUnitTest {
+
+ private final String positivelookAheadRegex = "((?=@))";
+ private final String positivelookBehindRegex = "((?<=@))";
+ private final String positivelookAroundRegex = "((?=@)|(?<=@))";
+ private final String positiveLookAroundMultiDelimiterRegex = "((?=:|#|@)|(?<=:|#|@))";
+
+ private String text = "Hello@World@This@Is@A@Java@Program";
+ private String textMixed = "@HelloWorld@This:Is@A#Java#Program";
+ private String textMixed2 = "pg@no;10@hello;world@this;is@a#10words;Java#Program";
+
+ @Test
+ public void givenString_splitAndKeepDelimiters_using_javaLangString() {
+
+ assertThat(text.split(positivelookAheadRegex)).containsExactly("Hello", "@World", "@This", "@Is", "@A", "@Java", "@Program");
+
+ assertThat(text.split(positivelookBehindRegex)).containsExactly("Hello@", "World@", "This@", "Is@", "A@", "Java@", "Program");
+
+ assertThat(text.split(positivelookAroundRegex)).containsExactly("Hello", "@", "World", "@", "This", "@", "Is", "@", "A", "@", "Java", "@", "Program");
+
+ assertThat(textMixed.split(positiveLookAroundMultiDelimiterRegex)).containsExactly("@", "HelloWorld", "@", "This", ":", "Is", "@", "A", "#", "Java", "#", "Program");
+
+ }
+
+ @Test
+ public void givenString_splitAndKeepDelimiters_using_ApacheCommonsLang3StringUtils() {
+
+ assertThat(StringUtils.splitByCharacterType(textMixed2)).containsExactly("pg", "@", "no", ";", "10", "@", "hello", ";", "world", "@", "this", ";", "is", "@", "a", "#", "10", "words", ";", "J", "ava", "#", "P", "rogram");
+
+ }
+
+ @Test
+ public void givenString_splitAndKeepDelimiters_using_GuavaSplitter() {
+
+ assertThat(Splitter.onPattern(positivelookAroundRegex)
+ .splitToList(text)).containsExactly("Hello", "@", "World", "@", "This", "@", "Is", "@", "A", "@", "Java", "@", "Program");
+
+ assertThat(Splitter.on(Pattern.compile(positivelookAroundRegex))
+ .splitToList(text)).containsExactly("Hello", "@", "World", "@", "This", "@", "Is", "@", "A", "@", "Java", "@", "Program");
+
+ assertThat(Splitter.onPattern(positiveLookAroundMultiDelimiterRegex)
+ .splitToList(textMixed)).containsExactly("@", "HelloWorld", "@", "This", ":", "Is", "@", "A", "#", "Java", "#", "Program");
+
+ assertThat(Splitter.on(Pattern.compile(positiveLookAroundMultiDelimiterRegex))
+ .splitToList(textMixed)).containsExactly("@", "HelloWorld", "@", "This", ":", "Is", "@", "A", "#", "Java", "#", "Program");
+
+ }
+}
diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/splitstringbynewline/SplitStringByNewLineUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/splitstringbynewline/SplitStringByNewLineUnitTest.java
new file mode 100644
index 0000000000..2e6613b0be
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/splitstringbynewline/SplitStringByNewLineUnitTest.java
@@ -0,0 +1,49 @@
+package com.baeldung.splitstringbynewline;
+
+import org.junit.Test;
+
+import java.util.regex.Pattern;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class SplitStringByNewLineUnitTest {
+
+ @Test
+ public void givenString_whenSplitByNewLineUsingSystemLineSeparator_thenReturnsArray() {
+ assertThat("Line1\nLine2\nLine3".split(System.lineSeparator())).containsExactly("Line1", "Line2", "Line3");
+ }
+
+ @Test
+ public void givenString_whenSplitByNewLineUsingRegularExpressionPattern_thenReturnsArray() {
+ assertThat("Line1\nLine2\nLine3".split("\\r?\\n|\\r")).containsExactly("Line1", "Line2", "Line3");
+
+ assertThat("Line1\rLine2\rLine3".split("\\r?\\n|\\r")).containsExactly("Line1", "Line2", "Line3");
+
+ assertThat("Line1\r\nLine2\r\nLine3".split("\\r?\\n|\\r")).containsExactly("Line1", "Line2", "Line3");
+ }
+
+ @Test
+ public void givenString_whenSplitByNewLineUsingJava8Pattern_thenReturnsArray() {
+ assertThat("Line1\nLine2\nLine3".split("\\R")).containsExactly("Line1", "Line2", "Line3");
+
+ assertThat("Line1\rLine2\rLine3".split("\\R")).containsExactly("Line1", "Line2", "Line3");
+
+ assertThat("Line1\r\nLine2\r\nLine3".split("\\R")).containsExactly("Line1", "Line2", "Line3");
+ }
+
+ @Test
+ public void givenString_whenSplitByNewLineUsingJava8PatternClass_thenReturnsStream() {
+ Pattern pattern = Pattern.compile("\\R");
+
+ assertThat(pattern.splitAsStream("Line1\nLine2\nLine3")).containsExactly("Line1", "Line2", "Line3");
+
+ assertThat(pattern.splitAsStream("Line1\rLine2\rLine3")).containsExactly("Line1", "Line2", "Line3");
+
+ assertThat(pattern.splitAsStream("Line1\r\nLine2\r\nLine3")).containsExactly("Line1", "Line2", "Line3");
+ }
+
+ @Test
+ public void givenString_whenSplitByNewLineUsingJava11Lines_thenReturnsStream() {
+ assertThat("Line1\nLine2\rLine3\r\nLine4".lines()).containsExactly("Line1", "Line2", "Line3", "Line4");
+ }
+}
diff --git a/core-java-modules/core-java-string-operations/pom.xml b/core-java-modules/core-java-string-operations/pom.xml
index 9632988392..a7f75f37e2 100644
--- a/core-java-modules/core-java-string-operations/pom.xml
+++ b/core-java-modules/core-java-string-operations/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-string-operationsjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -64,4 +64,4 @@
1.10
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-strings/pom.xml b/core-java-modules/core-java-strings/pom.xml
index b09dc3f8a4..aca0bb3346 100644
--- a/core-java-modules/core-java-strings/pom.xml
+++ b/core-java-modules/core-java-strings/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-stringsjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -57,6 +57,7 @@
3.6.161.1
+ 15
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-strings/src/main/java/com/baeldung/multiline/MultiLineString.java b/core-java-modules/core-java-strings/src/main/java/com/baeldung/multiline/MultiLineString.java
index 987bc751cd..5d333799c4 100644
--- a/core-java-modules/core-java-strings/src/main/java/com/baeldung/multiline/MultiLineString.java
+++ b/core-java-modules/core-java-strings/src/main/java/com/baeldung/multiline/MultiLineString.java
@@ -64,4 +64,11 @@ public class MultiLineString {
return new String(Files.readAllBytes(Paths.get("src/main/resources/stephenking.txt")));
}
+ public String textBlocks() {
+ return """
+ Get busy living
+ or
+ get busy dying.
+ --Stephen King""";
+ }
}
diff --git a/core-java-modules/core-java-strings/src/test/java/com/baeldung/multiline/MultiLineStringUnitTest.java b/core-java-modules/core-java-strings/src/test/java/com/baeldung/multiline/MultiLineStringUnitTest.java
index 04d318c71b..66bc0a655b 100644
--- a/core-java-modules/core-java-strings/src/test/java/com/baeldung/multiline/MultiLineStringUnitTest.java
+++ b/core-java-modules/core-java-strings/src/test/java/com/baeldung/multiline/MultiLineStringUnitTest.java
@@ -16,6 +16,7 @@ public class MultiLineStringUnitTest {
assertEquals(ms.stringJoin(), ms.stringBuilder());
assertEquals(ms.stringBuilder(), ms.guavaJoiner());
assertEquals(ms.guavaJoiner(), ms.loadFromFile());
+ assertEquals(ms.loadFromFile(), ms.textBlocks());
}
}
diff --git a/core-java-modules/core-java-sun/pom.xml b/core-java-modules/core-java-sun/pom.xml
index 0f53407ec1..347020a736 100644
--- a/core-java-modules/core-java-sun/pom.xml
+++ b/core-java-modules/core-java-sun/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-java-sunjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -44,7 +44,6 @@
org.codehaus.mojoexec-maven-plugin
- ${exec-maven-plugin.version}javacom.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
@@ -68,7 +67,6 @@
org.codehaus.mojoexec-maven-plugin
-
run-benchmarks
@@ -99,7 +97,6 @@
3.6.11.7.0
-
1.8.0
diff --git a/core-java-modules/core-java-time-measurements/pom.xml b/core-java-modules/core-java-time-measurements/pom.xml
index 3197b1ae6a..663cf6708b 100644
--- a/core-java-modules/core-java-time-measurements/pom.xml
+++ b/core-java-modules/core-java-time-measurements/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -9,6 +8,7 @@
0.0.1-SNAPSHOTcore-java-time-measurementsjar
+
com.baeldung.core-java-modulescore-java-modules
@@ -73,7 +73,6 @@
true
-
maven-surefire-plugin
@@ -102,4 +101,4 @@
2.22.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java/README.md b/core-java-modules/core-java/README.md
index b0e740e3b5..14857d5d87 100644
--- a/core-java-modules/core-java/README.md
+++ b/core-java-modules/core-java/README.md
@@ -11,3 +11,4 @@
- [What is the serialVersionUID?](http://www.baeldung.com/java-serial-version-uid)
- [A Guide to the ResourceBundle](http://www.baeldung.com/java-resourcebundle)
- [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties)
+- [Deserialization Vulnerabilities in Java](https://www.baeldung.com/java-deserialization-vulnerabilities)
diff --git a/core-java-modules/core-java/pom.xml b/core-java-modules/core-java/pom.xml
index b8d75058eb..504ec321f2 100644
--- a/core-java-modules/core-java/pom.xml
+++ b/core-java-modules/core-java/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOTcore-javajar
+
com.baeldung.core-java-modulescore-java-modules
@@ -90,11 +90,9 @@
-
org.codehaus.mojoexec-maven-plugin
- ${exec-maven-plugin.version}javacom.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
@@ -107,7 +105,6 @@
-
org.apache.maven.pluginsmaven-javadoc-plugin
@@ -154,7 +151,6 @@
org.codehaus.mojoexec-maven-plugin
- ${exec-maven-plugin.version}run-benchmarks
@@ -185,17 +181,13 @@
0.41.8.7
-
3.10.0
-
1.1
-
3.0.0-M1
- 1.6.01.81.8
-
+
\ No newline at end of file
diff --git a/core-java-modules/multimodulemavenproject/daomodule/pom.xml b/core-java-modules/multimodulemavenproject/daomodule/pom.xml
index 56c2d70d24..626a6f707a 100644
--- a/core-java-modules/multimodulemavenproject/daomodule/pom.xml
+++ b/core-java-modules/multimodulemavenproject/daomodule/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
diff --git a/core-java-modules/multimodulemavenproject/entitymodule/pom.xml b/core-java-modules/multimodulemavenproject/entitymodule/pom.xml
index 00ad56b3ab..e2a453b9c2 100644
--- a/core-java-modules/multimodulemavenproject/entitymodule/pom.xml
+++ b/core-java-modules/multimodulemavenproject/entitymodule/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
diff --git a/core-java-modules/multimodulemavenproject/mainappmodule/pom.xml b/core-java-modules/multimodulemavenproject/mainappmodule/pom.xml
index a9fe04b108..c376a2b04e 100644
--- a/core-java-modules/multimodulemavenproject/mainappmodule/pom.xml
+++ b/core-java-modules/multimodulemavenproject/mainappmodule/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
diff --git a/core-java-modules/multimodulemavenproject/pom.xml b/core-java-modules/multimodulemavenproject/pom.xml
index dcf9f7311e..f45774ae00 100644
--- a/core-java-modules/multimodulemavenproject/pom.xml
+++ b/core-java-modules/multimodulemavenproject/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.baeldung.multimodulemavenprojectmultimodulemavenproject
@@ -59,8 +60,7 @@
3.8.01.91.9
- UTF-83.12.2
-
+
\ No newline at end of file
diff --git a/core-java-modules/multimodulemavenproject/userdaomodule/pom.xml b/core-java-modules/multimodulemavenproject/userdaomodule/pom.xml
index 150c10b68f..4df29457c5 100644
--- a/core-java-modules/multimodulemavenproject/userdaomodule/pom.xml
+++ b/core-java-modules/multimodulemavenproject/userdaomodule/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index 7dc54bd907..8661f1ba01 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -20,16 +19,13 @@
core-javacore-java-8core-java-8-2
-
core-java-annotations
-
core-java-arrays-sortingcore-java-arrays-guidescore-java-arrays-multidimensionalcore-java-arrays-convertcore-java-arrays-operations-basiccore-java-arrays-operations-advanced
-
core-java-charcore-java-collectionscore-java-collections-2
@@ -42,7 +38,6 @@
core-java-collections-mapscore-java-collections-maps-2core-java-collections-maps-3
-
core-java-concurrency-2core-java-concurrency-advancedcore-java-concurrency-advanced-2
@@ -53,31 +48,26 @@
core-java-concurrency-collectionscore-java-concurrency-collections-2core-java-console
-
-
+
core-java-8-datetime-2core-java-date-operations-2core-java-8-datetime
-
core-java-exceptionscore-java-exceptions-2core-java-exceptions-3core-java-function
- core-java-functional
-
+ core-java-functionalcore-java-iocore-java-io-2core-java-io-3
- core-java-io-4
+ core-java-io-4core-java-io-apiscore-java-io-conversionscore-java-io-conversions-2
-
core-java-jarcore-java-jndicore-java-jvmcore-java-jvm-2
-
core-java-lambdascore-java-langcore-java-lang-2
@@ -91,25 +81,23 @@
core-java-lang-oop-genericscore-java-lang-oop-modifierscore-java-lang-oop-types
+ core-java-lang-oop-types-2core-java-lang-oop-inheritancecore-java-lang-oop-methodscore-java-lang-oop-otherscore-java-lang-operators
+ core-java-lang-operators-2core-java-lang-syntaxcore-java-lang-syntax-2
-
core-java-networkingcore-java-networking-2
+ core-java-networking-3core-java-niocore-java-nio-2
-
core-java-optional
-
core-java-perf
-
core-java-reflectioncore-java-reflection-2
-
core-java-securitycore-java-security-2core-java-streams
@@ -123,11 +111,9 @@
core-java-string-conversions-2core-java-string-operationscore-java-string-operations-2
- core-java-string-operations-3
- core-java-stringscore-java-sun
-
core-java-regex
+ core-java-regex-2pre-jpms
@@ -148,18 +134,6 @@
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
-
-
-
-
2.22.25.6.2
diff --git a/core-java-modules/pre-jpms/pom.xml b/core-java-modules/pre-jpms/pom.xml
index 9032c9475b..60e425b936 100644
--- a/core-java-modules/pre-jpms/pom.xml
+++ b/core-java-modules/pre-jpms/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -78,4 +77,4 @@
1.8
-
+
\ No newline at end of file
diff --git a/couchbase/pom.xml b/couchbase/pom.xml
index 34e2832e55..e87975a53c 100644
--- a/couchbase/pom.xml
+++ b/couchbase/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -72,4 +71,4 @@
4.3.5.RELEASE
-
+
\ No newline at end of file
diff --git a/custom-pmd/pom.xml b/custom-pmd/pom.xml
index e0f38199ec..550f96de33 100644
--- a/custom-pmd/pom.xml
+++ b/custom-pmd/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -45,11 +44,10 @@
- UTF-83.7.06.0.11.81.8
-
+
\ No newline at end of file
diff --git a/dagger/pom.xml b/dagger/pom.xml
index e9410ceb63..304b0e428e 100644
--- a/dagger/pom.xml
+++ b/dagger/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -46,4 +45,4 @@
2.16
-
+
\ No newline at end of file
diff --git a/data-structures/pom.xml b/data-structures/pom.xml
index e2d2e23090..cba602878f 100644
--- a/data-structures/pom.xml
+++ b/data-structures/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -35,7 +34,6 @@
org.codehaus.mojoexec-maven-plugin
- ${exec-maven-plugin.version}
@@ -45,4 +43,4 @@
0.7.0
-
+
\ No newline at end of file
diff --git a/ddd-modules/mainapp/pom.xml b/ddd-modules/mainapp/pom.xml
index 59d2ad7d3a..6b913df979 100644
--- a/ddd-modules/mainapp/pom.xml
+++ b/ddd-modules/mainapp/pom.xml
@@ -29,7 +29,6 @@
org.apache.maven.pluginsmaven-surefire-plugin
- 2.16true
diff --git a/ddd-modules/pom.xml b/ddd-modules/pom.xml
index 6ab1829198..376dad89e5 100644
--- a/ddd-modules/pom.xml
+++ b/ddd-modules/pom.xml
@@ -66,7 +66,6 @@
org.apache.maven.pluginsmaven-surefire-plugin
- ${maven-surefire-plugin.version}0
@@ -75,13 +74,10 @@
- UTF-8
-
993.8.1
- 2.22.21.0
diff --git a/ddd/pom.xml b/ddd/pom.xml
index 7d03208802..77cf1f5341 100644
--- a/ddd/pom.xml
+++ b/ddd/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -99,17 +98,7 @@
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
-
-
1.0.1
-
-
+
\ No newline at end of file
diff --git a/deeplearning4j/pom.xml b/deeplearning4j/pom.xml
index af65aa7e03..f1f9b9fa7b 100644
--- a/deeplearning4j/pom.xml
+++ b/deeplearning4j/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -66,4 +65,4 @@
1.7.5
-
+
\ No newline at end of file
diff --git a/discord4j/pom.xml b/discord4j/pom.xml
index 664692f60a..1e73e5109b 100644
--- a/discord4j/pom.xml
+++ b/discord4j/pom.xml
@@ -1,71 +1,71 @@
-
- 4.0.0
-
- org.springframework.boot
- spring-boot-starter-parent
- 2.3.5.RELEASE
-
-
- com.baeldung
- discord4j-bot
- 0.0.1-SNAPSHOT
- discord4j-bot
- Demo Discord bot using Discord4J + Spring Boot
+
+ 4.0.0
+ com.baeldung
+ discord4j
+ 0.0.1-SNAPSHOT
+ discord4j
+ Demo Discord bot using Discord4J + Spring Boot
-
- 1.8
-
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+
-
-
- org.springframework.boot
- spring-boot-starter
-
-
- org.springframework.boot
- spring-boot-starter-webflux
-
-
- org.springframework.boot
- spring-boot-starter-actuator
-
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+
+
+
+
+ com.discord4j
+ discord4j-core
+ 3.1.1
+
+
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
- org.junit.vintage
- junit-vintage-engine
-
-
-
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+
-
- com.discord4j
- discord4j-core
- 3.1.1
-
-
+
+ 1.8
+
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
- 1.8
- 1.8
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/disruptor/pom.xml b/disruptor/pom.xml
index 31fc28986b..c2f9cf34b0 100644
--- a/disruptor/pom.xml
+++ b/disruptor/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -87,7 +86,8 @@
true
-
+ org.baeldung.executable.ExecutableMavenJar
diff --git a/docker/docker-spring-boot-postgres/pom.xml b/docker/docker-spring-boot-postgres/pom.xml
index 0b359138f6..d08ae130db 100644
--- a/docker/docker-spring-boot-postgres/pom.xml
+++ b/docker/docker-spring-boot-postgres/pom.xml
@@ -2,21 +2,18 @@
4.0.0
-
- org.springframework.boot
- spring-boot-starter-parent
- 2.4.0
-
- com.baeldung.dockerdocker-spring-boot-postgres0.0.1-SNAPSHOTdocker-spring-boot-postgresDemo project showing Spring Boot, PostgreSQL, and Docker
-
-
- 11
-
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
@@ -44,5 +41,9 @@
+
+
+ 11
+
\ No newline at end of file
diff --git a/docker/pom.xml b/docker/pom.xml
index f05c303938..3fcc9ca94f 100644
--- a/docker/pom.xml
+++ b/docker/pom.xml
@@ -4,19 +4,19 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
- org.springframework.boot
- spring-boot-starter-parent
- 2.3.1.RELEASE
-
-
-
com.baeldung.dockerdocker0.0.1dockerDemo project showing Spring Boot and Dockerpom
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+ 11
diff --git a/dozer/pom.xml b/dozer/pom.xml
index 0fdf7f6fba..840763445c 100644
--- a/dozer/pom.xml
+++ b/dozer/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -31,4 +30,4 @@
5.5.1
-
+
\ No newline at end of file
diff --git a/drools/pom.xml b/drools/pom.xml
index e0a7b52938..cc96d9d032 100644
--- a/drools/pom.xml
+++ b/drools/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -65,4 +64,4 @@
7.10.0.Final
-
+
\ No newline at end of file
diff --git a/dropwizard/pom.xml b/dropwizard/pom.xml
index c3e1a4e841..36f2ec43f0 100644
--- a/dropwizard/pom.xml
+++ b/dropwizard/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -49,8 +48,10 @@
-
-
+
+ com.baeldung.dropwizard.introduction.IntroductionApplication
diff --git a/dubbo/pom.xml b/dubbo/pom.xml
index cca1b3a3d1..76e09c4375 100644
--- a/dubbo/pom.xml
+++ b/dubbo/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -37,4 +36,4 @@
0.10
-
+
\ No newline at end of file
diff --git a/ethereum/pom.xml b/ethereum/pom.xml
index 5953195123..4283714b98 100644
--- a/ethereum/pom.xml
+++ b/ethereum/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -16,14 +15,12 @@
-
org.springframework.bootspring-boot-starter${spring.boot.version}
-
org.springframework.bootspring-boot-starter-web
@@ -34,7 +31,6 @@
spring-boot-starter-tomcat${spring.boot.version}
-
org.springframework
@@ -51,7 +47,6 @@
spring-webmvc${spring.version}
-
org.ethereum
@@ -63,7 +58,6 @@
core${web3j.core.version}
-
com.fasterxml.jackson.core
@@ -80,7 +74,6 @@
jackson-annotations${jackson.version}
-
javax.servlet
@@ -102,7 +95,6 @@
javax.servlet.jsp-api${javax.servlet.jsp-api.version}
-
org.slf4j
@@ -114,7 +106,6 @@
logback-classic${logback.version}
-
org.springframework.boot
@@ -133,7 +124,6 @@
${spring.version}test
-
org.mockito
@@ -219,4 +209,4 @@
2.0.4.RELEASE3.1
-
+
\ No newline at end of file
diff --git a/feign/pom.xml b/feign/pom.xml
index da3cbcb0fd..56059d2a77 100644
--- a/feign/pom.xml
+++ b/feign/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -43,4 +42,4 @@
10.11
-
+
\ No newline at end of file
diff --git a/flyway-cdi-extension/pom.xml b/flyway-cdi-extension/pom.xml
index 566eed95d8..757d1e0a7f 100644
--- a/flyway-cdi-extension/pom.xml
+++ b/flyway-cdi-extension/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -57,4 +56,4 @@
8.5.331.3.2
-
+
\ No newline at end of file
diff --git a/google-cloud/pom.xml b/google-cloud/pom.xml
index 1e474b5dd0..72b9647bc8 100644
--- a/google-cloud/pom.xml
+++ b/google-cloud/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -35,4 +34,4 @@
1.16.0
-
+
\ No newline at end of file
diff --git a/google-web-toolkit/pom.xml b/google-web-toolkit/pom.xml
index 6fdcae4f75..6b93ccbc71 100644
--- a/google-web-toolkit/pom.xml
+++ b/google-web-toolkit/pom.xml
@@ -1,6 +1,5 @@
-
@@ -54,11 +53,10 @@
-
+
${project.build.directory}/${project.build.finalName}/WEB-INF/classes
-
-
net.ltgt.gwt.maven
@@ -76,7 +74,8 @@
com.baeldung.Google_web_toolkitGoogle_web_toolkittrue
-
+
${maven.compiler.source}
@@ -93,32 +92,23 @@
-
maven-surefire-plugin
- ${surefire.plugin.version}true
-
-
-
+
1.81.8
-
-
- UTF-8
- UTF-82.8.21.0-rc-8
- 2.17
-
+
\ No newline at end of file
diff --git a/gradle/.gitignore b/gradle/.gitignore
index da88288c09..01d29dfced 100644
--- a/gradle/.gitignore
+++ b/gradle/.gitignore
@@ -1 +1,7 @@
/.gradle/
+
+**/build/**
+/build/
+
+# exclude jar for gradle wrapper
+!**/gradle/wrapper/*.jar
diff --git a/gradle/gradle-cucumber/README.md b/gradle/gradle-cucumber/README.md
new file mode 100644
index 0000000000..a92593e959
--- /dev/null
+++ b/gradle/gradle-cucumber/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Using Cucumber with Gradle](https://www.baeldung.com/java-cucumber-gradle)
diff --git a/gradle/gradle-cucumber/build.gradle b/gradle/gradle-cucumber/build.gradle
new file mode 100644
index 0000000000..e643e680c3
--- /dev/null
+++ b/gradle/gradle-cucumber/build.gradle
@@ -0,0 +1,68 @@
+import org.gradle.api.tasks.testing.logging.TestLogEvent
+
+plugins {
+ id 'java'
+ id 'se.thinkcode.cucumber-runner' version '0.0.8'
+}
+
+ext {
+ junitVersion = '5.7.2'
+ cucumberVersion = '6.10.4'
+}
+
+group 'com.baeldung'
+version '1.0-SNAPSHOT'
+
+repositories {
+ mavenCentral()
+}
+
+java {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+}
+
+dependencies {
+ testImplementation "org.junit.jupiter:junit-jupiter-api:${junitVersion}"
+ testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${junitVersion}"
+
+ testImplementation "io.cucumber:cucumber-java:${cucumberVersion}"
+
+ testImplementation "io.cucumber:cucumber-junit:${cucumberVersion}"
+ testImplementation "org.junit.vintage:junit-vintage-engine:${junitVersion}"
+}
+
+configurations {
+ cucumberRuntime {
+ extendsFrom testImplementation
+ }
+}
+
+task cucumberCli() {
+ dependsOn assemble, testClasses
+ doLast {
+ javaexec {
+ main = "io.cucumber.core.cli.Main"
+ classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output
+ args = [
+ '--plugin', 'pretty',
+ '--plugin', 'html:target/cucumber-report.html',
+ '--glue', 'com.baeldung.cucumber',
+ 'src/test/resources']
+ }
+ }
+}
+
+cucumber {
+ main = 'io.cucumber.core.cli.Main'
+}
+
+test {
+ useJUnitPlatform()
+
+ testLogging {
+ events TestLogEvent.FAILED, TestLogEvent.PASSED, TestLogEvent.SKIPPED
+ }
+
+ systemProperties(project.gradle.startParameter.systemPropertiesArgs)
+}
diff --git a/gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.jar b/gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000..e708b1c023
Binary files /dev/null and b/gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.properties b/gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..da9702f9e7
--- /dev/null
+++ b/gradle/gradle-cucumber/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradle/gradle-cucumber/gradlew b/gradle/gradle-cucumber/gradlew
new file mode 100755
index 0000000000..4f906e0c81
--- /dev/null
+++ b/gradle/gradle-cucumber/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/gradle/gradle-cucumber/gradlew.bat b/gradle/gradle-cucumber/gradlew.bat
new file mode 100644
index 0000000000..ac1b06f938
--- /dev/null
+++ b/gradle/gradle-cucumber/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/gradle/gradle-cucumber/settings.gradle b/gradle/gradle-cucumber/settings.gradle
new file mode 100644
index 0000000000..9b3cf0ebc7
--- /dev/null
+++ b/gradle/gradle-cucumber/settings.gradle
@@ -0,0 +1 @@
+rootProject.name = 'gradle-cucumber'
diff --git a/gradle/gradle-cucumber/src/main/java/com/baeldung/Account.java b/gradle/gradle-cucumber/src/main/java/com/baeldung/Account.java
new file mode 100644
index 0000000000..48f1b031a2
--- /dev/null
+++ b/gradle/gradle-cucumber/src/main/java/com/baeldung/Account.java
@@ -0,0 +1,18 @@
+package com.baeldung;
+
+public class Account {
+
+ private Double balance;
+
+ public Account(Double initialBalance) {
+ this.balance = initialBalance;
+ }
+
+ public void credit(Double amount) {
+ balance += amount;
+ }
+
+ public Double getBalance() {
+ return balance;
+ }
+}
diff --git a/gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/RunCucumberTest.java b/gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/RunCucumberTest.java
new file mode 100644
index 0000000000..38c01f5487
--- /dev/null
+++ b/gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/RunCucumberTest.java
@@ -0,0 +1,14 @@
+package com.baeldung.cucumber;
+
+import io.cucumber.junit.Cucumber;
+import io.cucumber.junit.CucumberOptions;
+import org.junit.runner.RunWith;
+
+@RunWith(Cucumber.class)
+@CucumberOptions(
+ plugin = {"pretty", "html:target/cucumber-report.html"},
+ features = {"src/test/resources"}
+)
+public class RunCucumberTest {
+
+}
diff --git a/gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/StepDefinitions.java b/gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/StepDefinitions.java
new file mode 100644
index 0000000000..a3d0d7961b
--- /dev/null
+++ b/gradle/gradle-cucumber/src/test/java/com/baeldung/cucumber/StepDefinitions.java
@@ -0,0 +1,28 @@
+package com.baeldung.cucumber;
+
+import com.baeldung.Account;
+import io.cucumber.java.en.Given;
+import io.cucumber.java.en.Then;
+import io.cucumber.java.en.When;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class StepDefinitions {
+
+ private Account account;
+
+ @Given("account balance is {double}")
+ public void givenAccountBalance(Double initialBalance) {
+ account = new Account(initialBalance);
+ }
+
+ @When("the account is credited with {double}")
+ public void whenAccountIsCredited(Double amount) {
+ account.credit(amount);
+ }
+
+ @Then("account should have a balance of {double}")
+ public void thenAccountShouldHaveBalance(Double expectedBalance) {
+ assertEquals(expectedBalance, account.getBalance());
+ }
+}
diff --git a/gradle/gradle-cucumber/src/test/resources/features/account_credited.feature b/gradle/gradle-cucumber/src/test/resources/features/account_credited.feature
new file mode 100644
index 0000000000..bd7940d1a5
--- /dev/null
+++ b/gradle/gradle-cucumber/src/test/resources/features/account_credited.feature
@@ -0,0 +1,6 @@
+Feature: Account is credited with amount
+
+ Scenario: Credit amount
+ Given account balance is 0.0
+ When the account is credited with 10.0
+ Then account should have a balance of 10.0
diff --git a/gradle/gradle-jacoco/build.gradle b/gradle/gradle-jacoco/build.gradle
new file mode 100644
index 0000000000..ef9e0a9c7c
--- /dev/null
+++ b/gradle/gradle-jacoco/build.gradle
@@ -0,0 +1,54 @@
+
+plugins {
+ id 'java'
+ id 'jacoco'
+}
+
+ext {
+ junitVersion = '5.7.2'
+ lombokVersion = '1.18.20'
+}
+
+group 'com.com.baeldung'
+version '1.0-SNAPSHOT'
+
+repositories {
+ mavenCentral()
+}
+
+java {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+}
+
+dependencies {
+ testImplementation "org.junit.jupiter:junit-jupiter-api:${junitVersion}"
+ testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${junitVersion}"
+
+ compileOnly "org.projectlombok:lombok:${lombokVersion}"
+ annotationProcessor "org.projectlombok:lombok:${lombokVersion}"
+}
+
+test {
+ useJUnitPlatform()
+
+ finalizedBy jacocoTestReport // report is always generated after tests run
+}
+
+jacocoTestReport {
+ dependsOn test // tests are required to run before generating the report
+
+ afterEvaluate {
+ classDirectories.setFrom(files(classDirectories.files.collect {
+ fileTree(dir: it, exclude: [
+ "com/baeldung/**/ExcludedPOJO.class",
+ "com/baeldung/**/*DTO.*",
+ "**/config/*"
+ ])
+ }))
+ }
+}
+
+jacoco {
+ toolVersion = "0.8.6"
+}
diff --git a/gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.jar b/gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000..e708b1c023
Binary files /dev/null and b/gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.properties b/gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..da9702f9e7
--- /dev/null
+++ b/gradle/gradle-jacoco/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradle/gradle-jacoco/gradlew b/gradle/gradle-jacoco/gradlew
new file mode 100755
index 0000000000..4f906e0c81
--- /dev/null
+++ b/gradle/gradle-jacoco/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/gradle/gradle-jacoco/gradlew.bat b/gradle/gradle-jacoco/gradlew.bat
new file mode 100644
index 0000000000..ac1b06f938
--- /dev/null
+++ b/gradle/gradle-jacoco/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/gradle/gradle-jacoco/lombok.config b/gradle/gradle-jacoco/lombok.config
new file mode 100644
index 0000000000..7a21e88040
--- /dev/null
+++ b/gradle/gradle-jacoco/lombok.config
@@ -0,0 +1 @@
+lombok.addLombokGeneratedAnnotation = true
diff --git a/gradle/gradle-jacoco/settings.gradle b/gradle/gradle-jacoco/settings.gradle
new file mode 100644
index 0000000000..b0ed8f1486
--- /dev/null
+++ b/gradle/gradle-jacoco/settings.gradle
@@ -0,0 +1 @@
+rootProject.name = 'gradle-jacoco'
diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/config/AppConfig.java b/gradle/gradle-jacoco/src/main/java/com/baeldung/config/AppConfig.java
new file mode 100644
index 0000000000..d103f4b4f5
--- /dev/null
+++ b/gradle/gradle-jacoco/src/main/java/com/baeldung/config/AppConfig.java
@@ -0,0 +1,11 @@
+package com.baeldung.config;
+
+import com.baeldung.service.ProductService;
+
+public class AppConfig {
+
+ public ProductService productService() {
+ return new ProductService();
+ }
+
+}
diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/domain/Product.java b/gradle/gradle-jacoco/src/main/java/com/baeldung/domain/Product.java
new file mode 100644
index 0000000000..c64b6d2eae
--- /dev/null
+++ b/gradle/gradle-jacoco/src/main/java/com/baeldung/domain/Product.java
@@ -0,0 +1,12 @@
+package com.baeldung.domain;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Builder
+@Data
+public class Product {
+ private int id;
+ private String name;
+
+}
diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ExcludedPOJO.java b/gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ExcludedPOJO.java
new file mode 100644
index 0000000000..0f7278459e
--- /dev/null
+++ b/gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ExcludedPOJO.java
@@ -0,0 +1,4 @@
+package com.baeldung.dto;
+
+public class ExcludedPOJO {
+}
diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ProductDTO.java b/gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ProductDTO.java
new file mode 100644
index 0000000000..0ae1659c14
--- /dev/null
+++ b/gradle/gradle-jacoco/src/main/java/com/baeldung/dto/ProductDTO.java
@@ -0,0 +1,4 @@
+package com.baeldung.dto;
+
+public class ProductDTO {
+}
diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Customer.java b/gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Customer.java
new file mode 100644
index 0000000000..e7bb837a5c
--- /dev/null
+++ b/gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Customer.java
@@ -0,0 +1,11 @@
+package com.baeldung.generated;
+
+@Generated
+public class Customer {
+ // everything in this class will be excluded from jacoco report because of @Generated
+
+ @Override
+ public String toString() {
+ return "Customer{}";
+ }
+}
diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Generated.java b/gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Generated.java
new file mode 100644
index 0000000000..865df8ca8a
--- /dev/null
+++ b/gradle/gradle-jacoco/src/main/java/com/baeldung/generated/Generated.java
@@ -0,0 +1,15 @@
+package com.baeldung.generated;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+@Documented
+@Retention(RUNTIME)
+@Target({TYPE, METHOD})
+public @interface Generated {
+}
\ No newline at end of file
diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/service/CustomerService.java b/gradle/gradle-jacoco/src/main/java/com/baeldung/service/CustomerService.java
new file mode 100644
index 0000000000..e6dbe8df5e
--- /dev/null
+++ b/gradle/gradle-jacoco/src/main/java/com/baeldung/service/CustomerService.java
@@ -0,0 +1,16 @@
+package com.baeldung.service;
+
+import com.baeldung.generated.Generated;
+
+public class CustomerService {
+
+ //this method will be excluded from coverage due to @Generated.
+ @Generated
+ public String getProductId() {
+ return "An ID";
+ }
+
+ public String getCustomerName() {
+ return "some name";
+ }
+}
diff --git a/gradle/gradle-jacoco/src/main/java/com/baeldung/service/ProductService.java b/gradle/gradle-jacoco/src/main/java/com/baeldung/service/ProductService.java
new file mode 100644
index 0000000000..5f73ddc7fd
--- /dev/null
+++ b/gradle/gradle-jacoco/src/main/java/com/baeldung/service/ProductService.java
@@ -0,0 +1,9 @@
+package com.baeldung.service;
+
+public class ProductService {
+ private static final double DISCOUNT = 0.25;
+
+ public double getSalePrice(double originalPrice) {
+ return originalPrice - originalPrice * DISCOUNT;
+ }
+}
diff --git a/gradle/gradle-jacoco/src/test/java/com/baeldung/service/CustomerServiceUnitTest.java b/gradle/gradle-jacoco/src/test/java/com/baeldung/service/CustomerServiceUnitTest.java
new file mode 100644
index 0000000000..63dd2c755a
--- /dev/null
+++ b/gradle/gradle-jacoco/src/test/java/com/baeldung/service/CustomerServiceUnitTest.java
@@ -0,0 +1,14 @@
+package com.baeldung.service;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+class CustomerServiceUnitTest {
+
+ @Test
+ public void givenCustomer_whenGetCustomer_thenReturnNewCustomer() {
+ CustomerService customerService = new CustomerService();
+ assertNotNull(customerService.getCustomerName());
+ }
+}
diff --git a/gradle/gradle-jacoco/src/test/java/com/baeldung/service/ProductServiceUnitTest.java b/gradle/gradle-jacoco/src/test/java/com/baeldung/service/ProductServiceUnitTest.java
new file mode 100644
index 0000000000..a9d216785a
--- /dev/null
+++ b/gradle/gradle-jacoco/src/test/java/com/baeldung/service/ProductServiceUnitTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.service;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class ProductServiceUnitTest {
+
+ @Test
+ public void givenOriginalPrice_whenGetSalePrice_thenReturnsDiscountedPrice() {
+ ProductService productService = new ProductService();
+ double salePrice = productService.getSalePrice(100);
+ assertEquals(salePrice, 75);
+ }
+}
diff --git a/gradle/gradle-jacoco/src/test/resources/features/account_credited.feature b/gradle/gradle-jacoco/src/test/resources/features/account_credited.feature
new file mode 100644
index 0000000000..bd7940d1a5
--- /dev/null
+++ b/gradle/gradle-jacoco/src/test/resources/features/account_credited.feature
@@ -0,0 +1,6 @@
+Feature: Account is credited with amount
+
+ Scenario: Credit amount
+ Given account balance is 0.0
+ When the account is credited with 10.0
+ Then account should have a balance of 10.0
diff --git a/graphql/graphql-java/pom.xml b/graphql/graphql-java/pom.xml
index 30bfbf555a..eae30aa8fa 100644
--- a/graphql/graphql-java/pom.xml
+++ b/graphql/graphql-java/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
diff --git a/grpc/pom.xml b/grpc/pom.xml
index 5e1c0bb28b..c3e4996c29 100644
--- a/grpc/pom.xml
+++ b/grpc/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -78,4 +77,4 @@
1.6.10.6.1
-
+
\ No newline at end of file
diff --git a/gson/pom.xml b/gson/pom.xml
index 0de9a6a533..a928d87b61 100644
--- a/gson/pom.xml
+++ b/gson/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
diff --git a/guava-modules/guava-18/pom.xml b/guava-modules/guava-18/pom.xml
index d65fab1e57..ed295db2f4 100644
--- a/guava-modules/guava-18/pom.xml
+++ b/guava-modules/guava-18/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0guava-180.1.0-SNAPSHOT
diff --git a/guava-modules/guava-19/pom.xml b/guava-modules/guava-19/pom.xml
index 20a405cff4..3c29a2a59c 100644
--- a/guava-modules/guava-19/pom.xml
+++ b/guava-modules/guava-19/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0guava-190.1.0-SNAPSHOT
diff --git a/guava-modules/guava-21/pom.xml b/guava-modules/guava-21/pom.xml
index b793f11a7f..8b7c3cdcfd 100644
--- a/guava-modules/guava-21/pom.xml
+++ b/guava-modules/guava-21/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0guava-211.0-SNAPSHOT
diff --git a/guava-modules/guava-collections-list/pom.xml b/guava-modules/guava-collections-list/pom.xml
index cc52a5d48b..d281be2235 100644
--- a/guava-modules/guava-collections-list/pom.xml
+++ b/guava-modules/guava-collections-list/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -27,7 +26,6 @@
commons-lang3${commons-lang3.version}
-
org.junit.jupiter
@@ -47,7 +45,6 @@
${assertj.version}test
-
org.hamcrest
@@ -58,28 +55,18 @@
- guava-collections
-
+ guava-collections-listsrc/main/resourcestrue
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
- 4.1
-
3.6.12.0.0.0
diff --git a/guava-modules/guava-collections-map/pom.xml b/guava-modules/guava-collections-map/pom.xml
index 82d634265b..a03a779b3e 100644
--- a/guava-modules/guava-collections-map/pom.xml
+++ b/guava-modules/guava-collections-map/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.baeldung.guavaguava-collections-map
@@ -31,21 +32,12 @@
guava-collections-map
-
src/main/resourcestrue
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
diff --git a/guava-modules/guava-collections-set/pom.xml b/guava-modules/guava-collections-set/pom.xml
index 8f58148e41..b989966a54 100644
--- a/guava-modules/guava-collections-set/pom.xml
+++ b/guava-modules/guava-collections-set/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0guava-collections-set0.1.0-SNAPSHOT
@@ -37,14 +38,6 @@
guava-collections-set
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
@@ -53,4 +46,4 @@
5.6.2
-
+
\ No newline at end of file
diff --git a/guava-modules/guava-collections/pom.xml b/guava-modules/guava-collections/pom.xml
index 53c55dc655..021c4c6037 100644
--- a/guava-modules/guava-collections/pom.xml
+++ b/guava-modules/guava-collections/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -32,7 +31,6 @@
jool${jool.version}
-
org.junit.jupiter
@@ -52,7 +50,6 @@
${assertj.version}test
-
org.hamcrest
@@ -64,28 +61,18 @@
guava-collections
-
src/main/resourcestrue
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
- 4.10.9.12
-
3.6.12.0.0.0
diff --git a/guava-modules/guava-core/pom.xml b/guava-modules/guava-core/pom.xml
index 5224148cb8..a15dfb5178 100644
--- a/guava-modules/guava-core/pom.xml
+++ b/guava-modules/guava-core/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -31,7 +30,7 @@
- guava
+ guava-coresrc/main/resources
@@ -45,4 +44,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/guava-modules/guava-io/pom.xml b/guava-modules/guava-io/pom.xml
index 6b3280755c..f6ebac8ba4 100644
--- a/guava-modules/guava-io/pom.xml
+++ b/guava-modules/guava-io/pom.xml
@@ -1,12 +1,10 @@
-
+4.0.0guava-io0.1.0-SNAPSHOT
-
- 5.6.2
- guava-io
@@ -33,21 +31,16 @@
guava-io
-
src/main/resourcestrue
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
+
+ 5.6.2
+
+
\ No newline at end of file
diff --git a/guava-modules/guava-utilities/pom.xml b/guava-modules/guava-utilities/pom.xml
index 0496f5b2e8..a9aca0ee08 100644
--- a/guava-modules/guava-utilities/pom.xml
+++ b/guava-modules/guava-utilities/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -21,7 +20,6 @@
commons-lang3${commons-lang3.version}
-
org.junit.jupiter
@@ -44,22 +42,13 @@
- guava
-
+ guava-utilitiessrc/main/resourcestrue
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
diff --git a/guava-modules/pom.xml b/guava-modules/pom.xml
index b625f9fd0f..957b8ad166 100644
--- a/guava-modules/pom.xml
+++ b/guava-modules/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0guava-modulesguava-modules
@@ -46,19 +47,10 @@
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
-
-
+ 2.22.25.6.229.0-jre
-
+
\ No newline at end of file
diff --git a/guice/pom.xml b/guice/pom.xml
index 6bbad6dddc..2d968cdfc7 100644
--- a/guice/pom.xml
+++ b/guice/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
diff --git a/hazelcast/pom.xml b/hazelcast/pom.xml
index 69444308a3..694563790f 100644
--- a/hazelcast/pom.xml
+++ b/hazelcast/pom.xml
@@ -1,8 +1,7 @@
-
+4.0.0hazelcast0.0.1-SNAPSHOT
diff --git a/helidon/helidon-mp/pom.xml b/helidon/helidon-mp/pom.xml
index 38187a5cb8..3e61d05f61 100644
--- a/helidon/helidon-mp/pom.xml
+++ b/helidon/helidon-mp/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0helidon-mphelidon-mp
@@ -29,4 +30,4 @@
2.26
-
+
\ No newline at end of file
diff --git a/helidon/helidon-se/pom.xml b/helidon/helidon-se/pom.xml
index d5592dfb7b..e26390a99d 100644
--- a/helidon/helidon-se/pom.xml
+++ b/helidon/helidon-se/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0helidon-sehelidon-se
@@ -13,14 +13,13 @@
-
+
io.helidon.confighelidon-config-yaml${helidon.version}
-
-
+
io.helidon.webserverhelidon-webserver
@@ -37,8 +36,7 @@
helidon-webserver-json${helidon.version}
-
-
+
io.helidon.securityhelidon-security
diff --git a/helidon/pom.xml b/helidon/pom.xml
index 85bab4db42..36466203a8 100644
--- a/helidon/pom.xml
+++ b/helidon/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.baeldung.helidonhelidon
@@ -18,4 +19,4 @@
helidon-mp
-
+
\ No newline at end of file
diff --git a/httpclient-2/pom.xml b/httpclient-2/pom.xml
index 7638c692dc..881b0407c3 100644
--- a/httpclient-2/pom.xml
+++ b/httpclient-2/pom.xml
@@ -26,7 +26,6 @@
-
org.springframework.boot
diff --git a/httpclient-simple/pom.xml b/httpclient-simple/pom.xml
index 019f1af856..84b41cdd6c 100644
--- a/httpclient-simple/pom.xml
+++ b/httpclient-simple/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0httpclient-simple0.1-SNAPSHOT
@@ -15,9 +16,7 @@
-
-
org.springframework.securityspring-security-web
@@ -28,9 +27,7 @@
spring-security-config${spring-security.version}
-
-
org.springframeworkspring-core
@@ -72,7 +69,6 @@
spring-expression${spring.version}
-
org.springframeworkspring-web
@@ -83,21 +79,17 @@
spring-webmvc${spring.version}
-
org.springframeworkspring-oxm${spring.version}
-
-
com.fasterxml.jackson.corejackson-databind${jackson.version}
-
org.apache.httpcomponentshttpcore
@@ -109,7 +101,6 @@
-
org.apache.commons
@@ -166,33 +157,26 @@
${wiremock.version}test
-
-
javax.servletjavax.servlet-api${javax.servlet-api.version}provided
-
javax.servletjstl${jstl.version}runtime
-
-
com.google.guavaguava${guava.version}
-
-
org.springframeworkspring-test
@@ -209,7 +193,6 @@
true
-
org.apache.maven.plugins
@@ -264,7 +247,6 @@
-
org.apache.maven.pluginsmaven-surefire-plugin
@@ -288,7 +270,6 @@
-
@@ -302,7 +283,7 @@
2.5.14.4.11
- 4.5.8
+ 4.5.81.6.1
diff --git a/httpclient/pom.xml b/httpclient/pom.xml
index 606e9ed793..a1627cb6fa 100644
--- a/httpclient/pom.xml
+++ b/httpclient/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0httpclient0.1-SNAPSHOT
diff --git a/hystrix/pom.xml b/hystrix/pom.xml
index 1cf8713b91..639d4eba02 100644
--- a/hystrix/pom.xml
+++ b/hystrix/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0hystrix1.0
@@ -57,4 +58,4 @@
1.5.8
-
+
\ No newline at end of file
diff --git a/image-processing/pom.xml b/image-processing/pom.xml
index f2551598d5..b482aa30c1 100644
--- a/image-processing/pom.xml
+++ b/image-processing/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0image-processing1.0-SNAPSHOT
@@ -75,14 +76,25 @@
marvin${marvin-version}pom
-
+ com.github.downgoonMarvinPlugins${marvin-version}
+
+ org.bytedeco
+ javacv-platform
+ ${javacv-platform.version}
+
+
+ com.github.sarxos
+ webcam-capture
+ ${webcam-capture.version}
+
+
-
+
1.3.51.51h
@@ -90,6 +102,8 @@
4.5.14.1.0-1.5.23.4.2-0
+ 1.5.5
+ 0.3.124.20.4.111.5.5
diff --git a/image-processing/src/main/java/com/baeldung/imagefromwebcam/MarvinExample.java b/image-processing/src/main/java/com/baeldung/imagefromwebcam/MarvinExample.java
new file mode 100644
index 0000000000..67a46d9d59
--- /dev/null
+++ b/image-processing/src/main/java/com/baeldung/imagefromwebcam/MarvinExample.java
@@ -0,0 +1,31 @@
+package com.baeldung.imagefromwebcam;
+
+import marvin.gui.MarvinImagePanel;
+import marvin.image.MarvinImage;
+import marvin.io.MarvinImageIO;
+import marvin.video.MarvinJavaCVAdapter;
+import marvin.video.MarvinVideoInterface;
+import marvin.video.MarvinVideoInterfaceException;
+
+public class MarvinExample {
+
+ public static void main(String[] args) throws MarvinVideoInterfaceException {
+ MarvinVideoInterface videoAdapter = new MarvinJavaCVAdapter();
+ videoAdapter.connect(0);
+ MarvinImage image = videoAdapter.getFrame();
+ MarvinImageIO.saveImage(image, "selfie.jpg");
+ }
+
+ public void captureWithPanel() throws MarvinVideoInterfaceException {
+ MarvinVideoInterface videoAdapter = new MarvinJavaCVAdapter();
+ videoAdapter.connect(0);
+ MarvinImage image = videoAdapter.getFrame();
+
+ MarvinImagePanel imagePanel = new MarvinImagePanel();
+ imagePanel.setImage(image);
+
+ imagePanel.setSize(800,600);
+ imagePanel.setVisible(true);
+ }
+
+}
diff --git a/image-processing/src/main/java/com/baeldung/imagefromwebcam/OpenCVExample.java b/image-processing/src/main/java/com/baeldung/imagefromwebcam/OpenCVExample.java
new file mode 100644
index 0000000000..3d9d1bcb00
--- /dev/null
+++ b/image-processing/src/main/java/com/baeldung/imagefromwebcam/OpenCVExample.java
@@ -0,0 +1,31 @@
+package com.baeldung.imagefromwebcam;
+
+import org.bytedeco.javacv.*;
+import org.bytedeco.opencv.opencv_core.IplImage;
+import java.awt.event.WindowEvent;
+import javax.swing.JFrame;
+import static org.bytedeco.opencv.helper.opencv_imgcodecs.cvSaveImage;
+
+public class OpenCVExample {
+
+ public static void main(String[] args) throws Exception {
+ CanvasFrame canvas = new CanvasFrame("Web Cam");
+ canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+ FrameGrabber grabber = new OpenCVFrameGrabber(0);
+ OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
+
+ grabber.start();
+ Frame frame = grabber.grab();
+
+ IplImage img = converter.convert(frame);
+ cvSaveImage("selfie.jpg", img);
+
+ canvas.showImage(frame);
+
+ Thread.sleep(2000);
+
+ canvas.dispatchEvent(new WindowEvent(canvas, WindowEvent.WINDOW_CLOSING));
+ }
+
+}
diff --git a/image-processing/src/main/java/com/baeldung/imagefromwebcam/WebcamCaptureExample.java b/image-processing/src/main/java/com/baeldung/imagefromwebcam/WebcamCaptureExample.java
new file mode 100644
index 0000000000..8edde2a637
--- /dev/null
+++ b/image-processing/src/main/java/com/baeldung/imagefromwebcam/WebcamCaptureExample.java
@@ -0,0 +1,41 @@
+package com.baeldung.imagefromwebcam;
+
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+
+import javax.imageio.ImageIO;
+import javax.swing.JFrame;
+
+import com.github.sarxos.webcam.Webcam;
+import com.github.sarxos.webcam.WebcamPanel;
+import com.github.sarxos.webcam.WebcamResolution;
+import com.github.sarxos.webcam.util.ImageUtils;
+
+public class WebcamCaptureExample {
+
+ public static void main(String[] args) throws IOException, Exception {
+ Webcam webcam = Webcam.getDefault();
+ webcam.open();
+
+ BufferedImage image = webcam.getImage();
+
+ ImageIO.write(image, ImageUtils.FORMAT_JPG, new File("selfie.jpg"));
+ }
+
+ public void captureWithPanel() {
+ Webcam webcam = Webcam.getDefault();
+ webcam.setViewSize(WebcamResolution.VGA.getSize());
+
+ WebcamPanel panel = new WebcamPanel(webcam);
+ panel.setImageSizeDisplayed(true);
+
+ JFrame window = new JFrame("Webcam");
+ window.add(panel);
+ window.setResizable(true);
+ window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ window.pack();
+ window.setVisible(true);
+ }
+
+}
diff --git a/immutables/pom.xml b/immutables/pom.xml
index af4a62ea6b..648166fd74 100644
--- a/immutables/pom.xml
+++ b/immutables/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0immutablesimmutables
diff --git a/jackson-modules/jackson-annotations/pom.xml b/jackson-modules/jackson-annotations/pom.xml
index e4a41a5825..bdc131c867 100644
--- a/jackson-modules/jackson-annotations/pom.xml
+++ b/jackson-modules/jackson-annotations/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0jackson-annotations0.0.1-SNAPSHOT
@@ -47,4 +48,4 @@
3.1.1
-
+
\ No newline at end of file
diff --git a/jackson-modules/jackson-conversions-2/pom.xml b/jackson-modules/jackson-conversions-2/pom.xml
index 992cff30b2..799fcb106a 100644
--- a/jackson-modules/jackson-conversions-2/pom.xml
+++ b/jackson-modules/jackson-conversions-2/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0jackson-conversions-20.0.1-SNAPSHOT
@@ -54,4 +55,4 @@
2.9.8
-
+
\ No newline at end of file
diff --git a/jackson-modules/jackson-conversions/pom.xml b/jackson-modules/jackson-conversions/pom.xml
index fafb731cc9..9218f209ac 100644
--- a/jackson-modules/jackson-conversions/pom.xml
+++ b/jackson-modules/jackson-conversions/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0jackson-conversions0.0.1-SNAPSHOT
@@ -35,4 +36,4 @@
-
+
\ No newline at end of file
diff --git a/jackson-modules/jackson-custom-conversions/pom.xml b/jackson-modules/jackson-custom-conversions/pom.xml
index f58b25781c..79af962eec 100644
--- a/jackson-modules/jackson-custom-conversions/pom.xml
+++ b/jackson-modules/jackson-custom-conversions/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0jackson-custom-conversions0.0.1-SNAPSHOT
@@ -28,8 +29,6 @@
jackson-core${jackson.version}
-
-
@@ -42,4 +41,4 @@
-
+
\ No newline at end of file
diff --git a/jackson-modules/jackson-exceptions/pom.xml b/jackson-modules/jackson-exceptions/pom.xml
index 1a52892523..a24a0ab4b7 100644
--- a/jackson-modules/jackson-exceptions/pom.xml
+++ b/jackson-modules/jackson-exceptions/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0jackson-exceptions0.0.1-SNAPSHOT
@@ -22,4 +23,4 @@
-
+
\ No newline at end of file
diff --git a/jackson-modules/jackson/pom.xml b/jackson-modules/jackson/pom.xml
index 615076fc93..a4aecfa3de 100644
--- a/jackson-modules/jackson/pom.xml
+++ b/jackson-modules/jackson/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0jackson0.0.1-SNAPSHOT
@@ -19,41 +20,34 @@
jackson-datatype-jsr310${jackson.version}
-
com.fasterxml.jackson.datatypejackson-datatype-joda${jackson.version}
-
com.fasterxml.jackson.modulejackson-module-jsonSchema${jackson.version}
-
com.fasterxml.jackson.datatypejackson-datatype-jdk8${jackson.version}
-
-
io.rest-assuredjson-schema-validator${rest-assured.version}test
-
io.rest-assuredjson-path${rest-assured.version}test
-
org.assertjassertj-core
@@ -78,4 +72,4 @@
3.11.0
-
+
\ No newline at end of file
diff --git a/jackson-modules/pom.xml b/jackson-modules/pom.xml
index 70b10e9554..3d9d83553e 100644
--- a/jackson-modules/pom.xml
+++ b/jackson-modules/pom.xml
@@ -1,7 +1,7 @@
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0jackson-modulesjackson-modules
@@ -35,7 +35,6 @@
jackson-dataformat-xml${jackson.version}
-
org.junit.jupiterjunit-jupiter
@@ -50,17 +49,8 @@
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
-
-
5.6.2
+
\ No newline at end of file
diff --git a/jackson-simple/pom.xml b/jackson-simple/pom.xml
index 761dca6afa..204954ce60 100644
--- a/jackson-simple/pom.xml
+++ b/jackson-simple/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0jackson-simple0.0.1-SNAPSHOT
@@ -20,7 +21,6 @@
jackson-dataformat-xml${jackson.version}
-
org.junit.jupiter
@@ -44,21 +44,12 @@
jackson-simple
-
src/main/resourcestrue
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
@@ -67,4 +58,4 @@
3.11.0
-
+
\ No newline at end of file
diff --git a/java-blockchain/pom.xml b/java-blockchain/pom.xml
index 3100fed7b9..6d3910df80 100644
--- a/java-blockchain/pom.xml
+++ b/java-blockchain/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldung.blockchainjava-blockchain
diff --git a/java-collections-conversions-2/README.md b/java-collections-conversions-2/README.md
index 628421b0e2..83b3ec8786 100644
--- a/java-collections-conversions-2/README.md
+++ b/java-collections-conversions-2/README.md
@@ -8,4 +8,5 @@ This module contains articles about conversions among Collection types and array
- [Mapping Lists with ModelMapper](https://www.baeldung.com/java-modelmapper-lists)
- [Converting List to Map With a Custom Supplier](https://www.baeldung.com/list-to-map-supplier)
- [Arrays.asList vs new ArrayList(Arrays.asList())](https://www.baeldung.com/java-arrays-aslist-vs-new-arraylist)
+- [Iterate Over a Set in Java](https://www.baeldung.com/java-iterate-set)
- More articles: [[<-- prev]](../java-collections-conversions)
diff --git a/java-collections-conversions-2/pom.xml b/java-collections-conversions-2/pom.xml
index 23f20276a3..74f955ebdd 100644
--- a/java-collections-conversions-2/pom.xml
+++ b/java-collections-conversions-2/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0java-collections-conversions-20.1.0-SNAPSHOT
@@ -43,6 +44,12 @@
${hamcrest.version}test
+
+ io.vavr
+ vavr
+ 0.10.3
+
+
@@ -55,4 +62,4 @@
-
+
\ No newline at end of file
diff --git a/java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java b/java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java
new file mode 100644
index 0000000000..ee0943ec1c
--- /dev/null
+++ b/java-collections-conversions-2/src/test/java/com/baeldung/setiteration/SetIteration.java
@@ -0,0 +1,74 @@
+package com.baeldung.setiteration;
+
+import com.google.common.collect.Sets;
+import io.vavr.collection.Stream;
+import org.junit.jupiter.api.Test;
+
+import java.util.Iterator;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+class SetIteration {
+
+ @Test
+ void givenSet_whenIteratorUsed_shouldIterateOverElements() {
+ // given
+ Set names = Sets.newHashSet("Tom", "Jane", "Karen");
+
+ // when
+ Iterator namesIterator1 = names.iterator();
+ Iterator namesIterator2 = names.iterator();
+
+ // then
+ namesIterator1.forEachRemaining(System.out::println);
+ while(namesIterator2.hasNext()) {
+ System.out.println(namesIterator2.next());
+ }
+ }
+
+ @Test
+ void givenSet_whenStreamUsed_shouldIterateOverElements() {
+ // given
+ Set names = Sets.newHashSet("Tom", "Jane", "Karen");
+
+ // when & then
+ String namesJoined = names.stream()
+ .map(String::toUpperCase)
+ .peek(System.out::println)
+ .collect(Collectors.joining());
+ }
+
+ @Test
+ void givenSet_whenEnhancedLoopUsed_shouldIterateOverElements() {
+ // given
+ Set names = Sets.newHashSet("Tom", "Jane", "Karen");
+
+ // when & then
+ for (String name : names) {
+ System.out.println(name);
+ }
+ }
+
+ @Test
+ void givenSet_whenMappedToArray_shouldIterateOverElements() {
+ // given
+ Set names = Sets.newHashSet("Tom", "Jane", "Karen");
+
+ // when & then
+ Object[] namesArray = names.toArray();
+ for (int i = 0; i < namesArray.length; i++) {
+ System.out.println(i + ": " + namesArray[i]);
+ }
+ }
+
+ @Test
+ void givenSet_whenZippedWithIndex_shouldIterateOverElements() {
+ // given
+ Set names = Sets.newHashSet("Tom", "Jane", "Karen");
+
+ // when & then
+ Stream.ofAll(names)
+ .zipWithIndex()
+ .forEach(t -> System.out.println(t._2() + ": " + t._1()));
+ }
+}
diff --git a/java-collections-conversions/pom.xml b/java-collections-conversions/pom.xml
index 2073640372..92fc66b480 100644
--- a/java-collections-conversions/pom.xml
+++ b/java-collections-conversions/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0java-collections-conversions0.1.0-SNAPSHOT
@@ -40,4 +41,5 @@
4.1
-
+
+
\ No newline at end of file
diff --git a/java-collections-maps-3/pom.xml b/java-collections-maps-3/pom.xml
index 3888623a7f..37a0f617d0 100644
--- a/java-collections-maps-3/pom.xml
+++ b/java-collections-maps-3/pom.xml
@@ -1,7 +1,13 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ java-collections-maps-3
+ 0.1.0-SNAPSHOT
+ java-collections-maps-3
+ jar
+
com.baeldungparent-java
@@ -9,12 +15,6 @@
../parent-java
- 4.0.0
- java-collections-maps-3
- 0.1.0-SNAPSHOT
- java-collections-maps-3
- jar
-
org.springframework
@@ -28,11 +28,11 @@
${assertj.version}test
-
- org.apache.commons
- commons-collections4
- ${commons-collections4.version}
-
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
@@ -40,4 +40,4 @@
3.6.15.2.5.RELEASE
-
+
\ No newline at end of file
diff --git a/java-ee-8-security-api/app-auth-basic-store-db/pom.xml b/java-ee-8-security-api/app-auth-basic-store-db/pom.xml
index 02e3b04a40..7307f144a7 100644
--- a/java-ee-8-security-api/app-auth-basic-store-db/pom.xml
+++ b/java-ee-8-security-api/app-auth-basic-store-db/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0app-auth-basic-store-dbapp-auth-basic-store-db
@@ -65,4 +66,4 @@
-
+
\ No newline at end of file
diff --git a/java-ee-8-security-api/app-auth-custom-form-store-custom/pom.xml b/java-ee-8-security-api/app-auth-custom-form-store-custom/pom.xml
index 9354782999..729b426049 100644
--- a/java-ee-8-security-api/app-auth-custom-form-store-custom/pom.xml
+++ b/java-ee-8-security-api/app-auth-custom-form-store-custom/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0app-auth-custom-form-store-customapp-auth-custom-form-store-custom
@@ -39,4 +40,4 @@
-
+
\ No newline at end of file
diff --git a/java-ee-8-security-api/app-auth-custom-no-store/pom.xml b/java-ee-8-security-api/app-auth-custom-no-store/pom.xml
index fee665e22d..da6ed0a1a5 100644
--- a/java-ee-8-security-api/app-auth-custom-no-store/pom.xml
+++ b/java-ee-8-security-api/app-auth-custom-no-store/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0app-auth-custom-no-storeapp-auth-custom-no-store
@@ -65,4 +66,4 @@
-
+
\ No newline at end of file
diff --git a/java-ee-8-security-api/app-auth-form-store-ldap/pom.xml b/java-ee-8-security-api/app-auth-form-store-ldap/pom.xml
index f8d19b5750..1dea82992c 100644
--- a/java-ee-8-security-api/app-auth-form-store-ldap/pom.xml
+++ b/java-ee-8-security-api/app-auth-form-store-ldap/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -53,4 +52,4 @@
4.0.4
-
+
\ No newline at end of file
diff --git a/java-ee-8-security-api/pom.xml b/java-ee-8-security-api/pom.xml
index 5eeebcb6f0..c01bedbeee 100644
--- a/java-ee-8-security-api/pom.xml
+++ b/java-ee-8-security-api/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0java-ee-8-security-api1.0-SNAPSHOT
@@ -71,4 +71,4 @@
18.0.0.1
-
+
\ No newline at end of file
diff --git a/java-native/pom.xml b/java-native/pom.xml
index 29fc13b8d8..95cb24bd98 100644
--- a/java-native/pom.xml
+++ b/java-native/pom.xml
@@ -12,10 +12,6 @@
1.0.0-SNAPSHOT
-
- 5.6.0
-
-
net.java.dev.jna
@@ -23,7 +19,7 @@
${jna.version}
-
+
@@ -36,4 +32,9 @@
+
+
+ 5.6.0
+
+
\ No newline at end of file
diff --git a/java-numbers-2/pom.xml b/java-numbers-2/pom.xml
index 5c81b00756..466d040b13 100644
--- a/java-numbers-2/pom.xml
+++ b/java-numbers-2/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0java-numbers-20.1.0-SNAPSHOT
@@ -42,4 +42,4 @@
2.6.0
-
+
\ No newline at end of file
diff --git a/java-numbers-3/pom.xml b/java-numbers-3/pom.xml
index 62225a898f..e8e080c4c0 100644
--- a/java-numbers-3/pom.xml
+++ b/java-numbers-3/pom.xml
@@ -54,4 +54,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/java-numbers-4/pom.xml b/java-numbers-4/pom.xml
index f4b0e23bd7..dbd6ac456a 100644
--- a/java-numbers-4/pom.xml
+++ b/java-numbers-4/pom.xml
@@ -48,4 +48,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/java-numbers/pom.xml b/java-numbers/pom.xml
index fc904c5747..8bab655f73 100644
--- a/java-numbers/pom.xml
+++ b/java-numbers/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0java-numbers0.1.0-SNAPSHOT
@@ -54,4 +54,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/java-rmi/pom.xml b/java-rmi/pom.xml
index 5fa3ac8845..fee5107423 100644
--- a/java-rmi/pom.xml
+++ b/java-rmi/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.baeldung.rmijava-rmi
@@ -14,4 +15,4 @@
1.0.0-SNAPSHOT
-
+
\ No newline at end of file
diff --git a/java-rmi/src/test/java/com/baeldung/rmi/JavaRMIIntegrationTest.java b/java-rmi/src/test/java/com/baeldung/rmi/JavaRMIIntegrationTest.java
index 5e4ecb3e76..604899de03 100644
--- a/java-rmi/src/test/java/com/baeldung/rmi/JavaRMIIntegrationTest.java
+++ b/java-rmi/src/test/java/com/baeldung/rmi/JavaRMIIntegrationTest.java
@@ -1,42 +1,42 @@
package com.baeldung.rmi;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
+import org.junit.Before;
+import org.junit.Test;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
public class JavaRMIIntegrationTest {
-
- @BeforeClass
- public static void whenRunServer_thenServerStarts() {
-
- try {
- MessengerServiceImpl server = new MessengerServiceImpl();
- server.createStubAndBind();
- } catch (RemoteException e) {
- fail("Exception Occurred: " + e);
- }
- }
-
- @Test
- public void whenClientSendsMessageToServer_thenServerSendsResponseMessage() {
-
- try {
- Registry registry = LocateRegistry.getRegistry();
- MessengerService server = (MessengerService) registry.lookup("MessengerService");
- String responseMessage = server.sendMessage("Client Message");
-
- String expectedMessage = "Server Message";
- assertEquals(responseMessage, expectedMessage);
- } catch (RemoteException | NotBoundException e) {
- fail("Exception Occurred: " + e);
- };
- }
-
+
+ private MessengerServiceImpl messengerService;
+
+ @Before
+ public void init() {
+ try {
+ messengerService = new MessengerServiceImpl();
+ messengerService.createStubAndBind();
+ } catch (RemoteException e) {
+ fail("Exception Occurred: " + e);
+ }
+ }
+
+ @Test
+ public void whenClientSendsMessageToServer_thenServerSendsResponseMessage() {
+ try {
+ Registry registry = LocateRegistry.getRegistry();
+ MessengerService server = (MessengerService) registry.lookup("MessengerService");
+ String responseMessage = server.sendMessage("Client Message");
+
+ String expectedMessage = "Server Message";
+ assertEquals(responseMessage, expectedMessage);
+ } catch (RemoteException | NotBoundException e) {
+ fail("Exception Occurred: " + e);
+ }
+ }
+
}
\ No newline at end of file
diff --git a/java-spi/exchange-rate-api/pom.xml b/java-spi/exchange-rate-api/pom.xml
index 1630dbf699..8067175cac 100644
--- a/java-spi/exchange-rate-api/pom.xml
+++ b/java-spi/exchange-rate-api/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0exchange-rate-apiexchange-rate-api
@@ -12,4 +13,4 @@
1.0.0-SNAPSHOT
-
+
\ No newline at end of file
diff --git a/java-spi/exchange-rate-app/pom.xml b/java-spi/exchange-rate-app/pom.xml
index fea9ebe8d9..fbf87eb026 100644
--- a/java-spi/exchange-rate-app/pom.xml
+++ b/java-spi/exchange-rate-app/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0exchange-rate-appexchange-rate-app
@@ -24,4 +25,4 @@
1.0.0-SNAPSHOT
-
+
\ No newline at end of file
diff --git a/java-spi/exchange-rate-impl/pom.xml b/java-spi/exchange-rate-impl/pom.xml
index 553a9e3377..254a8bb809 100644
--- a/java-spi/exchange-rate-impl/pom.xml
+++ b/java-spi/exchange-rate-impl/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0exchange-rate-implexchange-rate-impl
@@ -71,4 +72,4 @@
3.1.0
-
+
\ No newline at end of file
diff --git a/java-spi/pom.xml b/java-spi/pom.xml
index 6d4874083d..fac6409b9f 100644
--- a/java-spi/pom.xml
+++ b/java-spi/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0java-spijava-spi
@@ -18,4 +19,4 @@
exchange-rate-app
-
+
\ No newline at end of file
diff --git a/java-vavr-stream/pom.xml b/java-vavr-stream/pom.xml
index 94520f299d..8358c29003 100644
--- a/java-vavr-stream/pom.xml
+++ b/java-vavr-stream/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.baeldung.samplesjava-vavr-stream
diff --git a/java-websocket/pom.xml b/java-websocket/pom.xml
index ddf10c4457..ffc2b0631e 100644
--- a/java-websocket/pom.xml
+++ b/java-websocket/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0java-websocket0.0.1-SNAPSHOT
@@ -32,4 +33,4 @@
2.8.0
-
+
\ No newline at end of file
diff --git a/javafx/pom.xml b/javafx/pom.xml
index 50b9e7135c..9b0b6002a8 100644
--- a/javafx/pom.xml
+++ b/javafx/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0javafxjavafx
diff --git a/javax-servlets/pom.xml b/javax-servlets/pom.xml
index 700b823a6e..f1677050cf 100644
--- a/javax-servlets/pom.xml
+++ b/javax-servlets/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.baeldung.javax-servletsjavax-servlets
@@ -21,21 +22,18 @@
${assertj.version}test
-
commons-fileuploadcommons-fileupload${commons-fileupload.version}
-
javax.servletjavax.servlet-api${javax.servlet-api.version}
-
org.apache.httpcomponentshttpclient
@@ -62,4 +60,4 @@
4.0.1
-
+
\ No newline at end of file
diff --git a/javaxval/pom.xml b/javaxval/pom.xml
index 2655d1fe3e..d684e9dfe2 100644
--- a/javaxval/pom.xml
+++ b/javaxval/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0javaxval0.1-SNAPSHOT
@@ -47,4 +48,4 @@
5.0.2.RELEASE3.11.1
-
+
\ No newline at end of file
diff --git a/javaxval/src/test/java/com/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java b/javaxval/src/test/java/com/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java
index 2df0cf81af..801d7966a5 100644
--- a/javaxval/src/test/java/com/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java
+++ b/javaxval/src/test/java/com/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java
@@ -1,18 +1,17 @@
package com.baeldung.javaxval.bigdecimal;
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.math.BigDecimal;
-import java.util.Set;
-
-import javax.validation.ConstraintViolation;
-import javax.validation.Validation;
-import javax.validation.Validator;
-
import com.baeldung.javaxval.LocaleAwareUnitTest;
import org.junit.BeforeClass;
import org.junit.Test;
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+import java.math.BigDecimal;
+import java.util.Set;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
public class InvoiceUnitTest extends LocaleAwareUnitTest {
private static Validator validator;
@@ -24,41 +23,67 @@ public class InvoiceUnitTest extends LocaleAwareUnitTest {
}
@Test
- public void whenPriceIntegerDigitLessThanThreeWithDecimalValue_thenShouldGiveConstraintViolations() {
- Invoice invoice = new Invoice(new BigDecimal(10.21), "Book purchased");
+ public void whenLessThanThreeIntegerDigits_thenShouldNotGiveConstraintViolations() {
+ Invoice invoice = new Invoice(new BigDecimal("10.21"), "Book purchased");
Set> violations = validator.validate(invoice);
- assertThat(violations.size()).isEqualTo(1);
- violations.forEach(action -> assertThat(action.getMessage()).isEqualTo("numeric value out of bounds (<3 digits>.<2 digits> expected)"));
+ assertThat(violations).isEmpty();
}
@Test
- public void whenPriceIntegerDigitLessThanThreeWithIntegerValue_thenShouldNotGiveConstraintViolations() {
- Invoice invoice = new Invoice(new BigDecimal(10), "Book purchased");
+ public void whenThreeIntegerDigits_thenShouldNotGiveConstraintViolations() {
+ Invoice invoice = new Invoice(new BigDecimal("102.21"), "Book purchased");
Set> violations = validator.validate(invoice);
- assertThat(violations.size()).isEqualTo(0);
+ assertThat(violations).isEmpty();
}
@Test
- public void whenPriceIntegerDigitGreaterThanThree_thenShouldGiveConstraintViolations() {
- Invoice invoice = new Invoice(new BigDecimal(1021.21), "Book purchased");
+ public void whenMoreThanThreeIntegerDigits_thenShouldGiveConstraintViolations() {
+ Invoice invoice = new Invoice(new BigDecimal("1021.21"), "Book purchased");
Set> violations = validator.validate(invoice);
- assertThat(violations.size()).isEqualTo(1);
- violations.forEach(action -> assertThat(action.getMessage()).isEqualTo("numeric value out of bounds (<3 digits>.<2 digits> expected)"));
+ assertThat(violations).hasSize(1);
+ assertThat(violations)
+ .extracting("message")
+ .containsOnly("numeric value out of bounds (<3 digits>.<2 digits> expected)");
+ }
+
+ @Test
+ public void whenLessThanTwoFractionDigits_thenShouldNotGiveConstraintViolations() {
+ Invoice invoice = new Invoice(new BigDecimal("99.9"), "Book purchased");
+ Set> violations = validator.validate(invoice);
+ assertThat(violations).isEmpty();
+ }
+
+ @Test
+ public void whenTwoFractionDigits_thenShouldNotGiveConstraintViolations() {
+ Invoice invoice = new Invoice(new BigDecimal("99.99"), "Book purchased");
+ Set> violations = validator.validate(invoice);
+ assertThat(violations).isEmpty();
+ }
+
+ @Test
+ public void whenMoreThanTwoFractionDigits_thenShouldGiveConstraintViolations() {
+ Invoice invoice = new Invoice(new BigDecimal("99.999"), "Book purchased");
+ Set> violations = validator.validate(invoice);
+ assertThat(violations).hasSize(1);
+ assertThat(violations)
+ .extracting("message")
+ .containsOnly("numeric value out of bounds (<3 digits>.<2 digits> expected)");
}
@Test
public void whenPriceIsZero_thenShouldGiveConstraintViolations() {
- Invoice invoice = new Invoice(new BigDecimal(000.00), "Book purchased");
+ Invoice invoice = new Invoice(new BigDecimal("0.00"), "Book purchased");
Set> violations = validator.validate(invoice);
- assertThat(violations.size()).isEqualTo(1);
- violations.forEach(action -> assertThat(action.getMessage()).isEqualTo("must be greater than 0.0"));
+ assertThat(violations).hasSize(1);
+ assertThat(violations)
+ .extracting("message")
+ .containsOnly("must be greater than 0.0");
}
@Test
public void whenPriceIsGreaterThanZero_thenShouldNotGiveConstraintViolations() {
- Invoice invoice = new Invoice(new BigDecimal(100.50), "Book purchased");
+ Invoice invoice = new Invoice(new BigDecimal("100.50"), "Book purchased");
Set> violations = validator.validate(invoice);
- assertThat(violations.size()).isEqualTo(0);
+ assertThat(violations).isEmpty();
}
-
}
diff --git a/jaxb/pom.xml b/jaxb/pom.xml
index dc13cf75bc..183f7f13cb 100644
--- a/jaxb/pom.xml
+++ b/jaxb/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0jaxb0.0.1-SNAPSHOT
@@ -34,7 +35,6 @@
true
-
@@ -55,7 +55,7 @@
-
+
@@ -64,9 +64,7 @@
-
-
org.codehaus.mojo
diff --git a/jee-7-security/pom.xml b/jee-7-security/pom.xml
index e47df7aae9..a8ceee8704 100644
--- a/jee-7-security/pom.xml
+++ b/jee-7-security/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0jee-7-security1.0-SNAPSHOT
@@ -58,4 +59,4 @@
1.0-pr
-
+
\ No newline at end of file
diff --git a/jee-7/pom.xml b/jee-7/pom.xml
index b0e10c1580..b68c8b9801 100644
--- a/jee-7/pom.xml
+++ b/jee-7/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0jee-71.0-SNAPSHOT
@@ -41,7 +41,6 @@
${javaee_api.version}provided
-
org.jboss.arquillian.junitarquillian-junit-container
@@ -60,14 +59,12 @@
${awaitility.version}test
-
org.jboss.shrinkwrap.resolvershrinkwrap-resolver-impl-maventestjar
-
org.jboss.shrinkwrap.resolvershrinkwrap-resolver-impl-maven-archive
@@ -114,7 +111,6 @@
standard${taglibs.standard.version}
-
javax.mvcjavax.mvc-api
@@ -125,13 +121,11 @@
ozark${ozark.version}
-
org.springframework.securityspring-security-web${org.springframework.security.version}
-
org.springframework.securityspring-security-config
@@ -143,7 +137,6 @@
${org.springframework.security.version}
-
org.jboss.spec.javax.batchjboss-batch-api_1.0_spec
@@ -210,8 +203,8 @@
-
+
org.eclipse.m2elifecycle-mapping
@@ -242,7 +235,7 @@
-
+
org.codehaus.mojojaxws-maven-plugin
@@ -523,7 +516,6 @@
2.251.0.0.Final4.2.3.RELEASE
- 2.21.01.1.22.2.144.5
@@ -540,4 +532,4 @@
2.22.1
-
+
\ No newline at end of file
diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointIntegrationTest.java
similarity index 96%
rename from jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java
rename to jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointIntegrationTest.java
index c607efeb24..8190ae5afb 100644
--- a/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java
+++ b/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointIntegrationTest.java
@@ -12,7 +12,7 @@ import javax.batch.runtime.StepExecution;
import org.junit.jupiter.api.Test;
-class CustomCheckPointUnitTest {
+class CustomCheckPointIntegrationTest {
@Test
public void givenChunk_whenCustomCheckPoint_thenCommitCountIsThree() throws Exception {
JobOperator jobOperator = BatchRuntime.getJobOperator();
diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceIntegrationTest.java
similarity index 99%
rename from jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceUnitTest.java
rename to jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceIntegrationTest.java
index 4b27e5f5ec..7dda13a752 100644
--- a/jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceUnitTest.java
+++ b/jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceIntegrationTest.java
@@ -16,7 +16,7 @@ import javax.batch.runtime.StepExecution;
import org.junit.jupiter.api.Test;
-class JobSequenceUnitTest {
+class JobSequenceIntegrationTest {
@Test
public void givenTwoSteps_thenBatch_CompleteWithSuccess() throws Exception {
JobOperator jobOperator = BatchRuntime.getJobOperator();
diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetIntegrationTest.java
similarity index 98%
rename from jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java
rename to jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetIntegrationTest.java
index 788b75eb3e..dc91f747d3 100644
--- a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java
+++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetIntegrationTest.java
@@ -11,7 +11,7 @@ import javax.batch.runtime.JobExecution;
import org.junit.jupiter.api.Test;
-class SimpleBatchLetUnitTest {
+class SimpleBatchLetIntegrationTest {
@Test
public void givenBatchLet_thenBatch_CompleteWithSuccess() throws Exception {
JobOperator jobOperator = BatchRuntime.getJobOperator();
diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkIntegrationTest.java
similarity index 99%
rename from jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkUnitTest.java
rename to jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkIntegrationTest.java
index 9010c365a2..a7884dbb32 100644
--- a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkUnitTest.java
+++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkIntegrationTest.java
@@ -16,7 +16,7 @@ import javax.batch.runtime.StepExecution;
import org.junit.jupiter.api.Test;
-class SimpleChunkUnitTest {
+class SimpleChunkIntegrationTest {
@Test
public void givenChunk_thenBatch_CompletesWithSucess() throws Exception {
JobOperator jobOperator = BatchRuntime.getJobOperator();
diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkIntegrationTest.java
similarity index 97%
rename from jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java
rename to jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkIntegrationTest.java
index bc410aec8d..8c3beeb2f3 100644
--- a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java
+++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkIntegrationTest.java
@@ -13,7 +13,7 @@ import javax.batch.runtime.StepExecution;
import org.junit.jupiter.api.Test;
-class SimpleErrorChunkUnitTest {
+class SimpleErrorChunkIntegrationTest {
@Test
public void givenChunkError_thenBatch_CompletesWithFailed() throws Exception {
diff --git a/jersey/pom.xml b/jersey/pom.xml
index 065e2230a2..9f57179065 100644
--- a/jersey/pom.xml
+++ b/jersey/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0jersey0.0.1-SNAPSHOT
@@ -97,4 +98,4 @@
2.26
-
+
\ No newline at end of file
diff --git a/jgit/pom.xml b/jgit/pom.xml
index d960843868..ca58709583 100644
--- a/jgit/pom.xml
+++ b/jgit/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0jgit1.0-SNAPSHOT
diff --git a/jgroups/pom.xml b/jgroups/pom.xml
index 494de2fb4f..370d8a349a 100644
--- a/jgroups/pom.xml
+++ b/jgroups/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0jgroups0.1-SNAPSHOT
@@ -31,4 +32,4 @@
4.0.10.Final
-
+
\ No newline at end of file
diff --git a/jhipster-5/bookstore-monolith/pom.xml b/jhipster-5/bookstore-monolith/pom.xml
index dbc46bbb97..8403c2d1d4 100644
--- a/jhipster-5/bookstore-monolith/pom.xml
+++ b/jhipster-5/bookstore-monolith/pom.xml
@@ -6,7 +6,7 @@
bookstore-monolith0.0.1-SNAPSHOTwar
- Bookstore
+ bookstore-monolithjhipster-5
@@ -1099,8 +1099,6 @@
2.12.6v10.15.06.4.1
- UTF-8
- UTF-8${project.build.directory}/test-resultsyyyyMMddHHmmss${java.version}
diff --git a/jhipster/jhipster-uaa/gateway/pom.xml b/jhipster/jhipster-uaa/gateway/pom.xml
index b417bd7b57..53422bfa44 100644
--- a/jhipster/jhipster-uaa/gateway/pom.xml
+++ b/jhipster/jhipster-uaa/gateway/pom.xml
@@ -4,7 +4,7 @@
com.baeldung.jhipster.gatewaygateway0.0.1-SNAPSHOT
- Gateway
+ gatewaywar
@@ -1020,8 +1020,6 @@
2.12.6v8.12.06.4.1
- UTF-8
- UTF-8${project.build.directory}/test-resultsyyyyMMddHHmmss${java.version}
diff --git a/jhipster/jhipster-uaa/quotes/pom.xml b/jhipster/jhipster-uaa/quotes/pom.xml
index f088ad2fd1..2d61a2a820 100644
--- a/jhipster/jhipster-uaa/quotes/pom.xml
+++ b/jhipster/jhipster-uaa/quotes/pom.xml
@@ -4,7 +4,7 @@
com.baeldung.jhipster.quotesquotes0.0.1-SNAPSHOT
- Quotes
+ quoteswar
@@ -840,8 +840,6 @@
2.12.6v8.12.06.4.1
- UTF-8
- UTF-8${project.build.directory}/test-resultsyyyyMMddHHmmss${java.version}
diff --git a/jhipster/jhipster-uaa/uaa/pom.xml b/jhipster/jhipster-uaa/uaa/pom.xml
index f9c1f226bb..cabbf1de33 100644
--- a/jhipster/jhipster-uaa/uaa/pom.xml
+++ b/jhipster/jhipster-uaa/uaa/pom.xml
@@ -4,7 +4,7 @@
com.baeldung.jhipster.uaauaa0.0.1-SNAPSHOT
- Uaa
+ uaawar
@@ -842,8 +842,6 @@
2.12.6v8.12.06.4.1
- UTF-8
- UTF-8${project.build.directory}/test-resultsyyyyMMddHHmmss${java.version}
diff --git a/jib/pom.xml b/jib/pom.xml
index 15e7e44e7c..8208eebdf7 100644
--- a/jib/pom.xml
+++ b/jib/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0jib0.1-SNAPSHOT
@@ -42,4 +43,4 @@
2.5.0
-
+
\ No newline at end of file
diff --git a/jjwt/README.md b/jjwt/README.md
index 1798d5193b..ff4b7f547c 100644
--- a/jjwt/README.md
+++ b/jjwt/README.md
@@ -8,8 +8,7 @@ This tutorial walks you through the various features supported by the [JJWT](htt
It's super easy to build and exercise this tutorial.
```
-mvn clean install
-java -jar target/*.jar
+mvn clean spring-boot:run
```
That's it!
diff --git a/jjwt/pom.xml b/jjwt/pom.xml
index 9d38d1b0e9..4c194f9285 100644
--- a/jjwt/pom.xml
+++ b/jjwt/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0io.jsonwebtokenjjwt
@@ -20,28 +21,23 @@
org.springframework.bootspring-boot-devtools
-
org.springframework.bootspring-boot-starter-thymeleaf
-
org.springframework.bootspring-boot-starter-security
-
org.springframework.bootspring-boot-starter-web
-
io.jsonwebtokenjjwt${jjwt.version}
-
org.assertjassertj-core
@@ -53,4 +49,4 @@
0.7.0
-
+
\ No newline at end of file
diff --git a/jmeter/pom.xml b/jmeter/pom.xml
index e2830baef5..199d95e0d6 100644
--- a/jmeter/pom.xml
+++ b/jmeter/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0jmeterjmeter
@@ -40,7 +41,6 @@
org.springframework.bootspring-boot-maven-plugin
-
com.lazerycode.jmeterjmeter-maven-plugin
@@ -65,4 +65,4 @@
2.6.0
-
+
\ No newline at end of file
diff --git a/jmh/pom.xml b/jmh/pom.xml
index 16a5bc54a4..61f62efd5a 100644
--- a/jmh/pom.xml
+++ b/jmh/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0jmh1.0-SNAPSHOT
@@ -19,12 +20,12 @@
org.openjdk.jmhjmh-core
- ${openjdk.jmh.version}
+ ${jmh-core.version}org.openjdk.jmhjmh-generator-annprocess
- ${openjdk.jmh.version}
+ ${jmh-generator.version}org.openjdk.jol
@@ -47,7 +48,6 @@
-
org.apache.maven.pluginsmaven-assembly-plugin
@@ -76,7 +76,6 @@
- 1.193.0.20.103.2.0
diff --git a/jooby/pom.xml b/jooby/pom.xml
index fe26f9a4c6..f972a22e9c 100644
--- a/jooby/pom.xml
+++ b/jooby/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.baeldung.joobyjooby
@@ -60,4 +61,4 @@
2.4.3
-
+
\ No newline at end of file
diff --git a/jsf/pom.xml b/jsf/pom.xml
index dc110b9fd5..88099ef9c4 100644
--- a/jsf/pom.xml
+++ b/jsf/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0jsf0.1-SNAPSHOT
@@ -66,7 +67,6 @@
4.3.4.RELEASE
-
2.2.143.0.0
diff --git a/json-2/pom.xml b/json-2/pom.xml
index e27d1c83f6..fbae40b6a3 100644
--- a/json-2/pom.xml
+++ b/json-2/pom.xml
@@ -1,7 +1,8 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0com.baeldungjson-20.0.1-SNAPSHOT
@@ -11,7 +12,6 @@
com.baeldung1.0.0-SNAPSHOT
- 4.0.0
@@ -19,21 +19,18 @@
jsoniter${jsoniter.version}
-
junitjunit${junit.version}test
-
org.assertjassertj-core${assertj-core.version}test
-
com.squareup.moshimoshi
@@ -110,46 +107,50 @@
+
+
+
+
+
+
+ org.eclipse.m2e
+ lifecycle-mapping
+ 1.0.0
+
+
+
+
+
+
+ org.apache.maven.plugins
+
+
+ maven-pmd-plugin
+
+
+ [3.13.0,)
+
+
+ check
+
+
+
+
+
+
+
+
+
+
+
+
+
+
0.9.233.11.11.9.2
-
-
-
-
-
- org.eclipse.m2e
- lifecycle-mapping
- 1.0.0
-
-
-
-
-
-
- org.apache.maven.plugins
-
-
- maven-pmd-plugin
-
-
- [3.13.0,)
-
-
- check
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/json-path/pom.xml b/json-path/pom.xml
index 8756ffee7b..b4577ec15f 100644
--- a/json-path/pom.xml
+++ b/json-path/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0json-path0.0.1-SNAPSHOT
@@ -25,4 +26,5 @@
2.4.0
+
\ No newline at end of file
diff --git a/json/pom.xml b/json/pom.xml
index bd901b526e..260b2d1ad9 100644
--- a/json/pom.xml
+++ b/json/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0org.baeldungjson
@@ -87,4 +88,4 @@
3.11.1
-
+
\ No newline at end of file
diff --git a/jsoup/pom.xml b/jsoup/pom.xml
index d2b59476f3..44f8f996f5 100644
--- a/jsoup/pom.xml
+++ b/jsoup/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0jsoupjsoup
@@ -24,4 +25,4 @@
1.10.2
-
+
\ No newline at end of file
diff --git a/jta/pom.xml b/jta/pom.xml
index 8f90f74d43..b8b5570226 100644
--- a/jta/pom.xml
+++ b/jta/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0jta1.0-SNAPSHOT
@@ -35,4 +36,4 @@
-
+
\ No newline at end of file
diff --git a/jws/pom.xml b/jws/pom.xml
index be42798fd1..3d2f67c691 100644
--- a/jws/pom.xml
+++ b/jws/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.examplejws
@@ -66,4 +67,4 @@
3.0.2
-
+
\ No newline at end of file
diff --git a/kubernetes/k8s-intro/README.md b/kubernetes/k8s-intro/README.md
index 0055e8a27c..8c11f4d53e 100644
--- a/kubernetes/k8s-intro/README.md
+++ b/kubernetes/k8s-intro/README.md
@@ -15,3 +15,6 @@ If you get a valid response, then you're good to go.
### Relevant Articles:
- [Paging and Async Calls with the Kubernetes API](https://www.baeldung.com/java-kubernetes-paging-async)
+- [Using Watch with the Kubernetes API](https://www.baeldung.com/java-kubernetes-watch)
+- [Using Namespaces and Selectors With the Kubernetes Java API](https://www.baeldung.com/java-kubernetes-namespaces-selectors)
+- [Creating, Updating and Deleting Resources with the Java Kubernetes API](https://www.baeldung.com/java-kubernetes-api-crud)
diff --git a/kubernetes/k8s-intro/pom.xml b/kubernetes/k8s-intro/pom.xml
index 4a5bb09711..5da137ebb6 100644
--- a/kubernetes/k8s-intro/pom.xml
+++ b/kubernetes/k8s-intro/pom.xml
@@ -2,14 +2,15 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
- com.baeldung
- kubernetes-parent
- 1.0.0-SNAPSHOT
- k8s-intro0.0.1-SNAPSHOT
+
+ com.baeldung
+ kubernetes
+ 1.0.0-SNAPSHOT
+
+
io.kubernetes
@@ -38,4 +39,5 @@
+
\ No newline at end of file
diff --git a/kubernetes/k8s-intro/src/k8s/create-http-server.yml b/kubernetes/k8s-intro/src/k8s/create-http-server.yml
new file mode 100644
index 0000000000..59ef344de3
--- /dev/null
+++ b/kubernetes/k8s-intro/src/k8s/create-http-server.yml
@@ -0,0 +1,58 @@
+apiVersion: v1
+kind: Namespace
+metadata:
+ name: ns1
+---
+apiVersion: v1
+kind: Namespace
+metadata:
+ name: ns2
+---
+ apiVersion: apps/v1
+ kind: Deployment
+ metadata:
+ name: httpd
+ namespace: ns1
+ labels:
+ app: httpd
+ version: "1"
+ spec:
+ replicas: 3
+ selector:
+ matchLabels:
+ app: httpd
+ template:
+ metadata:
+ labels:
+ app: httpd
+ spec:
+ containers:
+ - name: main
+ image: httpd:alpine
+ ports:
+ - containerPort: 80
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: httpd
+ namespace: ns2
+ labels:
+ app: httpd
+ version: "2"
+ foo: bar
+spec:
+ replicas: 3
+ selector:
+ matchLabels:
+ app: httpd
+ template:
+ metadata:
+ labels:
+ app: httpd
+ spec:
+ containers:
+ - name: main
+ image: httpd:alpine
+ ports:
+ - containerPort: 80
\ No newline at end of file
diff --git a/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsWithFieldSelectors.java b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsWithFieldSelectors.java
new file mode 100644
index 0000000000..459f61099c
--- /dev/null
+++ b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsWithFieldSelectors.java
@@ -0,0 +1,68 @@
+/**
+ *
+ */
+package com.baeldung.kubernetes.intro;
+
+
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.kubernetes.client.openapi.ApiClient;
+import io.kubernetes.client.openapi.apis.CoreV1Api;
+import io.kubernetes.client.openapi.models.V1NodeList;
+import io.kubernetes.client.openapi.models.V1PodList;
+import io.kubernetes.client.util.Config;
+import okhttp3.OkHttpClient;
+import okhttp3.logging.HttpLoggingInterceptor;
+
+/**
+ * @author Philippe
+ *
+ */
+public class ListPodsWithFieldSelectors {
+
+ private static final Logger log = LoggerFactory.getLogger(ListPodsWithFieldSelectors.class);
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args) throws Exception {
+
+ ApiClient client = Config.defaultClient();
+ HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> log.info(message));
+ interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
+ OkHttpClient newClient = client.getHttpClient()
+ .newBuilder()
+ .addInterceptor(interceptor)
+ .readTimeout(0, TimeUnit.SECONDS)
+ .build();
+
+ client.setHttpClient(newClient);
+ CoreV1Api api = new CoreV1Api(client);
+
+ String fs = createSelector(args);
+ V1PodList items = api.listPodForAllNamespaces(null, null, fs, null, null, null, null, null, 10, false);
+ items.getItems()
+ .stream()
+ .map((pod) -> pod.getMetadata().getName() )
+ .forEach((name) -> System.out.println("name=" + name));
+
+ }
+
+ private static String createSelector(String[] args) {
+
+ StringBuilder b = new StringBuilder();
+ for( int i = 0 ; i < args.length; i++ ) {
+ if( b.length() > 0 ) {
+ b.append(',');
+ }
+
+ b.append(args[i]);
+ }
+
+ return b.toString();
+ }
+
+}
diff --git a/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsWithLabelSelectors.java b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsWithLabelSelectors.java
new file mode 100644
index 0000000000..2e7c8b6a1f
--- /dev/null
+++ b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsWithLabelSelectors.java
@@ -0,0 +1,68 @@
+/**
+ *
+ */
+package com.baeldung.kubernetes.intro;
+
+
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.kubernetes.client.openapi.ApiClient;
+import io.kubernetes.client.openapi.apis.CoreV1Api;
+import io.kubernetes.client.openapi.models.V1NodeList;
+import io.kubernetes.client.openapi.models.V1PodList;
+import io.kubernetes.client.util.Config;
+import okhttp3.OkHttpClient;
+import okhttp3.logging.HttpLoggingInterceptor;
+
+/**
+ * @author Philippe
+ *
+ */
+public class ListPodsWithLabelSelectors {
+
+ private static final Logger log = LoggerFactory.getLogger(ListPodsWithLabelSelectors.class);
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args) throws Exception {
+
+ ApiClient client = Config.defaultClient();
+ HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> log.info(message));
+ interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
+ OkHttpClient newClient = client.getHttpClient()
+ .newBuilder()
+ .addInterceptor(interceptor)
+ .readTimeout(0, TimeUnit.SECONDS)
+ .build();
+
+ client.setHttpClient(newClient);
+ CoreV1Api api = new CoreV1Api(client);
+
+ String selector = createSelector(args);
+ V1PodList items = api.listPodForAllNamespaces(null, null, null, selector, null, null, null, null, 10, false);
+ items.getItems()
+ .stream()
+ .map((pod) -> pod.getMetadata().getName() )
+ .forEach((name) -> System.out.println("name=" + name));
+
+ }
+
+ private static String createSelector(String[] args) {
+
+ StringBuilder b = new StringBuilder();
+ for( int i = 0 ; i < args.length; i++ ) {
+ if( b.length() > 0 ) {
+ b.append(',');
+ }
+
+ b.append(args[i]);
+ }
+
+ return b.toString();
+ }
+
+}
diff --git a/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsWithNamespaces.java b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsWithNamespaces.java
new file mode 100644
index 0000000000..68a951f394
--- /dev/null
+++ b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsWithNamespaces.java
@@ -0,0 +1,52 @@
+/**
+ *
+ */
+package com.baeldung.kubernetes.intro;
+
+
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.kubernetes.client.openapi.ApiClient;
+import io.kubernetes.client.openapi.apis.CoreV1Api;
+import io.kubernetes.client.openapi.models.V1NodeList;
+import io.kubernetes.client.openapi.models.V1PodList;
+import io.kubernetes.client.util.Config;
+import okhttp3.OkHttpClient;
+import okhttp3.logging.HttpLoggingInterceptor;
+
+/**
+ * @author Philippe
+ *
+ */
+public class ListPodsWithNamespaces {
+
+ private static final Logger log = LoggerFactory.getLogger(ListPodsWithNamespaces.class);
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args) throws Exception {
+
+ ApiClient client = Config.defaultClient();
+ HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> log.info(message));
+ interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
+ OkHttpClient newClient = client.getHttpClient()
+ .newBuilder()
+ .addInterceptor(interceptor)
+ .readTimeout(0, TimeUnit.SECONDS)
+ .build();
+
+ client.setHttpClient(newClient);
+ CoreV1Api api = new CoreV1Api(client);
+ String namespace = "ns1";
+ V1PodList items = api.listNamespacedPod(namespace,null, null, null, null, null, null, null, null, 10, false);
+ items.getItems()
+ .stream()
+ .map((pod) -> pod.getMetadata().getName() )
+ .forEach((name) -> System.out.println("name=" + name));
+
+ }
+}
diff --git a/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/RunJob.java b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/RunJob.java
new file mode 100644
index 0000000000..0c73dfb203
--- /dev/null
+++ b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/RunJob.java
@@ -0,0 +1,152 @@
+/**
+ *
+ */
+package com.baeldung.kubernetes.intro;
+
+import java.util.Collections;
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.kubernetes.client.custom.V1Patch;
+import io.kubernetes.client.custom.V1Patch.V1PatchAdapter;
+import io.kubernetes.client.openapi.ApiClient;
+import io.kubernetes.client.openapi.apis.BatchV1Api;
+import io.kubernetes.client.openapi.apis.CoreV1Api;
+import io.kubernetes.client.openapi.models.V1DeleteOptions;
+import io.kubernetes.client.openapi.models.V1DeleteOptionsBuilder;
+import io.kubernetes.client.openapi.models.V1Job;
+import io.kubernetes.client.openapi.models.V1JobBuilder;
+import io.kubernetes.client.openapi.models.V1JobSpec;
+import io.kubernetes.client.openapi.models.V1JobSpecBuilder;
+import io.kubernetes.client.openapi.models.V1ObjectMeta;
+import io.kubernetes.client.openapi.models.V1ObjectMetaBuilder;
+import io.kubernetes.client.openapi.models.V1Status;
+import io.kubernetes.client.util.Config;
+import io.kubernetes.client.util.PatchUtils;
+import okhttp3.OkHttpClient;
+import okhttp3.logging.HttpLoggingInterceptor;
+
+/**
+ * @author Philippe
+ *
+ */
+public class RunJob {
+
+ private static Logger log = LoggerFactory.getLogger(RunJob.class);
+
+ public static void main(String[] args) throws Exception {
+
+ // Create client with logginginterceptor
+ ApiClient client = Config.defaultClient();
+ HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> log.info(message));
+ interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
+ OkHttpClient newClient = client.getHttpClient()
+ .newBuilder()
+ .addInterceptor(interceptor)
+ .readTimeout(0, TimeUnit.SECONDS)
+ .build();
+ client.setHttpClient(newClient);
+
+ // Create Job Spec
+ BatchV1Api api = new BatchV1Api(client);
+ String ns = "report-jobs";
+ V1Job body = new V1JobBuilder()
+ .withNewMetadata()
+ .withNamespace(ns)
+ .withName("payroll-report-job")
+ .endMetadata()
+ .withNewSpec()
+ .withCompletions(2)
+ .withParallelism(1)
+ .withNewTemplate()
+ .withNewMetadata()
+ .addToLabels("name", "payroll-report")
+ .endMetadata()
+ .editOrNewSpec()
+ .addNewContainer()
+ .withName("main")
+ .withImage("alpine")
+ .addNewCommand("/bin/sh")
+ .addNewArg("-c")
+ .addNewArg("sleep 10")
+ .endContainer()
+ .withRestartPolicy("Never")
+ .endSpec()
+ .endTemplate()
+ .endSpec()
+ .build();
+
+ // Send to K8S
+ V1Job createdJob = api.createNamespacedJob(ns, body, null, null, null);
+ log.info("job: uid={}", createdJob.getMetadata().getUid());
+
+ // Let's change its parallelism value
+ V1Job patchedJob = new V1JobBuilder(createdJob)
+ .withNewMetadata()
+ .withName(createdJob.getMetadata().getName())
+ .withNamespace(createdJob.getMetadata().getNamespace())
+ .endMetadata()
+ .editSpec()
+ .withParallelism(2)
+ .endSpec()
+ .build();
+
+ String patchedJobJSON = client.getJSON().serialize(patchedJob);
+ V1Patch patch = new V1Patch(patchedJobJSON);
+
+ PatchUtils.patch(
+ V1Job.class,
+ () -> api.patchNamespacedJobCall(
+ createdJob.getMetadata().getName(),
+ createdJob.getMetadata().getNamespace(),
+ patch,
+ null,
+ null,
+ "acme",
+ true,
+ null),
+ V1Patch.PATCH_FORMAT_APPLY_YAML,
+ api.getApiClient());
+
+ while(!jobCompleted(api,createdJob)) {
+ log.info("[I75] still running...");
+ Thread.sleep(1000);
+ }
+
+ V1Status response = api.deleteNamespacedJob(
+ createdJob.getMetadata().getName(),
+ createdJob.getMetadata().getNamespace(),
+ null,
+ null,
+ null,
+ null,
+ null,
+ null ) ;
+
+ log.info("[I122] response={}", response);
+ }
+
+ private static boolean jobCompleted(BatchV1Api api, V1Job createdJob) throws Exception {
+
+ V1Job job = api.readNamespacedJob(
+ createdJob.getMetadata().getName(),
+ createdJob.getMetadata().getNamespace(),
+ null,null,null);
+
+ if ( job.getStatus() == null ) {
+ return false;
+ }
+
+ log.info("[I88] Status: active={}, succeeded={}, failed={}",
+ job.getStatus().getActive(),
+ job.getStatus().getSucceeded(),
+ job.getStatus().getFailed()
+ );
+ Integer active = job.getStatus().getActive();
+
+ return active == null || active == 0 ;
+ }
+
+}
diff --git a/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/WatchPods.java b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/WatchPods.java
new file mode 100644
index 0000000000..7df972b738
--- /dev/null
+++ b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/WatchPods.java
@@ -0,0 +1,72 @@
+package com.baeldung.kubernetes.intro;
+
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gson.reflect.TypeToken;
+
+import io.kubernetes.client.openapi.ApiClient;
+import io.kubernetes.client.openapi.ApiException;
+import io.kubernetes.client.openapi.apis.CoreV1Api;
+import io.kubernetes.client.openapi.models.V1ObjectMeta;
+import io.kubernetes.client.openapi.models.V1Pod;
+import io.kubernetes.client.util.Config;
+import io.kubernetes.client.util.Watch;
+import io.kubernetes.client.util.Watch.Response;
+import okhttp3.OkHttpClient;
+import okhttp3.logging.HttpLoggingInterceptor;
+
+public class WatchPods {
+
+ private static Logger log = LoggerFactory.getLogger(WatchPods.class);
+
+ public static void main(String[] args) throws Exception {
+
+ ApiClient client = Config.defaultClient();
+
+ // Optional, put helpful during tests: disable client timeout and enable
+ // HTTP wire-level logs
+ HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> log.info(message));
+ interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
+ OkHttpClient newClient = client.getHttpClient()
+ .newBuilder()
+ .addInterceptor(interceptor)
+ .readTimeout(0, TimeUnit.SECONDS)
+ .build();
+
+ client.setHttpClient(newClient);
+ CoreV1Api api = new CoreV1Api(client);
+
+ // Create the watch object that monitors pod creation/deletion/update events
+ while (true) {
+ log.info("[I46] Creating watch...");
+ try (Watch watch = Watch.createWatch(
+ client,
+ api.listPodForAllNamespacesCall(false, null, null, null, null, "false", null, null, 10, true, null),
+ new TypeToken>(){}.getType())) {
+
+ log.info("[I52] Receiving events:");
+ for (Response event : watch) {
+ V1Pod pod = event.object;
+ V1ObjectMeta meta = pod.getMetadata();
+ switch (event.type) {
+ case "ADDED":
+ case "MODIFIED":
+ case "DELETED":
+ log.info("event.type: {}, namespace={}, name={}",
+ event.type,
+ meta.getNamespace(),
+ meta.getName());
+ break;
+ default:
+ log.warn("[W66] Unknown event type: {}", event.type);
+ }
+ }
+ } catch (ApiException ex) {
+ log.error("[E70] ApiError", ex);
+ }
+ }
+ }
+}
diff --git a/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/WatchPodsUsingBookmarks.java b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/WatchPodsUsingBookmarks.java
new file mode 100644
index 0000000000..9dfccfec08
--- /dev/null
+++ b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/WatchPodsUsingBookmarks.java
@@ -0,0 +1,87 @@
+package com.baeldung.kubernetes.intro;
+
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gson.reflect.TypeToken;
+
+import io.kubernetes.client.openapi.ApiClient;
+import io.kubernetes.client.openapi.ApiException;
+import io.kubernetes.client.openapi.apis.CoreV1Api;
+import io.kubernetes.client.openapi.models.V1ObjectMeta;
+import io.kubernetes.client.openapi.models.V1Pod;
+import io.kubernetes.client.openapi.models.V1PodList;
+import io.kubernetes.client.util.Config;
+import io.kubernetes.client.util.Watch;
+import io.kubernetes.client.util.Watch.Response;
+import okhttp3.OkHttpClient;
+import okhttp3.logging.HttpLoggingInterceptor;
+
+public class WatchPodsUsingBookmarks {
+
+ private static Logger log = LoggerFactory.getLogger(WatchPodsUsingBookmarks.class);
+
+ public static void main(String[] args) throws Exception {
+
+ ApiClient client = Config.defaultClient();
+
+ // Optional, put helpful during tests: disable client timeout and enable
+ // HTTP wire-level logs
+ HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> log.info(message));
+ interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
+ OkHttpClient newClient = client.getHttpClient()
+ .newBuilder()
+ .addInterceptor(interceptor)
+ .readTimeout(0, TimeUnit.SECONDS)
+ .build();
+
+ client.setHttpClient(newClient);
+ CoreV1Api api = new CoreV1Api(client);
+
+ String resourceVersion = null;
+ while (true) {
+ // Get a fresh list only we need to resync
+ if ( resourceVersion == null ) {
+ log.info("[I48] Creating initial POD list...");
+ V1PodList podList = api.listPodForAllNamespaces(true, null, null, null, null, "false", resourceVersion, null, null, null);
+ resourceVersion = podList.getMetadata().getResourceVersion();
+ }
+
+ while (true) {
+ log.info("[I54] Creating watch: resourceVersion={}", resourceVersion);
+ try (Watch watch = Watch.createWatch(
+ client,
+ api.listPodForAllNamespacesCall(true, null, null, null, null, "false", resourceVersion, null, 10, true, null),
+ new TypeToken>(){}.getType())) {
+
+ log.info("[I60] Receiving events:");
+ for (Response event : watch) {
+ V1Pod pod = event.object;
+ V1ObjectMeta meta = pod.getMetadata();
+ switch (event.type) {
+ case "BOOKMARK":
+ resourceVersion = meta.getResourceVersion();
+ log.info("[I67] event.type: {}, resourceVersion={}", event.type,resourceVersion);
+ break;
+ case "ADDED":
+ case "MODIFIED":
+ case "DELETED":
+ log.info("event.type: {}, namespace={}, name={}",
+ event.type,
+ meta.getNamespace(),
+ meta.getName());
+ break;
+ default:
+ log.warn("[W76] Unknown event type: {}", event.type);
+ }
+ }
+ } catch (ApiException ex) {
+ log.error("[E80] ApiError", ex);
+ resourceVersion = null;
+ }
+ }
+ }
+ }
+}
diff --git a/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/WatchPodsUsingResourceVersions.java b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/WatchPodsUsingResourceVersions.java
new file mode 100644
index 0000000000..2165d7fc0b
--- /dev/null
+++ b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/WatchPodsUsingResourceVersions.java
@@ -0,0 +1,111 @@
+package com.baeldung.kubernetes.intro;
+
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+
+import io.kubernetes.client.openapi.ApiClient;
+import io.kubernetes.client.openapi.ApiException;
+import io.kubernetes.client.openapi.apis.CoreV1Api;
+import io.kubernetes.client.openapi.models.V1ObjectMeta;
+import io.kubernetes.client.openapi.models.V1Pod;
+import io.kubernetes.client.openapi.models.V1PodList;
+import io.kubernetes.client.util.Config;
+import io.kubernetes.client.util.Watch;
+import io.kubernetes.client.util.Watch.Response;
+import okhttp3.OkHttpClient;
+import okhttp3.logging.HttpLoggingInterceptor;
+
+public class WatchPodsUsingResourceVersions {
+
+ private static Logger log = LoggerFactory.getLogger(WatchPodsUsingResourceVersions.class);
+
+ public static void main(String[] args) throws Exception {
+
+ ApiClient client = Config.defaultClient();
+
+ // Optional, put helpful during tests: disable client timeout and enable
+ // HTTP wire-level logs
+ HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> log.info(message));
+ interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
+ OkHttpClient newClient = client.getHttpClient()
+ .newBuilder()
+ .addInterceptor(interceptor)
+ .readTimeout(0, TimeUnit.SECONDS)
+ .build();
+
+ client.setHttpClient(newClient);
+ CoreV1Api api = new CoreV1Api(client);
+
+ String resourceVersion = null;
+ while (true) {
+ try {
+ if ( resourceVersion == null ) {
+ V1PodList podList = api.listPodForAllNamespaces(null, null, null, null, null, null, resourceVersion, null, null, null);
+ resourceVersion = podList.getMetadata().getResourceVersion();
+ }
+
+ log.info("[I59] Creating watch: resourceVersion={}", resourceVersion);
+ try (Watch watch = Watch.createWatch(
+ client,
+ api.listPodForAllNamespacesCall(null, null, null, null, null, null, resourceVersion, null, 60, true, null),
+ new TypeToken>(){}.getType())) {
+
+ log.info("[I65] Receiving events:");
+ for (Response event : watch) {
+ V1Pod pod = event.object;
+ V1ObjectMeta meta = pod.getMetadata();
+ switch (event.type) {
+ case "ADDED":
+ case "MODIFIED":
+ case "DELETED":
+ log.info("event: type={}, namespace={}, name={}",
+ event.type,
+ meta.getNamespace(),
+ meta.getName());
+ break;
+ default:
+ log.warn("[W76] Unknown event type: {}", event.type);
+ }
+ }
+ }
+ }
+ catch (ApiException ex) {
+ if ( ex.getCode() == 504 || ex.getCode() == 410 ) {
+ resourceVersion = extractResourceVersionFromException(ex);
+ }
+ else {
+ // Reset resource version
+ resourceVersion = null;
+ }
+ }
+ }
+ }
+
+ private static String extractResourceVersionFromException(ApiException ex) {
+
+ String body = ex.getResponseBody();
+ if (body == null) {
+ return null;
+ }
+
+ Gson gson = new Gson();
+ Map,?> st = gson.fromJson(body, Map.class);
+ Pattern p = Pattern.compile("Timeout: Too large resource version: (\\d+), current: (\\d+)");
+ String msg = (String)st.get("message");
+ Matcher m = p.matcher(msg);
+ if (!m.matches()) {
+ return null;
+ }
+
+ return m.group(2);
+ }
+
+}
diff --git a/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListPodsWithFieldSelectorsLiveTest.java b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListPodsWithFieldSelectorsLiveTest.java
new file mode 100644
index 0000000000..9413fe1460
--- /dev/null
+++ b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListPodsWithFieldSelectorsLiveTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.kubernetes.intro;
+
+import org.junit.jupiter.api.Test;
+
+class ListPodsWithFieldSelectorsLiveTest {
+ @Test
+ void givenEqualitySelector_whenListPodsWithFieldSelectors_thenSuccess() throws Exception {
+ ListPodsWithFieldSelectors.main(new String[] {
+ "metadata.namespace=ns1"
+ });
+ }
+
+ @Test
+ void givenInequalitySelector_whenListPodsWithFieldSelectors_thenSuccess() throws Exception {
+ ListPodsWithFieldSelectors.main(new String[] {
+ "metadata.namespace!=ns1"
+ });
+ }
+
+ @Test
+ void givenChainedSelector_whenListPodsWithFieldSelectors_thenSuccess() throws Exception {
+ ListPodsWithFieldSelectors.main(new String[] {
+ "metadata.namespace=ns1",
+ "status.phase=Running"
+ });
+ }
+}
diff --git a/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListPodsWithLabelSelectorsLiveTest.java b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListPodsWithLabelSelectorsLiveTest.java
new file mode 100644
index 0000000000..eb64853225
--- /dev/null
+++ b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListPodsWithLabelSelectorsLiveTest.java
@@ -0,0 +1,55 @@
+package com.baeldung.kubernetes.intro;
+
+import org.junit.jupiter.api.Test;
+
+class ListPodsWithLabelSelectorsLiveTest {
+ @Test
+ void givenEqualitySelector_whenListPodsWithLabelSelectors_thenSuccess() throws Exception {
+ ListPodsWithLabelSelectors.main(new String[] {
+ "app=httpd"
+ });
+ }
+
+ @Test
+ void givenInqualitySelector_whenListPodsWithLabelSelectors_thenSuccess() throws Exception {
+ ListPodsWithLabelSelectors.main(new String[] {
+ "app!=httpd"
+ });
+ }
+
+ @Test
+ void givenInSetSelector_whenListPodsWithLabelSelectors_thenSuccess() throws Exception {
+ ListPodsWithLabelSelectors.main(new String[] {
+ "app in (httpd,test)"
+ });
+ }
+
+ @Test
+ void givenNotInSetSelector_whenListPodsWithLabelSelectors_thenSuccess() throws Exception {
+ ListPodsWithLabelSelectors.main(new String[] {
+ "app notin (httpd)"
+ });
+ }
+
+ @Test
+ void givenLabelPresentSelector_whenListPodsWithLabelSelectors_thenSuccess() throws Exception {
+ ListPodsWithLabelSelectors.main(new String[] {
+ "app"
+ });
+ }
+
+ @Test
+ void givenLabelNotPresentSelector_whenListPodsWithLabelSelectors_thenSuccess() throws Exception {
+ ListPodsWithLabelSelectors.main(new String[] {
+ "!app"
+ });
+ }
+
+ @Test
+ void givenChainedSelector_whenListPodsWithLabelSelectors_thenSuccess() throws Exception {
+ ListPodsWithLabelSelectors.main(new String[] {
+ "app=httpd",
+ "!foo"
+ });
+ }
+}
diff --git a/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/RunJobLiveTest.java b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/RunJobLiveTest.java
new file mode 100644
index 0000000000..d6621db2d4
--- /dev/null
+++ b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/RunJobLiveTest.java
@@ -0,0 +1,10 @@
+package com.baeldung.kubernetes.intro;
+
+import org.junit.jupiter.api.Test;
+
+class RunJobLiveTest {
+ @Test
+ void whenWatchPods_thenSuccess() throws Exception {
+ RunJob.main(new String[] {});
+ }
+}
diff --git a/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/WatchPodsLiveTest.java b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/WatchPodsLiveTest.java
new file mode 100644
index 0000000000..37828d7a2d
--- /dev/null
+++ b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/WatchPodsLiveTest.java
@@ -0,0 +1,10 @@
+package com.baeldung.kubernetes.intro;
+
+import org.junit.jupiter.api.Test;
+
+class WatchPodsLiveTest {
+ @Test
+ void whenWatchPods_thenSuccess() throws Exception {
+ WatchPods.main(new String[] {});
+ }
+}
diff --git a/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/WatchPodsUsingBookmarksLiveTest.java b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/WatchPodsUsingBookmarksLiveTest.java
new file mode 100644
index 0000000000..ea111f22a2
--- /dev/null
+++ b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/WatchPodsUsingBookmarksLiveTest.java
@@ -0,0 +1,10 @@
+package com.baeldung.kubernetes.intro;
+
+import org.junit.jupiter.api.Test;
+
+class WatchPodsUsingBookmarksLiveTest {
+ @Test
+ void whenWatchPods_thenSuccess() throws Exception {
+ WatchPodsUsingBookmarks.main(new String[] {});
+ }
+}
diff --git a/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/WatchPodsUsingResourceVersionsLiveTest.java b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/WatchPodsUsingResourceVersionsLiveTest.java
new file mode 100644
index 0000000000..79c3a13eb2
--- /dev/null
+++ b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/WatchPodsUsingResourceVersionsLiveTest.java
@@ -0,0 +1,10 @@
+package com.baeldung.kubernetes.intro;
+
+import org.junit.jupiter.api.Test;
+
+class WatchPodsUsingResourceVersionsLiveTest {
+ @Test
+ void whenWatchPods_thenSuccess() throws Exception {
+ WatchPodsUsingResourceVersions.main(new String[] {});
+ }
+}
diff --git a/kubernetes/pom.xml b/kubernetes/pom.xml
index fe10295e44..72cb1577a4 100644
--- a/kubernetes/pom.xml
+++ b/kubernetes/pom.xml
@@ -1,12 +1,16 @@
-
+4.0.0
+ kubernetes
+ pom
+
com.baeldungparent-modules1.0.0-SNAPSHOT
- kubernetes-parent
- pom
+
k8s-intro
diff --git a/language-interop/pom.xml b/language-interop/pom.xml
index bdf872a076..f2b0a08969 100644
--- a/language-interop/pom.xml
+++ b/language-interop/pom.xml
@@ -52,4 +52,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml
index 3aa36c3f90..28a7fb62fd 100644
--- a/libraries-2/pom.xml
+++ b/libraries-2/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0libraries-2libraries-2
@@ -75,7 +75,6 @@
-
edu.uci.icscrawler4j
@@ -136,4 +135,4 @@
2.5.0
-
+
\ No newline at end of file
diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml
index 2f6e9fa747..079628ffaa 100644
--- a/libraries-3/pom.xml
+++ b/libraries-3/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0libraries-3libraries-3
@@ -70,7 +70,7 @@
velocity-engine-core${velocity-engine-core.version}
-
+ com.uber.nullawaynullaway${nullaway.version}
@@ -80,8 +80,7 @@
plexus-compiler-javac-errorprone${plexus-compiler.version}
-
+
com.google.errorproneerror_prone_core
@@ -123,7 +122,7 @@
-
+ org.apache.maven.pluginsmaven-compiler-plugin3.5
@@ -141,7 +140,8 @@
-
+
-XepExcludedPaths:(.*)/test/.*|(.*)/jcabi/.*-XepOpt:NullAway:AnnotatedPackages=com.baeldung.nullaway
@@ -153,8 +153,8 @@
plexus-compiler-javac-errorprone2.8
-
+
com.google.errorproneerror_prone_core
@@ -170,7 +170,7 @@
-
+
reload
@@ -189,7 +189,6 @@
org.codehaus.mojoexec-maven-plugin
- ${exec-maven-plugin.version}start-server
@@ -211,11 +210,10 @@
-
+
1.781.18.6
-
0.432.7.21.2.3.Final
@@ -224,14 +222,12 @@
0.14.11.9.21.9.2
-
1.194.4.134.5.122.2
- 1.6.00.3.02.82.1.3
-
+
\ No newline at end of file
diff --git a/libraries-4/pom.xml b/libraries-4/pom.xml
index d7f6a44985..756bfbd3a8 100644
--- a/libraries-4/pom.xml
+++ b/libraries-4/pom.xml
@@ -1,15 +1,15 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ libraries-4
+
parent-modulescom.baeldung1.0.0-SNAPSHOT
- 4.0.0
-
- libraries-4
diff --git a/libraries-5/pom.xml b/libraries-5/pom.xml
index 63347dd60d..a3ca204995 100644
--- a/libraries-5/pom.xml
+++ b/libraries-5/pom.xml
@@ -1,16 +1,16 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ libraries-5
+
parent-modulescom.baeldung1.0.0-SNAPSHOT
- libraries-5
- 4.0.0
-
org.springframework
@@ -33,7 +33,6 @@
${pact.version}test
-
com.typesafe.akka
@@ -45,7 +44,6 @@
akka-testkit_${scala.version}${typesafe-akka.version}test
-
one.util
@@ -55,14 +53,13 @@
net.bytebuddybyte-buddy
- ${bytebuddy.version}
+ ${byte-buddy.version}net.bytebuddybyte-buddy-agent
- ${bytebuddy.version}
+ ${byte-buddy.version}
-
com.github.docker-java
@@ -84,7 +81,6 @@
-
com.github.ben-manes.caffeinecaffeine
@@ -115,7 +111,7 @@
org.openjdk.jmhjmh-core
- ${jmh.version}
+ ${jmh-core.version}
@@ -127,14 +123,12 @@
2.112.5.110.6.5
- 1.7.13.0.142.5.53.0.24.5.11.02.1.2
- 1.19
\ No newline at end of file
diff --git a/libraries-6/pom.xml b/libraries-6/pom.xml
index caaebbb922..289597adc9 100644
--- a/libraries-6/pom.xml
+++ b/libraries-6/pom.xml
@@ -1,15 +1,15 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ libraries-6
+
parent-modulescom.baeldung1.0.0-SNAPSHOT
- 4.0.0
-
- libraries-6
@@ -112,12 +112,12 @@
renjin-script-engine${renjin.version}
-
+
com.googlecode.libphonenumberlibphonenumber${libphonenumber.version}
-
+
@@ -164,5 +164,4 @@
8.12.9
-
\ No newline at end of file
diff --git a/libraries-apache-commons-collections/pom.xml b/libraries-apache-commons-collections/pom.xml
index 2209874c66..e2805552e3 100644
--- a/libraries-apache-commons-collections/pom.xml
+++ b/libraries-apache-commons-collections/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0libraries-apache-commons-collectionslibraries-apache-commons-collections
@@ -37,4 +38,4 @@
2.0.0.0
-
+
\ No newline at end of file
diff --git a/libraries-apache-commons-io/pom.xml b/libraries-apache-commons-io/pom.xml
index 21f3f16cd3..5d0ed20abf 100644
--- a/libraries-apache-commons-io/pom.xml
+++ b/libraries-apache-commons-io/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0libraries-apache-commons-iolibraries-apache-commons-io
@@ -28,4 +29,4 @@
1.4
-
+
\ No newline at end of file
diff --git a/libraries-apache-commons/pom.xml b/libraries-apache-commons/pom.xml
index 08dddac880..8fa55c1b0e 100644
--- a/libraries-apache-commons/pom.xml
+++ b/libraries-apache-commons/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0libraries-apache-commonslibraries-apache-commons
@@ -75,4 +76,4 @@
2.5
-
+
\ No newline at end of file
diff --git a/libraries-concurrency/pom.xml b/libraries-concurrency/pom.xml
index b7dc5187b1..d8f48a1959 100644
--- a/libraries-concurrency/pom.xml
+++ b/libraries-concurrency/pom.xml
@@ -47,7 +47,6 @@
org.codehaus.mojoexec-maven-plugin
- 1.6.0com.baeldung.quasar.Apptarget/classes
@@ -55,14 +54,11 @@
-Dco.paralleluniverse.fibers.verifyInstrumentation=true
-
-javaagent:${co.paralleluniverse:quasar-core:jar}
-
-classpath
-
com.baeldung.quasar.App
@@ -82,4 +78,5 @@
0.8.0
+
\ No newline at end of file
diff --git a/libraries-data-2/pom.xml b/libraries-data-2/pom.xml
index 0154823cca..1feb3142ee 100644
--- a/libraries-data-2/pom.xml
+++ b/libraries-data-2/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0libraries-data-2libraries-data-2
@@ -142,7 +142,7 @@
net.bytebuddybyte-buddy${byte-buddy.version}
- test
+ testorg.apache.kafka
@@ -168,7 +168,7 @@
0.1.01.0.39.1.5.Final
-
+
4.3.8.RELEASE4.0.01.1.0
diff --git a/libraries-data-3/README.md b/libraries-data-3/README.md
new file mode 100644
index 0000000000..d3bfb2c80c
--- /dev/null
+++ b/libraries-data-3/README.md
@@ -0,0 +1,11 @@
+## Data Libraries
+
+This module contains articles about libraries for data processing in Java.
+
+### Relevant articles
+- [Kafka Streams vs Kafka Consumer](https://www.baeldung.com/java-kafka-streams-vs-kafka-consumer)
+- [Kafka Topic Creation Using Java](https://www.baeldung.com/kafka-topic-creation)
+- More articles: [[<-- prev]](/../libraries-data-2)
+
+##### Building the project
+You can build the project from the command line using: *mvn clean install*, or in an IDE. If you have issues with the derive4j imports in your IDE, you have to add the folder: *target/generated-sources/annotations* to the project build path in your IDE.
diff --git a/libraries-data-3/log4j.properties b/libraries-data-3/log4j.properties
new file mode 100644
index 0000000000..2173c5d96f
--- /dev/null
+++ b/libraries-data-3/log4j.properties
@@ -0,0 +1 @@
+log4j.rootLogger=INFO, stdout
diff --git a/libraries-data-3/pom.xml b/libraries-data-3/pom.xml
new file mode 100644
index 0000000000..37d5c7ca0d
--- /dev/null
+++ b/libraries-data-3/pom.xml
@@ -0,0 +1,64 @@
+
+
+ 4.0.0
+ libraries-data-3
+ libraries-data-3
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.apache.kafka
+ kafka-clients
+ ${kafka.version}
+
+
+ org.apache.kafka
+ kafka-streams
+ ${kafka.version}
+
+
+ org.slf4j
+ slf4j-api
+ ${slf4j.version}
+
+
+ org.slf4j
+ slf4j-log4j12
+ ${slf4j.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ org.testcontainers
+ kafka
+ ${testcontainers-kafka.version}
+ test
+
+
+ org.testcontainers
+ junit-jupiter
+ ${testcontainers-jupiter.version}
+ test
+
+
+
+
+ 3.6.2
+ 1.7.25
+ 2.8.0
+ 1.15.3
+ 1.15.3
+
+
+
\ No newline at end of file
diff --git a/libraries-data-3/src/main/java/com/baeldung/kafka/admin/KafkaTopicApplication.java b/libraries-data-3/src/main/java/com/baeldung/kafka/admin/KafkaTopicApplication.java
new file mode 100644
index 0000000000..0d74e27d4e
--- /dev/null
+++ b/libraries-data-3/src/main/java/com/baeldung/kafka/admin/KafkaTopicApplication.java
@@ -0,0 +1,87 @@
+package com.baeldung.kafka.admin;
+
+import org.apache.kafka.clients.admin.Admin;
+import org.apache.kafka.clients.admin.AdminClientConfig;
+import org.apache.kafka.clients.admin.CreateTopicsOptions;
+import org.apache.kafka.clients.admin.CreateTopicsResult;
+import org.apache.kafka.clients.admin.NewTopic;
+import org.apache.kafka.common.KafkaFuture;
+import org.apache.kafka.common.config.TopicConfig;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+public class KafkaTopicApplication {
+
+ private final Properties properties;
+
+ public KafkaTopicApplication(Properties properties) {
+ this.properties = properties;
+ }
+
+ public void createTopic(String topicName) throws Exception {
+ try (Admin admin = Admin.create(properties)) {
+ int partitions = 1;
+ short replicationFactor = 1;
+ NewTopic newTopic = new NewTopic(topicName, partitions, replicationFactor);
+
+ CreateTopicsResult result = admin.createTopics(
+ Collections.singleton(newTopic));
+
+ // get the async result for the new topic creation
+ KafkaFuture future = result.values().get(topicName);
+
+ // call get() to block until topic creation has completed or failed
+ future.get();
+ }
+ }
+
+ public void createTopicWithOptions(String topicName) throws Exception {
+ Properties props = new Properties();
+ props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
+
+ try (Admin admin = Admin.create(props)) {
+ int partitions = 1;
+ short replicationFactor = 1;
+ NewTopic newTopic = new NewTopic(topicName, partitions, replicationFactor);
+
+ CreateTopicsOptions topicOptions = new CreateTopicsOptions()
+ .validateOnly(true)
+ .retryOnQuotaViolation(true);
+
+ CreateTopicsResult result = admin.createTopics(
+ Collections.singleton(newTopic), topicOptions
+ );
+
+ KafkaFuture future = result.values().get(topicName);
+ future.get();
+ }
+ }
+
+ public void createCompactedTopicWithCompression(String topicName) throws Exception {
+ Properties props = new Properties();
+ props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
+
+ try (Admin admin = Admin.create(props)) {
+ int partitions = 1;
+ short replicationFactor = 1;
+
+ // Create a compacted topic with 'lz4' compression codec
+ Map newTopicConfig = new HashMap<>();
+ newTopicConfig.put(TopicConfig.CLEANUP_POLICY_CONFIG, TopicConfig.CLEANUP_POLICY_COMPACT);
+ newTopicConfig.put(TopicConfig.COMPRESSION_TYPE_CONFIG, "lz4");
+ NewTopic newTopic = new NewTopic(topicName, partitions, replicationFactor)
+ .configs(newTopicConfig);
+
+ CreateTopicsResult result = admin.createTopics(
+ Collections.singleton(newTopic)
+ );
+
+ KafkaFuture future = result.values().get(topicName);
+ future.get();
+ }
+ }
+
+}
diff --git a/libraries-data-3/src/test/java/com/baeldung/kafka/admin/KafkaTopicApplicationIntegrationTest.java b/libraries-data-3/src/test/java/com/baeldung/kafka/admin/KafkaTopicApplicationIntegrationTest.java
new file mode 100644
index 0000000000..d79f6af7c1
--- /dev/null
+++ b/libraries-data-3/src/test/java/com/baeldung/kafka/admin/KafkaTopicApplicationIntegrationTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.kafka.admin;
+
+import org.apache.kafka.clients.admin.AdminClientConfig;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.testcontainers.containers.KafkaContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+import org.testcontainers.utility.DockerImageName;
+
+import java.util.Properties;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@Testcontainers
+class KafkaTopicApplicationIntegrationTest {
+
+ @Container
+ private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:5.4.3"));
+
+ private KafkaTopicApplication kafkaTopicApplication;
+
+ @BeforeEach
+ void setup() {
+ Properties properties = new Properties();
+ properties.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers());
+ kafkaTopicApplication = new KafkaTopicApplication(properties);
+ }
+
+ @Test
+ void givenTopicName_whenCreateNewTopic_thenTopicIsCreated() throws Exception {
+ kafkaTopicApplication.createTopic("test-topic");
+
+ String topicCommand = "/usr/bin/kafka-topics --bootstrap-server=localhost:9092 --list";
+ String stdout = KAFKA_CONTAINER.execInContainer("/bin/sh", "-c", topicCommand)
+ .getStdout();
+
+ assertThat(stdout).contains("test-topic");
+ }
+}
diff --git a/libraries-data-3/src/test/java/com/baeldung/kafka/streams/KafkaStreamsLiveTest.java b/libraries-data-3/src/test/java/com/baeldung/kafka/streams/KafkaStreamsLiveTest.java
new file mode 100644
index 0000000000..0d4c0606e3
--- /dev/null
+++ b/libraries-data-3/src/test/java/com/baeldung/kafka/streams/KafkaStreamsLiveTest.java
@@ -0,0 +1,279 @@
+package com.baeldung.kafka.streams;
+
+import org.apache.kafka.clients.consumer.ConsumerConfig;
+import org.apache.kafka.clients.producer.KafkaProducer;
+import org.apache.kafka.clients.producer.ProducerRecord;
+import org.apache.kafka.common.serialization.Serde;
+import org.apache.kafka.common.serialization.Serdes;
+import org.apache.kafka.common.utils.Bytes;
+import org.apache.kafka.streams.KafkaStreams;
+import org.apache.kafka.streams.KeyValue;
+import org.apache.kafka.streams.StoreQueryParameters;
+import org.apache.kafka.streams.StreamsBuilder;
+import org.apache.kafka.streams.StreamsConfig;
+import org.apache.kafka.streams.Topology;
+import org.apache.kafka.streams.kstream.Consumed;
+import org.apache.kafka.streams.kstream.Grouped;
+import org.apache.kafka.streams.kstream.JoinWindows;
+import org.apache.kafka.streams.kstream.KGroupedStream;
+import org.apache.kafka.streams.kstream.KGroupedTable;
+import org.apache.kafka.streams.kstream.KStream;
+import org.apache.kafka.streams.kstream.KTable;
+import org.apache.kafka.streams.kstream.Materialized;
+import org.apache.kafka.streams.kstream.Produced;
+import org.apache.kafka.streams.kstream.TimeWindows;
+import org.apache.kafka.streams.state.KeyValueIterator;
+import org.apache.kafka.streams.state.KeyValueStore;
+import org.apache.kafka.streams.state.QueryableStoreTypes;
+import org.apache.kafka.streams.state.ReadOnlyKeyValueStore;
+import org.apache.kafka.streams.state.StoreBuilder;
+import org.apache.kafka.streams.state.Stores;
+import org.apache.kafka.streams.state.WindowStore;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.testcontainers.containers.KafkaContainer;
+import org.testcontainers.utility.DockerImageName;
+
+import java.time.Duration;
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.Properties;
+
+import static org.apache.kafka.clients.consumer.ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG;
+import static org.apache.kafka.clients.producer.ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG;
+import static org.apache.kafka.clients.producer.ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG;
+
+public class KafkaStreamsLiveTest {
+ private final String LEFT_TOPIC = "left-stream-topic";
+ private final String RIGHT_TOPIC = "right-stream-topic";
+ private final String LEFT_RIGHT_TOPIC = "left-right-stream-topic";
+
+ private KafkaProducer producer = createKafkaProducer();
+ private Properties streamsConfiguration = new Properties();
+
+ static final String TEXT_LINES_TOPIC = "TextLinesTopic";
+
+ private final String TEXT_EXAMPLE_1 = "test test and test";
+ private final String TEXT_EXAMPLE_2 = "test filter filter this sentence";
+
+ @ClassRule
+ public static KafkaContainer kafka = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:5.4.3"));
+
+ @Before
+ public void setUp() {
+ streamsConfiguration.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, kafka.getBootstrapServers());
+ streamsConfiguration.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());
+ streamsConfiguration.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());
+ streamsConfiguration.put(StreamsConfig.COMMIT_INTERVAL_MS_CONFIG, 1000);
+ streamsConfiguration.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
+ }
+
+ @Test
+ public void shouldTestKafkaTableLatestWord() throws InterruptedException {
+ String inputTopic = "topicTable";
+
+ final StreamsBuilder builder = new StreamsBuilder();
+
+ KTable textLinesTable = builder.table(inputTopic,
+ Consumed.with(Serdes.String(), Serdes.String()));
+
+ textLinesTable.toStream().foreach((word, count) -> System.out.println("Latest word: " + word + " -> " + count));
+
+ final Topology topology = builder.build();
+ streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, "latest-word-id");
+ KafkaStreams streams = new KafkaStreams(topology, streamsConfiguration);
+
+ streams.cleanUp();
+ streams.start();
+ producer.send(new ProducerRecord(inputTopic, "1", TEXT_EXAMPLE_1));
+ producer.send(new ProducerRecord(inputTopic, "2", TEXT_EXAMPLE_2));
+
+ Thread.sleep(2000);
+ streams.close();
+ }
+
+ @Test
+ public void shouldTestWordCountKafkaStreams() throws InterruptedException {
+ String wordCountTopic = "wordCountTopic";
+
+ final StreamsBuilder builder = new StreamsBuilder();
+ KStream textLines = builder.stream(wordCountTopic,
+ Consumed.with(Serdes.String(), Serdes.String()));
+
+ KTable wordCounts = textLines
+ .flatMapValues(value -> Arrays.asList(value.toLowerCase(Locale.ROOT)
+ .split("\\W+")))
+ .groupBy((key, word) -> word)
+ .count(Materialized.> as("counts-store"));
+
+ wordCounts.toStream().foreach((word, count) -> System.out.println("Word: " + word + " -> " + count));
+
+ wordCounts.toStream().to("outputTopic",
+ Produced.with(Serdes.String(), Serdes.Long()));
+
+ streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, "wordcount-stream-table-id");
+ final Topology topology = builder.build();
+ KafkaStreams streams = new KafkaStreams(topology, streamsConfiguration);
+
+ streams.cleanUp();
+ streams.start();
+
+ producer.send(new ProducerRecord(wordCountTopic, "1", TEXT_EXAMPLE_1));
+ producer.send(new ProducerRecord(wordCountTopic, "2", TEXT_EXAMPLE_2));
+
+ Thread.sleep(2000);
+ streams.close();
+ }
+
+ // Filter, map
+ @Test
+ public void shouldTestStatelessTransformations() throws InterruptedException {
+ String wordCountTopic = "wordCountTopic";
+
+ //when
+ final StreamsBuilder builder = new StreamsBuilder();
+ KStream textLines = builder.stream(wordCountTopic,
+ Consumed.with(Serdes.String(), Serdes.String()));
+
+ final KStream textLinesUpperCase =
+ textLines
+ .map((key, value) -> KeyValue.pair(value, value.toUpperCase()))
+ .filter((key, value) -> value.contains("FILTER"));
+
+ KTable wordCounts = textLinesUpperCase
+ .flatMapValues(value -> Arrays.asList(value.split("\\W+")))
+ .groupBy((key, word) -> word)
+ .count(Materialized.> as("counts-store"));
+
+ wordCounts.toStream().foreach((word, count) -> System.out.println("Word: " + word + " -> " + count));
+
+ streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, "wordcount-filter-map-id");
+ final Topology topology = builder.build();
+ KafkaStreams streams = new KafkaStreams(topology, streamsConfiguration);
+
+ streams.cleanUp();
+ streams.start();
+
+ producer.send(new ProducerRecord(wordCountTopic, "1", TEXT_EXAMPLE_1));
+ producer.send(new ProducerRecord(wordCountTopic, "2", TEXT_EXAMPLE_2));
+
+ Thread.sleep(2000);
+ streams.close();
+
+ }
+
+ @Test
+ public void shouldTestAggregationStatefulTransformations() throws InterruptedException {
+ String aggregationTopic = "aggregationTopic";
+
+ final StreamsBuilder builder = new StreamsBuilder();
+ final KStream input = builder.stream(aggregationTopic,
+ Consumed.with(Serdes.ByteArray(), Serdes.String()));
+ final KTable aggregated = input
+ .groupBy((key, value) -> (value != null && value.length() > 0) ? value.substring(0, 2).toLowerCase() : "",
+ Grouped.with(Serdes.String(), Serdes.String()))
+ .aggregate(() -> 0L, (aggKey, newValue, aggValue) -> aggValue + newValue.length(),
+ Materialized.with(Serdes.String(), Serdes.Long()));
+
+ aggregated.toStream().foreach((word, count) -> System.out.println("Word: " + word + " -> " + count));
+
+ streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, "aggregation-id");
+ final Topology topology = builder.build();
+ KafkaStreams streams = new KafkaStreams(topology, streamsConfiguration);
+
+ streams.cleanUp();
+ streams.start();
+
+ producer.send(new ProducerRecord(aggregationTopic, "1", "one"));
+ producer.send(new ProducerRecord(aggregationTopic, "2", "two"));
+ producer.send(new ProducerRecord(aggregationTopic, "3", "three"));
+ producer.send(new ProducerRecord(aggregationTopic, "4", "four"));
+ producer.send(new ProducerRecord(aggregationTopic, "5", "five"));
+
+ Thread.sleep(5000);
+ streams.close();
+
+ }
+
+ @Test
+ public void shouldTestWindowingJoinStatefulTransformations() throws InterruptedException {
+ final StreamsBuilder builder = new StreamsBuilder();
+
+ KStream leftSource = builder.stream(LEFT_TOPIC);
+ KStream rightSource = builder.stream(RIGHT_TOPIC);
+
+ KStream leftRightSource = leftSource.outerJoin(rightSource,
+ (leftValue, rightValue) -> "left=" + leftValue + ", right=" + rightValue,
+ JoinWindows.of(Duration.ofSeconds(5)))
+ .groupByKey()
+ .reduce(((key, lastValue) -> lastValue))
+ .toStream();
+
+ leftRightSource.foreach((key, value) -> System.out.println("(key= " + key + ") -> (" + value + ")"));
+
+ final Topology topology = builder.build();
+ streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, "windowing-join-id");
+ KafkaStreams streams = new KafkaStreams(topology, streamsConfiguration);
+
+ streams.cleanUp();
+ streams.start();
+
+ producer.send(new ProducerRecord(LEFT_TOPIC, "1", "left"));
+ producer.send(new ProducerRecord(RIGHT_TOPIC, "2", "right"));
+
+ Thread.sleep(2000);
+ streams.close();
+ }
+
+ @Test
+ public void shouldTestWordCountWithInteractiveQueries() throws InterruptedException {
+
+ final Serde stringSerde = Serdes.String();
+ final StreamsBuilder builder = new StreamsBuilder();
+ final KStream
+ textLines = builder.stream(TEXT_LINES_TOPIC, Consumed.with(Serdes.String(), Serdes.String()));
+
+ final KGroupedStream groupedByWord = textLines
+ .flatMapValues(value -> Arrays.asList(value.toLowerCase().split("\\W+")))
+ .groupBy((key, word) -> word, Grouped.with(stringSerde, stringSerde));
+
+ groupedByWord.count(Materialized.>as("WordCountsStore")
+ .withValueSerde(Serdes.Long()));
+
+ streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, "wordcount-interactive-queries");
+
+ final KafkaStreams streams = new KafkaStreams(builder.build(), streamsConfiguration);
+ streams.cleanUp();
+ streams.start();
+
+ producer.send(new ProducerRecord(TEXT_LINES_TOPIC, "1", TEXT_EXAMPLE_1));
+ producer.send(new ProducerRecord(TEXT_LINES_TOPIC, "2", TEXT_EXAMPLE_2));
+
+ Thread.sleep(2000);
+ ReadOnlyKeyValueStore keyValueStore =
+ streams.store(StoreQueryParameters.fromNameAndType(
+ "WordCountsStore", QueryableStoreTypes.keyValueStore()));
+
+ KeyValueIterator range = keyValueStore.all();
+ while (range.hasNext()) {
+ KeyValue next = range.next();
+ System.out.println("Count for " + next.key + ": " + next.value);
+ }
+
+ streams.close();
+ }
+
+ private static KafkaProducer createKafkaProducer() {
+
+ Properties props = new Properties();
+ props.put(BOOTSTRAP_SERVERS_CONFIG, kafka.getBootstrapServers());
+ props.put(KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
+ props.put(VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
+
+ return new KafkaProducer(props);
+
+ }
+}
+
+
diff --git a/libraries-data-db/README.md b/libraries-data-db/README.md
index 790a3eb318..98a83d5669 100644
--- a/libraries-data-db/README.md
+++ b/libraries-data-db/README.md
@@ -3,9 +3,11 @@
This module contains articles about database-related data processing libraries.
### Relevant articles
+
- [Introduction to Reladomo](https://www.baeldung.com/reladomo)
- [Introduction to ORMLite](https://www.baeldung.com/ormlite)
- [Guide to Java Data Objects](https://www.baeldung.com/jdo)
- [Intro to JDO Queries 2/2](https://www.baeldung.com/jdo-queries)
- [Introduction to HikariCP](https://www.baeldung.com/hikaricp)
- [Guide to Ebean ORM](https://www.baeldung.com/ebean-orm)
+- [Introduction to Debezium](https://www.baeldung.com/debezium-intro)
diff --git a/libraries-data-db/pom.xml b/libraries-data-db/pom.xml
index d51580ccbc..20119da8a2 100644
--- a/libraries-data-db/pom.xml
+++ b/libraries-data-db/pom.xml
@@ -1,15 +1,16 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0libraries-data-dblibraries-data-dbcom.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
@@ -76,6 +77,64 @@
io.ebeanebean${ebean.version}
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+
+
+
+
+
+ io.debezium
+ debezium-api
+ ${debezium.version}
+
+
+ io.debezium
+ debezium-embedded
+ ${debezium.version}
+
+
+ org.slf4j
+ slf4j-log4j12
+
+
+
+
+ io.debezium
+ debezium-connector-mysql
+ ${debezium.version}
+
+
+ org.testcontainers
+ testcontainers
+ ${testcontainers-version}
+
+
+ org.testcontainers
+ mysql
+ ${testcontainers-version}
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+
+ mysql
+ mysql-connector-java
+
+
+
+ org.projectlombok
+ lombok
@@ -95,16 +154,25 @@
-
-
-
+
+
+
-
-
+
+
-
+
@@ -115,7 +183,6 @@
reladomogen${reladomo.version}
-
com.goldmansachs.reladomoreladomo-gen-util
@@ -157,7 +224,6 @@
-
org.datanucleus
@@ -213,6 +279,8 @@
3.2.0-m73.4.511.22.4
+ 1.4.2.Final
+ 1.15.3
\ No newline at end of file
diff --git a/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/DebeziumCDCApplication.java b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/DebeziumCDCApplication.java
new file mode 100644
index 0000000000..e690d096b1
--- /dev/null
+++ b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/DebeziumCDCApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.libraries.debezium;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DebeziumCDCApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DebeziumCDCApplication.class, args);
+ }
+
+}
diff --git a/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/config/DebeziumConnectorConfig.java b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/config/DebeziumConnectorConfig.java
new file mode 100644
index 0000000000..64e3bda4d6
--- /dev/null
+++ b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/config/DebeziumConnectorConfig.java
@@ -0,0 +1,58 @@
+package com.baeldung.libraries.debezium.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.io.File;
+import java.io.IOException;
+
+@Configuration
+public class DebeziumConnectorConfig {
+
+ /**
+ * Database details.
+ */
+ @Value("${customer.datasource.host}")
+ private String customerDbHost;
+
+ @Value("${customer.datasource.database}")
+ private String customerDbName;
+
+ @Value("${customer.datasource.port}")
+ private String customerDbPort;
+
+ @Value("${customer.datasource.username}")
+ private String customerDbUsername;
+
+ @Value("${customer.datasource.password}")
+ private String customerDbPassword;
+
+ /**
+ * Customer Database Connector Configuration
+ */
+ @Bean
+ public io.debezium.config.Configuration customerConnector() throws IOException {
+ File offsetStorageTempFile = File.createTempFile("offsets_", ".dat");
+ File dbHistoryTempFile = File.createTempFile("dbhistory_", ".dat");
+ return io.debezium.config.Configuration.create()
+ .with("name", "customer-mysql-connector")
+ .with("connector.class", "io.debezium.connector.mysql.MySqlConnector")
+ .with("offset.storage", "org.apache.kafka.connect.storage.FileOffsetBackingStore")
+ .with("offset.storage.file.filename", offsetStorageTempFile.getAbsolutePath())
+ .with("offset.flush.interval.ms", "60000")
+ .with("database.hostname", customerDbHost)
+ .with("database.port", customerDbPort)
+ .with("database.user", customerDbUsername)
+ .with("database.password", customerDbPassword)
+ .with("database.dbname", customerDbName)
+ .with("database.include.list", customerDbName)
+ .with("include.schema.changes", "false")
+ .with("database.allowPublicKeyRetrieval", "true")
+ .with("database.server.id", "10181")
+ .with("database.server.name", "customer-mysql-db-server")
+ .with("database.history", "io.debezium.relational.history.FileDatabaseHistory")
+ .with("database.history.file.filename", dbHistoryTempFile.getAbsolutePath())
+ .build();
+ }
+}
diff --git a/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/entity/Customer.java b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/entity/Customer.java
new file mode 100644
index 0000000000..2100b135af
--- /dev/null
+++ b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/entity/Customer.java
@@ -0,0 +1,18 @@
+package com.baeldung.libraries.debezium.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+@Entity
+@Getter
+@Setter
+public class Customer {
+ @Id
+ private Long id;
+
+ private String fullname;
+ private String email;
+}
diff --git a/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/listener/DebeziumListener.java b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/listener/DebeziumListener.java
new file mode 100644
index 0000000000..6826fe6d6d
--- /dev/null
+++ b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/listener/DebeziumListener.java
@@ -0,0 +1,83 @@
+package com.baeldung.libraries.debezium.listener;
+
+import com.baeldung.libraries.debezium.service.CustomerService;
+import io.debezium.config.Configuration;
+import io.debezium.embedded.Connect;
+import io.debezium.engine.DebeziumEngine;
+import io.debezium.engine.RecordChangeEvent;
+import io.debezium.engine.format.ChangeEventFormat;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.kafka.connect.data.Field;
+import org.apache.kafka.connect.data.Struct;
+import org.apache.kafka.connect.source.SourceRecord;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import java.io.IOException;
+import java.util.Map;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+import static io.debezium.data.Envelope.FieldName.*;
+import static io.debezium.data.Envelope.Operation;
+import static java.util.stream.Collectors.toMap;
+
+@Slf4j
+@Component
+public class DebeziumListener {
+
+ private final Executor executor = Executors.newSingleThreadExecutor();
+ private final CustomerService customerService;
+ private final DebeziumEngine> debeziumEngine;
+
+ public DebeziumListener(Configuration customerConnectorConfiguration, CustomerService customerService) {
+
+ this.debeziumEngine = DebeziumEngine.create(ChangeEventFormat.of(Connect.class))
+ .using(customerConnectorConfiguration.asProperties())
+ .notifying(this::handleChangeEvent)
+ .build();
+
+ this.customerService = customerService;
+ }
+
+ private void handleChangeEvent(RecordChangeEvent sourceRecordRecordChangeEvent) {
+ SourceRecord sourceRecord = sourceRecordRecordChangeEvent.record();
+
+ log.info("Key = '" + sourceRecord.key() + "' value = '" + sourceRecord.value() + "'");
+
+ Struct sourceRecordChangeValue= (Struct) sourceRecord.value();
+
+ if (sourceRecordChangeValue != null) {
+ Operation operation = Operation.forCode((String) sourceRecordChangeValue.get(OPERATION));
+
+ if(operation != Operation.READ) {
+ String record = operation == Operation.DELETE ? BEFORE : AFTER; // Handling Update & Insert operations.
+
+ Struct struct = (Struct) sourceRecordChangeValue.get(record);
+ Map payload = struct.schema().fields().stream()
+ .map(Field::name)
+ .filter(fieldName -> struct.get(fieldName) != null)
+ .map(fieldName -> Pair.of(fieldName, struct.get(fieldName)))
+ .collect(toMap(Pair::getKey, Pair::getValue));
+
+ this.customerService.replicateData(payload, operation);
+ log.info("Updated Data: {} with Operation: {}", payload, operation.name());
+ }
+ }
+ }
+
+ @PostConstruct
+ private void start() {
+ this.executor.execute(debeziumEngine);
+ }
+
+ @PreDestroy
+ private void stop() throws IOException {
+ if (this.debeziumEngine != null) {
+ this.debeziumEngine.close();
+ }
+ }
+
+}
diff --git a/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/repository/CustomerRepository.java b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/repository/CustomerRepository.java
new file mode 100644
index 0000000000..fc199cb85c
--- /dev/null
+++ b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/repository/CustomerRepository.java
@@ -0,0 +1,9 @@
+package com.baeldung.libraries.debezium.repository;
+
+import com.baeldung.libraries.debezium.entity.Customer;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface CustomerRepository extends JpaRepository {
+}
diff --git a/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/service/CustomerService.java b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/service/CustomerService.java
new file mode 100644
index 0000000000..4b35a94eb5
--- /dev/null
+++ b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/service/CustomerService.java
@@ -0,0 +1,30 @@
+package com.baeldung.libraries.debezium.service;
+
+import com.baeldung.libraries.debezium.entity.Customer;
+import com.baeldung.libraries.debezium.repository.CustomerRepository;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.debezium.data.Envelope.Operation;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+@Service
+public class CustomerService {
+
+ private final CustomerRepository customerRepository;
+
+ public CustomerService(CustomerRepository customerRepository) {
+ this.customerRepository = customerRepository;
+ }
+
+ public void replicateData(Map customerData, Operation operation) {
+ final ObjectMapper mapper = new ObjectMapper();
+ final Customer customer = mapper.convertValue(customerData, Customer.class);
+
+ if (Operation.DELETE.name().equals(operation.name())) {
+ customerRepository.deleteById(customer.getId());
+ } else {
+ customerRepository.save(customer);
+ }
+ }
+}
diff --git a/libraries-data-db/src/main/resources/application.yml b/libraries-data-db/src/main/resources/application.yml
new file mode 100644
index 0000000000..3fcf4a12a9
--- /dev/null
+++ b/libraries-data-db/src/main/resources/application.yml
@@ -0,0 +1,34 @@
+## Server properties
+server:
+ port: 8080
+
+## Primary/Target Database Properties
+spring:
+ datasource:
+ url: jdbc:mysql://localhost:3306/customerdb
+ username: root
+ password: root
+ jpa.hibernate.ddl-auto: create-drop
+ jpa.show-sql: true
+
+## Source Database Properties
+customer:
+ datasource:
+ host: localhost
+ port: 3305
+ database: customerdb
+ username: root
+ password: root
+
+ ## Logging properties
+logging:
+ level:
+ root: INFO
+ io:
+ debezium:
+ mysql:
+ BinlogReader: INFO
+ com:
+ baeldung:
+ libraries:
+ debezium: DEBUG
diff --git a/libraries-data-db/src/main/resources/customer.sql b/libraries-data-db/src/main/resources/customer.sql
new file mode 100644
index 0000000000..25e3bcf569
--- /dev/null
+++ b/libraries-data-db/src/main/resources/customer.sql
@@ -0,0 +1,9 @@
+drop table if exists customer;
+
+CREATE TABLE customer
+(
+ id integer NOT NULL,
+ fullname character varying(255),
+ email character varying(255),
+ CONSTRAINT customer_pkey PRIMARY KEY (id)
+);
diff --git a/libraries-data-db/src/main/resources/docker-compose.yml b/libraries-data-db/src/main/resources/docker-compose.yml
new file mode 100644
index 0000000000..ddf865cc78
--- /dev/null
+++ b/libraries-data-db/src/main/resources/docker-compose.yml
@@ -0,0 +1,25 @@
+version: "3.9"
+services:
+ # Install Source MySQL DB and setup the Customer database
+ mysql-1:
+ container_name: source-database
+ image: mysql
+ command: --default-authentication-plugin=mysql_native_password
+ restart: always
+ ports:
+ - 3305:3306
+ environment:
+ MYSQL_ROOT_PASSWORD: root
+ MYSQL_DATABASE: customerdb
+
+ # Install Target MySQL DB and setup the Customer database
+ mysql-2:
+ container_name: target-database
+ image: mysql
+ command: --default-authentication-plugin=mysql_native_password
+ restart: always
+ ports:
+ - 3306:3306
+ environment:
+ MYSQL_ROOT_PASSWORD: root
+ MYSQL_DATABASE: customerdb
diff --git a/libraries-data-db/src/test/java/com/baeldung/libraries/debezium/DebeziumCDCLiveTest.java b/libraries-data-db/src/test/java/com/baeldung/libraries/debezium/DebeziumCDCLiveTest.java
new file mode 100644
index 0000000000..916ea4a120
--- /dev/null
+++ b/libraries-data-db/src/test/java/com/baeldung/libraries/debezium/DebeziumCDCLiveTest.java
@@ -0,0 +1,61 @@
+package com.baeldung.libraries.debezium;
+
+import com.baeldung.libraries.debezium.repository.CustomerRepository;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.DynamicPropertyRegistry;
+import org.springframework.test.context.DynamicPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = DebeziumCDCApplication.class)
+@ActiveProfiles("test")
+public class DebeziumCDCLiveTest {
+
+ @Autowired
+ private CustomerRepository customerRepository;
+
+ @Autowired
+ @Qualifier("sourceJdbcTemplate")
+ private NamedParameterJdbcTemplate jdbcTemplate;
+
+ @Before
+ public void clearData() {
+ jdbcTemplate.update("delete from customer where id = :id", Collections.singletonMap("id", 1));
+ }
+
+ @DynamicPropertySource
+ static void registerProperties(DynamicPropertyRegistry registry) {
+ registry.add("customer.datasource.port", MySQLTestContainerConfiguration::getPort);
+ }
+
+ @Test
+ public void whenInsertDataToSourceDatabase_thenCdcOk() throws InterruptedException {
+ assertThat(customerRepository.findAll().size()).isZero();
+
+ // insert data to source DB
+ Map map = new HashMap<>();
+ map.put("id", 1);
+ map.put("fullname", "John Doe");
+ map.put("email", "test@test.com");
+
+ jdbcTemplate.update("INSERT INTO customer(id, fullname, email) VALUES (:id, :fullname, :email)", map);
+
+ // verify target DB
+ Thread.sleep(10000);
+ assertThat(customerRepository.findAll().size()).isNotZero();
+ }
+
+}
diff --git a/libraries-data-db/src/test/java/com/baeldung/libraries/debezium/MySQLTestContainerConfiguration.java b/libraries-data-db/src/test/java/com/baeldung/libraries/debezium/MySQLTestContainerConfiguration.java
new file mode 100644
index 0000000000..e7394e190b
--- /dev/null
+++ b/libraries-data-db/src/test/java/com/baeldung/libraries/debezium/MySQLTestContainerConfiguration.java
@@ -0,0 +1,61 @@
+package com.baeldung.libraries.debezium;
+
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+import org.springframework.jdbc.datasource.DriverManagerDataSource;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+import org.testcontainers.containers.MySQLContainer;
+import org.testcontainers.utility.DockerImageName;
+
+import javax.sql.DataSource;
+
+@Configuration
+public class MySQLTestContainerConfiguration {
+
+ public static final DockerImageName MYSQL_IMAGE = DockerImageName.parse("mysql:8.0");
+
+ private static final MySQLContainer> mysqlContainer = new MySQLContainer<>(MYSQL_IMAGE)
+ .withCommand("--default-authentication-plugin=mysql_native_password")
+ .withInitScript("debezium/customer.sql")
+ .withDatabaseName("SOURCE_DB")
+ .withUsername("user")
+ .withPassword("user")
+ .withEnv("MYSQL_ROOT_PASSWORD", "user");
+
+ MySQLTestContainerConfiguration() {
+ mysqlContainer.start();
+ }
+
+ public static int getPort() {
+ return mysqlContainer.getFirstMappedPort();
+ }
+
+ @Bean
+ @Primary
+ public EmbeddedDatabase targetDatasource() {
+ return new EmbeddedDatabaseBuilder()
+ .setType(EmbeddedDatabaseType.H2)
+ .setName("TAGRET_DB")
+ .build();
+ }
+
+ @Bean(name = "SOURCE_DS")
+ public DataSource sourceDataSource() {
+ DriverManagerDataSource dataSource = new DriverManagerDataSource();
+ dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
+ dataSource.setUrl(mysqlContainer.getJdbcUrl());
+ dataSource.setUsername(mysqlContainer.getUsername());
+ dataSource.setPassword(mysqlContainer.getPassword());
+ return dataSource;
+ }
+
+ @Bean(name = "sourceJdbcTemplate")
+ public NamedParameterJdbcTemplate getJdbcTemplate(@Qualifier("SOURCE_DS") DataSource sourceDataSource) {
+ return new NamedParameterJdbcTemplate(sourceDataSource);
+ }
+}
diff --git a/libraries-data-db/src/test/resources/application-test.yml b/libraries-data-db/src/test/resources/application-test.yml
new file mode 100644
index 0000000000..96aaa2b727
--- /dev/null
+++ b/libraries-data-db/src/test/resources/application-test.yml
@@ -0,0 +1,7 @@
+## Source Database Properties
+customer:
+ datasource:
+ host: localhost
+ database: SOURCE_DB
+ username: root
+ password: user
diff --git a/libraries-data-db/src/test/resources/debezium/customer.sql b/libraries-data-db/src/test/resources/debezium/customer.sql
new file mode 100644
index 0000000000..25e3bcf569
--- /dev/null
+++ b/libraries-data-db/src/test/resources/debezium/customer.sql
@@ -0,0 +1,9 @@
+drop table if exists customer;
+
+CREATE TABLE customer
+(
+ id integer NOT NULL,
+ fullname character varying(255),
+ email character varying(255),
+ CONSTRAINT customer_pkey PRIMARY KEY (id)
+);
diff --git a/libraries-data-io/pom.xml b/libraries-data-io/pom.xml
index e15e188d10..58bfde9aa0 100644
--- a/libraries-data-io/pom.xml
+++ b/libraries-data-io/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0libraries-data-iolibraries-data-io
diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml
index 5adb490e96..717ee802db 100644
--- a/libraries-data/pom.xml
+++ b/libraries-data/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0libraries-datalibraries-data
@@ -57,8 +58,7 @@
hazelcast${hazelcast.version}
-
-
+
org.apache.crunchcrunch-core
@@ -70,11 +70,10 @@
${org.apache.hadoop.hadoop-client}provided
-
commons-clicommons-cli
- ${commons.cli.version}
+ ${commons-cli.version}provided
@@ -164,7 +163,6 @@
2.3
- 1.23.0.11.2.21.0.0
@@ -179,4 +177,4 @@
1.6.0.1
-
+
\ No newline at end of file
diff --git a/libraries-http-2/README.md b/libraries-http-2/README.md
index f3fdf1becb..4085d98ea5 100644
--- a/libraries-http-2/README.md
+++ b/libraries-http-2/README.md
@@ -8,5 +8,6 @@ This module contains articles about HTTP libraries.
- [Decode an OkHttp JSON Response](https://www.baeldung.com/okhttp-json-response)
- [Retrofit 2 – Dynamic URL](https://www.baeldung.com/retrofit-dynamic-url)
- [Adding Interceptors in OkHTTP](https://www.baeldung.com/java-okhttp-interceptors)
+- [A Guide to Events in OkHTTP](https://www.baeldung.com/java-okhttp-events)
- More articles [[<-- prev]](/libraries-http)
diff --git a/libraries-http-2/pom.xml b/libraries-http-2/pom.xml
index 855008521f..d8479def3c 100644
--- a/libraries-http-2/pom.xml
+++ b/libraries-http-2/pom.xml
@@ -71,7 +71,6 @@
reactive-streams${reactive.stream.version}
-
com.squareup.retrofit2
@@ -98,4 +97,4 @@
3.2.12.RELEASE
-
+
\ No newline at end of file
diff --git a/libraries-http-2/src/main/java/com/baeldung/okhttp/download/BinaryFileDownloader.java b/libraries-http-2/src/main/java/com/baeldung/okhttp/download/BinaryFileDownloader.java
new file mode 100644
index 0000000000..a7ef60f124
--- /dev/null
+++ b/libraries-http-2/src/main/java/com/baeldung/okhttp/download/BinaryFileDownloader.java
@@ -0,0 +1,38 @@
+package com.baeldung.okhttp.download;
+
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import okhttp3.ResponseBody;
+
+import java.io.IOException;
+import java.util.Objects;
+
+import static org.springframework.http.HttpHeaders.CONTENT_LENGTH;
+
+public class BinaryFileDownloader implements AutoCloseable {
+
+ private final OkHttpClient client;
+ private final BinaryFileWriter writer;
+
+ public BinaryFileDownloader(OkHttpClient client, BinaryFileWriter writer) {
+ this.client = client;
+ this.writer = writer;
+ }
+
+ public long download(String url) throws IOException {
+ Request request = new Request.Builder().url(url).build();
+ Response response = client.newCall(request).execute();
+ ResponseBody responseBody = response.body();
+ if (responseBody == null) {
+ throw new IllegalStateException("Response doesn't contain a file");
+ }
+ double length = Double.parseDouble(Objects.requireNonNull(response.header(CONTENT_LENGTH, "1")));
+ return writer.write(responseBody.byteStream(), length);
+ }
+
+ @Override
+ public void close() throws Exception {
+ writer.close();
+ }
+}
diff --git a/libraries-http-2/src/main/java/com/baeldung/okhttp/download/BinaryFileWriter.java b/libraries-http-2/src/main/java/com/baeldung/okhttp/download/BinaryFileWriter.java
new file mode 100644
index 0000000000..fb3664c08e
--- /dev/null
+++ b/libraries-http-2/src/main/java/com/baeldung/okhttp/download/BinaryFileWriter.java
@@ -0,0 +1,37 @@
+package com.baeldung.okhttp.download;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class BinaryFileWriter implements AutoCloseable {
+
+ private static final int CHUNK_SIZE = 1024;
+ private final OutputStream outputStream;
+ private final ProgressCallback progressCallback;
+
+ public BinaryFileWriter(OutputStream outputStream, ProgressCallback progressCallback) {
+ this.outputStream = outputStream;
+ this.progressCallback = progressCallback;
+ }
+
+ public long write(InputStream inputStream, double length) throws IOException {
+ try (BufferedInputStream input = new BufferedInputStream(inputStream)) {
+ byte[] dataBuffer = new byte[CHUNK_SIZE];
+ int readBytes;
+ long totalBytes = 0;
+ while ((readBytes = input.read(dataBuffer)) != -1) {
+ totalBytes += readBytes;
+ outputStream.write(dataBuffer, 0, readBytes);
+ progressCallback.onProgress(totalBytes / length * 100.0);
+ }
+ return totalBytes;
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ outputStream.close();
+ }
+}
diff --git a/libraries-http-2/src/main/java/com/baeldung/okhttp/download/ProgressCallback.java b/libraries-http-2/src/main/java/com/baeldung/okhttp/download/ProgressCallback.java
new file mode 100644
index 0000000000..b57cabf854
--- /dev/null
+++ b/libraries-http-2/src/main/java/com/baeldung/okhttp/download/ProgressCallback.java
@@ -0,0 +1,7 @@
+package com.baeldung.okhttp.download;
+
+public interface ProgressCallback {
+
+ void onProgress(double progress);
+
+}
diff --git a/libraries-http-2/src/main/java/com/baeldung/okhttp/events/EventTimer.java b/libraries-http-2/src/main/java/com/baeldung/okhttp/events/EventTimer.java
new file mode 100644
index 0000000000..356dea9fc6
--- /dev/null
+++ b/libraries-http-2/src/main/java/com/baeldung/okhttp/events/EventTimer.java
@@ -0,0 +1,156 @@
+package com.baeldung.okhttp.events;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.util.List;
+
+import okhttp3.Call;
+import okhttp3.Connection;
+import okhttp3.EventListener;
+import okhttp3.Handshake;
+import okhttp3.HttpUrl;
+import okhttp3.Protocol;
+import okhttp3.Request;
+import okhttp3.Response;
+
+public class EventTimer extends EventListener {
+
+ private long start;
+
+ private void logTimedEvent(String name) {
+ long now = System.nanoTime();
+ if (name.equals("callStart")) {
+ start = now;
+ }
+ long elapsedNanos = now - start;
+ System.out.printf("%.3f %s%n", elapsedNanos / 1000000000d, name);
+ }
+
+ @Override
+ public void callStart(Call call) {
+ logTimedEvent("callStart");
+ }
+
+ @Override
+ public void proxySelectStart(Call call, HttpUrl url) {
+ logTimedEvent("proxySelectStart");
+ }
+
+ @Override
+ public void proxySelectEnd(Call call, HttpUrl url, List proxies) {
+ logTimedEvent("proxySelectEnd");
+ }
+
+ @Override
+ public void dnsStart(Call call, String domainName) {
+ logTimedEvent("dnsStart");
+ }
+
+ @Override
+ public void dnsEnd(Call call, String domainName, List inetAddressList) {
+ logTimedEvent("dnsEnd");
+ }
+
+ @Override
+ public void connectStart(Call call, InetSocketAddress inetSocketAddress, Proxy proxy) {
+ logTimedEvent("connectStart");
+ }
+
+ @Override
+ public void secureConnectStart(Call call) {
+ logTimedEvent("secureConnectStart");
+ }
+
+ @Override
+ public void secureConnectEnd(Call call, Handshake handshake) {
+ logTimedEvent("secureConnectEnd");
+ }
+
+ @Override
+ public void connectEnd(Call call, InetSocketAddress inetSocketAddress, Proxy proxy, Protocol protocol) {
+ logTimedEvent("connectEnd");
+ }
+
+ @Override
+ public void connectFailed(Call call, InetSocketAddress inetSocketAddress, Proxy proxy, Protocol protocol, IOException ioe) {
+ logTimedEvent("connectFailed");
+ }
+
+ @Override
+ public void connectionAcquired(Call call, Connection connection) {
+ logTimedEvent("connectionAcquired");
+ }
+
+ @Override
+ public void connectionReleased(Call call, Connection connection) {
+ logTimedEvent("connectionReleased");
+ }
+
+ @Override
+ public void requestHeadersStart(Call call) {
+ logTimedEvent("requestHeadersStart");
+ }
+
+ @Override
+ public void requestHeadersEnd(Call call, Request request) {
+ logTimedEvent("requestHeadersEnd");
+ }
+
+ @Override
+ public void requestBodyStart(Call call) {
+ logTimedEvent("requestBodyStart");
+ }
+
+ @Override
+ public void requestBodyEnd(Call call, long byteCount) {
+ logTimedEvent("requestBodyEnd");
+ }
+
+ @Override
+ public void requestFailed(Call call, IOException ioe) {
+ logTimedEvent("requestFailed");
+ }
+
+ @Override
+ public void responseHeadersStart(Call call) {
+ logTimedEvent("responseHeadersStart");
+ }
+
+ @Override
+ public void responseHeadersEnd(Call call, Response response) {
+ logTimedEvent("responseHeadersEnd");
+ }
+
+ @Override
+ public void responseBodyStart(Call call) {
+ logTimedEvent("responseBodyStart");
+ }
+
+ @Override
+ public void responseBodyEnd(Call call, long byteCount) {
+ logTimedEvent("responseBodyEnd");
+ }
+
+ @Override
+ public void responseFailed(Call call, IOException ioe) {
+ logTimedEvent("responseFailed");
+ }
+
+ @Override
+ public void callEnd(Call call) {
+ logTimedEvent("callEnd");
+ }
+
+ @Override
+ public void callFailed(Call call, IOException ioe) {
+ logTimedEvent("callFailed");
+ }
+
+ @Override
+ public void canceled(Call call) {
+ logTimedEvent("canceled");
+ }
+
+}
diff --git a/libraries-http-2/src/main/java/com/baeldung/okhttp/events/SimpleLogEventsListener.java b/libraries-http-2/src/main/java/com/baeldung/okhttp/events/SimpleLogEventsListener.java
new file mode 100644
index 0000000000..93e3eb6308
--- /dev/null
+++ b/libraries-http-2/src/main/java/com/baeldung/okhttp/events/SimpleLogEventsListener.java
@@ -0,0 +1,37 @@
+package com.baeldung.okhttp.events;
+
+import java.time.LocalDateTime;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import okhttp3.Call;
+import okhttp3.EventListener;
+import okhttp3.Request;
+import okhttp3.Response;
+
+public class SimpleLogEventsListener extends EventListener {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(SimpleLogEventsListener.class);
+
+ @Override
+ public void callStart(Call call) {
+ LOGGER.info("callStart at {}", LocalDateTime.now());
+ }
+
+ @Override
+ public void requestHeadersEnd(Call call, Request request) {
+ LOGGER.info("requestHeadersEnd at {} with headers {}", LocalDateTime.now(), request.headers());
+ }
+
+ @Override
+ public void responseHeadersEnd(Call call, Response response) {
+ LOGGER.info("responseHeadersEnd at {} with headers {}", LocalDateTime.now(), response.headers());
+ }
+
+ @Override
+ public void callEnd(Call call) {
+ LOGGER.info("callEnd at {}", LocalDateTime.now());
+ }
+
+}
diff --git a/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/ErrorResponseInterceptor.java b/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/ErrorResponseInterceptor.java
index f6c6673705..02f45e1282 100644
--- a/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/ErrorResponseInterceptor.java
+++ b/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/ErrorResponseInterceptor.java
@@ -21,7 +21,12 @@ public class ErrorResponseInterceptor implements Interceptor {
Gson gson = new Gson();
String body = gson.toJson(new ErrorMessage(response.code(), "The response from the server was not OK"));
ResponseBody responseBody = ResponseBody.create(body, APPLICATION_JSON);
-
+
+ ResponseBody originalBody = response.body();
+ if (originalBody != null) {
+ originalBody.close();
+ }
+
return response.newBuilder()
.body(responseBody)
.build();
diff --git a/libraries-http-2/src/test/java/com/baeldung/okhttp/download/BinaryFileDownloaderIntegrationTest.java b/libraries-http-2/src/test/java/com/baeldung/okhttp/download/BinaryFileDownloaderIntegrationTest.java
new file mode 100644
index 0000000000..6f0f705350
--- /dev/null
+++ b/libraries-http-2/src/test/java/com/baeldung/okhttp/download/BinaryFileDownloaderIntegrationTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.okhttp.download;
+
+import okhttp3.OkHttpClient;
+import okhttp3.mockwebserver.MockResponse;
+import okhttp3.mockwebserver.MockWebServer;
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+public class BinaryFileDownloaderIntegrationTest {
+
+ @Rule
+ public MockWebServer server = new MockWebServer();
+
+ @Test
+ public void givenATextFile_whenDownload_thenExpectFileDownloaded() {
+ String body = "Hello Baeldung Readers!";
+ server.enqueue(new MockResponse().setBody(body));
+ String fileName = "download.txt";
+
+ ProgressCallback progressCallback = progress -> assertEquals(100.0, progress, .0);
+ try (BinaryFileWriter writer = new BinaryFileWriter(new FileOutputStream(fileName), progressCallback); BinaryFileDownloader tested = new BinaryFileDownloader(new OkHttpClient(), writer)) {
+ long downloaded = tested.download(server.url("/greetings").toString());
+ assertEquals(body.length(), downloaded);
+ File downloadedFile = new File(fileName);
+ assertTrue(downloadedFile.isFile());
+ assertTrue(downloadedFile.delete());
+ } catch (Exception e) {
+ fail("An unexpected exception has occurred: " + e);
+ }
+ }
+
+}
diff --git a/libraries-http-2/src/test/java/com/baeldung/okhttp/download/BinaryFileDownloaderUnitTest.java b/libraries-http-2/src/test/java/com/baeldung/okhttp/download/BinaryFileDownloaderUnitTest.java
new file mode 100644
index 0000000000..15dda3a471
--- /dev/null
+++ b/libraries-http-2/src/test/java/com/baeldung/okhttp/download/BinaryFileDownloaderUnitTest.java
@@ -0,0 +1,74 @@
+package com.baeldung.okhttp.download;
+
+import okhttp3.Call;
+import okhttp3.MediaType;
+import okhttp3.OkHttpClient;
+import okhttp3.Protocol;
+import okhttp3.Request;
+import okhttp3.Response;
+import okhttp3.ResponseBody;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import java.io.InputStream;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyDouble;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class BinaryFileDownloaderUnitTest {
+
+ @Mock
+ private OkHttpClient client;
+ @Mock
+ private BinaryFileWriter writer;
+ @InjectMocks
+ private BinaryFileDownloader tested;
+
+ @Test
+ public void givenUrlAndResponse_whenDownload_thenExpectFileWritten() throws Exception {
+ String url = "http://example.com/file";
+ Call call = mock(Call.class);
+ when(client.newCall(any(Request.class))).thenReturn(call);
+ ResponseBody body = ResponseBody.create("BODY", MediaType.get("application/text"));
+ Response response = createResponse(url, body);
+ when(call.execute()).thenReturn(response);
+ when(writer.write(any(), anyDouble())).thenReturn(1L);
+
+ try (BinaryFileDownloader tested = new BinaryFileDownloader(client, writer)) {
+ long size = tested.download(url);
+ assertEquals(1L, size);
+ verify(writer).write(any(InputStream.class), anyDouble());
+ }
+ verify(writer).close();
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void givenUrlAndResponseWithNullBody_whenDownload_thenExpectIllegalStateException() throws Exception {
+ String url = "http://example.com/file";
+ Call call = mock(Call.class);
+ when(client.newCall(any(Request.class))).thenReturn(call);
+ Response response = createResponse(url, null);
+ when(call.execute()).thenReturn(response);
+
+ tested.download(url);
+
+ verify(writer, times(0)).write(any(InputStream.class), anyDouble());
+ }
+
+ @NotNull
+ private Response createResponse(String url, ResponseBody body) {
+ Request request = new Request.Builder().url(url).build();
+ return new Response.Builder().code(200).request(request).protocol(Protocol.HTTP_2).message("Message").body(body).build();
+ }
+
+}
\ No newline at end of file
diff --git a/libraries-http-2/src/test/java/com/baeldung/okhttp/download/BinaryFileWriterUnitTest.java b/libraries-http-2/src/test/java/com/baeldung/okhttp/download/BinaryFileWriterUnitTest.java
new file mode 100644
index 0000000000..2b3f0a1313
--- /dev/null
+++ b/libraries-http-2/src/test/java/com/baeldung/okhttp/download/BinaryFileWriterUnitTest.java
@@ -0,0 +1,55 @@
+package com.baeldung.okhttp.download;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class BinaryFileWriterUnitTest {
+
+ @Mock
+ private OutputStream outputStream;
+
+ @Test
+ public void givenInputStream_whenWrite_thenExpectWritten() throws Exception {
+ InputStream inputStream = mock(InputStream.class);
+ when(inputStream.read(any(), anyInt(), anyInt())).thenReturn(10, -1);
+
+ try (BinaryFileWriter tested = new BinaryFileWriter(outputStream, progress -> assertEquals(100.0, progress, .0))) {
+ long result = tested.write(inputStream, 10);
+
+ assertEquals(10, result);
+ verify(outputStream).write(any(), eq(0), eq(10));
+ verify(inputStream).close();
+ }
+ verify(outputStream).close();
+ }
+
+ @Test
+ public void givenInputStreamEmpty_whenWrite_thenExpectNotWritten() throws Exception {
+ InputStream inputStream = mock(InputStream.class);
+
+ try (BinaryFileWriter tested = new BinaryFileWriter(outputStream, progress -> assertEquals(100.0, progress, .0))) {
+ long result = tested.write(inputStream, 1);
+
+ assertEquals(0, result);
+ verify(outputStream, times(0)).write(any(), anyInt(), anyInt());
+ verify(inputStream).close();
+ }
+ verify(outputStream).close();
+ }
+
+}
\ No newline at end of file
diff --git a/libraries-http-2/src/test/java/com/baeldung/okhttp/events/EventTimerLiveTest.java b/libraries-http-2/src/test/java/com/baeldung/okhttp/events/EventTimerLiveTest.java
new file mode 100644
index 0000000000..ebf4cd1404
--- /dev/null
+++ b/libraries-http-2/src/test/java/com/baeldung/okhttp/events/EventTimerLiveTest.java
@@ -0,0 +1,31 @@
+package com.baeldung.okhttp.events;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+
+public class EventTimerLiveTest {
+
+ @Test
+ public void givenSimpleEventTimer_whenRequestSent_thenCallsLogged() throws IOException {
+
+ OkHttpClient client = new OkHttpClient.Builder()
+ .eventListener(new EventTimer())
+ .build();
+
+ Request request = new Request.Builder()
+ .url("https://www.baeldung.com/")
+ .build();
+
+ try (Response response = client.newCall(request).execute()) {
+ assertEquals("Response code should be: ", 200, response.code());
+ }
+ }
+
+}
diff --git a/libraries-http-2/src/test/java/com/baeldung/okhttp/events/LogEventsListenerIntegrationTest.java b/libraries-http-2/src/test/java/com/baeldung/okhttp/events/LogEventsListenerIntegrationTest.java
new file mode 100644
index 0000000000..c5884e8a12
--- /dev/null
+++ b/libraries-http-2/src/test/java/com/baeldung/okhttp/events/LogEventsListenerIntegrationTest.java
@@ -0,0 +1,53 @@
+package com.baeldung.okhttp.events;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.net.SocketTimeoutException;
+
+import org.junit.Rule;
+import org.junit.Test;
+
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import okhttp3.mockwebserver.MockResponse;
+import okhttp3.mockwebserver.MockWebServer;
+
+public class LogEventsListenerIntegrationTest {
+
+ @Rule
+ public MockWebServer server = new MockWebServer();
+
+ @Test
+ public void givenSimpleEventLogger_whenRequestSent_thenCallsLogged() throws IOException {
+ server.enqueue(new MockResponse().setBody("Hello Baeldung Readers!"));
+
+ OkHttpClient client = new OkHttpClient.Builder()
+ .eventListener(new SimpleLogEventsListener())
+ .build();
+
+ Request request = new Request.Builder()
+ .url(server.url("/"))
+ .build();
+
+ try (Response response = client.newCall(request).execute()) {
+ assertEquals("Response code should be: ", 200, response.code());
+ assertEquals("Body should be: ", "Hello Baeldung Readers!", response.body().string());
+ }
+ }
+
+ @Test (expected = SocketTimeoutException.class)
+ public void givenConnectionError_whenRequestSent_thenFailedCallsLogged() throws IOException {
+ OkHttpClient client = new OkHttpClient.Builder()
+ .eventListener(new EventTimer())
+ .build();
+
+ Request request = new Request.Builder()
+ .url(server.url("/"))
+ .build();
+
+ client.newCall(request).execute();
+ }
+
+}
diff --git a/libraries-http/pom.xml b/libraries-http/pom.xml
index 257cb988d6..8eb6142c38 100644
--- a/libraries-http/pom.xml
+++ b/libraries-http/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0libraries-httplibraries-http
@@ -18,14 +18,12 @@
assertj-core${assertj.version}
-
com.squareup.okhttp3okhttp${com.squareup.okhttp3.version}
-
com.google.http-client
@@ -37,7 +35,6 @@
google-http-client-jackson2${googleclient.version}
-
com.squareup.retrofit2
@@ -54,33 +51,28 @@
adapter-rxjava${retrofit.version}
-
org.asynchttpclientasync-http-client${async.http.client.version}
-
com.fasterxml.jackson.corejackson-databind${jackson.version}
-
com.google.code.gsongson${gson.version}
-
com.squareup.okhttp3mockwebserver${com.squareup.okhttp3.version}test
-
com.mashape.unirestunirest-java
@@ -118,7 +110,7 @@
2.8.54.5.3
-
+
3.6.24.9.11.23.0
@@ -129,4 +121,4 @@
3.9.0
-
+
\ No newline at end of file
diff --git a/libraries-io/pom.xml b/libraries-io/pom.xml
index 8c2e841630..2f65fd989b 100644
--- a/libraries-io/pom.xml
+++ b/libraries-io/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0libraries-iolibraries-io
@@ -38,4 +38,4 @@
2.4
-
+
\ No newline at end of file
diff --git a/libraries-primitive/pom.xml b/libraries-primitive/pom.xml
index 1370468e76..06c42bd6c9 100644
--- a/libraries-primitive/pom.xml
+++ b/libraries-primitive/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldunglibraries-primitive
@@ -26,13 +26,13 @@
org.openjdk.jmhjmh-core
- ${jmh.version}
+ ${jmh-core.version}testorg.openjdk.jmhjmh-generator-annprocess
- ${jmh.version}
+ ${jmh-generator.version}test
@@ -46,10 +46,11 @@
8.2.24.12
- 1.1910.0.01.81.8
+ 1.28
+ 1.28
\ No newline at end of file
diff --git a/libraries-rpc/pom.xml b/libraries-rpc/pom.xml
index 8741a41062..ab6b74ae84 100644
--- a/libraries-rpc/pom.xml
+++ b/libraries-rpc/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0libraries-rpclibraries-rpc
@@ -13,17 +14,16 @@
-
- com.twitter
- finagle-core_2.13
- ${finagle.core.version}
-
-
- com.twitter
- finagle-http_2.13
- ${finagle.http.version}
-
-
+
+ com.twitter
+ finagle-core_2.13
+ ${finagle.core.version}
+
+
+ com.twitter
+ finagle-http_2.13
+ ${finagle.http.version}
+
@@ -31,5 +31,4 @@
20.4.0
-
-
+
\ No newline at end of file
diff --git a/libraries-security/pom.xml b/libraries-security/pom.xml
index 3b812f0d2c..6ee6b7c358 100644
--- a/libraries-security/pom.xml
+++ b/libraries-security/pom.xml
@@ -91,4 +91,4 @@
2.4.0.RELEASE
-
+
\ No newline at end of file
diff --git a/libraries-server-2/pom.xml b/libraries-server-2/pom.xml
index 5f500a7ced..7377fa3fa9 100644
--- a/libraries-server-2/pom.xml
+++ b/libraries-server-2/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0libraries-server-20.0.1-SNAPSHOT
@@ -30,7 +31,7 @@
${jetty.version}
-
+
diff --git a/libraries-server/pom.xml b/libraries-server/pom.xml
index d9546f1678..e36ed88f8f 100644
--- a/libraries-server/pom.xml
+++ b/libraries-server/pom.xml
@@ -66,32 +66,27 @@
${junit.version}test
-
org.apache.tomcattomcat-catalina${tomcat.version}
-
org.igniterealtime.smacksmack-tcp${smack.version}
-
org.igniterealtime.smacksmack-extensions${smack.version}
-
org.igniterealtime.smacksmack-java7${smack.version}
-
org.nanohttpd
@@ -103,7 +98,6 @@
nanohttpd-nanolets${nanohttpd.version}
-
diff --git a/libraries-testing/pom.xml b/libraries-testing/pom.xml
index 8052680ea5..6d7e0c01e1 100644
--- a/libraries-testing/pom.xml
+++ b/libraries-testing/pom.xml
@@ -129,47 +129,40 @@
asciidoctor-maven-plugin${asciidoctor.version}
-
org.dbunitdbunit${dbunit.version}test
-
com.h2databaseh2${h2.version}test
-
org.assertjassertj-core${assertj-core.version}test
-
net.bytebuddybyte-buddy${byte-buddy.version}test
-
com.tngtech.archunitarchunit-junit5${archunit.version}test
-
-
net.serenity-bdd.maven.pluginsserenity-maven-plugin
@@ -184,7 +177,6 @@
-
org.apache.maven.pluginsmaven-compiler-plugin
@@ -194,7 +186,6 @@
${maven-compiler-plugin.target}
-
@@ -220,4 +211,4 @@
0.14.1
-
+
\ No newline at end of file
diff --git a/libraries/pom.xml b/libraries/pom.xml
index fee66f928d..40cc1b4671 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0librarieslibraries
@@ -34,7 +35,6 @@
commons-net${commons-net.version}
-
org.javatuplesjavatuples
@@ -87,7 +87,6 @@
${serenity.jira.version}test
-
org.datanucleus
@@ -164,14 +163,12 @@
${serenity.version}test
-
org.luceejets3t${jets3t-version}
-
io.rest-assuredspring-mock-mvc
@@ -202,7 +199,7 @@
org.openjdk.jmhjmh-core
- ${jmh.version}
+ ${jmh-core.version}junit
@@ -226,13 +223,11 @@
${org.hamcrest.java-hamcrest.version}test
-
com.codepoeticsprotonpack${protonpack.version}
-
com.google.oauth-client
@@ -327,7 +322,6 @@
-
org.apache.maven.plugins
@@ -342,7 +336,8 @@
benchmarks
-
+ org.openjdk.jmh.Main
@@ -361,7 +356,6 @@
-
@@ -395,10 +389,9 @@
3.0.32.3.00.9.12
- 1.193.0.23.62.6
-
+
\ No newline at end of file
diff --git a/linkrest/pom.xml b/linkrest/pom.xml
index 89af27d50c..e40efb3930 100644
--- a/linkrest/pom.xml
+++ b/linkrest/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0linkrest0.0.1-SNAPSHOT
@@ -44,7 +45,6 @@
-
diff --git a/logging-modules/flogger/pom.xml b/logging-modules/flogger/pom.xml
index e9189c8460..b96025f277 100644
--- a/logging-modules/flogger/pom.xml
+++ b/logging-modules/flogger/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0flogger
@@ -18,20 +18,17 @@
flogger${flogger.version}
-
com.google.floggerflogger-system-backend${flogger.version}runtime
-
com.google.floggerflogger-slf4j-backend${flogger.version}
-
com.google.floggerflogger-log4j-backend
@@ -51,7 +48,6 @@
-
log4jlog4j
@@ -67,6 +63,6 @@
0.41.2.17
-
+
\ No newline at end of file
diff --git a/logging-modules/log-mdc/pom.xml b/logging-modules/log-mdc/pom.xml
index 5e2155fde9..ddf1f23f8c 100644
--- a/logging-modules/log-mdc/pom.xml
+++ b/logging-modules/log-mdc/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0log-mdc0.0.1-SNAPSHOT
@@ -37,14 +38,12 @@
jackson-databind${jackson.version}
-
log4jlog4j${log4j.version}
-
org.apache.logging.log4j
@@ -56,14 +55,12 @@
log4j-core${log4j2.version}
-
com.lmaxdisruptor${disruptor.version}
-
org.jboss.logging
@@ -80,7 +77,6 @@
logging-service
-
@@ -95,14 +91,6 @@
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
@@ -112,4 +100,4 @@
5.6.2
-
+
\ No newline at end of file
diff --git a/logging-modules/log4j/README.md b/logging-modules/log4j/README.md
index a7a7ea9643..371d0246ce 100644
--- a/logging-modules/log4j/README.md
+++ b/logging-modules/log4j/README.md
@@ -3,3 +3,4 @@
- [Introduction to SLF4J](http://www.baeldung.com/slf4j-with-log4j2-logback)
- [A Guide to Rolling File Appenders](http://www.baeldung.com/java-logging-rolling-file-appenders)
- [Logging Exceptions Using SLF4J](https://www.baeldung.com/slf4j-log-exceptions)
+- [Log4j Warning: "No Appenders Could Be Found for Logger"](https://www.baeldung.com/log4j-no-appenders-found)
diff --git a/logging-modules/log4j/pom.xml b/logging-modules/log4j/pom.xml
index 15cd2d530f..864e2253b5 100644
--- a/logging-modules/log4j/pom.xml
+++ b/logging-modules/log4j/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0log4j1.0-SNAPSHOT
@@ -26,7 +26,6 @@
apache-log4j-extras${log4j.version}
-
org.apache.logging.log4j
diff --git a/logging-modules/log4j/src/main/java/com/baeldung/log4j/NoAppenderExample.java b/logging-modules/log4j/src/main/java/com/baeldung/log4j/NoAppenderExample.java
new file mode 100644
index 0000000000..9bd8a06537
--- /dev/null
+++ b/logging-modules/log4j/src/main/java/com/baeldung/log4j/NoAppenderExample.java
@@ -0,0 +1,18 @@
+package com.baeldung.log4j;
+
+import org.apache.log4j.Logger;
+
+public class NoAppenderExample {
+
+ private final static Logger logger = Logger.getLogger(NoAppenderExample.class);
+
+ public static void main(String[] args) {
+
+ //Setup default appender
+ //BasicConfigurator.configure();
+
+ //Define path to configuration file
+ //PropertyConfigurator.configure("src\\main\\resources\\log4j.properties");
+ logger.info("Info log message");
+ }
+}
diff --git a/logging-modules/log4j/src/main/resources/log4j.properties b/logging-modules/log4j/src/main/resources/log4j.properties
new file mode 100644
index 0000000000..b10ba2b7d4
--- /dev/null
+++ b/logging-modules/log4j/src/main/resources/log4j.properties
@@ -0,0 +1,5 @@
+log4j.rootLogger=INFO, stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
\ No newline at end of file
diff --git a/logging-modules/log4j/src/main/resources/log4j.xml b/logging-modules/log4j/src/main/resources/log4j.xml
index 562d6920f9..3004649edf 100644
--- a/logging-modules/log4j/src/main/resources/log4j.xml
+++ b/logging-modules/log4j/src/main/resources/log4j.xml
@@ -90,6 +90,8 @@
+
+
diff --git a/logging-modules/log4j2/pom.xml b/logging-modules/log4j2/pom.xml
index e09cbd5d33..aaf60a4216 100644
--- a/logging-modules/log4j2/pom.xml
+++ b/logging-modules/log4j2/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0log4j2log4j2
@@ -19,28 +20,24 @@
log4j-core${log4j-core.version}
-
org.apache.logging.log4jlog4j-api${log4j-core.version}
-
com.fasterxml.jackson.corejackson-databind${jackson.version}
-
com.fasterxml.jackson.dataformatjackson-dataformat-xml${jackson.version}
-
com.h2database
@@ -52,7 +49,6 @@
commons-dbcp2${commons-dbcp2.version}
-
org.apache.logging.log4j
diff --git a/logging-modules/logback/README.md b/logging-modules/logback/README.md
index 05a4ab9308..c9e5450cb0 100644
--- a/logging-modules/logback/README.md
+++ b/logging-modules/logback/README.md
@@ -3,3 +3,4 @@
- [Get Log Output in JSON](https://www.baeldung.com/java-log-json-output)
- [SLF4J Warning: Class Path Contains Multiple SLF4J Bindings](https://www.baeldung.com/slf4j-classpath-multiple-bindings)
- [Sending Emails with Logback](https://www.baeldung.com/logback-send-email)
+- [Mask Sensitive Data in Logs With Logback](https://www.baeldung.com/logback-mask-sensitive-data)
diff --git a/logging-modules/logback/pom.xml b/logging-modules/logback/pom.xml
index 9f5a3ef294..6d32025d94 100644
--- a/logging-modules/logback/pom.xml
+++ b/logging-modules/logback/pom.xml
@@ -1,7 +1,7 @@
-
+4.0.0logback0.1-SNAPSHOT
@@ -15,6 +15,11 @@
+
+ org.json
+ json
+ 20180130
+ ch.qos.logbacklogback-classic
@@ -71,4 +76,4 @@
1.1.1
-
+
\ No newline at end of file
diff --git a/logging-modules/logback/src/main/java/com/baeldung/logback/MaskingPatternLayout.java b/logging-modules/logback/src/main/java/com/baeldung/logback/MaskingPatternLayout.java
new file mode 100644
index 0000000000..04321e9066
--- /dev/null
+++ b/logging-modules/logback/src/main/java/com/baeldung/logback/MaskingPatternLayout.java
@@ -0,0 +1,46 @@
+package com.baeldung.logback;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import ch.qos.logback.classic.PatternLayout;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+
+public class MaskingPatternLayout extends PatternLayout {
+
+ private Pattern multilinePattern;
+ private List maskPatterns = new ArrayList<>();
+
+ // invoked for every single entry in the xml
+ public void addMaskPattern(String maskPattern) {
+ maskPatterns.add(maskPattern);
+ multilinePattern = Pattern.compile(maskPatterns.stream().collect(Collectors.joining("|")), Pattern.MULTILINE);
+ }
+
+ @Override
+ public String doLayout(ILoggingEvent event) {
+ return maskMessage(super.doLayout(event));
+ }
+
+ private String maskMessage(String message) {
+ if (multilinePattern == null) {
+ return message;
+ }
+ StringBuilder sb = new StringBuilder(message);
+ Matcher matcher = multilinePattern.matcher(sb);
+ while (matcher.find()) {
+ IntStream.rangeClosed(1, matcher.groupCount()).forEach(group -> {
+ if (matcher.group(group) != null) {
+ // replace each character with asterisk
+ IntStream.range(matcher.start(group), matcher.end(group)).forEach(i -> sb.setCharAt(i, '*'));
+ }
+ });
+ }
+ return sb.toString();
+ }
+
+}
\ No newline at end of file
diff --git a/logging-modules/logback/src/main/java/com/baeldung/logback/MaskingPatternLayoutExample.java b/logging-modules/logback/src/main/java/com/baeldung/logback/MaskingPatternLayoutExample.java
new file mode 100644
index 0000000000..cbcd0209ab
--- /dev/null
+++ b/logging-modules/logback/src/main/java/com/baeldung/logback/MaskingPatternLayoutExample.java
@@ -0,0 +1,27 @@
+package com.baeldung.logback;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MaskingPatternLayoutExample {
+
+ private static final Logger logger = LoggerFactory.getLogger(MaskingPatternLayoutExample.class);
+
+ public static void main(String[] args) {
+ Map user = new HashMap();
+ user.put("user_id", "87656");
+ user.put("SSN", "786445563");
+ user.put("address", "22 Street");
+ user.put("city", "Chicago");
+ user.put("Country", "U.S.");
+ user.put("ip_address", "192.168.1.1");
+ user.put("email_id", "spring@baeldung.com");
+ JSONObject userDetails = new JSONObject(user);
+
+ logger.info("MaskingPatternExample log from {}" + userDetails, MaskingPatternLayoutExample.class.getSimpleName());
+ }
+}
diff --git a/logging-modules/logback/src/main/resources/logback.xml b/logging-modules/logback/src/main/resources/logback.xml
index 76ddc2e3ee..2d56c110e0 100644
--- a/logging-modules/logback/src/main/resources/logback.xml
+++ b/logging-modules/logback/src/main/resources/logback.xml
@@ -47,10 +47,23 @@
+
+
+
+ \"SSN\"\s*:\s*\"(.*?)\"
+ \"address\"\s*:\s*\"(.*?)\"
+ (\d+\.\d+\.\d+\.\d+)
+ (\w+@\w+\.\w+)
+ %-5p [%d{ISO8601,UTC}] [%thread] %c: %m%n%rootException
+
+
+
+
+
\ No newline at end of file
diff --git a/logging-modules/pom.xml b/logging-modules/pom.xml
index b5354c7c23..6d036d5648 100644
--- a/logging-modules/pom.xml
+++ b/logging-modules/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0logging-moduleslogging-modules
@@ -14,24 +15,15 @@
+ floggerlog4jlog4j2logbacklog-mdc
- flogger
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
-
-
5.6.2
+
diff --git a/lombok/pom.xml b/lombok/pom.xml
index e347515b40..c5758ea8df 100644
--- a/lombok/pom.xml
+++ b/lombok/pom.xml
@@ -1,7 +1,7 @@
-
+4.0.0lombok0.1-SNAPSHOT
@@ -42,9 +42,7 @@
true
-
-
org.projectlomboklombok-maven-plugin
@@ -66,17 +64,15 @@
false
-
+
-
- 1.18.10
-
1.0.0.Final
@@ -84,4 +80,4 @@
3.8.0
-
+
\ No newline at end of file
diff --git a/lucene/pom.xml b/lucene/pom.xml
index 0a0e09f724..0f08abaee9 100644
--- a/lucene/pom.xml
+++ b/lucene/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0lucene0.0.1-SNAPSHOT
diff --git a/mapstruct/pom.xml b/mapstruct/pom.xml
index 9b416177e7..1e7ce6cbfc 100644
--- a/mapstruct/pom.xml
+++ b/mapstruct/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0mapstruct1.0
@@ -33,7 +34,12 @@
org.projectlomboklombok
- ${org.projectlombok.version}
+ ${lombok.version}
+
+
+ org.projectlombok
+ lombok-mapstruct-binding
+ ${lombok.mapstruct.binding.version}org.assertj
@@ -62,7 +68,12 @@
org.projectlomboklombok
- ${org.projectlombok.version}
+ ${lombok.version}
+
+
+ org.projectlombok
+ lombok-mapstruct-binding
+ ${lombok.mapstruct.binding.version}
@@ -71,12 +82,12 @@
- 1.3.1.Final
+ 1.4.2.Final4.3.4.RELEASE1.81.8
- 1.18.4
+ 0.2.03.16.1
-
+
\ No newline at end of file
diff --git a/mapstruct/src/main/java/com/baeldung/mapper/SimpleDestinationMapperUsingInjectedService.java b/mapstruct/src/main/java/com/baeldung/mapper/SimpleDestinationMapperUsingInjectedService.java
new file mode 100644
index 0000000000..22e6499711
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/mapper/SimpleDestinationMapperUsingInjectedService.java
@@ -0,0 +1,22 @@
+package com.baeldung.mapper;
+
+import com.baeldung.dto.SimpleSource;
+import com.baeldung.entity.SimpleDestination;
+import com.baeldung.service.SimpleService;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.springframework.beans.factory.annotation.Autowired;
+
+@Mapper(componentModel = "spring")
+public abstract class SimpleDestinationMapperUsingInjectedService {
+
+ @Autowired
+ protected SimpleService simpleService;
+
+ @Mapping(target = "name", expression = "java(simpleService.enrichName(source.getName()))")
+ public abstract SimpleDestination sourceToDestination(SimpleSource source);
+
+ public abstract SimpleSource destinationToSource(SimpleDestination destination);
+
+
+}
diff --git a/mapstruct/src/main/java/com/baeldung/service/SimpleService.java b/mapstruct/src/main/java/com/baeldung/service/SimpleService.java
new file mode 100644
index 0000000000..14b6c09592
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/service/SimpleService.java
@@ -0,0 +1,11 @@
+package com.baeldung.service;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class SimpleService {
+
+ public String enrichName(String name) {
+ return "-:: " + name + " ::-";
+ }
+}
diff --git a/mapstruct/src/test/java/com/baeldung/mapper/SimpleDestinationMapperUsingInjectedIntegrationTest.java b/mapstruct/src/test/java/com/baeldung/mapper/SimpleDestinationMapperUsingInjectedIntegrationTest.java
new file mode 100644
index 0000000000..3bfbc60de6
--- /dev/null
+++ b/mapstruct/src/test/java/com/baeldung/mapper/SimpleDestinationMapperUsingInjectedIntegrationTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.mapper;
+
+import com.baeldung.dto.SimpleSource;
+import com.baeldung.entity.SimpleDestination;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("classpath:applicationContext.xml")
+public class SimpleDestinationMapperUsingInjectedIntegrationTest {
+
+ @Autowired
+ private SimpleDestinationMapperUsingInjectedService mapper;
+
+ @Test
+ public void givenSourceToDestination_whenMaps_thenNameEnriched() {
+ // Given
+ SimpleSource source = new SimpleSource();
+ source.setName("Bob");
+ source.setDescription("The Builder");
+
+ // When
+ SimpleDestination destination = mapper.sourceToDestination(source);
+
+ // Then
+ assertThat(destination).isNotNull();
+ assertThat(destination.getName()).isEqualTo("-:: Bob ::-");
+ assertThat(destination.getDescription()).isEqualTo("The Builder");
+ }
+}
\ No newline at end of file
diff --git a/maven-archetype/pom.xml b/maven-archetype/pom.xml
index be616ac299..2eab8ac614 100644
--- a/maven-archetype/pom.xml
+++ b/maven-archetype/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.baeldung.archetypesmaven-archetype
@@ -26,4 +27,4 @@
3.0.1
-
+
\ No newline at end of file
diff --git a/maven-modules/compiler-plugin-java-9/pom.xml b/maven-modules/compiler-plugin-java-9/pom.xml
index 6baadb451c..1063ee2e8f 100644
--- a/maven-modules/compiler-plugin-java-9/pom.xml
+++ b/maven-modules/compiler-plugin-java-9/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldungcompiler-plugin-java-9
@@ -25,6 +25,6 @@
3.8.099
-
+
\ No newline at end of file
diff --git a/maven-modules/maven-copy-files/README.md b/maven-modules/maven-copy-files/README.md
new file mode 100644
index 0000000000..1e3a75cb0b
--- /dev/null
+++ b/maven-modules/maven-copy-files/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Copying Files With Maven](https://www.baeldung.com/maven-copy-files)
diff --git a/maven-modules/maven-copy-files/copy-rename-maven-plugin/pom.xml b/maven-modules/maven-copy-files/copy-rename-maven-plugin/pom.xml
new file mode 100644
index 0000000000..24a7c48499
--- /dev/null
+++ b/maven-modules/maven-copy-files/copy-rename-maven-plugin/pom.xml
@@ -0,0 +1,92 @@
+
+
+ 4.0.0
+
+ maven-copy-files
+ com.baeldung
+ 1.0-SNAPSHOT
+
+ org.baeldung
+ copy-rename-maven-plugin
+ 1.0-SNAPSHOT
+ copy-rename-maven-plugin
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+ junit
+ junit
+ 4.11
+ test
+
+
+
+
+
+ com.coderplus.maven.plugins
+ copy-rename-maven-plugin
+ 1.0
+
+
+ copy-file
+ generate-sources
+
+ copy
+
+
+ source-files/foo.txt
+ target/destination-folder/foo.txt
+
+
+
+
+
+
+
+
+
+
+ maven-clean-plugin
+ 3.1.0
+
+
+
+ maven-resources-plugin
+ 3.0.2
+
+
+ maven-compiler-plugin
+ 3.8.0
+
+
+ maven-surefire-plugin
+ 2.22.1
+
+
+ maven-jar-plugin
+ 3.0.2
+
+
+ maven-install-plugin
+ 2.5.2
+
+
+ maven-deploy-plugin
+ 2.8.2
+
+
+
+ maven-site-plugin
+ 3.7.1
+
+
+ maven-project-info-reports-plugin
+ 3.0.0
+
+
+
+
+
diff --git a/maven-modules/maven-copy-files/copy-rename-maven-plugin/source-files/foo.txt b/maven-modules/maven-copy-files/copy-rename-maven-plugin/source-files/foo.txt
new file mode 100644
index 0000000000..b2fa85b97f
--- /dev/null
+++ b/maven-modules/maven-copy-files/copy-rename-maven-plugin/source-files/foo.txt
@@ -0,0 +1 @@
+Copy File Example
diff --git a/maven-modules/maven-copy-files/copy-rename-maven-plugin/src/test/java/org/baeldung/CopyFileUnitTest.java b/maven-modules/maven-copy-files/copy-rename-maven-plugin/src/test/java/org/baeldung/CopyFileUnitTest.java
new file mode 100644
index 0000000000..a98db61fa9
--- /dev/null
+++ b/maven-modules/maven-copy-files/copy-rename-maven-plugin/src/test/java/org/baeldung/CopyFileUnitTest.java
@@ -0,0 +1,16 @@
+package org.baeldung;
+
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.assertEquals;
+
+public class CopyFileUnitTest {
+
+ @Test
+ public void whenCopyingAFileFromSourceToDestination_thenFileShouldBeInDestination() {
+ File destinationFile = new File("target/destination-folder/foo.txt");
+ assertEquals(true, destinationFile.exists());
+ }
+}
diff --git a/maven-modules/maven-copy-files/maven-antrun-plugin/pom.xml b/maven-modules/maven-copy-files/maven-antrun-plugin/pom.xml
new file mode 100644
index 0000000000..61017dd18a
--- /dev/null
+++ b/maven-modules/maven-copy-files/maven-antrun-plugin/pom.xml
@@ -0,0 +1,94 @@
+
+
+ 4.0.0
+
+ maven-copy-files
+ com.baeldung
+ 1.0-SNAPSHOT
+
+ org.baeldung
+ maven-antrun-plugin
+ 1.0-SNAPSHOT
+ maven-antrun-plugin
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+ junit
+ junit
+ 4.11
+ test
+
+
+
+
+
+ maven-antrun-plugin
+ 3.0.0
+
+
+ generate-sources
+
+
+
+
+
+
+
+
+
+ run
+
+
+
+
+
+
+
+
+
+
+ maven-clean-plugin
+ 3.1.0
+
+
+
+ maven-resources-plugin
+ 3.0.2
+
+
+ maven-compiler-plugin
+ 3.8.0
+
+
+ maven-surefire-plugin
+ 2.22.1
+
+
+ maven-jar-plugin
+ 3.0.2
+
+
+ maven-install-plugin
+ 2.5.2
+
+
+ maven-deploy-plugin
+ 2.8.2
+
+
+
+ maven-site-plugin
+ 3.7.1
+
+
+ maven-project-info-reports-plugin
+ 3.0.0
+
+
+
+
+
diff --git a/maven-modules/maven-copy-files/maven-antrun-plugin/source-files/foo.txt b/maven-modules/maven-copy-files/maven-antrun-plugin/source-files/foo.txt
new file mode 100644
index 0000000000..b2fa85b97f
--- /dev/null
+++ b/maven-modules/maven-copy-files/maven-antrun-plugin/source-files/foo.txt
@@ -0,0 +1 @@
+Copy File Example
diff --git a/maven-modules/maven-copy-files/maven-antrun-plugin/src/test/java/org/baeldung/CopyFileUnitTest.java b/maven-modules/maven-copy-files/maven-antrun-plugin/src/test/java/org/baeldung/CopyFileUnitTest.java
new file mode 100644
index 0000000000..a98db61fa9
--- /dev/null
+++ b/maven-modules/maven-copy-files/maven-antrun-plugin/src/test/java/org/baeldung/CopyFileUnitTest.java
@@ -0,0 +1,16 @@
+package org.baeldung;
+
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.assertEquals;
+
+public class CopyFileUnitTest {
+
+ @Test
+ public void whenCopyingAFileFromSourceToDestination_thenFileShouldBeInDestination() {
+ File destinationFile = new File("target/destination-folder/foo.txt");
+ assertEquals(true, destinationFile.exists());
+ }
+}
diff --git a/maven-modules/maven-copy-files/maven-resources-plugin/pom.xml b/maven-modules/maven-copy-files/maven-resources-plugin/pom.xml
new file mode 100644
index 0000000000..7dbe851f95
--- /dev/null
+++ b/maven-modules/maven-copy-files/maven-resources-plugin/pom.xml
@@ -0,0 +1,92 @@
+
+
+ 4.0.0
+
+ maven-copy-files
+ com.baeldung
+ 1.0-SNAPSHOT
+
+ org.baeldung
+ maven-resources-plugin
+ 1.0-SNAPSHOT
+ maven-resoures-plugin
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+ junit
+ junit
+ 4.11
+ test
+
+
+
+
+
+
+
+
+ maven-clean-plugin
+ 3.1.0
+
+
+
+ maven-resources-plugin
+ 3.0.2
+
+
+ copy-resource-one
+ generate-sources
+
+ copy-resources
+
+
+ ${basedir}/target/destination-folder
+
+
+ source-files
+
+ foo.txt
+
+
+
+
+
+
+
+
+ maven-compiler-plugin
+ 3.8.0
+
+
+ maven-surefire-plugin
+ 2.22.1
+
+
+ maven-jar-plugin
+ 3.0.2
+
+
+ maven-install-plugin
+ 2.5.2
+
+
+ maven-deploy-plugin
+ 2.8.2
+
+
+
+ maven-site-plugin
+ 3.7.1
+
+
+ maven-project-info-reports-plugin
+ 3.0.0
+
+
+
+
+
diff --git a/maven-modules/maven-copy-files/maven-resources-plugin/source-files/foo.txt b/maven-modules/maven-copy-files/maven-resources-plugin/source-files/foo.txt
new file mode 100644
index 0000000000..b2fa85b97f
--- /dev/null
+++ b/maven-modules/maven-copy-files/maven-resources-plugin/source-files/foo.txt
@@ -0,0 +1 @@
+Copy File Example
diff --git a/maven-modules/maven-copy-files/maven-resources-plugin/src/test/java/org/baeldung/CopyFileUnitTest.java b/maven-modules/maven-copy-files/maven-resources-plugin/src/test/java/org/baeldung/CopyFileUnitTest.java
new file mode 100644
index 0000000000..a98db61fa9
--- /dev/null
+++ b/maven-modules/maven-copy-files/maven-resources-plugin/src/test/java/org/baeldung/CopyFileUnitTest.java
@@ -0,0 +1,16 @@
+package org.baeldung;
+
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.assertEquals;
+
+public class CopyFileUnitTest {
+
+ @Test
+ public void whenCopyingAFileFromSourceToDestination_thenFileShouldBeInDestination() {
+ File destinationFile = new File("target/destination-folder/foo.txt");
+ assertEquals(true, destinationFile.exists());
+ }
+}
diff --git a/maven-modules/maven-copy-files/pom.xml b/maven-modules/maven-copy-files/pom.xml
new file mode 100644
index 0000000000..b7b67286bc
--- /dev/null
+++ b/maven-modules/maven-copy-files/pom.xml
@@ -0,0 +1,80 @@
+
+
+ 4.0.0
+
+ maven-modules
+ com.baeldung
+ 0.0.1-SNAPSHOT
+
+ com.baeldung
+ maven-copy-files
+ 1.0-SNAPSHOT
+ pom
+ maven-copy-files
+
+ http://www.example.com
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+ junit
+ junit
+ 4.11
+ test
+
+
+
+
+
+
+
+
+ maven-clean-plugin
+ 3.1.0
+
+
+
+ maven-resources-plugin
+ 3.0.2
+
+
+ maven-compiler-plugin
+ 3.8.0
+
+
+ maven-surefire-plugin
+ 2.22.1
+
+
+ maven-jar-plugin
+ 3.0.2
+
+
+ maven-install-plugin
+ 2.5.2
+
+
+ maven-deploy-plugin
+ 2.8.2
+
+
+
+ maven-site-plugin
+ 3.7.1
+
+
+ maven-project-info-reports-plugin
+ 3.0.0
+
+
+
+
+
+ maven-resources-plugin
+ maven-antrun-plugin
+ copy-rename-maven-plugin
+
+
diff --git a/maven-modules/maven-custom-plugin/pom.xml b/maven-modules/maven-custom-plugin/pom.xml
index ad22c735ff..731abe472d 100644
--- a/maven-modules/maven-custom-plugin/pom.xml
+++ b/maven-modules/maven-custom-plugin/pom.xml
@@ -1,5 +1,6 @@
-4.0.0maven-custom-plugin
diff --git a/maven-modules/maven-exec-plugin/pom.xml b/maven-modules/maven-exec-plugin/pom.xml
index 6c12971e29..837f31edeb 100644
--- a/maven-modules/maven-exec-plugin/pom.xml
+++ b/maven-modules/maven-exec-plugin/pom.xml
@@ -1,19 +1,13 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldungmaven-exec-plugin0.0.1-SNAPSHOTmaven-exec-plugin
-
- 3.8.1
- 1.8
- 1.2.3
-
-
ch.qos.logback
@@ -33,7 +27,6 @@
${java.version}
-
org.codehaus.mojoexec-maven-plugin
@@ -50,4 +43,10 @@
-
+
+ 3.8.1
+ 1.8
+ 1.2.3
+
+
+
\ No newline at end of file
diff --git a/maven-modules/maven-integration-test/pom.xml b/maven-modules/maven-integration-test/pom.xml
index 0031230bb1..4ab8de783d 100644
--- a/maven-modules/maven-integration-test/pom.xml
+++ b/maven-modules/maven-integration-test/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0maven-integration-test0.0.1-SNAPSHOT
diff --git a/maven-modules/maven-multi-source/pom.xml b/maven-modules/maven-multi-source/pom.xml
index 0c85049df7..65e00419af 100644
--- a/maven-modules/maven-multi-source/pom.xml
+++ b/maven-modules/maven-multi-source/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0maven-multi-source0.0.1-SNAPSHOT
diff --git a/maven-modules/maven-plugins/custom-rule/pom.xml b/maven-modules/maven-plugins/custom-rule/pom.xml
index 075a5c7943..3426f30457 100644
--- a/maven-modules/maven-plugins/custom-rule/pom.xml
+++ b/maven-modules/maven-plugins/custom-rule/pom.xml
@@ -1,5 +1,6 @@
-4.0.0custom-rule
@@ -45,12 +46,6 @@
-
- 3.0.0-M2
- 2.0.9
- 1.0-alpha-9
-
-
@@ -64,4 +59,10 @@
-
+
+ 3.0.0-M2
+ 2.0.9
+ 1.0-alpha-9
+
+
+
\ No newline at end of file
diff --git a/maven-modules/maven-plugins/jaxws/pom.xml b/maven-modules/maven-plugins/jaxws/pom.xml
index 161c1dc731..5783907140 100644
--- a/maven-modules/maven-plugins/jaxws/pom.xml
+++ b/maven-modules/maven-plugins/jaxws/pom.xml
@@ -1,15 +1,16 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ jaxws
+
maven-pluginscom.baeldung0.0.1-SNAPSHOT
- 4.0.0
- jaxws
diff --git a/maven-modules/maven-plugins/maven-enforcer/pom.xml b/maven-modules/maven-plugins/maven-enforcer/pom.xml
index 01f97a061e..25c608ee36 100644
--- a/maven-modules/maven-plugins/maven-enforcer/pom.xml
+++ b/maven-modules/maven-plugins/maven-enforcer/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0maven-enforcermaven-enforcer
@@ -18,13 +18,13 @@
org.apache.maven.pluginsmaven-enforcer-plugin3.0.0-M2
-
-
-
-
-
-
-
+
+
+
+
+
+
+
enforce
@@ -33,7 +33,7 @@
-
+ 3.0Invalid Maven version. It should, at least, be 3.0
@@ -55,7 +55,7 @@
WARN
-
+
diff --git a/maven-modules/maven-plugins/pom.xml b/maven-modules/maven-plugins/pom.xml
index 20bdb4b45a..29b3b550ea 100644
--- a/maven-modules/maven-plugins/pom.xml
+++ b/maven-modules/maven-plugins/pom.xml
@@ -1,5 +1,6 @@
-4.0.0maven-plugins
diff --git a/maven-modules/maven-pom-types/README.md b/maven-modules/maven-pom-types/README.md
new file mode 100644
index 0000000000..40119f68c1
--- /dev/null
+++ b/maven-modules/maven-pom-types/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Difference Between Super, Simplest, and Effective POM](https://www.baeldung.com/maven-super-simplest-effective-pom)
diff --git a/maven-modules/maven-pom-types/effective-pom.xml b/maven-modules/maven-pom-types/effective-pom.xml
new file mode 100644
index 0000000000..a2f8460809
--- /dev/null
+++ b/maven-modules/maven-pom-types/effective-pom.xml
@@ -0,0 +1,238 @@
+
+
+ 4.0.0
+ com.baeldung
+ maven-pom-types
+ 1.0-SNAPSHOT
+
+
+
+ false
+
+ central
+ Central Repository
+ https://repo.maven.apache.org/maven2
+
+
+
+
+
+ never
+
+
+ false
+
+ central
+ Central Repository
+ https://repo.maven.apache.org/maven2
+
+
+
+ C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\src\main\java
+ C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\src\main\scripts
+
+ C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\src\test\java
+
+ C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\customTarget\classes
+
+ C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\customTarget\test-classes
+
+
+
+ C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\src\main\resources
+
+
+
+
+ C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\src\test\resources
+
+
+ C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\customTarget
+ simplestPOM-1.0-SNAPSHOT
+
+
+
+ maven-antrun-plugin
+ 1.3
+
+
+ maven-assembly-plugin
+ 2.2-beta-5
+
+
+ maven-dependency-plugin
+ 2.8
+
+
+ maven-release-plugin
+ 2.5.3
+
+
+
+
+
+ maven-clean-plugin
+ 2.5
+
+
+ default-clean
+ clean
+
+ clean
+
+
+
+
+
+ maven-resources-plugin
+ 2.6
+
+
+ default-testResources
+ process-test-resources
+
+ testResources
+
+
+
+ default-resources
+ process-resources
+
+ resources
+
+
+
+
+
+ maven-jar-plugin
+ 2.4
+
+
+ default-jar
+ package
+
+ jar
+
+
+
+
+
+ maven-compiler-plugin
+ 3.1
+
+
+ default-compile
+ compile
+
+ compile
+
+
+
+ default-testCompile
+ test-compile
+
+ testCompile
+
+
+
+
+
+ maven-surefire-plugin
+ 2.12.4
+
+
+ default-test
+ test
+
+ test
+
+
+
+
+
+ maven-install-plugin
+ 2.4
+
+
+ default-install
+ install
+
+ install
+
+
+
+
+
+ maven-deploy-plugin
+ 2.7
+
+
+ default-deploy
+ deploy
+
+ deploy
+
+
+
+
+
+ maven-site-plugin
+ 3.3
+
+
+ default-site
+ site
+
+ site
+
+
+
+ C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\customTarget\site
+
+
+
+ org.apache.maven.plugins
+ maven-project-info-reports-plugin
+
+
+
+
+
+ default-deploy
+ site-deploy
+
+ deploy
+
+
+
+ C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\customTarget\site
+
+
+
+ org.apache.maven.plugins
+ maven-project-info-reports-plugin
+
+
+
+
+
+
+ C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\customTarget\site
+
+
+
+ org.apache.maven.plugins
+ maven-project-info-reports-plugin
+
+
+
+
+
+
+
+ C:\Users\emicu\Desktop\tutorials\maven-modules\maven-pom-types\customTarget\site
+
+
+
diff --git a/maven-modules/maven-pom-types/pom-4.0.0.xml b/maven-modules/maven-pom-types/pom-4.0.0.xml
new file mode 100644
index 0000000000..24b15984af
--- /dev/null
+++ b/maven-modules/maven-pom-types/pom-4.0.0.xml
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+ 4.0.0
+
+
+
+ central
+ Central Repository
+ https://repo.maven.apache.org/maven2
+ default
+
+ false
+
+
+
+
+
+
+ central
+ Central Repository
+ https://repo.maven.apache.org/maven2
+ default
+
+ false
+
+
+ never
+
+
+
+
+
+ ${project.basedir}/target
+ ${project.build.directory}/classes
+ ${project.artifactId}-${project.version}
+ ${project.build.directory}/test-classes
+
+ ${project.basedir}/src/main/java
+ ${project.basedir}/src/main/scripts
+
+ ${project.basedir}/src/test/java
+
+
+
+ ${project.basedir}/src/main/resources
+
+
+
+
+ ${project.basedir}/src/test/resources
+
+
+
+
+
+
+
+ maven-antrun-plugin
+ 1.3
+
+
+ maven-assembly-plugin
+ 2.2-beta-5
+
+
+ maven-dependency-plugin
+ 2.8
+
+
+ maven-release-plugin
+ 2.5.3
+
+
+
+
+
+
+ ${project.build.directory}/site
+
+
+
+
+
+ release-profile
+
+
+
+ performRelease
+ true
+
+
+
+
+
+
+ true
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar-no-fork
+
+
+
+
+
+ true
+ maven-javadoc-plugin
+
+
+ attach-javadocs
+
+ jar
+
+
+
+
+
+ true
+ maven-deploy-plugin
+
+ true
+
+
+
+
+
+
+
+
+
diff --git a/maven-modules/maven-pom-types/pom.xml b/maven-modules/maven-pom-types/pom.xml
new file mode 100644
index 0000000000..98fbc828a0
--- /dev/null
+++ b/maven-modules/maven-pom-types/pom.xml
@@ -0,0 +1,9 @@
+
+
+ 4.0.0
+ com.baeldung
+ maven-pom-types
+ 1.0-SNAPSHOT
+
\ No newline at end of file
diff --git a/maven-modules/maven-printing-plugins/.gitignore b/maven-modules/maven-printing-plugins/.gitignore
new file mode 100644
index 0000000000..333c1e910a
--- /dev/null
+++ b/maven-modules/maven-printing-plugins/.gitignore
@@ -0,0 +1 @@
+logs/
diff --git a/maven-modules/maven-printing-plugins/README.md b/maven-modules/maven-printing-plugins/README.md
new file mode 100644
index 0000000000..862c4bcdd1
--- /dev/null
+++ b/maven-modules/maven-printing-plugins/README.md
@@ -0,0 +1,7 @@
+## Maven Printing Plugins
+
+This module contains articles about printing from Maven plugins.
+
+### Relevant Articles
+
+- [How to Display a Message in Maven](https://www.baeldung.com/maven-print-message-during-execution)
diff --git a/maven-modules/maven-printing-plugins/pom.xml b/maven-modules/maven-printing-plugins/pom.xml
new file mode 100644
index 0000000000..805c3c1633
--- /dev/null
+++ b/maven-modules/maven-printing-plugins/pom.xml
@@ -0,0 +1,87 @@
+
+
+ 4.0.0
+ maven-printing-plugins
+ maven-printing-plugins
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ ../..
+
+
+
+
+
+ maven-antrun-plugin
+ 3.0.0
+
+
+ antrun-plugin
+ validate
+
+ run
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.github.ekryd.echo-maven-plugin
+ echo-maven-plugin
+ 1.3.2
+
+
+ echo-maven-plugin-1
+ package
+
+ echo
+
+
+
+ Hello, world
+ Embed a line break: ${line.separator}
+ ArtifactId is ${project.artifactId}
+
+ INFO
+ /logs/log-echo.txt
+ true
+
+
+
+
+
+ org.codehaus.gmaven
+ groovy-maven-plugin
+ 2.1.1
+
+
+ validate
+
+ execute
+
+
+
+ log.info('Test message: {}', 'Hello, World!')
+ log.info('Embed a line break {}', System.lineSeparator())
+ log.info('ArtifactId is: ${project.artifactId}')
+ log.warn('Message only in debug mode')
+
+
+
+
+
+
+
+
diff --git a/maven-modules/maven-profiles/pom.xml b/maven-modules/maven-profiles/pom.xml
index f3aeb9d549..322dada104 100644
--- a/maven-modules/maven-profiles/pom.xml
+++ b/maven-modules/maven-profiles/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldungmaven-profiles
@@ -90,7 +90,7 @@
- 3.2.0
+ 3.2.0
\ No newline at end of file
diff --git a/maven-modules/maven-war-plugin/pom.xml b/maven-modules/maven-war-plugin/pom.xml
index 915be306ca..04188b8995 100644
--- a/maven-modules/maven-war-plugin/pom.xml
+++ b/maven-modules/maven-war-plugin/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldungmaven-war-plugin
diff --git a/maven-modules/optional-dependencies/main-project/pom.xml b/maven-modules/optional-dependencies/main-project/pom.xml
index 6a42683779..23da40dcf7 100644
--- a/maven-modules/optional-dependencies/main-project/pom.xml
+++ b/maven-modules/optional-dependencies/main-project/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldungmain-project
@@ -15,4 +15,5 @@
0.0.1-SNAPSHOT
+
\ No newline at end of file
diff --git a/maven-modules/optional-dependencies/optional-project/pom.xml b/maven-modules/optional-dependencies/optional-project/pom.xml
index 9ad4376c8d..7502e70c4a 100644
--- a/maven-modules/optional-dependencies/optional-project/pom.xml
+++ b/maven-modules/optional-dependencies/optional-project/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldungoptional-project
diff --git a/maven-modules/optional-dependencies/pom.xml b/maven-modules/optional-dependencies/pom.xml
index 12d028b2d7..761028ec95 100644
--- a/maven-modules/optional-dependencies/pom.xml
+++ b/maven-modules/optional-dependencies/pom.xml
@@ -1,19 +1,21 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ optional-dependencies
+ pom
+
maven-modulescom.baeldung0.0.1-SNAPSHOT
- 4.0.0
- optional-dependencies
- pomoptional-projectproject-with-optionalsmain-project
+
\ No newline at end of file
diff --git a/maven-modules/optional-dependencies/project-with-optionals/pom.xml b/maven-modules/optional-dependencies/project-with-optionals/pom.xml
index 6a14f3260d..b95217d53d 100644
--- a/maven-modules/optional-dependencies/project-with-optionals/pom.xml
+++ b/maven-modules/optional-dependencies/project-with-optionals/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldungproject-with-optionals
@@ -16,4 +16,5 @@
true
+
\ No newline at end of file
diff --git a/maven-modules/pom.xml b/maven-modules/pom.xml
index c9a2b67a6c..0f146e26da 100644
--- a/maven-modules/pom.xml
+++ b/maven-modules/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0maven-modules0.0.1-SNAPSHOT
@@ -14,20 +15,23 @@
-
- maven-custom-plugin
- maven-exec-plugin
+
+ maven-copy-files
+ maven-custom-plugin
+ maven-exec-pluginmaven-integration-testmaven-multi-sourcemaven-plugins
- maven-unused-dependencies
- maven-war-pluginmaven-profilesmaven-properties
- versions-maven-plugin
- version-collision
+
+ maven-unused-dependencies
+ maven-war-pluginoptional-dependencies
+ version-collisionversion-overriding-plugins
+ versions-maven-plugin
+ maven-printing-plugins
diff --git a/maven-modules/version-collision/pom.xml b/maven-modules/version-collision/pom.xml
index 6d8441aa7b..9c1b9641c8 100644
--- a/maven-modules/version-collision/pom.xml
+++ b/maven-modules/version-collision/pom.xml
@@ -1,23 +1,24 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ version-collision
+ pom
+
maven-modulescom.baeldung0.0.1-SNAPSHOT
- 4.0.0
- version-collision
- pomproject-aproject-bproject-collision
-
+
@@ -29,26 +30,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/maven-modules/version-collision/project-a/pom.xml b/maven-modules/version-collision/project-a/pom.xml
index 1b7af7e963..ca06c7daca 100644
--- a/maven-modules/version-collision/project-a/pom.xml
+++ b/maven-modules/version-collision/project-a/pom.xml
@@ -1,15 +1,15 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ project-a
+
version-collisioncom.baeldung0.0.1-SNAPSHOT
- 4.0.0
-
- project-a
@@ -18,4 +18,5 @@
22.0
+
\ No newline at end of file
diff --git a/maven-modules/version-collision/project-b/pom.xml b/maven-modules/version-collision/project-b/pom.xml
index 0b0f50aeb8..a7185ab22d 100644
--- a/maven-modules/version-collision/project-b/pom.xml
+++ b/maven-modules/version-collision/project-b/pom.xml
@@ -1,15 +1,15 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ project-b
+
version-collisioncom.baeldung0.0.1-SNAPSHOT
- 4.0.0
-
- project-b
@@ -18,4 +18,5 @@
29.0-jre
+
\ No newline at end of file
diff --git a/maven-modules/version-collision/project-collision/pom.xml b/maven-modules/version-collision/project-collision/pom.xml
index 3bec0ed54a..74f117cdbb 100644
--- a/maven-modules/version-collision/project-collision/pom.xml
+++ b/maven-modules/version-collision/project-collision/pom.xml
@@ -1,16 +1,15 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ project-collision
+
version-collisioncom.baeldung0.0.1-SNAPSHOT
- 4.0.0
-
- project-collision
-
@@ -18,12 +17,12 @@
project-a0.0.1-SNAPSHOT
-
-
-
-
-
-
+
+
+
+
+
+
com.baeldung
@@ -31,4 +30,5 @@
0.0.1-SNAPSHOT
+
\ No newline at end of file
diff --git a/maven-modules/version-overriding-plugins/child-a/pom.xml b/maven-modules/version-overriding-plugins/child-a/pom.xml
index 780e1c4125..45098ccef0 100644
--- a/maven-modules/version-overriding-plugins/child-a/pom.xml
+++ b/maven-modules/version-overriding-plugins/child-a/pom.xml
@@ -1,16 +1,17 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ child-a
+ pom
+
version-overriding-pluginscom.baeldung0.0.1-SNAPSHOT
- 4.0.0
- pom
- child-a
@@ -33,4 +34,5 @@
+
\ No newline at end of file
diff --git a/maven-modules/version-overriding-plugins/child-b/pom.xml b/maven-modules/version-overriding-plugins/child-b/pom.xml
index 05f127bc5c..f86a3c2096 100644
--- a/maven-modules/version-overriding-plugins/child-b/pom.xml
+++ b/maven-modules/version-overriding-plugins/child-b/pom.xml
@@ -1,15 +1,14 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ child-b
+
version-overriding-pluginscom.baeldung0.0.1-SNAPSHOT
- 4.0.0
-
- child-b
-
\ No newline at end of file
diff --git a/maven-modules/version-overriding-plugins/pom.xml b/maven-modules/version-overriding-plugins/pom.xml
index 8d703ab568..79109a83e1 100644
--- a/maven-modules/version-overriding-plugins/pom.xml
+++ b/maven-modules/version-overriding-plugins/pom.xml
@@ -1,19 +1,16 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ version-overriding-plugins
+ pom
+
maven-modulescom.baeldung0.0.1-SNAPSHOT
-
- 3.8.0
-
- 4.0.0
-
- version-overriding-plugins
- pomchild-a
@@ -52,4 +49,9 @@
+
+
+ 3.8.0
+
+
\ No newline at end of file
diff --git a/maven-modules/versions-maven-plugin/original/pom.xml b/maven-modules/versions-maven-plugin/original/pom.xml
index c36a5913c2..2d81274611 100644
--- a/maven-modules/versions-maven-plugin/original/pom.xml
+++ b/maven-modules/versions-maven-plugin/original/pom.xml
@@ -8,37 +8,31 @@
0.0.1-SNAPSHOT
-
commons-iocommons-io${commons-io.version}
-
org.apache.commonscommons-collections4${commons-collections4.version}
-
org.apache.commonscommons-lang3${commons-lang3.version}
-
org.apache.commonscommons-compress${commons-compress-version}
-
commons-beanutilscommons-beanutils${commons-beanutils.version}
-
@@ -70,12 +64,12 @@
-
+ 1.152.34.01.9.12.7
-
+
\ No newline at end of file
diff --git a/maven-modules/versions-maven-plugin/pom.xml b/maven-modules/versions-maven-plugin/pom.xml
index ff49811430..9c837cefa0 100644
--- a/maven-modules/versions-maven-plugin/pom.xml
+++ b/maven-modules/versions-maven-plugin/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldungversions-maven-plugin
@@ -14,25 +14,21 @@
commons-io${commons.io.version}
-
org.apache.commonscommons-collections4${commons.collections4.version}
-
org.apache.commonscommons-lang3${commons.lang3.version}
-
org.apache.commonscommons-compress${commons-compress-version}
-
commons-beanutilscommons-beanutils
diff --git a/maven-polyglot/maven-polyglot-json-extension/pom.xml b/maven-polyglot/maven-polyglot-json-extension/pom.xml
index 15166046c1..13d0b2099b 100644
--- a/maven-polyglot/maven-polyglot-json-extension/pom.xml
+++ b/maven-polyglot/maven-polyglot-json-extension/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldung.maven.polyglotmaven-polyglot-json-extension
diff --git a/maven-polyglot/pom.xml b/maven-polyglot/pom.xml
index eb4e629a96..496ce58bf2 100644
--- a/maven-polyglot/pom.xml
+++ b/maven-polyglot/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0maven-polyglot0.0.1-SNAPSHOT
@@ -19,4 +20,4 @@
-
+
\ No newline at end of file
diff --git a/mesos-marathon/pom.xml b/mesos-marathon/pom.xml
index 42798bb209..58ca14ca93 100644
--- a/mesos-marathon/pom.xml
+++ b/mesos-marathon/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0mesos-marathonmesos-marathon
diff --git a/metrics/pom.xml b/metrics/pom.xml
index 07adf15936..2020cd28cf 100644
--- a/metrics/pom.xml
+++ b/metrics/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0metricsmetrics
@@ -37,7 +38,6 @@
javax.servlet-api${dep.ver.servlet}
-
com.netflix.servoservo-core
@@ -50,19 +50,16 @@
${netflix.servo.ver}test
-
io.micrometermicrometer-registry-atlas${micrometer.ver}
-
org.springframework.bootspring-boot-starter-web${spring-boot-starter-web.version}
-
com.fasterxml.jackson.corejackson-databind
@@ -73,13 +70,11 @@
jackson-dataformat-smile${jackson.version}
-
io.astefanutti.metrics.aspectjmetrics-aspectj-deps${metrics-aspectj.version}
-
org.assertjassertj-core
@@ -93,10 +88,10 @@
3.1.00.12.170.12.0.RELEASE
-
+
2.0.7.RELEASE3.11.11.1.0
-
+
\ No newline at end of file
diff --git a/micronaut/pom.xml b/micronaut/pom.xml
index d6df6a0347..196218d856 100644
--- a/micronaut/pom.xml
+++ b/micronaut/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.baeldung.micronautmicronaut
@@ -90,10 +91,12 @@
-
+ ${exec.mainClass}
-
+
@@ -102,12 +105,11 @@
org.codehaus.mojoexec-maven-plugin
- ${exec.plugin.version}java-classpath
-
+ ${exec.mainClass}
@@ -146,8 +148,7 @@
1.2.33.1.6.RELEASE3.7.0
- 1.6.03.1.0
-
+
\ No newline at end of file
diff --git a/microprofile/pom.xml b/microprofile/pom.xml
index 5a32ad8dba..54ed3a9930 100644
--- a/microprofile/pom.xml
+++ b/microprofile/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0microprofile1.0-SNAPSHOT
@@ -87,4 +88,4 @@
17.0.0.4
-
+
\ No newline at end of file
diff --git a/msf4j/pom.xml b/msf4j/pom.xml
index a220ce0229..99e25dbcbf 100644
--- a/msf4j/pom.xml
+++ b/msf4j/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldung.msf4jmsf4j
diff --git a/mustache/pom.xml b/mustache/pom.xml
index 9f2402f353..db72e693c1 100644
--- a/mustache/pom.xml
+++ b/mustache/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0mustachemustache
@@ -19,22 +20,18 @@
compiler${mustache.compiler.api.version}
-
org.assertjassertj-core
-
org.springframework.bootspring-boot-starter-web
-
org.springframework.bootspring-boot-starter-mustache
-
org.springframework.bootspring-boot-starter-test
diff --git a/mybatis/pom.xml b/mybatis/pom.xml
index 3b4695fb58..4cd705c917 100644
--- a/mybatis/pom.xml
+++ b/mybatis/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0mybatismybatis
diff --git a/netflix-modules/genie/pom.xml b/netflix-modules/genie/pom.xml
index 2c7c04b26b..61c0dac9ad 100644
--- a/netflix-modules/genie/pom.xml
+++ b/netflix-modules/genie/pom.xml
@@ -1,9 +1,10 @@
-4.0.0genie
- Genie
+ geniejarSample project for Netflix Genie
diff --git a/netflix-modules/mantis/pom.xml b/netflix-modules/mantis/pom.xml
index 5d9611ccdf..1f8b377b94 100644
--- a/netflix-modules/mantis/pom.xml
+++ b/netflix-modules/mantis/pom.xml
@@ -1,9 +1,10 @@
-4.0.0mantis
- Mantis
+ mantisjarSample project for Netflix Mantis
@@ -15,13 +16,10 @@
-
org.springframework.bootspring-boot-starter
- 2.1.3.RELEASE
-
io.mantisrxmantis-runtime
@@ -33,46 +31,35 @@
-
com.fasterxml.jackson.corejackson-databind
- 2.10.2
-
net.andreinc.mockneatmockneat
- 0.3.8
+ 0.4.2
-
org.projectlomboklombok
- 1.18.12
-
org.springframeworkspring-webflux
- 5.0.9.RELEASEtest
-
io.projectreactor.nettyreactor-netty
- 0.9.12.RELEASEtest
-
-
- SpringLibReleaseRepo
- https://repo.spring.io/libs-release/
+ jcenter
+ https://jcenter.bintray.com/
-
+
\ No newline at end of file
diff --git a/netflix-modules/pom.xml b/netflix-modules/pom.xml
index 538126fb34..d9660be6a1 100644
--- a/netflix-modules/pom.xml
+++ b/netflix-modules/pom.xml
@@ -1,9 +1,10 @@
-
+4.0.0netflix-modules
- Netflix Modules
+ netflix-modulespomModule for Netflix projects
diff --git a/ninja/pom.xml b/ninja/pom.xml
index 9b80dc26c8..93f22cf718 100644
--- a/ninja/pom.xml
+++ b/ninja/pom.xml
@@ -1,15 +1,12 @@
-4.0.0
-
ninjajarcom.baeldung1.0.0
-
http://www.ninjaframework.org
@@ -148,8 +145,10 @@
-
-
+
+ ninja.standalone.NinjaJetty
diff --git a/oauth2-framework-impl/oauth2-authorization-server/pom.xml b/oauth2-framework-impl/oauth2-authorization-server/pom.xml
index e608c09188..f8ced851ba 100644
--- a/oauth2-framework-impl/oauth2-authorization-server/pom.xml
+++ b/oauth2-framework-impl/oauth2-authorization-server/pom.xml
@@ -1,7 +1,7 @@
-
+4.0.0oauth2-authorization-serveroauth2-authorization-server
@@ -74,4 +74,4 @@
1.62
-
+
\ No newline at end of file
diff --git a/oauth2-framework-impl/oauth2-client/pom.xml b/oauth2-framework-impl/oauth2-client/pom.xml
index febfe8dd27..814dabc664 100644
--- a/oauth2-framework-impl/oauth2-client/pom.xml
+++ b/oauth2-framework-impl/oauth2-client/pom.xml
@@ -1,7 +1,7 @@
-
+4.0.0oauth2-clientoauth2-client
@@ -27,4 +27,4 @@
9543
-
+
\ No newline at end of file
diff --git a/oauth2-framework-impl/oauth2-resource-server/pom.xml b/oauth2-framework-impl/oauth2-resource-server/pom.xml
index 62f5889290..8f135055a2 100644
--- a/oauth2-framework-impl/oauth2-resource-server/pom.xml
+++ b/oauth2-framework-impl/oauth2-resource-server/pom.xml
@@ -1,7 +1,7 @@
-
+4.0.0oauth2-resource-serveroauth2-resource-server
@@ -39,4 +39,4 @@
1.1
-
+
\ No newline at end of file
diff --git a/oauth2-framework-impl/pom.xml b/oauth2-framework-impl/pom.xml
index 24559d3c4d..31983b08ad 100644
--- a/oauth2-framework-impl/pom.xml
+++ b/oauth2-framework-impl/pom.xml
@@ -1,7 +1,7 @@
-
+4.0.0com.baeldung.oauth2oauth2-framework-impl
@@ -95,4 +95,4 @@
1.3
-
+
\ No newline at end of file
diff --git a/open-liberty/pom.xml b/open-liberty/pom.xml
index 0e8b159043..aff951cfd8 100644
--- a/open-liberty/pom.xml
+++ b/open-liberty/pom.xml
@@ -1,9 +1,8 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
com.baeldungopen-liberty1.0-SNAPSHOT
@@ -29,7 +28,6 @@
${version.derby}provided
-
junit
@@ -87,7 +85,6 @@
maven-war-plugin${version.maven-war-plugin}
-
@@ -97,7 +94,6 @@
UTF-8UTF-8false
-
8.0.03.2
@@ -109,7 +105,6 @@
3.2.61.0.43.3.1
-
openliberty9080
diff --git a/optaplanner/pom.xml b/optaplanner/pom.xml
index d907cfc830..0e5fa9050e 100644
--- a/optaplanner/pom.xml
+++ b/optaplanner/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0optaplanneroptaplanner
diff --git a/orika/pom.xml b/orika/pom.xml
index 6974bd296e..c18bb58a51 100644
--- a/orika/pom.xml
+++ b/orika/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0orika1.0
@@ -24,4 +25,4 @@
1.5.0
-
+
\ No newline at end of file
diff --git a/osgi/osgi-intro-sample-activator/pom.xml b/osgi/osgi-intro-sample-activator/pom.xml
index e6611dcf7d..3cabba4cb1 100644
--- a/osgi/osgi-intro-sample-activator/pom.xml
+++ b/osgi/osgi-intro-sample-activator/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0osgi-intro-sample-activatorosgi-intro-sample-activator
@@ -32,19 +33,16 @@
${project.groupId}.${project.artifactId}${project.artifactId}${project.version}
-
com.baeldung.osgi.sample.activator.HelloWorld
-
-
-
+
com.baeldung.osgi.sample.activator
-
-
+
\ No newline at end of file
diff --git a/osgi/osgi-intro-sample-client/pom.xml b/osgi/osgi-intro-sample-client/pom.xml
index e91b831db1..b1b04aef78 100644
--- a/osgi/osgi-intro-sample-client/pom.xml
+++ b/osgi/osgi-intro-sample-client/pom.xml
@@ -1,7 +1,7 @@
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0osgi-intro-sample-client
diff --git a/osgi/osgi-intro-sample-service/pom.xml b/osgi/osgi-intro-sample-service/pom.xml
index b44e1f9be3..af97d1c90d 100644
--- a/osgi/osgi-intro-sample-service/pom.xml
+++ b/osgi/osgi-intro-sample-service/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0osgi-intro-sample-serviceosgi-intro-sample-service
diff --git a/osgi/pom.xml b/osgi/pom.xml
index afc980c8bd..3fa2dcdf02 100644
--- a/osgi/pom.xml
+++ b/osgi/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0osgi1.0-SNAPSHOT
diff --git a/parent-boot-1/pom.xml b/parent-boot-1/pom.xml
index 2e9c767aa2..96f4b1cbe3 100644
--- a/parent-boot-1/pom.xml
+++ b/parent-boot-1/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml
index f5bf8784a9..c67842e313 100644
--- a/parent-boot-2/pom.xml
+++ b/parent-boot-2/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
diff --git a/parent-java/pom.xml b/parent-java/pom.xml
index 9170f45bbe..c1abe79b2e 100644
--- a/parent-java/pom.xml
+++ b/parent-java/pom.xml
@@ -1,8 +1,7 @@
-
+4.0.0parent-java0.0.1-SNAPSHOT
@@ -32,18 +31,17 @@
org.openjdk.jmhjmh-core
- ${jmh.version}
+ ${jmh-core.version}org.openjdk.jmhjmh-generator-annprocess
- ${jmh.version}
+ ${jmh-generator.version}29.0-jre
- 1.192.3.72.2
diff --git a/parent-spring-4/pom.xml b/parent-spring-4/pom.xml
index 931cad374b..e0e91cec9a 100644
--- a/parent-spring-4/pom.xml
+++ b/parent-spring-4/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
diff --git a/parent-spring-5/pom.xml b/parent-spring-5/pom.xml
index 3219c504d5..6bedf9fb67 100644
--- a/parent-spring-5/pom.xml
+++ b/parent-spring-5/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -31,7 +30,7 @@
- 5.3.3
+ 5.3.75.2.3.RELEASE1.5.10.RELEASE
diff --git a/patterns/.gitignore b/patterns/.gitignore
new file mode 100644
index 0000000000..1d420f6aaf
--- /dev/null
+++ b/patterns/.gitignore
@@ -0,0 +1 @@
+/product-service/
diff --git a/patterns/clean-architecture/pom.xml b/patterns/clean-architecture/pom.xml
index 6e7de78751..c36f9b83af 100644
--- a/patterns/clean-architecture/pom.xml
+++ b/patterns/clean-architecture/pom.xml
@@ -15,10 +15,6 @@
../../parent-boot-2
-
- 1.8
-
-
com.h2database
@@ -73,7 +69,6 @@
-
@@ -84,4 +79,4 @@
-
+
\ No newline at end of file
diff --git a/patterns/cqrs-es/pom.xml b/patterns/cqrs-es/pom.xml
index 0829e35f34..826440b45d 100644
--- a/patterns/cqrs-es/pom.xml
+++ b/patterns/cqrs-es/pom.xml
@@ -5,13 +5,13 @@
cqrs-es1.0-SNAPSHOTcqrs-es
-
+
com.baeldungpatterns1.0.0-SNAPSHOT
-
+
org.projectlombok
diff --git a/patterns/design-patterns-architectural/pom.xml b/patterns/design-patterns-architectural/pom.xml
index d1945a1d0a..c917744757 100644
--- a/patterns/design-patterns-architectural/pom.xml
+++ b/patterns/design-patterns-architectural/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0design-patterns-architectural1.0
@@ -20,7 +21,6 @@
${assertj-core.version}test
-
org.hibernatehibernate-core
@@ -40,4 +40,4 @@
6.0.6
-
+
\ No newline at end of file
diff --git a/patterns/design-patterns-behavioral-2/pom.xml b/patterns/design-patterns-behavioral-2/pom.xml
index 3a6d21353e..f123a8f2f5 100644
--- a/patterns/design-patterns-behavioral-2/pom.xml
+++ b/patterns/design-patterns-behavioral-2/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0design-patterns-behavioral-21.0
@@ -26,4 +27,4 @@
3.12.2
-
+
\ No newline at end of file
diff --git a/patterns/design-patterns-behavioral/pom.xml b/patterns/design-patterns-behavioral/pom.xml
index aceaabf582..bc032a0f8f 100644
--- a/patterns/design-patterns-behavioral/pom.xml
+++ b/patterns/design-patterns-behavioral/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0design-patterns-behavioral1.0
@@ -25,12 +26,16 @@
${lombok.version}provided
+
+ com.google.code.findbugs
+ annotations
+ ${findbugs.annotations.version}
+ org.apache.commonscommons-lang3${commons-lang3.version}
-
org.assertjassertj-core
@@ -41,7 +46,8 @@
16.0.2
+ 3.0.13.9.1
-
+
\ No newline at end of file
diff --git a/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/FindBugsAnnotations.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/FindBugsAnnotations.java
index 697d5e4959..594516e3f2 100644
--- a/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/FindBugsAnnotations.java
+++ b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/FindBugsAnnotations.java
@@ -1,12 +1,12 @@
package com.baeldung.nulls;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
+import edu.umd.cs.findbugs.annotations.NonNull;
+import edu.umd.cs.findbugs.annotations.Nullable;
public class FindBugsAnnotations {
- public void accept(@NotNull Object param) {
+ public void accept(@NonNull Object param) {
System.out.println(param.toString());
}
@@ -14,7 +14,7 @@ public class FindBugsAnnotations {
System.out.println("Printing " + param);
}
- @NotNull
+ @NonNull
public Object process() throws Exception {
Object result = doSomething();
if (result == null) {
diff --git a/patterns/design-patterns-cloud/pom.xml b/patterns/design-patterns-cloud/pom.xml
index 34defb7eac..950b6efb94 100644
--- a/patterns/design-patterns-cloud/pom.xml
+++ b/patterns/design-patterns-cloud/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldungdesign-patterns-cloud
@@ -9,4 +9,4 @@
design-patterns-cloudpom
-
+
\ No newline at end of file
diff --git a/patterns/design-patterns-creational/pom.xml b/patterns/design-patterns-creational/pom.xml
index 7c2742ade4..21bc13c21c 100644
--- a/patterns/design-patterns-creational/pom.xml
+++ b/patterns/design-patterns-creational/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0design-patterns-creational1.0
@@ -25,7 +26,6 @@
jsr305${javax.annotations.version}
-
org.assertjassertj-core
@@ -40,4 +40,4 @@
3.9.1
-
+
\ No newline at end of file
diff --git a/patterns/design-patterns-functional/pom.xml b/patterns/design-patterns-functional/pom.xml
index e5166dc61e..b801781564 100644
--- a/patterns/design-patterns-functional/pom.xml
+++ b/patterns/design-patterns-functional/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0design-patterns-functional1.0
@@ -13,4 +14,4 @@
1.0.0-SNAPSHOT
-
+
\ No newline at end of file
diff --git a/patterns/design-patterns-structural/pom.xml b/patterns/design-patterns-structural/pom.xml
index c37b6845be..f0bcb824b5 100644
--- a/patterns/design-patterns-structural/pom.xml
+++ b/patterns/design-patterns-structural/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0design-patterns-structural1.0
@@ -21,4 +22,4 @@
-
+
\ No newline at end of file
diff --git a/patterns/dip/pom.xml b/patterns/dip/pom.xml
index 7217c4fdcc..44062aaede 100644
--- a/patterns/dip/pom.xml
+++ b/patterns/dip/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldung.dipdip
@@ -27,4 +27,4 @@
3.12.1
-
+
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/pom.xml b/patterns/enterprise-patterns/pom.xml
new file mode 100644
index 0000000000..21803e728e
--- /dev/null
+++ b/patterns/enterprise-patterns/pom.xml
@@ -0,0 +1,67 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ patterns
+ 1.0.0-SNAPSHOT
+
+
+ enterprise-patterns
+ pom
+
+
+ 3.7.4
+
+
+
+ wire-tap
+
+
+
+
+ org.apache.camel.springboot
+ camel-spring-boot-starter
+
+
+ org.apache.camel.springboot
+ camel-activemq-starter
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ 2.2.2.RELEASE
+ test
+
+
+ org.apache.camel
+ camel-test-spring-junit5
+ test
+
+
+
+
+
+
+ org.apache.camel.springboot
+ camel-spring-boot-dependencies
+ ${camel.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/patterns/enterprise-patterns/wire-tap/README.md b/patterns/enterprise-patterns/wire-tap/README.md
new file mode 100644
index 0000000000..5f2aaf0d5a
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/README.md
@@ -0,0 +1,34 @@
+# Wire Tap Pattern
+
+The application shows you how to use a Wire Tap to monitor, debug or troubleshoot messages flowing through the system, without permanently consuming them off, or making any changes to the expected message in the output channel.
+
+This example shows how to implement this with a simple Apache Camel application using Spring Boot and Apache ActiveMq.
+For convenience, we are using in-memory activeMq.
+
+
+
+### Configuring and using the Connection Factory
+
+1. Create CamelContext.
+2. Connect to embedded (or remote) ActiveMQ JMS broker.
+3. Add JMS queue to CamelContext.
+4. Load file orders (xml/csv) from src/data into the JMS queue.
+5. Based on the extension of the incoming file message, route to the respective queues.
+6. Test that the destination route is working.
+7. Audit the received file (order) from the wire tap queue.
+
+### How to run the example:
+
+ mvn spring-boot:run
+
+
+The Wire Tap processor, by default, makes a shallow copy of the Camel Exchange instance. The copy of the exchange is sent to the endpoint specified in the wireTap statement. The body of the wire tapped message contains the same object as that in the original message which means any change to the internal state of that object during the wire tap route may also end up changing the main message’s body.
+
+To solve this, we need to create a deep copy of the object before passing it to the wire tap destination. Wire Tap EIP provides us with a mechanism to perform a “deep” copy of the message, by implementing the org.apache.camel.Processor class. This needs to be be called using onPrepare statement right after wireTap.
+For more details, check out the AmqApplicationUnitTest.class.
+
+### Relevant Articles:
+
+- [Wire tap (Enterprise Integration Pattern)](https://drafts.baeldung.com/?p=103346&preview=true)
+- [Intro to Apache camel](https://www.baeldung.com/apache-camel-intro)
+
diff --git a/patterns/enterprise-patterns/wire-tap/pom.xml b/patterns/enterprise-patterns/wire-tap/pom.xml
new file mode 100644
index 0000000000..1b1aa746d5
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/pom.xml
@@ -0,0 +1,25 @@
+
+
+ 4.0.0
+ wire-tap
+ 1.0
+ jar
+
+
+ enterprise-patterns
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/patterns/enterprise-patterns/wire-tap/src/data/.camel/msg1.xml b/patterns/enterprise-patterns/wire-tap/src/data/.camel/msg1.xml
new file mode 100644
index 0000000000..0a6fa64552
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/src/data/.camel/msg1.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/src/data/msg.xml b/patterns/enterprise-patterns/wire-tap/src/data/msg.xml
new file mode 100644
index 0000000000..0a6fa64552
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/src/data/msg.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/AmqApplication.java b/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/AmqApplication.java
new file mode 100644
index 0000000000..eacef86d75
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/AmqApplication.java
@@ -0,0 +1,70 @@
+package com.baeldung;
+
+import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.camel.CamelContext;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jms.JmsComponent;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class AmqApplication {
+
+ public static void main(String[] args) throws Exception {
+ SpringApplication.run(AmqApplication.class, args);
+
+ try (CamelContext context = new DefaultCamelContext()) {
+ ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
+ "vm://localhost?broker.persistent=false");
+ connectionFactory.setTrustAllPackages(true);
+ context.addComponent("direct", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
+ addRoute(context);
+
+ try (ProducerTemplate template = context.createProducerTemplate()) {
+ context.start();
+
+ MyPayload payload = new MyPayload("One");
+ template.sendBody("direct:source", payload);
+ Thread.sleep(10000);
+ } finally {
+ context.stop();
+ }
+ }
+ }
+
+ private static void addRoute(CamelContext context) throws Exception {
+ context.addRoutes(newExchangeRoute());
+ }
+
+ static RoutesBuilder traditionalWireTapRoute() {
+ return new RouteBuilder() {
+ public void configure() {
+
+ from("direct:source").log("Main route: Send '${body}' to tap router").wireTap("direct:tap").delay(1000)
+ .log("Main route: Add 'two' to '${body}'").bean(MyBean.class, "addTwo").to("direct:destination")
+ .log("Main route: Output '${body}'");
+
+ from("direct:tap").log("Tap Wire route: received '${body}'")
+ .log("Tap Wire route: Add 'three' to '${body}'").bean(MyBean.class, "addThree")
+ .log("Tap Wire route: Output '${body}'");
+
+ from("direct:destination").log("Output at destination: '${body}'");
+ }
+ };
+ }
+
+ static RoutesBuilder newExchangeRoute() throws Exception {
+ return new RouteBuilder() {
+ public void configure() throws Exception {
+
+ from("direct:source").wireTap("direct:tap").onPrepare(new MyPayloadClonePrepare()).end().delay(1000);
+
+ from("direct:tap").bean(MyBean.class, "addThree");
+ }
+ };
+ }
+
+}
diff --git a/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyBean.java b/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyBean.java
new file mode 100644
index 0000000000..62c45725b0
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyBean.java
@@ -0,0 +1,14 @@
+package com.baeldung;
+
+public class MyBean {
+
+ public MyPayload addTwo(MyPayload body) {
+ body.setValue(body.getValue() + " and two");
+ return body;
+ }
+
+ public MyPayload addThree(MyPayload body) {
+ body.setValue(body.getValue() + " and three");
+ return body;
+ }
+}
diff --git a/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyPayload.java b/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyPayload.java
new file mode 100644
index 0000000000..84d6a22733
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyPayload.java
@@ -0,0 +1,31 @@
+package com.baeldung;
+
+import java.io.Serializable;
+
+public class MyPayload implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+ private String value;
+
+ public MyPayload(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ public String toString() {
+ return value;
+ }
+
+ public MyPayload deepClone() {
+ MyPayload myPayload = new MyPayload(value);
+ return myPayload;
+ }
+
+}
diff --git a/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyPayloadClonePrepare.java b/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyPayloadClonePrepare.java
new file mode 100644
index 0000000000..938194bc1a
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyPayloadClonePrepare.java
@@ -0,0 +1,15 @@
+package com.baeldung;
+
+import java.util.Date;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+
+public class MyPayloadClonePrepare implements Processor {
+
+ public void process(Exchange exchange) throws Exception {
+ MyPayload myPayload = exchange.getIn().getBody(MyPayload.class);
+ exchange.getIn().setBody(myPayload.deepClone());
+ exchange.getIn().setHeader("date", new Date());
+ }
+}
diff --git a/patterns/enterprise-patterns/wire-tap/src/main/resources/application.properties b/patterns/enterprise-patterns/wire-tap/src/main/resources/application.properties
new file mode 100644
index 0000000000..a74f494fa5
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/src/main/resources/application.properties
@@ -0,0 +1,9 @@
+# to keep the JVM running
+camel.springboot.main-run-controller = true
+
+#configure the URL of the remote ActiveMQ broker
+#camel.component.activemq.broker-url=tcp://localhost:61616
+#spring.activemq.broker-url=tcp://localhost:61616
+
+spring.activemq.in-memory=true
+spring.activemq.pool.enabled=false
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/src/main/resources/log4j.properties b/patterns/enterprise-patterns/wire-tap/src/main/resources/log4j.properties
new file mode 100644
index 0000000000..28aa51259a
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/src/main/resources/log4j.properties
@@ -0,0 +1,16 @@
+# Root logger option
+log4j.rootLogger=INFO, file, console
+
+log4j.logger.com.javarticles=INFO, file
+
+# Direct log messages to a log file
+log4j.appender.file=org.apache.log4j.FileAppender
+log4j.appender.file.File=javarticles.log
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d | %p | %F %L | %m%n
+
+# Direct log messages to stdout
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.Target=System.out
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+log4j.appender.console.layout.ConversionPattern=%d{HH:mm}| %p | %F %L | %m%n
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-10-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-10-1-1-1
new file mode 100644
index 0000000000..25b70e3283
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-10-1-1-1
@@ -0,0 +1 @@
+Test Message: 8
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-11-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-11-1-1-1
new file mode 100644
index 0000000000..3948af158c
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-11-1-1-1
@@ -0,0 +1 @@
+Test Message: 9
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-2-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-2-1-1-1
new file mode 100644
index 0000000000..262fbf6de5
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-2-1-1-1
@@ -0,0 +1 @@
+Test Message: 0
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-3-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-3-1-1-1
new file mode 100644
index 0000000000..64a5c33134
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-3-1-1-1
@@ -0,0 +1 @@
+Test Message: 1
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-4-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-4-1-1-1
new file mode 100644
index 0000000000..de22e70d38
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-4-1-1-1
@@ -0,0 +1 @@
+Test Message: 2
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-5-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-5-1-1-1
new file mode 100644
index 0000000000..d400e1afeb
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-5-1-1-1
@@ -0,0 +1 @@
+Test Message: 3
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-6-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-6-1-1-1
new file mode 100644
index 0000000000..660c960fcb
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-6-1-1-1
@@ -0,0 +1 @@
+Test Message: 4
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-7-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-7-1-1-1
new file mode 100644
index 0000000000..c97f21578a
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-7-1-1-1
@@ -0,0 +1 @@
+Test Message: 5
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-8-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-8-1-1-1
new file mode 100644
index 0000000000..be38d662ff
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-8-1-1-1
@@ -0,0 +1 @@
+Test Message: 6
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-9-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-9-1-1-1
new file mode 100644
index 0000000000..518e4227fc
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-9-1-1-1
@@ -0,0 +1 @@
+Test Message: 7
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-10-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-10-1-1-1
new file mode 100644
index 0000000000..25b70e3283
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-10-1-1-1
@@ -0,0 +1 @@
+Test Message: 8
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-11-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-11-1-1-1
new file mode 100644
index 0000000000..3948af158c
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-11-1-1-1
@@ -0,0 +1 @@
+Test Message: 9
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-2-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-2-1-1-1
new file mode 100644
index 0000000000..262fbf6de5
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-2-1-1-1
@@ -0,0 +1 @@
+Test Message: 0
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-3-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-3-1-1-1
new file mode 100644
index 0000000000..64a5c33134
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-3-1-1-1
@@ -0,0 +1 @@
+Test Message: 1
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-4-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-4-1-1-1
new file mode 100644
index 0000000000..de22e70d38
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-4-1-1-1
@@ -0,0 +1 @@
+Test Message: 2
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-5-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-5-1-1-1
new file mode 100644
index 0000000000..d400e1afeb
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-5-1-1-1
@@ -0,0 +1 @@
+Test Message: 3
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-6-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-6-1-1-1
new file mode 100644
index 0000000000..660c960fcb
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-6-1-1-1
@@ -0,0 +1 @@
+Test Message: 4
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-7-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-7-1-1-1
new file mode 100644
index 0000000000..c97f21578a
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-7-1-1-1
@@ -0,0 +1 @@
+Test Message: 5
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-8-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-8-1-1-1
new file mode 100644
index 0000000000..be38d662ff
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-8-1-1-1
@@ -0,0 +1 @@
+Test Message: 6
\ No newline at end of file
diff --git a/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-9-1-1-1 b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-9-1-1-1
new file mode 100644
index 0000000000..518e4227fc
--- /dev/null
+++ b/patterns/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-9-1-1-1
@@ -0,0 +1 @@
+Test Message: 7
\ No newline at end of file
diff --git a/patterns/front-controller/pom.xml b/patterns/front-controller/pom.xml
index dc10250946..d25bd774c6 100644
--- a/patterns/front-controller/pom.xml
+++ b/patterns/front-controller/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0front-controllerfront-controller
@@ -36,5 +37,5 @@
-
-
+
+
\ No newline at end of file
diff --git a/patterns/hexagonal-architecture/pom.xml b/patterns/hexagonal-architecture/pom.xml
index 62f55c2efa..f8d4524514 100644
--- a/patterns/hexagonal-architecture/pom.xml
+++ b/patterns/hexagonal-architecture/pom.xml
@@ -1,12 +1,13 @@
-
- 4.0.0
- com.baeldung
- hexagonal-architecture
- 1.0
- hexagonal-architecture
- Project for hexagonal architecture in java
+
+ 4.0.0
+ com.baeldung
+ hexagonal-architecture
+ 1.0
+ hexagonal-architecture
+ Project for hexagonal architecture in javacom.baeldung
@@ -15,46 +16,41 @@
../../parent-boot-2
-
- 1.8
-
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
-
-
- 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-starter-data-mongodb
-
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
-
- 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
-
-
-
-
-
+
\ No newline at end of file
diff --git a/patterns/intercepting-filter/pom.xml b/patterns/intercepting-filter/pom.xml
index 7f2f57b5e1..ffc3309ddb 100644
--- a/patterns/intercepting-filter/pom.xml
+++ b/patterns/intercepting-filter/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0intercepting-filterintercepting-filter
@@ -45,4 +46,4 @@
-
+
\ No newline at end of file
diff --git a/patterns/pom.xml b/patterns/pom.xml
index 112eecb606..6e92ad2813 100644
--- a/patterns/pom.xml
+++ b/patterns/pom.xml
@@ -1,15 +1,18 @@
-
+4.0.0patternspatternspom
+
com.baeldungparent-modules1.0.0-SNAPSHOT
+
design-patterns-architecturaldesign-patterns-behavioral
@@ -25,7 +28,9 @@
intercepting-filtersolidclean-architecture
+ enterprise-patterns
+
@@ -36,6 +41,7 @@
+
@@ -52,7 +58,9 @@
+
9.4.0.v20161208
+
\ No newline at end of file
diff --git a/patterns/solid/pom.xml b/patterns/solid/pom.xml
index ad76ea89fd..76ab54cbb2 100644
--- a/patterns/solid/pom.xml
+++ b/patterns/solid/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0solid1.0-SNAPSHOT
@@ -13,4 +13,4 @@
1.0.0-SNAPSHOT
-
+
\ No newline at end of file
diff --git a/pdf/pom.xml b/pdf/pom.xml
index 7d7754ee73..fb9508156e 100644
--- a/pdf/pom.xml
+++ b/pdf/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0pdfpdf
@@ -94,4 +95,4 @@
9.1.20
-
+
\ No newline at end of file
diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml
index fb3f82df38..8d402865ef 100644
--- a/performance-tests/pom.xml
+++ b/performance-tests/pom.xml
@@ -1,5 +1,6 @@
-
+4.0.0performance-tests1.0
@@ -22,13 +23,12 @@
com.github.dozermapperdozer-core${dozer.version}
-
+
org.mapstructmapstruct${mapstruct.version}
-
org.modelmappermodelmapper
@@ -42,17 +42,16 @@
org.openjdk.jmhjmh-core
- ${jmh.version}
+ ${jmh-core.version}org.openjdk.jmhjmh-generator-annprocess
- ${jmh.version}
+ ${jmh-generator.version}provided
-
@@ -67,7 +66,7 @@
org.openjdk.jmhjmh-generator-annprocess
- ${jmh.version}
+ ${jmh-generator.version}org.mapstruct
@@ -90,16 +89,14 @@
${uberjar.name}
-
+ org.openjdk.jmh.Main
-
+
*:*META-INF/*.SF
@@ -147,33 +144,19 @@
maven-source-plugin${source.plugin.version}
-
- maven-surefire-plugin
- ${surefire.plugin.version}
-
-
- 1.231.5.46.5.01.3.1.Final2.3.8
- 1.6.1.CR2
-
-
+ 1.6.1.CR2
+
1.8
-
-
+
benchmarks3.1.03.0.0-M1
@@ -185,7 +168,6 @@
3.1.03.9.13.2.1
- 2.17
-
+
\ No newline at end of file
diff --git a/persistence-modules/activejdbc/pom.xml b/persistence-modules/activejdbc/pom.xml
index 84ce1c2b48..5fdf27a679 100644
--- a/persistence-modules/activejdbc/pom.xml
+++ b/persistence-modules/activejdbc/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0activejdbc1.0-SNAPSHOT
diff --git a/persistence-modules/apache-bookkeeper/pom.xml b/persistence-modules/apache-bookkeeper/pom.xml
index 32467b9997..2d86e3a912 100644
--- a/persistence-modules/apache-bookkeeper/pom.xml
+++ b/persistence-modules/apache-bookkeeper/pom.xml
@@ -2,7 +2,6 @@
-
4.0.0apache-bookkeeper0.0.1-SNAPSHOT
@@ -27,20 +26,17 @@
-
org.testcontainerstestcontainers
- 1.14.3
+ ${testcontainers.version}test
-
4.10.0
+ 1.14.3
-
-
-
+
\ No newline at end of file
diff --git a/persistence-modules/apache-cayenne/pom.xml b/persistence-modules/apache-cayenne/pom.xml
index d728e18b33..87bf6fe30b 100644
--- a/persistence-modules/apache-cayenne/pom.xml
+++ b/persistence-modules/apache-cayenne/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0apache-cayenne0.0.1-SNAPSHOT
@@ -43,4 +44,4 @@
4.0.M5
-
+
\ No newline at end of file
diff --git a/persistence-modules/core-java-persistence-2/README.md b/persistence-modules/core-java-persistence-2/README.md
index 36c33cc6e1..365e9e7256 100644
--- a/persistence-modules/core-java-persistence-2/README.md
+++ b/persistence-modules/core-java-persistence-2/README.md
@@ -2,3 +2,5 @@
- [Getting Database URL From JDBC Connection Object](https://www.baeldung.com/jdbc-get-url-from-connection)
- [JDBC URL Format For Different Databases](https://www.baeldung.com/java-jdbc-url-format)
+- [How to Check if a Database Table Exists with JDBC](https://www.baeldung.com/jdbc-check-table-exists)
+- [Inserting Null Into an Integer Column Using JDBC](https://www.baeldung.com/jdbc-insert-null-into-integer-column)
diff --git a/persistence-modules/core-java-persistence-2/pom.xml b/persistence-modules/core-java-persistence-2/pom.xml
index a1088b0801..15676bf03e 100644
--- a/persistence-modules/core-java-persistence-2/pom.xml
+++ b/persistence-modules/core-java-persistence-2/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.baeldung.core-java-persistence-2core-java-persistence-2
@@ -31,32 +32,22 @@
mysql-connector-java${mysql.driver.version}
-
+
com.microsoft.sqlservermssql-jdbc${mssql.driver.version}
-
1.4.200
- 42.2.5.jre78.4.1.jre1110.2.0.4.08.0.22
-
+
\ No newline at end of file
diff --git a/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/insertnull/DBConfig.java b/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/insertnull/DBConfig.java
new file mode 100644
index 0000000000..3907434239
--- /dev/null
+++ b/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/insertnull/DBConfig.java
@@ -0,0 +1,26 @@
+package com.baeldung.insertnull;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+public class DBConfig {
+
+ private static Connection INSTANCE;
+
+ public static Connection getConnection() throws SQLException {
+ if (INSTANCE == null) {
+ INSTANCE = DriverManager.getConnection("jdbc:h2:mem:insertnull", "user", "password");
+ createPersonTable();
+ }
+ return INSTANCE;
+ }
+
+ private static void createPersonTable() throws SQLException {
+ try(Statement statement = INSTANCE.createStatement()) {
+ String sql = "CREATE TABLE Person (id INTEGER not null, name VARCHAR(50), lastName VARCHAR(50), age INTEGER, PRIMARY KEY (id))";
+ statement.executeUpdate(sql);
+ }
+ }
+}
diff --git a/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/insertnull/Person.java b/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/insertnull/Person.java
new file mode 100644
index 0000000000..e261a7d74c
--- /dev/null
+++ b/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/insertnull/Person.java
@@ -0,0 +1,48 @@
+package com.baeldung.insertnull;
+
+public class Person {
+
+ private Integer id;
+ private String name;
+ private String lastName;
+ private Integer age;
+
+ public Person(Integer id, String name, String lastName, Integer age) {
+ this.id = id;
+ this.name = name;
+ this.lastName = lastName;
+ this.age = age;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public Integer getAge() {
+ return age;
+ }
+
+ public void setAge(Integer age) {
+ this.age = age;
+ }
+}
diff --git a/persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/insertnull/InsertNullUnitTest.java b/persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/insertnull/InsertNullUnitTest.java
new file mode 100644
index 0000000000..508fa98e8f
--- /dev/null
+++ b/persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/insertnull/InsertNullUnitTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.insertnull;
+
+import org.junit.jupiter.api.Test;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.sql.Types;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class InsertNullUnitTest {
+
+ private final String SQL = "INSERT INTO Person VALUES(?,?,?,?)";
+
+ @Test
+ public void givenNewPerson_whenSetNullIsUsed_thenNewRecordIsCreated() throws SQLException {
+ Person person = new Person(1, "John", "Doe", null);
+
+ try (PreparedStatement preparedStatement = DBConfig.getConnection().prepareStatement(SQL)) {
+ preparedStatement.setInt(1, person.getId());
+ preparedStatement.setString(2, person.getName());
+ preparedStatement.setString(3, person.getLastName());
+ if (person.getAge() == null) {
+ preparedStatement.setNull(4, Types.INTEGER);
+ }
+ else {
+ preparedStatement.setInt(4, person.getAge());
+ }
+ int noOfRows = preparedStatement.executeUpdate();
+
+ assertThat(noOfRows, equalTo(1));
+ }
+ }
+
+ @Test
+ public void givenNewPerson_whenSetObjectIsUsed_thenNewRecordIsCreated() throws SQLException {
+ Person person = new Person(2, "John", "Doe", null);
+
+ try (PreparedStatement preparedStatement = DBConfig.getConnection().prepareStatement(SQL)) {
+ preparedStatement.setInt(1, person.getId());
+ preparedStatement.setString(2, person.getName());
+ preparedStatement.setString(3, person.getLastName());
+ preparedStatement.setObject(4, person.getAge(), Types.INTEGER);
+ int noOfRows = preparedStatement.executeUpdate();
+
+ assertThat(noOfRows, equalTo(1));
+ }
+ }
+}
diff --git a/persistence-modules/core-java-persistence/pom.xml b/persistence-modules/core-java-persistence/pom.xml
index 3dd8da1b7a..96f8cef310 100644
--- a/persistence-modules/core-java-persistence/pom.xml
+++ b/persistence-modules/core-java-persistence/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.baeldung.core-java-persistencecore-java-persistence
@@ -61,7 +62,6 @@
1.4.200
- 42.2.5.jre73.10.02.4.03.2.0
diff --git a/persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/C3poDataSource.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/C3p0DataSource.java
similarity index 91%
rename from persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/C3poDataSource.java
rename to persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/C3p0DataSource.java
index 78642459d5..431427d332 100644
--- a/persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/C3poDataSource.java
+++ b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/C3p0DataSource.java
@@ -5,7 +5,7 @@ import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
-public class C3poDataSource {
+public class C3p0DataSource {
private static final ComboPooledDataSource cpds = new ComboPooledDataSource();
@@ -24,5 +24,5 @@ public class C3poDataSource {
return cpds.getConnection();
}
- private C3poDataSource(){}
+ private C3p0DataSource(){}
}
\ No newline at end of file
diff --git a/persistence-modules/core-java-persistence/src/test/java/com/baeldung/connectionpool/C3p0DataSourceUnitTest.java b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/connectionpool/C3p0DataSourceUnitTest.java
new file mode 100644
index 0000000000..1095214e24
--- /dev/null
+++ b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/connectionpool/C3p0DataSourceUnitTest.java
@@ -0,0 +1,13 @@
+package com.baeldung.connectionpool;
+
+import java.sql.SQLException;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+
+public class C3p0DataSourceUnitTest {
+
+ @Test
+ public void givenC3p0DataSourceClass_whenCallGetConnection_thenCorrect() throws SQLException {
+ assertTrue(C3p0DataSource.getConnection().isValid(1));
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/core-java-persistence/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java
deleted file mode 100644
index acad9fe5e4..0000000000
--- a/persistence-modules/core-java-persistence/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.baeldung.connectionpool;
-
-import java.sql.SQLException;
-import static org.junit.Assert.assertTrue;
-import org.junit.Test;
-
-public class C3poDataSourceUnitTest {
-
- @Test
- public void givenC3poDataSourceClass_whenCalledgetConnection_thenCorrect() throws SQLException {
- assertTrue(C3poDataSource.getConnection().isValid(1));
- }
-}
\ No newline at end of file
diff --git a/persistence-modules/deltaspike/pom.xml b/persistence-modules/deltaspike/pom.xml
index 955ad4abe8..af02ba76c0 100644
--- a/persistence-modules/deltaspike/pom.xml
+++ b/persistence-modules/deltaspike/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0deltaspike1.0
@@ -16,44 +17,39 @@
-
-
-
+
javax.enterprisecdi-apiprovided
-
-
+
org.jboss.spec.javax.annotationjboss-annotations-api_1.2_specprovided
-
org.jboss.resteasyjaxrs-apiprovided
-
org.hibernate.javax.persistencehibernate-jpa-2.1-apiprovided
-
org.jboss.spec.javax.ejbjboss-ejb-api_3.2_specprovided
-
@@ -68,62 +64,54 @@
-
org.jboss.spec.javax.facesjboss-jsf-api_2.2_specprovided
-
-
org.hibernatehibernate-jpamodelgenprovided
-
-
+
org.hibernatehibernate-validator-annotation-processorprovided
-
-
+
org.jboss.arquillian.junitarquillian-junit-containertest
-
org.jboss.arquillian.protocolarquillian-protocol-servlettest
-
org.jboss.shrinkwrap.resolvershrinkwrap-resolver-impl-maventest
-
org.apache.deltaspike.modulesdeltaspike-data-module-apicompile
-
org.apache.deltaspike.modulesdeltaspike-data-module-implruntime
-
com.mysema.querydsl
@@ -131,74 +119,64 @@
${querydsl.version}provided
-
com.mysema.querydslquerydsl-jpa${querydsl.version}
-
org.apache.deltaspike.modulesdeltaspike-test-control-module-apitest
-
org.apache.deltaspike.modulesdeltaspike-test-control-module-impltest
-
org.apache.deltaspike.cdictrldeltaspike-cdictrl-weldtest
-
org.jboss.weld.seweld-se-core${weld.version}test
-
org.hibernatehibernate-coreprovided
-
org.jbossjandex${jandex.version}
-
com.h2databaseh2${h2.version}test
-
org.hibernatehibernate-entitymanagerprovided
-
org.apache.commonscommons-lang3${commons-lang3.version}
-
-
+
${project.artifactId}
@@ -237,9 +215,9 @@
-
-
+
arq-wildfly-managed
@@ -259,6 +237,7 @@
http://www.apache.org/licenses/LICENSE-2.0.html
+
redhat-repository-techpreview
@@ -268,10 +247,12 @@
-
+
org.wildfly.bomjboss-javaee-7.0-with-tools
@@ -310,4 +291,4 @@
1.2.5.Final-redhat-1
-
+
\ No newline at end of file
diff --git a/persistence-modules/elasticsearch/pom.xml b/persistence-modules/elasticsearch/pom.xml
index 654d43d622..f04cb3973f 100644
--- a/persistence-modules/elasticsearch/pom.xml
+++ b/persistence-modules/elasticsearch/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0elasticsearch0.0.1-SNAPSHOT
@@ -29,5 +30,5 @@
6.3.1
-
-
+
+
\ No newline at end of file
diff --git a/persistence-modules/flyway-repair/pom.xml b/persistence-modules/flyway-repair/pom.xml
index 2c283cfc04..1a5384a916 100644
--- a/persistence-modules/flyway-repair/pom.xml
+++ b/persistence-modules/flyway-repair/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0flyway-repairflyway-repair
@@ -39,7 +40,6 @@
-
h2
@@ -56,7 +56,6 @@
-
postgres
@@ -70,12 +69,10 @@
-
src/main/resources/application-${spring-boot.run.profiles}.properties
-
-
+
\ No newline at end of file
diff --git a/persistence-modules/flyway/pom.xml b/persistence-modules/flyway/pom.xml
index c4a3363bdc..65534b6f0a 100644
--- a/persistence-modules/flyway/pom.xml
+++ b/persistence-modules/flyway/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0flywayflyway
@@ -65,7 +66,6 @@
5.2.35.0.2
-
-
+
\ No newline at end of file
diff --git a/persistence-modules/hbase/pom.xml b/persistence-modules/hbase/pom.xml
index f54f2d8985..e38b73e137 100644
--- a/persistence-modules/hbase/pom.xml
+++ b/persistence-modules/hbase/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0hbasehbase
diff --git a/persistence-modules/hibernate-annotations/README.md b/persistence-modules/hibernate-annotations/README.md
index 393cf82bfd..7d7740a069 100644
--- a/persistence-modules/hibernate-annotations/README.md
+++ b/persistence-modules/hibernate-annotations/README.md
@@ -8,3 +8,4 @@ This module contains articles about Annotations used in Hibernate.
- [Difference Between @JoinColumn and mappedBy](https://www.baeldung.com/jpa-joincolumn-vs-mappedby)
- [Hibernate One to Many Annotation Tutorial](https://www.baeldung.com/hibernate-one-to-many)
- [Hibernate @WhereJoinTable Annotation](https://www.baeldung.com/hibernate-wherejointable)
+- [Usage of the Hibernate @LazyCollection Annotation](https://www.baeldung.com/hibernate-lazycollection)
diff --git a/persistence-modules/hibernate-annotations/pom.xml b/persistence-modules/hibernate-annotations/pom.xml
index d3b786d6c8..e5c19915a4 100644
--- a/persistence-modules/hibernate-annotations/pom.xml
+++ b/persistence-modules/hibernate-annotations/pom.xml
@@ -1,5 +1,6 @@
-4.0.0hibernate-annotations
@@ -20,32 +21,28 @@
hibernate-core${hibernate-core.version}
-
com.h2databaseh2${h2.version}
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
-
org.hibernatehibernate-testing${hibernate-core.version}
-
org.hibernatehibernate-spatial${hibernate-core.version}
-
+
5.4.7.Final1.4.200
@@ -55,4 +52,4 @@
1.4.200
-
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Branch.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Branch.java
new file mode 100644
index 0000000000..de88647546
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Branch.java
@@ -0,0 +1,103 @@
+package com.baeldung.hibernate.lazycollection.model;
+
+import org.hibernate.annotations.LazyCollection;
+import org.hibernate.annotations.LazyCollectionOption;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OrderColumn;
+import javax.persistence.OneToMany;
+import javax.persistence.Entity;
+import java.util.ArrayList;
+import java.util.List;
+
+@Entity
+public class Branch {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ private String name;
+
+ public Branch() {
+ }
+ public Branch(String name) {
+ this.name = name;
+ }
+
+ @OneToMany(mappedBy = "mainBranch")
+ @LazyCollection(LazyCollectionOption.TRUE)
+ private List mainEmployees;
+
+ @OneToMany(mappedBy = "subBranch")
+ @LazyCollection(LazyCollectionOption.FALSE)
+ private List subEmployees;
+
+ @OneToMany(mappedBy = "additionalBranch")
+ @LazyCollection(LazyCollectionOption.EXTRA)
+ @OrderColumn(name = "order_id")
+ private List additionalEmployees;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public List getMainEmployees() {
+ return mainEmployees;
+ }
+
+ public void setMainEmployees(List mainEmployees) {
+ this.mainEmployees = mainEmployees;
+ }
+
+ public List getSubEmployees() {
+ return subEmployees;
+ }
+
+ public void setSubEmployees(List subEmployees) {
+ this.subEmployees = subEmployees;
+ }
+
+ public List getAdditionalEmployees() {
+ return additionalEmployees;
+ }
+
+ public void setAdditionalEmployees(List additionalEmployees) {
+ this.additionalEmployees = additionalEmployees;
+ }
+
+ public void addMainEmployee(Employee employee) {
+ if (this.mainEmployees == null) {
+ this.mainEmployees = new ArrayList<>();
+ }
+ this.mainEmployees.add(employee);
+ }
+
+ public void addSubEmployee(Employee employee) {
+ if (this.subEmployees == null) {
+ this.subEmployees = new ArrayList<>();
+ }
+ this.subEmployees.add(employee);
+ }
+
+ public void addAdditionalEmployee(Employee employee) {
+ if (this.additionalEmployees == null) {
+ this.additionalEmployees = new ArrayList<>();
+ }
+ this.additionalEmployees.add(employee);
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Employee.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Employee.java
new file mode 100644
index 0000000000..831518a365
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Employee.java
@@ -0,0 +1,88 @@
+package com.baeldung.hibernate.lazycollection.model;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OrderColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Entity;
+
+@Entity
+public class Employee {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ private String name;
+
+ private String address;
+
+ public Employee() {
+
+ }
+
+ public Employee(String name, Branch mainBranch, Branch subBranch, Branch additionalBranch) {
+ this.name = name;
+ this.mainBranch = mainBranch;
+ this.subBranch = subBranch;
+ this.additionalBranch = additionalBranch;
+ }
+
+ @ManyToOne
+ private Branch mainBranch;
+
+ @ManyToOne
+ private Branch subBranch;
+
+ @ManyToOne
+ private Branch additionalBranch;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public Branch getMainBranch() {
+ return mainBranch;
+ }
+
+ public void setMainBranch(Branch mainBranch) {
+ this.mainBranch = mainBranch;
+ }
+
+ public Branch getSubBranch() {
+ return subBranch;
+ }
+
+ public void setSubBranch(Branch subBranch) {
+ this.subBranch = subBranch;
+ }
+
+ public Branch getAdditionalBranch() {
+ return additionalBranch;
+ }
+
+ public void setAdditionalBranch(Branch additionalBranch) {
+ this.additionalBranch = additionalBranch;
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/lazycollection/LazyCollectionIntegrationTest.java b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/lazycollection/LazyCollectionIntegrationTest.java
new file mode 100644
index 0000000000..97888471a4
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/lazycollection/LazyCollectionIntegrationTest.java
@@ -0,0 +1,104 @@
+package com.baeldung.hibernate.lazycollection;
+
+import com.baeldung.hibernate.lazycollection.model.Branch;
+import com.baeldung.hibernate.lazycollection.model.Employee;
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.dialect.H2Dialect;
+import org.hibernate.service.ServiceRegistry;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import javax.annotation.PostConstruct;
+
+public class LazyCollectionIntegrationTest {
+
+ private static SessionFactory sessionFactory;
+
+ private Session session;
+
+ Branch branch;
+
+ @BeforeClass
+ public static void beforeTests() {
+ Configuration configuration = new Configuration().addAnnotatedClass(Branch.class)
+ .addAnnotatedClass(Employee.class).setProperty("hibernate.dialect", H2Dialect.class.getName())
+ .setProperty("hibernate.connection.driver_class", org.h2.Driver.class.getName())
+ .setProperty("hibernate.connection.url", "jdbc:h2:mem:test")
+ .setProperty("hibernate.connection.username", "sa").setProperty("hibernate.connection.password", "")
+ .setProperty("hibernate.hbm2ddl.auto", "update");
+
+ ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
+ .applySettings(configuration.getProperties()).build();
+
+ sessionFactory = configuration.buildSessionFactory(serviceRegistry);
+
+ }
+
+ @Before
+ public void setUp() {
+ session = sessionFactory.openSession();
+ session.beginTransaction();
+
+ branch = new Branch("Main Branch");
+
+ session.save(branch);
+
+ Employee mainEmployee1 = new Employee("main employee 1", branch, null, null);
+ Employee mainEmployee2 = new Employee("main employee 2", branch, null, null);
+ Employee mainEmployee3 = new Employee("main employee 3", branch, null, null);
+
+ session.save(mainEmployee1);
+ session.save(mainEmployee2);
+ session.save(mainEmployee3);
+
+ Employee subEmployee1 = new Employee("sub employee 1", null, branch, null);
+ Employee subEmployee2 = new Employee("sub employee 2", null, branch, null);
+ Employee subEmployee3 = new Employee("sub employee 3", null, branch, null);
+
+ session.save(subEmployee1);
+ session.save(subEmployee2);
+ session.save(subEmployee3);
+
+ Employee additionalEmployee1 = new Employee("additional employee 1", null, null, branch);
+ Employee additionalEmployee2 = new Employee("additional employee 2", null, null, branch);
+ Employee additionalEmployee3 = new Employee("additional employee 3", null, null, branch);
+
+ session.save(additionalEmployee1);
+ session.save(additionalEmployee2);
+ session.save(additionalEmployee3);
+
+ session.flush();
+ session.refresh(branch);
+ session.getTransaction().commit();
+ session.close();
+ }
+
+ @Test
+ public void testLazyFetching() {
+ Assert.assertFalse(Hibernate.isInitialized(branch.getMainEmployees()));
+ }
+
+ @Test
+ public void testEagerFetching() {
+ Assert.assertTrue(Hibernate.isInitialized(branch.getSubEmployees()));
+ }
+
+ @Test
+ public void testExtraFetching() {
+ Assert.assertFalse(Hibernate.isInitialized(branch.getAdditionalEmployees()));
+ }
+
+ @AfterClass
+ public static void afterTests() {
+ sessionFactory.close();
+ }
+}
diff --git a/persistence-modules/hibernate-enterprise/pom.xml b/persistence-modules/hibernate-enterprise/pom.xml
index c088cc1eca..dadfa211be 100644
--- a/persistence-modules/hibernate-enterprise/pom.xml
+++ b/persistence-modules/hibernate-enterprise/pom.xml
@@ -1,7 +1,7 @@
-
+4.0.0hibernate-enterprise0.0.1-SNAPSHOT
@@ -92,4 +92,4 @@
2.3.4
-
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-exceptions/pom.xml b/persistence-modules/hibernate-exceptions/pom.xml
index f7eee22960..89e1f4ca7e 100644
--- a/persistence-modules/hibernate-exceptions/pom.xml
+++ b/persistence-modules/hibernate-exceptions/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0hibernate-exceptions0.0.1-SNAPSHOT
@@ -35,4 +36,4 @@
2.3.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-jpa/pom.xml b/persistence-modules/hibernate-jpa/pom.xml
index 07b1ee1c51..11540b6d23 100644
--- a/persistence-modules/hibernate-jpa/pom.xml
+++ b/persistence-modules/hibernate-jpa/pom.xml
@@ -1,7 +1,7 @@
-
+4.0.0hibernate-jpa0.0.1-SNAPSHOT
@@ -79,7 +79,7 @@
org.openjdk.jmhjmh-generator-annprocess
- ${openjdk-jmh.version}
+ ${jmh-generator.version}org.postgresql
@@ -91,11 +91,9 @@
5.3.7.Final8.0.13
- 42.2.112.2.33.8.0
- 1.212.1.7.RELEASE
-
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-libraries/pom.xml b/persistence-modules/hibernate-libraries/pom.xml
index f67309cf43..19537156aa 100644
--- a/persistence-modules/hibernate-libraries/pom.xml
+++ b/persistence-modules/hibernate-libraries/pom.xml
@@ -1,5 +1,6 @@
-4.0.0hibernate-libraries
@@ -125,7 +126,7 @@
- hibernate-types
+ hibernate-librariessrc/main/resources
@@ -158,7 +159,7 @@
-
+
@@ -175,7 +176,6 @@
2.0.01.2.33.0.2
- 2.22.23.8.13.8.18.0.19
@@ -183,4 +183,4 @@
2.1.3.RELEASE
-
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-mapping/README.md b/persistence-modules/hibernate-mapping/README.md
index b5d0cb2f99..984f49bb70 100644
--- a/persistence-modules/hibernate-mapping/README.md
+++ b/persistence-modules/hibernate-mapping/README.md
@@ -13,3 +13,4 @@ This module contains articles about Object-relational Mapping (ORM) with Hiberna
- [Hibernate – Mapping Date and Time](https://www.baeldung.com/hibernate-date-time)
- [Mapping LOB Data in Hibernate](https://www.baeldung.com/hibernate-lob)
- [FetchMode in Hibernate](https://www.baeldung.com/hibernate-fetchmode)
+- [Mapping PostgreSQL Array With Hibernate](https://www.baeldung.com/java-hibernate-map-postgresql-array)
diff --git a/persistence-modules/hibernate-mapping/pom.xml b/persistence-modules/hibernate-mapping/pom.xml
index ebc854a621..4f76c16a3f 100644
--- a/persistence-modules/hibernate-mapping/pom.xml
+++ b/persistence-modules/hibernate-mapping/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0hibernate-mappinghibernate-mapping
@@ -13,11 +13,22 @@
+
+ org.postgresql
+ postgresql
+ ${postgresql.version}
+ test
+ org.hibernatehibernate-core${hibernate.version}
+
+ com.vladmihalcea
+ hibernate-types-52
+ ${hibernate-types.version}
+ org.assertjassertj-core
@@ -61,16 +72,16 @@
commons-io${commons-io.version}
-
5.4.12.Final
+ 2.10.43.8.06.0.16.Final
- 3.0.1-b11
+ 3.0.1-b111.0.31.3
-
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomIntegerArrayType.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomIntegerArrayType.java
new file mode 100644
index 0000000000..233bb95dc1
--- /dev/null
+++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomIntegerArrayType.java
@@ -0,0 +1,85 @@
+package com.baeldung.hibernate.arraymapping;
+
+import java.io.Serializable;
+import java.sql.Array;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Arrays;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.spi.SharedSessionContractImplementor;
+import org.hibernate.usertype.UserType;
+
+public class CustomIntegerArrayType implements UserType {
+
+ @Override
+ public int[] sqlTypes() {
+ return new int[]{Types.ARRAY};
+ }
+
+ @Override
+ public Class returnedClass() {
+ return Integer[].class;
+ }
+
+ @Override
+ public boolean equals(Object x, Object y) throws HibernateException {
+ if (x instanceof Integer[] && y instanceof Integer[]) {
+ return Arrays.deepEquals((Integer[])x, (Integer[])y);
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode(Object x) throws HibernateException {
+ return Arrays.hashCode((Integer[])x);
+ }
+
+ @Override
+ public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner)
+ throws HibernateException, SQLException {
+ Array array = rs.getArray(names[0]);
+ return array != null ? array.getArray() : null;
+ }
+
+ @Override
+ public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session)
+ throws HibernateException, SQLException {
+ if (value != null && st != null) {
+ Array array = session.connection().createArrayOf("int", (Integer[])value);
+ st.setArray(index, array);
+ } else {
+ st.setNull(index, sqlTypes()[0]);
+ }
+ }
+
+ @Override
+ public Object deepCopy(Object value) throws HibernateException {
+ Integer[] a = (Integer[])value;
+ return Arrays.copyOf(a, a.length);
+ }
+
+ @Override
+ public boolean isMutable() {
+ return false;
+ }
+
+ @Override
+ public Serializable disassemble(Object value) throws HibernateException {
+ return (Serializable) value;
+ }
+
+ @Override
+ public Object assemble(Serializable cached, Object owner) throws HibernateException {
+ return cached;
+ }
+
+ @Override
+ public Object replace(Object original, Object target, Object owner) throws HibernateException {
+ return original;
+ }
+
+}
diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomStringArrayType.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomStringArrayType.java
new file mode 100644
index 0000000000..7bd284def7
--- /dev/null
+++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomStringArrayType.java
@@ -0,0 +1,85 @@
+package com.baeldung.hibernate.arraymapping;
+
+import java.io.Serializable;
+import java.sql.Array;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Arrays;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.spi.SharedSessionContractImplementor;
+import org.hibernate.usertype.UserType;
+
+public class CustomStringArrayType implements UserType {
+
+ @Override
+ public int[] sqlTypes() {
+ return new int[]{Types.ARRAY};
+ }
+
+ @Override
+ public Class returnedClass() {
+ return String[].class;
+ }
+
+ @Override
+ public boolean equals(Object x, Object y) throws HibernateException {
+ if (x instanceof String[] && y instanceof String[]) {
+ return Arrays.deepEquals((String[])x, (String[])y);
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode(Object x) throws HibernateException {
+ return Arrays.hashCode((String[])x);
+ }
+
+ @Override
+ public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner)
+ throws HibernateException, SQLException {
+ Array array = rs.getArray(names[0]);
+ return array != null ? array.getArray() : null;
+ }
+
+ @Override
+ public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session)
+ throws HibernateException, SQLException {
+ if (value != null && st != null) {
+ Array array = session.connection().createArrayOf("text", (String[])value);
+ st.setArray(index, array);
+ } else {
+ st.setNull(index, sqlTypes()[0]);
+ }
+ }
+
+ @Override
+ public Object deepCopy(Object value) throws HibernateException {
+ String[] a = (String[])value;
+ return Arrays.copyOf(a, a.length);
+ }
+
+ @Override
+ public boolean isMutable() {
+ return false;
+ }
+
+ @Override
+ public Serializable disassemble(Object value) throws HibernateException {
+ return (Serializable) value;
+ }
+
+ @Override
+ public Object assemble(Serializable cached, Object owner) throws HibernateException {
+ return cached;
+ }
+
+ @Override
+ public Object replace(Object original, Object target, Object owner) throws HibernateException {
+ return original;
+ }
+
+}
diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/HibernateSessionUtil.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/HibernateSessionUtil.java
new file mode 100644
index 0000000000..dc3ec93a9d
--- /dev/null
+++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/HibernateSessionUtil.java
@@ -0,0 +1,61 @@
+package com.baeldung.hibernate.arraymapping;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Properties;
+
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.SessionFactory;
+import org.hibernate.boot.Metadata;
+import org.hibernate.boot.MetadataSources;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.service.ServiceRegistry;
+
+import com.baeldung.hibernate.arraymapping.User;
+
+public class HibernateSessionUtil {
+
+ private static SessionFactory sessionFactory;
+ private static String PROPERTY_FILE_NAME;
+
+ public static SessionFactory getSessionFactory() throws IOException {
+ return getSessionFactory(null);
+ }
+
+ public static SessionFactory getSessionFactory(String propertyFileName) throws IOException {
+ PROPERTY_FILE_NAME = propertyFileName;
+ if (sessionFactory == null) {
+ ServiceRegistry serviceRegistry = configureServiceRegistry();
+ sessionFactory = makeSessionFactory(serviceRegistry);
+ }
+ return sessionFactory;
+ }
+
+ private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) {
+ MetadataSources metadataSources = new MetadataSources(serviceRegistry);
+ metadataSources.addAnnotatedClass(User.class);
+
+ Metadata metadata = metadataSources.buildMetadata();
+ return metadata.getSessionFactoryBuilder()
+ .build();
+
+ }
+
+ private static ServiceRegistry configureServiceRegistry() throws IOException {
+ Properties properties = getProperties();
+ return new StandardServiceRegistryBuilder().applySettings(properties)
+ .build();
+ }
+
+ private static Properties getProperties() throws IOException {
+ Properties properties = new Properties();
+ URL propertiesURL = Thread.currentThread()
+ .getContextClassLoader()
+ .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate_postgres.properties"));
+ try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) {
+ properties.load(inputStream);
+ }
+ return properties;
+ }
+}
diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/User.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/User.java
new file mode 100644
index 0000000000..018bedc349
--- /dev/null
+++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/User.java
@@ -0,0 +1,82 @@
+package com.baeldung.hibernate.arraymapping;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.Type;
+
+import com.vladmihalcea.hibernate.type.array.StringArrayType;
+
+import org.hibernate.annotations.*;
+
+@TypeDefs({
+ @TypeDef(
+ name = "string-array",
+ typeClass = StringArrayType.class
+ )
+})
+@Entity
+public class User {
+
+ @Id
+ private Long id;
+
+ private String name;
+
+ @Column(columnDefinition = "text[]")
+ @Type(type = "com.baeldung.hibernate.arraymapping.CustomStringArrayType")
+ private String[] roles;
+
+ @Column(columnDefinition = "int[]")
+ @Type(type = "com.baeldung.hibernate.arraymapping.CustomIntegerArrayType")
+ private Integer[] locations;
+
+ @Type(type = "string-array")
+ @Column(
+ name = "phone_numbers",
+ columnDefinition = "text[]"
+ )
+ private String[] phoneNumbers;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String[] getRoles() {
+ return roles;
+ }
+
+ public void setRoles(String[] roles) {
+ this.roles = roles;
+ }
+
+ public Integer[] getLocations() {
+ return locations;
+ }
+
+ public void setLocations(Integer[] locations) {
+ this.locations = locations;
+ }
+
+ public String[] getPhoneNumbers() {
+ return phoneNumbers;
+ }
+
+ public void setPhoneNumbers(String[] phoneNumbers) {
+ this.phoneNumbers = phoneNumbers;
+ }
+
+}
diff --git a/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/arraymapping/ArrayMappingIntegrationTest.java b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/arraymapping/ArrayMappingIntegrationTest.java
new file mode 100644
index 0000000000..ba0ccc2aa2
--- /dev/null
+++ b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/arraymapping/ArrayMappingIntegrationTest.java
@@ -0,0 +1,133 @@
+package com.baeldung.hibernate.arraymapping;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.io.IOException;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+
+public class ArrayMappingIntegrationTest {
+
+ private Session session;
+ private Transaction transaction;
+
+ @BeforeEach
+ public void setup() throws IOException {
+ try {
+ session = HibernateSessionUtil.getSessionFactory().openSession();
+ transaction = session.beginTransaction();
+
+ bootstrapData();
+
+ } catch (HibernateException | IOException e) {
+ System.out.println("Can't connect to a PostgreSQL DB");
+ }
+ }
+
+ @AfterEach
+ public void cleanup() {
+ if (null != session) {
+ transaction.rollback();
+ session.close();
+ }
+ }
+
+ @Test
+ public void givenArrayMapping_whenQueried_thenReturnArraysFromDB() throws HibernateException, IOException {
+ if (null != session) {
+ User user = session.find(User.class, 1L);
+
+ assertEquals("john", user.getName());
+ assertEquals("superuser", user.getRoles()[0]);
+ assertEquals("admin", user.getRoles()[1]);
+ assertEquals(100, user.getLocations()[0]);
+ assertEquals(389, user.getLocations()[1]);
+ assertEquals("7000000000", user.getPhoneNumbers()[0]);
+ assertEquals("8000000000", user.getPhoneNumbers()[1]);
+ }
+ }
+
+ @Test
+ public void givenArrayMapping_whenArraysAreInserted_thenPersistInDB() throws HibernateException, IOException {
+ if (null != session) {
+ transaction = session.beginTransaction();
+
+ User user = new User();
+ user.setId(2L);
+ user.setName("smith");
+
+ String[] roles = {"admin", "employee"};
+ user.setRoles(roles);
+
+ Integer[] locations = {190, 578};
+ user.setLocations(locations);
+
+ session.persist(user);
+ session.flush();
+ session.clear();
+
+ transaction.commit();
+
+ User userDBObj = session.find(User.class, 2L);
+
+ assertEquals("smith", userDBObj.getName());
+ assertEquals("admin", userDBObj.getRoles()[0]);
+ assertEquals(578, userDBObj.getLocations()[1]);
+ }
+ }
+
+ @Test
+ public void givenArrayMapping_whenArrayIsUpdated_thenPersistInDB() throws HibernateException, IOException {
+ if (null != session) {
+ transaction = session.beginTransaction();
+
+ User user = session.find(User.class, 1L);
+
+ String[] updatedRoles = {"superuser", "superadmin"};
+ String[] updatedPhoneNumbers = {"9000000000"};
+
+ user.setRoles(updatedRoles);
+ user.setPhoneNumbers(updatedPhoneNumbers);
+
+ session.persist(user);
+ session.flush();
+ session.clear();
+
+ User userDBObj = session.find(User.class, 1L);
+
+ assertEquals("john", userDBObj.getName());
+ assertEquals("superadmin", userDBObj.getRoles()[1]);
+ assertEquals("9000000000", userDBObj.getPhoneNumbers()[0]);
+ }
+ }
+
+ public void bootstrapData() {
+ session.createQuery("delete from User").executeUpdate();
+
+ User user = new User();
+ user.setId(1L);
+ user.setName("john");
+
+ String[] roles = {"superuser", "admin"};
+ user.setRoles(roles);
+
+ Integer[] locations = {100, 389};
+ user.setLocations(locations);
+
+ String[] phoneNumbers = {"7000000000", "8000000000"};
+ user.setPhoneNumbers(phoneNumbers);
+
+ session.persist(user);
+ session.flush();
+ session.clear();
+
+ transaction.commit();
+ }
+
+}
diff --git a/persistence-modules/hibernate-mapping/src/test/resources/hibernate_postgres.properties b/persistence-modules/hibernate-mapping/src/test/resources/hibernate_postgres.properties
new file mode 100644
index 0000000000..72e3dcd781
--- /dev/null
+++ b/persistence-modules/hibernate-mapping/src/test/resources/hibernate_postgres.properties
@@ -0,0 +1,14 @@
+hibernate.connection.driver_class=org.postgresql.Driver
+hibernate.connection.url=jdbc:postgresql://localhost:5432/postgres
+hibernate.connection.username=web
+hibernate.connection.autocommit=true
+jdbc.password=
+
+hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
+hibernate.show_sql=true
+hibernate.hbm2ddl.auto=none
+
+hibernate.c3p0.min_size=5
+hibernate.c3p0.max_size=20
+hibernate.c3p0.acquire_increment=5
+hibernate.c3p0.timeout=1800
diff --git a/persistence-modules/hibernate-ogm/pom.xml b/persistence-modules/hibernate-ogm/pom.xml
index 8f42c28eee..58098ebb65 100644
--- a/persistence-modules/hibernate-ogm/pom.xml
+++ b/persistence-modules/hibernate-ogm/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0hibernate-ogm0.0.1-SNAPSHOT
@@ -45,5 +46,5 @@
1.45.5.23.Final
-
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-queries/pom.xml b/persistence-modules/hibernate-queries/pom.xml
index 4374c833c2..4a8c578aba 100644
--- a/persistence-modules/hibernate-queries/pom.xml
+++ b/persistence-modules/hibernate-queries/pom.xml
@@ -1,7 +1,7 @@
-
+4.0.0hibernate-queries0.0.1-SNAPSHOT
@@ -53,7 +53,7 @@
org.openjdk.jmhjmh-generator-annprocess
- ${openjdk-jmh.version}
+ ${jmh-generator.version}
@@ -61,7 +61,6 @@
6.0.62.2.33.8.0
- 1.21
-
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml
index 3feffc98fd..9b4ffff739 100644
--- a/persistence-modules/hibernate5/pom.xml
+++ b/persistence-modules/hibernate5/pom.xml
@@ -1,7 +1,7 @@
-
+4.0.0hibernate50.0.1-SNAPSHOT
@@ -55,11 +55,10 @@
jackson-databind${jackson.version}
-
org.openjdk.jmhjmh-generator-annprocess
- ${openjdk-jmh.version}
+ ${jmh-generator.version}
@@ -68,7 +67,6 @@
6.0.62.2.33.8.0
- 1.21
-
+
\ No newline at end of file
diff --git a/persistence-modules/influxdb/pom.xml b/persistence-modules/influxdb/pom.xml
index 23ae64dca1..401e4c3ea7 100644
--- a/persistence-modules/influxdb/pom.xml
+++ b/persistence-modules/influxdb/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0influxdb0.1-SNAPSHOT
@@ -20,7 +21,6 @@
influxdb-java${influxdb.sdk.version}
-
org.projectlomboklombok
@@ -34,4 +34,4 @@
2.8
-
+
\ No newline at end of file
diff --git a/persistence-modules/java-cassandra/pom.xml b/persistence-modules/java-cassandra/pom.xml
index 091efaeff4..ad80fc8a83 100644
--- a/persistence-modules/java-cassandra/pom.xml
+++ b/persistence-modules/java-cassandra/pom.xml
@@ -1,5 +1,6 @@
-4.0.0java-cassandra
@@ -25,14 +26,12 @@
-
org.cassandraunitcassandra-unit${cassandra-unit.version}
-
com.datastax.oss
@@ -53,4 +52,4 @@
4.1.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/java-cockroachdb/pom.xml b/persistence-modules/java-cockroachdb/pom.xml
index e8c6365ca3..61fb193975 100644
--- a/persistence-modules/java-cockroachdb/pom.xml
+++ b/persistence-modules/java-cockroachdb/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0java-cockroachdb1.0-SNAPSHOT
@@ -20,8 +21,4 @@
-
- 42.1.4
-
-
\ No newline at end of file
diff --git a/persistence-modules/java-jdbi/pom.xml b/persistence-modules/java-jdbi/pom.xml
index eb0de45593..e08b3a3c35 100644
--- a/persistence-modules/java-jdbi/pom.xml
+++ b/persistence-modules/java-jdbi/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0java-jdbi1.0-SNAPSHOT
diff --git a/persistence-modules/java-jpa-2/pom.xml b/persistence-modules/java-jpa-2/pom.xml
index ab5bb39dfc..26895f3a87 100644
--- a/persistence-modules/java-jpa-2/pom.xml
+++ b/persistence-modules/java-jpa-2/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0java-jpa-2java-jpa-2
@@ -27,14 +28,12 @@
h2${h2.version}
-
javax.persistencejavax.persistence-api${javax.persistence-api.version}
-
org.eclipse.persistence
@@ -45,7 +44,7 @@
org.postgresqlpostgresql
- ${postgres.version}
+ ${postgresql.version}runtime
@@ -59,7 +58,6 @@
querydsl-jpa${querydsl.version}
-
org.assertjassertj-core
@@ -140,7 +138,6 @@
5.4.14.Final2.7.4
- 42.2.52.23.11.13.5.1
@@ -149,4 +146,4 @@
4.3.1
-
+
\ No newline at end of file
diff --git a/persistence-modules/java-jpa-3/README.md b/persistence-modules/java-jpa-3/README.md
index 9c9e040825..c024d7c540 100644
--- a/persistence-modules/java-jpa-3/README.md
+++ b/persistence-modules/java-jpa-3/README.md
@@ -10,3 +10,6 @@ This module contains articles about the Java Persistence API (JPA) in Java.
- [JPA CascadeType.REMOVE vs orphanRemoval](https://www.baeldung.com/jpa-cascade-remove-vs-orphanremoval)
- [A Guide to MultipleBagFetchException in Hibernate](https://www.baeldung.com/java-hibernate-multiplebagfetchexception)
- [How to Convert a Hibernate Proxy to a Real Entity Object](https://www.baeldung.com/hibernate-proxy-to-real-entity-object)
+- [Returning an Auto-Generated Id with JPA](https://www.baeldung.com/jpa-get-auto-generated-id)
+- [How to Return Multiple Entities In JPA Query](https://www.baeldung.com/jpa-return-multiple-entities)
+- [Defining Unique Constraints in JPA](https://www.baeldung.com/jpa-unique-constraints)
diff --git a/persistence-modules/java-jpa-3/pom.xml b/persistence-modules/java-jpa-3/pom.xml
index 7c02cc6c8e..cecabc10cc 100644
--- a/persistence-modules/java-jpa-3/pom.xml
+++ b/persistence-modules/java-jpa-3/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0java-jpa-3java-jpa-3
@@ -30,17 +31,17 @@
mysqlmysql-connector-java
- 8.0.21
+ ${mysql.version}com.fasterxml.jackson.corejackson-databind
- 2.11.3
+ ${jackson.version}com.fasterxml.jackson.datatypejackson-datatype-hibernate5
- 2.9.8
+ ${jackson.version}
@@ -48,7 +49,6 @@
javax.persistence-api${javax.persistence-api.version}
-
org.eclipse.persistence
@@ -59,7 +59,7 @@
org.postgresqlpostgresql
- ${postgres.version}
+ ${postgresql.version}runtime
@@ -68,6 +68,12 @@
${assertj.version}test
+
+ junit
+ junit
+ ${junit.version}
+ test
+
@@ -86,7 +92,7 @@
5.4.14.Final2.7.4
- 42.2.5
+ 8.0.212.23.11.13.5.1
@@ -94,4 +100,4 @@
3.0.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java
index 9285c23dfa..d121c81c6b 100644
--- a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java
+++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java
@@ -9,6 +9,7 @@ import org.hibernate.cfg.Environment;
import org.hibernate.service.ServiceRegistry;
public class HibernateConfig {
+
private static SessionFactory sessionFactory;
public static SessionFactory getSessionFactory() {
@@ -16,12 +17,12 @@ public class HibernateConfig {
Configuration configuration = new Configuration();
Properties settings = new Properties();
- settings.put(Environment.DRIVER, "com.mysql.cj.jdbc.Driver");
- settings.put(Environment.URL, "jdbc:mysql://localhost:3306/app_db?useSSL=false");
- settings.put(Environment.USER, "root");
- settings.put(Environment.PASS, "password");
- settings.put(Environment.DIALECT, "org.hibernate.dialect.MySQL5Dialect");
- settings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread");
+ settings.put(Environment.DRIVER, "org.h2.Driver");
+ settings.put(Environment.URL, "jdbc:h2:mem:test");
+ settings.put(Environment.USER, "sa");
+ settings.put(Environment.PASS, "");
+ settings.put(Environment.DIALECT, "org.hibernate.dialect.H2Dialect");
+ settings.put(Environment.HBM2DDL_AUTO, "create-drop");
configuration.setProperties(settings);
configuration.addAnnotatedClass(User.class);
diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/IdGeneration/User.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/IdGeneration/User.java
new file mode 100644
index 0000000000..88e742adce
--- /dev/null
+++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/IdGeneration/User.java
@@ -0,0 +1,41 @@
+package com.baeldung.jpa.IdGeneration;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+public class User {
+
+ @Id
+// @GeneratedValue(strategy = GenerationType.SEQUENCE)
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private long id;
+ private String username;
+ private String password;
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+}
diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/IdGeneration/UserService.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/IdGeneration/UserService.java
new file mode 100644
index 0000000000..9c34ef9bb4
--- /dev/null
+++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/IdGeneration/UserService.java
@@ -0,0 +1,19 @@
+package com.baeldung.jpa.IdGeneration;
+
+import javax.persistence.EntityManager;
+import javax.transaction.Transactional;
+
+public class UserService {
+
+ EntityManager entityManager;
+
+ public UserService(EntityManager entityManager) {
+ this.entityManager = entityManager;
+ }
+
+ @Transactional
+ public long saveUser(User user){
+ entityManager.persist(user);
+ return user.getId();
+ }
+}
diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/returnmultipleentities/Channel.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/returnmultipleentities/Channel.java
new file mode 100644
index 0000000000..7f60dd8de4
--- /dev/null
+++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/returnmultipleentities/Channel.java
@@ -0,0 +1,43 @@
+package com.baeldung.jpa.returnmultipleentities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import java.util.Objects;
+
+@Entity
+public class Channel {
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+
+ private String code;
+
+ private Long subscriptionId;
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setSubscriptionId(Long subscriptionId) {
+ this.subscriptionId = subscriptionId;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Channel channel = (Channel) o;
+ return Objects.equals(id, channel.id) && Objects.equals(code, channel.code) && Objects.equals(subscriptionId, channel.subscriptionId);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, code, subscriptionId);
+ }
+}
diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/returnmultipleentities/ReportRepository.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/returnmultipleentities/ReportRepository.java
new file mode 100644
index 0000000000..ae574de7d5
--- /dev/null
+++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/returnmultipleentities/ReportRepository.java
@@ -0,0 +1,23 @@
+package com.baeldung.jpa.returnmultipleentities;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+import javax.persistence.Query;
+import java.util.List;
+
+public class ReportRepository {
+ private final EntityManagerFactory emf;
+
+ public ReportRepository() {
+ emf = Persistence.createEntityManagerFactory("jpa-h2-return-multiple-entities");
+ }
+
+ public List
\ No newline at end of file
diff --git a/persistence-modules/jnosql/jnosql-artemis/pom.xml b/persistence-modules/jnosql/jnosql-artemis/pom.xml
index 8570d1072f..0c1a6967d3 100644
--- a/persistence-modules/jnosql/jnosql-artemis/pom.xml
+++ b/persistence-modules/jnosql/jnosql-artemis/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0jnosql-artemisjnosql-artemis
@@ -83,4 +83,4 @@
8.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/jnosql/jnosql-diana/pom.xml b/persistence-modules/jnosql/jnosql-diana/pom.xml
index 79c455646c..f1a4e746cf 100644
--- a/persistence-modules/jnosql/jnosql-diana/pom.xml
+++ b/persistence-modules/jnosql/jnosql-diana/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0jnosql-dianajnosql-diana
@@ -13,7 +13,7 @@
-
+
org.jnosql.dianadiana-document
@@ -24,8 +24,7 @@
mongodb-driver${jnosql.version}
-
-
+
org.jnosql.dianadiana-column
@@ -36,8 +35,7 @@
cassandra-driver${jnosql.version}
-
-
+
org.jnosql.dianadiana-key-value
@@ -55,7 +53,6 @@
org.codehaus.mojoexec-maven-plugin
- ${exec-maven-plugin.version}document
diff --git a/persistence-modules/jnosql/pom.xml b/persistence-modules/jnosql/pom.xml
index 81c62ee562..090350e6e3 100644
--- a/persistence-modules/jnosql/pom.xml
+++ b/persistence-modules/jnosql/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldung.jnosqljnosql
@@ -24,4 +24,4 @@
0.0.6
-
+
\ No newline at end of file
diff --git a/persistence-modules/jooq/pom.xml b/persistence-modules/jooq/pom.xml
index f0c5a27a96..c66be9db77 100644
--- a/persistence-modules/jooq/pom.xml
+++ b/persistence-modules/jooq/pom.xml
@@ -1,11 +1,11 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0jooq0.0.1-SNAPSHOT
- jooq-examples
+ jooqjarjOOQ Examples
@@ -19,28 +19,33 @@
org.jooqjooq
- 3.13.4
+ ${jooq.version}org.jooqjooq-meta
- 3.13.4
+ ${jooq.version}org.jooqjooq-codegen
- 3.13.4
+ ${jooq.version}org.postgresqlpostgresql
- 42.2.16
+ ${postgresql.version}com.h2databaseh2
- 1.4.200
+ ${h2.version}
-
+
+ 3.13.4
+ 1.4.200
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/jpa-hibernate-cascade-type/pom.xml b/persistence-modules/jpa-hibernate-cascade-type/pom.xml
index e8117290b0..467fe11bc3 100644
--- a/persistence-modules/jpa-hibernate-cascade-type/pom.xml
+++ b/persistence-modules/jpa-hibernate-cascade-type/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0jpa-hibernate-cascade-type
diff --git a/persistence-modules/liquibase/pom.xml b/persistence-modules/liquibase/pom.xml
index af1af2259e..2fc5803037 100644
--- a/persistence-modules/liquibase/pom.xml
+++ b/persistence-modules/liquibase/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0liquibaseliquibase
diff --git a/persistence-modules/orientdb/pom.xml b/persistence-modules/orientdb/pom.xml
index 5b28fb01b0..1468f5b611 100644
--- a/persistence-modules/orientdb/pom.xml
+++ b/persistence-modules/orientdb/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0orientdb0.0.1-SNAPSHOT
@@ -42,4 +43,4 @@
2.6.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/persistence-libraries/pom.xml b/persistence-modules/persistence-libraries/pom.xml
index 42f3a33a40..a3f0ccb728 100644
--- a/persistence-modules/persistence-libraries/pom.xml
+++ b/persistence-modules/persistence-libraries/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0persistence-libraries1.0-SNAPSHOT
@@ -31,4 +32,4 @@
1.6.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml
index 8789a8473b..e5214752cf 100644
--- a/persistence-modules/pom.xml
+++ b/persistence-modules/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0persistence-modulespersistence-modules
@@ -38,6 +39,7 @@
java-jdbijava-jpajava-jpa-2
+ java-jpa-3java-mongodbjnosqljooq
@@ -64,7 +66,6 @@
spring-data-elasticsearchspring-data-gemfirespring-data-geode
-
spring-data-jpa-annotationsspring-data-jpa-crudspring-data-jpa-enterprise
@@ -73,16 +74,14 @@
spring-data-jpa-query-2spring-data-jpa-repospring-data-jpa-repo-2
-
spring-data-jdbc
-
spring-data-keyvaluespring-data-mongodbspring-data-neo4jspring-data-redisspring-data-solrspring-hibernate-3
- spring-hibernate-5
+ spring-hibernate-5spring-jpaspring-jpa-2spring-jdbc
@@ -95,9 +94,12 @@
5.2.17.Final
+ 42.2.20
+
2.22.25.6.24.13
-
+
+
\ No newline at end of file
diff --git a/persistence-modules/querydsl/pom.xml b/persistence-modules/querydsl/pom.xml
index a611c309b6..c4b01d787c 100644
--- a/persistence-modules/querydsl/pom.xml
+++ b/persistence-modules/querydsl/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0querydsl0.1-SNAPSHOT
@@ -20,14 +21,12 @@
querydsl-jpa${querydsl.version}
-
com.querydslquerydsl-apt${querydsl.version}provided
-
org.hibernate
@@ -35,14 +34,12 @@
${hibernate.version}compile
-
org.hibernate.javax.persistencehibernate-jpa-2.1-api${hibernate-jpa.version}compile
-
commons-dbcpcommons-dbcp
@@ -50,7 +47,6 @@
jarcompile
-
commons-poolcommons-pool
@@ -58,14 +54,12 @@
jarcompile
-
org.hsqldbhsqldb${hsqldb.version}
-
org.springframework
@@ -78,13 +72,11 @@
-
org.springframeworkspring-webmvc${spring.version}
-
org.springframeworkspring-orm
@@ -92,13 +84,11 @@
jarcompile
-
org.springframeworkspring-aop${spring.version}
-
org.springframeworkspring-test
@@ -121,7 +111,6 @@
-proc:none
-
com.mysema.maven
diff --git a/persistence-modules/r2dbc/pom.xml b/persistence-modules/r2dbc/pom.xml
index 01f1b351cd..ae4ca4d91d 100644
--- a/persistence-modules/r2dbc/pom.xml
+++ b/persistence-modules/r2dbc/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldung.examples.r2dbcr2dbc
@@ -14,7 +14,7 @@
parent-boot-20.0.1-SNAPSHOT../../parent-boot-2
-
+
@@ -25,7 +25,6 @@
org.springframework.bootspring-boot-starter-validation
-
org.springframework.bootspring-boot-starter-test
@@ -36,15 +35,12 @@
reactor-testtest
-
-
io.r2dbcr2dbc-h2${r2dbc-h2.version}
-
org.springframework.bootspring-boot-configuration-processor
@@ -68,7 +64,6 @@
0.8.1.RELEASE1.4.200
-
-
+
\ No newline at end of file
diff --git a/persistence-modules/redis/pom.xml b/persistence-modules/redis/pom.xml
index fa82bebc64..c407482788 100644
--- a/persistence-modules/redis/pom.xml
+++ b/persistence-modules/redis/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0redis0.1-SNAPSHOT
@@ -19,17 +20,14 @@
org.springframework.bootspring-boot-starter
-
org.springframework.bootspring-boot-starter-web
-
org.springframework.bootspring-boot-starter-data-redis
-
redis.clientsjedis
@@ -56,7 +54,7 @@
-
+ 0.63.13.13.3.0
@@ -64,4 +62,4 @@
-
+
\ No newline at end of file
diff --git a/persistence-modules/sirix/pom.xml b/persistence-modules/sirix/pom.xml
index 67de507cca..85379dc566 100644
--- a/persistence-modules/sirix/pom.xml
+++ b/persistence-modules/sirix/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0io.sirixsirix
@@ -47,11 +47,10 @@
- UTF-8110.9.33.8.06.1
-
+
\ No newline at end of file
diff --git a/persistence-modules/solr/pom.xml b/persistence-modules/solr/pom.xml
index fd993e0c67..de0bd5a4a2 100644
--- a/persistence-modules/solr/pom.xml
+++ b/persistence-modules/solr/pom.xml
@@ -1,5 +1,6 @@
-4.0.0solr
diff --git a/persistence-modules/spring-boot-mysql/pom.xml b/persistence-modules/spring-boot-mysql/pom.xml
index 834d1d1e64..ed3f7d9279 100644
--- a/persistence-modules/spring-boot-mysql/pom.xml
+++ b/persistence-modules/spring-boot-mysql/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-boot-mysql0.1.0
@@ -39,7 +40,6 @@
8.0.12
-
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-persistence-2/pom.xml b/persistence-modules/spring-boot-persistence-2/pom.xml
index ca6ec93340..b51ab17659 100644
--- a/persistence-modules/spring-boot-persistence-2/pom.xml
+++ b/persistence-modules/spring-boot-persistence-2/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldung.boot.persistencespring-boot-persistence-2
@@ -31,13 +31,11 @@
pomimport
-
org.jdbijdbi3-spring4${jdbi.version}
-
org.jdbijdbi3-sqlobject
@@ -51,22 +49,18 @@
org.springframework.bootspring-boot-starter-web
-
org.springframework.bootspring-boot-starter-data-jpa
-
org.jdbijdbi3-spring4
-
org.jdbijdbi3-sqlobject
-
org.springframework.bootspring-boot-devtools
@@ -93,23 +87,19 @@
spring-boot-starter-testtest
-
com.mchangec3p0${c3p0.version}
-
org.apache.commonscommons-dbcp2
-
org.apache.tomcattomcat-jdbc
-
mysqlmysql-connector-java
@@ -126,7 +116,6 @@
org.hsqldbhsqldb
-
com.oracle.database.jdbcojdbc8
@@ -160,4 +149,4 @@
19.6.0.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationUnitTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationIntegrationTest.java
similarity index 98%
rename from persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationUnitTest.java
rename to persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationIntegrationTest.java
index 93083f6c4c..ac5661afbc 100644
--- a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationUnitTest.java
+++ b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationIntegrationTest.java
@@ -24,7 +24,7 @@ import lombok.extern.slf4j.Slf4j;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {SpringBootJdbiApplication.class, JdbiConfiguration.class})
@Slf4j
-public class SpringBootJdbiApplicationUnitTest {
+public class SpringBootJdbiApplicationIntegrationTest {
@Autowired
diff --git a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerIntegrationTest.java
similarity index 97%
rename from persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java
rename to persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerIntegrationTest.java
index be16f8f563..6956df0b13 100644
--- a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java
+++ b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerIntegrationTest.java
@@ -20,7 +20,7 @@ import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
-public class CustomerControllerUnitTest {
+public class CustomerControllerIntegrationTest {
private static MediaType MEDIA_TYPE_JSON;
diff --git a/persistence-modules/spring-boot-persistence-h2/pom.xml b/persistence-modules/spring-boot-persistence-h2/pom.xml
index c06c35cfee..023e20837b 100644
--- a/persistence-modules/spring-boot-persistence-h2/pom.xml
+++ b/persistence-modules/spring-boot-persistence-h2/pom.xml
@@ -1,7 +1,7 @@
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldung.h2dbspring-boot-persistence-h2
@@ -46,7 +46,6 @@
com.baeldung.h2db.demo.server.SpringBootApp1.0.4
-
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-persistence-mongodb/pom.xml b/persistence-modules/spring-boot-persistence-mongodb/pom.xml
index 5167483aa3..724fa38f7e 100644
--- a/persistence-modules/spring-boot-persistence-mongodb/pom.xml
+++ b/persistence-modules/spring-boot-persistence-mongodb/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0spring-boot-persistence-mongodbspring-boot-persistence-mongodb
@@ -36,6 +36,4 @@
-
-
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-persistence/pom.xml b/persistence-modules/spring-boot-persistence/pom.xml
index 9e44a7b9c1..deac0c2a57 100644
--- a/persistence-modules/spring-boot-persistence/pom.xml
+++ b/persistence-modules/spring-boot-persistence/pom.xml
@@ -78,4 +78,4 @@
2.0.1.Final
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-cassandra-reactive/pom.xml b/persistence-modules/spring-data-cassandra-reactive/pom.xml
index f2f71bceac..630e13583b 100644
--- a/persistence-modules/spring-data-cassandra-reactive/pom.xml
+++ b/persistence-modules/spring-data-cassandra-reactive/pom.xml
@@ -1,5 +1,6 @@
-4.0.0spring-data-cassandra-reactive
@@ -56,4 +57,4 @@
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-cassandra/pom.xml b/persistence-modules/spring-data-cassandra/pom.xml
index 9de1cbf20e..e43e3821ae 100644
--- a/persistence-modules/spring-data-cassandra/pom.xml
+++ b/persistence-modules/spring-data-cassandra/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-data-cassandraspring-data-cassandra
@@ -107,4 +108,4 @@
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-cosmosdb/pom.xml b/persistence-modules/spring-data-cosmosdb/pom.xml
index 19a66648b2..30dc4f999c 100644
--- a/persistence-modules/spring-data-cosmosdb/pom.xml
+++ b/persistence-modules/spring-data-cosmosdb/pom.xml
@@ -4,21 +4,16 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0spring-data-cosmosdb
- spring-data-cosmos-db
+ spring-data-cosmosdbtutorial for spring-data-cosmosdb
+
com.baeldungparent-boot-20.0.1-SNAPSHOT../../parent-boot-2
-
-
- 1.8
- 2.3.0
-
-
org.springframework.boot
@@ -39,7 +34,7 @@
lombok
-
+
@@ -49,4 +44,8 @@
-
+
+ 2.3.0
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-couchbase-2/pom.xml b/persistence-modules/spring-data-couchbase-2/pom.xml
index 0a20a3ff0e..c860f809fd 100644
--- a/persistence-modules/spring-data-couchbase-2/pom.xml
+++ b/persistence-modules/spring-data-couchbase-2/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldungspring-data-couchbase-2
@@ -38,20 +38,17 @@
spring-data-couchbase${spring-data-couchbase.version}
-
org.hibernatehibernate-validator${hibernate-validator.version}
-
joda-timejoda-time${joda-time.version}
-
org.springframework
@@ -79,4 +76,4 @@
3.0.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-dynamodb/pom.xml b/persistence-modules/spring-data-dynamodb/pom.xml
index 377e35b635..28127179c2 100644
--- a/persistence-modules/spring-data-dynamodb/pom.xml
+++ b/persistence-modules/spring-data-dynamodb/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-data-dynamodbspring-data-dynamodb
@@ -184,4 +185,4 @@
3.1.1
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-eclipselink/pom.xml b/persistence-modules/spring-data-eclipselink/pom.xml
index 4ae43de07a..a344d64864 100644
--- a/persistence-modules/spring-data-eclipselink/pom.xml
+++ b/persistence-modules/spring-data-eclipselink/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-data-eclipselinkspring-data-eclipselink
@@ -67,4 +68,4 @@
2.7.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-elasticsearch/pom.xml b/persistence-modules/spring-data-elasticsearch/pom.xml
index 6a983145ee..7e91a5b15c 100644
--- a/persistence-modules/spring-data-elasticsearch/pom.xml
+++ b/persistence-modules/spring-data-elasticsearch/pom.xml
@@ -1,5 +1,6 @@
-
+4.0.0spring-data-elasticsearchspring-data-elasticsearch
@@ -18,31 +19,26 @@
spring-web${spring.version}
-
org.springframework.dataspring-data-elasticsearch${spring-data-elasticsearch.version}
-
org.elasticsearchelasticsearch${elasticsearch.version}
-
com.alibabafastjson${fastjson.version}
-
org.locationtech.spatial4jspatial4j${spatial4j.version}
-
org.locationtech.jtsjts-core
@@ -54,7 +50,6 @@
-
org.springframeworkspring-test
@@ -70,4 +65,5 @@
0.71.15.0
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-gemfire/pom.xml b/persistence-modules/spring-data-gemfire/pom.xml
index a0cc4d5360..53ce67fb6d 100644
--- a/persistence-modules/spring-data-gemfire/pom.xml
+++ b/persistence-modules/spring-data-gemfire/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-data-gemfirespring-data-gemfire
@@ -18,7 +19,6 @@
spring-data-gemfire${spring-data-gemfire-version}
-
com.gemstone.gemfiregemfire
@@ -30,7 +30,6 @@
google-collections${google-collections-version}
-
org.springframeworkspring-context
diff --git a/persistence-modules/spring-data-geode/pom.xml b/persistence-modules/spring-data-geode/pom.xml
index 07aa65463c..0673701f42 100644
--- a/persistence-modules/spring-data-geode/pom.xml
+++ b/persistence-modules/spring-data-geode/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-data-geodespring-data-geode
@@ -41,7 +42,6 @@
spring-geode-starter${spring-geode-starter-version}
-
org.springframework.bootspring-boot-autoconfigure
@@ -61,7 +61,7 @@
com.mysema.mavenmaven-apt-plugin
- 1.0
+ ${maven-apt-plugin.version}generate-sources
@@ -88,6 +88,7 @@
com.baeldung.springdatageode.app.ClientCacheApp1.1.1.RELEASE2.1.9.RELEASE
+ 1.0
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jdbc/pom.xml b/persistence-modules/spring-data-jdbc/pom.xml
index 15f8d7fb95..2672405dd6 100644
--- a/persistence-modules/spring-data-jdbc/pom.xml
+++ b/persistence-modules/spring-data-jdbc/pom.xml
@@ -1,32 +1,30 @@
- 4.0.0
-
- com.baeldung
- parent-boot-2
- 0.0.1-SNAPSHOT
- ../../parent-boot-2
-
- spring-data-jdbc
- spring-data-jdbc
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+ spring-data-jdbc
+ spring-data-jdbc
-
-
- org.springframework.boot
- spring-boot-starter
-
-
- org.springframework.boot
- spring-boot-starter-data-jdbc
-
-
- com.h2database
- h2
- runtime
-
-
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jdbc
+
+
+ com.h2database
+ h2
+ runtime
+
+
-
-
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-annotations/README.md b/persistence-modules/spring-data-jpa-annotations/README.md
index 3892e75733..5a5440b1ed 100644
--- a/persistence-modules/spring-data-jpa-annotations/README.md
+++ b/persistence-modules/spring-data-jpa-annotations/README.md
@@ -9,6 +9,7 @@ This module contains articles about annotations used in Spring Data JPA
- [Spring JPA @Embedded and @EmbeddedId](https://www.baeldung.com/spring-jpa-embedded-method-parameters)
- [Programmatic Transaction Management in Spring](https://www.baeldung.com/spring-programmatic-transaction-management)
- [JPA Entity Lifecycle Events](https://www.baeldung.com/jpa-entity-lifecycle-events)
+- [Overriding Column Definition With @AttributeOverride](https://www.baeldung.com/jpa-attributeoverride)
### Eclipse Config
After importing the project into Eclipse, you may see the following error:
diff --git a/persistence-modules/spring-data-jpa-annotations/pom.xml b/persistence-modules/spring-data-jpa-annotations/pom.xml
index ff30790eaf..113d6e5dc6 100644
--- a/persistence-modules/spring-data-jpa-annotations/pom.xml
+++ b/persistence-modules/spring-data-jpa-annotations/pom.xml
@@ -1,5 +1,6 @@
-4.0.0spring-data-jpa-annotations
@@ -25,12 +26,10 @@
org.hibernatehibernate-envers
-
com.h2databaseh2
-
org.testcontainers
@@ -38,13 +37,11 @@
${testcontainers.postgresql.version}test
-
org.postgresqlpostgresql
-
org.springframework.securityspring-security-test
@@ -59,7 +56,6 @@
spring-boot-starter-testtest
-
com.google.guavaguava
@@ -72,7 +68,6 @@
1.10.642.2.521.0
-
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Address.java b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Address.java
new file mode 100644
index 0000000000..95a3708173
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Address.java
@@ -0,0 +1,25 @@
+package com.baeldung.attribute.override.entity;
+
+import javax.persistence.Embeddable;
+
+@Embeddable
+public class Address {
+ private String name;
+ private String city;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Brand.java b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Brand.java
new file mode 100644
index 0000000000..9918cbaa70
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Brand.java
@@ -0,0 +1,29 @@
+package com.baeldung.attribute.override.entity;
+
+import javax.persistence.Embeddable;
+import javax.persistence.Embedded;
+import java.time.LocalDate;
+
+@Embeddable
+public class Brand {
+ private String name;
+ private LocalDate foundationDate;
+ @Embedded
+ private Address address;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public LocalDate getFoundationDate() {
+ return foundationDate;
+ }
+
+ public void setFoundationDate(LocalDate foundationDate) {
+ this.foundationDate = foundationDate;
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Car.java b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Car.java
new file mode 100644
index 0000000000..5421090e58
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Car.java
@@ -0,0 +1,54 @@
+package com.baeldung.attribute.override.entity;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.ElementCollection;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import java.util.Map;
+
+@Entity
+@AttributeOverride(name = "identifier", column = @Column(name = "VIN"))
+public class Car extends Vehicle {
+
+ private String model;
+ private String name;
+ @Embedded
+ @AttributeOverrides({
+ @AttributeOverride(name = "name", column = @Column(name = "BRAND_NAME", length = 5)),
+ @AttributeOverride(name = "address.name", column = @Column(name = "ADDRESS_NAME"))
+ })
+ private Brand brand;
+ @ElementCollection
+ @AttributeOverrides({
+ @AttributeOverride(name = "key.name", column = @Column(name = "OWNER_NAME")),
+ @AttributeOverride(name = "key.surname", column = @Column(name = "OWNER_SURNAME")),
+ @AttributeOverride(name = "value.name", column = @Column(name = "ADDRESS_NAME")),
+ })
+ Map owners;
+
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Brand getBrand() {
+ return brand;
+ }
+
+ public void setBrand(Brand brand) {
+ this.brand = brand;
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Owner.java b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Owner.java
new file mode 100644
index 0000000000..28ef6c7974
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Owner.java
@@ -0,0 +1,25 @@
+package com.baeldung.attribute.override.entity;
+
+import javax.persistence.Embeddable;
+
+@Embeddable
+public class Owner {
+ private String name;
+ private String surname;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getSurname() {
+ return surname;
+ }
+
+ public void setSurname(String surname) {
+ this.surname = surname;
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Vehicle.java b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Vehicle.java
new file mode 100644
index 0000000000..2d4c0c04b3
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/entity/Vehicle.java
@@ -0,0 +1,38 @@
+package com.baeldung.attribute.override.entity;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+
+@MappedSuperclass
+public class Vehicle {
+ @Id
+ @GeneratedValue
+ private Integer id;
+ private String identifier;
+ private Integer numberOfWheels;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getIdentifier() {
+ return identifier;
+ }
+
+ public void setIdentifier(String identifier) {
+ this.identifier = identifier;
+ }
+
+ public Integer getNumberOfWheels() {
+ return numberOfWheels;
+ }
+
+ public void setNumberOfWheels(Integer numberOfWheels) {
+ this.numberOfWheels = numberOfWheels;
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/repository/CarRepository.java b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/repository/CarRepository.java
new file mode 100644
index 0000000000..17cea77d89
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-annotations/src/main/java/com/baeldung/attribute/override/repository/CarRepository.java
@@ -0,0 +1,7 @@
+package com.baeldung.attribute.override.repository;
+
+import com.baeldung.attribute.override.entity.Car;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface CarRepository extends JpaRepository {
+}
diff --git a/persistence-modules/spring-data-jpa-annotations/src/test/java/com/baeldung/attribute/override/AttributeOverrideIntegrationTest.java b/persistence-modules/spring-data-jpa-annotations/src/test/java/com/baeldung/attribute/override/AttributeOverrideIntegrationTest.java
new file mode 100644
index 0000000000..4cc599c7de
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-annotations/src/test/java/com/baeldung/attribute/override/AttributeOverrideIntegrationTest.java
@@ -0,0 +1,56 @@
+package com.baeldung.attribute.override;
+
+import com.baeldung.Application;
+import com.baeldung.attribute.override.entity.Address;
+import com.baeldung.attribute.override.entity.Brand;
+import com.baeldung.attribute.override.entity.Car;
+import com.baeldung.attribute.override.repository.CarRepository;
+import org.assertj.core.api.Assertions;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDate;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = { Application.class })
+public class AttributeOverrideIntegrationTest {
+
+ private static final LocalDate FORD_FOUNDATION_DATE = LocalDate.parse("1903-06-16");
+ @Autowired
+ CarRepository carRepository;
+
+ @Test
+ @Transactional
+ public void whenInsertingCar_thenEmbeddedAndMappedFieldsArePopulated() {
+
+ Car fordMustang = createMustang();
+
+ carRepository.save(fordMustang);
+ Car actualCar = carRepository.getOne(fordMustang.getId());
+
+ Assertions.assertThat(actualCar).isEqualTo(fordMustang);
+ }
+
+ @NotNull
+ private Car createMustang() {
+ Address address = new Address();
+ address.setName("Ford United States");
+ address.setCity("Dearborn");
+
+ Brand ford = new Brand();
+ ford.setName("Ford");
+ ford.setFoundationDate(FORD_FOUNDATION_DATE);
+
+ Car fordMustang = new Car();
+ fordMustang.setIdentifier("WP1AB29P88LA47599");
+ fordMustang.setModel("Ford");
+ fordMustang.setName("My car");
+ fordMustang.setBrand(ford);
+ return fordMustang;
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-crud/README.md b/persistence-modules/spring-data-jpa-crud/README.md
index dc0c78c87e..81559bb773 100644
--- a/persistence-modules/spring-data-jpa-crud/README.md
+++ b/persistence-modules/spring-data-jpa-crud/README.md
@@ -10,6 +10,7 @@ This module contains articles about CRUD operations in Spring Data JPA
- [Batch Insert/Update with Hibernate/JPA](https://www.baeldung.com/jpa-hibernate-batch-insert-update)
- [Difference Between save() and saveAndFlush() in Spring Data JPA](https://www.baeldung.com/spring-data-jpa-save-saveandflush)
- [Generate Database Schema with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-generate-db-schema)
+- [How to Implement a Soft Delete with Spring JPA](https://www.baeldung.com/spring-jpa-soft-delete)
### Eclipse Config
After importing the project into Eclipse, you may see the following error:
diff --git a/persistence-modules/spring-data-jpa-crud/pom.xml b/persistence-modules/spring-data-jpa-crud/pom.xml
index 16ee74aa62..8f9a3cc0e8 100644
--- a/persistence-modules/spring-data-jpa-crud/pom.xml
+++ b/persistence-modules/spring-data-jpa-crud/pom.xml
@@ -1,7 +1,7 @@
4.0.0spring-data-jpa-crud
@@ -47,7 +47,6 @@
h2runtime
-
org.testcontainers
@@ -64,4 +63,4 @@
1.12.2
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/Product.java b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/Product.java
new file mode 100644
index 0000000000..ef06f77c45
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/Product.java
@@ -0,0 +1,68 @@
+package com.baeldung.softdelete;
+
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterDef;
+import org.hibernate.annotations.ParamDef;
+import org.hibernate.annotations.SQLDelete;
+
+@Entity
+@Table(name = "tbl_products")
+@SQLDelete(sql = "UPDATE tbl_products SET deleted = true WHERE id=?")
+@FilterDef(name = "deletedProductFilter", parameters = @ParamDef(name = "isDeleted", type = "boolean"))
+@Filter(name = "deletedProductFilter", condition = "deleted = :isDeleted")
+public class Product implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ private String name;
+
+ private double price;
+
+ private boolean deleted = Boolean.FALSE;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public double getPrice() {
+ return price;
+ }
+
+ public void setPrice(double price) {
+ this.price = price;
+ }
+
+ public boolean isDeleted() {
+ return deleted;
+ }
+
+ public void setDeleted(boolean deleted) {
+ this.deleted = deleted;
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductController.java b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductController.java
new file mode 100644
index 0000000000..ebfdfbb2e7
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductController.java
@@ -0,0 +1,34 @@
+package com.baeldung.softdelete;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/products")
+public class ProductController {
+
+ @Autowired
+ private ProductService productService;
+
+ @PostMapping
+ public Product createOne(@RequestBody Product product) {
+ return productService.create(product);
+ }
+
+ @DeleteMapping("/{id}")
+ public void removeOne(@PathVariable("id") Long id) {
+ productService.remove(id);
+ }
+
+ @GetMapping
+ public Iterable findAll(@RequestParam(value = "isDeleted", required = false, defaultValue = "false") boolean isDeleted) {
+ return productService.findAll(isDeleted);
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductRepository.java b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductRepository.java
new file mode 100644
index 0000000000..a305a142aa
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductRepository.java
@@ -0,0 +1,7 @@
+package com.baeldung.softdelete;
+
+import org.springframework.data.repository.CrudRepository;
+
+public interface ProductRepository extends CrudRepository{
+
+}
diff --git a/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductService.java b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductService.java
new file mode 100644
index 0000000000..82d02fa87c
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductService.java
@@ -0,0 +1,35 @@
+package com.baeldung.softdelete;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.Filter;
+import org.hibernate.Session;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ProductService {
+
+ @Autowired
+ private ProductRepository productRepository;
+
+ @Autowired
+ private EntityManager entityManager;
+
+ public Product create(Product product) {
+ return productRepository.save(product);
+ }
+
+ public void remove(Long id){
+ productRepository.deleteById(id);
+ }
+
+ public Iterable findAll(boolean isDeleted){
+ Session session = entityManager.unwrap(Session.class);
+ Filter filter = session.enableFilter("deletedProductFilter");
+ filter.setParameter("isDeleted", isDeleted);
+ Iterable products = productRepository.findAll();
+ session.disableFilter("deletedProductFilter");
+ return products;
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-crud/src/main/resources/application.properties b/persistence-modules/spring-data-jpa-crud/src/main/resources/application.properties
index af0df308cd..18ef8d4e60 100644
--- a/persistence-modules/spring-data-jpa-crud/src/main/resources/application.properties
+++ b/persistence-modules/spring-data-jpa-crud/src/main/resources/application.properties
@@ -5,10 +5,5 @@ spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.generate_statistics=true
-# JPA-Schema-Generation
-# Use below configuration to generate database schema create commands based on the entity models
-# and export them into the create.sql file
-#spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create
-#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=create.sql
-#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-source=metadata
-#spring.jpa.properties.hibernate.format_sql=true
\ No newline at end of file
+spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
+
diff --git a/persistence-modules/spring-data-jpa-enterprise/pom.xml b/persistence-modules/spring-data-jpa-enterprise/pom.xml
index 7ff2f00fdf..4367a11222 100644
--- a/persistence-modules/spring-data-jpa-enterprise/pom.xml
+++ b/persistence-modules/spring-data-jpa-enterprise/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-data-jpa-enterprise
@@ -12,58 +13,49 @@
0.0.1-SNAPSHOT../../parent-boot-2
-
+
org.springframework.bootspring-boot-starter-web
-
org.springframework.bootspring-boot-starter-data-jpa
-
org.springframework.bootspring-boot-starter-data-jdbc
-
org.springframework.bootspring-boot-starter-cache
-
com.h2databaseh2
-
-
+ org.hibernatehibernate-envers
-
com.google.guavaguava${guava.version}
-
org.mapstructmapstruct-jdk8${mapstruct.version}provided
-
org.springframework.securityspring-security-testtest
-
-
+
org.testcontainerspostgresql
@@ -78,7 +70,7 @@
maven-compiler-plugin
- 3.8.1
+ ${maven-compiler-plugin.version}1.81.8
@@ -86,7 +78,7 @@
org.mapstructmapstruct-processor
- 1.3.1.Final
+ ${mapstruct.version}
@@ -98,7 +90,6 @@
1.3.1.Final21.01.12.2
-
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-filtering/pom.xml b/persistence-modules/spring-data-jpa-filtering/pom.xml
index 25ef68fe4c..038fd24723 100644
--- a/persistence-modules/spring-data-jpa-filtering/pom.xml
+++ b/persistence-modules/spring-data-jpa-filtering/pom.xml
@@ -1,5 +1,6 @@
-4.0.0spring-data-jpa-filtering
@@ -25,12 +26,10 @@
org.hibernatehibernate-envers
-
com.h2databaseh2
-
org.testcontainers
@@ -38,13 +37,11 @@
${testcontainers.postgresql.version}test
-
org.postgresqlpostgresql
-
org.springframework.securityspring-security-test
@@ -59,7 +56,6 @@
spring-boot-starter-testtest
-
com.google.guavaguava
@@ -72,7 +68,6 @@
1.10.642.2.521.0
-
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-filtering/src/main/resources/logback.xml b/persistence-modules/spring-data-jpa-filtering/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-filtering/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-filtering/src/test/java/com/baeldung/projection/JpaProjectionIntegrationTest.java b/persistence-modules/spring-data-jpa-filtering/src/test/java/com/baeldung/projection/JpaProjectionIntegrationTest.java
index 96eaf4ed07..5fdcf6a787 100644
--- a/persistence-modules/spring-data-jpa-filtering/src/test/java/com/baeldung/projection/JpaProjectionIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-filtering/src/test/java/com/baeldung/projection/JpaProjectionIntegrationTest.java
@@ -6,18 +6,15 @@ import com.baeldung.projection.repository.PersonRepository;
import com.baeldung.projection.view.AddressView;
import com.baeldung.projection.view.PersonDto;
import com.baeldung.projection.view.PersonView;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.jdbc.Sql;
-import org.springframework.test.context.junit4.SpringRunner;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.AFTER_TEST_METHOD;
@DataJpaTest
-@RunWith(SpringRunner.class)
@Sql(scripts = "/projection-insert-data.sql")
@Sql(scripts = "/projection-clean-up-data.sql", executionPhase = AFTER_TEST_METHOD)
public class JpaProjectionIntegrationTest {
diff --git a/persistence-modules/spring-data-jpa-query-2/pom.xml b/persistence-modules/spring-data-jpa-query-2/pom.xml
index 282a1ff83a..96585d9325 100644
--- a/persistence-modules/spring-data-jpa-query-2/pom.xml
+++ b/persistence-modules/spring-data-jpa-query-2/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0spring-data-jpa-query-2spring-data-jpa-query-2
@@ -22,17 +22,14 @@
org.springframework.securityspring-security-core
-
com.h2databaseh2
-
com.fasterxml.jackson.corejackson-databind
-
org.hibernatehibernate-envers
@@ -90,4 +87,5 @@
5.2.10.Final
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-query/pom.xml b/persistence-modules/spring-data-jpa-query/pom.xml
index 1576fd729d..c231afdd17 100644
--- a/persistence-modules/spring-data-jpa-query/pom.xml
+++ b/persistence-modules/spring-data-jpa-query/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0spring-data-jpa-queryspring-data-jpa-query
@@ -18,23 +18,19 @@
org.springframework.bootspring-boot-starter-data-jpa
-
com.h2databaseh2
-
net.ttddyydatasource-proxy${datasource-proxy.version}
-
com.fasterxml.jackson.corejackson-databind
-
org.springframeworkspring-oxm
@@ -43,7 +39,6 @@
1.4.1
-
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-repo-2/pom.xml b/persistence-modules/spring-data-jpa-repo-2/pom.xml
index 3be1068d8c..b382e35e28 100644
--- a/persistence-modules/spring-data-jpa-repo-2/pom.xml
+++ b/persistence-modules/spring-data-jpa-repo-2/pom.xml
@@ -1,8 +1,10 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-data-jpa-repo-2
+ spring-data-jpa-repo-2com.baeldung
@@ -11,9 +13,6 @@
../../parent-boot-2
- spring-data-jpa-repo-2
- spring-data-jpa-repo-2
-
@@ -32,7 +31,6 @@
com.h2databaseh2
-
com.google.guava
@@ -43,6 +41,5 @@
29.0-jre
-
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-repo/pom.xml b/persistence-modules/spring-data-jpa-repo/pom.xml
index 16a214fd7f..26fff365a1 100644
--- a/persistence-modules/spring-data-jpa-repo/pom.xml
+++ b/persistence-modules/spring-data-jpa-repo/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-data-jpa-repospring-data-jpa-repo
@@ -17,39 +18,30 @@
org.springframework.bootspring-boot-starter-web
-
org.springframework.bootspring-boot-starter-data-jpa
-
org.springframework.bootspring-boot-starter-data-jdbc
-
mysqlmysql-connector-java
-
org.postgresqlpostgresql
-
com.h2databaseh2
-
org.springframeworkspring-oxm
-
-
-
\ No newline at end of file
diff --git a/persistence-modules/spring-data-keyvalue/pom.xml b/persistence-modules/spring-data-keyvalue/pom.xml
index 3aaee2f00c..aa2696dd12 100644
--- a/persistence-modules/spring-data-keyvalue/pom.xml
+++ b/persistence-modules/spring-data-keyvalue/pom.xml
@@ -1,5 +1,6 @@
-
+4.0.0spring-data-keyvaluespring-data-keyvalue
@@ -16,19 +17,13 @@
org.springframework.bootspring-boot-starter
-
org.springframework.dataspring-data-keyvalue
-
org.springframework.bootspring-boot-starter-test
-
-
-
-
\ No newline at end of file
diff --git a/persistence-modules/spring-data-mongodb/pom.xml b/persistence-modules/spring-data-mongodb/pom.xml
index 448b635667..ef5a0f0550 100644
--- a/persistence-modules/spring-data-mongodb/pom.xml
+++ b/persistence-modules/spring-data-mongodb/pom.xml
@@ -1,5 +1,6 @@
-4.0.0spring-data-mongodb
@@ -18,32 +19,27 @@
spring-data-mongodb${org.springframework.data.version}
-
org.mongodbmongodb-driver-sync${mongodb-driver.version}
-
org.mongodbmongodb-driver-reactivestreams${mongodb-reactivestreams.version}
-
io.projectreactorreactor-core${projectreactor.version}
-
io.projectreactorreactor-test${projectreactor.version}test
-
org.springframeworkspring-core
@@ -107,7 +103,6 @@
4.1.03.2.0.RELEASE4.0.5
-
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-neo4j/pom.xml b/persistence-modules/spring-data-neo4j/pom.xml
index d827c32a3c..8c5030779b 100644
--- a/persistence-modules/spring-data-neo4j/pom.xml
+++ b/persistence-modules/spring-data-neo4j/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-data-neo4j1.0
@@ -97,4 +98,4 @@
3.1.2
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-redis/pom.xml b/persistence-modules/spring-data-redis/pom.xml
index d271df31c7..5e17f27c06 100644
--- a/persistence-modules/spring-data-redis/pom.xml
+++ b/persistence-modules/spring-data-redis/pom.xml
@@ -1,5 +1,6 @@
-4.0.0spring-data-redis
@@ -32,7 +33,6 @@
reactor-testtest
-
org.springframeworkspring-test
@@ -42,7 +42,6 @@
spring-boot-starter-testtest
-
org.junit.jupiterjunit-jupiter-api
@@ -52,25 +51,21 @@
junit-platform-runnertest
-
cglibcglib-nodep${cglib.version}
-
redis.clientsjedisjar
-
com.lordofthejarsnosqlunit-redis${nosqlunit.version}
-
com.github.kstyrcembedded-redis
@@ -100,4 +95,4 @@
0.6
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-solr/pom.xml b/persistence-modules/spring-data-solr/pom.xml
index 38b5bf8238..d7523e6de2 100644
--- a/persistence-modules/spring-data-solr/pom.xml
+++ b/persistence-modules/spring-data-solr/pom.xml
@@ -1,5 +1,6 @@
-4.0.0spring-data-solr
@@ -45,7 +46,6 @@
2.0.5.RELEASE
-
\ No newline at end of file
diff --git a/persistence-modules/spring-hibernate-3/pom.xml b/persistence-modules/spring-hibernate-3/pom.xml
index b28895f86d..9b143597c7 100644
--- a/persistence-modules/spring-hibernate-3/pom.xml
+++ b/persistence-modules/spring-hibernate-3/pom.xml
@@ -1,5 +1,6 @@
-4.0.0spring-hibernate-3
@@ -84,4 +85,4 @@
19.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-hibernate-5/pom.xml b/persistence-modules/spring-hibernate-5/pom.xml
index 8a8b6c15e3..caa1598af4 100644
--- a/persistence-modules/spring-hibernate-5/pom.xml
+++ b/persistence-modules/spring-hibernate-5/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-hibernate-50.1-SNAPSHOT
@@ -13,9 +14,7 @@
-
-
org.springframeworkspring-context
@@ -32,9 +31,7 @@
spring-aspects${org.springframework.version}
-
-
org.springframeworkspring-orm
@@ -65,32 +62,25 @@
hibernate-search-orm${hibernatesearch.version}
-
org.apache.tomcattomcat-dbcp${tomcat-dbcp.version}
-
-
-
com.google.guavaguava${guava.version}
-
-
org.apache.commonscommons-lang3${commons-lang3.version}test
-
org.springframeworkspring-test
@@ -103,25 +93,21 @@
${org.springframework.security.version}test
-
org.hsqldbhsqldb${hsqldb.version}
-
mysqlmysql-connector-java${mysql-connector-java.version}
-
com.h2databaseh2${h2.version}
-
@@ -129,7 +115,6 @@
5.0.2.RELEASE1.10.6.RELEASE4.2.1.RELEASE
-
5.2.10.Final5.8.2.Final
@@ -137,9 +122,8 @@
9.0.0.M261.12.3.4
-
21.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-jdbc/pom.xml b/persistence-modules/spring-jdbc/pom.xml
index 8a5786e1a5..28a858dd43 100644
--- a/persistence-modules/spring-jdbc/pom.xml
+++ b/persistence-modules/spring-jdbc/pom.xml
@@ -1,8 +1,10 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-jdbc
+ spring-jdbccom.baeldung
@@ -11,9 +13,6 @@
../../parent-boot-2
- spring-jdbc
- spring-jdbc
-
org.springframework.data
@@ -34,6 +33,4 @@
-
-
\ No newline at end of file
diff --git a/persistence-modules/spring-jooq/README.md b/persistence-modules/spring-jooq/README.md
index 515ab8be3c..d0cb946614 100644
--- a/persistence-modules/spring-jooq/README.md
+++ b/persistence-modules/spring-jooq/README.md
@@ -5,6 +5,7 @@ This module contains articles about Spring with jOOQ
### Relevant Articles:
- [Spring Boot Support for jOOQ](https://www.baeldung.com/spring-boot-support-for-jooq)
- [Introduction to jOOQ with Spring](https://www.baeldung.com/jooq-with-spring)
+- [Count Query In jOOQ](https://www.baeldung.com/jooq-count-query)
In order to fix the error "Plugin execution not covered by lifecycle configuration: org.jooq:jooq-codegen-maven:3.7.3:generate (execution: default, phase: generate-sources)", right-click on the error message and choose "Mark goal generated as ignore in pom.xml". Until version 1.4.x, the maven-plugin-plugin was covered by the default lifecycle mapping that ships with m2e.
diff --git a/persistence-modules/spring-jooq/pom.xml b/persistence-modules/spring-jooq/pom.xml
index 6b3d565175..4c195a6c92 100644
--- a/persistence-modules/spring-jooq/pom.xml
+++ b/persistence-modules/spring-jooq/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-jooqspring-jooq
@@ -32,14 +33,12 @@
jooq${org.jooq.version}
-
com.h2databaseh2${h2.version}
-
org.springframework
@@ -63,7 +62,6 @@
org.springframework.bootspring-boot-starter-test
-
org.springframework
@@ -74,7 +72,6 @@
-
org.apache.maven.plugins
@@ -84,7 +81,6 @@
0
-
org.codehaus.mojoproperties-maven-plugin
@@ -103,7 +99,6 @@
-
org.codehaus.mojosql-maven-plugin
@@ -133,7 +128,6 @@
-
org.jooqjooq-codegen-maven
@@ -164,11 +158,11 @@
-
-
+
org.eclipse.m2elifecycle-mapping
diff --git a/persistence-modules/spring-jooq/src/test/java/com/baeldung/jooq/introduction/CountQueryIntegrationTest.java b/persistence-modules/spring-jooq/src/test/java/com/baeldung/jooq/introduction/CountQueryIntegrationTest.java
new file mode 100644
index 0000000000..7edcc2cd4b
--- /dev/null
+++ b/persistence-modules/spring-jooq/src/test/java/com/baeldung/jooq/introduction/CountQueryIntegrationTest.java
@@ -0,0 +1,96 @@
+package com.baeldung.jooq.introduction;
+
+import static com.baeldung.jooq.introduction.db.public_.tables.Author.AUTHOR;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jooq.Condition;
+import org.jooq.DSLContext;
+import org.jooq.Record2;
+import org.jooq.Result;
+import org.jooq.impl.DSL;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.transaction.annotation.Transactional;
+
+@ContextConfiguration(classes = PersistenceContextIntegrationTest.class)
+@Transactional(transactionManager = "transactionManager")
+@RunWith(SpringJUnit4ClassRunner.class)
+public class CountQueryIntegrationTest {
+
+ @Autowired
+ private DSLContext dsl;
+
+ @Test
+ public void givenValidData_whenSimpleSelect_thenSucceed() {
+ int count = dsl.select().from(AUTHOR).execute();
+ Assert.assertEquals(3, count);
+ }
+
+ @Test
+ public void givenValidData_whenSelectCount_thenSucceed() {
+ int count = dsl.selectCount().from(AUTHOR)
+ .where(AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan"))
+ .fetchOne(0, int.class);
+ Assert.assertEquals(1, count);
+ }
+
+ @Test
+ public void givenValidData_whenCount_thenSucceed() {
+ int count = dsl.select(DSL.count())
+ .from(AUTHOR).fetchOne(0, int.class);
+ Assert.assertEquals(3, count);
+ }
+
+ @Test
+ public void givenValidData_whenFetchCount_thenSucceed() {
+ int count = dsl.fetchCount(DSL.selectFrom(AUTHOR)
+ .where(AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan")));
+ Assert.assertEquals(1, count);
+ }
+
+ @Test
+ public void givenValidData_whenFetchCountWithoutCondition_thenSucceed() {
+ int count = dsl.fetchCount(DSL.selectFrom(AUTHOR));
+ Assert.assertEquals(3, count);
+ }
+
+ @Test
+ public void givenValidData_whenFetchCountWithSingleCondition_thenSucceed() {
+ int count = dsl.fetchCount(AUTHOR, AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan"));
+ Assert.assertEquals(1, count);
+ }
+
+ @Test
+ public void givenValidData_whenFetchCountWithMultipleConditions_thenSucceed() {
+ Condition firstCond = AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan");
+ Condition secondCond = AUTHOR.ID.notEqual(1);
+ List conditions = new ArrayList<>();
+ conditions.add(firstCond);
+ conditions.add(secondCond);
+ int count = dsl.fetchCount(AUTHOR, conditions);
+ Assert.assertEquals(1, count);
+ }
+
+ @Test
+ public void givenValidData_whenFetchCountWithConditionsInVarargs_thenSucceed() {
+ Condition firstCond = AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan");
+ Condition secondCond = AUTHOR.ID.notEqual(1);
+ int count = dsl.fetchCount(AUTHOR, firstCond, secondCond);
+ Assert.assertEquals(1, count);
+ }
+
+ @Test
+ public void givenValidData_whenCountwithGroupBy_thenSucceed() {
+ final Result> result = dsl.select(AUTHOR.FIRST_NAME, DSL.count())
+ .from(AUTHOR).groupBy(AUTHOR.FIRST_NAME).fetch();
+ Assert.assertEquals(3, result.size());
+ Assert.assertEquals(result.get(0).get(0), "Bert");
+ Assert.assertEquals(result.get(0).get(1), 1);
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-jpa-2/pom.xml b/persistence-modules/spring-jpa-2/pom.xml
index 7770c0e045..16168036be 100644
--- a/persistence-modules/spring-jpa-2/pom.xml
+++ b/persistence-modules/spring-jpa-2/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-jpa-20.1-SNAPSHOT
@@ -25,7 +26,6 @@
spring-boot-starter-data-jpa${spring-boot.version}
-
org.springframeworkspring-orm
@@ -42,7 +42,6 @@
spring-context${org.springframework.version}
-
org.hibernate
@@ -59,19 +58,12 @@
tomcat-dbcp${tomcat-dbcp.version}
-
com.google.guavaguava${guava.version}
-
- net.bytebuddy
- byte-buddy
- ${byte-buddy.version}
-
-
org.springframework.boot
@@ -84,20 +76,16 @@
${org.springframework.version}test
-
5.1.5.RELEASE2.2.6.RELEASE
-
9.0.0.M26
-
21.0
- 1.10.16
\ No newline at end of file
diff --git a/persistence-modules/spring-jpa/pom.xml b/persistence-modules/spring-jpa/pom.xml
index e389886d8d..1dca2baa98 100644
--- a/persistence-modules/spring-jpa/pom.xml
+++ b/persistence-modules/spring-jpa/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-jpa0.1-SNAPSHOT
@@ -36,9 +37,7 @@
spring-webmvc${org.springframework.version}
-
-
org.hibernatehibernate-core
@@ -70,9 +69,7 @@
h2${h2.version}
-
-
org.hibernatehibernate-validator
@@ -83,7 +80,6 @@
javax.el-api${javax.el-api.version}
-
javax.servlet
@@ -96,9 +92,7 @@
provided${javax.servlet.servlet-api.version}
-
-
com.google.guavaguava
@@ -109,41 +103,33 @@
assertj-core${assertj.version}
-
-
org.apache.commonscommons-lang3${commons-lang3.version}test
-
org.springframeworkspring-test${org.springframework.version}test
-
5.1.5.RELEASE3.21.0-GA
-
6.0.62.1.5.RELEASE
-
2.5
-
6.0.15.Final1.4.012.2.5
-
21.03.8.0
diff --git a/persistence-modules/spring-mybatis/pom.xml b/persistence-modules/spring-mybatis/pom.xml
index 40d4d915ab..9247d59fe4 100644
--- a/persistence-modules/spring-mybatis/pom.xml
+++ b/persistence-modules/spring-mybatis/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-mybatis0.1-SNAPSHOT
@@ -14,76 +15,61 @@
-
-
org.springframeworkspring-context${org.springframework.version}
-
org.springframeworkspring-beans${org.springframework.version}
-
-
org.mybatis.spring.bootmybatis-spring-boot-starter${mybatis-spring-boot-starter.version}
-
-
com.h2databaseh2${h2.version}
-
org.springframeworkspring-jdbc${org.springframework.version}
-
org.mybatismybatis${mybatis.version}
-
org.mybatismybatis-spring${spring-mybatis.version}
-
-
org.springframework.bootspring-boot-starter-test
-
org.springframeworkspring-test${org.springframework.version}test
-
org.assertjassertj-core${assertj-core.version}test
-
@@ -99,15 +85,13 @@
5.1.8.RELEASE
-
2.0.23.5.22.1.01.4.197
-
3.8.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-persistence-simple/pom.xml b/persistence-modules/spring-persistence-simple/pom.xml
index 13898d01e7..437a439b99 100644
--- a/persistence-modules/spring-persistence-simple/pom.xml
+++ b/persistence-modules/spring-persistence-simple/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-persistence-simple0.1-SNAPSHOT
@@ -24,7 +25,6 @@
spring-context${org.springframework.version}
-
javax.persistence
@@ -57,14 +57,12 @@
${h2.version}test
-
com.github.h-thurowsimple-jndi${simple-jndi.version}
-
org.springframework
@@ -100,4 +98,5 @@
3.3.3
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index f202430ccf..ccf9f86a55 100644
--- a/pom.xml
+++ b/pom.xml
@@ -412,6 +412,7 @@
google-web-toolkit
+
graphql/graphql-javagrpc
@@ -531,7 +532,7 @@
protobufferquarkus
-
+ quarkus-extensionrabbitmq
@@ -614,13 +615,15 @@
spring-aopspring-apache-camel
- spring-batch
- spring-batch-2
+ spring-batch
+ spring-batch-2spring-bomspring-boot-modulesspring-boot-rest
+ spring-boot-rest-2spring-caching
+ spring-caching-2spring-cloudspring-cloud-bus
@@ -875,6 +878,7 @@
google-web-toolkit
+
graphql/graphql-javagrpc
@@ -930,6 +934,7 @@
joobyjsfjson
+ json-2json-pathjsoupjta
@@ -992,7 +997,7 @@
protobufferquarkus
-
+ quarkus-extensionrabbitmq
@@ -1068,11 +1073,14 @@
spring-apache-camelspring-batch
+ spring-batch-2spring-bomspring-boot-modulesspring-boot-rest
+ spring-boot-rest-2spring-caching
+ spring-caching-2spring-cloudspring-cloud-bus
@@ -1089,6 +1097,7 @@
spring-data-restspring-data-rest-querydslspring-di
+ spring-di-2spring-droolsspring-ejb
@@ -1267,13 +1276,14 @@
+ spring-boot-modules/spring-boot-cassandrecore-java-modules/core-java-9core-java-modules/core-java-9-improvementscore-java-modules/core-java-9-jigsawcore-java-modules/core-java-9-streamscore-java-modules/core-java-10
- core-java-modules/core-java-11
+ core-java-modules/core-java-11-2
@@ -1283,6 +1293,7 @@
core-java-modules/core-java-datetime-stringcore-java-modules/core-java-jpmscore-java-modules/core-java-os
+ core-java-modules/core-java-string-operations-3core-java-modules/core-java-time-measurementscore-java-modules/multimodulemavenproject
@@ -1318,6 +1329,7 @@
core-java-modules/core-java-9-streamscore-java-modules/core-java-10core-java-modules/core-java-11
+ core-java-modules/core-java-11-2
@@ -1327,8 +1339,10 @@
core-java-modules/core-java-datetime-stringcore-java-modules/core-java-jpmscore-java-modules/core-java-os
+ core-java-modules/core-java-string-operations-3core-java-modules/core-java-time-measurementscore-java-modules/multimodulemavenproject
+ core-java-modules/core-java-strings
@@ -1351,13 +1365,13 @@
falsefalsefalse
- true
+ true4.122.21.33.3.0
- 1.10.5
+ 1.10.221.7.30
@@ -1367,13 +1381,12 @@
2.21.03.8.1
- 1.6.0
+ 3.0.01.81.2.172.2.2.0
- 1.19
- 1.19
- 1.6.0
+ 1.28
+ 1.282.21.02.8.02.6
@@ -1395,7 +1408,7 @@
3.0.03.13.0
- 1.16.12
+ 1.18.201.4.197
diff --git a/protobuffer/pom.xml b/protobuffer/pom.xml
index e57495e93c..cf8dbe417e 100644
--- a/protobuffer/pom.xml
+++ b/protobuffer/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0protobufferprotobuffer
diff --git a/quarkus-extension/pom.xml b/quarkus-extension/pom.xml
index 394376e59e..c2ae66a3a0 100644
--- a/quarkus-extension/pom.xml
+++ b/quarkus-extension/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldung.quarkus.extensionquarkus-extension
@@ -14,10 +14,10 @@
parent-modules1.0.0-SNAPSHOT
-
+
quarkus-liquibasequarkus-app
-
+
\ No newline at end of file
diff --git a/quarkus-extension/quarkus-app/pom.xml b/quarkus-extension/quarkus-app/pom.xml
index 6d3f4c7c28..f609261c5a 100644
--- a/quarkus-extension/quarkus-app/pom.xml
+++ b/quarkus-extension/quarkus-app/pom.xml
@@ -1,7 +1,7 @@
-
+4.0.0com.baeldung.quarkus.appquarkus-app
@@ -27,7 +27,7 @@
com.baeldung.quarkus.liquibase
- quarkus-liquibase-runtime
+ runtime${project.version}
@@ -57,4 +57,4 @@
1.0.0.Final
-
+
\ No newline at end of file
diff --git a/quarkus-extension/quarkus-liquibase/deployment/pom.xml b/quarkus-extension/quarkus-liquibase/deployment/pom.xml
index d7f1f995ff..9a9e4485cd 100644
--- a/quarkus-extension/quarkus-liquibase/deployment/pom.xml
+++ b/quarkus-extension/quarkus-liquibase/deployment/pom.xml
@@ -1,8 +1,9 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ com.baeldung.quarkus.liquibasedeploymentdeployment
@@ -30,7 +31,7 @@
com.baeldung.quarkus.liquibase
- quarkus-liquibase-runtime
+ runtime${project.version}
@@ -58,4 +59,4 @@
3.8.1
-
+
\ No newline at end of file
diff --git a/quarkus-extension/quarkus-liquibase/pom.xml b/quarkus-extension/quarkus-liquibase/pom.xml
index fdede2000e..1a86aeb75c 100644
--- a/quarkus-extension/quarkus-liquibase/pom.xml
+++ b/quarkus-extension/quarkus-liquibase/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0com.baeldung.quarkus.liquibasequarkus-liquibase
@@ -13,7 +13,7 @@
quarkus-extension1.0-SNAPSHOT
-
+
runtimedeployment
@@ -23,4 +23,4 @@
1.0.0.Final
-
+
\ No newline at end of file
diff --git a/quarkus-extension/quarkus-liquibase/runtime/pom.xml b/quarkus-extension/quarkus-liquibase/runtime/pom.xml
index 5d3b05ef92..6656556c4b 100644
--- a/quarkus-extension/quarkus-liquibase/runtime/pom.xml
+++ b/quarkus-extension/quarkus-liquibase/runtime/pom.xml
@@ -1,7 +1,9 @@
-4.0.0
+ com.baeldung.quarkus.liquibaseruntimeruntime
@@ -41,7 +43,7 @@
extension-descriptor
- ${project.groupId}:quarkus-liquibase-deployment:${project.version}
+ ${project.groupId}:deployment:${project.version}
@@ -70,4 +72,4 @@
3.8.1
-
+
\ No newline at end of file
diff --git a/quarkus/pom.xml b/quarkus/pom.xml
index 9c14afca3c..6e250a2858 100644
--- a/quarkus/pom.xml
+++ b/quarkus/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.baeldung.quarkusquarkus
@@ -97,7 +98,6 @@
maven-surefire-plugin
- ${surefire-plugin.version}1true
@@ -136,7 +136,6 @@
maven-failsafe-plugin
- ${surefire-plugin.version}
@@ -157,9 +156,8 @@
- 2.22.01.7.0.Final5.6.0
-
+
\ No newline at end of file
diff --git a/rabbitmq/pom.xml b/rabbitmq/pom.xml
index 33ccf5402f..8a707a15dd 100644
--- a/rabbitmq/pom.xml
+++ b/rabbitmq/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0rabbitmq0.1-SNAPSHOT
diff --git a/ratpack/pom.xml b/ratpack/pom.xml
index 9ad654fa7d..c57934d8b7 100644
--- a/ratpack/pom.xml
+++ b/ratpack/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0ratpack1.0-SNAPSHOT
@@ -93,4 +94,4 @@
1.6.1
-
+
\ No newline at end of file
diff --git a/reactive-systems/inventory-service/pom.xml b/reactive-systems/inventory-service/pom.xml
index 4c04afb5cb..86575d498c 100644
--- a/reactive-systems/inventory-service/pom.xml
+++ b/reactive-systems/inventory-service/pom.xml
@@ -15,10 +15,6 @@
../../parent-boot-2
-
- 1.8
-
-
org.springframework.boot
@@ -32,7 +28,6 @@
org.springframework.kafkaspring-kafka
-
org.projectlomboklombok
@@ -69,4 +64,5 @@
+
\ No newline at end of file
diff --git a/reactive-systems/order-service/pom.xml b/reactive-systems/order-service/pom.xml
index c793f448b5..e6453732b4 100644
--- a/reactive-systems/order-service/pom.xml
+++ b/reactive-systems/order-service/pom.xml
@@ -15,10 +15,6 @@
../../parent-boot-2
-
- 1.8
-
-
org.springframework.boot
@@ -32,7 +28,6 @@
org.springframework.kafkaspring-kafka
-
org.projectlomboklombok
@@ -70,4 +65,4 @@
-
+
\ No newline at end of file
diff --git a/reactive-systems/pom.xml b/reactive-systems/pom.xml
index bce2575d9e..81462090b8 100644
--- a/reactive-systems/pom.xml
+++ b/reactive-systems/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0reactive-systems0.0.1-SNAPSHOT
@@ -19,4 +20,4 @@
order-service
-
+
\ No newline at end of file
diff --git a/reactive-systems/shipping-service/pom.xml b/reactive-systems/shipping-service/pom.xml
index 72487e691e..f725ca72d1 100644
--- a/reactive-systems/shipping-service/pom.xml
+++ b/reactive-systems/shipping-service/pom.xml
@@ -15,10 +15,6 @@
../../parent-boot-2
-
- 1.8
-
-
org.springframework.boot
@@ -28,12 +24,10 @@
org.springframework.kafkaspring-kafka
-
com.fasterxml.jackson.corejackson-databind
-
org.projectlomboklombok
@@ -71,4 +65,4 @@
-
+
\ No newline at end of file
diff --git a/reactor-core/README.md b/reactor-core/README.md
index 0214aa26fd..21ccc1ed92 100644
--- a/reactor-core/README.md
+++ b/reactor-core/README.md
@@ -8,3 +8,5 @@ This module contains articles about Reactor Core.
- [Combining Publishers in Project Reactor](https://www.baeldung.com/reactor-combine-streams)
- [Programmatically Creating Sequences with Project Reactor](https://www.baeldung.com/flux-sequences-reactor)
- [How to Extract a Mono’s Content in Java](https://www.baeldung.com/java-string-from-mono)
+- [How to Convert Mono> Into Flux](https://www.baeldung.com/java-mono-list-to-flux)
+- [Project Reactor: map() vs flatMap()](https://www.baeldung.com/java-reactor-map-flatmap)
diff --git a/reactor-core/pom.xml b/reactor-core/pom.xml
index 317cbde6e2..6eead97bc2 100644
--- a/reactor-core/pom.xml
+++ b/reactor-core/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0org.baeldungreactor-core
@@ -38,4 +39,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/reactor-core/src/test/java/com/baeldung/mono/MonoUnitTest.java b/reactor-core/src/test/java/com/baeldung/mono/MonoUnitTest.java
index f9e67b0a2f..0c6e0c07ef 100644
--- a/reactor-core/src/test/java/com/baeldung/mono/MonoUnitTest.java
+++ b/reactor-core/src/test/java/com/baeldung/mono/MonoUnitTest.java
@@ -1,10 +1,14 @@
package com.baeldung.mono;
import org.junit.Test;
+import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
+import reactor.test.StepVerifier;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Optional;
import static org.junit.Assert.assertEquals;
@@ -40,4 +44,40 @@ public class MonoUnitTest {
// blocking
return Mono.just("Hello world!");
}
+
+ @Test
+ public void whenMonoProducesListOfElements_thenConvertToFluxofElements() {
+
+ Mono> monoList = monoOfList();
+
+ StepVerifier.create(monoTofluxUsingFlatMapIterable(monoList))
+ .expectNext("one", "two", "three", "four")
+ .verifyComplete();
+
+ StepVerifier.create(monoTofluxUsingFlatMapMany(monoList))
+ .expectNext("one", "two", "three", "four")
+ .verifyComplete();
+ }
+
+ private Flux monoTofluxUsingFlatMapIterable(Mono> monoList) {
+ return monoList
+ .flatMapIterable(list -> list)
+ .log();
+ }
+
+ private Flux monoTofluxUsingFlatMapMany(Mono> monoList) {
+ return monoList
+ .flatMapMany(Flux::fromIterable)
+ .log();
+ }
+
+ private Mono> monoOfList() {
+ List list = new ArrayList<>();
+ list.add("one");
+ list.add("two");
+ list.add("three");
+ list.add("four");
+
+ return Mono.just(list);
+ }
}
diff --git a/reactor-core/src/test/java/com/baeldung/reactor/mapping/MappingUnitTest.java b/reactor-core/src/test/java/com/baeldung/reactor/mapping/MappingUnitTest.java
new file mode 100644
index 0000000000..137bcbe021
--- /dev/null
+++ b/reactor-core/src/test/java/com/baeldung/reactor/mapping/MappingUnitTest.java
@@ -0,0 +1,37 @@
+package com.baeldung.reactor.mapping;
+
+import org.junit.Test;
+import org.reactivestreams.Publisher;
+import reactor.core.publisher.Flux;
+import reactor.test.StepVerifier;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Function;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class MappingUnitTest {
+ @Test
+ public void givenInputStream_whenCallingTheMapOperator_thenItemsAreTransformed() {
+ Function mapper = String::toUpperCase;
+ Flux inFlux = Flux.just("baeldung", ".", "com");
+ Flux outFlux = inFlux.map(mapper);
+
+ StepVerifier.create(outFlux)
+ .expectNext("BAELDUNG", ".", "COM")
+ .expectComplete()
+ .verify();
+ }
+
+ @Test
+ public void givenInputStream_whenCallingTheFlatMapOperator_thenItemsAreFlatten() {
+ Function> mapper = s -> Flux.just(s.toUpperCase().split(""));
+ Flux inFlux = Flux.just("baeldung", ".", "com");
+ Flux outFlux = inFlux.flatMap(mapper);
+
+ List output = new ArrayList<>();
+ outFlux.subscribe(output::add);
+ assertThat(output).containsExactlyInAnyOrder("B", "A", "E", "L", "D", "U", "N", "G", ".", "C", "O", "M");
+ }
+}
diff --git a/resteasy/pom.xml b/resteasy/pom.xml
index ffb6adb3df..d35fc852ba 100644
--- a/resteasy/pom.xml
+++ b/resteasy/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0resteasy1.0
@@ -26,27 +27,22 @@
-
org.jboss.resteasyresteasy-client${resteasy.version}
-
-
org.jboss.resteasyresteasy-jaxb-provider${resteasy.version}
-
org.jboss.resteasyresteasy-jackson-provider${resteasy.version}
-
commons-iocommons-io
diff --git a/rsocket/pom.xml b/rsocket/pom.xml
index 5b407c2bd0..57c927253f 100644
--- a/rsocket/pom.xml
+++ b/rsocket/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0rsocket0.0.1-SNAPSHOT
@@ -30,4 +31,4 @@
0.11.13
-
+
\ No newline at end of file
diff --git a/rule-engines/easy-rules/pom.xml b/rule-engines/easy-rules/pom.xml
index b9661cd1c3..a8159f2813 100644
--- a/rule-engines/easy-rules/pom.xml
+++ b/rule-engines/easy-rules/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.baeldung.easyruleseasy-rules
@@ -25,4 +26,4 @@
3.0.0
-
+
\ No newline at end of file
diff --git a/rule-engines/jess/pom.xml b/rule-engines/jess/pom.xml
index 40d50fae70..f5db0374ef 100644
--- a/rule-engines/jess/pom.xml
+++ b/rule-engines/jess/pom.xml
@@ -1,9 +1,8 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
com.baeldung.rules.jessjess1.0-SNAPSHOT
diff --git a/rule-engines/openl-tablets/pom.xml b/rule-engines/openl-tablets/pom.xml
index 25c4b8365a..03b286e409 100644
--- a/rule-engines/openl-tablets/pom.xml
+++ b/rule-engines/openl-tablets/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.baeldung.openltabletsopenl-tablets
@@ -30,4 +31,4 @@
5.19.4
-
+
\ No newline at end of file
diff --git a/rule-engines/pom.xml b/rule-engines/pom.xml
index 27748a5c3e..db6b2e47ef 100644
--- a/rule-engines/pom.xml
+++ b/rule-engines/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0rule-enginesrule-engines
@@ -19,4 +20,4 @@
-
+
\ No newline at end of file
diff --git a/rule-engines/rulebook/pom.xml b/rule-engines/rulebook/pom.xml
index 95ededa5f9..55b77c50df 100644
--- a/rule-engines/rulebook/pom.xml
+++ b/rule-engines/rulebook/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.baeldung.rulebookrulebook
@@ -25,4 +26,4 @@
0.6.2
-
+
\ No newline at end of file
diff --git a/rxjava-core/pom.xml b/rxjava-core/pom.xml
index daec1f783f..cd6075e127 100644
--- a/rxjava-core/pom.xml
+++ b/rxjava-core/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0rxjava-core1.0-SNAPSHOT
diff --git a/rxjava-libraries/pom.xml b/rxjava-libraries/pom.xml
index 45c1907a58..5d2c9ec3bb 100644
--- a/rxjava-libraries/pom.xml
+++ b/rxjava-libraries/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0rxjava-libraries1.0-SNAPSHOT
diff --git a/rxjava-observables/pom.xml b/rxjava-observables/pom.xml
index 3cedfc4afc..feb4fc1f39 100644
--- a/rxjava-observables/pom.xml
+++ b/rxjava-observables/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0rxjava-observables1.0-SNAPSHOT
diff --git a/rxjava-operators/pom.xml b/rxjava-operators/pom.xml
index 8064613f45..ba85dc428b 100644
--- a/rxjava-operators/pom.xml
+++ b/rxjava-operators/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0rxjava-operators1.0-SNAPSHOT
diff --git a/saas/pom.xml b/saas/pom.xml
index be5d18f020..87f273939c 100644
--- a/saas/pom.xml
+++ b/saas/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0saas0.1.0-SNAPSHOT
@@ -35,12 +36,10 @@
true
-
org.codehaus.mojoexec-maven-plugin
- ${exec-maven-plugin.version}javacom.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
@@ -48,7 +47,7 @@
-Xmx300m-XX:+UseParallelGC-classpath
-
+ com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
diff --git a/slack/pom.xml b/slack/pom.xml
index ebe5ce2f60..690bf5132c 100644
--- a/slack/pom.xml
+++ b/slack/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.baeldung.examplesslack
@@ -45,7 +46,6 @@
org.codehaus.mojoexec-maven-plugin
- 1.6.0com.baeldung.examples.slack.MainClass
@@ -58,4 +58,4 @@
2.4
-
+
\ No newline at end of file
diff --git a/software-security/sql-injection-samples/pom.xml b/software-security/sql-injection-samples/pom.xml
index 6cacaa4ad0..7953e43ebe 100644
--- a/software-security/sql-injection-samples/pom.xml
+++ b/software-security/sql-injection-samples/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0sql-injection-samples0.0.1-SNAPSHOT
diff --git a/spark-java/pom.xml b/spark-java/pom.xml
index 686cf75058..b5538b4ec3 100644
--- a/spark-java/pom.xml
+++ b/spark-java/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spark-java0.1.0-SNAPSHOT
@@ -32,4 +33,4 @@
2.8.0
-
+
\ No newline at end of file
diff --git a/spf4j/pom.xml b/spf4j/pom.xml
index b0568e9f7a..6d325947cf 100644
--- a/spf4j/pom.xml
+++ b/spf4j/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.baeldung.spf4jspf4j
@@ -18,4 +19,4 @@
spf4j-aspects-app
-
+
\ No newline at end of file
diff --git a/spf4j/spf4j-aspects-app/pom.xml b/spf4j/spf4j-aspects-app/pom.xml
index 24a419233e..4a4c7cb804 100644
--- a/spf4j/spf4j-aspects-app/pom.xml
+++ b/spf4j/spf4j-aspects-app/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0spf4j-aspects-app0.0.1-SNAPSHOT
@@ -87,4 +87,4 @@
3.1.1
-
+
\ No newline at end of file
diff --git a/spf4j/spf4j-core-app/pom.xml b/spf4j/spf4j-core-app/pom.xml
index 280a59e0d9..2961174a35 100644
--- a/spf4j/spf4j-core-app/pom.xml
+++ b/spf4j/spf4j-core-app/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0spf4j-core-app0.0.1-SNAPSHOT
@@ -87,4 +87,4 @@
3.1.1
-
+
\ No newline at end of file
diff --git a/spring-4/pom.xml b/spring-4/pom.xml
index cd6b232317..21de925d99 100644
--- a/spring-4/pom.xml
+++ b/spring-4/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-4spring-4
@@ -8,7 +9,7 @@
jar
-
+
com.baeldungparent-boot-10.0.1-SNAPSHOT
@@ -83,7 +84,6 @@
${easymock.version}test
-
org.hsqldbhsqldb
@@ -115,4 +115,4 @@
2.4.0
-
+
\ No newline at end of file
diff --git a/spring-5-data-reactive/pom.xml b/spring-5-data-reactive/pom.xml
index 0fb689f16d..5f12636280 100644
--- a/spring-5-data-reactive/pom.xml
+++ b/spring-5-data-reactive/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-5-data-reactivespring-5-data-reactive
@@ -44,7 +45,6 @@
io.reactivex.rxjava2rxjava
-
org.springframeworkspring-test
@@ -59,18 +59,15 @@
de.flapdoodle.embed.mongotest
-
org.springframework.bootspring-boot-starter-webflux
-
org.springframeworkspring-tx${spring-tx.version}
-
org.springframework.dataspring-data-r2dbc
@@ -118,14 +115,12 @@
${java.version}
-
+
default-compilenone
-
+
default-testCompilenone
@@ -160,5 +155,4 @@
2.2.6.RELEASE
-
-
+
\ No newline at end of file
diff --git a/spring-5-reactive-2/README.md b/spring-5-reactive-2/README.md
index 397f6be57c..98a5f26433 100644
--- a/spring-5-reactive-2/README.md
+++ b/spring-5-reactive-2/README.md
@@ -9,4 +9,5 @@ This module contains articles about reactive Spring 5
- [Debugging Reactive Streams in Java](https://www.baeldung.com/spring-debugging-reactive-streams)
- [Static Content in Spring WebFlux](https://www.baeldung.com/spring-webflux-static-content)
- [Server-Sent Events in Spring](https://www.baeldung.com/spring-server-sent-events)
+- [Backpressure Mechanism in Spring WebFlux](https://www.baeldung.com/spring-webflux-backpressure)
- More articles: [[<-- prev]](/spring-5-reactive)
diff --git a/spring-5-reactive-2/pom.xml b/spring-5-reactive-2/pom.xml
index 093be0f03c..0758365932 100644
--- a/spring-5-reactive-2/pom.xml
+++ b/spring-5-reactive-2/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-5-reactive-20.0.1-SNAPSHOT
@@ -33,19 +34,16 @@
reactor-spring${reactor-spring.version}
-
org.projectlomboklombokprovided
-
org.springframework.bootspring-boot-starter-testtest
-
com.github.tomakehurstwiremock-jre8
@@ -82,4 +80,4 @@
2.24.0
-
+
\ No newline at end of file
diff --git a/spring-5-reactive-2/src/test/java/com/baeldung/backpressure/BackpressureUnitTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/backpressure/BackpressureUnitTest.java
new file mode 100644
index 0000000000..e7cb60dbf9
--- /dev/null
+++ b/spring-5-reactive-2/src/test/java/com/baeldung/backpressure/BackpressureUnitTest.java
@@ -0,0 +1,82 @@
+package com.baeldung.backpressure;
+
+import org.junit.jupiter.api.Test;
+import reactor.core.publisher.BaseSubscriber;
+import reactor.core.publisher.Flux;
+import reactor.test.StepVerifier;
+
+public class BackpressureUnitTest {
+
+ @Test
+ public void whenLimitRateSet_thenSplitIntoChunks() throws InterruptedException {
+ Flux limit = Flux.range(1, 25);
+
+ limit.limitRate(10);
+ limit.subscribe(
+ value -> System.out.println(value),
+ err -> err.printStackTrace(),
+ () -> System.out.println("Finished!!"),
+ subscription -> subscription.request(15)
+ );
+
+ StepVerifier.create(limit)
+ .expectSubscription()
+ .thenRequest(15)
+ .expectNext(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
+ .expectNext(11, 12, 13, 14, 15)
+ .thenRequest(10)
+ .expectNext(16, 17, 18, 19, 20, 21, 22, 23, 24, 25)
+ .verifyComplete();
+ }
+
+ @Test
+ public void whenRequestingChunks10_thenMessagesAreReceived() {
+ Flux request = Flux.range(1, 50);
+
+ request.subscribe(
+ System.out::println,
+ err -> err.printStackTrace(),
+ () -> System.out.println("All 50 items have been successfully processed!!!"),
+ subscription -> {
+ for (int i = 0; i < 5; i++) {
+ System.out.println("Requesting the next 10 elements!!!");
+ subscription.request(10);
+ }
+ }
+ );
+
+ StepVerifier.create(request)
+ .expectSubscription()
+ .thenRequest(10)
+ .expectNext(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
+ .thenRequest(10)
+ .expectNext(11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
+ .thenRequest(10)
+ .expectNext(21, 22, 23, 24, 25, 26, 27 , 28, 29 ,30)
+ .thenRequest(10)
+ .expectNext(31, 32, 33, 34, 35, 36, 37 , 38, 39 ,40)
+ .thenRequest(10)
+ .expectNext(41, 42, 43, 44, 45, 46, 47 , 48, 49 ,50)
+ .verifyComplete();
+ }
+
+ @Test
+ public void whenCancel_thenSubscriptionFinished() {
+ Flux cancel = Flux.range(1, 10).log();
+
+ cancel.subscribe(new BaseSubscriber() {
+ @Override
+ protected void hookOnNext(Integer value) {
+ request(3);
+ System.out.println(value);
+ cancel();
+ }
+ });
+
+ StepVerifier.create(cancel)
+ .expectNext(1, 2, 3)
+ .thenCancel()
+ .verify();
+ }
+}
+
diff --git a/spring-5-reactive-client/pom.xml b/spring-5-reactive-client/pom.xml
index 66861a3bb6..136f31b49e 100644
--- a/spring-5-reactive-client/pom.xml
+++ b/spring-5-reactive-client/pom.xml
@@ -1,6 +1,5 @@
-4.0.0
@@ -72,7 +71,6 @@
${okhttp.version}test
-
org.springframework.boot
@@ -84,7 +82,6 @@
h2runtime
-
org.springframeworkspring-test
@@ -100,14 +97,12 @@
2.26.0test
-
org.apache.commonscommons-collections4${commons-collections4.version}test
-
org.projectlomboklombok
@@ -150,21 +145,6 @@
1.8
-
- maven-surefire-plugin
- 2.22.0
-
-
- maven-surefire-plugin
- 2.19.1
-
-
- org.junit.platform
- junit-platform-surefire-provider
- 1.0.1
-
-
-
@@ -178,4 +158,4 @@
4.0.1
-
+
\ No newline at end of file
diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/webclient/timeout/WebClientTimeoutProvider.java b/spring-5-reactive-client/src/main/java/com/baeldung/webclient/timeout/WebClientTimeoutProvider.java
new file mode 100644
index 0000000000..6bb5a2db38
--- /dev/null
+++ b/spring-5-reactive-client/src/main/java/com/baeldung/webclient/timeout/WebClientTimeoutProvider.java
@@ -0,0 +1,89 @@
+package com.baeldung.webclient.timeout;
+
+import io.netty.channel.ChannelOption;
+import io.netty.channel.epoll.EpollChannelOption;
+import io.netty.handler.ssl.SslContextBuilder;
+import io.netty.handler.timeout.ReadTimeoutHandler;
+import io.netty.handler.timeout.WriteTimeoutHandler;
+import lombok.experimental.UtilityClass;
+import org.springframework.http.client.reactive.ReactorClientHttpConnector;
+import org.springframework.web.reactive.function.client.WebClient;
+import reactor.netty.http.client.HttpClient;
+import reactor.netty.tcp.SslProvider;
+import reactor.netty.transport.ProxyProvider;
+
+import java.time.Duration;
+import java.util.concurrent.TimeUnit;
+
+@UtilityClass
+public class WebClientTimeoutProvider {
+
+ public static WebClient defaultWebClient() {
+ HttpClient httpClient = HttpClient.create();
+
+ return buildWebClient(httpClient);
+ }
+
+ public WebClient responseTimeoutClient() {
+ HttpClient httpClient = HttpClient.create()
+ .responseTimeout(Duration.ofSeconds(1));
+
+ return buildWebClient(httpClient);
+ }
+
+ public WebClient connectionTimeoutClient() {
+ HttpClient httpClient = HttpClient.create()
+ .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000);
+
+ return buildWebClient(httpClient);
+ }
+
+ public WebClient connectionTimeoutWithKeepAliveClient() {
+ HttpClient httpClient = HttpClient.create()
+ .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000)
+ .option(ChannelOption.SO_KEEPALIVE, true)
+ .option(EpollChannelOption.TCP_KEEPIDLE, 300)
+ .option(EpollChannelOption.TCP_KEEPINTVL, 60)
+ .option(EpollChannelOption.TCP_KEEPCNT, 8);
+
+ return buildWebClient(httpClient);
+ }
+
+ public WebClient readWriteTimeoutClient() {
+ HttpClient httpClient = HttpClient.create()
+ .doOnConnected(conn -> conn
+ .addHandler(new ReadTimeoutHandler(5, TimeUnit.SECONDS))
+ .addHandler(new WriteTimeoutHandler(5)));
+
+ return buildWebClient(httpClient);
+ }
+
+ public WebClient sslTimeoutClient() {
+ HttpClient httpClient = HttpClient.create()
+ .secure(spec -> spec
+ .sslContext(SslContextBuilder.forClient())
+ .defaultConfiguration(SslProvider.DefaultConfigurationType.TCP)
+ .handshakeTimeout(Duration.ofSeconds(30))
+ .closeNotifyFlushTimeout(Duration.ofSeconds(10))
+ .closeNotifyReadTimeout(Duration.ofSeconds(10)));
+
+ return buildWebClient(httpClient);
+ }
+
+ public WebClient proxyTimeoutClient() {
+ HttpClient httpClient = HttpClient.create()
+ .proxy(spec -> spec
+ .type(ProxyProvider.Proxy.HTTP)
+ .host("http://proxy")
+ .port(8080)
+ .connectTimeoutMillis(3000));
+
+ return buildWebClient(httpClient);
+ }
+
+ private WebClient buildWebClient(HttpClient httpClient) {
+ return WebClient.builder()
+ .clientConnector(new ReactorClientHttpConnector(httpClient))
+ .build();
+ }
+}
diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java
index bb4e682481..dabfd22056 100644
--- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java
+++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java
@@ -146,7 +146,7 @@ public class WebClientLoggingIntegrationTest {
.exchange()
.block();
- verify(mockAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains("domain=.typicode.com;")));
+ verify(mockAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleUrl)));
}
diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/webclient/timeout/WebClientTimeoutIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/webclient/timeout/WebClientTimeoutIntegrationTest.java
new file mode 100644
index 0000000000..d2e009fe6a
--- /dev/null
+++ b/spring-5-reactive-client/src/test/java/com/baeldung/webclient/timeout/WebClientTimeoutIntegrationTest.java
@@ -0,0 +1,129 @@
+package com.baeldung.webclient.timeout;
+
+import com.github.tomakehurst.wiremock.WireMockServer;
+import io.netty.handler.timeout.ReadTimeoutException;
+import lombok.val;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.reactive.function.client.WebClientRequestException;
+import reactor.core.publisher.Mono;
+import reactor.netty.http.client.HttpClientRequest;
+
+
+import java.time.Duration;
+import java.util.concurrent.TimeoutException;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.configureFor;
+import static com.github.tomakehurst.wiremock.client.WireMock.get;
+import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
+import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+public class WebClientTimeoutIntegrationTest {
+
+ private WireMockServer wireMockServer;
+
+ @Before
+ public void setup() {
+ wireMockServer = new WireMockServer(wireMockConfig().dynamicPort());
+ wireMockServer.start();
+ configureFor("localhost", wireMockServer.port());
+ }
+
+ @After
+ public void tearDown() {
+ wireMockServer.stop();
+ }
+
+ @AfterEach
+ public void tearDownEach() {
+ wireMockServer.resetAll();
+ }
+
+ @Test
+ public void givenResponseTimeoutClientWhenRequestTimeoutThenReadTimeoutException() {
+ val path = "/response-timeout";
+ val delay = Math.toIntExact(Duration.ofSeconds(2).toMillis());
+ stubFor(get(urlEqualTo(path)).willReturn(aResponse().withFixedDelay(delay)
+ .withStatus(HttpStatus.OK.value())));
+
+ val webClient = WebClientTimeoutProvider.responseTimeoutClient();
+
+ val ex = assertThrows(RuntimeException.class, () ->
+ webClient.get()
+ .uri(wireMockServer.baseUrl() + path)
+ .exchangeToMono(Mono::just)
+ .log()
+ .block());
+ assertThat(ex).isInstanceOf(WebClientRequestException.class)
+ .getCause().isInstanceOf(ReadTimeoutException.class);
+ }
+
+ @Test
+ public void givenReadWriteTimeoutClientWhenRequestTimeoutThenReadTimeoutException() {
+ val path = "/read-write-timeout";
+ val delay = Math.toIntExact(Duration.ofSeconds(6).toMillis());
+ stubFor(get(urlEqualTo(path)).willReturn(aResponse().withFixedDelay(delay)
+ .withStatus(HttpStatus.OK.value())));
+
+ val webClient = WebClientTimeoutProvider.readWriteTimeoutClient();
+
+ val ex = assertThrows(RuntimeException.class, () ->
+ webClient.get()
+ .uri(wireMockServer.baseUrl() + path)
+ .exchangeToMono(Mono::just)
+ .log()
+ .block());
+ assertThat(ex).isInstanceOf(WebClientRequestException.class)
+ .getCause().isInstanceOf(ReadTimeoutException.class);
+ }
+
+ @Test
+ public void givenNoTimeoutClientAndReactorTimeoutWhenRequestTimeoutThenTimeoutException() {
+ val path = "/reactor-timeout";
+ val delay = Math.toIntExact(Duration.ofSeconds(5).toMillis());
+ stubFor(get(urlEqualTo(path)).willReturn(aResponse().withFixedDelay(delay)
+ .withStatus(HttpStatus.OK.value())));
+
+ val webClient = WebClientTimeoutProvider.defaultWebClient();
+
+ val ex = assertThrows(RuntimeException.class, () ->
+ webClient.get()
+ .uri(wireMockServer.baseUrl() + path)
+ .exchangeToMono(Mono::just)
+ .timeout(Duration.ofSeconds(1))
+ .log()
+ .block());
+ assertThat(ex).hasMessageContaining("Did not observe any item")
+ .getCause().isInstanceOf(TimeoutException.class);
+ }
+
+ @Test
+ public void givenNoTimeoutClientAndTimeoutHttpRequestWhenRequestTimeoutThenReadTimeoutException() {
+ val path = "/reactor-http-request-timeout";
+ val delay = Math.toIntExact(Duration.ofSeconds(5).toMillis());
+ stubFor(get(urlEqualTo(path)).willReturn(aResponse().withFixedDelay(delay)
+ .withStatus(HttpStatus.OK.value())));
+
+ val webClient = WebClientTimeoutProvider.defaultWebClient();
+
+ val ex = assertThrows(RuntimeException.class, () ->
+ webClient.get()
+ .uri(wireMockServer.baseUrl() + path)
+ .httpRequest(httpRequest -> {
+ HttpClientRequest reactorRequest = httpRequest.getNativeRequest();
+ reactorRequest.responseTimeout(Duration.ofSeconds(1));
+ })
+ .exchangeToMono(Mono::just)
+ .log()
+ .block());
+ assertThat(ex).isInstanceOf(WebClientRequestException.class)
+ .getCause().isInstanceOf(ReadTimeoutException.class);
+ }
+}
diff --git a/spring-5-reactive-oauth/pom.xml b/spring-5-reactive-oauth/pom.xml
index 15f5dcacaa..8e8b472881 100644
--- a/spring-5-reactive-oauth/pom.xml
+++ b/spring-5-reactive-oauth/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.baeldung.reactive.oauthspring-5-reactive-oauth
@@ -25,12 +26,10 @@
org.springframework.bootspring-boot-starter-webflux
-
org.springframework.securityspring-security-oauth2-client
-
org.springframework.bootspring-boot-starter-test
@@ -64,4 +63,4 @@
-
+
\ No newline at end of file
diff --git a/spring-5-reactive-security/pom.xml b/spring-5-reactive-security/pom.xml
index 2024cb5138..267a683fa7 100644
--- a/spring-5-reactive-security/pom.xml
+++ b/spring-5-reactive-security/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-5-reactive-security0.0.1-SNAPSHOT
@@ -60,9 +61,7 @@
org.apache.commonscommons-lang3
-
-
org.springframework.bootspring-boot-devtools
@@ -77,14 +76,12 @@
spring-boot-starter-testtest
-
org.apache.commonscommons-collections4${commons-collections4.version}test
-
io.reactivex.rxjava2rxjava
@@ -130,4 +127,4 @@
3.1.6.RELEASE
-
+
\ No newline at end of file
diff --git a/spring-5-reactive/pom.xml b/spring-5-reactive/pom.xml
index 40791faaaf..408573198b 100644
--- a/spring-5-reactive/pom.xml
+++ b/spring-5-reactive/pom.xml
@@ -52,9 +52,7 @@
org.apache.commonscommons-lang3
-
-
org.springframework.bootspring-boot-devtools
@@ -79,8 +77,6 @@
reactor-testtest
-
-
org.springframework.boot
@@ -102,14 +98,12 @@
org.springframework.sessionspring-session-data-redis
-
org.apache.commonscommons-collections4${commons-collections4.version}test
-
io.reactivex.rxjava2rxjava
@@ -162,4 +156,4 @@
4.1
-
+
\ No newline at end of file
diff --git a/spring-5-webflux/README.md b/spring-5-webflux/README.md
index 9f9a12f997..bd667468fb 100644
--- a/spring-5-webflux/README.md
+++ b/spring-5-webflux/README.md
@@ -9,3 +9,5 @@ This module contains articles about Spring 5 WebFlux
- [Spring WebClient Requests with Parameters](https://www.baeldung.com/webflux-webclient-parameters)
- [RSocket Using Spring Boot](https://www.baeldung.com/spring-boot-rsocket)
- [Spring MVC Async vs Spring WebFlux](https://www.baeldung.com/spring-mvc-async-vs-webflux)
+- [Set a Timeout in Spring 5 Webflux WebClient](https://www.baeldung.com/spring-webflux-timeout)
+- [Guide to Retry in Spring WebFlux](https://www.baeldung.com/spring-webflux-retry)
diff --git a/spring-5-webflux/pom.xml b/spring-5-webflux/pom.xml
index 48b5b823fb..ad1a66943c 100644
--- a/spring-5-webflux/pom.xml
+++ b/spring-5-webflux/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-5-webflux1.0-SNAPSHOT
@@ -31,28 +32,28 @@
org.springframework.bootspring-boot-starter-webflux
-
org.springframework.bootspring-boot-starter-rsocket
-
org.projectlomboklombok
-
org.springframework.bootspring-boot-starter-testtest
-
io.projectreactorreactor-testtest
+
+ com.squareup.okhttp3
+ mockwebserver
+
@@ -68,4 +69,4 @@
2.3.3.RELEASE
-
+
\ No newline at end of file
diff --git a/spring-5-webflux/src/main/java/com/baeldung/spring/retry/ExternalConnector.java b/spring-5-webflux/src/main/java/com/baeldung/spring/retry/ExternalConnector.java
new file mode 100644
index 0000000000..baace095a7
--- /dev/null
+++ b/spring-5-webflux/src/main/java/com/baeldung/spring/retry/ExternalConnector.java
@@ -0,0 +1,73 @@
+package com.baeldung.spring.retry;
+
+import java.time.Duration;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.web.reactive.function.client.WebClient;
+
+import lombok.AllArgsConstructor;
+import reactor.core.publisher.Mono;
+import reactor.util.retry.Retry;
+
+@Component
+@AllArgsConstructor
+public class ExternalConnector {
+
+ private static final String PATH_BY_ID = "/data/{id}";
+
+ private final WebClient webClient;
+
+ public Mono getData(String stockId) {
+ return webClient.get()
+ .uri(PATH_BY_ID, stockId)
+ .accept(MediaType.APPLICATION_JSON)
+ .retrieve()
+ .onStatus(HttpStatus::is5xxServerError, response -> Mono.error(new ServiceException("Server error", response.rawStatusCode())))
+ .bodyToMono(String.class)
+ .retryWhen(Retry.backoff(3, Duration.ofSeconds(2))
+ .filter(throwable -> throwable instanceof ServiceException)
+ .onRetryExhaustedThrow((retryBackoffSpec, retrySignal) -> {
+ throw new ServiceException("External Service failed to process after max retries", HttpStatus.SERVICE_UNAVAILABLE.value());
+ }));
+ }
+
+ public Mono getDataWithRetry(String stockId) {
+ return webClient.get()
+ .uri(PATH_BY_ID, stockId)
+ .accept(MediaType.APPLICATION_JSON)
+ .retrieve()
+ .bodyToMono(String.class)
+ .retryWhen(Retry.max(3));
+ }
+
+ public Mono getDataWithRetryFixedDelay(String stockId) {
+ return webClient.get()
+ .uri(PATH_BY_ID, stockId)
+ .accept(MediaType.APPLICATION_JSON)
+ .retrieve()
+ .bodyToMono(String.class)
+ .retryWhen(Retry.fixedDelay(3, Duration.ofSeconds(2)));
+ }
+
+ public Mono getDataWithRetryBackoff(String stockId) {
+ return webClient.get()
+ .uri(PATH_BY_ID, stockId)
+ .accept(MediaType.APPLICATION_JSON)
+ .retrieve()
+ .bodyToMono(String.class)
+ .retryWhen(Retry.backoff(3, Duration.ofSeconds(2)));
+ }
+
+ public Mono getDataWithRetryBackoffJitter(String stockId) {
+ return webClient.get()
+ .uri(PATH_BY_ID, stockId)
+ .accept(MediaType.APPLICATION_JSON)
+ .retrieve()
+ .bodyToMono(String.class)
+ .retryWhen(Retry.backoff(3, Duration.ofSeconds(2))
+ .jitter(1));
+ }
+
+}
diff --git a/spring-5-webflux/src/main/java/com/baeldung/spring/retry/ServiceException.java b/spring-5-webflux/src/main/java/com/baeldung/spring/retry/ServiceException.java
new file mode 100644
index 0000000000..cbfa71f986
--- /dev/null
+++ b/spring-5-webflux/src/main/java/com/baeldung/spring/retry/ServiceException.java
@@ -0,0 +1,15 @@
+package com.baeldung.spring.retry;
+
+public class ServiceException extends RuntimeException {
+
+ private final int statusCode;
+
+ public ServiceException(String message, int statusCode) {
+ super(message);
+ this.statusCode = statusCode;
+ }
+
+ public int getStatusCode() {
+ return statusCode;
+ }
+}
diff --git a/spring-5-webflux/src/main/java/com/baeldung/spring/retry/StockController.java b/spring-5-webflux/src/main/java/com/baeldung/spring/retry/StockController.java
new file mode 100644
index 0000000000..b03558d53f
--- /dev/null
+++ b/spring-5-webflux/src/main/java/com/baeldung/spring/retry/StockController.java
@@ -0,0 +1,23 @@
+package com.baeldung.spring.retry;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import lombok.AllArgsConstructor;
+import reactor.core.publisher.Mono;
+
+@AllArgsConstructor
+@RestController
+@RequestMapping("/stocks/data")
+public class StockController {
+
+ private final ExternalConnector externalConnector;
+
+ @GetMapping("/{stockId}")
+ public Mono getData(@PathVariable String stockId) {
+ return externalConnector.getData(stockId);
+ }
+
+}
diff --git a/spring-5-webflux/src/main/java/com/baeldung/spring/retry/StockDataApp.java b/spring-5-webflux/src/main/java/com/baeldung/spring/retry/StockDataApp.java
new file mode 100644
index 0000000000..cfd1852f62
--- /dev/null
+++ b/spring-5-webflux/src/main/java/com/baeldung/spring/retry/StockDataApp.java
@@ -0,0 +1,18 @@
+package com.baeldung.spring.retry;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.web.reactive.function.client.WebClient;
+
+@SpringBootApplication
+public class StockDataApp {
+ public static void main(String[] args) {
+ SpringApplication.run(StockDataApp.class, args);
+ }
+
+ @Bean
+ public WebClient webClient() {
+ return WebClient.create();
+ }
+}
diff --git a/spring-5-webflux/src/test/java/com/baeldung/spring/retry/ExternalConnectorIntegrationTest.java b/spring-5-webflux/src/test/java/com/baeldung/spring/retry/ExternalConnectorIntegrationTest.java
new file mode 100644
index 0000000000..60d22def74
--- /dev/null
+++ b/spring-5-webflux/src/test/java/com/baeldung/spring/retry/ExternalConnectorIntegrationTest.java
@@ -0,0 +1,90 @@
+package com.baeldung.spring.retry;
+
+import static io.netty.handler.codec.http.HttpResponseStatus.SERVICE_UNAVAILABLE;
+import static io.netty.handler.codec.http.HttpResponseStatus.UNAUTHORIZED;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.IOException;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.web.reactive.function.client.WebClient;
+import org.springframework.web.reactive.function.client.WebClientResponseException;
+
+import okhttp3.mockwebserver.MockResponse;
+import okhttp3.mockwebserver.MockWebServer;
+import okhttp3.mockwebserver.RecordedRequest;
+import reactor.test.StepVerifier;
+
+class ExternalConnectorIntegrationTest {
+
+ private ExternalConnector externalConnector;
+
+ private MockWebServer mockExternalService;
+
+ @BeforeEach
+ void setup() throws IOException {
+ externalConnector = new ExternalConnector(WebClient.builder()
+ .baseUrl("http://localhost:8090")
+ .build());
+ mockExternalService = new MockWebServer();
+ mockExternalService.start(8090);
+ }
+
+ @AfterEach
+ void tearDown() throws IOException {
+ mockExternalService.shutdown();
+ }
+
+ @Test
+ void givenExternalServiceReturnsError_whenGettingData_thenRetryAndReturnResponse() throws Exception {
+
+ mockExternalService.enqueue(new MockResponse().setResponseCode(SERVICE_UNAVAILABLE.code()));
+ mockExternalService.enqueue(new MockResponse().setResponseCode(SERVICE_UNAVAILABLE.code()));
+ mockExternalService.enqueue(new MockResponse().setResponseCode(SERVICE_UNAVAILABLE.code()));
+ mockExternalService.enqueue(new MockResponse().setBody("stock data"));
+
+ StepVerifier.create(externalConnector.getData("ABC"))
+ .expectNextMatches(response -> response.equals("stock data"))
+ .verifyComplete();
+
+ verifyNumberOfGetRequests(4);
+ }
+
+ @Test
+ void givenExternalServiceReturnsClientError_whenGettingData_thenNoRetry() throws Exception {
+
+ mockExternalService.enqueue(new MockResponse().setResponseCode(UNAUTHORIZED.code()));
+
+ StepVerifier.create(externalConnector.getData("ABC"))
+ .expectError(WebClientResponseException.class)
+ .verify();
+
+ verifyNumberOfGetRequests(1);
+ }
+
+ @Test
+ void givenExternalServiceRetryAttemptsExhausted_whenGettingData_thenRetryAndReturnError() throws Exception {
+
+ mockExternalService.enqueue(new MockResponse().setResponseCode(SERVICE_UNAVAILABLE.code()));
+ mockExternalService.enqueue(new MockResponse().setResponseCode(SERVICE_UNAVAILABLE.code()));
+ mockExternalService.enqueue(new MockResponse().setResponseCode(SERVICE_UNAVAILABLE.code()));
+ mockExternalService.enqueue(new MockResponse().setResponseCode(SERVICE_UNAVAILABLE.code()));
+
+ StepVerifier.create(externalConnector.getData("ABC"))
+ .expectError(ServiceException.class)
+ .verify();
+
+ verifyNumberOfGetRequests(4);
+ }
+
+ private void verifyNumberOfGetRequests(int times) throws Exception {
+ for (int i = 0; i < times; i++) {
+ RecordedRequest recordedRequest = mockExternalService.takeRequest();
+ assertThat(recordedRequest.getMethod()).isEqualTo("GET");
+ assertThat(recordedRequest.getPath()).isEqualTo("/data/ABC");
+ }
+ }
+
+}
diff --git a/spring-5-webflux/src/test/java/com/baeldung/spring/retry/StockControllerIntegrationTest.java b/spring-5-webflux/src/test/java/com/baeldung/spring/retry/StockControllerIntegrationTest.java
new file mode 100644
index 0000000000..2ad94f4d6a
--- /dev/null
+++ b/spring-5-webflux/src/test/java/com/baeldung/spring/retry/StockControllerIntegrationTest.java
@@ -0,0 +1,37 @@
+package com.baeldung.spring.retry;
+
+import static org.mockito.BDDMockito.given;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.reactive.server.WebTestClient;
+
+import reactor.core.publisher.Mono;
+
+@RunWith(SpringRunner.class)
+@WebFluxTest
+public class StockControllerIntegrationTest {
+
+ @Autowired
+ private WebTestClient webClient;
+
+ @MockBean
+ private ExternalConnector externalConnector;
+
+ @Test
+ public void shouldReturnStockData() {
+ given(externalConnector.getData("ABC")).willReturn(Mono.just("stock data"));
+
+ webClient.get()
+ .uri("/stocks/data/{id}", "ABC")
+ .exchange()
+ .expectStatus()
+ .isOk()
+ .expectBody(String.class)
+ .isEqualTo("stock data");
+ }
+}
diff --git a/spring-5/pom.xml b/spring-5/pom.xml
index e368bcacba..5ebeb4dadf 100644
--- a/spring-5/pom.xml
+++ b/spring-5/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0spring-50.0.1-SNAPSHOT
@@ -55,9 +55,7 @@
org.apache.commonscommons-lang3
-
-
org.springframework.bootspring-boot-devtools
@@ -68,7 +66,6 @@
h2runtime
-
org.springframeworkspring-test
@@ -133,7 +130,7 @@
-
+
@@ -142,7 +139,6 @@
1.5.64.1${project.build.directory}/generated-snippets
- 2.21.0
-
+
\ No newline at end of file
diff --git a/spring-5/src/test/java/com/baeldung/README.md b/spring-5/src/test/java/com/baeldung/README.md
deleted file mode 100644
index 0ff61914d5..0000000000
--- a/spring-5/src/test/java/com/baeldung/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant Articles:
-
-- [Concurrent Test Execution in Spring 5](https://www.baeldung.com/spring-5-concurrent-tests)
diff --git a/spring-activiti/pom.xml b/spring-activiti/pom.xml
index a8557b4f56..c685207cc4 100644
--- a/spring-activiti/pom.xml
+++ b/spring-activiti/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-activitispring-activiti
@@ -8,7 +9,8 @@
Demo project for Spring Boot
-
+
com.baeldungparent-boot-10.0.1-SNAPSHOT
@@ -30,7 +32,6 @@
org.springframework.bootspring-boot-starter-thymeleaf
-
com.h2databaseh2
@@ -60,4 +61,4 @@
6.0.0
-
+
\ No newline at end of file
diff --git a/spring-akka/pom.xml b/spring-akka/pom.xml
index 23535a8ccc..fb7a6198c3 100644
--- a/spring-akka/pom.xml
+++ b/spring-akka/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-akka0.1-SNAPSHOT
diff --git a/spring-amqp/pom.xml b/spring-amqp/pom.xml
index f32db5b8b4..1a0b78c26e 100755
--- a/spring-amqp/pom.xml
+++ b/spring-amqp/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-amqp1.0.0-SNAPSHOT
@@ -25,4 +26,4 @@
com.baeldung.springamqp.simple.HelloWorldMessageApp
-
+
\ No newline at end of file
diff --git a/spring-aop/README.md b/spring-aop/README.md
index c92e132d1e..707e0fbf81 100644
--- a/spring-aop/README.md
+++ b/spring-aop/README.md
@@ -12,3 +12,4 @@ This module contains articles about Spring aspect oriented programming (AOP)
- [Introduction to Advice Types in Spring](https://www.baeldung.com/spring-aop-advice-tutorial)
- [When Does Java Throw UndeclaredThrowableException?](https://www.baeldung.com/java-undeclaredthrowableexception)
- [Get Advised Method Info in Spring AOP](https://www.baeldung.com/spring-aop-get-advised-method-info)
+- [Advise Methods on Annotated Classes With AspectJ](https://www.baeldung.com/aspectj-advise-methods)
diff --git a/spring-aop/pom.xml b/spring-aop/pom.xml
index 74b6f48b46..464a830383 100644
--- a/spring-aop/pom.xml
+++ b/spring-aop/pom.xml
@@ -1,5 +1,6 @@
-4.0.0spring-aop
@@ -14,6 +15,14 @@
+
+ org.aspectj
+ aspectjrt
+
+
+ org.aspectj
+ aspectjweaver
+ org.springframework.bootspring-boot-starter-aop
@@ -23,7 +32,43 @@
spring-boot-starter-testtest
+
+ org.mockito
+ mockito-core
+ test
+
-
+
+
+
+ org.codehaus.mojo
+ aspectj-maven-plugin
+ ${aspectj-plugin.version}
+
+ ${java.version}
+ ${java.version}
+ ${java.version}
+ true
+ true
+ ignore
+ UTF-8
+
+ **/pointcutadvice/**
+
+
+
+
+
+ compile
+
+
+
+
+
+
+
+ 1.11
+
+
\ No newline at end of file
diff --git a/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/MyTracedService.java b/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/MyTracedService.java
new file mode 100644
index 0000000000..7c6934e67e
--- /dev/null
+++ b/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/MyTracedService.java
@@ -0,0 +1,19 @@
+package com.baeldung.aspectj.classmethodadvice;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.stereotype.Component;
+
+@Trace
+@Component
+public class MyTracedService {
+ private static final Log LOG = LogFactory.getLog(MyTracedService.class);
+
+ public void performSomeLogic() {
+ LOG.info("Inside performSomeLogic...");
+ }
+
+ public void performSomeAdditionalLogic() {
+ LOG.info("Inside performSomeAdditionalLogic...");
+ }
+}
diff --git a/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/MyTracedServiceConsumer.java b/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/MyTracedServiceConsumer.java
new file mode 100644
index 0000000000..1d5a017230
--- /dev/null
+++ b/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/MyTracedServiceConsumer.java
@@ -0,0 +1,12 @@
+package com.baeldung.aspectj.classmethodadvice;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class MyTracedServiceConsumer {
+
+ public MyTracedServiceConsumer(MyTracedService myTracedService) {
+ myTracedService.performSomeLogic();
+ myTracedService.performSomeAdditionalLogic();
+ }
+}
diff --git a/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/Trace.java b/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/Trace.java
new file mode 100644
index 0000000000..0ab1547eeb
--- /dev/null
+++ b/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/Trace.java
@@ -0,0 +1,12 @@
+package com.baeldung.aspectj.classmethodadvice;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface Trace {
+
+}
diff --git a/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/TracingAspect.aj b/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/TracingAspect.aj
new file mode 100644
index 0000000000..20a42940b8
--- /dev/null
+++ b/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/TracingAspect.aj
@@ -0,0 +1,24 @@
+package com.baeldung.aspectj.classmethodadvice;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public aspect TracingAspect {
+ private static final Log LOG = LogFactory.getLog(TracingAspect.class);
+
+ pointcut traceAnnotatedClasses(): within(@Trace *) && execution(* *(..));
+
+ Object around() : traceAnnotatedClasses() {
+ String signature = thisJoinPoint.getSignature().toShortString();
+ LOG.trace("Entering " + signature);
+ try {
+ return proceed();
+ } finally {
+ LOG.trace("Exiting " + signature);
+ }
+ }
+
+ after() throwing (Exception e) : traceAnnotatedClasses() {
+ LOG.trace("Exception thrown from " + thisJoinPoint.getSignature().toShortString(), e);
+ }
+}
diff --git a/spring-aop/src/main/resources/logback.xml b/spring-aop/src/main/resources/logback.xml
index 4eaa556705..84885fae62 100644
--- a/spring-aop/src/main/resources/logback.xml
+++ b/spring-aop/src/main/resources/logback.xml
@@ -17,6 +17,8 @@
+
+
diff --git a/spring-aop/src/test/java/com/baeldung/aspectj/classmethodadvice/MyTracedServiceConsumerUnitTest.java b/spring-aop/src/test/java/com/baeldung/aspectj/classmethodadvice/MyTracedServiceConsumerUnitTest.java
new file mode 100644
index 0000000000..605ffc62c6
--- /dev/null
+++ b/spring-aop/src/test/java/com/baeldung/aspectj/classmethodadvice/MyTracedServiceConsumerUnitTest.java
@@ -0,0 +1,32 @@
+package com.baeldung.aspectj.classmethodadvice;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.verify;
+
+public class MyTracedServiceConsumerUnitTest {
+
+ @Rule
+ public MockitoRule mockitoRule = MockitoJUnit.rule();
+
+ @Spy
+ private MyTracedService myTracedService;
+
+ @Test
+ public void whenCallingConsumer_thenServiceIsCalled() {
+ doNothing().when(myTracedService)
+ .performSomeLogic();
+ doNothing().when(myTracedService)
+ .performSomeAdditionalLogic();
+
+ new MyTracedServiceConsumer(myTracedService);
+
+ verify(myTracedService).performSomeLogic();
+ verify(myTracedService).performSomeAdditionalLogic();
+ }
+}
\ No newline at end of file
diff --git a/spring-aop/src/test/java/com/baeldung/aspectj/classmethodadvice/MyTracedServiceUnitTest.java b/spring-aop/src/test/java/com/baeldung/aspectj/classmethodadvice/MyTracedServiceUnitTest.java
new file mode 100644
index 0000000000..a5c3280d9e
--- /dev/null
+++ b/spring-aop/src/test/java/com/baeldung/aspectj/classmethodadvice/MyTracedServiceUnitTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.aspectj.classmethodadvice;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.springframework.boot.test.system.OutputCaptureRule;
+
+import static org.junit.Assert.assertTrue;
+
+/*
+ * When running this test class, the tests may fail unless you build the code with Maven first. You
+ * must ensure the AspectJ compiler executes to weave in the Aspect's logic. Without the Aspect
+ * weaved into the class under test, the trace logging will not be written to stdout.
+ */
+public class MyTracedServiceUnitTest {
+
+ @Rule
+ public OutputCaptureRule outputCaptureRule = new OutputCaptureRule();
+
+ @Test
+ public void whenPerformingSomeLogic_thenTraceAndInfoOutputIsWritten() {
+ MyTracedService myTracedService = new MyTracedService();
+ myTracedService.performSomeLogic();
+
+ String output = outputCaptureRule.getOut();
+ assertTrue(output.contains("TracingAspect - Entering MyTracedService.performSomeLogic"));
+ assertTrue(output.contains("MyTracedService - Inside performSomeLogic"));
+ assertTrue(output.contains("TracingAspect - Exiting MyTracedService.performSomeLogic"));
+ }
+
+ @Test
+ public void whenPerformingSomeAdditionalLogic_thenTraceAndInfoOutputIsWritten() {
+ MyTracedService myTracedService = new MyTracedService();
+ myTracedService.performSomeAdditionalLogic();
+
+ String output = outputCaptureRule.getOut();
+ assertTrue(output.contains("TracingAspect - Entering MyTracedService.performSomeAdditionalLogic"));
+ assertTrue(output.contains("MyTracedService - Inside performSomeAdditionalLogic"));
+ assertTrue(output.contains("TracingAspect - Exiting MyTracedService.performSomeAdditionalLogic"));
+ }
+}
\ No newline at end of file
diff --git a/spring-apache-camel/pom.xml b/spring-apache-camel/pom.xml
index 9c7cc14381..de7bd1287a 100644
--- a/spring-apache-camel/pom.xml
+++ b/spring-apache-camel/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0org.apache.camelspring-apache-camel
@@ -65,4 +66,4 @@
4.3.4.RELEASE
-
+
\ No newline at end of file
diff --git a/spring-batch-2/pom.xml b/spring-batch-2/pom.xml
index 183ad610f3..c429c272bd 100644
--- a/spring-batch-2/pom.xml
+++ b/spring-batch-2/pom.xml
@@ -51,4 +51,4 @@
2.5.1
-
+
\ No newline at end of file
diff --git a/spring-batch/pom.xml b/spring-batch/pom.xml
index 75ec0d4877..b195ff8d13 100644
--- a/spring-batch/pom.xml
+++ b/spring-batch/pom.xml
@@ -1,5 +1,6 @@
-4.0.0spring-batch
@@ -24,21 +25,18 @@
${jaxb.version}runtime
-
org.glassfish.jaxbjaxb-runtime${jaxb.version}runtime
-
org.xerialsqlite-jdbc${sqlite.version}
-
org.springframeworkspring-oxm
@@ -50,42 +48,35 @@
-
org.springframeworkspring-jdbc${spring.version}
-
org.springframework.batchspring-batch-core${spring.batch.version}
-
org.springframework.batchspring-batch-test${spring.batch.version}
-
com.opencsvopencsv${opencsv.version}
-
org.springframework.bootspring-boot-starter-batch
-
org.hsqldbhsqldbruntime
-
org.awaitilityawaitility
@@ -103,4 +94,4 @@
3.1.1
-
+
\ No newline at end of file
diff --git a/spring-bom/pom.xml b/spring-bom/pom.xml
index e82c650fa9..7ba21ee285 100644
--- a/spring-bom/pom.xml
+++ b/spring-bom/pom.xml
@@ -1,6 +1,7 @@
-
-
+
+4.0.0spring-bom1.0.0-SNAPSHOT
@@ -39,4 +40,4 @@
4.3.8.RELEASE
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml
index 4902368d7e..7a93cabb82 100644
--- a/spring-boot-modules/pom.xml
+++ b/spring-boot-modules/pom.xml
@@ -1,13 +1,12 @@
-
+4.0.0
-
com.baeldung.spring-boot-modulesspring-boot-modules1.0.0-SNAPSHOTpom
-
spring-boot-modules
@@ -34,6 +33,7 @@
spring-boot-ctx-fluentspring-boot-deploymentspring-boot-di
+ spring-boot-disable-loggingspring-boot-camelspring-boot-ci-cd
@@ -70,12 +70,12 @@
spring-boot-swagger-jwtspring-boot-testingspring-boot-vue
- spring-boot-xmlspring-boot-actuatorspring-boot-data-2
+ spring-boot-react
+ spring-boot-validation
-
@@ -106,17 +106,9 @@
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
-
-
5.6.2
+ 2.22.2
-
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-1/pom.xml b/spring-boot-modules/spring-boot-1/pom.xml
index d44120b21e..9f91cc8f2e 100644
--- a/spring-boot-modules/spring-boot-1/pom.xml
+++ b/spring-boot-modules/spring-boot-1/pom.xml
@@ -1,13 +1,14 @@
-
+4.0.0spring-boot-1jarModule for Spring Boot version 1.x
-
+
com.baeldungparent-boot-10.0.1-SNAPSHOT
@@ -43,4 +44,4 @@
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-actuator/README.md b/spring-boot-modules/spring-boot-actuator/README.md
index 3e8ef3411b..9e2f30786f 100644
--- a/spring-boot-modules/spring-boot-actuator/README.md
+++ b/spring-boot-modules/spring-boot-actuator/README.md
@@ -10,3 +10,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Liveness and Readiness Probes in Spring Boot](https://www.baeldung.com/spring-liveness-readiness-probes)
- [Custom Information in Spring Boot Info Endpoint](https://www.baeldung.com/spring-boot-info-actuator-custom)
- [Health Indicators in Spring Boot](https://www.baeldung.com/spring-boot-health-indicators)
+- [How to Enable All Endpoints in Spring Boot Actuator](https://www.baeldung.com/spring-boot-actuator-enable-endpoints)
diff --git a/spring-boot-modules/spring-boot-actuator/pom.xml b/spring-boot-modules/spring-boot-actuator/pom.xml
index a808b8cb1b..1865974ab0 100644
--- a/spring-boot-modules/spring-boot-actuator/pom.xml
+++ b/spring-boot-modules/spring-boot-actuator/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0spring-boot-actuatorspring-boot-actuator
@@ -12,7 +12,7 @@
org.springframework.bootspring-boot-starter-parent2.3.2.RELEASE
-
+
@@ -28,11 +28,14 @@
org.springframework.bootspring-boot-starter-data-jpa
+
+ org.springframework.boot
+ spring-boot-starter-security
+ com.h2databaseh2
-
org.springframework.bootspring-boot-starter-test
@@ -44,6 +47,11 @@
+
+ org.springframework.security
+ spring-security-test
+ test
+
@@ -53,9 +61,10 @@
spring-boot-maven-plugincom.baeldung.probes.ProbesApplication
+ com.baeldung.endpoints.enabling.EndpointEnablingApplication
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-actuator/src/main/java/com/baeldung/endpoints/enabling/EndpointEnablingApplication.java b/spring-boot-modules/spring-boot-actuator/src/main/java/com/baeldung/endpoints/enabling/EndpointEnablingApplication.java
new file mode 100644
index 0000000000..2e8024dcd5
--- /dev/null
+++ b/spring-boot-modules/spring-boot-actuator/src/main/java/com/baeldung/endpoints/enabling/EndpointEnablingApplication.java
@@ -0,0 +1,15 @@
+package com.baeldung.endpoints.enabling;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
+
+@SpringBootApplication(exclude = { SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class }, scanBasePackages = "com.baeldung.endpoints.enabling")
+public class EndpointEnablingApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(EndpointEnablingApplication.class, args);
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-actuator/src/main/java/com/baeldung/endpoints/enabling/SecurityConfiguration.java b/spring-boot-modules/spring-boot-actuator/src/main/java/com/baeldung/endpoints/enabling/SecurityConfiguration.java
new file mode 100644
index 0000000000..894c24693e
--- /dev/null
+++ b/spring-boot-modules/spring-boot-actuator/src/main/java/com/baeldung/endpoints/enabling/SecurityConfiguration.java
@@ -0,0 +1,36 @@
+package com.baeldung.endpoints.enabling;
+
+import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.crypto.factory.PasswordEncoderFactories;
+import org.springframework.security.crypto.password.PasswordEncoder;
+
+@Configuration
+@EnableWebSecurity
+public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
+
+ @Override
+ protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+ PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
+ auth.inMemoryAuthentication()
+ .withUser("user")
+ .password(encoder.encode("password"))
+ .roles("USER")
+ .and()
+ .withUser("admin")
+ .password(encoder.encode("admin"))
+ .roles("USER", "ADMIN");
+ }
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http.requestMatcher(EndpointRequest.toAnyEndpoint())
+ .authorizeRequests((requests) -> requests.anyRequest()
+ .hasRole("ADMIN"));
+ http.httpBasic();
+ }
+}
diff --git a/spring-boot-modules/spring-boot-actuator/src/main/resources/application.properties b/spring-boot-modules/spring-boot-actuator/src/main/resources/application.properties
index de7be417a8..e69c763eeb 100644
--- a/spring-boot-modules/spring-boot-actuator/src/main/resources/application.properties
+++ b/spring-boot-modules/spring-boot-actuator/src/main/resources/application.properties
@@ -11,3 +11,6 @@ info.app.name=Spring Sample Application
info.app.description=This is my first spring boot application G1
info.app.version=1.0.0
info.java-vendor = ${java.specification.vendor}
+
+management.endpoints.web.exposure.include=*
+management.endpoint.shutdown.enabled=true
diff --git a/spring-boot-modules/spring-boot-actuator/src/test/java/com/baeldung/endpoints/enabling/EndpointEnablingIntegrationTest.java b/spring-boot-modules/spring-boot-actuator/src/test/java/com/baeldung/endpoints/enabling/EndpointEnablingIntegrationTest.java
new file mode 100644
index 0000000000..8274619517
--- /dev/null
+++ b/spring-boot-modules/spring-boot-actuator/src/test/java/com/baeldung/endpoints/enabling/EndpointEnablingIntegrationTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.endpoints.enabling;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.test.web.servlet.MockMvc;
+
+@SpringBootTest
+@AutoConfigureMockMvc
+public class EndpointEnablingIntegrationTest {
+ @Autowired
+ private MockMvc mockMvc;
+
+ @Test
+ @WithMockUser(username = "user", password = "password", roles = "USER")
+ public void givenWrongAuthentication_whenCallingActuator_thenReturns401() throws Exception {
+ mockMvc.perform(get("/actuator"))
+ .andExpect(status().isForbidden());
+ }
+
+ @Test
+ @WithMockUser(username = "admin", password = "admin", roles = "ADMIN")
+ public void givenProperAuthentication_whenCallingActuator_thenReturnsExpectedEndpoints() throws Exception {
+ mockMvc.perform(get("/actuator"))
+ .andExpect(jsonPath("$._links").exists())
+ .andExpect(jsonPath("$._links.beans").exists())
+ .andExpect(jsonPath("$._links.env").exists())
+ .andExpect(jsonPath("$._links.shutdown").exists());
+ }
+}
diff --git a/spring-boot-modules/spring-boot-admin/pom.xml b/spring-boot-modules/spring-boot-admin/pom.xml
index 6109081723..b995b6f02e 100644
--- a/spring-boot-modules/spring-boot-admin/pom.xml
+++ b/spring-boot-modules/spring-boot-admin/pom.xml
@@ -1,7 +1,12 @@
-
+4.0.0
+ spring-boot-admin
+ 0.0.1-SNAPSHOT
+ pom
+ spring-boot-admincom.baeldung.spring-boot-modules
@@ -10,14 +15,9 @@
../
- spring-boot-admin
- 0.0.1-SNAPSHOT
- pom
-
- spring-boot-admin
-
spring-boot-admin-serverspring-boot-admin-client
-
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/pom.xml b/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/pom.xml
index f7a4b157e7..eca92ff3a5 100644
--- a/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/pom.xml
+++ b/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/pom.xml
@@ -1,7 +1,13 @@
-
+4.0.0
+ spring-boot-admin-client
+ 0.0.1-SNAPSHOT
+ jar
+ spring-boot-admin-client
+ Spring Boot Admin Clientcom.baeldung.spring-boot-modules
@@ -10,13 +16,6 @@
../
- spring-boot-admin-client
- 0.0.1-SNAPSHOT
- jar
-
- spring-boot-admin-client
- Spring Boot Admin Client
-
org.springframework.boot
@@ -61,7 +60,8 @@
- 2.4.0
+ 2.4.12.0.4.RELEASE
-
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/pom.xml b/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/pom.xml
index bcec12a14c..63bc286b45 100644
--- a/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/pom.xml
+++ b/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/pom.xml
@@ -1,7 +1,13 @@
-
+4.0.0
+ spring-boot-admin-server
+ 0.0.1-SNAPSHOT
+ jar
+ spring-boot-admin-server
+ Spring Boot Admin Servercom.baeldung.spring-boot-modules
@@ -10,19 +16,11 @@
../
- spring-boot-admin-server
- 0.0.1-SNAPSHOT
- jar
-
- spring-boot-admin-server
- Spring Boot Admin Server
-
org.springframework.bootspring-boot-starter-web
-
@@ -30,7 +28,6 @@
spring-boot-admin-starter-server${spring-boot-admin-server.version}
-
de.codecentric
@@ -45,7 +42,6 @@
com.hazelcasthazelcast
-
de.codecentric
@@ -53,12 +49,10 @@
${spring-boot-admin-starter-client.version}
-
org.springframework.bootspring-boot-starter-mail
-
org.springframework.bootspring-boot-starter-test
@@ -82,9 +76,10 @@
- 2.4.0
- 2.4.0
+ 2.4.1
+ 2.4.11.5.72.0.4.RELEASE
-
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-angular/pom.xml b/spring-boot-modules/spring-boot-angular/pom.xml
index ac63d21bb8..89a8814d2f 100644
--- a/spring-boot-modules/spring-boot-angular/pom.xml
+++ b/spring-boot-modules/spring-boot-angular/pom.xml
@@ -1,7 +1,13 @@
-
+4.0.0
+ com.baeldung.springbootangular
+ spring-boot-angular
+ 1.0
+ jar
+ spring-boot-angularcom.baeldung.spring-boot-modules
@@ -10,13 +16,6 @@
../
- com.baeldung.springbootangular
- spring-boot-angular
- 1.0
- jar
-
- spring-boot-angular
-
org.springframework.boot
@@ -52,4 +51,4 @@
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-annotations/README.md b/spring-boot-modules/spring-boot-annotations/README.md
index 1b2bca435c..9742661f30 100644
--- a/spring-boot-modules/spring-boot-annotations/README.md
+++ b/spring-boot-modules/spring-boot-annotations/README.md
@@ -11,3 +11,4 @@ This module contains articles about Spring Boot annotations
- [Spring Bean Annotations](https://www.baeldung.com/spring-bean-annotations)
- [Difference Between @ComponentScan and @EnableAutoConfiguration in Spring Boot](https://www.baeldung.com/spring-componentscan-vs-enableautoconfiguration)
- [Where Should the Spring @Service Annotation Be Kept?](https://www.baeldung.com/spring-service-annotation-placement)
+- [Spring Conditional Annotations](https://www.baeldung.com/spring-conditional-annotations)
diff --git a/spring-boot-modules/spring-boot-annotations/pom.xml b/spring-boot-modules/spring-boot-annotations/pom.xml
index 799692d51b..22572e7492 100644
--- a/spring-boot-modules/spring-boot-annotations/pom.xml
+++ b/spring-boot-modules/spring-boot-annotations/pom.xml
@@ -1,7 +1,11 @@
-
+4.0.0
+ spring-boot-annotations
+ war
+ spring-boot-annotationscom.baeldung.spring-boot-modules
@@ -10,23 +14,20 @@
../
- spring-boot-annotations
- war
-
- spring-boot-annotations
-
org.aspectjaspectjweaver${aspectjweaver.version}
-
org.springframework.bootspring-boot-starter-web
-
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+ org.springframework.bootspring-boot-starter-data-jpa
@@ -37,18 +38,21 @@
-
org.hibernatehibernate-core
-
org.springframework.bootspring-boot-starter-testtest
+
+ org.mockito
+ mockito-inline
+ test
+
-
-
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/AdditionalWebConfiguration.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/AdditionalWebConfiguration.java
new file mode 100644
index 0000000000..22b41a28e0
--- /dev/null
+++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/AdditionalWebConfiguration.java
@@ -0,0 +1,9 @@
+package com.baeldung.annotations.conditional;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnWarDeployment;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConditionalOnWarDeployment
+public class AdditionalWebConfiguration {
+}
diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/ConditionalUtils.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/ConditionalUtils.java
new file mode 100644
index 0000000000..7294d843d1
--- /dev/null
+++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/ConditionalUtils.java
@@ -0,0 +1,20 @@
+package com.baeldung.annotations.conditional;
+
+import org.apache.commons.lang3.SystemUtils;
+import org.springframework.boot.system.JavaVersion;
+
+public class ConditionalUtils {
+
+ public static boolean isWindows() {
+ return SystemUtils.IS_OS_WINDOWS;
+ }
+
+ public static boolean isJava8() {
+ return JavaVersion.getJavaVersion().equals(JavaVersion.EIGHT);
+ }
+
+ public static boolean isJava9() {
+ return JavaVersion.getJavaVersion().equals(JavaVersion.NINE);
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/DevEnvLoggingConfiguration.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/DevEnvLoggingConfiguration.java
new file mode 100644
index 0000000000..39f1d568f0
--- /dev/null
+++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/DevEnvLoggingConfiguration.java
@@ -0,0 +1,16 @@
+package com.baeldung.annotations.conditional;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@Conditional(IsDevEnvCondition.class)
+public class DevEnvLoggingConfiguration {
+
+ @Bean
+ @Conditional(IsDevEnvCondition.class)
+ LoggingService loggingService() {
+ return new LoggingService();
+ }
+}
diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/IsDevEnvCondition.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/IsDevEnvCondition.java
new file mode 100644
index 0000000000..768cd9f6ed
--- /dev/null
+++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/IsDevEnvCondition.java
@@ -0,0 +1,13 @@
+package com.baeldung.annotations.conditional;
+
+import org.springframework.context.annotation.Condition;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+
+public class IsDevEnvCondition implements Condition {
+
+ @Override
+ public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
+ return "dev".equals(System.getProperty("env"));
+ }
+}
diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/IsWindowsCondition.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/IsWindowsCondition.java
new file mode 100644
index 0000000000..24aa4f4b1c
--- /dev/null
+++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/IsWindowsCondition.java
@@ -0,0 +1,13 @@
+package com.baeldung.annotations.conditional;
+
+import org.springframework.context.annotation.Condition;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+
+public class IsWindowsCondition implements Condition {
+
+ @Override
+ public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
+ return ConditionalUtils.isWindows();
+ }
+}
diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java8Condition.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java8Condition.java
new file mode 100644
index 0000000000..c5f5e16d52
--- /dev/null
+++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java8Condition.java
@@ -0,0 +1,13 @@
+package com.baeldung.annotations.conditional;
+
+import org.springframework.context.annotation.Condition;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+
+public class Java8Condition implements Condition {
+
+ @Override
+ public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
+ return ConditionalUtils.isJava8();
+ }
+}
diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java8DependedService.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java8DependedService.java
new file mode 100644
index 0000000000..ab76dcd930
--- /dev/null
+++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java8DependedService.java
@@ -0,0 +1,9 @@
+package com.baeldung.annotations.conditional;
+
+import org.springframework.context.annotation.Conditional;
+import org.springframework.stereotype.Service;
+
+@Service
+@Conditional(Java8Condition.class)
+public class Java8DependedService {
+}
diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java8OrJava9.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java8OrJava9.java
new file mode 100644
index 0000000000..77c501ed08
--- /dev/null
+++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java8OrJava9.java
@@ -0,0 +1,16 @@
+package com.baeldung.annotations.conditional;
+
+import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
+import org.springframework.context.annotation.Conditional;
+
+public class Java8OrJava9 extends AnyNestedCondition {
+ Java8OrJava9() {
+ super(ConfigurationPhase.REGISTER_BEAN);
+ }
+
+ @Conditional(Java8Condition.class)
+ static class Java8 { }
+
+ @Conditional(Java9Condition.class)
+ static class Java9 { }
+}
diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java9Condition.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java9Condition.java
new file mode 100644
index 0000000000..2afa8b25a7
--- /dev/null
+++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/Java9Condition.java
@@ -0,0 +1,13 @@
+package com.baeldung.annotations.conditional;
+
+import org.springframework.context.annotation.Condition;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+
+public class Java9Condition implements Condition {
+
+ @Override
+ public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
+ return ConditionalUtils.isJava9();
+ }
+}
diff --git a/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/LoggingService.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/LoggingService.java
new file mode 100644
index 0000000000..e104ec86e1
--- /dev/null
+++ b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/conditional/LoggingService.java
@@ -0,0 +1,19 @@
+package com.baeldung.annotations.conditional;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnJava;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.system.JavaVersion;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.stereotype.Service;
+
+@Service
+@Conditional({IsDevEnvCondition.class, IsWindowsCondition.class, Java8Condition.class})
+@ConditionalOnProperty(
+ value = "logging.enabled",
+ havingValue = "true",
+ matchIfMissing = true)
+@ConditionalOnExpression("${logging.enabled:true} and '${logging.level}'.equals('DEBUG')")
+@ConditionalOnJava(JavaVersion.EIGHT)
+public class LoggingService {
+}
diff --git a/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/ConditionalTestConfiguration.java b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/ConditionalTestConfiguration.java
new file mode 100644
index 0000000000..6b23433422
--- /dev/null
+++ b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/ConditionalTestConfiguration.java
@@ -0,0 +1,10 @@
+package com.baeldung.annotations.conditional;
+
+import org.springframework.boot.test.context.TestConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+
+@TestConfiguration
+@ComponentScan("com.baeldung.annotations.conditional")
+public class ConditionalTestConfiguration {
+
+}
diff --git a/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/DevEnvLoggingConfigurationUnitTest.java b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/DevEnvLoggingConfigurationUnitTest.java
new file mode 100644
index 0000000000..e7c1975127
--- /dev/null
+++ b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/DevEnvLoggingConfigurationUnitTest.java
@@ -0,0 +1,52 @@
+package com.baeldung.annotations.conditional;
+
+import org.junit.Test;
+import org.junit.jupiter.api.Assertions;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.boot.test.context.runner.ApplicationContextRunner;
+
+public class DevEnvLoggingConfigurationUnitTest {
+
+ private final ApplicationContextRunner contextRunner = new ApplicationContextRunner();
+
+ @Test
+ public void whenDevEnvEnabled_thenDevEnvLoggingConfigurationAndLoggingServiceShouldBeCreated() {
+ System.setProperty("env", "dev");
+
+ contextRunner
+ .withUserConfiguration(ConditionalTestConfiguration.class)
+ .run(context ->
+ Assertions.assertNotNull(
+ context.getBean(DevEnvLoggingConfiguration.class)
+ )
+ );
+ contextRunner
+ .withUserConfiguration(ConditionalTestConfiguration.class)
+ .run(context ->
+ Assertions.assertNotNull(
+ context.getBean(LoggingService.class)
+ )
+ );
+ }
+
+ @Test
+ public void whenDevEnvNotEnabled_thenDevEnvLoggingConfigurationAndLoggingServiceShouldNotBeCreated() {
+ System.setProperty("env", "not-dev");
+
+ contextRunner
+ .withUserConfiguration(ConditionalTestConfiguration.class)
+ .run(context ->
+ Assertions.assertThrows(NoSuchBeanDefinitionException.class, () ->
+ context.getBean(DevEnvLoggingConfiguration.class)
+ )
+ );
+ contextRunner
+ .withUserConfiguration(ConditionalTestConfiguration.class)
+ .run(context ->
+ Assertions.assertThrows(NoSuchBeanDefinitionException.class, () ->
+ context.getBean(LoggingService.class)
+ )
+ );
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/IsDevEnvConditionUnitTest.java b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/IsDevEnvConditionUnitTest.java
new file mode 100644
index 0000000000..5302fc79dd
--- /dev/null
+++ b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/IsDevEnvConditionUnitTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.annotations.conditional;
+
+import org.junit.Test;
+import org.junit.jupiter.api.Assertions;
+import org.mockito.Mockito;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+
+public class IsDevEnvConditionUnitTest {
+
+ @Test
+ public void whenDevEnvEnabled_thenDevEnvConditionShouldPass() {
+ System.setProperty("env", "dev");
+
+ Assertions.assertTrue(
+ new IsDevEnvCondition().matches(
+ Mockito.mock(ConditionContext.class), Mockito.mock(AnnotatedTypeMetadata.class)
+ )
+ );
+ }
+
+ @Test
+ public void whenDevEnvNotEnabled_thenDevEnvConditionShouldNotPass() {
+ System.setProperty("env", "not-dev");
+
+ Assertions.assertFalse(
+ new IsDevEnvCondition().matches(
+ Mockito.mock(ConditionContext.class), Mockito.mock(AnnotatedTypeMetadata.class)
+ )
+ );
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/IsWindowsConditionUnitTest.java b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/IsWindowsConditionUnitTest.java
new file mode 100644
index 0000000000..45ae65a0e2
--- /dev/null
+++ b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/IsWindowsConditionUnitTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.annotations.conditional;
+
+import org.junit.Test;
+import org.junit.jupiter.api.Assertions;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+
+public class IsWindowsConditionUnitTest {
+
+ @Test
+ public void whenOnWindows_thenIsWindowsConditionShouldPass() {
+ try (MockedStatic theMock = Mockito.mockStatic(ConditionalUtils.class)) {
+ theMock.when(ConditionalUtils::isWindows)
+ .thenReturn(true);
+ Assertions.assertTrue(
+ new IsWindowsCondition().matches(
+ Mockito.mock(ConditionContext.class), Mockito.mock(AnnotatedTypeMetadata.class)
+ )
+ );
+ }
+
+ }
+
+ @Test
+ public void whenNotOnWindows_thenIsWindowsConditionShouldNotPass() {
+ try (MockedStatic theMock = Mockito.mockStatic(ConditionalUtils.class)) {
+ theMock.when(ConditionalUtils::isWindows)
+ .thenReturn(false);
+ Assertions.assertFalse(
+ new IsWindowsCondition().matches(
+ Mockito.mock(ConditionContext.class), Mockito.mock(AnnotatedTypeMetadata.class)
+ )
+ );
+ }
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/Java8ConditionUnitTest.java b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/Java8ConditionUnitTest.java
new file mode 100644
index 0000000000..0d1b1eded6
--- /dev/null
+++ b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/Java8ConditionUnitTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.annotations.conditional;
+
+import org.junit.Test;
+import org.junit.jupiter.api.Assertions;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+
+public class Java8ConditionUnitTest {
+
+ @Test
+ public void whenOnJava8_thenJava8ConditionShouldPass() {
+ try (MockedStatic theMock = Mockito.mockStatic(ConditionalUtils.class)) {
+ theMock.when(ConditionalUtils::isJava8)
+ .thenReturn(true);
+ Assertions.assertTrue(
+ new Java8Condition().matches(
+ Mockito.mock(ConditionContext.class), Mockito.mock(AnnotatedTypeMetadata.class)
+ )
+ );
+ }
+
+ }
+
+ @Test
+ public void whenNotOnJava8_thenJava8ConditionShouldNotPass() {
+ try (MockedStatic theMock = Mockito.mockStatic(ConditionalUtils.class)) {
+ theMock.when(ConditionalUtils::isJava8)
+ .thenReturn(false);
+ Assertions.assertFalse(
+ new Java8Condition().matches(
+ Mockito.mock(ConditionContext.class), Mockito.mock(AnnotatedTypeMetadata.class)
+ )
+ );
+ }
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/Java9ConditionUnitTest.java b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/Java9ConditionUnitTest.java
new file mode 100644
index 0000000000..ce277e81fe
--- /dev/null
+++ b/spring-boot-modules/spring-boot-annotations/src/test/java/com/baeldung/annotations/conditional/Java9ConditionUnitTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.annotations.conditional;
+
+import org.junit.Test;
+import org.junit.jupiter.api.Assertions;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+
+public class Java9ConditionUnitTest {
+
+ @Test
+ public void whenOnJava9_thenJava9ConditionShouldPass() {
+ try (MockedStatic theMock = Mockito.mockStatic(ConditionalUtils.class)) {
+ theMock.when(ConditionalUtils::isJava9)
+ .thenReturn(true);
+ Assertions.assertTrue(
+ new Java9Condition().matches(
+ Mockito.mock(ConditionContext.class), Mockito.mock(AnnotatedTypeMetadata.class)
+ )
+ );
+ }
+
+ }
+
+ @Test
+ public void whenNotOnJava9_thenJava9ConditionShouldNotPass() {
+ try (MockedStatic theMock = Mockito.mockStatic(ConditionalUtils.class)) {
+ theMock.when(ConditionalUtils::isJava9)
+ .thenReturn(false);
+ Assertions.assertFalse(
+ new Java9Condition().matches(
+ Mockito.mock(ConditionContext.class), Mockito.mock(AnnotatedTypeMetadata.class)
+ )
+ );
+ }
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-artifacts-2/pom.xml b/spring-boot-modules/spring-boot-artifacts-2/pom.xml
index abea13151e..8cf78b79e0 100644
--- a/spring-boot-modules/spring-boot-artifacts-2/pom.xml
+++ b/spring-boot-modules/spring-boot-artifacts-2/pom.xml
@@ -1,7 +1,12 @@
-
+4.0.0
+ spring-boot-artifacts-2
+ jar
+ spring-boot-artifacts-2
+ Demo project for Spring Bootcom.baeldung.spring-boot-modules
@@ -10,12 +15,6 @@
../
- spring-boot-artifacts-2
- jar
-
- spring-boot-artifacts-2
- Demo project for Spring Boot
-
org.springframework.boot
@@ -45,4 +44,4 @@
com.baeldung.demo.DemoApplication
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-artifacts/pom.xml b/spring-boot-modules/spring-boot-artifacts/pom.xml
index 467f931559..7ed91a6626 100644
--- a/spring-boot-modules/spring-boot-artifacts/pom.xml
+++ b/spring-boot-modules/spring-boot-artifacts/pom.xml
@@ -1,7 +1,12 @@
-
+4.0.0
+ spring-boot-artifacts
+ war
+ spring-boot-artifacts
+ Demo project for Spring Bootcom.baeldung.spring-boot-modules
@@ -10,88 +15,69 @@
../
- spring-boot-artifacts
- war
-
- spring-boot-artifacts
- Demo project for Spring Boot
-
org.springframework.bootspring-boot-starter-web
-
org.springframework.bootspring-boot-starter-thymeleafprovided
-
org.springframework.bootspring-boot-starter-testtest
-
org.springframework.bootspring-boot-starter-data-jpa
-
org.springframework.bootspring-boot-starter-mail
-
org.springframework.bootspring-boot-starter-actuator
-
com.h2databaseh2runtime
-
javax.persistencejavax.persistence-api${jpa.version}
-
com.google.guavaguava${guava.version}
-
org.subethamailsubethasmtp${subethasmtp.version}test
-
org.webjarsbootstrap${bootstrap.version}
-
org.webjarsjquery${jquery.version}
-
org.apache.httpcomponentshttpclient${httpclient.version}
-
@@ -116,8 +102,8 @@
maven-failsafe-plugin2.18
-
+
integration-tests
@@ -125,8 +111,8 @@
verify
-
+
**/ExternalPropertyFileLoaderIntegrationTest.java
@@ -134,7 +120,6 @@
-
pl.project13.mavengit-commit-id-plugin
@@ -160,7 +145,6 @@
${project.build.outputDirectory}/git.properties
-
@@ -213,4 +197,4 @@
4.5.8
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-autoconfiguration/pom.xml b/spring-boot-modules/spring-boot-autoconfiguration/pom.xml
index 269d87bbb9..bf8bcc5a87 100644
--- a/spring-boot-modules/spring-boot-autoconfiguration/pom.xml
+++ b/spring-boot-modules/spring-boot-autoconfiguration/pom.xml
@@ -1,7 +1,13 @@
-4.0.0
+ spring-boot-autoconfiguration
+ 0.0.1-SNAPSHOT
+ war
+ spring-boot-autoconfiguration
+ This is simple boot application demonstrating a custom auto-configurationcom.baeldung.spring-boot-modules
@@ -10,13 +16,6 @@
../
- spring-boot-autoconfiguration
- 0.0.1-SNAPSHOT
- war
-
- spring-boot-autoconfiguration
- This is simple boot application demonstrating a custom auto-configuration
-
org.springframework.boot
@@ -39,19 +38,15 @@
spring-boot-starter-testtest
-
mysqlmysql-connector-java
-
org.springframework.bootspring-boot-configuration-processor
- 2.1.6.RELEASEtrue
-
org.hsqldbhsqldb
@@ -60,21 +55,19 @@
- spring-boot
+ spring-boot-autoconfigurationsrc/main/resourcestrue
-
org.apache.maven.pluginsmaven-war-plugin
-
diff --git a/spring-boot-modules/spring-boot-basic-customization-2/README.md b/spring-boot-modules/spring-boot-basic-customization-2/README.md
index bf7e4abb76..f041c1d38a 100644
--- a/spring-boot-modules/spring-boot-basic-customization-2/README.md
+++ b/spring-boot-modules/spring-boot-basic-customization-2/README.md
@@ -5,3 +5,4 @@ This module contains articles about Spring Boot customization 2
### Relevant Articles:
- [DispatcherServlet and web.xml in Spring Boot](https://www.baeldung.com/spring-boot-dispatcherservlet-web-xml)
+ - [XML Defined Beans in Spring Boot](https://www.baeldung.com/spring-boot-xml-beans)
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-basic-customization-2/pom.xml b/spring-boot-modules/spring-boot-basic-customization-2/pom.xml
index 3ce9266ebe..8c1bc22600 100644
--- a/spring-boot-modules/spring-boot-basic-customization-2/pom.xml
+++ b/spring-boot-modules/spring-boot-basic-customization-2/pom.xml
@@ -1,8 +1,12 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-basic-customization-2
+ jar
+ spring-boot-basic-customization-2
+ Module For Spring Boot Basic Customization 2com.baeldung.spring-boot-modules
@@ -11,23 +15,19 @@
../
- spring-boot-basic-customization-2
- jar
-
- spring-boot-basic-customization-2
- Module For Spring Boot Basic Customization 2
-
org.springframework.bootspring-boot-starter-web
-
org.springframework.bootspring-boot-starter-test
- test
+
+
+ junit
+ junit
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-xml/src/main/java/com/baeldung/springbootxml/Pojo.java b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/springbootxml/Pojo.java
similarity index 100%
rename from spring-boot-modules/spring-boot-xml/src/main/java/com/baeldung/springbootxml/Pojo.java
rename to spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/springbootxml/Pojo.java
diff --git a/spring-boot-modules/spring-boot-xml/src/main/java/com/baeldung/springbootxml/SpringBootXmlApplication.java b/spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/springbootxml/SpringBootXmlApplication.java
similarity index 100%
rename from spring-boot-modules/spring-boot-xml/src/main/java/com/baeldung/springbootxml/SpringBootXmlApplication.java
rename to spring-boot-modules/spring-boot-basic-customization-2/src/main/java/com/baeldung/springbootxml/SpringBootXmlApplication.java
diff --git a/spring-boot-modules/spring-boot-basic-customization-2/src/main/resources/application.properties b/spring-boot-modules/spring-boot-basic-customization-2/src/main/resources/application.properties
index e69de29bb2..ab9de92c82 100644
--- a/spring-boot-modules/spring-boot-basic-customization-2/src/main/resources/application.properties
+++ b/spring-boot-modules/spring-boot-basic-customization-2/src/main/resources/application.properties
@@ -0,0 +1 @@
+sample=string loaded from properties!
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-xml/src/main/resources/beans.xml b/spring-boot-modules/spring-boot-basic-customization-2/src/main/resources/beans.xml
similarity index 100%
rename from spring-boot-modules/spring-boot-xml/src/main/resources/beans.xml
rename to spring-boot-modules/spring-boot-basic-customization-2/src/main/resources/beans.xml
diff --git a/spring-boot-modules/spring-boot-xml/src/main/java/com/baeldung/springbootxml/SpringBootXmlApplicationIntegrationTest.java b/spring-boot-modules/spring-boot-basic-customization-2/src/main/test/com/baeldung/springbootxml/SpringBootXmlApplicationIntegrationTest.java
similarity index 99%
rename from spring-boot-modules/spring-boot-xml/src/main/java/com/baeldung/springbootxml/SpringBootXmlApplicationIntegrationTest.java
rename to spring-boot-modules/spring-boot-basic-customization-2/src/main/test/com/baeldung/springbootxml/SpringBootXmlApplicationIntegrationTest.java
index 2c3993d0d8..f3060de82a 100644
--- a/spring-boot-modules/spring-boot-xml/src/main/java/com/baeldung/springbootxml/SpringBootXmlApplicationIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-basic-customization-2/src/main/test/com/baeldung/springbootxml/SpringBootXmlApplicationIntegrationTest.java
@@ -1,5 +1,6 @@
package com.baeldung.springbootxml;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/spring-boot-modules/spring-boot-basic-customization/pom.xml b/spring-boot-modules/spring-boot-basic-customization/pom.xml
index fc34994a85..5ab747cff1 100644
--- a/spring-boot-modules/spring-boot-basic-customization/pom.xml
+++ b/spring-boot-modules/spring-boot-basic-customization/pom.xml
@@ -1,8 +1,12 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-basic-customization
+ jar
+ spring-boot-basic-customization
+ Module For Spring Boot Basic Customizationcom.baeldung.spring-boot-modules
@@ -11,28 +15,19 @@
../
- spring-boot-basic-customization
- jar
-
- spring-boot-basic-customization
- Module For Spring Boot Basic Customization
-
org.springframework.bootspring-boot-starter
-
org.springframework.bootspring-boot-starter-web
-
org.springframework.bootspring-boot-starter-thymeleaf
-
org.springframework.bootspring-boot-starter-test
@@ -44,4 +39,5 @@
com.baeldung.changeport.CustomApplication
-
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-bootstrap/pom.xml b/spring-boot-modules/spring-boot-bootstrap/pom.xml
index 6a1be7a2c8..f94ee9ca31 100644
--- a/spring-boot-modules/spring-boot-bootstrap/pom.xml
+++ b/spring-boot-modules/spring-boot-bootstrap/pom.xml
@@ -1,7 +1,12 @@
-
+4.0.0
+ spring-boot-bootstrap
+ jar
+ spring-boot-bootstrap
+ Demo project for Spring Bootcom.baeldung.spring-boot-modules
@@ -10,12 +15,6 @@
../
- spring-boot-bootstrap
- jar
-
- spring-boot-bootstrap
- Demo project for Spring Boot
-
org.springframework.boot
@@ -167,7 +166,7 @@
org.springframework.cloudspring-cloud-dependencies
- Greenwich.RELEASE
+ ${spring-cloud.version}pomimport
@@ -177,12 +176,12 @@
org.springframework.cloudspring-cloud-gcp-starter
- 1.0.0.RELEASE
+ ${spring-cloud-gcp.version}org.springframework.cloudspring-cloud-gcp-starter-sql-mysql
- 1.0.0.RELEASE
+ ${spring-cloud-gcp.version}
@@ -215,7 +214,7 @@
org.springframework.cloudspring-cloud-dependencies
- Greenwich.RELEASE
+ ${spring-cloud.version}pomimport
@@ -332,6 +331,8 @@
4.0.0
+ Greenwich.RELEASE
+ 1.0.0.RELEASE
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-camel/pom.xml b/spring-boot-modules/spring-boot-camel/pom.xml
index 46a90b4722..0069dfdbff 100644
--- a/spring-boot-modules/spring-boot-camel/pom.xml
+++ b/spring-boot-modules/spring-boot-camel/pom.xml
@@ -1,12 +1,13 @@
-4.0.0com.examplespring-boot-camel0.0.1-SNAPSHOT
- spring-boot-camel
-
+ spring-boot-camel
+
com.baeldungparent-boot-2
@@ -48,7 +49,6 @@
spring-boot:run
-
org.springframework.boot
@@ -68,4 +68,4 @@
3.0.0-M4
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-cassandre/README.md b/spring-boot-modules/spring-boot-cassandre/README.md
new file mode 100644
index 0000000000..4dfef587db
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/README.md
@@ -0,0 +1,11 @@
+# Cassandre trading bot example
+
+This project is an example of a trading bot developed with Cassandre
+
+## Running the examples
+
+* `mvn test` - Run strategy backtesting
+* `mvn spring-boot:run` - Run the bot
+
+## Relevant Articles
+- [Build a Trading Bot with Cassandre Spring Boot Starter](https://www.baeldung.com/cassandre-spring-boot-trading-bot)
diff --git a/spring-boot-modules/spring-boot-cassandre/pom.xml b/spring-boot-modules/spring-boot-cassandre/pom.xml
new file mode 100644
index 0000000000..75163d2c2b
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/pom.xml
@@ -0,0 +1,68 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.4.5
+
+
+ com.example
+ demo
+ 0.0.1-SNAPSHOT
+ Cassandre trading bot tutorial
+ Cassandre trading bot tutorial
+
+ 11
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+
+ tech.cassandre.trading.bot
+ cassandre-trading-bot-spring-boot-starter
+ 4.2.1
+
+
+ org.knowm.xchange
+ xchange-kucoin
+ 5.0.7
+
+
+ org.hsqldb
+ hsqldb
+ 2.5.1
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ tech.cassandre.trading.bot
+ cassandre-trading-bot-spring-boot-starter-test
+ 4.2.1
+ test
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ 2.4.5
+
+
+
+
+
diff --git a/spring-boot-modules/spring-boot-cassandre/src/main/java/com/example/demo/DemoApplication.java b/spring-boot-modules/spring-boot-cassandre/src/main/java/com/example/demo/DemoApplication.java
new file mode 100644
index 0000000000..094d95b93f
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/src/main/java/com/example/demo/DemoApplication.java
@@ -0,0 +1,13 @@
+package com.example.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DemoApplication.class, args);
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-cassandre/src/main/java/com/example/demo/MyFirstStrategy.java b/spring-boot-modules/spring-boot-cassandre/src/main/java/com/example/demo/MyFirstStrategy.java
new file mode 100644
index 0000000000..ea8ae74aa6
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/src/main/java/com/example/demo/MyFirstStrategy.java
@@ -0,0 +1,66 @@
+package com.example.demo;
+
+import static tech.cassandre.trading.bot.dto.position.PositionStatusDTO.CLOSED;
+import static tech.cassandre.trading.bot.dto.position.PositionStatusDTO.OPENED;
+import static tech.cassandre.trading.bot.dto.util.CurrencyDTO.BTC;
+import static tech.cassandre.trading.bot.dto.util.CurrencyDTO.USDT;
+
+import java.math.BigDecimal;
+import java.util.Optional;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import tech.cassandre.trading.bot.dto.market.TickerDTO;
+import tech.cassandre.trading.bot.dto.position.PositionDTO;
+import tech.cassandre.trading.bot.dto.position.PositionRulesDTO;
+import tech.cassandre.trading.bot.dto.user.AccountDTO;
+import tech.cassandre.trading.bot.dto.util.CurrencyPairDTO;
+import tech.cassandre.trading.bot.strategy.BasicCassandreStrategy;
+import tech.cassandre.trading.bot.strategy.CassandreStrategy;
+
+@CassandreStrategy
+public class MyFirstStrategy extends BasicCassandreStrategy {
+
+ private final Logger logger = LoggerFactory.getLogger(MyFirstStrategy.class);
+
+ @Override
+ public Set getRequestedCurrencyPairs() {
+ return Set.of(new CurrencyPairDTO(BTC, USDT));
+ }
+
+ @Override
+ public Optional getTradeAccount(Set accounts) {
+ return accounts.stream()
+ .filter(a -> "trade".equals(a.getName()))
+ .findFirst();
+ }
+
+ @Override
+ public void onTickerUpdate(TickerDTO ticker) {
+ logger.info("Received a new ticker : {}", ticker);
+
+ if (new BigDecimal("56000").compareTo(ticker.getLast()) == -1) {
+
+ if (canBuy(new CurrencyPairDTO(BTC, USDT), new BigDecimal("0.01"))) {
+ PositionRulesDTO rules = PositionRulesDTO.builder()
+ .stopGainPercentage(4f)
+ .stopLossPercentage(25f)
+ .build();
+ createLongPosition(new CurrencyPairDTO(BTC, USDT), new BigDecimal("0.01"), rules);
+ }
+
+ }
+ }
+
+ @Override
+ public void onPositionStatusUpdate(PositionDTO position) {
+ if (position.getStatus() == OPENED) {
+ logger.info("> New position opened : {}", position.getPositionId());
+ }
+ if (position.getStatus() == CLOSED) {
+ logger.info("> Position closed : {}", position.getDescription());
+ }
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-cassandre/src/main/resources/application.properties b/spring-boot-modules/spring-boot-cassandre/src/main/resources/application.properties
new file mode 100644
index 0000000000..5ecdabd47a
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/src/main/resources/application.properties
@@ -0,0 +1,22 @@
+#
+# Exchange configuration.
+cassandre.trading.bot.exchange.name=kucoin
+cassandre.trading.bot.exchange.username=kucoin.cassandre.test@gmail.com
+cassandre.trading.bot.exchange.passphrase=cassandre
+cassandre.trading.bot.exchange.key=6054ad25365ac6000689a998
+cassandre.trading.bot.exchange.secret=af080d55-afe3-47c9-8ec1-4b479fbcc5e7
+#
+# Modes
+cassandre.trading.bot.exchange.modes.sandbox=true
+cassandre.trading.bot.exchange.modes.dry=false
+#
+# Exchange API calls rates (ms or standard ISO 8601 duration like 'PT5S').
+cassandre.trading.bot.exchange.rates.account=2000
+cassandre.trading.bot.exchange.rates.ticker=2000
+cassandre.trading.bot.exchange.rates.trade=2000
+#
+# Database configuration.
+cassandre.trading.bot.database.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver
+cassandre.trading.bot.database.datasource.url=jdbc:hsqldb:mem:cassandre
+cassandre.trading.bot.database.datasource.username=sa
+cassandre.trading.bot.database.datasource.password=
diff --git a/spring-boot-modules/spring-boot-cassandre/src/test/java/com/example/demo/DemoApplicationTests.java b/spring-boot-modules/spring-boot-cassandre/src/test/java/com/example/demo/DemoApplicationTests.java
new file mode 100644
index 0000000000..eaa99696e2
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/src/test/java/com/example/demo/DemoApplicationTests.java
@@ -0,0 +1,13 @@
+package com.example.demo;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class DemoApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-cassandre/src/test/java/com/example/demo/MyFirstStrategyUnitTest.java b/spring-boot-modules/spring-boot-cassandre/src/test/java/com/example/demo/MyFirstStrategyUnitTest.java
new file mode 100644
index 0000000000..bf7c353821
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/src/test/java/com/example/demo/MyFirstStrategyUnitTest.java
@@ -0,0 +1,55 @@
+package com.example.demo;
+
+import static org.awaitility.Awaitility.await;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static tech.cassandre.trading.bot.dto.position.PositionStatusDTO.OPENED;
+import static tech.cassandre.trading.bot.dto.util.CurrencyDTO.USDT;
+
+import java.util.HashMap;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Import;
+
+import tech.cassandre.trading.bot.dto.util.CurrencyDTO;
+import tech.cassandre.trading.bot.dto.util.GainDTO;
+import tech.cassandre.trading.bot.test.mock.TickerFluxMock;
+
+@SpringBootTest
+@Import(TickerFluxMock.class)
+@DisplayName("Simple strategy test")
+public class MyFirstStrategyUnitTest {
+
+ private final Logger logger = LoggerFactory.getLogger(MyFirstStrategyUnitTest.class);
+
+ @Autowired
+ private MyFirstStrategy strategy;
+
+ @Autowired
+ private TickerFluxMock tickerFluxMock;
+
+ @Test
+ @DisplayName("Check gains")
+ public void whenTickersArrives_thenCheckGains() {
+ await().forever().until(() -> tickerFluxMock.isFluxDone());
+
+ final HashMap gains = strategy.getGains();
+
+ logger.info("Cumulated gains:");
+ gains.forEach((currency, gain) -> logger.info(currency + " : " + gain.getAmount()));
+
+ logger.info("Position still opened :");
+ strategy.getPositions()
+ .values()
+ .stream()
+ .filter(p -> p.getStatus().equals(OPENED))
+ .forEach(p -> logger.info(" - {} " + p.getDescription()));
+
+ assertTrue(gains.get(USDT).getPercentage() > 0);
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-cassandre/src/test/resources/application.properties b/spring-boot-modules/spring-boot-cassandre/src/test/resources/application.properties
new file mode 100644
index 0000000000..3d6feb09d7
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/src/test/resources/application.properties
@@ -0,0 +1,22 @@
+#
+# Exchange configuration.
+cassandre.trading.bot.exchange.name=kucoin
+cassandre.trading.bot.exchange.username=kucoin.cassandre.test@gmail.com
+cassandre.trading.bot.exchange.passphrase=cassandre
+cassandre.trading.bot.exchange.key=6054ad25365ac6000689a998
+cassandre.trading.bot.exchange.secret=af080d55-afe3-47c9-8ec1-4b479fbcc5e7
+#
+# Modes
+cassandre.trading.bot.exchange.modes.sandbox=true
+cassandre.trading.bot.exchange.modes.dry=true
+#
+# Exchange API calls rates (ms or standard ISO 8601 duration like 'PT5S').
+cassandre.trading.bot.exchange.rates.account=2000
+cassandre.trading.bot.exchange.rates.ticker=2000
+cassandre.trading.bot.exchange.rates.trade=2000
+#
+# Database configuration.
+cassandre.trading.bot.database.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver
+cassandre.trading.bot.database.datasource.url=jdbc:hsqldb:mem:cassandre
+cassandre.trading.bot.database.datasource.username=sa
+cassandre.trading.bot.database.datasource.password=
diff --git a/spring-boot-modules/spring-boot-cassandre/src/test/resources/tickers-btc-usdt.tsv b/spring-boot-modules/spring-boot-cassandre/src/test/resources/tickers-btc-usdt.tsv
new file mode 100644
index 0000000000..b89bd96bdc
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/src/test/resources/tickers-btc-usdt.tsv
@@ -0,0 +1,89 @@
+1612569600 38294.4 39195.5 40964.2 38217.5 3882.29460938 153897343.463150723
+1612656000 39195.4 38807.6 39623.6 37341.4 2389.96820017 91972455.834535369
+1612742400 38807.6 46373.5 46767.9 38010 4971.54731481 212132648.426718929
+1612828800 46374.6 46434.8 48139.3 44961 4330.72854712 201891604.027160303
+1612915200 46430 44812.2 47300 43687.5 4351.84907778 198189685.592028516
+1613001600 44806.1 47941.5 48647.6 44005.8 4045.91883504 188171651.974437139
+1613088000 47963.1 47310.7 48958.8 46181.2 3356.01832119 159561721.419695848
+1613174400 47305.4 47152.6 48120.5 46225.5 2740.99221759 129227867.922246174
+1613260800 47152.5 48591.9 49686.9 47026.3 3359.4690565 163299915.839307312
+1613347200 48587.2 47904.4 49003.6 42841.6 3974.98461358 188990056.26923591
+1613433600 47913.1 49147.7 50619.3 47023.9 3599.85370182 176084748.845657596
+1613520000 49147.7 52118.1 52609.6 48931.1 3356.85082847 170893567.530348564
+1613606400 52114.3 51568.9 52522.9 50906.4 2183.18379408 113272339.172174965
+1613692800 51561.1 55890.5 56317.7 50727 3749.6920105 200656740.865959032
+1613779200 55893.6 55851.5 57622.6 53463.3 3394.87226216 190744601.429330887
+1613865600 55851.4 57423 58336.3 55489.6 2514.02340013 143658132.671448082
+1613952000 57420.6 54096.6 57517.8 44160 6125.32442907 330513978.457310237
+1614038400 54085.9 48908.3 54174.2 44900 8048.96505298 389277314.445372085
+1614124800 48902.9 49685.2 51361.9 47003.2 4816.75027676 239303706.844272809
+1614211200 49676.5 47082.7 52019.6 46624.4 3701.80236678 184044004.383578525
+1614297600 47082 46289.6 48408.8 44135 5329.77125908 247604118.914146591
+1614384000 46290.2 46114.4 48381.9 44836.5 2872.64640734 134946360.020429589
+1614470400 46111.3 45141.6 46626.1 43004.3 3940.17863714 175990962.484551548
+1614556800 45136.5 49590.3 49771.3 44958.9 3548.51026561 169389196.772247159
+1614643200 49590.3 48441.2 50201.6 47052.8 2936.94454126 142575425.463057812
+1614729600 48440.6 50345.5 52623.9 48100 3177.38943911 160801620.821885745
+1614816000 50347.6 48374.5 51762.1 47505.7 3624.17683614 178873453.27515484
+1614902400 48374.5 48758.9 49450 46189.8 3697.34556922 176318969.507294567
+1614988800 48746.9 48871.9 49255.1 47001 1949.15311354 94201823.810314647
+1615075200 48885 50930.4 51424.7 48885 2444.3584982 122962479.787996993
+1615161600 50956.6 52377 52387.5 49287.5 2710.99151191 137751640.241286989
+1615248000 52376.9 54867.6 54867.6 51833.8 3070.93581512 165487483.114064122
+1615334400 54867.5 55865.5 57364 52911.4 4049.50553851 224565244.752334892
+1615420800 55863.7 57781.1 58150 54238 3403.69441456 191915265.020541521
+1615507200 57781 57238.5 58057.5 55013.7 4031.0376629 228810606.091302364
+1615593600 57220.7 61180.9 61815.3 56059.3 4394.62318443 259602986.875738328
+1615680000 61174.3 59000 61700 59000 3084.33952274 186155667.656432156
+1615766400 59000 55607.1 60632.9 54525.6 5910.33518227 338468393.188725572
+1615852800 55607.1 56880.3 56918.9 53240.3 7410.49057723 409052587.523700888
+1615939200 56880.3 58875.8 58951.8 54147.5 5828.79026943 328135601.648660052
+1616025600 58882.9 57648.9 60107.7 57000 5073.7458698 297279816.540519693
+1616112000 57648.9 58024.2 59450.1 56071 3727.09434161 217005823.723994618
+1616198400 58024.3 58113.5 59874.6 57825.6 2746.52973805 161565114.165299707
+1616284800 58113.5 57350.2 58591.6 55501 3265.35649781 186845535.507151609
+1616371200 57345.3 54096.1 58415.5 53667 4219.99501831 237141977.003568352
+1616457600 54086.8 54348.4 55823.1 52986.3 4374.34046303 239135883.538398977
+1616544000 54348.4 52307.4 57200 51499.6 6416.76024581 351202326.218690674
+1616630400 52307.1 51301.7 53239.1 50455 7242.6466396 375950351.557038048
+1616716800 51301.7 55032 55062.5 51225.3 4609.48192944 245299757.451540308
+1616803200 55031.9 55820.4 56628.6 53967.5 3634.73588532 200758048.816804103
+1616889600 55820.3 55772.9 56541 54666.6 3158.20452681 176119911.151714842
+1616976000 55772.8 57628.9 58400.5 54926.5 4413.63121553 251384747.301649587
+1617062400 57630.8 58754.6 59351.9 57072.8 3563.87315049 208118726.050535887
+1617148800 58753.2 58745.9 59800 56357.5 4921.45848213 288469053.074870873
+1617235200 58745.5 58735.7 59487.1 57879 3163.98213108 186078130.901422269
+1617321600 58735.7 58963.6 60179.1 58460.7 2553.76427314 151446539.609794648
+1617408000 58963.6 57058.3 59795 56721.2 2512.19109578 147434403.06515736
+1617494400 57052.5 58201.4 58481.2 56432.6 2069.14670128 119228330.17272614
+1617580800 58201.4 59116.2 59254.1 56501 3003.76043377 174821106.684799505
+1617667200 59116.2 57988.3 59497.5 57304.8 2964.86183859 173169186.845682699
+1617753600 57988.3 55958.2 58668.6 55439 5277.04906389 299996660.411940246
+1617840000 55958.2 58076.7 58141 55700.6 3175.60482079 181817013.517575328
+1617926400 58076.7 58131.6 58900 57666.9 3516.19104669 204849717.059779284
+1618012800 58138.2 59770.2 61350 57902.1 5533.50675561 332014577.538990658
+1618099200 59770.2 60007.6 60687.4 59247.6 3896.37426019 233158562.799039154
+1618185600 60007.6 59863.4 61270.7 59417.4 4611.409014 277430208.743380477
+1618272000 59863.4 63578.7 63759.7 59815 6906.310253 430518557.569547626
+1618358400 63578.7 62958.7 64840 61000 7696.509177 487298143.928065301
+1618444800 62954.4 63152.6 63772.1 62023.9 4709.82427144 296178401.81115496
+1618531200 63152.6 61342.6 63509.7 59930.8 8295.32523869 510423835.691643255
+1618617600 61342.7 59995.2 62497.8 59599.6 5367.42979289 328364887.709585395
+1618704000 59995.3 56150.6 60409.5 49001 11485.97101449 637797282.448645379
+1618790400 56152.7 55618.8 57583.4 54205.2 7721.306905 432634348.931871989
+1618876800 55618.7 56427.8 57061.6 53328 8677.75606016 480164200.559836543
+1618963200 56426.1 53793.6 56761.7 53602 6240.82191836 345339357.806167462
+1619049600 53793.5 51696.4 55474.7 50400 8879.16016304 475394174.249706678
+1619136000 51691.2 51102.7 52112.1 47502.1 8885.07060366 441295812.644904319
+1619222400 51109.8 50033 51157.9 48676.5 4833.41744745 241336360.887795675
+1619308800 50041.5 49086.9 50554.6 46966.2 4805.34664069 237153315.222670555
+1619395200 49069 54000.2 54336.4 48775.8 6695.12934907 353727728.269533971
+1619481600 53997.1 55014.3 55439 53240.8 4344.22291318 237020455.905144335
+1619568000 55014.2 54833.2 56399.1 53808.3 4801.04618634 262912695.604761319
+1619654400 54833.1 53558.4 55181.2 52340.1 4356.05177188 234153663.397444462
+1619740800 53558.5 57697.3 57936.4 53042.6 5000.47557303 277531927.921795199
+1619827200 57697.3 57794.7 58471.4 57006.3 3639.78966647 210179438.189007639
+1619913600 57794.7 56568.5 57903.7 56044.3 3508.52428767 199206958.05741809
+1620000000 56568.5 57159.7 58977.9 56451.3 4780.43387226 276554749.540429296
+1620086400 57159.7 53196.3 57188.2 53083.3 7079.55804728 390469293.396018923
+1620172800 53196.3 57834.5 57979.7 52888 4224.63060355 233779565.506303973
diff --git a/spring-boot-modules/spring-boot-cassandre/src/test/resources/user-trade.tsv b/spring-boot-modules/spring-boot-cassandre/src/test/resources/user-trade.tsv
new file mode 100644
index 0000000000..d0fa4e9767
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/src/test/resources/user-trade.tsv
@@ -0,0 +1,3 @@
+BTC 1
+USDT 100000
+ETH 10
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-ci-cd/pom.xml b/spring-boot-modules/spring-boot-ci-cd/pom.xml
index 61a2e299fb..fb1810c62e 100644
--- a/spring-boot-modules/spring-boot-ci-cd/pom.xml
+++ b/spring-boot-modules/spring-boot-ci-cd/pom.xml
@@ -1,8 +1,12 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-ci-cd
+ 0.0.1-SNAPSHOT
+ jar
+ spring-boot-ci-cdcom.baeldung.spring-boot-modules
@@ -11,18 +15,11 @@
../
- spring-boot-ci-cd
- 0.0.1-SNAPSHOT
- jar
-
- spring-boot-ci-cd
-
org.springframework.bootspring-boot-starter-web
-
org.springframework.bootspring-boot-starter-actuator
@@ -73,7 +70,8 @@
spring-boot-ci-cd
- java $JAVA_OPTS -jar -Dserver.port=$PORT target/${project.build.finalName}.jar
+ java $JAVA_OPTS -jar -Dserver.port=$PORT
+ target/${project.build.finalName}.jar
diff --git a/spring-boot-modules/spring-boot-client/pom.xml b/spring-boot-modules/spring-boot-client/pom.xml
index aa832497e9..7f54d0e541 100644
--- a/spring-boot-modules/spring-boot-client/pom.xml
+++ b/spring-boot-modules/spring-boot-client/pom.xml
@@ -1,7 +1,13 @@
-4.0.0
+ spring-boot-client
+ 0.0.1-SNAPSHOT
+ war
+ spring-boot-client
+ This is simple boot client application for Spring boot actuator testcom.baeldung.spring-boot-modules
@@ -10,13 +16,6 @@
../
- spring-boot-client
- 0.0.1-SNAPSHOT
- war
-
- spring-boot-client
- This is simple boot client application for Spring boot actuator test
-
org.springframework.boot
@@ -48,7 +47,6 @@
org.springframeworkspring-messaging
-
@@ -59,22 +57,17 @@
true
-
-
org.apache.maven.pluginsmaven-war-plugin
-
pl.project13.mavengit-commit-id-plugin${git-commit-id-plugin.version}
-
-
@@ -116,7 +109,7 @@
18.0
- 2.2.4
+ 2.2.4
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-application/pom.xml b/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-application/pom.xml
index 9a311adfec..12a39b75fe 100644
--- a/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-application/pom.xml
+++ b/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-application/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0data-jpa-application0.0.1-SNAPSHOT
diff --git a/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-library/pom.xml b/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-library/pom.xml
index 2da9e5aa2c..c8be287abd 100644
--- a/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-library/pom.xml
+++ b/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-library/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0data-jpa-library0.0.1-SNAPSHOT
diff --git a/spring-boot-modules/spring-boot-config-jpa-error/pom.xml b/spring-boot-modules/spring-boot-config-jpa-error/pom.xml
index d236a581d8..b5207f8997 100644
--- a/spring-boot-modules/spring-boot-config-jpa-error/pom.xml
+++ b/spring-boot-modules/spring-boot-config-jpa-error/pom.xml
@@ -1,7 +1,12 @@
-
+4.0.0
+ com.baeldung.spring-boot-config-jpa-error
+ spring-boot-config-jpa-error
+ 0.0.1-SNAPSHOT
+ pomcom.baeldung.spring-boot-modules
@@ -10,11 +15,6 @@
../
- com.baeldung.spring-boot-config-jpa-error
- spring-boot-config-jpa-error
- 0.0.1-SNAPSHOT
- pom
-
data-jpa-librarydata-jpa-application
@@ -38,14 +38,12 @@
spring-boot-starter-data-jpa${spring-boot.version}
-
org.springframework.bootspring-boot-starter-test${spring-boot.version}test
-
com.h2databaseh2
diff --git a/spring-boot-modules/spring-boot-crud/pom.xml b/spring-boot-modules/spring-boot-crud/pom.xml
index cf1bfe6da0..79eccf2fba 100644
--- a/spring-boot-modules/spring-boot-crud/pom.xml
+++ b/spring-boot-modules/spring-boot-crud/pom.xml
@@ -1,8 +1,10 @@
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
4.0.0
+ spring-boot-crud
+ spring-boot-crudcom.baeldung.spring-boot-modules
@@ -11,10 +13,6 @@
../
- spring-boot-crud
-
- spring-boot-crud
-
org.springframework.boot
@@ -86,4 +84,4 @@
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-ctx-fluent/pom.xml b/spring-boot-modules/spring-boot-ctx-fluent/pom.xml
index cfbc6ffac0..8a7aca076e 100644
--- a/spring-boot-modules/spring-boot-ctx-fluent/pom.xml
+++ b/spring-boot-modules/spring-boot-ctx-fluent/pom.xml
@@ -1,7 +1,12 @@
-4.0.0
+ spring-boot-ctx-fluent
+ 0.0.1-SNAPSHOT
+ jar
+ spring-boot-ctx-fluentcom.baeldung.spring-boot-modules
@@ -10,12 +15,6 @@
../
- spring-boot-ctx-fluent
- 0.0.1-SNAPSHOT
- jar
-
- spring-boot-ctx-fluent
-
org.springframework.boot
@@ -23,4 +22,4 @@
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter-library/pom.xml b/spring-boot-modules/spring-boot-custom-starter/greeter-library/pom.xml
index 34cc530f2f..5c9d477502 100644
--- a/spring-boot-modules/spring-boot-custom-starter/greeter-library/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/greeter-library/pom.xml
@@ -1,11 +1,12 @@
-
+4.0.0greeter-library0.0.1-SNAPSHOT
- greeter-library
-
+ greeter-library
+
com.baeldung.spring-boot-modulesspring-boot-custom-starter
diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml
index 532f45cf3e..d7f437633d 100644
--- a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0greeter-spring-boot-autoconfigure0.0.1-SNAPSHOT
@@ -18,27 +19,23 @@
spring-boot${spring-boot.version}
-
org.springframework.bootspring-boot-autoconfigure${spring-boot.version}
-
org.springframework.bootspring-boot-configuration-processor${spring-boot.version}true
-
com.baeldung.spring-boot-modulesgreeter-library${greeter.version}true
-
org.springframework.bootspring-boot-starter-test
@@ -62,7 +59,6 @@
- UTF-82.2.6.RELEASE0.0.1-SNAPSHOT
diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml
index 6291756d21..815c3e8366 100644
--- a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml
@@ -1,10 +1,11 @@
-4.0.0greeter-spring-boot-sample-app0.0.1-SNAPSHOT
- greeter-spring-boot-sample-app
+ greeter-spring-boot-sample-appcom.baeldung.spring-boot-modules
@@ -12,34 +13,34 @@
0.0.1-SNAPSHOT../
-
+
com.baeldung.spring-boot-modulesgreeter-spring-boot-starter${greeter-starter.version}
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
- ${spring-boot.version}
-
-
-
-
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot.version}
+
+
+
+ 0.0.1-SNAPSHOT
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml
index 0e8fb4cbc9..0ea27a839f 100644
--- a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml
@@ -1,10 +1,11 @@
-
+4.0.0greeter-spring-boot-starter0.0.1-SNAPSHOT
- greeter-spring-boot-starter
+ greeter-spring-boot-startercom.baeldung.spring-boot-modules
@@ -13,25 +14,21 @@
-
org.springframework.bootspring-boot-starter${spring-boot.version}
-
com.baeldung.spring-boot-modulesgreeter-spring-boot-autoconfigure${project.version}
-
com.baeldung.spring-boot-modulesgreeter-library${greeter.version}
-
@@ -49,7 +46,6 @@
- UTF-80.0.1-SNAPSHOT2.2.6.RELEASE
diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter/pom.xml b/spring-boot-modules/spring-boot-custom-starter/greeter/pom.xml
index 47296990aa..f96880b1cf 100644
--- a/spring-boot-modules/spring-boot-custom-starter/greeter/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/greeter/pom.xml
@@ -1,16 +1,17 @@
-4.0.0greeter0.0.1-SNAPSHOT
- greeter
-
+ greeter
+
com.baeldungparent-boot-20.0.1-SNAPSHOT../../../parent-boot-2
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/application/pom.xml b/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/application/pom.xml
index fb235bc479..948482b21b 100644
--- a/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/application/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/application/pom.xml
@@ -1,5 +1,6 @@
-4.0.0com.baeldung.example
diff --git a/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/library/pom.xml b/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/library/pom.xml
index d979f1d9bf..5d45de0d1d 100644
--- a/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/library/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/library/pom.xml
@@ -1,5 +1,6 @@
-4.0.0com.baeldung.example
diff --git a/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/pom.xml b/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/pom.xml
index 75ff927789..2a483a8fef 100644
--- a/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/pom.xml
@@ -1,5 +1,6 @@
-4.0.0com.baeldung
diff --git a/spring-boot-modules/spring-boot-custom-starter/pom.xml b/spring-boot-modules/spring-boot-custom-starter/pom.xml
index 338bf22f46..27e3a03153 100644
--- a/spring-boot-modules/spring-boot-custom-starter/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/pom.xml
@@ -1,7 +1,12 @@
-
+4.0.0
+ spring-boot-custom-starter
+ 0.0.1-SNAPSHOT
+ spring-boot-custom-starter
+ pomcom.baeldung.spring-boot-modules
@@ -10,12 +15,6 @@
../
- spring-boot-custom-starter
- 0.0.1-SNAPSHOT
- pom
-
- spring-boot-custom-starter
-
greeter-librarygreeter
@@ -24,4 +23,5 @@
greeter-spring-boot-sample-appparent-multi-module
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-data-2/pom.xml b/spring-boot-modules/spring-boot-data-2/pom.xml
index fb0d5f2053..b7006782c8 100644
--- a/spring-boot-modules/spring-boot-data-2/pom.xml
+++ b/spring-boot-modules/spring-boot-data-2/pom.xml
@@ -1,16 +1,17 @@
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ spring-boot-data-2
+
com.baeldung.spring-boot-modulesspring-boot-modules1.0.0-SNAPSHOT../
- 4.0.0
- spring-boot-data-2org.springframework.boot
diff --git a/spring-boot-modules/spring-boot-data/pom.xml b/spring-boot-modules/spring-boot-data/pom.xml
index 06f09c70fe..447b730c02 100644
--- a/spring-boot-modules/spring-boot-data/pom.xml
+++ b/spring-boot-modules/spring-boot-data/pom.xml
@@ -1,7 +1,12 @@
-
+4.0.0
+ spring-boot-data
+ war
+ spring-boot-data
+ Spring Boot Data Modulecom.baeldung.spring-boot-modules
@@ -10,12 +15,6 @@
../
- spring-boot-data
- war
-
- spring-boot-data
- Spring Boot Data Module
-
org.springframework.boot
@@ -63,7 +62,6 @@
true
-
org.apache.maven.plugins
@@ -173,5 +171,5 @@
1.81.8
-
-
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-deployment/pom.xml b/spring-boot-modules/spring-boot-deployment/pom.xml
index ae546016f2..7c78d20afc 100644
--- a/spring-boot-modules/spring-boot-deployment/pom.xml
+++ b/spring-boot-modules/spring-boot-deployment/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0spring-boot-deploymentspring-boot-deployment
@@ -19,77 +20,64 @@
org.springframework.bootspring-boot-starter-web
-
org.springframework.bootspring-boot-starter-thymeleafprovided
-
org.springframework.bootspring-boot-starter-testtest
-
org.springframework.bootspring-boot-starter-data-jpa
-
org.springframework.bootspring-boot-starter-mail
-
org.springframework.bootspring-boot-starter-actuator
-
com.h2databaseh2runtime
-
javax.persistencejavax.persistence-api${jpa.version}
-
com.google.guavaguava${guava.version}
-
org.subethamailsubethasmtp${subethasmtp.version}test
-
org.webjarsbootstrap${bootstrap.version}
-
org.webjarsjquery${jquery.version}
-
org.apache.httpcomponentshttpclient${httpclient.version}
-
@@ -123,8 +111,8 @@
maven-failsafe-plugin2.18
-
+
integration-tests
@@ -132,8 +120,8 @@
verify
-
+
**/ExternalPropertyFileLoaderIntegrationTest.java
@@ -192,4 +180,4 @@
4.5.8
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-di/pom.xml b/spring-boot-modules/spring-boot-di/pom.xml
index 58b427a4a8..0e9fb49a95 100644
--- a/spring-boot-modules/spring-boot-di/pom.xml
+++ b/spring-boot-modules/spring-boot-di/pom.xml
@@ -1,8 +1,12 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-di
+ jar
+ spring-boot-di
+ Module For Spring Boot DIcom.baeldung.spring-boot-modules
@@ -11,34 +15,24 @@
../
- spring-boot-di
- jar
-
- spring-boot-di
- Module For Spring Boot DI
-
org.aspectjaspectjweaver
-
org.springframework.bootspring-boot-starter-web
-
org.springframework.bootspring-boot-starter-actuator
-
org.springframework.bootspring-boot-starter-tomcatprovided
-
org.apache.tomcat.embedtomcat-embed-jasper
@@ -49,7 +43,6 @@
spring-boot-starter-testtest
-
@@ -69,4 +62,4 @@
com.baeldung.SpringBootDiApplication
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-disable-logging/README.md b/spring-boot-modules/spring-boot-disable-logging/README.md
new file mode 100644
index 0000000000..348c0f6dba
--- /dev/null
+++ b/spring-boot-modules/spring-boot-disable-logging/README.md
@@ -0,0 +1,8 @@
+## Spring Boot Disable Logging
+
+This module contains articles about disabling logging in Spring Boot
+
+
+### Relevant Articles:
+
+- [How to Disable Console Logging in Spring Boot](https://www.baeldung.com/spring-boot-disable-console-logging)
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-jul/.gitignore b/spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/.gitignore
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-jul/.gitignore
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/.gitignore
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-jul/pom.xml b/spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/pom.xml
similarity index 84%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-jul/pom.xml
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/pom.xml
index 77629ffdd1..deee4e435f 100644
--- a/spring-boot-modules/spring-boot-runtime/disabling-console-jul/pom.xml
+++ b/spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/pom.xml
@@ -1,14 +1,15 @@
-
+4.0.0disabling-console-juldisabling-console-jul
-
+
com.baeldung.spring-boot-modules
- spring-boot-runtime
+ spring-boot-disable-logging1.0.0-SNAPSHOT../
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java b/spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java b/spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-jul/src/main/resources/application.properties b/spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/src/main/resources/application.properties
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-jul/src/main/resources/application.properties
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/src/main/resources/application.properties
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-jul/src/main/resources/logging.properties b/spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/src/main/resources/logging.properties
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-jul/src/main/resources/logging.properties
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/src/main/resources/logging.properties
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/.gitignore b/spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/.gitignore
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/.gitignore
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/.gitignore
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/pom.xml b/spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/pom.xml
similarity index 84%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/pom.xml
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/pom.xml
index fd57eccbbf..0524f9d401 100644
--- a/spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/pom.xml
+++ b/spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/pom.xml
@@ -1,14 +1,15 @@
-
+4.0.0disabling-console-log4j2disabling-console-log4j2
-
+
com.baeldung.spring-boot-modules
- spring-boot-runtime
+ spring-boot-disable-logging1.0.0-SNAPSHOT../
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java b/spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java b/spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/src/main/resources/log4j2.xml b/spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/src/main/resources/log4j2.xml
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/src/main/resources/log4j2.xml
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/src/main/resources/log4j2.xml
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-logback/.gitignore b/spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/.gitignore
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-logback/.gitignore
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/.gitignore
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-logback/pom.xml b/spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/pom.xml
similarity index 73%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-logback/pom.xml
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/pom.xml
index 8cb0e24bb7..0990209ff9 100644
--- a/spring-boot-modules/spring-boot-runtime/disabling-console-logback/pom.xml
+++ b/spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/pom.xml
@@ -1,14 +1,14 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0disabling-console-logbackdisabling-console-logbackcom.baeldung.spring-boot-modules
- spring-boot-runtime
+ spring-boot-disable-logging1.0.0-SNAPSHOT../
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java b/spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java b/spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-logback/src/main/resources/application.properties b/spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/src/main/resources/application.properties
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-logback/src/main/resources/application.properties
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/src/main/resources/application.properties
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-logback/src/main/resources/logback-spring.xml b/spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/src/main/resources/logback-spring.xml
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-logback/src/main/resources/logback-spring.xml
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/src/main/resources/logback-spring.xml
diff --git a/spring-boot-modules/spring-boot-disable-logging/pom.xml b/spring-boot-modules/spring-boot-disable-logging/pom.xml
new file mode 100644
index 0000000000..65de521c63
--- /dev/null
+++ b/spring-boot-modules/spring-boot-disable-logging/pom.xml
@@ -0,0 +1,24 @@
+
+
+ 4.0.0
+ spring-boot-disable-logging
+ 1.0.0-SNAPSHOT
+ pom
+ spring-boot-disable-logging
+
+
+ com.baeldung.spring-boot-modules
+ spring-boot-modules
+ 1.0.0-SNAPSHOT
+ ../
+
+
+
+ disabling-console-jul
+ disabling-console-log4j2
+ disabling-console-logback
+
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-environment/pom.xml b/spring-boot-modules/spring-boot-environment/pom.xml
index a3aab63a2d..5327825409 100644
--- a/spring-boot-modules/spring-boot-environment/pom.xml
+++ b/spring-boot-modules/spring-boot-environment/pom.xml
@@ -3,6 +3,10 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-environment
+ war
+ spring-boot-environment
+ Demo project for Spring Bootcom.baeldung.spring-boot-modules
@@ -11,24 +15,16 @@
../
- spring-boot-environment
- war
-
- spring-boot-environment
- Demo project for Spring Boot
-
org.springframework.bootspring-boot-starter-web
-
org.springframework.bootspring-boot-starter-thymeleafprovided
-
org.springframework.bootspring-boot-starter-test
@@ -45,58 +41,48 @@
-
org.springframework.bootspring-boot-starter-data-jpa
-
org.springframework.bootspring-boot-starter-mail
-
org.springframework.bootspring-boot-starter-actuator
-
com.h2databaseh2runtime
-
javax.persistencejavax.persistence-api${jpa.version}
-
com.google.guavaguava${guava.version}
-
org.subethamailsubethasmtp${subethasmtp.version}test
-
org.springframework.cloudspring-cloud-context
-
org.apache.httpcomponentshttpclient${httpclient.version}
-
@@ -169,4 +155,4 @@
2020.0.0
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-exceptions/README.md b/spring-boot-modules/spring-boot-exceptions/README.md
index 33ae193fb8..97a51203c7 100644
--- a/spring-boot-modules/spring-boot-exceptions/README.md
+++ b/spring-boot-modules/spring-boot-exceptions/README.md
@@ -5,3 +5,4 @@ This module contains articles about Spring Boot Exceptions
### Relevant Articles:
- [The BeanDefinitionOverrideException in Spring Boot](https://www.baeldung.com/spring-boot-bean-definition-override-exception)
+- [Spring Boot Error ApplicationContextException](https://www.baeldung.com/spring-boot-application-context-exception)
diff --git a/spring-boot-modules/spring-boot-exceptions/pom.xml b/spring-boot-modules/spring-boot-exceptions/pom.xml
index 1bfe8e6751..9866c418be 100644
--- a/spring-boot-modules/spring-boot-exceptions/pom.xml
+++ b/spring-boot-modules/spring-boot-exceptions/pom.xml
@@ -1,7 +1,12 @@
-
+4.0.0
+ spring-boot-exceptions
+ jar
+ spring-boot-exceptions
+ Demo project for working with Spring Boot exceptionscom.baeldung.spring-boot-modules
@@ -10,11 +15,13 @@
../
- spring-boot-exceptions
- jar
-
- spring-boot-exceptions
- Demo project for working with Spring Boot exceptions
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+ spring-boot-exceptions
@@ -26,4 +33,4 @@
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-exceptions/src/test/java/com/baeldung/applicationcontextexception/MainEntryPoint.java b/spring-boot-modules/spring-boot-exceptions/src/test/java/com/baeldung/applicationcontextexception/MainEntryPoint.java
new file mode 100644
index 0000000000..c187399636
--- /dev/null
+++ b/spring-boot-modules/spring-boot-exceptions/src/test/java/com/baeldung/applicationcontextexception/MainEntryPoint.java
@@ -0,0 +1,14 @@
+package com.baeldung.applicationcontextexception;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+//Remove this annotation to produce ApplicationContextException error
+@SpringBootApplication
+public class MainEntryPoint {
+
+ public static void main(String[] args) {
+ SpringApplication.run(MainEntryPoint.class, args);
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-flowable/pom.xml b/spring-boot-modules/spring-boot-flowable/pom.xml
index f1121ea6a0..fee4d9fdfc 100644
--- a/spring-boot-modules/spring-boot-flowable/pom.xml
+++ b/spring-boot-modules/spring-boot-flowable/pom.xml
@@ -1,8 +1,12 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-flowable
+ war
+ spring-boot-flowable
+ Spring Boot Flowable Modulecom.baeldung.spring-boot-modules
@@ -11,12 +15,6 @@
../
- spring-boot-flowable
- war
-
- spring-boot-flowable
- Spring Boot Flowable Module
-
org.springframework.boot
@@ -61,4 +59,5 @@
6.4.1
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-groovy/pom.xml b/spring-boot-modules/spring-boot-groovy/pom.xml
index 3392532081..ea9f3231cd 100644
--- a/spring-boot-modules/spring-boot-groovy/pom.xml
+++ b/spring-boot-modules/spring-boot-groovy/pom.xml
@@ -1,21 +1,20 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ com.baeldung.app
+ spring-boot-groovy
+ spring-boot-groovy
+ war
+ Spring Boot Todo Application with Groovy
- 4.0.0
- com.baeldung.app
- spring-boot-groovy
- spring-boot-groovy
- war
- Spring Boot Todo Application with Groovy
-
-
+ com.baeldungparent-boot-20.0.1-SNAPSHOT../../parent-boot-2
-
+
@@ -30,7 +29,6 @@
org.codehaus.groovygroovy
-
org.springframework.bootspring-boot-starter-test
@@ -41,7 +39,7 @@
h2runtime
-
+
@@ -54,7 +52,7 @@
gmavenplus-plugin1.9.0
-
+ addSourcesaddTestSources
@@ -65,7 +63,7 @@
removeStubsremoveTestStubs
-
+
@@ -75,4 +73,4 @@
com.baeldung.springwithgroovy.SpringBootGroovyApplication
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-jasypt/pom.xml b/spring-boot-modules/spring-boot-jasypt/pom.xml
index 2f0c8a27b4..1032500de7 100644
--- a/spring-boot-modules/spring-boot-jasypt/pom.xml
+++ b/spring-boot-modules/spring-boot-jasypt/pom.xml
@@ -1,7 +1,13 @@
-
+4.0.0
+ com.example.jasypt
+ spring-boot-jasypt
+ jar
+ spring-boot-jasypt
+ Demo project for Spring Bootcom.baeldung.spring-boot-modules
@@ -10,31 +16,21 @@
../
- com.example.jasypt
- spring-boot-jasypt
- jar
-
- spring-boot-jasypt
- Demo project for Spring Boot
-
org.springframework.bootspring-boot-starter
-
org.springframework.bootspring-boot-starter-testtest
-
com.github.ulisesbocchiojasypt-spring-boot-starter${jasypt.version}
-
com.github.ulisesbocchiojasypt-spring-boot
@@ -55,4 +51,4 @@
2.0.0
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-keycloak/pom.xml b/spring-boot-modules/spring-boot-keycloak/pom.xml
index cfcdcf2c37..b80dbfa191 100644
--- a/spring-boot-modules/spring-boot-keycloak/pom.xml
+++ b/spring-boot-modules/spring-boot-keycloak/pom.xml
@@ -1,6 +1,7 @@
-
+4.0.0com.baeldung.keycloakspring-boot-keycloak
@@ -41,7 +42,6 @@
org.springframework.bootspring-boot-starter-data-jpa
-
org.springframework.bootspring-boot-starter-test
@@ -76,7 +76,7 @@
- 11.0.2
+ 13.0.1
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/WebController.java b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/WebController.java
index 3bafe1f195..bbd96c8135 100644
--- a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/WebController.java
+++ b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/WebController.java
@@ -8,6 +8,8 @@ import java.security.Principal;
import org.springframework.beans.factory.annotation.Autowired;
+import javax.servlet.http.HttpServletRequest;
+
@Controller
public class WebController {
@@ -19,6 +21,12 @@ public class WebController {
return "external";
}
+ @GetMapping("/logout")
+ public String logout(HttpServletRequest request) throws Exception {
+ request.logout();
+ return "redirect:/";
+ }
+
@GetMapping(path = "/customers")
public String customers(Principal principal, Model model) {
addCustomers();
diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/resources/templates/customers.html b/spring-boot-modules/spring-boot-keycloak/src/main/resources/templates/customers.html
index 5a060d31da..de2df93ef1 100644
--- a/spring-boot-modules/spring-boot-keycloak/src/main/resources/templates/customers.html
+++ b/spring-boot-modules/spring-boot-keycloak/src/main/resources/templates/customers.html
@@ -27,6 +27,7 @@