diff --git a/akka-http/README.md b/akka-http/README.md
index 3831b5079f..ebe6581ff6 100644
--- a/akka-http/README.md
+++ b/akka-http/README.md
@@ -1,3 +1,7 @@
-## Relevant articles:
+## Akka HTTP
+
+This module contains articles about Akka HTTP.
+
+### Relevant articles:
- [Introduction to Akka HTTP](https://www.baeldung.com/akka-http)
diff --git a/akka-streams/README.md b/akka-streams/README.md
index 5f71991def..a59b7fde5c 100644
--- a/akka-streams/README.md
+++ b/akka-streams/README.md
@@ -1,3 +1,7 @@
+## Akka Streams
+
+This module contains articles about Akka Streams.
+
### Relevant articles
- [Guide to Akka Streams](https://www.baeldung.com/akka-streams)
diff --git a/algorithms-genetic/README.md b/algorithms-genetic/README.md
index 124e9c09e5..1c9e831ac2 100644
--- a/algorithms-genetic/README.md
+++ b/algorithms-genetic/README.md
@@ -1,4 +1,8 @@
-## Relevant articles:
+## Genetic Algorithms
+
+This module contains articles about genetic algorithms.
+
+### Relevant articles:
- [Introduction to Jenetics Library](https://www.baeldung.com/jenetics)
- [Ant Colony Optimization](https://www.baeldung.com/java-ant-colony-optimization)
diff --git a/algorithms-miscellaneous-1/README.md b/algorithms-miscellaneous-1/README.md
index 57f5a5d478..6a25f8cac8 100644
--- a/algorithms-miscellaneous-1/README.md
+++ b/algorithms-miscellaneous-1/README.md
@@ -1,4 +1,9 @@
-## Relevant articles:
+## Algorithms - Miscellaneous
+
+This module contains articles about algorithms. Some classes of algorithms, e.g., [sorting](/../algorithms-sorting) and
+[genetic algorithms](/../algorithms-genetic), have their own dedicated modules.
+
+### Relevant articles:
- [Validating Input With Finite Automata in Java](https://www.baeldung.com/java-finite-automata)
- [Example of Hill Climbing Algorithm](https://www.baeldung.com/java-hill-climbing-algorithm)
@@ -6,4 +11,5 @@
- [Binary Search Algorithm in Java](https://www.baeldung.com/java-binary-search)
- [Introduction to Minimax Algorithm](https://www.baeldung.com/java-minimax-algorithm)
- [How to Calculate Levenshtein Distance in Java?](https://www.baeldung.com/java-levenshtein-distance)
-- [How to Find the Kth Largest Element in Java](https://www.baeldung.com/java-kth-largest-element)
\ No newline at end of file
+- [How to Find the Kth Largest Element in Java](https://www.baeldung.com/java-kth-largest-element)
+- More articles: [[next -->]](/../algorithms-miscellaneous-2)
diff --git a/algorithms-miscellaneous-2/README.md b/algorithms-miscellaneous-2/README.md
index 76727a1d4f..7560fc4fe7 100644
--- a/algorithms-miscellaneous-2/README.md
+++ b/algorithms-miscellaneous-2/README.md
@@ -1,4 +1,9 @@
-## Relevant articles:
+## Algorithms - Miscellaneous
+
+This module contains articles about algorithms. Some classes of algorithms, e.g., [sorting](/../algorithms-sorting) and
+[genetic algorithms](/../algorithms-genetic), have their own dedicated modules.
+
+### Relevant articles:
- [Dijkstra Shortest Path Algorithm in Java](https://www.baeldung.com/java-dijkstra)
- [Introduction to Cobertura](https://www.baeldung.com/cobertura)
@@ -8,3 +13,4 @@
- [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)
+- More articles: [[<-- prev]](/../algorithms-miscellaneous-1) [[next -->]](/../algorithms-miscellaneous-3)
diff --git a/algorithms-miscellaneous-4/README.md b/algorithms-miscellaneous-4/README.md
index fabb4d29b8..6aad9a43e4 100644
--- a/algorithms-miscellaneous-4/README.md
+++ b/algorithms-miscellaneous-4/README.md
@@ -1,4 +1,9 @@
-## Relevant articles:
+## Algorithms - Miscellaneous
+
+This module contains articles about algorithms. Some classes of algorithms, e.g., [sorting](/../algorithms-sorting) and
+[genetic algorithms](/../algorithms-genetic), have their own dedicated modules.
+
+### Relevant articles:
- [Multi-Swarm Optimization Algorithm in Java](https://www.baeldung.com/java-multi-swarm-algorithm)
- [String Search Algorithms for Large Texts](https://www.baeldung.com/java-full-text-search-algorithms)
@@ -6,4 +11,5 @@
- [Find the Middle Element of a Linked List](https://www.baeldung.com/java-linked-list-middle-element)
- [Find Substrings That Are Palindromes in Java](https://www.baeldung.com/java-palindrome-substrings)
- [Find the Longest Substring without Repeating Characters](https://www.baeldung.com/java-longest-substring-without-repeated-characters)
-- [Permutations of an Array in Java](https://www.baeldung.com/java-array-permutations)
\ No newline at end of file
+- [Permutations of an Array in Java](https://www.baeldung.com/java-array-permutations)
+- More articles: [[<-- prev]](/../algorithms-miscellaneous-3) [[next -->]](/../algorithms-miscellaneous-5)
diff --git a/algorithms-miscellaneous-5/README.md b/algorithms-miscellaneous-5/README.md
index 7ed71e61cc..7a8f2e0a36 100644
--- a/algorithms-miscellaneous-5/README.md
+++ b/algorithms-miscellaneous-5/README.md
@@ -1,5 +1,11 @@
-## Relevant articles:
+## Algorithms - Miscellaneous
+
+This module contains articles about algorithms. Some classes of algorithms, e.g., [sorting](/../algorithms-sorting) and
+[genetic algorithms](/../algorithms-genetic), have their own dedicated modules.
+
+### Relevant articles:
- [Converting Between Byte Arrays and Hexadecimal Strings in Java](https://www.baeldung.com/java-byte-arrays-hex-strings)
- [Reversing a Binary Tree in Java](https://www.baeldung.com/java-reversing-a-binary-tree)
-- [Find If Two Numbers Are Relatively Prime in Java](https://www.baeldung.com/java-two-relatively-prime-numbers)
\ No newline at end of file
+- [Find If Two Numbers Are Relatively Prime in Java](https://www.baeldung.com/java-two-relatively-prime-numbers)
+- More articles: [[<-- prev]](/../algorithms-miscellaneous-4)
diff --git a/algorithms-sorting/README.md b/algorithms-sorting/README.md
index 4fd9d5e0c6..3f27cfea49 100644
--- a/algorithms-sorting/README.md
+++ b/algorithms-sorting/README.md
@@ -16,3 +16,4 @@ This module contains articles about sorting algorithms.
- [Selection Sort in Java](https://www.baeldung.com/java-selection-sort)
- [Sorting Strings by Contained Numbers in Java](https://www.baeldung.com/java-sort-strings-contained-numbers)
- [Radix Sort in Java](https://www.baeldung.com/java-radix-sort)
+- [Sorting a String Alphabetically in Java](https://www.baeldung.com/java-sort-string-alphabetically)
diff --git a/algorithms-sorting/pom.xml b/algorithms-sorting/pom.xml
index b25adf05a8..5bb19a8069 100644
--- a/algorithms-sorting/pom.xml
+++ b/algorithms-sorting/pom.xml
@@ -28,6 +28,12 @@
${lombok.version}
provided
+
+ org.junit.jupiter
+ junit-jupiter-api
+ ${junit-jupiter-api.version}
+ test
+
org.assertj
assertj-core
@@ -52,6 +58,7 @@
3.6.1
3.9.0
1.11
+ 5.3.1
\ No newline at end of file
diff --git a/java-strings/src/main/java/com/baeldung/string/sorting/AnagramValidator.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java
similarity index 93%
rename from java-strings/src/main/java/com/baeldung/string/sorting/AnagramValidator.java
rename to algorithms-sorting/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java
index c4f684383d..67b5e5facc 100644
--- a/java-strings/src/main/java/com/baeldung/string/sorting/AnagramValidator.java
+++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java
@@ -1,4 +1,4 @@
-package com.baeldung.string.sorting;
+package com.baeldung.algorithms.stringsort;
import java.util.Arrays;
diff --git a/java-strings/src/test/java/com/baeldung/string/sorting/AnagramValidatorUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java
similarity index 86%
rename from java-strings/src/test/java/com/baeldung/string/sorting/AnagramValidatorUnitTest.java
rename to algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java
index 07d31c7187..25fc274dd8 100644
--- a/java-strings/src/test/java/com/baeldung/string/sorting/AnagramValidatorUnitTest.java
+++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java
@@ -1,12 +1,10 @@
-package com.baeldung.string.sorting;
+package com.baeldung.algorithms.stringsort;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-
import org.junit.jupiter.api.Test;
-import com.baeldung.string.sorting.AnagramValidator;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
class AnagramValidatorUnitTest {
diff --git a/java-strings/src/test/java/com/baeldung/string/sorting/SortStringUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java
similarity index 94%
rename from java-strings/src/test/java/com/baeldung/string/sorting/SortStringUnitTest.java
rename to algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java
index 90d1dad554..226de64f07 100644
--- a/java-strings/src/test/java/com/baeldung/string/sorting/SortStringUnitTest.java
+++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java
@@ -1,9 +1,9 @@
-package com.baeldung.string.sorting;
-
-import java.util.Arrays;
+package com.baeldung.algorithms.stringsort;
import org.junit.jupiter.api.Test;
+import java.util.Arrays;
+
import static org.assertj.core.api.Assertions.assertThat;
class SortStringUnitTest {
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule/pom.xml b/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule/pom.xml
index 757d9229df..09ca44d9be 100644
--- a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule/pom.xml
+++ b/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule/pom.xml
@@ -3,7 +3,6 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
com.baeldung.consumermodule
consumermodule
1.0
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule/pom.xml b/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule/pom.xml
index 4de3df8c01..861f06f089 100644
--- a/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule/pom.xml
+++ b/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule/pom.xml
@@ -3,16 +3,16 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ com.baeldung.servicemodule
+ servicemodule
+ 1.0
+
>com.baeldung.decoupling-pattern2
decoupling-pattern2
1.0-SNAPSHOT
- com.baeldung.servicemodule
- servicemodule
- 1.0
-
diff --git a/core-java-modules/core-java-lang-oop-2/pom.xml b/core-java-modules/core-java-lang-oop-2/pom.xml
index 6e67c76d20..5bca2f0dbf 100644
--- a/core-java-modules/core-java-lang-oop-2/pom.xml
+++ b/core-java-modules/core-java-lang-oop-2/pom.xml
@@ -28,12 +28,6 @@
test
-
-
-
- 3.10.0
- 3.0.3
-
core-java-lang-oop-2
@@ -45,4 +39,10 @@
+
+
+ 3.10.0
+ 3.0.3
+
+
diff --git a/core-java-modules/core-java-os/pom.xml b/core-java-modules/core-java-os/pom.xml
index f6c5ef04a5..8c5f7fe1e9 100644
--- a/core-java-modules/core-java-os/pom.xml
+++ b/core-java-modules/core-java-os/pom.xml
@@ -54,7 +54,7 @@
-
+
org.apache.maven.plugins
maven-compiler-plugin
${maven-compiler-plugin.version}
diff --git a/core-java-modules/core-java-string-apis/README.md b/core-java-modules/core-java-string-apis/README.md
new file mode 100644
index 0000000000..fc36ba8640
--- /dev/null
+++ b/core-java-modules/core-java-string-apis/README.md
@@ -0,0 +1,12 @@
+## Java String APIs
+
+This module contains articles about string APIs.
+
+### Relevant Articles:
+- [Java 8 StringJoiner](https://www.baeldung.com/java-string-joiner)
+- [Quick Guide to the Java StringTokenizer](https://www.baeldung.com/java-stringtokenizer)
+- [Guide to java.util.Formatter](https://www.baeldung.com/java-string-formatter)
+- [Guide to StreamTokenizer](https://www.baeldung.com/java-streamtokenizer)
+- [CharSequence vs. String in Java](https://www.baeldung.com/java-char-sequence-string)
+- [StringBuilder and StringBuffer in Java](https://www.baeldung.com/java-string-builder-string-buffer)
+- [Generate a Secure Random Password in Java](https://www.baeldung.com/java-generate-secure-password)
diff --git a/core-java-modules/core-java-string-apis/pom.xml b/core-java-modules/core-java-string-apis/pom.xml
new file mode 100644
index 0000000000..7d9d888fa1
--- /dev/null
+++ b/core-java-modules/core-java-string-apis/pom.xml
@@ -0,0 +1,55 @@
+
+ 4.0.0
+ core-java-string-apis
+ 0.1.0-SNAPSHOT
+ jar
+ core-java-string-apis
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+
+
+
+ org.passay
+ passay
+ ${passay.version}
+
+
+ org.apache.commons
+ commons-text
+ ${commons-text.version}
+
+
+
+
+ core-java-string-apis
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ 1.3.1
+ 1.4
+
+
+
diff --git a/java-strings-2/src/main/java/com/baeldung/string/password/RandomPasswordGenerator.java b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/password/RandomPasswordGenerator.java
similarity index 99%
rename from java-strings-2/src/main/java/com/baeldung/string/password/RandomPasswordGenerator.java
rename to core-java-modules/core-java-string-apis/src/main/java/com/baeldung/password/RandomPasswordGenerator.java
index 46af4d7c51..d49b13c9c9 100644
--- a/java-strings-2/src/main/java/com/baeldung/string/password/RandomPasswordGenerator.java
+++ b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/password/RandomPasswordGenerator.java
@@ -1,4 +1,11 @@
-package com.baeldung.string.password;
+package com.baeldung.password;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.text.RandomStringGenerator;
+import org.passay.CharacterRule;
+import org.passay.EnglishCharacterData;
+import org.passay.CharacterData;
+import org.passay.PasswordGenerator;
import java.security.SecureRandom;
import java.util.Collections;
@@ -8,13 +15,6 @@ import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
-import org.apache.commons.lang3.RandomStringUtils;
-import org.apache.commons.text.RandomStringGenerator;
-import org.passay.CharacterData;
-import org.passay.CharacterRule;
-import org.passay.EnglishCharacterData;
-import org.passay.PasswordGenerator;
-
public class RandomPasswordGenerator {
/**
diff --git a/java-strings-2/src/main/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemo.java b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/streamtokenizer/StreamTokenizerDemo.java
similarity index 98%
rename from java-strings-2/src/main/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemo.java
rename to core-java-modules/core-java-string-apis/src/main/java/com/baeldung/streamtokenizer/StreamTokenizerDemo.java
index 3bb0ff5b77..5ab506f259 100644
--- a/java-strings-2/src/main/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemo.java
+++ b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/streamtokenizer/StreamTokenizerDemo.java
@@ -1,4 +1,4 @@
-package com.baeldung.string.streamtokenizer;
+package com.baeldung.streamtokenizer;
import java.io.*;
import java.util.ArrayList;
diff --git a/java-strings-ops/src/test/java/com/baeldung/string/StringBufferStringBuilder.java b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/stringbuilderstringbuffer/StringBuilderStringBuffer.java
similarity index 89%
rename from java-strings-ops/src/test/java/com/baeldung/string/StringBufferStringBuilder.java
rename to core-java-modules/core-java-string-apis/src/main/java/com/baeldung/stringbuilderstringbuffer/StringBuilderStringBuffer.java
index 72af4a9aee..50c139e2d3 100644
--- a/java-strings-ops/src/test/java/com/baeldung/string/StringBufferStringBuilder.java
+++ b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/stringbuilderstringbuffer/StringBuilderStringBuffer.java
@@ -1,4 +1,4 @@
-package com.baeldung.string;
+package com.baeldung.stringbuilderstringbuffer;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Scope;
@@ -8,12 +8,12 @@ import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
-public class StringBufferStringBuilder {
+public class StringBuilderStringBuffer {
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
- .include(StringBufferStringBuilder.class.getSimpleName())
+ .include(StringBuilderStringBuffer.class.getSimpleName())
.build();
new Runner(opt).run();
diff --git a/java-strings/src/main/java/com/baeldung/stringtokenizer/MyTokenizer.java b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/stringtokenizer/MyTokenizer.java
similarity index 100%
rename from java-strings/src/main/java/com/baeldung/stringtokenizer/MyTokenizer.java
rename to core-java-modules/core-java-string-apis/src/main/java/com/baeldung/stringtokenizer/MyTokenizer.java
diff --git a/java-strings-ops/src/test/java/com/baeldung/string/CharSequenceVsStringUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/charsequence/CharSequenceVsStringUnitTest.java
similarity index 97%
rename from java-strings-ops/src/test/java/com/baeldung/string/CharSequenceVsStringUnitTest.java
rename to core-java-modules/core-java-string-apis/src/test/java/com/baeldung/charsequence/CharSequenceVsStringUnitTest.java
index 916a3c79ff..aa15345bcb 100644
--- a/java-strings-ops/src/test/java/com/baeldung/string/CharSequenceVsStringUnitTest.java
+++ b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/charsequence/CharSequenceVsStringUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.string;
+package com.baeldung.charsequence;
import org.junit.Test;
diff --git a/java-strings-2/src/test/java/com/baeldung/string/formatter/StringFormatterExampleUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/formatter/StringFormatterExampleUnitTest.java
similarity index 96%
rename from java-strings-2/src/test/java/com/baeldung/string/formatter/StringFormatterExampleUnitTest.java
rename to core-java-modules/core-java-string-apis/src/test/java/com/baeldung/formatter/StringFormatterExampleUnitTest.java
index 648fdaf65a..549c889028 100644
--- a/java-strings-2/src/test/java/com/baeldung/string/formatter/StringFormatterExampleUnitTest.java
+++ b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/formatter/StringFormatterExampleUnitTest.java
@@ -1,12 +1,12 @@
-package com.baeldung.string.formatter;
+package com.baeldung.formatter;
+
+import org.junit.Test;
import java.util.Calendar;
import java.util.Formatter;
import java.util.GregorianCalendar;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import org.junit.Test;
+
+import static org.junit.Assert.*;
public class StringFormatterExampleUnitTest {
diff --git a/java-strings-2/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/password/StringPasswordUnitTest.java
similarity index 98%
rename from java-strings-2/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java
rename to core-java-modules/core-java-string-apis/src/test/java/com/baeldung/password/StringPasswordUnitTest.java
index bfd4b0fe8e..7fb55ad1cb 100644
--- a/java-strings-2/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java
+++ b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/password/StringPasswordUnitTest.java
@@ -1,9 +1,9 @@
-package com.baeldung.string.password;
-
-import static org.junit.Assert.assertTrue;
+package com.baeldung.password;
import org.junit.Test;
+import static org.junit.Assert.assertTrue;
+
/**
* Examples of passwords conforming to various specifications, using different libraries.
*
diff --git a/java-strings-2/src/test/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemoUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/streamtokenizer/StreamTokenizerDemoUnitTest.java
similarity index 96%
rename from java-strings-2/src/test/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemoUnitTest.java
rename to core-java-modules/core-java-string-apis/src/test/java/com/baeldung/streamtokenizer/StreamTokenizerDemoUnitTest.java
index 01091ec629..29214167be 100644
--- a/java-strings-2/src/test/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemoUnitTest.java
+++ b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/streamtokenizer/StreamTokenizerDemoUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.string.streamtokenizer;
+package com.baeldung.streamtokenizer;
import org.junit.Test;
diff --git a/java-strings/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java
rename to core-java-modules/core-java-string-apis/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java
index a72f811336..89f91acd6e 100644
--- a/java-strings/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java
+++ b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java
@@ -1,6 +1,6 @@
package com.baeldung.stringjoiner;
-import static org.junit.Assert.assertEquals;
+import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
@@ -8,7 +8,7 @@ import java.util.List;
import java.util.StringJoiner;
import java.util.stream.Collectors;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
public class StringJoinerUnitTest {
private final String DELIMITER_COMMA = ",";
diff --git a/java-strings/src/test/java/com/baeldung/stringtokenizer/TokenizerUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/stringtokenizer/TokenizerUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/stringtokenizer/TokenizerUnitTest.java
rename to core-java-modules/core-java-string-apis/src/test/java/com/baeldung/stringtokenizer/TokenizerUnitTest.java
diff --git a/core-java-modules/core-java-string-apis/src/test/resources/data.csv b/core-java-modules/core-java-string-apis/src/test/resources/data.csv
new file mode 100644
index 0000000000..ec4ac10443
--- /dev/null
+++ b/core-java-modules/core-java-string-apis/src/test/resources/data.csv
@@ -0,0 +1,3 @@
+1|IND|India
+2|MY|Malaysia
+3|AU|Australia
diff --git a/java-strings-2/src/main/resources/stream-tokenizer-example.txt b/core-java-modules/core-java-string-apis/src/test/resources/stream-tokenizer-example.txt
similarity index 100%
rename from java-strings-2/src/main/resources/stream-tokenizer-example.txt
rename to core-java-modules/core-java-string-apis/src/test/resources/stream-tokenizer-example.txt
diff --git a/gradle-5/README.md b/gradle-5/README.md
new file mode 100644
index 0000000000..73b6b7e12a
--- /dev/null
+++ b/gradle-5/README.md
@@ -0,0 +1,5 @@
+
+### Relevant Articles:
+
+- [Run a Java main Method Using Gradle](https://www.baeldung.com/gradle-run-java-main)
+
diff --git a/guava/pom.xml b/guava/pom.xml
index 3a19901a02..17c930cdd2 100644
--- a/guava/pom.xml
+++ b/guava/pom.xml
@@ -26,8 +26,6 @@
${assertj.version}
test
-
-
diff --git a/java-blockchain/pom.xml b/java-blockchain/pom.xml
index 2f9e011aa7..4c5d0f31d5 100644
--- a/java-blockchain/pom.xml
+++ b/java-blockchain/pom.xml
@@ -7,12 +7,14 @@
0.1.0-SNAPSHOT
java-blockchain
jar
+
com.baeldung
parent-java
0.0.1-SNAPSHOT
../parent-java
+
java-blockchain
@@ -33,8 +35,10 @@
+
1.8
1.8
+
\ No newline at end of file
diff --git a/java-math/README.md b/java-math/README.md
index 49ff5afde1..d80a07258a 100644
--- a/java-math/README.md
+++ b/java-math/README.md
@@ -14,3 +14,5 @@ This module contains articles about math in Java.
- [Convert Latitude and Longitude to a 2D Point in Java](https://www.baeldung.com/java-convert-latitude-longitude)
- [Debugging with Eclipse](https://www.baeldung.com/eclipse-debugging)
- [Matrix Multiplication in Java](https://www.baeldung.com/java-matrix-multiplication)
+- [Calculating Logarithms in Java](https://www.baeldung.com/java-logarithms)
+- [Finding Greatest Common Divisor in Java](https://www.baeldung.com/java-greatest-common-divisor)
diff --git a/java-numbers-2/README.md b/java-numbers-2/README.md
index 48f9acd32d..e200c4aa03 100644
--- a/java-numbers-2/README.md
+++ b/java-numbers-2/README.md
@@ -13,4 +13,6 @@ This module contains articles about numbers in Java.
- [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers)
- [Finding the Least Common Multiple in Java](https://www.baeldung.com/java-least-common-multiple)
- [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)
- More articles: [[<-- prev]](/../java-numbers)
diff --git a/java-strings-2/README.md b/java-strings-2/README.md
index 9865019f74..ced813163d 100644
--- a/java-strings-2/README.md
+++ b/java-strings-2/README.md
@@ -9,12 +9,10 @@ This module contains articles about strings in Java.
- [Removing Stopwords from a String in Java](https://www.baeldung.com/java-string-remove-stopwords)
- [Java – Generate Random String](https://www.baeldung.com/java-random-string)
- [Java Base64 Encoding and Decoding](https://www.baeldung.com/java-base64-encode-and-decode)
-- [Generate a Secure Random Password in Java](https://www.baeldung.com/java-generate-secure-password)
- [Removing Repeated Characters from a String](https://www.baeldung.com/java-remove-repeated-char)
- [Join Array of Primitives with Separator in Java](https://www.baeldung.com/java-join-primitive-array)
- [Pad a String with Zeros or Spaces in Java](https://www.baeldung.com/java-pad-string)
- [Remove Emojis from a Java String](https://www.baeldung.com/java-string-remove-emojis)
-- [Guide to java.util.Formatter](https://www.baeldung.com/java-string-formatter)
- [Remove Leading and Trailing Characters from a String](https://www.baeldung.com/java-remove-trailing-characters)
- [Concatenating Strings In Java](https://www.baeldung.com/java-strings-concatenation)
- [Java String Interview Questions and Answers](https://www.baeldung.com/java-string-interview-questions)
@@ -26,5 +24,4 @@ This module contains articles about strings in Java.
- [Checking If a String Is a Repeated Substring](https://www.baeldung.com/java-repeated-substring)
- [How to Reverse a String in Java](https://www.baeldung.com/java-reverse-string)
- [String toLowerCase and toUpperCase Methods in Java](https://www.baeldung.com/java-string-convert-case)
-- [Guide to StreamTokenizer](https://www.baeldung.com/java-streamtokenizer)
- More articles: [[<-- prev>]](/java-strings) [[next -->]](/java-strings-3)
diff --git a/java-strings-ops/README.md b/java-strings-ops/README.md
index 3b00cd11ed..1300cf028e 100644
--- a/java-strings-ops/README.md
+++ b/java-strings-ops/README.md
@@ -14,5 +14,3 @@ This module contains articles about operations on strings in Java.
- [Split a String in Java](https://www.baeldung.com/java-split-string)
- [Common String Operations in Java](https://www.baeldung.com/java-string-operations)
- [Java toString() Method](https://www.baeldung.com/java-tostring)
-- [CharSequence vs. String in Java](https://www.baeldung.com/java-char-sequence-string)
-- [StringBuilder and StringBuffer in Java](https://www.baeldung.com/java-string-builder-string-buffer)
diff --git a/java-strings/README.md b/java-strings/README.md
index 3146b54fa8..17b74231a4 100644
--- a/java-strings/README.md
+++ b/java-strings/README.md
@@ -4,12 +4,9 @@ This module contains articles about strings in Java.
### Relevant Articles:
- [String Operations with Java Streams](https://www.baeldung.com/java-stream-operations-on-strings)
-- [Java 8 StringJoiner](https://www.baeldung.com/java-string-joiner)
-- [Quick Guide to the Java StringTokenizer](https://www.baeldung.com/java-stringtokenizer)
- [Use char[] Array Over a String for Manipulating Passwords in Java?](https://www.baeldung.com/java-storing-passwords)
- [Compact Strings in Java 9](https://www.baeldung.com/java-9-compact-string)
- [Java Check a String for Lowercase/Uppercase Letter, Special Character and Digit](https://www.baeldung.com/java-lowercase-uppercase-special-character-digit-regex)
-- [Sorting a String Alphabetically in Java](https://www.baeldung.com/java-sort-string-alphabetically)
- [String Not Empty Test Assertions in Java](https://www.baeldung.com/java-assert-string-not-empty)
- [String Performance Hints](https://www.baeldung.com/java-string-performance)
- [Using indexOf to Find All Occurrences of a Word in a String](https://www.baeldung.com/java-indexOf-find-string-occurrences)
diff --git a/jaxb/README.md b/jaxb/README.md
index aca078af15..d9d16ab70b 100644
--- a/jaxb/README.md
+++ b/jaxb/README.md
@@ -4,3 +4,5 @@ This module contains articles about JAXB.
### Relevant Articles:
- [Guide to JAXB](https://www.baeldung.com/jaxb)
+- [Unmarshalling Dates Using JAXB](https://www.baeldung.com/jaxb-unmarshalling-dates)
+
diff --git a/jersey/README.md b/jersey/README.md
index 09de7051ca..8537e07358 100644
--- a/jersey/README.md
+++ b/jersey/README.md
@@ -9,3 +9,5 @@ This module contains articles about Jersey.
- [Set a Response Body in JAX-RS](https://www.baeldung.com/jax-rs-response)
- [Exploring the Jersey Test Framework](https://www.baeldung.com/jersey-test)
- [Explore Jersey Request Parameters](https://www.baeldung.com/jersey-request-parameters)
+- [Add a Header to a Jersey SSE Client Request](https://www.baeldung.com/jersey-sse-client-request-headers)
+
diff --git a/jhipster-5/bookstore-monolith/README.md b/jhipster-5/bookstore-monolith/README.md
index 0537f5b1a5..e4e69b83ac 100644
--- a/jhipster-5/bookstore-monolith/README.md
+++ b/jhipster-5/bookstore-monolith/README.md
@@ -1,3 +1,5 @@
## Relevant articles:
- [Creating New APIs and Views in JHipster](https://www.baeldung.com/jhipster-new-apis-and-views)
+- [JHipster Authentication with an External Service](https://www.baeldung.com/jhipster-authentication-external-service)
+
diff --git a/kotlin-libraries-2/README.md b/kotlin-libraries-2/README.md
index 188f99dc16..4064ef67d8 100644
--- a/kotlin-libraries-2/README.md
+++ b/kotlin-libraries-2/README.md
@@ -6,4 +6,6 @@ This module contains articles about Kotlin Libraries.
- [Jackson Support for Kotlin](https://www.baeldung.com/jackson-kotlin)
- [Introduction to RxKotlin](https://www.baeldung.com/rxkotlin)
+- [MockK: A Mocking Library for Kotlin](https://www.baeldung.com/kotlin-mockk)
+- [Kotlin Immutable Collections](https://www.baeldung.com/kotlin-immutable-collections)
- More articles: [[<-- prev]](/kotlin-libraries)
diff --git a/kotlin-libraries-2/pom.xml b/kotlin-libraries-2/pom.xml
index 14ac61a093..518142403e 100644
--- a/kotlin-libraries-2/pom.xml
+++ b/kotlin-libraries-2/pom.xml
@@ -28,9 +28,30 @@
junit
test
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+
+ org.jetbrains.kotlinx
+ kotlinx-collections-immutable
+ ${kotlinx-collections-immutable.version}
+
+
+
+ io.mockk
+ mockk
+ ${mockk.version}
+ test
+
+ 27.1-jre
+ 1.9.3
+ 0.1
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/immutable/KotlinxImmutablesUnitTest.kt b/kotlin-libraries-2/src/test/kotlin/com/baeldung/kotlin/immutable/KotlinxImmutablesUnitTest.kt
similarity index 100%
rename from kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/immutable/KotlinxImmutablesUnitTest.kt
rename to kotlin-libraries-2/src/test/kotlin/com/baeldung/kotlin/immutable/KotlinxImmutablesUnitTest.kt
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/immutable/ReadOnlyUnitTest.kt b/kotlin-libraries-2/src/test/kotlin/com/baeldung/kotlin/immutable/ReadOnlyUnitTest.kt
similarity index 100%
rename from kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/immutable/ReadOnlyUnitTest.kt
rename to kotlin-libraries-2/src/test/kotlin/com/baeldung/kotlin/immutable/ReadOnlyUnitTest.kt
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/AnnotationMockKUnitTest.kt b/kotlin-libraries-2/src/test/kotlin/com/baeldung/mockk/AnnotationMockKUnitTest.kt
similarity index 100%
rename from kotlin-libraries/src/test/kotlin/com/baeldung/mockk/AnnotationMockKUnitTest.kt
rename to kotlin-libraries-2/src/test/kotlin/com/baeldung/mockk/AnnotationMockKUnitTest.kt
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/BasicMockKUnitTest.kt b/kotlin-libraries-2/src/test/kotlin/com/baeldung/mockk/BasicMockKUnitTest.kt
similarity index 100%
rename from kotlin-libraries/src/test/kotlin/com/baeldung/mockk/BasicMockKUnitTest.kt
rename to kotlin-libraries-2/src/test/kotlin/com/baeldung/mockk/BasicMockKUnitTest.kt
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/HierarchicalMockKUnitTest.kt b/kotlin-libraries-2/src/test/kotlin/com/baeldung/mockk/HierarchicalMockKUnitTest.kt
similarity index 100%
rename from kotlin-libraries/src/test/kotlin/com/baeldung/mockk/HierarchicalMockKUnitTest.kt
rename to kotlin-libraries-2/src/test/kotlin/com/baeldung/mockk/HierarchicalMockKUnitTest.kt
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/TestableService.kt b/kotlin-libraries-2/src/test/kotlin/com/baeldung/mockk/TestableService.kt
similarity index 100%
rename from kotlin-libraries/src/test/kotlin/com/baeldung/mockk/TestableService.kt
rename to kotlin-libraries-2/src/test/kotlin/com/baeldung/mockk/TestableService.kt
diff --git a/kotlin-libraries/README.md b/kotlin-libraries/README.md
index e4b0a35d28..99a57c8293 100644
--- a/kotlin-libraries/README.md
+++ b/kotlin-libraries/README.md
@@ -14,6 +14,4 @@ This module contains articles about Kotlin Libraries.
- [Introduction to Arrow in Kotlin](https://www.baeldung.com/kotlin-arrow)
- [Kotlin with Ktor](https://www.baeldung.com/kotlin-ktor)
- [REST API With Kotlin and Kovert](https://www.baeldung.com/kotlin-kovert)
-- [MockK: A Mocking Library for Kotlin](https://www.baeldung.com/kotlin-mockk)
-- [Kotlin Immutable Collections](https://www.baeldung.com/kotlin-immutable-collections)
- More articles: [[next -->]](/kotlin-libraries-2)
diff --git a/kotlin-libraries/pom.xml b/kotlin-libraries/pom.xml
index 5299b5029e..7099166674 100644
--- a/kotlin-libraries/pom.xml
+++ b/kotlin-libraries/pom.xml
@@ -129,25 +129,7 @@
test
-
- com.google.guava
- guava
- ${guava.version}
-
-
-
- org.jetbrains.kotlinx
- kotlinx-collections-immutable
- ${kotlinx-collections-immutable.version}
-
-
-
- io.mockk
- mockk
- ${mockk.version}
- test
-
net.bytebuddy
byte-buddy
@@ -185,13 +167,10 @@
5.2.0
3.10.0
0.10.4
- 1.9.3
- 27.1-jre
3.3.0
1.8.13
2.6
2.3.0
- 0.1
0.7.3
diff --git a/libraries-primitive/README.MD b/libraries-primitive/README.MD
index f27fb73dd6..086cdc0d2d 100644
--- a/libraries-primitive/README.MD
+++ b/libraries-primitive/README.MD
@@ -1,3 +1,5 @@
### Relevant Articles
- [Guide to FastUtil](https://www.baeldung.com/fastutil)
+- [Primitive Collections in Eclipse Collections](https://www.baeldung.com/java-eclipse-primitive-collections)
+
diff --git a/mapstruct/README.md b/mapstruct/README.md
index b784820b98..be02c1186b 100644
--- a/mapstruct/README.md
+++ b/mapstruct/README.md
@@ -4,3 +4,5 @@ This module contains articles about MapStruct.
###Relevant Articles:
- [Quick Guide to MapStruct](https://www.baeldung.com/mapstruct)
+- [Custom Mapper with MapStruct](https://www.baeldung.com/mapstruct-custom-mapper)
+
diff --git a/metrics/README.md b/metrics/README.md
index f27f5fb795..b8a1bf026f 100644
--- a/metrics/README.md
+++ b/metrics/README.md
@@ -7,3 +7,5 @@ This module contains articles about metrics.
- [Intro to Dropwizard Metrics](https://www.baeldung.com/dropwizard-metrics)
- [Introduction to Netflix Servo](https://www.baeldung.com/netflix-servo)
- [Quick Guide to Micrometer](https://www.baeldung.com/micrometer)
+- [@Timed Annotation Using Metrics and AspectJ](https://www.baeldung.com/timed-metrics-aspectj)
+
diff --git a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/text/Exam.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/text/Exam.java
new file mode 100644
index 0000000000..8bea8e0121
--- /dev/null
+++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/text/Exam.java
@@ -0,0 +1,103 @@
+package com.baeldung.jpa.text;
+
+import javax.persistence.*;
+
+@Entity
+public class Exam {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+ @Lob
+ private String description;
+ @Column(columnDefinition = "text")
+ private String text;
+ @Column(length = 20)
+ private String shortText;
+
+ public Exam() {
+
+ }
+
+ public Exam(String description, String text, String shortText) {
+ this.description = description;
+ this.text = text;
+ this.shortText = shortText;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ public String getShortText() {
+ return shortText;
+ }
+
+ public void setShortText(String shortText) {
+ this.shortText = shortText;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((description == null) ? 0 : description.hashCode());
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ result = prime * result + ((shortText == null) ? 0 : shortText.hashCode());
+ result = prime * result + ((text == null) ? 0 : text.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Exam other = (Exam) obj;
+ if (description == null) {
+ if (other.description != null)
+ return false;
+ } else if (!description.equals(other.description))
+ return false;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ if (shortText == null) {
+ if (other.shortText != null)
+ return false;
+ } else if (!shortText.equals(other.shortText))
+ return false;
+ if (text == null) {
+ if (other.text != null)
+ return false;
+ } else if (!text.equals(other.text))
+ return false;
+ return true;
+ }
+
+}
diff --git a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/text/ExamRepository.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/text/ExamRepository.java
new file mode 100644
index 0000000000..2ee502bf4c
--- /dev/null
+++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/text/ExamRepository.java
@@ -0,0 +1,39 @@
+package com.baeldung.jpa.text;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+public class ExamRepository {
+
+ private EntityManagerFactory emf = null;
+
+ public ExamRepository() {
+ emf = Persistence.createEntityManagerFactory("jpa-h2-text");
+ }
+
+ public Exam find(Long id) {
+ EntityManager entityManager = emf.createEntityManager();
+ Exam exam = entityManager.find(Exam.class, id);
+ entityManager.close();
+ return exam;
+ }
+
+ public Exam save(Exam exam) {
+
+ EntityManager entityManager = emf.createEntityManager();
+ entityManager.getTransaction()
+ .begin();
+ exam = entityManager.merge(exam);
+ entityManager.getTransaction()
+ .commit();
+ entityManager.close();
+
+ return exam;
+ }
+
+ public void clean() {
+ emf.close();
+ }
+
+}
diff --git a/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml b/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml
index 62d7ce0f5e..cd46901792 100644
--- a/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml
+++ b/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml
@@ -1,122 +1,138 @@
+ version="2.2">
-
- org.hibernate.jpa.HibernatePersistenceProvider
- com.baeldung.jpa.queryparams.Employee
- true
-
-
-
-
-
-
-
-
-
-
-
-
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.queryparams.Employee
+ true
+
+
+
+
+
+
+
+
+
+
+
+
-
- org.hibernate.jpa.HibernatePersistenceProvider
- com.baeldung.jpa.defaultvalues.User
- true
-
-
-
-
-
-
-
-
-
-
-
-
- org.hibernate.jpa.HibernatePersistenceProvider
- com.baeldung.jpa.querytypes.UserEntity
- true
-
-
-
-
-
-
-
-
-
-
-
-
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.text.Exam
+ true
+
+
+
+
+
+
+
+
+
+
+
-
- org.hibernate.jpa.HibernatePersistenceProvider
- com.baeldung.jpa.projections.Product
- true
-
-
-
-
-
-
-
-
-
-
-
-
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.defaultvalues.User
+ true
+
+
+
+
+
+
+
+
+
+
+
-
- org.hibernate.jpa.HibernatePersistenceProvider
- com.baeldung.jpa.criteria.Item
- true
-
-
-
-
-
-
-
-
-
-
-
-
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.querytypes.UserEntity
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.projections.Product
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.criteria.Item
+ true
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/text/JPATextUnitTest.java b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/text/JPATextUnitTest.java
new file mode 100644
index 0000000000..f9f355c464
--- /dev/null
+++ b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/text/JPATextUnitTest.java
@@ -0,0 +1,41 @@
+package com.baeldung.jpa.text;
+
+import static org.junit.Assert.assertEquals;
+
+import javax.persistence.PersistenceException;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class JPATextUnitTest {
+
+ private static ExamRepository examRepository = null;
+
+ @BeforeClass
+ public static void once() {
+ examRepository = new ExamRepository();
+ }
+
+ @Test
+ public void givenExam_whenSaveExam_thenReturnExpectedExam() {
+ Exam exam = new Exam();
+ exam.setDescription("This is a description. Sometimes the description can be very very long! ");
+ exam.setText("This is a text. Sometimes the text can be very very long!");
+ exam.setShortText("A short text");
+
+ exam = examRepository.save(exam);
+
+ assertEquals(examRepository.find(exam.getId()), exam);
+ }
+
+ @Test(expected = PersistenceException.class)
+ public void givenExamWithVeryLongShortText_whenSaveExam_thenThrowPersistenceException() {
+ Exam exam = new Exam();
+ exam.setDescription("This is a very long text");
+ exam.setText("This is a long text");
+ exam.setShortText("This is a very long long short text. Maybe this can cause problems!!");
+
+ examRepository.save(exam);
+ }
+
+}
\ No newline at end of file
diff --git a/persistence-modules/java-mongodb/README.md b/persistence-modules/java-mongodb/README.md
index f1542e3ee9..41d0ad63f8 100644
--- a/persistence-modules/java-mongodb/README.md
+++ b/persistence-modules/java-mongodb/README.md
@@ -1,4 +1,8 @@
-## Relevant articles:
+## MongoDB
+
+This module contains articles about MongoDB in Java.
+
+### Relevant articles:
- [A Guide to MongoDB with Java](http://www.baeldung.com/java-mongodb)
- [A Simple Tagging Implementation with MongoDB](http://www.baeldung.com/mongodb-tagging)
diff --git a/persistence-modules/jnosql/README.md b/persistence-modules/jnosql/README.md
index d580cbc920..cb126914e9 100644
--- a/persistence-modules/jnosql/README.md
+++ b/persistence-modules/jnosql/README.md
@@ -1,2 +1,6 @@
+## JNoSQL
+
+This module contains articles about JNoSQL.
+
### Relevant Articles:
- [A Guide to Eclipse JNoSQL](http://www.baeldung.com/eclipse-jnosql)
diff --git a/persistence-modules/sirix/README.md b/persistence-modules/sirix/README.md
index b0f6f8d04b..161e60c2cb 100644
--- a/persistence-modules/sirix/README.md
+++ b/persistence-modules/sirix/README.md
@@ -1,3 +1,5 @@
## Relevant articles:
-- [Introduction to Sirix](https://www.baeldung.com/introduction-to-sirix)
\ No newline at end of file
+- [Introduction to Sirix](https://www.baeldung.com/introduction-to-sirix)
+- [A Guide to SirixDB](https://www.baeldung.com/sirix)
+
diff --git a/pom.xml b/pom.xml
index 0491b8586d..5404c908d3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -431,6 +431,7 @@
core-java-modules/core-java-sun
core-java-modules/core-java-string-conversions
core-java-modules/core-java-string-conversions-2
+ core-java-modules/core-java-string-apis
core-java-modules/core-java
core-java-modules/core-java-jvm
core-scala
@@ -1191,6 +1192,7 @@
core-java-modules/core-java-sun
core-java-modules/core-java-string-conversions
core-java-modules/core-java-string-conversions-2
+ core-java-modules/core-java-string-apis
core-scala
couchbase
custom-pmd
diff --git a/spring-5-data-reactive/README.md b/spring-5-data-reactive/README.md
index 683b493317..03bd323cb4 100644
--- a/spring-5-data-reactive/README.md
+++ b/spring-5-data-reactive/README.md
@@ -10,3 +10,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Spring Data Reactive Repositories with MongoDB](https://www.baeldung.com/spring-data-mongodb-reactive)
- [Spring Data MongoDB Tailable Cursors](https://www.baeldung.com/spring-data-mongodb-tailable-cursors)
- [A Quick Look at R2DBC with Spring Data](https://www.baeldung.com/spring-data-r2dbc)
+- [Spring Data Reactive Repositories with Couchbase](https://www.baeldung.com/spring-data-reactive-couchbase)
+
diff --git a/spring-5-reactive-client/README.md b/spring-5-reactive-client/README.md
index 1724db9e66..221c333d5b 100644
--- a/spring-5-reactive-client/README.md
+++ b/spring-5-reactive-client/README.md
@@ -6,5 +6,6 @@ This module contains articles about reactive Spring 5 WebClient
The "REST With Spring" Classes: http://bit.ly/restwithspring
### Relevant Articles
+- [Logging Spring WebClient Calls](https://www.baeldung.com/spring-log-webclient-calls)
- [Simultaneous Spring WebClient Calls](https://www.baeldung.com/spring-webclient-simultaneous-calls)
diff --git a/spring-5/README.md b/spring-5/README.md
index 7588d23304..3f839a5bca 100644
--- a/spring-5/README.md
+++ b/spring-5/README.md
@@ -15,4 +15,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Spring ResponseStatusException](https://www.baeldung.com/spring-response-status-exception)
- [Spring Assert Statements](https://www.baeldung.com/spring-assert)
- [Configuring a Hikari Connection Pool with Spring Boot](https://www.baeldung.com/spring-boot-hikari)
-
+- [Difference between \ vs \](https://www.baeldung.com/spring-contextannotation-contextcomponentscan)
diff --git a/spring-boot-autoconfiguration/README.md b/spring-boot-autoconfiguration/README.md
index 67311eed50..180d857d52 100644
--- a/spring-boot-autoconfiguration/README.md
+++ b/spring-boot-autoconfiguration/README.md
@@ -9,3 +9,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Create a Custom Auto-Configuration with Spring Boot](https://www.baeldung.com/spring-boot-custom-auto-configuration)
- [Guide to ApplicationContextRunner in Spring Boot](https://www.baeldung.com/spring-boot-context-runner)
+- [A Guide to Spring Boot Configuration Metadata](https://www.baeldung.com/spring-boot-configuration-metadata)
+
diff --git a/spring-freemarker/README.md b/spring-freemarker/README.md
index 410781f2ca..d9dfe16fbe 100644
--- a/spring-freemarker/README.md
+++ b/spring-freemarker/README.md
@@ -4,3 +4,5 @@ This module contains articles about Spring with FreeMarker
### Relevant Articles:
- [Introduction to Using FreeMarker in Spring MVC](https://www.baeldung.com/freemarker-in-spring-mvc-tutorial)
+- [FreeMarker Common Operations](https://www.baeldung.com/freemarker-operations)
+
diff --git a/spring-integration/pom.xml b/spring-integration/pom.xml
index 367d25de98..f06cb91ef6 100644
--- a/spring-integration/pom.xml
+++ b/spring-integration/pom.xml
@@ -68,6 +68,11 @@
spring-integration-security
${spring.version}
+
+ org.springframework.integration
+ spring-integration-jdbc
+ ${spring.version}
+
org.springframework.security
@@ -75,6 +80,12 @@
${spring.version}
test
+
+
+ com.h2database
+ h2
+ 1.4.197
+
@@ -106,7 +117,7 @@
UTF-8
- 5.0.3.RELEASE
+ 5.0.13.RELEASE
1.1.4.RELEASE
1.4.7
1.1.1
diff --git a/spring-integration/src/main/java/com/baeldung/tx/ServiceActivator.java b/spring-integration/src/main/java/com/baeldung/tx/ServiceActivator.java
new file mode 100755
index 0000000000..56399c653f
--- /dev/null
+++ b/spring-integration/src/main/java/com/baeldung/tx/ServiceActivator.java
@@ -0,0 +1,27 @@
+package com.baeldung.tx;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+public class ServiceActivator {
+
+ @Autowired
+ private JdbcTemplate jdbcTemplate;
+
+ private final Logger log = LoggerFactory.getLogger(this.getClass());
+
+ public void checkTestResults(String payload) {
+
+ this.jdbcTemplate.update("insert into STUDENT values(?)", payload);
+
+ if (payload.toLowerCase().startsWith("fail")) {
+ log.error("Service failure. Test result: {}", payload);
+ throw new RuntimeException("Service failure.");
+ }
+
+ log.info("Service success. Test result: {}", payload);
+ }
+
+}
diff --git a/spring-integration/src/main/java/com/baeldung/tx/TxIntegrationConfig.java b/spring-integration/src/main/java/com/baeldung/tx/TxIntegrationConfig.java
new file mode 100644
index 0000000000..7a58cb3125
--- /dev/null
+++ b/spring-integration/src/main/java/com/baeldung/tx/TxIntegrationConfig.java
@@ -0,0 +1,155 @@
+package com.baeldung.tx;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.integration.annotation.InboundChannelAdapter;
+import org.springframework.integration.annotation.Poller;
+import org.springframework.integration.annotation.ServiceActivator;
+import org.springframework.integration.annotation.Transformer;
+import org.springframework.integration.channel.DirectChannel;
+import org.springframework.integration.config.EnableIntegration;
+import org.springframework.integration.core.MessageSource;
+import org.springframework.integration.dsl.Pollers;
+import org.springframework.integration.file.FileReadingMessageSource;
+import org.springframework.integration.file.filters.SimplePatternFileListFilter;
+import org.springframework.integration.file.transformer.FileToStringTransformer;
+import org.springframework.integration.scheduling.PollerMetadata;
+import org.springframework.integration.transaction.*;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+import org.springframework.messaging.MessageChannel;
+import org.springframework.transaction.interceptor.TransactionInterceptor;
+
+import javax.sql.DataSource;
+import java.io.File;
+import java.util.Scanner;
+
+@Configuration
+@EnableIntegration
+public class TxIntegrationConfig {
+
+ private final Logger log = LoggerFactory.getLogger(this.getClass());
+
+ public final String INPUT_DIR = System.getProperty("java.io.tmpdir") + "/tx/";
+ public final String FILE_PATTERN = "*.txt";
+
+ @Autowired
+ private JdbcTemplate jdbcTemplate;
+
+ @Autowired
+ private DataSource dataSource;
+
+ @Autowired
+ private TransactionSynchronizationFactory transactionSynchronizationFactory;
+
+ @Autowired
+ DataSourceTransactionManager txManager;
+
+ @Bean
+ public MessageChannel inputChannel() {
+ return new DirectChannel();
+ }
+
+ @Bean
+ @InboundChannelAdapter(value = "inputChannel", poller = @Poller(value = "pollerMetadata"))
+ public MessageSource fileReadingMessageSource() {
+ FileReadingMessageSource sourceReader = new FileReadingMessageSource();
+ sourceReader.setDirectory(new File(INPUT_DIR));
+ sourceReader.setFilter(new SimplePatternFileListFilter(FILE_PATTERN));
+ return sourceReader;
+ }
+
+ @Bean
+ public PollerMetadata pollerMetadata() {
+ return Pollers.fixedDelay(5000)
+ .advice(transactionInterceptor())
+ .transactionSynchronizationFactory(transactionSynchronizationFactory)
+ .get();
+ }
+
+ private TransactionInterceptor transactionInterceptor() {
+ return new TransactionInterceptorBuilder().transactionManager(txManager).build();
+ }
+
+ @Bean
+ public TransactionSynchronizationFactory transactionSynchronizationFactory() {
+ ExpressionEvaluatingTransactionSynchronizationProcessor processor =
+ new ExpressionEvaluatingTransactionSynchronizationProcessor();
+
+ SpelExpressionParser spelParser = new SpelExpressionParser();
+ processor.setAfterCommitExpression(
+ spelParser.parseExpression(
+ "payload.renameTo(new java.io.File(payload.absolutePath + '.PASSED'))"));
+ processor.setAfterRollbackExpression(
+ spelParser.parseExpression(
+ "payload.renameTo(new java.io.File(payload.absolutePath + '.FAILED'))"));
+
+ return new DefaultTransactionSynchronizationFactory(processor);
+ }
+
+ @Bean
+ @Transformer(inputChannel = "inputChannel", outputChannel = "toServiceChannel")
+ public FileToStringTransformer fileToStringTransformer() {
+ return new FileToStringTransformer();
+ }
+
+ @ServiceActivator(inputChannel = "toServiceChannel")
+ public void serviceActivator(String payload) {
+
+ jdbcTemplate.update("insert into STUDENT values(?)", payload);
+
+ if (payload.toLowerCase().startsWith("fail")) {
+ log.error("Service failure. Test result: {} ", payload);
+ throw new RuntimeException("Service failure.");
+ }
+
+ log.info("Service success. Test result: {}", payload);
+ }
+
+ @Bean
+ public JdbcTemplate jdbcTemplate(DataSource dataSource) {
+ return new JdbcTemplate(dataSource);
+ }
+
+ @Bean
+ public DataSource dataSource() {
+ return new EmbeddedDatabaseBuilder()
+ .setType(EmbeddedDatabaseType.H2)
+ .addScript("classpath:table.sql")
+ .build();
+ }
+
+ @Bean
+ public DataSourceTransactionManager txManager() {
+ return new DataSourceTransactionManager(dataSource);
+ }
+
+ public static void main(final String... args) {
+ final AbstractApplicationContext context = new AnnotationConfigApplicationContext(TxIntegrationConfig.class);
+ context.registerShutdownHook();
+
+ final Scanner scanner = new Scanner(System.in);
+ System.out.print("Integration flow is running. Type q + to quit ");
+ while (true) {
+ final String input = scanner.nextLine();
+ if ("q".equals(input.trim())) {
+ context.close();
+ scanner.close();
+ break;
+ }
+ }
+ System.exit(0);
+ }
+
+}
+
+
+
diff --git a/spring-integration/src/main/resources/META-INF/spring/integration/spring-integration-tx-context.xml b/spring-integration/src/main/resources/META-INF/spring/integration/spring-integration-tx-context.xml
new file mode 100755
index 0000000000..2861826521
--- /dev/null
+++ b/spring-integration/src/main/resources/META-INF/spring/integration/spring-integration-tx-context.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-integration/src/main/resources/table.sql b/spring-integration/src/main/resources/table.sql
new file mode 100644
index 0000000000..9ca58f6f27
--- /dev/null
+++ b/spring-integration/src/main/resources/table.sql
@@ -0,0 +1,4 @@
+
+CREATE TABLE IF NOT EXISTS STUDENT (
+ TEST VARCHAR(256)
+);
\ No newline at end of file
diff --git a/spring-integration/src/test/java/com/baeldung/tx/TxIntegrationTest.java b/spring-integration/src/test/java/com/baeldung/tx/TxIntegrationTest.java
new file mode 100644
index 0000000000..1bbd16aa4b
--- /dev/null
+++ b/spring-integration/src/test/java/com/baeldung/tx/TxIntegrationTest.java
@@ -0,0 +1,56 @@
+package com.baeldung.tx;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+public final class TxIntegrationTest {
+
+ private static final String CONTEXT_CONFIG = "classpath:META-INF/spring/integration/spring-integration-tx-context.xml";
+
+ @Test
+ public void whenFileDoesntStartWithFail_thenTxSuccessful() throws InterruptedException, IOException {
+ final AbstractApplicationContext context =
+ new ClassPathXmlApplicationContext(CONTEXT_CONFIG);
+
+ String fileName = System.getProperty("java.io.tmpdir") + "/tx/test1.txt";
+ FileWriter fw = new FileWriter(fileName);
+ fw.write("PASSED!");
+ fw.close();
+
+ context.registerShutdownHook();
+ Thread.sleep(5000);
+
+ File file = new File(fileName + ".PASSED");
+ Assert.assertTrue(file.exists());
+ }
+
+ @Test
+ public void whenFileStartsWithFail_thenTxFailed() {
+
+ String fileName = System.getProperty("java.io.tmpdir") + "/tx/test2.txt";
+
+ try {
+ final AbstractApplicationContext context =
+ new ClassPathXmlApplicationContext(CONTEXT_CONFIG);
+
+ FileWriter fw = new FileWriter(fileName);
+ fw.write("FAILED!");
+ fw.close();
+
+ context.registerShutdownHook();
+ Thread.sleep(5000);
+ } catch (Exception e) {
+ // Exception is expected, do nothing
+ }
+
+ File file = new File(fileName + ".FAILED");
+ Assert.assertTrue(file.exists());
+ }
+
+}
diff --git a/spring-mvc-simple-2/README.md b/spring-mvc-simple-2/README.md
index a4a545ab72..c03fa6363a 100644
--- a/spring-mvc-simple-2/README.md
+++ b/spring-mvc-simple-2/README.md
@@ -5,4 +5,5 @@ This module contains articles about Spring MVC
## Relevant articles:
- [How to Read HTTP Headers in Spring REST Controllers](https://www.baeldung.com/spring-rest-http-headers)
- [A Custom Data Binder in Spring MVC](https://www.baeldung.com/spring-mvc-custom-data-binder)
+- [Validating Lists in a Spring Controller](https://www.baeldung.com/spring-validate-list-controller)
- More articles: [[<-- prev]](/spring-mvc-simple)
diff --git a/spring-mvc-xml/README.md b/spring-mvc-xml/README.md
index b6a34475ea..bc530ba295 100644
--- a/spring-mvc-xml/README.md
+++ b/spring-mvc-xml/README.md
@@ -14,6 +14,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [web.xml vs Initializer with Spring](https://www.baeldung.com/spring-xml-vs-java-config)
- [A Java Web Application Without a web.xml](https://www.baeldung.com/java-web-app-without-web-xml)
- [Validating RequestParams and PathVariables in Spring](https://www.baeldung.com/spring-validate-requestparam-pathvariable)
-
+- [Debugging the Spring MVC 404 “No mapping found for HTTP request” Error](https://www.baeldung.com/spring-mvc-404-error)
## Spring MVC with XML Configuration Example Project
- access a sample jsp page at: `http://localhost:8080/spring-mvc-xml/sample.html`
diff --git a/spring-security-mvc-boot/README.md b/spring-security-mvc-boot/README.md
index 7dcfe4d70f..a1056cc130 100644
--- a/spring-security-mvc-boot/README.md
+++ b/spring-security-mvc-boot/README.md
@@ -17,3 +17,5 @@ The "REST With Spring" Classes: http://github.learnspringsecurity.com
- [Spring Security – Whitelist IP Range](https://www.baeldung.com/spring-security-whitelist-ip-range)
- [Find the Registered Spring Security Filters](https://www.baeldung.com/spring-security-registered-filters)
- [HTTPS using Self-Signed Certificate in Spring Boot](https://www.baeldung.com/spring-boot-https-self-signed-certificate)
+- [Spring Security: Exploring JDBC Authentication](https://www.baeldung.com/spring-security-jdbc-authentication)
+
diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/README.md b/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/README.md
deleted file mode 100644
index a7cdfec7d8..0000000000
--- a/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant Articles:
-
-- [Spring Security: Exploring JDBC Authentication](https://www.baeldung.com/spring-security-jdbc-authentication)
diff --git a/spring-thymeleaf-2/README.md b/spring-thymeleaf-2/README.md
index ce83032cb5..22a73f06e1 100644
--- a/spring-thymeleaf-2/README.md
+++ b/spring-thymeleaf-2/README.md
@@ -3,3 +3,5 @@
- [Working with Enums in Thymeleaf](https://www.baeldung.com/thymeleaf-enums)
- [Changing the Thymeleaf Template Directory in Spring Boot](https://www.baeldung.com/spring-thymeleaf-template-directory)
- [Spring Request Parameters with Thymeleaf](https://www.baeldung.com/spring-thymeleaf-request-parameters)
+- [Thymeleaf lists Utility Object](https://www.baeldung.com/thymeleaf-lists-utility)
+
diff --git a/testing-modules/junit-5-advanced/README.md b/testing-modules/junit-5-advanced/README.md
index 61a65b2e5a..9dfa676c5c 100644
--- a/testing-modules/junit-5-advanced/README.md
+++ b/testing-modules/junit-5-advanced/README.md
@@ -2,3 +2,5 @@
- [JUnit 5 TestWatcher API](https://www.baeldung.com/junit-testwatcher)
- [JUnit Custom Display Name Generator API](https://www.baeldung.com/junit-custom-display-name-generator)
+- [@TestInstance Annotation in JUnit 5](https://www.baeldung.com/junit-testinstance-annotation)
+
diff --git a/vaadin/README.md b/vaadin/README.md
index 1d570d1f58..92ee8b938e 100644
--- a/vaadin/README.md
+++ b/vaadin/README.md
@@ -1,4 +1,8 @@
-## Relevant articles:
+## Vaadin
+
+This module contains articles about Vaadin.
+
+### Relevant articles:
- [Introduction to Vaadin](https://www.baeldung.com/vaadin)
- [Sample Application with Spring Boot and Vaadin](https://www.baeldung.com/spring-boot-vaadin)
diff --git a/vavr/README.md b/vavr/README.md
index 6832f78a62..2b8bb25356 100644
--- a/vavr/README.md
+++ b/vavr/README.md
@@ -1,3 +1,7 @@
+## Vavr
+
+This module contains articles about Vavr.
+
### Relevant Articles:
- [Introduction to Vavr](https://www.baeldung.com/vavr)
- [Guide to Try in Vavr](https://www.baeldung.com/vavr-try)
diff --git a/xml/README.md b/xml/README.md
index d1aa3a798b..b609a1e078 100644
--- a/xml/README.md
+++ b/xml/README.md
@@ -10,3 +10,5 @@ This module contains articles about eXtensible Markup Language (XML)
- [Write an org.w3.dom.Document to a File](https://www.baeldung.com/java-write-xml-document-file)
- [Modifying an XML Attribute in Java](https://www.baeldung.com/java-modify-xml-attribute)
- [Convert XML to HTML in Java](https://www.baeldung.com/java-convert-xml-to-html)
+- [Parsing an XML File Using StAX](https://www.baeldung.com/java-stax)
+