diff --git a/algorithms-miscellaneous-2/README.md b/algorithms-miscellaneous-2/README.md
index 7560fc4fe7..26737b61f0 100644
--- a/algorithms-miscellaneous-2/README.md
+++ b/algorithms-miscellaneous-2/README.md
@@ -13,4 +13,5 @@ This module contains articles about algorithms. Some classes of algorithms, e.g.
- [Create a Sudoku Solver in Java](https://www.baeldung.com/java-sudoku)
- [Displaying Money Amounts in Words](https://www.baeldung.com/java-money-into-words)
- [A Collaborative Filtering Recommendation System in Java](https://www.baeldung.com/java-collaborative-filtering-recommendations)
+- [Implementing A* Pathfinding in Java](https://www.baeldung.com/java-a-star-pathfinding)
- More articles: [[<-- prev]](/../algorithms-miscellaneous-1) [[next -->]](/../algorithms-miscellaneous-3)
diff --git a/algorithms-miscellaneous-5/README.md b/algorithms-miscellaneous-5/README.md
index 3c49b5f01c..682a11b967 100644
--- a/algorithms-miscellaneous-5/README.md
+++ b/algorithms-miscellaneous-5/README.md
@@ -12,4 +12,5 @@ This module contains articles about algorithms. Some classes of algorithms, e.g.
- [How to Determine if a Binary Tree is Balanced](https://www.baeldung.com/java-balanced-binary-tree)
- [The Caesar Cipher in Java](https://www.baeldung.com/java-caesar-cipher)
- [Overview of Combinatorial Problems in Java](https://www.baeldung.com/java-combinatorial-algorithms)
+- [Prim’s Algorithm](https://www.baeldung.com/java-prim-algorithm)
- More articles: [[<-- prev]](/../algorithms-miscellaneous-4)
diff --git a/apache-spark/README.md b/apache-spark/README.md
index 52313d66bf..c60b556d51 100644
--- a/apache-spark/README.md
+++ b/apache-spark/README.md
@@ -7,4 +7,4 @@ This module contains articles about Apache Spark
- [Introduction to Apache Spark](https://www.baeldung.com/apache-spark)
- [Building a Data Pipeline with Kafka, Spark Streaming and Cassandra](https://www.baeldung.com/kafka-spark-data-pipeline)
- [Machine Learning with Spark MLlib](https://www.baeldung.com/spark-mlib-machine-learning)
-
+- [Introduction to Spark Graph Processing with GraphFrames](https://www.baeldung.com/spark-graph-graphframes)
diff --git a/apache-tapestry/README.md b/apache-tapestry/README.md
new file mode 100644
index 0000000000..e41345bada
--- /dev/null
+++ b/apache-tapestry/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles
+
+- [Intro to Apache Tapestry](https://www.baeldung.com/apache-tapestry)
diff --git a/core-groovy-2/pom.xml b/core-groovy-2/pom.xml
index 752b6945b3..1b26182ef4 100644
--- a/core-groovy-2/pom.xml
+++ b/core-groovy-2/pom.xml
@@ -77,7 +77,7 @@
org.codehaus.groovy
groovy-eclipse-compiler
- 3.3.0-01
+ ${groovy.compiler.version}
org.codehaus.groovy
diff --git a/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy b/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy
index 5ba7a2347c..a1f67b1e2e 100644
--- a/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy
+++ b/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy
@@ -28,17 +28,16 @@ class CategoryUnitTest extends GroovyTestCase {
}
}
-// http://team.baeldung.com/browse/BAEL-20687
-// void test_whenUsingTimeCategory_thenOperationOnNumber() {
-// SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy")
-// use (TimeCategory) {
-// assert sdf.format(5.days.from.now) == sdf.format(new Date() + 5.days)
-//
-// sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss")
-// assert sdf.format(10.minutes.from.now) == sdf.format(new Date() + 10.minutes)
-// assert sdf.format(2.hours.ago) == sdf.format(new Date() - 2.hours)
-// }
-// }
+ void test_whenUsingTimeCategory_thenOperationOnNumber() {
+ SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy")
+ use (TimeCategory) {
+ assert sdf.format(5.days.from.now) == sdf.format(new Date() + 5.days)
+
+ sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss")
+ assert sdf.format(10.minutes.from.now) == sdf.format(new Date() + 10.minutes)
+ assert sdf.format(2.hours.ago) == sdf.format(new Date() - 2.hours)
+ }
+ }
void test_whenUsingDOMCategory_thenOperationOnXML() {
diff --git a/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy
index 144d5720c8..b8417b8ac1 100644
--- a/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy
+++ b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy
@@ -75,7 +75,6 @@ class WebserviceManualTest extends GroovyTestCase {
assert stories.size() == 5
}
- /* see BAEL-3753
void test_whenConsumingSoap_thenReceiveResponse() {
def url = "http://www.dataaccess.com/webservicesserver/numberconversion.wso"
def soapClient = new SOAPClient(url)
@@ -90,7 +89,6 @@ class WebserviceManualTest extends GroovyTestCase {
def words = response.NumberToWordsResponse
assert words == "one thousand two hundred and thirty four "
}
- */
void test_whenConsumingRestGet_thenReceiveResponse() {
def path = "/get"
diff --git a/core-groovy/src/test/groovy/com/baeldung/file/ReadFileUnitTest.groovy b/core-groovy/src/test/groovy/com/baeldung/file/ReadFileUnitTest.groovy
index b969f0d1ab..da1dfc10ba 100644
--- a/core-groovy/src/test/groovy/com/baeldung/file/ReadFileUnitTest.groovy
+++ b/core-groovy/src/test/groovy/com/baeldung/file/ReadFileUnitTest.groovy
@@ -33,7 +33,6 @@ class ReadFileUnitTest extends Specification {
assert lines.size(), 3
}
- @Ignore
def 'Should return file content in string using ReadFile.readFileString given filePath' () {
given:
def filePath = "src/main/resources/fileContent.txt"
diff --git a/core-java-modules/core-java-11/pom.xml b/core-java-modules/core-java-11/pom.xml
index 32bc68fa66..2dfc72db09 100644
--- a/core-java-modules/core-java-11/pom.xml
+++ b/core-java-modules/core-java-11/pom.xml
@@ -65,7 +65,7 @@
org.apache.maven.plugins
maven-shade-plugin
- 3.2.1
+ ${shade.plugin.version}
package
@@ -109,6 +109,7 @@
benchmarks
1.22
10.0.0
+ 10.0.0
diff --git a/core-java-modules/core-java-13/README.md b/core-java-modules/core-java-13/README.md
new file mode 100644
index 0000000000..c339520a19
--- /dev/null
+++ b/core-java-modules/core-java-13/README.md
@@ -0,0 +1,3 @@
+### Relevant articles:
+
+- [Java Switch Statement](https://www.baeldung.com/java-switch)
diff --git a/core-java-modules/core-java-14/.mvn/jvm.config b/core-java-modules/core-java-14/.mvn/jvm.config
new file mode 100644
index 0000000000..50f549be0a
--- /dev/null
+++ b/core-java-modules/core-java-14/.mvn/jvm.config
@@ -0,0 +1 @@
+--enable-preview
\ No newline at end of file
diff --git a/core-java-modules/core-java-14/README.md b/core-java-modules/core-java-14/README.md
new file mode 100644
index 0000000000..0648d087be
--- /dev/null
+++ b/core-java-modules/core-java-14/README.md
@@ -0,0 +1,7 @@
+## Core Java 14
+
+This module contains articles about Java 14.
+
+### Relevant articles
+
+- [Guide to the @Serial Annotation in Java 14](https://www.baeldung.com/java-14-serial-annotation)
diff --git a/core-java-modules/core-java-14/pom.xml b/core-java-modules/core-java-14/pom.xml
index b985ada5e6..4f89e87d02 100644
--- a/core-java-modules/core-java-14/pom.xml
+++ b/core-java-modules/core-java-14/pom.xml
@@ -1,53 +1,66 @@
- 4.0.0
- com.baeldung
- core-java-14
- 1.0.0-SNAPSHOT
- core-java-14
- jar
- http://maven.apache.org
+ 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-14
+ core-java-14
+ jar
+ http://maven.apache.org
-
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
- ../../
-
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ ../../
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit-jupiter.version}
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ ${junit-jupiter.version}
+ test
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${maven.compiler.release}
+ --enable-preview
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${surefire.plugin.version}
+
+ --enable-preview
+
+
+
+
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
- ${maven.compiler.source.version}
- ${maven.compiler.target.version}
-
-
- --enable-preview
-
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${surefire.plugin.version}
-
- --enable-preview
-
-
-
-
-
-
- 14
- 14
+
+ 14
+ 3.6.1
+ 3.8.1
3.0.0-M3
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/textblocks/TextBlocks13.java b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/textblocks/TextBlocks13.java
new file mode 100644
index 0000000000..58d4cf44f3
--- /dev/null
+++ b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/textblocks/TextBlocks13.java
@@ -0,0 +1,46 @@
+package com.baeldung.java14.textblocks;
+
+public class TextBlocks13 {
+ public String getBlockOfHtml() {
+ return """
+
+
+
+ example text
+
+ """;
+ }
+
+ public String getNonStandardIndent() {
+ return """
+ Indent
+ """;
+ }
+
+ public String getQuery() {
+ return """
+ select "id", "user"
+ from "table"
+ """;
+ }
+
+ public String getTextWithCarriageReturns() {
+ return """
+ separated with\r
+ carriage returns""";
+ }
+
+ public String getTextWithEscapes() {
+ return """
+ fun with\n
+ whitespace\t\r
+ and other escapes \"""
+ """;
+ }
+
+ public String getFormattedText(String parameter) {
+ return """
+ Some parameter: %s
+ """.formatted(parameter);
+ }
+}
diff --git a/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/textblocks/TextBlocks14.java b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/textblocks/TextBlocks14.java
new file mode 100644
index 0000000000..90fc15e884
--- /dev/null
+++ b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/textblocks/TextBlocks14.java
@@ -0,0 +1,16 @@
+package com.baeldung.java14.textblocks;
+
+public class TextBlocks14 {
+ public String getIgnoredNewLines() {
+ return """
+ This is a long test which looks to \
+ have a newline but actually does not""";
+ }
+
+ public String getEscapedSpaces() {
+ return """
+ line 1
+ line 2 \s
+ """;
+ }
+}
diff --git a/core-java-modules/core-java-14/src/main/java/com/baeldung/serial/MySerialClass.java b/core-java-modules/core-java-14/src/main/java/com/baeldung/serial/MySerialClass.java
index 6a013d7b59..b28e53bdaa 100644
--- a/core-java-modules/core-java-14/src/main/java/com/baeldung/serial/MySerialClass.java
+++ b/core-java-modules/core-java-14/src/main/java/com/baeldung/serial/MySerialClass.java
@@ -10,41 +10,41 @@ import java.io.Serializable;
/**
* Class showcasing the usage of the Java 14 @Serial annotation.
- *
+ *
* @author Donato Rimenti
*/
public class MySerialClass implements Serializable {
-
- @Serial
- private static final ObjectStreamField[] serialPersistentFields = null;
-
- @Serial
- private static final long serialVersionUID = 1;
- @Serial
- private void writeObject(ObjectOutputStream stream) throws IOException {
- // ...
- }
+ @Serial
+ private static final ObjectStreamField[] serialPersistentFields = null;
- @Serial
- private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
- // ...
- }
+ @Serial
+ private static final long serialVersionUID = 1;
- @Serial
- private void readObjectNoData() throws ObjectStreamException {
- // ...
- }
+ @Serial
+ private void writeObject(ObjectOutputStream stream) throws IOException {
+ // ...
+ }
- @Serial
- private Object writeReplace() throws ObjectStreamException {
- // ...
- return null;
- }
+ @Serial
+ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
+ // ...
+ }
- @Serial
- private Object readResolve() throws ObjectStreamException {
- // ...
- return null;
- }
+ @Serial
+ private void readObjectNoData() throws ObjectStreamException {
+ // ...
+ }
+
+ @Serial
+ private Object writeReplace() throws ObjectStreamException {
+ // ...
+ return null;
+ }
+
+ @Serial
+ private Object readResolve() throws ObjectStreamException {
+ // ...
+ return null;
+ }
}
\ No newline at end of file
diff --git a/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/textblocks/TextBlocks13UnitTest.java b/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/textblocks/TextBlocks13UnitTest.java
new file mode 100644
index 0000000000..f5fef9be57
--- /dev/null
+++ b/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/textblocks/TextBlocks13UnitTest.java
@@ -0,0 +1,58 @@
+package com.baeldung.java14.textblocks;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+class TextBlocks13UnitTest {
+ private TextBlocks13 subject = new TextBlocks13();
+
+ @Test
+ void givenAnOldStyleMultilineString_whenComparing_thenEqualsTextBlock() {
+ String expected = "\n"
+ + "\n"
+ + " \n"
+ + " example text\n"
+ + " \n"
+ + "";
+ assertThat(subject.getBlockOfHtml()).isEqualTo(expected);
+ }
+
+ @Test
+ void givenAnOldStyleString_whenComparing_thenEqualsTextBlock() {
+ String expected = "\n\n \n example text\n \n";
+ assertThat(subject.getBlockOfHtml()).isEqualTo(expected);
+ }
+
+ @Test
+ void givenAnIndentedString_thenMatchesIndentedOldStyle() {
+ assertThat(subject.getNonStandardIndent()).isEqualTo(" Indent\n");
+ }
+
+ @Test
+ void givenAMultilineQuery_thenItCanContainUnescapedQuotes() {
+ assertThat(subject.getQuery()).contains("select \"id\", \"user\"");
+ }
+
+ @Test
+ void givenAMultilineQuery_thenItEndWithANewline() {
+ assertThat(subject.getQuery()).endsWith("\n");
+ }
+
+ @Test
+ void givenATextWithCarriageReturns_thenItContainsBoth() {
+ assertThat(subject.getTextWithCarriageReturns()).isEqualTo("separated with\r\ncarriage returns");
+ }
+
+ @Test
+ void givenAStringWithEscapedWhitespace_thenItAppearsInTheResultingString() {
+ assertThat(subject.getTextWithEscapes()).contains("fun with\n\n")
+ .contains("whitespace\t\r\n")
+ .contains("and other escapes \"\"\"");
+ }
+
+ @Test
+ void givenAFormattedString_thenTheParameterIsReplaced() {
+ assertThat(subject.getFormattedText("parameter")).contains("Some parameter: parameter");
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/textblocks/TextBlocks14UnitTest.java b/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/textblocks/TextBlocks14UnitTest.java
new file mode 100644
index 0000000000..fe671e8638
--- /dev/null
+++ b/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/textblocks/TextBlocks14UnitTest.java
@@ -0,0 +1,21 @@
+package com.baeldung.java14.textblocks;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+class TextBlocks14UnitTest {
+ private TextBlocks14 subject = new TextBlocks14();
+
+ @Test
+ void givenAStringWithEscapedNewLines_thenTheResultHasNoNewLines() {
+ String expected = "This is a long test which looks to have a newline but actually does not";
+ assertThat(subject.getIgnoredNewLines()).isEqualTo(expected);
+ }
+
+ @Test
+ void givenAStringWithEscapesSpaces_thenTheResultHasLinesEndingWithSpaces() {
+ String expected = "line 1\nline 2 \n";
+ assertThat(subject.getEscapedSpaces()).isEqualTo(expected);
+ }
+}
\ 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 e2bea5f7e2..bfd426b9c1 100644
--- a/core-java-modules/core-java-9/README.md
+++ b/core-java-modules/core-java-9/README.md
@@ -9,6 +9,7 @@ This module contains articles about Java 9 core features
- [Iterate Through a Range of Dates in Java](https://www.baeldung.com/java-iterate-date-range)
- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
- [Immutable Set in Java](https://www.baeldung.com/java-immutable-set)
+- [Immutable ArrayList in Java](https://www.baeldung.com/java-immutable-list)
Note: also contains part of the code for the article
[How to Filter a Collection in Java](https://www.baeldung.com/java-collection-filtering).
diff --git a/core-java-modules/core-java-9/pom.xml b/core-java-modules/core-java-9/pom.xml
index 23a465caa1..a90ad0a740 100644
--- a/core-java-modules/core-java-9/pom.xml
+++ b/core-java-modules/core-java-9/pom.xml
@@ -37,6 +37,11 @@
${junit.platform.version}
test
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
@@ -69,6 +74,7 @@
1.9
1.9
25.1-jre
+ 4.1
diff --git a/core-java-modules/core-java-9/src/test/java/com/baeldung/java9/list/immutable/ImmutableArrayListUnitTest.java b/core-java-modules/core-java-9/src/test/java/com/baeldung/java9/list/immutable/ImmutableArrayListUnitTest.java
new file mode 100644
index 0000000000..f148b66dad
--- /dev/null
+++ b/core-java-modules/core-java-9/src/test/java/com/baeldung/java9/list/immutable/ImmutableArrayListUnitTest.java
@@ -0,0 +1,48 @@
+package com.baeldung.java9.list.immutable;
+
+import com.google.common.collect.ImmutableList;
+import org.apache.commons.collections4.ListUtils;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+public class ImmutableArrayListUnitTest {
+
+ @Test(expected = UnsupportedOperationException.class)
+ public final void givenUsingTheJdk_whenUnmodifiableListIsCreated_thenNotModifiable() {
+ final List list = new ArrayList<>(Arrays.asList("one", "two", "three"));
+ final List unmodifiableList = Collections.unmodifiableList(list);
+ unmodifiableList.add("four");
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public final void givenUsingTheJava9_whenUnmodifiableListIsCreated_thenNotModifiable() {
+ final List list = new ArrayList<>(Arrays.asList("one", "two", "three"));
+ final List unmodifiableList = List.of(list.toArray(new String[]{}));
+ unmodifiableList.add("four");
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public final void givenUsingGuava_whenUnmodifiableListIsCreated_thenNotModifiable() {
+ final List list = new ArrayList<>(Arrays.asList("one", "two", "three"));
+ final List unmodifiableList = ImmutableList.copyOf(list);
+ unmodifiableList.add("four");
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public final void givenUsingGuavaBuilder_whenUnmodifiableListIsCreated_thenNoLongerModifiable() {
+ final List list = new ArrayList<>(Arrays.asList("one", "two", "three"));
+ final ImmutableList unmodifiableList = ImmutableList.builder().addAll(list).build();
+ unmodifiableList.add("four");
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public final void givenUsingCommonsCollections_whenUnmodifiableListIsCreated_thenNotModifiable() {
+ final List list = new ArrayList<>(Arrays.asList("one", "two", "three"));
+ final List unmodifiableList = ListUtils.unmodifiableList(list);
+ unmodifiableList.add("four");
+ }
+}
diff --git a/core-java-modules/core-java-collections-array-list/README.md b/core-java-modules/core-java-collections-array-list/README.md
index 302ea82130..3637f835cf 100644
--- a/core-java-modules/core-java-collections-array-list/README.md
+++ b/core-java-modules/core-java-collections-array-list/README.md
@@ -3,9 +3,8 @@
This module contains articles about the Java ArrayList collection
### Relevant Articles:
-- [Immutable ArrayList in Java](http://www.baeldung.com/java-immutable-list)
-- [Guide to the Java ArrayList](http://www.baeldung.com/java-arraylist)
-- [Add Multiple Items to an Java ArrayList](http://www.baeldung.com/java-add-items-array-list)
+- [Guide to the Java ArrayList](https://www.baeldung.com/java-arraylist)
+- [Add Multiple Items to an Java ArrayList](https://www.baeldung.com/java-add-items-array-list)
- [ClassCastException: Arrays$ArrayList cannot be cast to ArrayList](https://www.baeldung.com/java-classcastexception-arrays-arraylist)
- [Multi Dimensional ArrayList in Java](https://www.baeldung.com/java-multi-dimensional-arraylist)
- [Removing an Element From an ArrayList](https://www.baeldung.com/java-arraylist-remove-element)
diff --git a/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/collections/CoreJavaCollectionsUnitTest.java b/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/collections/CoreJavaCollectionsUnitTest.java
index 019a569a65..5fd0e605dd 100644
--- a/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/collections/CoreJavaCollectionsUnitTest.java
+++ b/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/collections/CoreJavaCollectionsUnitTest.java
@@ -15,42 +15,11 @@ public class CoreJavaCollectionsUnitTest {
private static final Logger LOG = LoggerFactory.getLogger(CoreJavaCollectionsUnitTest.class);
-
- // tests -
-
@Test
public final void givenUsingTheJdk_whenArrayListIsSynchronized_thenCorrect() {
- final List list = new ArrayList(Arrays.asList("one", "two", "three"));
+ final List list = new ArrayList<>(Arrays.asList("one", "two", "three"));
final List synchronizedList = Collections.synchronizedList(list);
LOG.debug("Synchronized List is: " + synchronizedList);
}
- @Test(expected = UnsupportedOperationException.class)
- public final void givenUsingTheJdk_whenUnmodifiableListIsCreatedFromOriginal_thenNoLongerModifiable() {
- final List list = new ArrayList(Arrays.asList("one", "two", "three"));
- final List unmodifiableList = Collections.unmodifiableList(list);
- unmodifiableList.add("four");
- }
-
- @Test(expected = UnsupportedOperationException.class)
- public final void givenUsingGuava_whenUnmodifiableListIsCreatedFromOriginal_thenNoLongerModifiable() {
- final List list = new ArrayList(Arrays.asList("one", "two", "three"));
- final List unmodifiableList = ImmutableList.copyOf(list);
- unmodifiableList.add("four");
- }
-
- @Test(expected = UnsupportedOperationException.class)
- public final void givenUsingGuavaBuilder_whenUnmodifiableListIsCreatedFromOriginal_thenNoLongerModifiable() {
- final List list = new ArrayList(Arrays.asList("one", "two", "three"));
- final ImmutableList unmodifiableList = ImmutableList.builder().addAll(list).build();
- unmodifiableList.add("four");
- }
-
- @Test(expected = UnsupportedOperationException.class)
- public final void givenUsingCommonsCollections_whenUnmodifiableListIsCreatedFromOriginal_thenNoLongerModifiable() {
- final List list = new ArrayList(Arrays.asList("one", "two", "three"));
- final List unmodifiableList = ListUtils.unmodifiableList(list);
- unmodifiableList.add("four");
- }
-
}
diff --git a/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java
index e9c8056ff5..a04994d558 100644
--- a/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java
+++ b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java
@@ -1,22 +1,27 @@
package com.baeldung.threadlocalrandom;
import org.openjdk.jmh.runner.Runner;
-import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.ChainedOptionsBuilder;
import org.openjdk.jmh.runner.options.OptionsBuilder;
+import com.google.common.collect.ImmutableList;
+
public class ThreadLocalRandomBenchMarkRunner {
public static void main(String[] args) throws Exception {
- Options options = new OptionsBuilder().include(ThreadLocalRandomBenchMarker.class.getSimpleName())
- .threads(1)
+ ChainedOptionsBuilder options = new OptionsBuilder().include(ThreadLocalRandomBenchMarker.class.getSimpleName())
.forks(1)
.shouldFailOnError(true)
.shouldDoGC(true)
- .jvmArgs("-server")
- .build();
-
- new Runner(options).run();
+ .jvmArgs("-server");
+ for (Integer i : ImmutableList.of(1, 2, 8, 32)) {
+ new Runner(
+ options
+ .threads(i)
+ .build())
+ .run();
+ }
}
}
diff --git a/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java
index 8a0e2d2826..b0852bc40d 100644
--- a/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java
+++ b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java
@@ -1,64 +1,34 @@
package com.baeldung.threadlocalrandom;
-import java.util.ArrayList;
-import java.util.List;
import java.util.Random;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
-import org.openjdk.jmh.annotations.Level;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
-import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;
-@BenchmarkMode(Mode.AverageTime)
+@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 1)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Benchmark)
public class ThreadLocalRandomBenchMarker {
+ private final Random random = new Random();
- List> randomCallables = new ArrayList<>();
- List> threadLocalRandomCallables = new ArrayList<>();
-
- @Setup(Level.Iteration)
- public void init() {
- Random random = new Random();
- randomCallables = new ArrayList<>();
- threadLocalRandomCallables = new ArrayList<>();
- for (int i = 0; i < 1000; i++) {
- randomCallables.add(() -> {
- return random.nextInt();
- });
- }
-
- for (int i = 0; i < 1000; i++) {
- threadLocalRandomCallables.add(() -> {
- return ThreadLocalRandom.current()
- .nextInt();
- });
- }
+ @Benchmark
+ public int randomValuesUsingRandom() {
+ return random.nextInt();
}
@Benchmark
- public void randomValuesUsingRandom() throws InterruptedException {
- ExecutorService executor = Executors.newWorkStealingPool();
- executor.invokeAll(randomCallables);
- executor.shutdown();
- }
-
- @Benchmark
- public void randomValuesUsingThreadLocalRandom() throws InterruptedException {
- ExecutorService executor = Executors.newWorkStealingPool();
- executor.invokeAll(threadLocalRandomCallables);
- executor.shutdown();
+ public int randomValuesUsingThreadLocalRandom() {
+ return ThreadLocalRandom
+ .current()
+ .nextInt();
}
}
diff --git a/core-java-modules/core-java-exceptions-2/README.md b/core-java-modules/core-java-exceptions-2/README.md
index 3ad5189b5e..d3537edb40 100644
--- a/core-java-modules/core-java-exceptions-2/README.md
+++ b/core-java-modules/core-java-exceptions-2/README.md
@@ -2,4 +2,6 @@
This module contains articles about core java exceptions
-###
+### Relevant Articles:
+
+- [Is It a Bad Practice to Catch Throwable?](https://www.baeldung.com/java-catch-throwable-bad-practice)
diff --git a/core-java-modules/core-java-io/README.md b/core-java-modules/core-java-io/README.md
index 5c4978722f..2c6c3363cb 100644
--- a/core-java-modules/core-java-io/README.md
+++ b/core-java-modules/core-java-io/README.md
@@ -13,4 +13,5 @@ This module contains articles about core Java input and output (IO)
- [Getting a File’s Mime Type in Java](https://www.baeldung.com/java-file-mime-type)
- [How to Write to a CSV File in Java](https://www.baeldung.com/java-csv)
- [How to Avoid the Java FileNotFoundException When Loading Resources](https://www.baeldung.com/java-classpath-resource-cannot-be-opened)
+- [Create a Directory in Java](https://www.baeldung.com/java-create-directory)
- [[More -->]](/core-java-modules/core-java-io-2)
diff --git a/core-java-modules/core-java-jvm/README.md b/core-java-modules/core-java-jvm/README.md
index 89600ad924..2f80ea7372 100644
--- a/core-java-modules/core-java-jvm/README.md
+++ b/core-java-modules/core-java-jvm/README.md
@@ -10,3 +10,5 @@ This module contains articles about working with the Java Virtual Machine (JVM).
- [Class Loaders in Java](https://www.baeldung.com/java-classloaders)
- [A Guide to System.exit()](https://www.baeldung.com/java-system-exit)
- [Guide to System.gc()](https://www.baeldung.com/java-system-gc)
+- [Runtime.getRuntime().halt() vs System.exit() in Java](https://www.baeldung.com/java-runtime-halt-vs-system-exit)
+- [Adding Shutdown Hooks for JVM Applications](https://www.baeldung.com/jvm-shutdown-hooks)
diff --git a/core-java-modules/core-java-lang-2/pom.xml b/core-java-modules/core-java-lang-2/pom.xml
index 4702b7350b..a5fb5ca859 100644
--- a/core-java-modules/core-java-lang-2/pom.xml
+++ b/core-java-modules/core-java-lang-2/pom.xml
@@ -15,6 +15,11 @@
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
commons-beanutils
commons-beanutils
diff --git a/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/methodmultiplereturnvalues/MultipleReturnValuesUsingApacheCommonsPair.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/methodmultiplereturnvalues/MultipleReturnValuesUsingApacheCommonsPair.java
new file mode 100644
index 0000000000..2f505443c2
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/methodmultiplereturnvalues/MultipleReturnValuesUsingApacheCommonsPair.java
@@ -0,0 +1,20 @@
+package com.baeldung.methodmultiplereturnvalues;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
+
+import java.util.Comparator;
+import java.util.List;
+
+class MultipleReturnValuesUsingApacheCommonsPair {
+
+ static ImmutablePair getMostDistantPoint(
+ List coordinatesList,
+ Coordinates target) {
+ return coordinatesList.stream()
+ .map(coordinates -> ImmutablePair.of(coordinates, coordinates.calculateDistance(target)))
+ .max(Comparator.comparingDouble(Pair::getRight))
+ .get();
+
+ }
+}
diff --git a/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/methodmultiplereturnvalues/MultipleReturnValuesUsingApacheCommonsTriple.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/methodmultiplereturnvalues/MultipleReturnValuesUsingApacheCommonsTriple.java
new file mode 100644
index 0000000000..4da297a51f
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/methodmultiplereturnvalues/MultipleReturnValuesUsingApacheCommonsTriple.java
@@ -0,0 +1,23 @@
+package com.baeldung.methodmultiplereturnvalues;
+
+import org.apache.commons.lang3.tuple.ImmutableTriple;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+class MultipleReturnValuesUsingApacheCommonsTriple {
+
+ static ImmutableTriple getMinAvgMaxTriple(
+ List coordinatesList,
+ Coordinates target) {
+
+ List distanceList = coordinatesList.stream()
+ .map(coordinates -> coordinates.calculateDistance(target))
+ .collect(Collectors.toList());
+ Double minDistance = distanceList.stream().mapToDouble(Double::doubleValue).min().getAsDouble();
+ Double avgDistance = distanceList.stream().mapToDouble(Double::doubleValue).average().orElse(0.0D);
+ Double maxDistance = distanceList.stream().mapToDouble(Double::doubleValue).max().getAsDouble();
+
+ return ImmutableTriple.of(minDistance, avgDistance, maxDistance);
+ }
+}
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/methodmultiplereturnvalues/MultipleReturnValuesUsingApacheCommonsPairUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/methodmultiplereturnvalues/MultipleReturnValuesUsingApacheCommonsPairUnitTest.java
new file mode 100644
index 0000000000..ca5736fe50
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/methodmultiplereturnvalues/MultipleReturnValuesUsingApacheCommonsPairUnitTest.java
@@ -0,0 +1,34 @@
+package com.baeldung.methodmultiplereturnvalues;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.junit.jupiter.api.Test;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class MultipleReturnValuesUsingApacheCommonsPairUnitTest {
+
+ @Test
+ void whenUsingPair_thenMultipleFieldsAreReturned() {
+
+ List coordinatesList = new ArrayList<>();
+ coordinatesList.add(new Coordinates(1, 1, "home"));
+ coordinatesList.add(new Coordinates(2, 2, "school"));
+ coordinatesList.add(new Coordinates(3, 3, "hotel"));
+
+ Coordinates target = new Coordinates(5, 5, "gym");
+
+ ImmutablePair mostDistantPoint = MultipleReturnValuesUsingApacheCommonsPair.getMostDistantPoint(coordinatesList, target);
+
+ assertEquals(1, mostDistantPoint.getLeft().getLongitude());
+ assertEquals(1, mostDistantPoint.getLeft().getLatitude());
+ assertEquals("home", mostDistantPoint.getLeft().getPlaceName());
+ assertEquals(5.66, BigDecimal.valueOf(mostDistantPoint.getRight()).setScale(2, RoundingMode.HALF_UP).doubleValue());
+
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/methodmultiplereturnvalues/MultipleReturnValuesUsingApacheCommonsTripleUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/methodmultiplereturnvalues/MultipleReturnValuesUsingApacheCommonsTripleUnitTest.java
new file mode 100644
index 0000000000..d23036f5e6
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/methodmultiplereturnvalues/MultipleReturnValuesUsingApacheCommonsTripleUnitTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.methodmultiplereturnvalues;
+
+import org.apache.commons.lang3.tuple.ImmutableTriple;
+import org.junit.jupiter.api.Test;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class MultipleReturnValuesUsingApacheCommonsTripleUnitTest {
+
+ @Test
+ void whenUsingTriple_thenMultipleFieldsAreReturned() {
+
+ List coordinatesList = new ArrayList<>();
+ coordinatesList.add(new Coordinates(1, 1, "home"));
+ coordinatesList.add(new Coordinates(2, 2, "school"));
+ coordinatesList.add(new Coordinates(3, 3, "hotel"));
+
+ Coordinates target = new Coordinates(5, 5, "gym");
+
+ ImmutableTriple minAvgMax = MultipleReturnValuesUsingApacheCommonsTriple.getMinAvgMaxTriple(coordinatesList, target);
+
+ assertEquals(2.83, scaleDouble(minAvgMax.left)); //min
+ assertEquals(4.24, scaleDouble(minAvgMax.middle)); //avg
+ assertEquals(5.66, scaleDouble(minAvgMax.right)); //max
+ }
+
+ private double scaleDouble(Double d) {
+ return BigDecimal.valueOf(d).setScale(2, RoundingMode.HALF_UP).doubleValue();
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-3/README.md b/core-java-modules/core-java-lang-oop-3/README.md
index b1ca877ae0..3a0e588ad4 100644
--- a/core-java-modules/core-java-lang-oop-3/README.md
+++ b/core-java-modules/core-java-lang-oop-3/README.md
@@ -8,9 +8,9 @@ This module contains articles about Object-oriented programming (OOP) in Java
- [Guide to the super Java Keyword](https://www.baeldung.com/java-super)
- [Guide to the this Java Keyword](https://www.baeldung.com/java-this)
- [Java ‘public’ Access Modifier](https://www.baeldung.com/java-public-keyword)
-- [Composition, Aggregation and Association in Java](https://www.baeldung.com/java-composition-aggregation-association)
+- [Composition, Aggregation, and Association in Java](https://www.baeldung.com/java-composition-aggregation-association)
- [Nested Classes in Java](https://www.baeldung.com/java-nested-classes)
- [A Guide to Inner Interfaces in Java](https://www.baeldung.com/java-inner-interfaces)
- [Java Classes and Objects](https://www.baeldung.com/java-classes-objects)
- [Java Interfaces](https://www.baeldung.com/java-interfaces)
-- [[<-- Prev]](/core-java-modules/core-java-lang-oop-2)[[More -->]](/core-java-modules/core-java-lang-oop-4)
\ No newline at end of file
+- [[<-- Prev]](/core-java-modules/core-java-lang-oop-2)[[More -->]](/core-java-modules/core-java-lang-oop-4)
diff --git a/core-java-modules/core-java-perf/README.md b/core-java-modules/core-java-perf/README.md
index d1d646ac7f..4204c2b012 100644
--- a/core-java-modules/core-java-perf/README.md
+++ b/core-java-modules/core-java-perf/README.md
@@ -9,3 +9,4 @@ This module contains articles about performance of Java applications
- [OutOfMemoryError: GC Overhead Limit Exceeded](http://www.baeldung.com/java-gc-overhead-limit-exceeded)
- [Basic Introduction to JMX](http://www.baeldung.com/java-management-extensions)
- [Monitoring Java Applications with Flight Recorder](https://www.baeldung.com/java-flight-recorder-monitoring)
+- [Branch Prediction in Java](https://www.baeldung.com/java-branch-prediction)
diff --git a/core-java-modules/core-java-string-algorithms-3/README.md b/core-java-modules/core-java-string-algorithms-3/README.md
index 3aa31cea53..c7b17a6720 100644
--- a/core-java-modules/core-java-string-algorithms-3/README.md
+++ b/core-java-modules/core-java-string-algorithms-3/README.md
@@ -3,3 +3,5 @@
This module contains articles about string-related algorithms.
### Relevant Articles:
+
+- [Check if Two Strings are Anagrams in Java](https://www.baeldung.com/java-strings-anagrams)
diff --git a/core-java-modules/core-java-string-operations-2/README.md b/core-java-modules/core-java-string-operations-2/README.md
index 50f40ac2af..6e88eda122 100644
--- a/core-java-modules/core-java-string-operations-2/README.md
+++ b/core-java-modules/core-java-string-operations-2/README.md
@@ -8,4 +8,5 @@ This module contains articles about string operations.
- [String Initialization in Java](https://www.baeldung.com/java-string-initialization)
- [String toLowerCase and toUpperCase Methods in Java](https://www.baeldung.com/java-string-convert-case)
- [Java String equalsIgnoreCase()](https://www.baeldung.com/java-string-equalsignorecase)
+- [How to avoid String contains() Case Insensitive in Java](https://www.baeldung.com/how-to-avoid-string-contains-case-insensitive-in-java)
- More articles: [[<-- prev]](../core-java-string-operations)
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 bd1a34f89f..7bb687ea2b 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,7 @@
-
+
4.0.0
core-java-string-operations-2
0.1.0-SNAPSHOT
@@ -51,6 +52,18 @@
${org.hamcrest.version}
test
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+
+
org.assertj
assertj-core
@@ -61,6 +74,29 @@
core-java-string-operations-2
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.2.0
+
+
+ package
+
+ shade
+
+
+
+
+ org.openjdk.jmh.Main
+
+
+
+
+
+
+
src/main/resources
diff --git a/core-java-modules/core-java-string-operations-2/src/main/java/com/baeldung/contains/CaseInsensitiveWorkarounds.java b/core-java-modules/core-java-string-operations-2/src/main/java/com/baeldung/contains/CaseInsensitiveWorkarounds.java
new file mode 100644
index 0000000000..e4089a4f53
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-2/src/main/java/com/baeldung/contains/CaseInsensitiveWorkarounds.java
@@ -0,0 +1,78 @@
+package com.baeldung.contains;
+
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Pattern;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+
+/**
+ * Based on https://github.com/tedyoung/indexof-contains-benchmark
+ */
+@Fork(5)
+@State(Scope.Benchmark)
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.NANOSECONDS)
+public class CaseInsensitiveWorkarounds {
+
+ private String src;
+ private String dest;
+ private Pattern pattern;
+
+ public static void main(String[] args) throws Exception {
+ org.openjdk.jmh.Main.main(args);
+ }
+
+ @Setup
+ public void setup() {
+ src = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum";
+ dest = "eiusmod";
+ pattern = Pattern.compile(Pattern.quote(dest), Pattern.CASE_INSENSITIVE);
+ }
+
+ // toLowerCase() and contains()
+ @Benchmark
+ public boolean lowerCaseContains() {
+ return src.toLowerCase()
+ .contains(dest.toLowerCase());
+ }
+
+ // matches() with Regular Expressions
+ @Benchmark
+ public boolean matchesRegularExpression() {
+ return src.matches("(?i).*" + dest + ".*");
+ }
+
+ public boolean processRegionMatches(String localSrc, String localDest) {
+ for (int i = localSrc.length() - localDest.length(); i >= 0; i--)
+ if (localSrc.regionMatches(true, i, localDest, 0, localDest.length()))
+ return true;
+ return false;
+ }
+
+ // String regionMatches()
+ @Benchmark
+ public boolean regionMatches() {
+ return processRegionMatches(src, dest);
+ }
+
+ // Pattern CASE_INSENSITIVE with regexp
+ @Benchmark
+ public boolean patternCaseInsensitiveRegexp() {
+ return pattern.matcher(src)
+ .find();
+ }
+
+ // Apache Commons StringUtils containsIgnoreCase
+ @Benchmark
+ public boolean apacheCommonsStringUtils() {
+ return org.apache.commons.lang3.StringUtils.containsIgnoreCase(src, dest);
+ }
+
+}
diff --git a/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/contains/CaseInsensitiveWorkaroundsUnitTest.java b/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/contains/CaseInsensitiveWorkaroundsUnitTest.java
new file mode 100644
index 0000000000..30b2ca9fa5
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/contains/CaseInsensitiveWorkaroundsUnitTest.java
@@ -0,0 +1,53 @@
+package com.baeldung.contains;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.regex.Pattern;
+
+/**
+ * BAEL-3739: Different ways to solve the contains() case insensitive behavior.
+ */
+public class CaseInsensitiveWorkaroundsUnitTest {
+
+ private String src = "Lorem ipsum dolor sit amet";
+ private String dest = "lorem";
+
+ @Test
+ public void givenString_whenCallingContainsWithToLowerOrUpperCase_shouldReturnTrue() {
+ // Use toLowerCase to avoid case insensitive issues
+ Assert.assertTrue(src.toLowerCase().contains(dest.toLowerCase()));
+
+ // Use toUpperCase to avoid case insensitive issues
+ Assert.assertTrue(src.toUpperCase().contains(dest.toUpperCase()));
+ }
+
+ @Test
+ public void givenString_whenCallingStringMatches_thenReturnsTrue() {
+ // Use String Matches to avoid case insensitive issues
+ Assert.assertTrue(src.matches("(?i).*" + dest + ".*"));
+ }
+
+ @Test
+ public void givenString_whenCallingStringRegionMatches_thenReturnsTrue() {
+ // Use String Region Matches to avoid case insensitive issues
+ CaseInsensitiveWorkarounds comparator = new CaseInsensitiveWorkarounds();
+ Assert.assertTrue(comparator.processRegionMatches(src, dest));
+ }
+
+
+ @Test
+ public void givenString_whenCallingPaternCompileMatcherFind_thenReturnsTrue() {
+ // Use Pattern Compile Matcher and Find to avoid case insensitive issues
+ Assert.assertTrue(Pattern.compile(Pattern.quote(dest),
+ Pattern.CASE_INSENSITIVE) .matcher(src) .find());
+ }
+
+ @Test
+ public void givenString_whenCallingStringUtilsContainsIgnoreCase_thenReturnsTrue() {
+ // Use StringUtils containsIgnoreCase to avoid case insensitive issues
+ Assert.assertTrue(StringUtils.containsIgnoreCase(src, dest));
+ }
+
+}
diff --git a/data-structures/README.md b/data-structures/README.md
index 7eeda7c64f..fe81f4d2be 100644
--- a/data-structures/README.md
+++ b/data-structures/README.md
@@ -6,3 +6,4 @@ This module contains articles about data structures in Java
- [The Trie Data Structure in Java](https://www.baeldung.com/trie-java)
- [Implementing a Binary Tree in Java](https://www.baeldung.com/java-binary-tree)
+- [Circular Linked List Java Implementation](https://www.baeldung.com/java-circular-linked-list)
diff --git a/data-structures/pom.xml b/data-structures/pom.xml
index f4a8ea3a14..4468f3d21f 100644
--- a/data-structures/pom.xml
+++ b/data-structures/pom.xml
@@ -23,7 +23,7 @@
com.leansoft
bigqueue
- 0.7.0
+ ${bigqueue.version}
@@ -39,4 +39,8 @@
+
+ 0.7.0
+
+
diff --git a/ethereum/pom.xml b/ethereum/pom.xml
index da0a7ebda8..1449d9d95c 100644
--- a/ethereum/pom.xml
+++ b/ethereum/pom.xml
@@ -177,8 +177,8 @@
maven-compiler-plugin
${compiler.plugin.version}
- ${source.version}
- ${target.version}
+ ${java.version}
+ ${java.version}
@@ -189,7 +189,7 @@
org.apache.maven.plugins
maven-war-plugin
- 3.0.0
+ ${maven-war-plugin.version}
src/main/webapp
false
@@ -216,7 +216,5 @@
1.7.25
2.0.4.RELEASE
3.1
- 1.8
- 1.8
diff --git a/intelliJ/remote-debugging/README.adoc b/intelliJ/remote-debugging/README.adoc
deleted file mode 100644
index 7110a5d7b9..0000000000
--- a/intelliJ/remote-debugging/README.adoc
+++ /dev/null
@@ -1,85 +0,0 @@
-:toc:
-:spring_version: current
-:icons: font
-:source-highlighter: prettify
-:project_id: gs-scheduling-tasks
-This guide walks you through the steps for scheduling tasks with Spring.
-
-== What you'll build
-
-You'll build an application that prints out the current time every five seconds using Spring's `@Scheduled` annotation.
-
-== What you'll need
-
-:java_version: 1.8
-include::https://raw.githubusercontent.com/spring-guides/getting-started-macros/master/prereq_editor_jdk_buildtools.adoc[]
-
-
-include::https://raw.githubusercontent.com/spring-guides/getting-started-macros/master/how_to_complete_this_guide.adoc[]
-
-
-include::https://raw.githubusercontent.com/spring-guides/getting-started-macros/master/hide-show-gradle.adoc[]
-
-include::https://raw.githubusercontent.com/spring-guides/getting-started-macros/master/hide-show-maven.adoc[]
-
-include::https://raw.githubusercontent.com/spring-guides/getting-started-macros/master/hide-show-sts.adoc[]
-
-
-
-[[initial]]
-== Create a scheduled task
-Now that you've set up your project, you can create a scheduled task.
-
-`src/main/java/hello/ScheduledTasks.java`
-[source,java]
-----
-include::complete/src/main/java/hello/ScheduledTasks.java[]
-----
-
-The `Scheduled` annotation defines when a particular method runs.
-NOTE: This example uses `fixedRate`, which specifies the interval between method invocations measured from the start time of each invocation. There are https://docs.spring.io/spring/docs/{spring_version}/spring-framework-reference/html/scheduling.html#scheduling-annotation-support-scheduled[other options], like `fixedDelay`, which specifies the interval between invocations measured from the completion of the task. You can also https://docs.spring.io/spring/docs/{spring_version}/javadoc-api/org/springframework/scheduling/support/CronSequenceGenerator.html[use `@Scheduled(cron=". . .")` expressions for more sophisticated task scheduling].
-
-== Enable Scheduling
-
-Although scheduled tasks can be embedded in web apps and WAR files, the simpler approach demonstrated below creates a standalone application. You package everything in a single, executable JAR file, driven by a good old Java `main()` method.
-
-`src/main/java/hello/Application.java`
-[source,java]
-----
-include::complete/src/main/java/hello/Application.java[]
-----
-
-include::https://raw.githubusercontent.com/spring-guides/getting-started-macros/master/spring-boot-application.adoc[]
-
-https://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#scheduling-enable-annotation-support[`@EnableScheduling`] ensures that a background task executor is created. Without it, nothing gets scheduled.
-
-
-include::https://raw.githubusercontent.com/spring-guides/getting-started-macros/master/build_an_executable_jar_subhead.adoc[]
-
-include::https://raw.githubusercontent.com/spring-guides/getting-started-macros/master/build_an_executable_jar_with_both.adoc[]
-
-
-
-Logging output is displayed and you can see from the logs that it is on a background thread. You should see your scheduled task fire every 5 seconds:
-
-....
-[...]
-2016-08-25 13:10:00.143 INFO 31565 --- [pool-1-thread-1] hello.ScheduledTasks : The time is now 13:10:00
-2016-08-25 13:10:05.143 INFO 31565 --- [pool-1-thread-1] hello.ScheduledTasks : The time is now 13:10:05
-2016-08-25 13:10:10.143 INFO 31565 --- [pool-1-thread-1] hello.ScheduledTasks : The time is now 13:10:10
-2016-08-25 13:10:15.143 INFO 31565 --- [pool-1-thread-1] hello.ScheduledTasks : The time is now 13:10:15
-....
-
-== Summary
-
-Congratulations! You created an application with a scheduled task. Heck, the actual code was shorter than the build file! This technique works in any type of application.
-
-== See Also
-
-The following guides may also be helpful:
-
-* https://spring.io/guides/gs/spring-boot/[Building an Application with Spring Boot]
-* https://spring.io/guides/gs/batch-processing/[Creating a Batch Service]
-
-include::https://raw.githubusercontent.com/spring-guides/getting-started-macros/master/footer.adoc[]
-
diff --git a/intelliJ/remote-debugging/README.md b/intelliJ/remote-debugging/README.md
new file mode 100644
index 0000000000..54e3e00ace
--- /dev/null
+++ b/intelliJ/remote-debugging/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Remote Debugging with IntelliJ IDEA](https://www.baeldung.com/intellij-remote-debugging)
diff --git a/java-ee-8-security-api/README.md b/java-ee-8-security-api/README.md
index b01a073e35..17142f8102 100644
--- a/java-ee-8-security-api/README.md
+++ b/java-ee-8-security-api/README.md
@@ -4,4 +4,4 @@ This module contains articles about the Security API in Java EE 8.
### Relevant articles
- - [Java EE 8 Security API](https://www.baeldung.com/java-ee-8-security)
+ - [Jakarta EE 8 Security API](https://www.baeldung.com/java-ee-8-security)
diff --git a/java-numbers-2/README.md b/java-numbers-2/README.md
index e200c4aa03..2d0d5443b1 100644
--- a/java-numbers-2/README.md
+++ b/java-numbers-2/README.md
@@ -15,4 +15,5 @@ This module contains articles about numbers in Java.
- [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers)
- [Generating Random Numbers in a Range in Java](https://www.baeldung.com/java-generating-random-numbers)
- [Listing Numbers Within a Range in Java](https://www.baeldung.com/java-listing-numbers-within-a-range)
+- [Fibonacci Series in Java](https://www.baeldung.com/java-fibonacci)
- More articles: [[<-- prev]](/../java-numbers)
diff --git a/java-numbers-3/pom.xml b/java-numbers-3/pom.xml
index e3c64064c7..bf5fe9b0e7 100644
--- a/java-numbers-3/pom.xml
+++ b/java-numbers-3/pom.xml
@@ -17,7 +17,7 @@
it.unimi.dsi
dsiutils
- 2.6.0
+ ${dsiutils.version}
@@ -31,4 +31,8 @@
+
+ 2.6.0
+
+
diff --git a/javax-servlets/README.md b/javax-servlets/README.md
index 085cc04f87..7dbe1a02ad 100644
--- a/javax-servlets/README.md
+++ b/javax-servlets/README.md
@@ -9,6 +9,6 @@ This module contains articles about Servlets.
- [Uploading Files with Servlets and JSP](https://www.baeldung.com/upload-file-servlet)
- [Example of Downloading File in a Servlet](https://www.baeldung.com/servlet-download-file)
- [Returning a JSON Response from a Servlet](https://www.baeldung.com/servlet-json-response)
-- [Java EE Servlet Exception Handling](https://www.baeldung.com/servlet-exceptions)
+- [Jakarta EE Servlet Exception Handling](https://www.baeldung.com/servlet-exceptions)
- [Context and Servlet Initialization Parameters](https://www.baeldung.com/context-servlet-initialization-param)
- [The Difference between getRequestURI and getPathInfo in HttpServletRequest](https://www.baeldung.com/http-servlet-request-requesturi-pathinfo)
diff --git a/jee-7-security/README.md b/jee-7-security/README.md
index ced2beec46..0d95d81474 100644
--- a/jee-7-security/README.md
+++ b/jee-7-security/README.md
@@ -3,4 +3,4 @@
This module contains articles about security in JEE 7.
### Relevant Articles:
-- [Securing Java EE with Spring Security](https://www.baeldung.com/java-ee-spring-security)
+- [Securing Jakarta EE with Spring Security](https://www.baeldung.com/java-ee-spring-security)
diff --git a/jee-7/README.md b/jee-7/README.md
index 2c45fe2c67..adaee67d74 100644
--- a/jee-7/README.md
+++ b/jee-7/README.md
@@ -3,7 +3,7 @@
This module contains articles about JEE 7.
### Relevant Articles:
-- [Scheduling in Java EE](https://www.baeldung.com/scheduling-in-java-enterprise-edition)
+- [Scheduling in Jakarta EE](https://www.baeldung.com/scheduling-in-java-enterprise-edition)
- [JSON Processing in Java EE 7](https://www.baeldung.com/jee7-json)
- [Converters, Listeners and Validators in Java EE 7](https://www.baeldung.com/java-ee7-converter-listener-validator)
- [Introduction to JAX-WS](https://www.baeldung.com/jax-ws)
diff --git a/jee-kotlin/README.md b/jee-kotlin/README.md
index aa3aa58b4e..e8975a7f62 100644
--- a/jee-kotlin/README.md
+++ b/jee-kotlin/README.md
@@ -3,4 +3,4 @@
This module contains articles about Java EE with Kotlin.
### Relevant Articles:
-- [Java EE Application with Kotlin](https://www.baeldung.com/java-ee-kotlin-app)
+- [Jakarta EE Application with Kotlin](https://www.baeldung.com/java-ee-kotlin-app)
diff --git a/jhipster/jhipster-uaa/quotes/pom.xml b/jhipster/jhipster-uaa/quotes/pom.xml
index 81ab23471f..aacc6f8e36 100644
--- a/jhipster/jhipster-uaa/quotes/pom.xml
+++ b/jhipster/jhipster-uaa/quotes/pom.xml
@@ -232,7 +232,7 @@
org.zalando
problem-spring-web
- 0.24.0-RC.0
+ ${zalando.version}
org.springframework.security.oauth
@@ -910,5 +910,6 @@
${project.basedir}/src/test/
+ 0.24.0-RC.0
diff --git a/jta/README.md b/jta/README.md
index 0351177a0d..202019118d 100644
--- a/jta/README.md
+++ b/jta/README.md
@@ -3,4 +3,4 @@
This module contains articles about the Java Transaction API (JTA).
### Relevant Articles:
-- [Guide to Java EE JTA](https://www.baeldung.com/jee-jta)
+- [Guide to Jakarta EE JTA](https://www.baeldung.com/jee-jta)
diff --git a/kotlin-libraries-2/pom.xml b/kotlin-libraries-2/pom.xml
index 27dc91d156..254f2c6907 100644
--- a/kotlin-libraries-2/pom.xml
+++ b/kotlin-libraries-2/pom.xml
@@ -21,7 +21,7 @@
io.reactivex.rxjava2
rxkotlin
- 2.3.0
+ ${rxkotlin.version}
junit
@@ -86,6 +86,7 @@
27.1-jre
1.9.3
0.1
+ 2.3.0
diff --git a/kotlin-quasar/pom.xml b/kotlin-quasar/pom.xml
index f5fbce6ed7..ec37fa8059 100644
--- a/kotlin-quasar/pom.xml
+++ b/kotlin-quasar/pom.xml
@@ -48,7 +48,7 @@
junit
junit
- 4.12
+ ${junit.version}
@@ -148,6 +148,7 @@
3.1.1
2.22.1
1.3.2
+ 4.12
diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml
index 2cfebd57ce..1dbe6b2435 100644
--- a/libraries-3/pom.xml
+++ b/libraries-3/pom.xml
@@ -67,7 +67,12 @@
org.cactoos
cactoos
${cactoos.version}
-
+
+
+ org.cache2k
+ cache2k-base-bom
+ ${cache2k.version}
+ pom
@@ -88,5 +93,6 @@
0.43
2.7.2
+ 1.2.3.Final
diff --git a/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelper.java b/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelper.java
new file mode 100644
index 0000000000..dc984e5f0b
--- /dev/null
+++ b/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelper.java
@@ -0,0 +1,41 @@
+package com.baeldung.cache2k;
+
+import java.util.Objects;
+
+import org.cache2k.Cache;
+import org.cache2k.Cache2kBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ProductHelper {
+
+ final Logger LOGGER = LoggerFactory.getLogger(ProductHelper.class);
+
+ private Cache cachedDiscounts;
+
+ public ProductHelper() {
+ cachedDiscounts = Cache2kBuilder.of(String.class, Integer.class)
+ .name("discount")
+ .eternal(true)
+ .entryCapacity(100)
+ .build();
+
+ initDiscountCache("Sports", 20);
+ }
+
+ public void initDiscountCache(String productType, Integer value) {
+ cachedDiscounts.put(productType, value);
+ }
+
+ public Integer getDiscount(String productType) {
+ Integer discount = cachedDiscounts.get(productType);
+ if (Objects.isNull(discount)) {
+ LOGGER.info("Discount for {} not found.", productType);
+ discount = 0;
+ } else {
+ LOGGER.info("Discount for {} found.", productType);
+ }
+ return discount;
+ }
+
+}
diff --git a/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperUsingLoader.java b/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperUsingLoader.java
new file mode 100644
index 0000000000..787a78cd36
--- /dev/null
+++ b/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperUsingLoader.java
@@ -0,0 +1,41 @@
+package com.baeldung.cache2k;
+
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+import org.cache2k.Cache;
+import org.cache2k.Cache2kBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ProductHelperUsingLoader {
+
+ final Logger LOGGER = LoggerFactory.getLogger(ProductHelperUsingLoader.class);
+
+ private Cache cachedDiscounts;
+
+ public ProductHelperUsingLoader() {
+ cachedDiscounts = Cache2kBuilder.of(String.class, Integer.class)
+ .name("discount-loader")
+ .eternal(false)
+ .expireAfterWrite(10, TimeUnit.MILLISECONDS)
+ .entryCapacity(100)
+ .loader((key) -> {
+ LOGGER.info("Calculating discount for {}.", key);
+ return "Sports".equalsIgnoreCase(key) ? 20 : 10;
+ })
+ .build();
+ }
+
+ public Integer getDiscount(String productType) {
+ Integer discount = cachedDiscounts.get(productType);
+ if (Objects.isNull(discount)) {
+ LOGGER.info("Discount for {} not found.", productType);
+ discount = 0;
+ } else {
+ LOGGER.info("Discount for {} found.", productType);
+ }
+ return discount;
+ }
+
+}
diff --git a/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperWithEventListener.java b/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperWithEventListener.java
new file mode 100644
index 0000000000..5b9eb28c68
--- /dev/null
+++ b/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperWithEventListener.java
@@ -0,0 +1,49 @@
+package com.baeldung.cache2k;
+
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+import org.cache2k.Cache;
+import org.cache2k.Cache2kBuilder;
+import org.cache2k.CacheEntry;
+import org.cache2k.event.CacheEntryCreatedListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ProductHelperWithEventListener {
+
+ final Logger LOGGER = LoggerFactory.getLogger(ProductHelperWithEventListener.class);
+
+ private Cache cachedDiscounts;
+
+ public ProductHelperWithEventListener() {
+ cachedDiscounts = Cache2kBuilder.of(String.class, Integer.class)
+ .name("discount-listener")
+ .eternal(false)
+ .expireAfterWrite(10, TimeUnit.MILLISECONDS)
+ .entryCapacity(100)
+ .loader((key) -> {
+ LOGGER.info("Calculating discount for {}.", key);
+ return "Sports".equalsIgnoreCase(key) ? 20 : 10;
+ })
+ .addListener(new CacheEntryCreatedListener() {
+ @Override
+ public void onEntryCreated(Cache cache, CacheEntry entry) {
+ LOGGER.info("Entry created: [{}, {}].", entry.getKey(), entry.getValue());
+ }
+ })
+ .build();
+ }
+
+ public Integer getDiscount(String productType) {
+ Integer discount = cachedDiscounts.get(productType);
+ if (Objects.isNull(discount)) {
+ LOGGER.info("Discount for {} not found.", productType);
+ discount = 0;
+ } else {
+ LOGGER.info("Discount for {} found.", productType);
+ }
+ return discount;
+ }
+
+}
diff --git a/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperWithExpiry.java b/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperWithExpiry.java
new file mode 100644
index 0000000000..b0bf8f90de
--- /dev/null
+++ b/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperWithExpiry.java
@@ -0,0 +1,43 @@
+package com.baeldung.cache2k;
+
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+import org.cache2k.Cache;
+import org.cache2k.Cache2kBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ProductHelperWithExpiry {
+
+ final Logger LOGGER = LoggerFactory.getLogger(ProductHelperWithExpiry.class);
+
+ private Cache cachedDiscounts;
+
+ public ProductHelperWithExpiry() {
+ cachedDiscounts = Cache2kBuilder.of(String.class, Integer.class)
+ .name("discount-expiry")
+ .eternal(false)
+ .expireAfterWrite(5, TimeUnit.MILLISECONDS)
+ .entryCapacity(100)
+ .build();
+
+ initDiscountCache("Sports", 20);
+ }
+
+ public void initDiscountCache(String productType, Integer value) {
+ cachedDiscounts.put(productType, value);
+ }
+
+ public Integer getDiscount(String productType) {
+ Integer discount = cachedDiscounts.get(productType);
+ if (Objects.isNull(discount)) {
+ LOGGER.info("Discount for {} not found.", productType);
+ discount = 0;
+ } else {
+ LOGGER.info("Discount for {} found.", productType);
+ }
+ return discount;
+ }
+
+}
diff --git a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUnitTest.java b/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUnitTest.java
new file mode 100644
index 0000000000..69da2591dd
--- /dev/null
+++ b/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUnitTest.java
@@ -0,0 +1,17 @@
+package com.baeldung.cache2k;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class ProductHelperUnitTest {
+
+ ProductHelper productHelper = new ProductHelper();
+
+ @Test
+ public void whenInvokedGetDiscount_thenGetItFromCache() {
+ assertTrue(productHelper.getDiscount("Sports") == 20);
+ assertTrue(productHelper.getDiscount("Electronics") == 0);
+ }
+
+}
diff --git a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUsingLoaderUnitTest.java b/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUsingLoaderUnitTest.java
new file mode 100644
index 0000000000..2656e75cab
--- /dev/null
+++ b/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUsingLoaderUnitTest.java
@@ -0,0 +1,17 @@
+package com.baeldung.cache2k;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class ProductHelperUsingLoaderUnitTest {
+
+ ProductHelperUsingLoader productHelper = new ProductHelperUsingLoader();
+
+ @Test
+ public void whenInvokedGetDiscount_thenPopulateCache() {
+ assertTrue(productHelper.getDiscount("Sports") == 20);
+ assertTrue(productHelper.getDiscount("Electronics") == 10);
+ }
+
+}
diff --git a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithEventListenerUnitTest.java b/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithEventListenerUnitTest.java
new file mode 100644
index 0000000000..7bf08232f4
--- /dev/null
+++ b/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithEventListenerUnitTest.java
@@ -0,0 +1,16 @@
+package com.baeldung.cache2k;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class ProductHelperWithEventListenerUnitTest {
+
+ ProductHelperWithEventListener productHelper = new ProductHelperWithEventListener();
+
+ @Test
+ public void whenEntryAddedInCache_thenEventListenerCalled() {
+ assertTrue(productHelper.getDiscount("Sports") == 20);
+ }
+
+}
diff --git a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithExpiryUnitTest.java b/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithExpiryUnitTest.java
new file mode 100644
index 0000000000..65feba2c70
--- /dev/null
+++ b/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithExpiryUnitTest.java
@@ -0,0 +1,18 @@
+package com.baeldung.cache2k;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class ProductHelperWithExpiryUnitTest {
+
+ ProductHelperWithExpiry productHelper = new ProductHelperWithExpiry();
+
+ @Test
+ public void whenInvokedGetDiscountForExpiredProduct_thenNoDiscount() throws InterruptedException {
+ assertTrue(productHelper.getDiscount("Sports") == 20);
+ Thread.sleep(20);
+ assertTrue(productHelper.getDiscount("Sports") == 0);
+ }
+
+}
diff --git a/libraries-http/README.md b/libraries-http/README.md
index f5afb2d277..4c27ec1c8d 100644
--- a/libraries-http/README.md
+++ b/libraries-http/README.md
@@ -12,3 +12,4 @@ This module contains articles about HTTP libraries.
- [Introduction to Retrofit](https://www.baeldung.com/retrofit)
- [A Guide to Unirest](https://www.baeldung.com/unirest)
- [Creating REST Microservices with Javalin](https://www.baeldung.com/javalin-rest-microservices)
+- [A Quick Guide to Timeouts in OkHttp](https://www.baeldung.com/okhttp-timeouts)
diff --git a/libraries-security/README.md b/libraries-security/README.md
index 819bc866cf..580ebdeab0 100644
--- a/libraries-security/README.md
+++ b/libraries-security/README.md
@@ -9,4 +9,4 @@ This module contains articles about security libraries.
- [Guide to Google Tink](https://www.baeldung.com/google-tink)
- [Introduction to BouncyCastle with Java](https://www.baeldung.com/java-bouncy-castle)
- [Intro to Jasypt](https://www.baeldung.com/jasypt)
-- [Digital Signature in Java](https://www.baeldung.com/java-digital-signature)
+- [Digital Signatures in Java](https://www.baeldung.com/java-digital-signature)
diff --git a/maven-all/maven-custom-plugin/README.md b/maven-all/maven-custom-plugin/README.md
new file mode 100644
index 0000000000..55d147c337
--- /dev/null
+++ b/maven-all/maven-custom-plugin/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [How to Create a Maven Plugin](https://www.baeldung.com/maven-plugin)
diff --git a/maven-all/profiles/pom.xml b/maven-all/profiles/pom.xml
index 01b191c7d6..4ae6d1ee40 100644
--- a/maven-all/profiles/pom.xml
+++ b/maven-all/profiles/pom.xml
@@ -73,7 +73,7 @@
org.apache.maven.plugins
maven-help-plugin
- 3.2.0
+ ${help.plugin.version}
show-profiles
@@ -87,4 +87,8 @@
+
+ 3.2.0
+
+
\ No newline at end of file
diff --git a/maven-all/versions-maven-plugin/original/pom.xml b/maven-all/versions-maven-plugin/original/pom.xml
index c6c1657b25..54140aec9b 100644
--- a/maven-all/versions-maven-plugin/original/pom.xml
+++ b/maven-all/versions-maven-plugin/original/pom.xml
@@ -46,7 +46,7 @@
org.codehaus.mojo
versions-maven-plugin
- 2.7
+ ${versions.plugin.version}
org.apache.commons:commons-collections4
@@ -76,6 +76,7 @@
4.0
3.0
1.9.1
+ 2.7
\ No newline at end of file
diff --git a/ninja/pom.xml b/ninja/pom.xml
index b66225f693..afb1d509b8 100644
--- a/ninja/pom.xml
+++ b/ninja/pom.xml
@@ -16,6 +16,12 @@
3.3.4
2.1.3
1.4.186
+ 3.2
+ 1.8
+ 1.8
+ 1.3.1
+ 2.8.2
+ 2.2
@@ -23,16 +29,16 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.2
+ ${compiler.plugin.version}
- 1.8
- 1.8
+ ${source.version}
+ ${target.version}
org.apache.maven.plugins
maven-enforcer-plugin
- 1.3.1
+ ${enforcer.plugin.version}
enforce-banned-dependencies
@@ -95,7 +101,7 @@
org.apache.maven.plugins
maven-deploy-plugin
- 2.8.2
+ ${deploy.plugin.version}
true
@@ -103,7 +109,7 @@
org.apache.maven.plugins
maven-shade-plugin
- 2.2
+ ${shade.plugin.version}
true
diff --git a/oauth2-framework-impl/README.md b/oauth2-framework-impl/README.md
index ea9686b451..ae28c1b511 100644
--- a/oauth2-framework-impl/README.md
+++ b/oauth2-framework-impl/README.md
@@ -4,4 +4,4 @@ This module contains articles about the implementation of OAuth2 with Java EE.
### Relevant Articles
-- [Implementing The OAuth 2.0 Authorization Framework Using Java EE](https://www.baeldung.com/java-ee-oauth2-implementation)
+- [Implementing The OAuth 2.0 Authorization Framework Using Jakarta EE](https://www.baeldung.com/java-ee-oauth2-implementation)
diff --git a/open-liberty/pom.xml b/open-liberty/pom.xml
new file mode 100644
index 0000000000..d6588ce49a
--- /dev/null
+++ b/open-liberty/pom.xml
@@ -0,0 +1,130 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ open-liberty
+ 1.0-SNAPSHOT
+ war
+
+
+
+ jakarta.platform
+ jakarta.jakartaee-web-api
+ ${version.jakarta.jakartaee-web-api}
+ provided
+
+
+ org.eclipse.microprofile
+ microprofile
+ ${version.microprofile}
+ pom
+ provided
+
+
+ org.apache.derby
+ derby
+ ${version.derby}
+
+
+
+
+ junit
+ junit
+ ${version.junit}
+ test
+
+
+ org.eclipse
+ yasson
+ ${version.yasson}
+ test
+
+
+ org.apache.cxf
+ cxf-rt-rs-client
+ ${version.cxf-rt-rs-client}
+ test
+
+
+ org.glassfish
+ javax.json
+ ${version.javax.json}
+ test
+
+
+ org.apache.cxf
+ cxf-rt-rs-mp-client
+ ${version.cxf-rt-rs-mp-client}
+ test
+
+
+
+
+ ${project.artifactId}
+
+
+
+ io.openliberty.tools
+ liberty-maven-plugin
+ ${version.liberty-maven-plugin}
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+ ${version.maven-dependency-plugin}
+
+
+ copy-derby-dependency
+ package
+
+ copy-dependencies
+
+
+ derby
+ ${project.build.directory}/liberty/wlp/usr/shared/resources/
+
+ ${testServerHttpPort}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+ ${version.maven-war-plugin}
+
+
+
+
+
+
+ 1.8
+ 1.8
+ UTF-8
+ UTF-8
+ false
+
+
+ 8.0.0
+ 3.2
+ 10.14.2.0
+ 3.1
+ 2.10
+ 3.2.3
+ 4.12
+ 1.0.5
+ 3.2.6
+ 1.0.4
+ 3.3.1
+
+
+ openliberty
+ 9080
+ 9443
+ 7070
+
+
\ No newline at end of file
diff --git a/open-liberty/src/main/java/com/baeldung/openliberty/person/dao/PersonDao.java b/open-liberty/src/main/java/com/baeldung/openliberty/person/dao/PersonDao.java
new file mode 100644
index 0000000000..e2d408d8b0
--- /dev/null
+++ b/open-liberty/src/main/java/com/baeldung/openliberty/person/dao/PersonDao.java
@@ -0,0 +1,24 @@
+package com.baeldung.openliberty.person.dao;
+
+import javax.enterprise.context.RequestScoped;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import com.baeldung.openliberty.person.model.Person;
+
+@RequestScoped
+public class PersonDao {
+
+ @PersistenceContext(name = "jpa-unit")
+ private EntityManager em;
+
+ public Person createPerson(Person person) {
+ em.persist(person);
+ return person;
+ }
+
+ public Person readPerson(int personId) {
+ return em.find(Person.class, personId);
+ }
+
+}
\ No newline at end of file
diff --git a/open-liberty/src/main/java/com/baeldung/openliberty/person/model/Person.java b/open-liberty/src/main/java/com/baeldung/openliberty/person/model/Person.java
new file mode 100644
index 0000000000..79e8c16911
--- /dev/null
+++ b/open-liberty/src/main/java/com/baeldung/openliberty/person/model/Person.java
@@ -0,0 +1,58 @@
+package com.baeldung.openliberty.person.model;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+
+@Entity
+public class Person {
+
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ @Id
+ private int id;
+
+ private String username;
+ private String email;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public Person(int id, @NotBlank String username, @Email String email) {
+ super();
+ this.id = id;
+ this.username = username;
+ this.email = email;
+ }
+
+ public Person() {
+ super();
+ }
+
+ public String toString() {
+ return this.id + ":" +this.username;
+ }
+}
diff --git a/open-liberty/src/main/java/com/baeldung/openliberty/person/resource/PersonResource.java b/open-liberty/src/main/java/com/baeldung/openliberty/person/resource/PersonResource.java
new file mode 100644
index 0000000000..0fb86860b8
--- /dev/null
+++ b/open-liberty/src/main/java/com/baeldung/openliberty/person/resource/PersonResource.java
@@ -0,0 +1,52 @@
+package com.baeldung.openliberty.person.resource;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+import javax.transaction.Transactional;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import com.baeldung.openliberty.person.dao.PersonDao;
+import com.baeldung.openliberty.person.model.Person;
+
+@RequestScoped
+@Path("persons")
+public class PersonResource {
+
+ @Inject
+ private PersonDao personDao;
+
+ @GET
+ @Produces(MediaType.APPLICATION_JSON)
+ public List getAllPersons() {
+ return Arrays.asList(new Person(1, "normanlewis", "normanlewis@email.com"));
+ }
+
+ @POST
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Transactional
+ public Response addPerson(Person person) {
+ personDao.createPerson(person);
+ String respMessage = "Person #" + person.getId() + " created successfully.";
+ return Response.status(Response.Status.CREATED).entity(respMessage).build();
+ }
+
+ @GET
+ @Path("{id}")
+ @Produces(MediaType.APPLICATION_JSON)
+ @Transactional
+ public Person getPerson(@PathParam("id") int id) {
+ Person person = personDao.readPerson(id);
+ return person;
+ }
+}
diff --git a/open-liberty/src/main/java/com/baeldung/openliberty/rest/ApiApplication.java b/open-liberty/src/main/java/com/baeldung/openliberty/rest/ApiApplication.java
new file mode 100644
index 0000000000..176eaccaed
--- /dev/null
+++ b/open-liberty/src/main/java/com/baeldung/openliberty/rest/ApiApplication.java
@@ -0,0 +1,9 @@
+package com.baeldung.openliberty.rest;
+
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("/api")
+public class ApiApplication extends Application {
+
+}
diff --git a/open-liberty/src/main/java/com/baeldung/openliberty/rest/consumes/RestConsumer.java b/open-liberty/src/main/java/com/baeldung/openliberty/rest/consumes/RestConsumer.java
new file mode 100644
index 0000000000..8073c408dd
--- /dev/null
+++ b/open-liberty/src/main/java/com/baeldung/openliberty/rest/consumes/RestConsumer.java
@@ -0,0 +1,18 @@
+package com.baeldung.openliberty.rest.consumes;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.core.Response;
+
+public class RestConsumer {
+
+ public static String consumeWithJsonb(String targetUrl) {
+ Client client = ClientBuilder.newClient();
+ Response response = client.target(targetUrl).request().get();
+ String result = response.readEntity(String.class);
+ response.close();
+ client.close();
+ return result;
+ }
+
+}
diff --git a/open-liberty/src/main/java/com/baeldung/openliberty/servlet/AppServlet.java b/open-liberty/src/main/java/com/baeldung/openliberty/servlet/AppServlet.java
new file mode 100644
index 0000000000..d8c8d159c4
--- /dev/null
+++ b/open-liberty/src/main/java/com/baeldung/openliberty/servlet/AppServlet.java
@@ -0,0 +1,27 @@
+package com.baeldung.openliberty.servlet;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@WebServlet(urlPatterns="/app")
+public class AppServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ String htmlOutput = "Hello! Welcome to Open Liberty
";
+ response.getWriter().append(htmlOutput);
+ }
+
+ @Override
+ protected void doPost(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+ doGet(request, response);
+ }
+}
\ No newline at end of file
diff --git a/open-liberty/src/main/liberty/config/server.xml b/open-liberty/src/main/liberty/config/server.xml
new file mode 100644
index 0000000000..bc99905058
--- /dev/null
+++ b/open-liberty/src/main/liberty/config/server.xml
@@ -0,0 +1,28 @@
+
+
+ mpHealth-2.0
+ servlet-4.0
+ jaxrs-2.1
+ jsonp-1.1
+ jsonb-1.0
+ cdi-2.0
+ jpa-2.2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/open-liberty/src/main/resources/META-INF/persistence.xml b/open-liberty/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000000..ca8ad1a5c9
--- /dev/null
+++ b/open-liberty/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,14 @@
+
+
+
+ jdbc/jpadatasource
+
+
+
+
+
+
\ No newline at end of file
diff --git a/open-liberty/src/test/java/com/baeldung/openliberty/RestClientTest.java b/open-liberty/src/test/java/com/baeldung/openliberty/RestClientTest.java
new file mode 100644
index 0000000000..4978483ca0
--- /dev/null
+++ b/open-liberty/src/test/java/com/baeldung/openliberty/RestClientTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.openliberty;
+
+import static org.junit.Assert.assertEquals;
+
+import javax.json.bind.JsonbBuilder;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.baeldung.openliberty.person.model.Person;
+import com.baeldung.openliberty.rest.consumes.RestConsumer;
+
+public class RestClientTest {
+
+ private static String BASE_URL;
+
+ private final String API_PERSON = "api/persons";
+
+ @BeforeClass
+ public static void oneTimeSetup() {
+ BASE_URL = "http://localhost:9080/";
+ }
+
+ @Test
+ public void testSuite() {
+ //run the test only when liberty server is started
+ //this.whenConsumeWithJsonb_thenGetPerson();
+ }
+
+ public void whenConsumeWithJsonb_thenGetPerson() {
+ String url = BASE_URL + API_PERSON + "/1";
+ String result = RestConsumer.consumeWithJsonb(url);
+
+ Person person = JsonbBuilder.create().fromJson(result, Person.class);
+ assertEquals(1, person.getId());
+ assertEquals("normanlewis", person.getUsername());
+ assertEquals("normanlewis@email.com", person.getEmail());
+ }
+
+}
diff --git a/parent-kotlin/pom.xml b/parent-kotlin/pom.xml
index a180343378..abc871ca91 100644
--- a/parent-kotlin/pom.xml
+++ b/parent-kotlin/pom.xml
@@ -16,7 +16,7 @@
jcenter
- http://jcenter.bintray.com
+ https://jcenter.bintray.com
kotlin-ktor
@@ -45,7 +45,7 @@
org.springframework.boot
spring-boot-dependencies
- 2.2.0.M4
+ ${boot.dependencies.version}
pom
import
@@ -215,6 +215,7 @@
0.9.5
3.12.0
1.3.2
+ 2.2.0.M4
diff --git a/parent-spring-4/pom.xml b/parent-spring-4/pom.xml
index 671ca7db6b..3749c5016e 100644
--- a/parent-spring-4/pom.xml
+++ b/parent-spring-4/pom.xml
@@ -51,7 +51,7 @@
- 4.3.25.RELEASE
+ 4.3.26.RELEASE
1.6.1
diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml
index 94588c99d4..c8cebd8a11 100644
--- a/performance-tests/pom.xml
+++ b/performance-tests/pom.xml
@@ -38,7 +38,7 @@
org.mapstruct
mapstruct-processor
- 1.2.0.Final
+ ${mapstruct-jdk8.version}
provided
@@ -93,6 +93,15 @@
Name of the benchmark Uber-JAR to generate.
-->
benchmarks
+ 3.1
+ 2.2
+ 2.5.1
+ 2.4
+ 2.9.1
+ 2.6
+ 3.3
+ 2.2.1
+ 2.17
@@ -100,7 +109,7 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.1
+ ${compiler.plugin.version}
${javac.target}
${javac.target}
@@ -117,7 +126,7 @@
org.apache.maven.plugins
maven-shade-plugin
- 2.2
+ ${shade.plugin.version}
package
@@ -162,31 +171,31 @@
maven-install-plugin
- 2.5.1
+ ${install.version}
maven-jar-plugin
- 2.4
+ ${jar.plugin.version}
maven-javadoc-plugin
- 2.9.1
+ ${javadoc.plugin.version}
maven-resources-plugin
- 2.6
+ ${resources.plugin.version}
maven-site-plugin
- 3.3
+ ${site.plugin.version}
maven-source-plugin
- 2.2.1
+ ${source.plugin.version}
maven-surefire-plugin
- 2.17
+ ${surefire.plugin.version}
diff --git a/persistence-modules/hibernate5-2/README.md b/persistence-modules/hibernate5-2/README.md
index c41b5307d0..d409f99a3a 100644
--- a/persistence-modules/hibernate5-2/README.md
+++ b/persistence-modules/hibernate5-2/README.md
@@ -6,4 +6,5 @@ This module contains articles about Hibernate 5.
- [Hibernate Error “Not all named parameters have been set”](https://www.baeldung.com/hibernate-error-named-parameters-not-set)
- [FetchMode in Spring Data JPA](https://www.baeldung.com/spring-data-jpa-fetchmode)
- [JPA/Hibernate Persistence Context](https://www.baeldung.com/jpa-hibernate-persistence-context)
+- [FetchMode in Hibernate](https://www.baeldung.com/hibernate-fetchmode)
- [[<-- Prev]](/hibernate5)
diff --git a/persistence-modules/hibernate5-2/pom.xml b/persistence-modules/hibernate5-2/pom.xml
index c9ccc09c88..15d42b3244 100644
--- a/persistence-modules/hibernate5-2/pom.xml
+++ b/persistence-modules/hibernate5-2/pom.xml
@@ -54,9 +54,9 @@
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
+ org.apache.commons
+ commons-lang3
+ ${commons.lang3.version}
@@ -66,6 +66,9 @@
3.8.1
true
2.1.7.RELEASE
+ 5.4.7.Final
+ 1.4.200
+ 3.8.1
diff --git a/persistence-modules/jnosql/jnosql-diana/pom.xml b/persistence-modules/jnosql/jnosql-diana/pom.xml
index 22e066d36d..79c455646c 100644
--- a/persistence-modules/jnosql/jnosql-diana/pom.xml
+++ b/persistence-modules/jnosql/jnosql-diana/pom.xml
@@ -55,7 +55,7 @@
org.codehaus.mojo
exec-maven-plugin
- 1.6.0
+ ${exec-maven-plugin.version}
document
diff --git a/persistence-modules/sirix/README.md b/persistence-modules/sirix/README.md
index ab7fb65e44..923b111e7a 100644
--- a/persistence-modules/sirix/README.md
+++ b/persistence-modules/sirix/README.md
@@ -1,4 +1,3 @@
## Relevant articles:
-- [Introduction to Sirix](https://www.baeldung.com/introduction-to-sirix)
- [A Guide to SirixDB](https://www.baeldung.com/sirix)
diff --git a/persistence-modules/sirix/pom.xml b/persistence-modules/sirix/pom.xml
index ccaec79775..d8e065ec2f 100644
--- a/persistence-modules/sirix/pom.xml
+++ b/persistence-modules/sirix/pom.xml
@@ -30,7 +30,7 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.8.0
+ ${compiler.plugin.version}
${maven.release.version}
${project.build.sourceEncoding}
@@ -39,7 +39,7 @@
org.ow2.asm
asm
- 6.1
+ ${asm.version}
@@ -50,6 +50,8 @@
UTF-8
11
0.9.3
+ 3.8.0
+ 6.1
diff --git a/persistence-modules/spring-boot-persistence-2/pom.xml b/persistence-modules/spring-boot-persistence-2/pom.xml
index 8fee49af70..048dd45c7f 100644
--- a/persistence-modules/spring-boot-persistence-2/pom.xml
+++ b/persistence-modules/spring-boot-persistence-2/pom.xml
@@ -20,7 +20,7 @@
org.springframework.boot
spring-boot-dependencies
- 2.1.8.RELEASE
+ ${spring.boot.dependencies}
pom
import
@@ -95,6 +95,7 @@
3.9.1
+ 2.1.8.RELEASE
diff --git a/persistence-modules/spring-data-geode/pom.xml b/persistence-modules/spring-data-geode/pom.xml
index 02dec1dadd..557d09376a 100644
--- a/persistence-modules/spring-data-geode/pom.xml
+++ b/persistence-modules/spring-data-geode/pom.xml
@@ -17,7 +17,7 @@
org.springframework.boot
spring-boot-starter
- ${spring-boot-version}
+ ${spring.boot.starter.version}
org.springframework.boot
@@ -88,6 +88,7 @@
UTF-8
com.baeldung.springdatageode.app.ClientCacheApp
1.1.1.RELEASE
+ 2.1.9.RELEASE
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 11e7bfb82c..36a3c5798c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -538,6 +538,7 @@
netflix-modules
ninja
+ open-liberty
oauth2-framework-impl
optaplanner
@@ -637,38 +638,8 @@
spring-batch
spring-bom
-
- spring-boot
- spring-boot-modules
- spring-boot-angular
- spring-boot-autoconfiguration
- spring-boot-bootstrap
- spring-boot-camel
-
- spring-boot-client
- spring-boot-config-jpa-error
- spring-boot-crud
- spring-boot-ctx-fluent
- spring-boot-custom-starter
- spring-boot-deployment
- spring-boot-di
- spring-boot-environment
- spring-boot-flowable
-
- spring-boot-jasypt
- spring-boot-kotlin
- spring-boot-libraries
- spring-boot-logging-log4j2
- spring-boot-mvc-2
- spring-boot-nashorn
spring-boot-parent
- spring-boot-property-exp
-
spring-boot-rest
- spring-boot-runtime
- spring-boot-runtime/disabling-console-jul
- spring-boot-runtime/disabling-console-log4j2
- spring-boot-runtime/disabling-console-logback
spring-caching
@@ -1075,6 +1046,7 @@
netflix-modules
ninja
+ open-liberty
oauth2-framework-impl
optaplanner
@@ -1166,39 +1138,8 @@
spring-batch
spring-bom
-
- spring-boot
- spring-boot-modules
- spring-boot-angular
- spring-boot-autoconfiguration
- spring-boot-bootstrap
- spring-boot-camel
-
- spring-boot-client
- spring-boot-config-jpa-error
- spring-boot-crud
- spring-boot-ctx-fluent
- spring-boot-custom-starter
- spring-boot-deployment
- spring-boot-di
- spring-boot-environment
- spring-boot-flowable
-
- spring-boot-jasypt
- spring-boot-kotlin
- spring-boot-libraries
- spring-boot-logging-log4j2
- spring-boot-mvc
- spring-boot-mvc-2
- spring-boot-nashorn
spring-boot-parent
- spring-boot-property-exp
-
spring-boot-rest
- spring-boot-runtime
- spring-boot-runtime/disabling-console-jul
- spring-boot-runtime/disabling-console-log4j2
- spring-boot-runtime/disabling-console-logback
spring-caching
diff --git a/quarkus-extension/README.md b/quarkus-extension/README.md
new file mode 100644
index 0000000000..782ec75957
--- /dev/null
+++ b/quarkus-extension/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [How to Implement a Quarkus Extension](https://www.baeldung.com/quarkus-extension-java)
diff --git a/quarkus-extension/quarkus-liquibase/deployment/pom.xml b/quarkus-extension/quarkus-liquibase/deployment/pom.xml
index 488d1e9ce5..c85d986390 100644
--- a/quarkus-extension/quarkus-liquibase/deployment/pom.xml
+++ b/quarkus-extension/quarkus-liquibase/deployment/pom.xml
@@ -40,7 +40,7 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.8.1
+ ${compiler.plugin.version}
@@ -54,4 +54,8 @@
+
+ 3.8.1
+
+
\ 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 782e4f4e9d..83f7c8d4cc 100644
--- a/quarkus-extension/quarkus-liquibase/runtime/pom.xml
+++ b/quarkus-extension/quarkus-liquibase/runtime/pom.xml
@@ -50,7 +50,7 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.8.1
+ ${compiler.plugin.version}
@@ -66,6 +66,8 @@
3.8.1
+ 3.8.1
+ 3.8.1
\ No newline at end of file
diff --git a/rxjava-core/README.md b/rxjava-core/README.md
index 2773bd9423..95a374668d 100644
--- a/rxjava-core/README.md
+++ b/rxjava-core/README.md
@@ -13,4 +13,5 @@ This module contains articles about RxJava.
- [RxJava Maybe](https://www.baeldung.com/rxjava-maybe)
- [Combining RxJava Completables](https://www.baeldung.com/rxjava-completable)
- [RxJava Hooks](https://www.baeldung.com/rxjava-hooks)
+- [Introduction to rxjava-jdbc](https://www.baeldung.com/rxjava-jdbc)
- More articles: [[next -->]](/rxjava-2)
diff --git a/spf4j/spf4j-aspects-app/pom.xml b/spf4j/spf4j-aspects-app/pom.xml
index 2458e2d8ad..db6a18f26a 100644
--- a/spf4j/spf4j-aspects-app/pom.xml
+++ b/spf4j/spf4j-aspects-app/pom.xml
@@ -39,16 +39,16 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.8.0
+ ${compiler.plugin.version}
- 1.8
- 1.8
+ ${java.version}
+ ${java.version}
org.apache.maven.plugins
maven-dependency-plugin
- 3.1.1
+ ${dependency.plugin.version}
copy-dependencies
@@ -84,6 +84,8 @@
UTF-8
8.6.10
1.7.21
+ 3.8.0
+ 3.1.1
diff --git a/spf4j/spf4j-core-app/pom.xml b/spf4j/spf4j-core-app/pom.xml
index 45300fd4a4..48cbf4a1c9 100644
--- a/spf4j/spf4j-core-app/pom.xml
+++ b/spf4j/spf4j-core-app/pom.xml
@@ -39,16 +39,16 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.8.0
+ ${compiler.plugin.version}
- 1.8
- 1.8
+ ${java.version}
+ ${java.version}
org.apache.maven.plugins
maven-dependency-plugin
- 3.1.1
+ ${dependency.plugin.version}
copy-dependencies
@@ -84,6 +84,8 @@
UTF-8
8.6.10
1.7.21
+ 3.8.0
+ 3.1.1
diff --git a/spring-amqp/README.md b/spring-amqp/README.md
index 0ae4eda12e..6b09aec10a 100644
--- a/spring-amqp/README.md
+++ b/spring-amqp/README.md
@@ -5,4 +5,5 @@ This module contains articles about Spring with the AMQP messaging system
## Relevant articles:
- [Messaging With Spring AMQP](https://www.baeldung.com/spring-amqp)
-- [RabbitMQ Message Dispatching with Spring AMQP](https://www.baeldung.com/rabbitmq-spring-amqp)
\ No newline at end of file
+- [RabbitMQ Message Dispatching with Spring AMQP](https://www.baeldung.com/rabbitmq-spring-amqp)
+- [Error Handling with Spring AMQP](https://www.baeldung.com/spring-amqp-error-handling)
diff --git a/spring-boot-bootstrap/src/main/resources/application-mysql.properties b/spring-boot-bootstrap/src/main/resources/application-mysql.properties
deleted file mode 100644
index a1823b5d7f..0000000000
--- a/spring-boot-bootstrap/src/main/resources/application-mysql.properties
+++ /dev/null
@@ -1 +0,0 @@
-spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
\ No newline at end of file
diff --git a/spring-boot-gradle/gradle/wrapper/gradle-wrapper.jar b/spring-boot-gradle/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 1ce6e58f1c..0000000000
Binary files a/spring-boot-gradle/gradle/wrapper/gradle-wrapper.jar and /dev/null differ
diff --git a/spring-boot-libraries/.mvn/wrapper/maven-wrapper.jar b/spring-boot-libraries/.mvn/wrapper/maven-wrapper.jar
deleted file mode 100644
index 5fd4d5023f..0000000000
Binary files a/spring-boot-libraries/.mvn/wrapper/maven-wrapper.jar and /dev/null differ
diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml
index 4cf2ba0410..b4cb81c296 100644
--- a/spring-boot-modules/pom.xml
+++ b/spring-boot-modules/pom.xml
@@ -14,13 +14,36 @@
+ spring-boot
spring-boot-admin
+ spring-boot-angular
spring-boot-artifacts
+ spring-boot-autoconfiguration
+ spring-boot-bootstrap
+ spring-boot-client
+ spring-boot-config-jpa-error
+ spring-boot-ctx-fluent
+ spring-boot-deployment
+ spring-boot-camel
+
+ spring-boot-custom-starter
+ spring-boot-crud
spring-boot-data
+ spring-boot-environment
+ spring-boot-flowable
+
+ spring-boot-jasypt
spring-boot-keycloak
+ spring-boot-libraries
+ spring-boot-logging-log4j2
+ spring-boot-kotlin
+ spring-boot-mvc
+ spring-boot-mvc-2
spring-boot-mvc-birt
- spring-boot-performance
+ spring-boot-nashorn
spring-boot-properties
+ spring-boot-property-exp
+ spring-boot-runtime
spring-boot-security
spring-boot-springdoc
spring-boot-testing
diff --git a/spring-boot-modules/spring-boot-admin/pom.xml b/spring-boot-modules/spring-boot-admin/pom.xml
index 817d4ad00c..f7dc98770a 100644
--- a/spring-boot-modules/spring-boot-admin/pom.xml
+++ b/spring-boot-modules/spring-boot-admin/pom.xml
@@ -19,8 +19,4 @@
spring-boot-admin-client
-
- 2.1.9.RELEASE
-
-
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 996bf424f4..8bb8c7bac3 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
@@ -58,7 +58,7 @@
- 2.1.6
+ 2.2.2
2.0.4.RELEASE
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 8ab9291c0c..118b270812 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
@@ -79,8 +79,8 @@
- 2.1.6
- 2.1.6
+ 2.2.2
+ 2.2.2
1.5.7
2.0.4.RELEASE
diff --git a/spring-boot-angular/README.md b/spring-boot-modules/spring-boot-angular/README.md
similarity index 100%
rename from spring-boot-angular/README.md
rename to spring-boot-modules/spring-boot-angular/README.md
diff --git a/spring-boot-angular/pom.xml b/spring-boot-modules/spring-boot-angular/pom.xml
similarity index 96%
rename from spring-boot-angular/pom.xml
rename to spring-boot-modules/spring-boot-angular/pom.xml
index d78761e921..5cfc530100 100644
--- a/spring-boot-angular/pom.xml
+++ b/spring-boot-modules/spring-boot-angular/pom.xml
@@ -12,7 +12,7 @@
com.baeldung
parent-boot-2
0.0.1-SNAPSHOT
- ../parent-boot-2
+ ../../parent-boot-2
diff --git a/spring-boot-angular/src/main/java/com/baeldung/application/Application.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/application/Application.java
similarity index 97%
rename from spring-boot-angular/src/main/java/com/baeldung/application/Application.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/application/Application.java
index f1155c3106..0101ea3a3b 100644
--- a/spring-boot-angular/src/main/java/com/baeldung/application/Application.java
+++ b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/application/Application.java
@@ -1,28 +1,28 @@
-package com.baeldung.application;
-
-import com.baeldung.application.entities.User;
-import com.baeldung.application.repositories.UserRepository;
-import java.util.stream.Stream;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.context.annotation.Bean;
-
-@SpringBootApplication
-public class Application {
-
- public static void main(String[] args) {
- SpringApplication.run(Application.class, args);
- }
-
- @Bean
- CommandLineRunner init(UserRepository userRepository) {
- return args -> {
- Stream.of("John", "Julie", "Jennifer", "Helen", "Rachel").forEach(name -> {
- User user = new User(name, name.toLowerCase() + "@domain.com");
- userRepository.save(user);
- });
- userRepository.findAll().forEach(System.out::println);
- };
- }
-}
+package com.baeldung.application;
+
+import com.baeldung.application.entities.User;
+import com.baeldung.application.repositories.UserRepository;
+import java.util.stream.Stream;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+ @Bean
+ CommandLineRunner init(UserRepository userRepository) {
+ return args -> {
+ Stream.of("John", "Julie", "Jennifer", "Helen", "Rachel").forEach(name -> {
+ User user = new User(name, name.toLowerCase() + "@domain.com");
+ userRepository.save(user);
+ });
+ userRepository.findAll().forEach(System.out::println);
+ };
+ }
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/application/controllers/UserController.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/application/controllers/UserController.java
similarity index 96%
rename from spring-boot-angular/src/main/java/com/baeldung/application/controllers/UserController.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/application/controllers/UserController.java
index 14c90d5b10..a87ac4e8d1 100644
--- a/spring-boot-angular/src/main/java/com/baeldung/application/controllers/UserController.java
+++ b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/application/controllers/UserController.java
@@ -1,31 +1,31 @@
-package com.baeldung.application.controllers;
-
-import com.baeldung.application.entities.User;
-import com.baeldung.application.repositories.UserRepository;
-import java.util.List;
-import org.springframework.web.bind.annotation.CrossOrigin;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-@CrossOrigin(origins = "http://localhost:4200")
-public class UserController {
-
- private final UserRepository userRepository;
-
- public UserController(UserRepository userRepository) {
- this.userRepository = userRepository;
- }
-
- @GetMapping("/users")
- public List getUsers() {
- return (List) userRepository.findAll();
- }
-
- @PostMapping("/users")
- void addUser(@RequestBody User user) {
- userRepository.save(user);
- }
-}
+package com.baeldung.application.controllers;
+
+import com.baeldung.application.entities.User;
+import com.baeldung.application.repositories.UserRepository;
+import java.util.List;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@CrossOrigin(origins = "http://localhost:4200")
+public class UserController {
+
+ private final UserRepository userRepository;
+
+ public UserController(UserRepository userRepository) {
+ this.userRepository = userRepository;
+ }
+
+ @GetMapping("/users")
+ public List getUsers() {
+ return (List) userRepository.findAll();
+ }
+
+ @PostMapping("/users")
+ void addUser(@RequestBody User user) {
+ userRepository.save(user);
+ }
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/application/entities/User.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/application/entities/User.java
similarity index 95%
rename from spring-boot-angular/src/main/java/com/baeldung/application/entities/User.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/application/entities/User.java
index 4c346fa5b9..ea23edc7e2 100644
--- a/spring-boot-angular/src/main/java/com/baeldung/application/entities/User.java
+++ b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/application/entities/User.java
@@ -1,43 +1,43 @@
-package com.baeldung.application.entities;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-
-@Entity
-public class User {
-
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- private long id;
- private final String name;
- private final String email;
-
- public User() {
- this.name = "";
- this.email = "";
- }
-
- public User(String name, String email) {
- this.name = name;
- this.email = email;
- }
-
- public long getId() {
- return id;
- }
-
- public String getName() {
- return name;
- }
-
- public String getEmail() {
- return email;
- }
-
- @Override
- public String toString() {
- return "User{" + "id=" + id + ", name=" + name + ", email=" + email + '}';
- }
-}
+package com.baeldung.application.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+public class User {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private long id;
+ private final String name;
+ private final String email;
+
+ public User() {
+ this.name = "";
+ this.email = "";
+ }
+
+ public User(String name, String email) {
+ this.name = name;
+ this.email = email;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" + "id=" + id + ", name=" + name + ", email=" + email + '}';
+ }
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/application/repositories/UserRepository.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/application/repositories/UserRepository.java
similarity index 97%
rename from spring-boot-angular/src/main/java/com/baeldung/application/repositories/UserRepository.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/application/repositories/UserRepository.java
index 5a81cadcbe..7bd71c2f86 100644
--- a/spring-boot-angular/src/main/java/com/baeldung/application/repositories/UserRepository.java
+++ b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/application/repositories/UserRepository.java
@@ -1,9 +1,9 @@
-package com.baeldung.application.repositories;
-
-import com.baeldung.application.entities.User;
-import org.springframework.data.repository.CrudRepository;
-import org.springframework.stereotype.Repository;
-import org.springframework.web.bind.annotation.CrossOrigin;
-
-@Repository
-public interface UserRepository extends CrudRepository{}
+package com.baeldung.application.repositories;
+
+import com.baeldung.application.entities.User;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Repository;
+import org.springframework.web.bind.annotation.CrossOrigin;
+
+@Repository
+public interface UserRepository extends CrudRepository{}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/EcommerceApplication.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/EcommerceApplication.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/EcommerceApplication.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/EcommerceApplication.java
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/controller/OrderController.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/controller/OrderController.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/controller/OrderController.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/controller/OrderController.java
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/controller/ProductController.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/controller/ProductController.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/controller/ProductController.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/controller/ProductController.java
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/dto/OrderProductDto.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/dto/OrderProductDto.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/dto/OrderProductDto.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/dto/OrderProductDto.java
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/exception/ApiExceptionHandler.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/exception/ApiExceptionHandler.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/exception/ApiExceptionHandler.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/exception/ApiExceptionHandler.java
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/exception/ResourceNotFoundException.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/exception/ResourceNotFoundException.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/exception/ResourceNotFoundException.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/exception/ResourceNotFoundException.java
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/Order.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/Order.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/Order.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/Order.java
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderProduct.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderProduct.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderProduct.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderProduct.java
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderProductPK.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderProductPK.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderProductPK.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderProductPK.java
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderStatus.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderStatus.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderStatus.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderStatus.java
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/Product.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/Product.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/Product.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/Product.java
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/OrderProductRepository.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/OrderProductRepository.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/OrderProductRepository.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/OrderProductRepository.java
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/OrderRepository.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/OrderRepository.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/OrderRepository.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/OrderRepository.java
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/ProductRepository.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/ProductRepository.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/ProductRepository.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/ProductRepository.java
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderProductService.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderProductService.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderProductService.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderProductService.java
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderProductServiceImpl.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderProductServiceImpl.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderProductServiceImpl.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderProductServiceImpl.java
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderService.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderService.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderService.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderService.java
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderServiceImpl.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderServiceImpl.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderServiceImpl.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderServiceImpl.java
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/ProductService.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/ProductService.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/ProductService.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/ProductService.java
diff --git a/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/ProductServiceImpl.java b/spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/ProductServiceImpl.java
similarity index 100%
rename from spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/ProductServiceImpl.java
rename to spring-boot-modules/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/ProductServiceImpl.java
diff --git a/spring-boot-angular/src/main/js/application/.angular-cli.json b/spring-boot-modules/spring-boot-angular/src/main/js/application/.angular-cli.json
similarity index 100%
rename from spring-boot-angular/src/main/js/application/.angular-cli.json
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/.angular-cli.json
diff --git a/spring-boot-angular/src/main/js/application/.editorconfig b/spring-boot-modules/spring-boot-angular/src/main/js/application/.editorconfig
similarity index 100%
rename from spring-boot-angular/src/main/js/application/.editorconfig
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/.editorconfig
diff --git a/spring-boot-angular/src/main/js/application/.gitignore b/spring-boot-modules/spring-boot-angular/src/main/js/application/.gitignore
similarity index 100%
rename from spring-boot-angular/src/main/js/application/.gitignore
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/.gitignore
diff --git a/spring-boot-angular/src/main/js/application/README.md b/spring-boot-modules/spring-boot-angular/src/main/js/application/README.md
similarity index 100%
rename from spring-boot-angular/src/main/js/application/README.md
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/README.md
diff --git a/spring-boot-angular/src/main/js/application/e2e/app.e2e-spec.ts b/spring-boot-modules/spring-boot-angular/src/main/js/application/e2e/app.e2e-spec.ts
similarity index 100%
rename from spring-boot-angular/src/main/js/application/e2e/app.e2e-spec.ts
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/e2e/app.e2e-spec.ts
diff --git a/spring-boot-angular/src/main/js/application/e2e/app.po.ts b/spring-boot-modules/spring-boot-angular/src/main/js/application/e2e/app.po.ts
similarity index 100%
rename from spring-boot-angular/src/main/js/application/e2e/app.po.ts
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/e2e/app.po.ts
diff --git a/spring-boot-angular/src/main/js/application/e2e/tsconfig.e2e.json b/spring-boot-modules/spring-boot-angular/src/main/js/application/e2e/tsconfig.e2e.json
similarity index 100%
rename from spring-boot-angular/src/main/js/application/e2e/tsconfig.e2e.json
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/e2e/tsconfig.e2e.json
diff --git a/spring-boot-angular/src/main/js/application/karma.conf.js b/spring-boot-modules/spring-boot-angular/src/main/js/application/karma.conf.js
similarity index 100%
rename from spring-boot-angular/src/main/js/application/karma.conf.js
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/karma.conf.js
diff --git a/spring-boot-angular/src/main/js/application/package-lock.json b/spring-boot-modules/spring-boot-angular/src/main/js/application/package-lock.json
similarity index 100%
rename from spring-boot-angular/src/main/js/application/package-lock.json
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/package-lock.json
diff --git a/spring-boot-angular/src/main/js/application/package.json b/spring-boot-modules/spring-boot-angular/src/main/js/application/package.json
similarity index 100%
rename from spring-boot-angular/src/main/js/application/package.json
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/package.json
diff --git a/spring-boot-angular/src/main/js/application/protractor.conf.js b/spring-boot-modules/spring-boot-angular/src/main/js/application/protractor.conf.js
similarity index 100%
rename from spring-boot-angular/src/main/js/application/protractor.conf.js
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/protractor.conf.js
diff --git a/spring-boot-angular/src/main/js/application/src/app/app-routing.module.ts b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/app-routing.module.ts
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/app/app-routing.module.ts
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/app-routing.module.ts
diff --git a/spring-boot-angular/src/main/js/application/src/app/app.component.css b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/app.component.css
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/app/app.component.css
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/app.component.css
diff --git a/spring-boot-angular/src/main/js/application/src/app/app.component.html b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/app.component.html
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/app/app.component.html
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/app.component.html
diff --git a/spring-boot-angular/src/main/js/application/src/app/app.component.spec.ts b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/app.component.spec.ts
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/app/app.component.spec.ts
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/app.component.spec.ts
diff --git a/spring-boot-angular/src/main/js/application/src/app/app.component.ts b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/app.component.ts
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/app/app.component.ts
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/app.component.ts
diff --git a/spring-boot-angular/src/main/js/application/src/app/app.module.ts b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/app.module.ts
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/app/app.module.ts
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/app.module.ts
diff --git a/spring-boot-angular/src/main/js/application/src/app/model/user.ts b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/model/user.ts
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/app/model/user.ts
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/model/user.ts
diff --git a/spring-boot-angular/src/main/js/application/src/app/service/user.service.spec.ts b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/service/user.service.spec.ts
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/app/service/user.service.spec.ts
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/service/user.service.spec.ts
diff --git a/spring-boot-angular/src/main/js/application/src/app/service/user.service.ts b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/service/user.service.ts
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/app/service/user.service.ts
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/service/user.service.ts
diff --git a/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.css b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.css
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.css
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.css
diff --git a/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.html b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.html
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.html
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.html
diff --git a/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.spec.ts b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.spec.ts
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.spec.ts
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.spec.ts
diff --git a/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.ts b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.ts
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.ts
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.ts
diff --git a/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.css b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.css
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.css
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.css
diff --git a/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.html b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.html
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.html
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.html
diff --git a/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.spec.ts b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.spec.ts
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.spec.ts
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.spec.ts
diff --git a/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.ts b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.ts
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.ts
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.ts
diff --git a/spring-boot-angular/src/main/js/application/src/assets/.gitkeep b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/assets/.gitkeep
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/assets/.gitkeep
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/assets/.gitkeep
diff --git a/spring-boot-angular/src/main/js/application/src/environments/environment.prod.ts b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/environments/environment.prod.ts
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/environments/environment.prod.ts
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/environments/environment.prod.ts
diff --git a/spring-boot-angular/src/main/js/application/src/environments/environment.ts b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/environments/environment.ts
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/environments/environment.ts
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/environments/environment.ts
diff --git a/spring-boot-angular/src/main/js/application/src/favicon.ico b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/favicon.ico
similarity index 100%
rename from spring-boot-angular/src/main/js/application/src/favicon.ico
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/favicon.ico
diff --git a/spring-boot-angular/src/main/js/application/src/index.html b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/index.html
similarity index 98%
rename from spring-boot-angular/src/main/js/application/src/index.html
rename to spring-boot-modules/spring-boot-angular/src/main/js/application/src/index.html
index 1ce7ff1ca6..398190f439 100644
--- a/spring-boot-angular/src/main/js/application/src/index.html
+++ b/spring-boot-modules/spring-boot-angular/src/main/js/application/src/index.html
@@ -14,4 +14,4 @@
-