diff --git a/apache-shiro/pom.xml b/apache-shiro/pom.xml
index d519ba42af..3df6283437 100644
--- a/apache-shiro/pom.xml
+++ b/apache-shiro/pom.xml
@@ -10,9 +10,9 @@
com.baeldung
- parent-boot-1
+ parent-boot-2
0.0.1-SNAPSHOT
- ../parent-boot-1
+ ../parent-boot-2
diff --git a/apache-shiro/src/main/java/com/baeldung/Main.java b/apache-shiro/src/main/java/com/baeldung/Main.java
index 5e341f251b..99515bb705 100644
--- a/apache-shiro/src/main/java/com/baeldung/Main.java
+++ b/apache-shiro/src/main/java/com/baeldung/Main.java
@@ -1,11 +1,14 @@
package com.baeldung;
import org.apache.shiro.SecurityUtils;
-import org.apache.shiro.authc.*;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.IncorrectCredentialsException;
+import org.apache.shiro.authc.LockedAccountException;
+import org.apache.shiro.authc.UnknownAccountException;
+import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.realm.Realm;
-import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
diff --git a/apache-shiro/src/main/java/com/baeldung/MyCustomRealm.java b/apache-shiro/src/main/java/com/baeldung/MyCustomRealm.java
index 8d792c76a5..6d7c01d96e 100644
--- a/apache-shiro/src/main/java/com/baeldung/MyCustomRealm.java
+++ b/apache-shiro/src/main/java/com/baeldung/MyCustomRealm.java
@@ -1,16 +1,24 @@
package com.baeldung;
-import org.apache.shiro.authc.*;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.AuthenticationInfo;
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.authc.SimpleAuthenticationInfo;
+import org.apache.shiro.authc.UnknownAccountException;
+import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.jdbc.JdbcRealm;
import org.apache.shiro.subject.PrincipalCollection;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.*;
public class MyCustomRealm extends JdbcRealm {
diff --git a/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/Main.java b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/Main.java
index a373122d6c..a902a24388 100644
--- a/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/Main.java
+++ b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/Main.java
@@ -1,14 +1,15 @@
package com.baeldung.shiro.permissions.custom;
-import com.baeldung.MyCustomRealm;
import org.apache.shiro.SecurityUtils;
-import org.apache.shiro.authc.*;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.IncorrectCredentialsException;
+import org.apache.shiro.authc.LockedAccountException;
+import org.apache.shiro.authc.UnknownAccountException;
+import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.Ini;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.mgt.SecurityManager;
-import org.apache.shiro.realm.Realm;
import org.apache.shiro.realm.text.IniRealm;
-import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/atomikos/README.md b/atomikos/README.md
index 19f2e871d4..f9129233ec 100644
--- a/atomikos/README.md
+++ b/atomikos/README.md
@@ -1,7 +1,6 @@
## Atomikos
-
This module contains articles about Atomikos
### Relevant Articles:
-- [Guide Transactions Using Atomikos]()
+- [A Guide to Atomikos](https://www.baeldung.com/java-atomikos)
diff --git a/bazel/bazelapp/README.md b/bazel/bazelapp/README.md
deleted file mode 100644
index 528f797c21..0000000000
--- a/bazel/bazelapp/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant Articles:
-
-- [Building Java Applications with Bazel](https://www.baeldung.com/bazel-build-tool)
diff --git a/core-groovy/README.md b/core-groovy/README.md
index 25a0aece3a..f852b3ccf2 100644
--- a/core-groovy/README.md
+++ b/core-groovy/README.md
@@ -12,4 +12,5 @@ This module contains articles about core Groovy concepts
- [Closures in Groovy](https://www.baeldung.com/groovy-closures)
- [Converting a String to a Date in Groovy](https://www.baeldung.com/groovy-string-to-date)
- [Guide to I/O in Groovy](https://www.baeldung.com/groovy-io)
-- [[More -->]](/core-groovy-2)
\ No newline at end of file
+- [Convert String to Integer in Groovy](https://www.baeldung.com/groovy-convert-string-to-integer)
+- [[More -->]](/core-groovy-2)
diff --git a/core-java-modules/core-java-collections-maps-3/README.md b/core-java-modules/core-java-collections-maps-3/README.md
index 64a3b75d83..7386f7e9b7 100644
--- a/core-java-modules/core-java-collections-maps-3/README.md
+++ b/core-java-modules/core-java-collections-maps-3/README.md
@@ -5,4 +5,5 @@ This module contains articles about Map data structures in Java.
### Relevant Articles:
- [Java TreeMap vs HashMap](https://www.baeldung.com/java-treemap-vs-hashmap)
- [Comparing Two HashMaps in Java](https://www.baeldung.com/java-compare-hashmaps)
+- [The Map.computeIfAbsent() Method](https://www.baeldung.com/java-map-computeifabsent)
- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-2)
diff --git a/core-java-modules/core-java-concurrency-2/README.md b/core-java-modules/core-java-concurrency-2/README.md
index ab7eebc26a..23471a237e 100644
--- a/core-java-modules/core-java-concurrency-2/README.md
+++ b/core-java-modules/core-java-concurrency-2/README.md
@@ -4,5 +4,5 @@
### Relevant Articles:
- [Using a Mutex Object in Java](https://www.baeldung.com/java-mutex)
-- [Testing Multi-Threaded Code in Java] (https://www.baeldung.com/java-testing-multithreaded)
+- [Testing Multi-Threaded Code in Java](https://www.baeldung.com/java-testing-multithreaded)
diff --git a/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/lockfree/NonBlockingQueue.java b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/lockfree/NonBlockingQueue.java
new file mode 100644
index 0000000000..9140dc287d
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/lockfree/NonBlockingQueue.java
@@ -0,0 +1,81 @@
+package com.baeldung.lockfree;
+
+import java.util.NoSuchElementException;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
+public class NonBlockingQueue {
+
+ private final AtomicReference> head, tail;
+ private final AtomicInteger size;
+
+ public NonBlockingQueue() {
+ head = new AtomicReference<>(null);
+ tail = new AtomicReference<>(null);
+ size = new AtomicInteger();
+ size.set(0);
+ }
+
+ public void add(T element) {
+ if (element == null) {
+ throw new NullPointerException();
+ }
+
+ Node node = new Node<>(element);
+ Node currentTail;
+ do {
+ currentTail = tail.get();
+ node.setPrevious(currentTail);
+ } while(!tail.compareAndSet(currentTail, node));
+
+ if(node.previous != null) {
+ node.previous.next = node;
+ }
+
+ head.compareAndSet(null, node); //if we are inserting the first element
+ size.incrementAndGet();
+ }
+
+ public T get() {
+ if(head.get() == null) {
+ throw new NoSuchElementException();
+ }
+
+ Node currentHead;
+ Node nextNode;
+ do {
+ currentHead = head.get();
+ nextNode = currentHead.getNext();
+ } while(!head.compareAndSet(currentHead, nextNode));
+
+ size.decrementAndGet();
+ return currentHead.getValue();
+ }
+
+ public int size() {
+ return this.size.get();
+ }
+
+ private class Node {
+ private final T value;
+ private volatile Node next;
+ private volatile Node previous;
+
+ public Node(T value) {
+ this.value = value;
+ this.next = null;
+ }
+
+ public T getValue() {
+ return value;
+ }
+
+ public Node getNext() {
+ return next;
+ }
+
+ public void setPrevious(Node previous) {
+ this.previous = previous;
+ }
+ }
+}
diff --git a/core-java-modules/core-java-networking-2/README.md b/core-java-modules/core-java-networking-2/README.md
index 120b111ff5..662d97252e 100644
--- a/core-java-modules/core-java-networking-2/README.md
+++ b/core-java-modules/core-java-networking-2/README.md
@@ -11,4 +11,5 @@ This module contains articles about networking in Java
- [Sending Emails with Java](https://www.baeldung.com/java-email)
- [Authentication with HttpUrlConnection](https://www.baeldung.com/java-http-url-connection)
- [Download a File from an URL in Java](https://www.baeldung.com/java-download-file)
+- [Handling java.net.ConnectException](https://www.baeldung.com/java-net-connectexception)
- [[<-- Prev]](/core-java-modules/core-java-networking)
diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java
index b3c3a91a09..77052b79ac 100644
--- a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java
+++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/RegexUnitTest.java
@@ -26,7 +26,6 @@ public class RegexUnitTest {
while (matcher.find())
matches++;
assertEquals(matches, 2);
-
}
@Test
@@ -452,7 +451,6 @@ public class RegexUnitTest {
Matcher matcher = pattern.matcher("dogs are friendly");
assertTrue(matcher.lookingAt());
assertFalse(matcher.matches());
-
}
@Test
@@ -460,7 +458,6 @@ public class RegexUnitTest {
Pattern pattern = Pattern.compile("dog");
Matcher matcher = pattern.matcher("dog");
assertTrue(matcher.matches());
-
}
@Test
@@ -469,7 +466,6 @@ public class RegexUnitTest {
Matcher matcher = pattern.matcher("dogs are domestic animals, dogs are friendly");
String newStr = matcher.replaceFirst("cat");
assertEquals("cats are domestic animals, dogs are friendly", newStr);
-
}
@Test
@@ -478,7 +474,6 @@ public class RegexUnitTest {
Matcher matcher = pattern.matcher("dogs are domestic animals, dogs are friendly");
String newStr = matcher.replaceAll("cat");
assertEquals("cats are domestic animals, cats are friendly", newStr);
-
}
public synchronized static int runTest(String regex, String text) {
diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/phonenumbers/PhoneNumbersRegexUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/phonenumbers/PhoneNumbersRegexUnitTest.java
new file mode 100644
index 0000000000..11bf1618b6
--- /dev/null
+++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/phonenumbers/PhoneNumbersRegexUnitTest.java
@@ -0,0 +1,129 @@
+package com.baeldung.regex.phonenumbers;
+
+import static org.junit.Assert.*;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.junit.Test;
+
+public class PhoneNumbersRegexUnitTest {
+
+ @Test
+ public void whenMatchesTenDigitsNumber_thenCorrect() {
+ Pattern pattern = Pattern.compile("^\\d{10}$");
+ Matcher matcher = pattern.matcher("2055550125");
+ assertTrue(matcher.matches());
+ }
+
+ @Test
+ public void whenMOreThanTenDigits_thenNotCorrect() {
+ Pattern pattern = Pattern.compile("^\\d{10}$");
+ Matcher matcher = pattern.matcher("20555501251");
+ assertFalse(matcher.matches());
+ }
+
+ @Test
+ public void whenMatchesTenDigitsNumberWhitespacesDotHyphen_thenCorrect() {
+ Pattern pattern = Pattern.compile("^(\\d{3}[- .]?){2}\\d{4}$");
+ Matcher matcher = pattern.matcher("202 555 0125");
+ assertTrue(matcher.matches());
+ }
+
+ @Test
+ public void whenIncludesBracket_thenNotCorrect() {
+ Pattern pattern = Pattern.compile("^(\\d{3}[- .]?){2}\\d{4}$");
+ Matcher matcher = pattern.matcher("202]555 0125");
+ assertFalse(matcher.matches());
+ }
+
+ @Test
+ public void whenNotStartsWithBatchesOfThreeDigits_thenNotCorrect() {
+ Pattern pattern = Pattern.compile("^(\\d{3}[- .]?){2}\\d{4}$");
+ Matcher matcher = pattern.matcher("2021 555 0125");
+ assertFalse(matcher.matches());
+ }
+
+ @Test
+ public void whenLastPartWithNoFourDigits_thenNotCorrect() {
+ Pattern pattern = Pattern.compile("^(\\d{3}[- .]?){2}\\d{4}$");
+ Matcher matcher = pattern.matcher("202 555 012");
+ assertFalse(matcher.matches());
+ }
+
+ @Test
+ public void whenMatchesTenDigitsNumberParenthesis_thenCorrect() {
+ Pattern pattern = Pattern.compile("^((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$");
+ Matcher matcher = pattern.matcher("(202) 555-0125");
+ assertTrue(matcher.matches());
+ }
+
+ @Test
+ public void whenJustOpeningParenthesis_thenNotCorrect() {
+ Pattern pattern = Pattern.compile("^((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$");
+ Matcher matcher = pattern.matcher("(202 555-0125");
+ assertFalse(matcher.matches());
+ }
+
+ @Test
+ public void whenJustClosingParenthesis_thenNotCorrect() {
+ Pattern pattern = Pattern.compile("^((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$");
+ Matcher matcher = pattern.matcher("202) 555-0125");
+ assertFalse(matcher.matches());
+ }
+
+ @Test
+ public void whenMatchesTenDigitsNumberPrefix_thenCorrect() {
+ Pattern pattern = Pattern.compile("^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$");
+ Matcher matcher = pattern.matcher("+111 (202) 555-0125");
+ assertTrue(matcher.matches());
+ }
+
+ @Test
+ public void whenIncorrectPrefix_thenNotCorrect() {
+ Pattern pattern = Pattern.compile("^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$");
+ Matcher matcher = pattern.matcher("-111 (202) 555-0125");
+ assertFalse(matcher.matches());
+ }
+
+ @Test
+ public void whenTooLongPrefix_thenNotCorrect() {
+ Pattern pattern = Pattern.compile("^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$");
+ Matcher matcher = pattern.matcher("+1111 (202) 555-0125");
+ assertFalse(matcher.matches());
+ }
+
+ @Test
+ public void whenMatchesPhoneNumber_thenCorrect() {
+ String patterns
+ = "^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$"
+ + "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?){2}\\d{3}$"
+ + "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?)(\\d{2}[ ]?){2}\\d{2}$";
+
+ String[] validPhoneNumbers
+ = {"2055550125","202 555 0125", "(202) 555-0125", "+111 (202) 555-0125", "636 856 789", "+111 636 856 789", "636 85 67 89", "+111 636 85 67 89"};
+
+ Pattern pattern = Pattern.compile(patterns);
+ for(String phoneNumber : validPhoneNumbers) {
+ Matcher matcher = pattern.matcher(phoneNumber);
+ assertTrue(matcher.matches());
+ }
+ }
+
+ @Test
+ public void whenNotMatchesPhoneNumber_thenNotCorrect() {
+ String patterns
+ = "^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$"
+ + "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?){2}\\d{3}$"
+ + "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?)(\\d{2}[ ]?){2}\\d{2}$";
+
+ String[] invalidPhoneNumbers
+ = {"20555501251","202]555 0125", "2021 555 012", "(202 555-0125", "202) 555-0125", "-111 (202) 555-0125", "+1111 (202) 555-0125", "636 85 789", "636 85 67 893"};
+
+ Pattern pattern = Pattern.compile(patterns);
+ for(String phoneNumber : invalidPhoneNumbers) {
+ Matcher matcher = pattern.matcher(phoneNumber);
+ assertFalse(matcher.matches());
+ }
+ }
+}
diff --git a/core-java-modules/core-java-streams-3/README.md b/core-java-modules/core-java-streams-3/README.md
index 05c4b99900..65713aa04f 100644
--- a/core-java-modules/core-java-streams-3/README.md
+++ b/core-java-modules/core-java-streams-3/README.md
@@ -10,4 +10,5 @@ This module contains articles about the Stream API in Java.
- [Primitive Type Streams in Java 8](https://www.baeldung.com/java-8-primitive-streams)
- [Debugging Java 8 Streams with IntelliJ](https://www.baeldung.com/intellij-debugging-java-streams)
- [Add BigDecimals using the Stream API](https://www.baeldung.com/java-stream-add-bigdecimals)
+- [Should We Close a Java Stream?](https://www.baeldung.com/java-stream-close)
- More articles: [[<-- prev>]](/../core-java-streams-2)
diff --git a/core-kotlin-modules/core-kotlin-lang-2/src/test/kotlin/com/baeldung/late/LateInitUnitTest.kt b/core-kotlin-modules/core-kotlin-lang-2/src/test/kotlin/com/baeldung/late/LateInitUnitTest.kt
new file mode 100644
index 0000000000..c99e438742
--- /dev/null
+++ b/core-kotlin-modules/core-kotlin-lang-2/src/test/kotlin/com/baeldung/late/LateInitUnitTest.kt
@@ -0,0 +1,22 @@
+package com.baeldung.late
+
+import org.junit.Test
+import kotlin.test.assertFalse
+import kotlin.test.assertTrue
+
+class LateInitUnitTest {
+
+ private lateinit var answer: String
+
+ @Test(expected = UninitializedPropertyAccessException::class)
+ fun givenLateInit_WhenNotInitialized_ShouldThrowAnException() {
+ answer.length
+ }
+
+ @Test
+ fun givenLateInit_TheIsInitialized_ReturnsTheInitializationStatus() {
+ assertFalse { this::answer.isInitialized }
+ answer = "42"
+ assertTrue { this::answer.isInitialized }
+ }
+}
diff --git a/java-collections-maps-3/README.md b/java-collections-maps-3/README.md
new file mode 100644
index 0000000000..4da8547824
--- /dev/null
+++ b/java-collections-maps-3/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Java Map With Case-Insensitive Keys](https://www.baeldung.com/java-map-with-case-insensitive-keys)
diff --git a/libraries-2/README.md b/libraries-2/README.md
index edf513c6ee..8dae12a1cf 100644
--- a/libraries-2/README.md
+++ b/libraries-2/README.md
@@ -18,5 +18,5 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m
- [Guide to MapDB](https://www.baeldung.com/mapdb)
- [A Guide to Apache Mesos](https://www.baeldung.com/apache-mesos)
- [JasperReports with Spring](https://www.baeldung.com/spring-jasper)
-- More articles [[<-- prev]](/libraries)
+- More articles [[<-- prev]](/libraries) [[next -->]](/libraries-3)
diff --git a/libraries-3/README.md b/libraries-3/README.md
index ec433960ef..6279dcf5ad 100644
--- a/libraries-3/README.md
+++ b/libraries-3/README.md
@@ -17,3 +17,4 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m
- [Using NullAway to Avoid NullPointerExceptions](https://www.baeldung.com/java-nullaway)
- [Introduction to Alibaba Arthas](https://www.baeldung.com/java-alibaba-arthas-intro)
- [Quick Guide to Spring Cloud Circuit Breaker](https://www.baeldung.com/spring-cloud-circuit-breaker)
+- More articles [[<-- prev]](/libraries-2) [[next -->]](/libraries-4)
diff --git a/libraries-4/README.md b/libraries-4/README.md
new file mode 100644
index 0000000000..0dee9f1c1e
--- /dev/null
+++ b/libraries-4/README.md
@@ -0,0 +1,21 @@
+## Libraries-4
+
+This module contains articles about various Java libraries.
+These are small libraries that are relatively easy to use and do not require any separate module of their own.
+
+The code examples related to different libraries are each in their own module.
+
+Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-modules) we already have separate modules. Please make sure to have a look at the existing modules in such cases.
+
+### Relevant articles
+- [Quick Guide to RSS with Rome](https://www.baeldung.com/rome-rss)
+- [Introduction to PCollections](https://www.baeldung.com/java-pcollections)
+- [Introduction to Eclipse Collections](https://www.baeldung.com/eclipse-collections)
+- [DistinctBy in the Java Stream API](https://www.baeldung.com/java-streams-distinct-by)
+- [Introduction to NoException](https://www.baeldung.com/no-exception)
+- [Spring Yarg Integration](https://www.baeldung.com/spring-yarg)
+- [Delete a Directory Recursively in Java](https://www.baeldung.com/java-delete-directory)
+- [Guide to JDeferred](https://www.baeldung.com/jdeferred)
+- [Introduction to MBassador](https://www.baeldung.com/mbassador)
+- [Using Pairs in Java](https://www.baeldung.com/java-pairs)
+- More articles [[<-- prev]](/libraries-3) [[next -->]](/libraries-5)
diff --git a/libraries-4/pom.xml b/libraries-4/pom.xml
new file mode 100644
index 0000000000..f26e7fc055
--- /dev/null
+++ b/libraries-4/pom.xml
@@ -0,0 +1,116 @@
+
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+ 4.0.0
+
+ libraries-4
+
+
+
+ org.jdeferred
+ jdeferred-core
+ ${jdeferred.version}
+
+
+ org.eclipse.collections
+ eclipse-collections
+ ${eclipse-collections.version}
+
+
+ com.haulmont.yarg
+ yarg
+ ${yarg.version}
+
+
+ net.engio
+ mbassador
+ ${mbassador.version}
+
+
+ com.machinezoo.noexception
+ noexception
+ ${noexception.version}
+
+
+ rome
+ rome
+ ${rome.version}
+
+
+ org.springframework
+ spring-web
+ ${spring.version}
+
+
+ org.datanucleus
+ javax.jdo
+ ${javax.jdo.version}
+
+
+ javax.servlet
+ servlet-api
+ ${javax.servlet.version}
+
+
+ io.vavr
+ vavr
+ ${vavr.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+
+
+ org.pcollections
+ pcollections
+ ${pcollections.version}
+
+
+ org.awaitility
+ awaitility
+ ${awaitility.version}
+ test
+
+
+ one.util
+ streamex
+ ${streamex.version}
+
+
+ javax.el
+ javax.el-api
+ ${javax.el.version}
+
+
+ org.glassfish.web
+ javax.el
+ 2.2.4
+
+
+
+
+ 1.2.6
+ 8.2.0
+ 1.1.0
+ 2.0.12
+ 1.3.1
+ 1.0
+ 4.3.8.RELEASE
+ 2.5
+ 3.2.0-m7
+ 0.9.0
+ 3.6.2
+ 2.1.2
+ 3.0.0
+ 0.6.5
+ 3.0.0
+
+
+
\ No newline at end of file
diff --git a/libraries/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java b/libraries-4/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java
rename to libraries-4/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java
diff --git a/libraries/src/main/java/com/baeldung/distinct/Person.java b/libraries-4/src/main/java/com/baeldung/distinct/Person.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/distinct/Person.java
rename to libraries-4/src/main/java/com/baeldung/distinct/Person.java
diff --git a/libraries/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java b/libraries-4/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java
rename to libraries-4/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java
diff --git a/libraries/src/main/java/com/baeldung/eclipsecollections/Student.java b/libraries-4/src/main/java/com/baeldung/eclipsecollections/Student.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/eclipsecollections/Student.java
rename to libraries-4/src/main/java/com/baeldung/eclipsecollections/Student.java
diff --git a/libraries/src/main/java/com/baeldung/jdeffered/FilterDemo.java b/libraries-4/src/main/java/com/baeldung/jdeffered/FilterDemo.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jdeffered/FilterDemo.java
rename to libraries-4/src/main/java/com/baeldung/jdeffered/FilterDemo.java
diff --git a/libraries/src/main/java/com/baeldung/jdeffered/PipeDemo.java b/libraries-4/src/main/java/com/baeldung/jdeffered/PipeDemo.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jdeffered/PipeDemo.java
rename to libraries-4/src/main/java/com/baeldung/jdeffered/PipeDemo.java
diff --git a/libraries/src/main/java/com/baeldung/jdeffered/PromiseDemo.java b/libraries-4/src/main/java/com/baeldung/jdeffered/PromiseDemo.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jdeffered/PromiseDemo.java
rename to libraries-4/src/main/java/com/baeldung/jdeffered/PromiseDemo.java
diff --git a/libraries/src/main/java/com/baeldung/jdeffered/ThreadSafeDemo.java b/libraries-4/src/main/java/com/baeldung/jdeffered/ThreadSafeDemo.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jdeffered/ThreadSafeDemo.java
rename to libraries-4/src/main/java/com/baeldung/jdeffered/ThreadSafeDemo.java
diff --git a/libraries/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerDemo.java b/libraries-4/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerDemo.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerDemo.java
rename to libraries-4/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerDemo.java
diff --git a/libraries/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerWithExecutorDemo.java b/libraries-4/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerWithExecutorDemo.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerWithExecutorDemo.java
rename to libraries-4/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerWithExecutorDemo.java
diff --git a/libraries/src/main/java/com/baeldung/jdeffered/manager/SimpleDeferredManagerDemo.java b/libraries-4/src/main/java/com/baeldung/jdeffered/manager/SimpleDeferredManagerDemo.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jdeffered/manager/SimpleDeferredManagerDemo.java
rename to libraries-4/src/main/java/com/baeldung/jdeffered/manager/SimpleDeferredManagerDemo.java
diff --git a/libraries/src/main/java/com/baeldung/mbassador/AckMessage.java b/libraries-4/src/main/java/com/baeldung/mbassador/AckMessage.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/mbassador/AckMessage.java
rename to libraries-4/src/main/java/com/baeldung/mbassador/AckMessage.java
diff --git a/libraries/src/main/java/com/baeldung/mbassador/Message.java b/libraries-4/src/main/java/com/baeldung/mbassador/Message.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/mbassador/Message.java
rename to libraries-4/src/main/java/com/baeldung/mbassador/Message.java
diff --git a/libraries/src/main/java/com/baeldung/mbassador/RejectMessage.java b/libraries-4/src/main/java/com/baeldung/mbassador/RejectMessage.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/mbassador/RejectMessage.java
rename to libraries-4/src/main/java/com/baeldung/mbassador/RejectMessage.java
diff --git a/libraries/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java b/libraries-4/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java
rename to libraries-4/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java
diff --git a/libraries/src/main/java/com/baeldung/pairs/CustomPair.java b/libraries-4/src/main/java/com/baeldung/pairs/CustomPair.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/pairs/CustomPair.java
rename to libraries-4/src/main/java/com/baeldung/pairs/CustomPair.java
diff --git a/libraries/src/main/java/com/baeldung/rome/RSSRomeExample.java b/libraries-4/src/main/java/com/baeldung/rome/RSSRomeExample.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/rome/RSSRomeExample.java
rename to libraries-4/src/main/java/com/baeldung/rome/RSSRomeExample.java
diff --git a/libraries/src/main/java/com/baeldung/yarg/DocumentController.java b/libraries-4/src/main/java/com/baeldung/yarg/DocumentController.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/yarg/DocumentController.java
rename to libraries-4/src/main/java/com/baeldung/yarg/DocumentController.java
diff --git a/libraries/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java b/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java b/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java b/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java b/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/distinct/PersonDataGenerator.java b/libraries-4/src/test/java/com/baeldung/distinct/PersonDataGenerator.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/distinct/PersonDataGenerator.java
rename to libraries-4/src/test/java/com/baeldung/distinct/PersonDataGenerator.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/DetectPatternUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/DetectPatternUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java
similarity index 90%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java
index 38d95047ed..a1bd280658 100644
--- a/libraries/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java
+++ b/libraries-4/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java
@@ -5,6 +5,7 @@ import static org.junit.Assert.assertEquals;
import org.eclipse.collections.api.tuple.Pair;
import org.eclipse.collections.impl.map.mutable.UnifiedMap;
import org.eclipse.collections.impl.tuple.Tuples;
+import org.junit.Assert;
import org.junit.Test;
public class ForEachPatternUnitTest {
@@ -23,7 +24,7 @@ public class ForEachPatternUnitTest {
}
for (int i = 0; i < map.size(); i++) {
- assertEquals("New Value", map.get(i + 1));
+ Assert.assertEquals("New Value", map.get(i + 1));
}
}
}
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/LazyIterationUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/LazyIterationUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/PartitionPatternUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/PartitionPatternUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/RejectPatternUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/RejectPatternUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/SelectPatternUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/SelectPatternUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexUnitTest.java b/libraries-4/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/java/io/JavaDirectoryDeleteUnitTest.java b/libraries-4/src/test/java/com/baeldung/io/JavaDirectoryDeleteUnitTest.java
similarity index 96%
rename from libraries/src/test/java/com/baeldung/java/io/JavaDirectoryDeleteUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/io/JavaDirectoryDeleteUnitTest.java
index 53d9d11bbb..c9c8242cd5 100644
--- a/libraries/src/test/java/com/baeldung/java/io/JavaDirectoryDeleteUnitTest.java
+++ b/libraries-4/src/test/java/com/baeldung/io/JavaDirectoryDeleteUnitTest.java
@@ -1,138 +1,138 @@
-package com.baeldung.java.io;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-
-import org.apache.commons.io.FileUtils;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.springframework.util.FileSystemUtils;
-
-public class JavaDirectoryDeleteUnitTest {
- private static Path TEMP_DIRECTORY;
- private static final String DIRECTORY_NAME = "toBeDeleted";
-
- private static final List ALL_LINES = Arrays.asList("This is line 1", "This is line 2", "This is line 3", "This is line 4", "This is line 5", "This is line 6");
-
- @BeforeClass
- public static void initializeTempDirectory() throws IOException {
- TEMP_DIRECTORY = Files.createTempDirectory("tmpForJUnit");
- }
-
- @AfterClass
- public static void cleanTempDirectory() throws IOException {
- FileUtils.deleteDirectory(TEMP_DIRECTORY.toFile());
- }
-
- @Before
- public void setupDirectory() throws IOException {
- Path tempPathForEachTest = Files.createDirectory(TEMP_DIRECTORY.resolve(DIRECTORY_NAME));
-
- // Create a directory structure
- Files.write(tempPathForEachTest.resolve("file1.txt"), ALL_LINES.subList(0, 2));
- Files.write(tempPathForEachTest.resolve("file2.txt"), ALL_LINES.subList(2, 4));
-
- Files.createDirectories(tempPathForEachTest.resolve("Empty"));
-
- Path aSubDir = Files.createDirectories(tempPathForEachTest.resolve("notEmpty"));
- Files.write(aSubDir.resolve("file3.txt"), ALL_LINES.subList(3, 5));
- Files.write(aSubDir.resolve("file4.txt"), ALL_LINES.subList(0, 3));
-
- aSubDir = Files.createDirectories(aSubDir.resolve("anotherSubDirectory"));
- Files.write(aSubDir.resolve("file5.txt"), ALL_LINES.subList(4, 5));
- Files.write(aSubDir.resolve("file6.txt"), ALL_LINES.subList(0, 2));
- }
-
- @After
- public void checkAndCleanupIfRequired() throws IOException {
- Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
- if (Files.exists(pathToBeDeleted)) {
- FileUtils.deleteDirectory(pathToBeDeleted.toFile());
- }
- }
-
- private boolean deleteDirectory(File directoryToBeDeleted) {
- File[] allContents = directoryToBeDeleted.listFiles();
-
- if (allContents != null) {
- for (File file : allContents) {
- deleteDirectory(file);
- }
- }
-
- return directoryToBeDeleted.delete();
- }
-
- @Test
- public void givenDirectory_whenDeletedWithRecursion_thenIsGone() throws IOException {
- Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
-
- boolean result = deleteDirectory(pathToBeDeleted.toFile());
-
- assertTrue("Could not delete directory", result);
- assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
- }
-
- @Test
- public void givenDirectory_whenDeletedWithCommonsIOFileUtils_thenIsGone() throws IOException {
- Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
-
- FileUtils.deleteDirectory(pathToBeDeleted.toFile());
-
- assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
- }
-
- @Test
- public void givenDirectory_whenDeletedWithSpringFileSystemUtils_thenIsGone() throws IOException {
- Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
-
- boolean result = FileSystemUtils.deleteRecursively(pathToBeDeleted.toFile());
-
- assertTrue("Could not delete directory", result);
- assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
- }
-
- @Test
- public void givenDirectory_whenDeletedWithFilesWalk_thenIsGone() throws IOException {
- Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
-
- Files.walk(pathToBeDeleted).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
-
- assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
- }
-
- @Test
- public void givenDirectory_whenDeletedWithNIO2WalkFileTree_thenIsGone() throws IOException {
- Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
-
- Files.walkFileTree(pathToBeDeleted, new SimpleFileVisitor() {
- @Override
- public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
- Files.delete(dir);
- return FileVisitResult.CONTINUE;
- }
-
- @Override
- public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
- Files.delete(file);
- return FileVisitResult.CONTINUE;
- }
- });
-
- assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
- }
-}
+package com.baeldung.io;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+
+import org.apache.commons.io.FileUtils;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.springframework.util.FileSystemUtils;
+
+public class JavaDirectoryDeleteUnitTest {
+ private static Path TEMP_DIRECTORY;
+ private static final String DIRECTORY_NAME = "toBeDeleted";
+
+ private static final List ALL_LINES = Arrays.asList("This is line 1", "This is line 2", "This is line 3", "This is line 4", "This is line 5", "This is line 6");
+
+ @BeforeClass
+ public static void initializeTempDirectory() throws IOException {
+ TEMP_DIRECTORY = Files.createTempDirectory("tmpForJUnit");
+ }
+
+ @AfterClass
+ public static void cleanTempDirectory() throws IOException {
+ FileUtils.deleteDirectory(TEMP_DIRECTORY.toFile());
+ }
+
+ @Before
+ public void setupDirectory() throws IOException {
+ Path tempPathForEachTest = Files.createDirectory(TEMP_DIRECTORY.resolve(DIRECTORY_NAME));
+
+ // Create a directory structure
+ Files.write(tempPathForEachTest.resolve("file1.txt"), ALL_LINES.subList(0, 2));
+ Files.write(tempPathForEachTest.resolve("file2.txt"), ALL_LINES.subList(2, 4));
+
+ Files.createDirectories(tempPathForEachTest.resolve("Empty"));
+
+ Path aSubDir = Files.createDirectories(tempPathForEachTest.resolve("notEmpty"));
+ Files.write(aSubDir.resolve("file3.txt"), ALL_LINES.subList(3, 5));
+ Files.write(aSubDir.resolve("file4.txt"), ALL_LINES.subList(0, 3));
+
+ aSubDir = Files.createDirectories(aSubDir.resolve("anotherSubDirectory"));
+ Files.write(aSubDir.resolve("file5.txt"), ALL_LINES.subList(4, 5));
+ Files.write(aSubDir.resolve("file6.txt"), ALL_LINES.subList(0, 2));
+ }
+
+ @After
+ public void checkAndCleanupIfRequired() throws IOException {
+ Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
+ if (Files.exists(pathToBeDeleted)) {
+ FileUtils.deleteDirectory(pathToBeDeleted.toFile());
+ }
+ }
+
+ private boolean deleteDirectory(File directoryToBeDeleted) {
+ File[] allContents = directoryToBeDeleted.listFiles();
+
+ if (allContents != null) {
+ for (File file : allContents) {
+ deleteDirectory(file);
+ }
+ }
+
+ return directoryToBeDeleted.delete();
+ }
+
+ @Test
+ public void givenDirectory_whenDeletedWithRecursion_thenIsGone() throws IOException {
+ Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
+
+ boolean result = deleteDirectory(pathToBeDeleted.toFile());
+
+ assertTrue("Could not delete directory", result);
+ assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
+ }
+
+ @Test
+ public void givenDirectory_whenDeletedWithCommonsIOFileUtils_thenIsGone() throws IOException {
+ Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
+
+ FileUtils.deleteDirectory(pathToBeDeleted.toFile());
+
+ assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
+ }
+
+ @Test
+ public void givenDirectory_whenDeletedWithSpringFileSystemUtils_thenIsGone() throws IOException {
+ Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
+
+ boolean result = FileSystemUtils.deleteRecursively(pathToBeDeleted.toFile());
+
+ assertTrue("Could not delete directory", result);
+ assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
+ }
+
+ @Test
+ public void givenDirectory_whenDeletedWithFilesWalk_thenIsGone() throws IOException {
+ Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
+
+ Files.walk(pathToBeDeleted).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
+
+ assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
+ }
+
+ @Test
+ public void givenDirectory_whenDeletedWithNIO2WalkFileTree_thenIsGone() throws IOException {
+ Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
+
+ Files.walkFileTree(pathToBeDeleted, new SimpleFileVisitor() {
+ @Override
+ public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+ Files.delete(dir);
+ return FileVisitResult.CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+ Files.delete(file);
+ return FileVisitResult.CONTINUE;
+ }
+ });
+
+ assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/jdeffered/JDeferredUnitTest.java b/libraries-4/src/test/java/com/baeldung/jdeffered/JDeferredUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/jdeffered/JDeferredUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/jdeffered/JDeferredUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/mbassador/MBassadorAsyncDispatchUnitTest.java b/libraries-4/src/test/java/com/baeldung/mbassador/MBassadorAsyncDispatchUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/mbassador/MBassadorAsyncDispatchUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/mbassador/MBassadorAsyncDispatchUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/mbassador/MBassadorAsyncInvocationUnitTest.java b/libraries-4/src/test/java/com/baeldung/mbassador/MBassadorAsyncInvocationUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/mbassador/MBassadorAsyncInvocationUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/mbassador/MBassadorAsyncInvocationUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/mbassador/MBassadorBasicUnitTest.java b/libraries-4/src/test/java/com/baeldung/mbassador/MBassadorBasicUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/mbassador/MBassadorBasicUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/mbassador/MBassadorBasicUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/mbassador/MBassadorConfigurationUnitTest.java b/libraries-4/src/test/java/com/baeldung/mbassador/MBassadorConfigurationUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/mbassador/MBassadorConfigurationUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/mbassador/MBassadorConfigurationUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/mbassador/MBassadorFilterUnitTest.java b/libraries-4/src/test/java/com/baeldung/mbassador/MBassadorFilterUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/mbassador/MBassadorFilterUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/mbassador/MBassadorFilterUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/mbassador/MBassadorHierarchyUnitTest.java b/libraries-4/src/test/java/com/baeldung/mbassador/MBassadorHierarchyUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/mbassador/MBassadorHierarchyUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/mbassador/MBassadorHierarchyUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/noexception/NoExceptionUnitTest.java b/libraries-4/src/test/java/com/baeldung/noexception/NoExceptionUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/noexception/NoExceptionUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/noexception/NoExceptionUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/pairs/ApacheCommonsPairUnitTest.java b/libraries-4/src/test/java/com/baeldung/pairs/ApacheCommonsPairUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/pairs/ApacheCommonsPairUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/pairs/ApacheCommonsPairUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/pairs/CoreJavaPairUnitTest.java b/libraries-4/src/test/java/com/baeldung/pairs/CoreJavaPairUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/pairs/CoreJavaPairUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/pairs/CoreJavaPairUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/pairs/CoreJavaSimpleEntryUnitTest.java b/libraries-4/src/test/java/com/baeldung/pairs/CoreJavaSimpleEntryUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/pairs/CoreJavaSimpleEntryUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/pairs/CoreJavaSimpleEntryUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/pairs/VavrPairsUnitTest.java b/libraries-4/src/test/java/com/baeldung/pairs/VavrPairsUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/pairs/VavrPairsUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/pairs/VavrPairsUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java b/libraries-4/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java
rename to libraries-4/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java
diff --git a/libraries-5/README.md b/libraries-5/README.md
new file mode 100644
index 0000000000..f1e749b293
--- /dev/null
+++ b/libraries-5/README.md
@@ -0,0 +1,21 @@
+## Libraries-5
+
+This module contains articles about various Java libraries.
+These are small libraries that are relatively easy to use and do not require any separate module of their own.
+
+The code examples related to different libraries are each in their own module.
+
+Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-modules) we already have separate modules. Please make sure to have a look at the existing modules in such cases.
+
+### Relevant articles
+- [Introduction to Caffeine](https://www.baeldung.com/java-caching-caffeine)
+- [Introduction to StreamEx](https://www.baeldung.com/streamex)
+- [A Docker Guide for Java](https://www.baeldung.com/docker-java-api)
+- [Introduction to Akka Actors in Java](https://www.baeldung.com/akka-actors-java)
+- [A Guide to Byte Buddy](https://www.baeldung.com/byte-buddy)
+- [Introduction to jOOL](https://www.baeldung.com/jool)
+- [Consumer Driven Contracts with Pact](https://www.baeldung.com/pact-junit-consumer-driven-contracts)
+- [Introduction to Atlassian Fugue](https://www.baeldung.com/java-fugue)
+- [Publish and Receive Messages with Nats Java Client](https://www.baeldung.com/nats-java-client)
+- [Java Concurrency Utility with JCTools](https://www.baeldung.com/java-concurrency-jc-tools)
+- More articles [[<-- prev]](/libraries-4) [[next -->]](/libraries-6)
diff --git a/libraries-5/pom.xml b/libraries-5/pom.xml
new file mode 100644
index 0000000000..63296d4a89
--- /dev/null
+++ b/libraries-5/pom.xml
@@ -0,0 +1,146 @@
+
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+
+ libraries-5
+ 4.0.0
+
+
+
+ org.springframework
+ spring-web
+ ${spring.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+
+
+ org.jooq
+ jool
+ ${jool.version}
+
+
+ au.com.dius
+ pact-jvm-consumer-junit_2.11
+ ${pact.version}
+ test
+
+
+ org.codehaus.groovy
+ groovy-all
+
+
+
+
+
+
+ com.typesafe.akka
+ akka-actor_${scala.version}
+ ${typesafe-akka.version}
+
+
+ com.typesafe.akka
+ akka-testkit_${scala.version}
+ ${typesafe-akka.version}
+ test
+
+
+
+ one.util
+ streamex
+ ${streamex.version}
+
+
+ net.bytebuddy
+ byte-buddy
+ ${bytebuddy.version}
+
+
+ net.bytebuddy
+ byte-buddy-agent
+ ${bytebuddy.version}
+
+
+
+
+ com.github.docker-java
+ docker-java
+ ${docker.version}
+
+
+ org.slf4j
+ slf4j-log4j12
+
+
+ org.slf4j
+ jcl-over-slf4j
+
+
+ ch.qos.logback
+ logback-classic
+
+
+
+
+
+
+ com.github.ben-manes.caffeine
+ caffeine
+ ${caffeine.version}
+
+
+ com.google.code.findbugs
+ jsr305
+ ${findbugs.version}
+ test
+
+
+
+ io.atlassian.fugue
+ fugue
+ ${fugue.version}
+
+
+ io.nats
+ jnats
+ ${jnats.version}
+
+
+ org.jctools
+ jctools-core
+ ${jctools.version}
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh.version}
+
+
+
+
+ 3.5.0
+ 0.9.12
+ 4.3.8.RELEASE
+ 3.6.2
+ 2.11
+ 2.5.11
+ 0.6.5
+ 1.7.1
+ 3.0.14
+ 2.5.5
+ 3.0.2
+ 4.5.1
+ 1.0
+ 2.1.2
+ 1.19
+
+
+
\ No newline at end of file
diff --git a/libraries/src/main/java/com/baeldung/akka/FirstActor.java b/libraries-5/src/main/java/com/baeldung/akka/FirstActor.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/akka/FirstActor.java
rename to libraries-5/src/main/java/com/baeldung/akka/FirstActor.java
diff --git a/libraries/src/main/java/com/baeldung/akka/MyActor.java b/libraries-5/src/main/java/com/baeldung/akka/MyActor.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/akka/MyActor.java
rename to libraries-5/src/main/java/com/baeldung/akka/MyActor.java
diff --git a/libraries/src/main/java/com/baeldung/akka/PrinterActor.java b/libraries-5/src/main/java/com/baeldung/akka/PrinterActor.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/akka/PrinterActor.java
rename to libraries-5/src/main/java/com/baeldung/akka/PrinterActor.java
diff --git a/libraries/src/main/java/com/baeldung/akka/ReadingActor.java b/libraries-5/src/main/java/com/baeldung/akka/ReadingActor.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/akka/ReadingActor.java
rename to libraries-5/src/main/java/com/baeldung/akka/ReadingActor.java
diff --git a/libraries/src/main/java/com/baeldung/akka/WordCounterActor.java b/libraries-5/src/main/java/com/baeldung/akka/WordCounterActor.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/akka/WordCounterActor.java
rename to libraries-5/src/main/java/com/baeldung/akka/WordCounterActor.java
diff --git a/libraries/src/main/java/com/baeldung/bytebuddy/Bar.java b/libraries-5/src/main/java/com/baeldung/bytebuddy/Bar.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/bytebuddy/Bar.java
rename to libraries-5/src/main/java/com/baeldung/bytebuddy/Bar.java
diff --git a/libraries/src/main/java/com/baeldung/bytebuddy/Foo.java b/libraries-5/src/main/java/com/baeldung/bytebuddy/Foo.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/bytebuddy/Foo.java
rename to libraries-5/src/main/java/com/baeldung/bytebuddy/Foo.java
diff --git a/libraries/src/main/java/com/baeldung/caffeine/DataObject.java b/libraries-5/src/main/java/com/baeldung/caffeine/DataObject.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/caffeine/DataObject.java
rename to libraries-5/src/main/java/com/baeldung/caffeine/DataObject.java
diff --git a/libraries/src/main/java/com/baeldung/jctools/MpmcBenchmark.java b/libraries-5/src/main/java/com/baeldung/jctools/MpmcBenchmark.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jctools/MpmcBenchmark.java
rename to libraries-5/src/main/java/com/baeldung/jctools/MpmcBenchmark.java
diff --git a/libraries/src/main/java/com/baeldung/jctools/README.md b/libraries-5/src/main/java/com/baeldung/jctools/README.md
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jctools/README.md
rename to libraries-5/src/main/java/com/baeldung/jctools/README.md
diff --git a/libraries/src/main/java/com/baeldung/jnats/NatsClient.java b/libraries-5/src/main/java/com/baeldung/jnats/NatsClient.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/jnats/NatsClient.java
rename to libraries-5/src/main/java/com/baeldung/jnats/NatsClient.java
diff --git a/libraries/src/main/java/com/baeldung/streamex/Role.java b/libraries-5/src/main/java/com/baeldung/streamex/Role.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/streamex/Role.java
rename to libraries-5/src/main/java/com/baeldung/streamex/Role.java
diff --git a/libraries/src/main/java/com/baeldung/streamex/StreamEX.java b/libraries-5/src/main/java/com/baeldung/streamex/StreamEX.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/streamex/StreamEX.java
rename to libraries-5/src/main/java/com/baeldung/streamex/StreamEX.java
diff --git a/libraries/src/main/java/com/baeldung/streamex/User.java b/libraries-5/src/main/java/com/baeldung/streamex/User.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/streamex/User.java
rename to libraries-5/src/main/java/com/baeldung/streamex/User.java
diff --git a/libraries/src/test/java/com/baeldung/akka/AkkaActorsUnitTest.java b/libraries-5/src/test/java/com/baeldung/akka/AkkaActorsUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/akka/AkkaActorsUnitTest.java
rename to libraries-5/src/test/java/com/baeldung/akka/AkkaActorsUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java b/libraries-5/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java
rename to libraries-5/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java b/libraries-5/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java
similarity index 88%
rename from libraries/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java
rename to libraries-5/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java
index d523d0ff8b..65c441c50d 100644
--- a/libraries/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java
+++ b/libraries-5/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java
@@ -8,6 +8,7 @@ import java.util.concurrent.TimeUnit;
import javax.annotation.Nonnull;
+import org.junit.Assert;
import org.junit.Test;
import com.github.benmanes.caffeine.cache.*;
@@ -65,43 +66,43 @@ public class CaffeineUnitTest {
assertEquals("Data for " + key, dataObject.getData());
});
- cache.getAll(Arrays.asList("A", "B", "C")).thenAccept(dataObjectMap -> assertEquals(3, dataObjectMap.size()));
+ cache.getAll(Arrays.asList("A", "B", "C")).thenAccept(dataObjectMap -> Assert.assertEquals(3, dataObjectMap.size()));
}
@Test
public void givenLoadingCacheWithSmallSize_whenPut_thenSizeIsConstant() {
LoadingCache cache = Caffeine.newBuilder().maximumSize(1).refreshAfterWrite(10, TimeUnit.MINUTES).build(k -> DataObject.get("Data for " + k));
- assertEquals(0, cache.estimatedSize());
+ Assert.assertEquals(0, cache.estimatedSize());
cache.get("A");
- assertEquals(1, cache.estimatedSize());
+ Assert.assertEquals(1, cache.estimatedSize());
cache.get("B");
cache.cleanUp();
- assertEquals(1, cache.estimatedSize());
+ Assert.assertEquals(1, cache.estimatedSize());
}
@Test
public void givenLoadingCacheWithWeigher_whenPut_thenSizeIsConstant() {
LoadingCache cache = Caffeine.newBuilder().maximumWeight(10).weigher((k, v) -> 5).build(k -> DataObject.get("Data for " + k));
- assertEquals(0, cache.estimatedSize());
+ Assert.assertEquals(0, cache.estimatedSize());
cache.get("A");
- assertEquals(1, cache.estimatedSize());
+ Assert.assertEquals(1, cache.estimatedSize());
cache.get("B");
- assertEquals(2, cache.estimatedSize());
+ Assert.assertEquals(2, cache.estimatedSize());
cache.get("C");
cache.cleanUp();
- assertEquals(2, cache.estimatedSize());
+ Assert.assertEquals(2, cache.estimatedSize());
}
@Test
@@ -138,7 +139,7 @@ public class CaffeineUnitTest {
cache.get("A");
cache.get("A");
- assertEquals(1, cache.stats().hitCount());
- assertEquals(1, cache.stats().missCount());
+ Assert.assertEquals(1, cache.stats().hitCount());
+ Assert.assertEquals(1, cache.stats().missCount());
}
}
\ No newline at end of file
diff --git a/libraries/src/test/java/com/baeldung/dockerapi/ContainerLiveTest.java b/libraries-5/src/test/java/com/baeldung/dockerapi/ContainerLiveTest.java
similarity index 94%
rename from libraries/src/test/java/com/baeldung/dockerapi/ContainerLiveTest.java
rename to libraries-5/src/test/java/com/baeldung/dockerapi/ContainerLiveTest.java
index e6f0fd1c31..007c70355a 100644
--- a/libraries/src/test/java/com/baeldung/dockerapi/ContainerLiveTest.java
+++ b/libraries-5/src/test/java/com/baeldung/dockerapi/ContainerLiveTest.java
@@ -6,6 +6,8 @@ import com.github.dockerjava.api.command.InspectContainerResponse;
import com.github.dockerjava.api.model.Container;
import com.github.dockerjava.api.model.PortBinding;
import com.github.dockerjava.core.DockerClientBuilder;
+import org.hamcrest.MatcherAssert;
+import org.hamcrest.core.Is;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -51,7 +53,7 @@ public class ContainerLiveTest {
CreateContainerResponse container = dockerClient.createContainerCmd("mongo:3.6").withCmd("--bind_ip_all").withName("mongo").withHostName("baeldung").withEnv("MONGO_LATEST_VERSION=3.6").withPortBindings(PortBinding.parse("9999:27017")).exec();
// then
- assertThat(container.getId(), is(not(null)));
+ MatcherAssert.assertThat(container.getId(), is(not(null)));
}
@Test
@@ -104,7 +106,7 @@ public class ContainerLiveTest {
// then
InspectContainerResponse containerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- assertThat(containerResponse.getId(), is(container.getId()));
+ MatcherAssert.assertThat(containerResponse.getId(), Is.is(container.getId()));
}
@Test
diff --git a/libraries/src/test/java/com/baeldung/dockerapi/DockerClientLiveTest.java b/libraries-5/src/test/java/com/baeldung/dockerapi/DockerClientLiveTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/dockerapi/DockerClientLiveTest.java
rename to libraries-5/src/test/java/com/baeldung/dockerapi/DockerClientLiveTest.java
diff --git a/libraries/src/test/java/com/baeldung/dockerapi/ImageLiveTest.java b/libraries-5/src/test/java/com/baeldung/dockerapi/ImageLiveTest.java
similarity index 96%
rename from libraries/src/test/java/com/baeldung/dockerapi/ImageLiveTest.java
rename to libraries-5/src/test/java/com/baeldung/dockerapi/ImageLiveTest.java
index 7e8cd6a354..96e7922f2a 100644
--- a/libraries/src/test/java/com/baeldung/dockerapi/ImageLiveTest.java
+++ b/libraries-5/src/test/java/com/baeldung/dockerapi/ImageLiveTest.java
@@ -8,6 +8,8 @@ import com.github.dockerjava.core.DockerClientBuilder;
import com.github.dockerjava.core.command.BuildImageResultCallback;
import com.github.dockerjava.core.command.PullImageResultCallback;
import com.github.dockerjava.core.command.PushImageResultCallback;
+import org.hamcrest.MatcherAssert;
+import org.hamcrest.core.Is;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -81,7 +83,7 @@ public class ImageLiveTest {
InspectImageResponse imageResponse = dockerClient.inspectImageCmd(image.getId()).exec();
// then
- assertThat(imageResponse.getId(), is(image.getId()));
+ MatcherAssert.assertThat(imageResponse.getId(), Is.is(image.getId()));
}
@Test
diff --git a/libraries/src/test/java/com/baeldung/dockerapi/NetworkLiveTest.java b/libraries-5/src/test/java/com/baeldung/dockerapi/NetworkLiveTest.java
similarity index 95%
rename from libraries/src/test/java/com/baeldung/dockerapi/NetworkLiveTest.java
rename to libraries-5/src/test/java/com/baeldung/dockerapi/NetworkLiveTest.java
index d3abbe2e7e..31ad32c7b5 100644
--- a/libraries/src/test/java/com/baeldung/dockerapi/NetworkLiveTest.java
+++ b/libraries-5/src/test/java/com/baeldung/dockerapi/NetworkLiveTest.java
@@ -5,6 +5,7 @@ import com.github.dockerjava.api.command.CreateNetworkResponse;
import com.github.dockerjava.api.model.Network;
import com.github.dockerjava.api.model.Network.Ipam;
import com.github.dockerjava.core.DockerClientBuilder;
+import org.hamcrest.MatcherAssert;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
@@ -64,7 +65,7 @@ public class NetworkLiveTest {
Network network = dockerClient.inspectNetworkCmd().withNetworkId(networkName).exec();
// then
- assertThat(network.getName(), is(networkName));
+ MatcherAssert.assertThat(network.getName(), is(networkName));
}
@Test
diff --git a/libraries/src/test/java/com/baeldung/dockerapi/VolumeLiveTest.java b/libraries-5/src/test/java/com/baeldung/dockerapi/VolumeLiveTest.java
similarity index 92%
rename from libraries/src/test/java/com/baeldung/dockerapi/VolumeLiveTest.java
rename to libraries-5/src/test/java/com/baeldung/dockerapi/VolumeLiveTest.java
index 9e60a76b33..f2a078b2c6 100644
--- a/libraries/src/test/java/com/baeldung/dockerapi/VolumeLiveTest.java
+++ b/libraries-5/src/test/java/com/baeldung/dockerapi/VolumeLiveTest.java
@@ -5,6 +5,7 @@ import com.github.dockerjava.api.command.CreateVolumeResponse;
import com.github.dockerjava.api.command.InspectVolumeResponse;
import com.github.dockerjava.api.command.ListVolumesResponse;
import com.github.dockerjava.core.DockerClientBuilder;
+import org.hamcrest.MatcherAssert;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -57,7 +58,7 @@ public class VolumeLiveTest {
CreateVolumeResponse unnamedVolume = dockerClient.createVolumeCmd().exec();
// then
- assertThat(unnamedVolume.getName(), is(not(null)));
+ MatcherAssert.assertThat(unnamedVolume.getName(), is(not(null)));
}
@Test
@@ -67,7 +68,7 @@ public class VolumeLiveTest {
CreateVolumeResponse namedVolume = dockerClient.createVolumeCmd().withName("myNamedVolume").exec();
// then
- assertThat(namedVolume.getName(), is(not(null)));
+ MatcherAssert.assertThat(namedVolume.getName(), is(not(null)));
}
@Test
diff --git a/libraries/src/test/java/com/baeldung/atlassian/fugue/FugueUnitTest.java b/libraries-5/src/test/java/com/baeldung/fugue/FugueUnitTest.java
similarity index 99%
rename from libraries/src/test/java/com/baeldung/atlassian/fugue/FugueUnitTest.java
rename to libraries-5/src/test/java/com/baeldung/fugue/FugueUnitTest.java
index 773e39b76a..c3a89a1355 100644
--- a/libraries/src/test/java/com/baeldung/atlassian/fugue/FugueUnitTest.java
+++ b/libraries-5/src/test/java/com/baeldung/fugue/FugueUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.atlassian.fugue;
+package com.baeldung.fugue;
import io.atlassian.fugue.*;
import org.junit.Assert;
diff --git a/libraries/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java b/libraries-5/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java
similarity index 88%
rename from libraries/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java
rename to libraries-5/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java
index 4a9d0fadb2..a5dacdbdac 100644
--- a/libraries/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java
+++ b/libraries-5/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java
@@ -1,5 +1,6 @@
package com.baeldung.jctools;
+import org.assertj.core.api.Assertions;
import org.jctools.queues.SpscArrayQueue;
import org.jctools.queues.SpscChunkedArrayQueue;
import org.junit.Test;
@@ -44,16 +45,16 @@ public class JCToolsUnitTest {
@Test
public void whenQueueIsFull_thenNoMoreElementsCanBeAdded() throws InterruptedException {
SpscChunkedArrayQueue queue = new SpscChunkedArrayQueue<>(8, 16);
- assertThat(queue.capacity()).isEqualTo(16);
+ Assertions.assertThat(queue.capacity()).isEqualTo(16);
CountDownLatch startConsuming = new CountDownLatch(1);
CountDownLatch awakeProducer = new CountDownLatch(1);
AtomicReference error = new AtomicReference<>();
Thread producer = new Thread(() -> {
IntStream.range(0, queue.capacity()).forEach(i -> {
- assertThat(queue.offer(i)).isTrue();
+ Assertions.assertThat(queue.offer(i)).isTrue();
});
- assertThat(queue.offer(queue.capacity())).isFalse();
+ Assertions.assertThat(queue.offer(queue.capacity())).isFalse();
startConsuming.countDown();
try {
awakeProducer.await();
@@ -61,7 +62,7 @@ public class JCToolsUnitTest {
throw new RuntimeException(e);
}
- assertThat(queue.offer(queue.capacity())).isTrue();
+ Assertions.assertThat(queue.offer(queue.capacity())).isTrue();
});
producer.setUncaughtExceptionHandler((t, e) -> {
error.set(e);
diff --git a/libraries/src/test/java/com/baeldung/jnats/NatsClientLiveTest.java b/libraries-5/src/test/java/com/baeldung/jnats/NatsClientLiveTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/jnats/NatsClientLiveTest.java
rename to libraries-5/src/test/java/com/baeldung/jnats/NatsClientLiveTest.java
diff --git a/libraries/src/test/java/com/baeldung/jool/JOOLUnitTest.java b/libraries-5/src/test/java/com/baeldung/jool/JOOLUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/jool/JOOLUnitTest.java
rename to libraries-5/src/test/java/com/baeldung/jool/JOOLUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java b/libraries-5/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java
rename to libraries-5/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/stream/StreamExMergeStreamsUnitTest.java b/libraries-5/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java
similarity index 98%
rename from libraries/src/test/java/com/baeldung/stream/StreamExMergeStreamsUnitTest.java
rename to libraries-5/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java
index 220348bf36..b267eaea9b 100644
--- a/libraries/src/test/java/com/baeldung/stream/StreamExMergeStreamsUnitTest.java
+++ b/libraries-5/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.stream;
+package com.baeldung.streamex;
import one.util.streamex.StreamEx;
import org.junit.Test;
diff --git a/libraries/src/test/resources/dockerapi/Dockerfile b/libraries-5/src/test/resources/dockerapi/Dockerfile
similarity index 100%
rename from libraries/src/test/resources/dockerapi/Dockerfile
rename to libraries-5/src/test/resources/dockerapi/Dockerfile
diff --git a/libraries-6/README.md b/libraries-6/README.md
new file mode 100644
index 0000000000..79bb83113e
--- /dev/null
+++ b/libraries-6/README.md
@@ -0,0 +1,17 @@
+## Libraries-6
+
+This module contains articles about various Java libraries.
+These are small libraries that are relatively easy to use and do not require any separate module of their own.
+
+The code examples related to different libraries are each in their own module.
+
+Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-modules) we already have separate modules. Please make sure to have a look at the existing modules in such cases.
+
+### Relevant articles
+- [Introduction to JavaPoet](https://www.baeldung.com/java-poet)
+- [Guide to Resilience4j](https://www.baeldung.com/resilience4j)
+- [Implementing a FTP-Client in Java](https://www.baeldung.com/java-ftp-client)
+- [Introduction to Functional Java](https://www.baeldung.com/java-functional-library)
+- [A Guide to the Reflections Library](https://www.baeldung.com/reflections-library)
+- [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once)
+- More articles [[<-- prev]](/libraries-5)
diff --git a/libraries-6/pom.xml b/libraries-6/pom.xml
new file mode 100644
index 0000000000..030e5aa77b
--- /dev/null
+++ b/libraries-6/pom.xml
@@ -0,0 +1,111 @@
+
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+ 4.0.0
+
+ libraries-6
+
+
+
+ org.functionaljava
+ functionaljava-java8
+ ${functionaljava.version}
+
+
+ com.codepoetics
+ protonpack
+ ${protonpack.version}
+
+
+ org.apache.kafka
+ kafka-streams
+ ${kafka.version}
+
+
+ org.apache.kafka
+ kafka-clients
+ ${kafka.version}
+ test
+ test
+
+
+ io.github.resilience4j
+ resilience4j-circuitbreaker
+ ${resilience4j.version}
+
+
+ io.github.resilience4j
+ resilience4j-bulkhead
+ ${resilience4j.version}
+
+
+ io.github.resilience4j
+ resilience4j-retry
+ ${resilience4j.version}
+
+
+ io.github.resilience4j
+ resilience4j-timelimiter
+ ${resilience4j.version}
+
+
+ com.squareup
+ javapoet
+ ${javapoet.version}
+
+
+ org.mockftpserver
+ MockFtpServer
+ ${mockftpserver.version}
+ test
+
+
+
+ org.reflections
+ reflections
+ ${reflections.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ commons-net
+ commons-net
+ ${commons-net.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+
+
+ commons-io
+ commons-io
+ ${commonsio.version}
+ test
+
+
+
+
+ 2.0.0
+ 1.10.0
+ 0.9.11
+ 2.7.1
+ 4.8.1
+ 0.12.1
+ 1.15
+ 3.6
+ 3.6.2
+ 2.6
+
+
+
+
\ No newline at end of file
diff --git a/libraries/src/main/java/com/baeldung/fj/FunctionalJavaIOMain.java b/libraries-6/src/main/java/com/baeldung/fj/FunctionalJavaIOMain.java
similarity index 96%
rename from libraries/src/main/java/com/baeldung/fj/FunctionalJavaIOMain.java
rename to libraries-6/src/main/java/com/baeldung/fj/FunctionalJavaIOMain.java
index eaa201d1ba..e97f128b30 100644
--- a/libraries/src/main/java/com/baeldung/fj/FunctionalJavaIOMain.java
+++ b/libraries-6/src/main/java/com/baeldung/fj/FunctionalJavaIOMain.java
@@ -1,43 +1,43 @@
-package com.baeldung.fj;
-
-import fj.F;
-import fj.F1Functions;
-import fj.Unit;
-import fj.data.IO;
-import fj.data.IOFunctions;
-
-public class FunctionalJavaIOMain {
-
- public static IO printLetters(final String s) {
- return () -> {
- for (int i = 0; i < s.length(); i++) {
- System.out.println(s.charAt(i));
- }
- return Unit.unit();
- };
- }
-
- public static void main(String[] args) {
-
- F> printLetters = i -> printLetters(i);
-
- IO lowerCase = IOFunctions.stdoutPrintln("What's your first Name ?");
-
- IO input = IOFunctions.stdoutPrint("First Name: ");
-
- IO userInput = IOFunctions.append(lowerCase, input);
-
- IO readInput = IOFunctions.stdinReadLine();
-
- F toUpperCase = i -> i.toUpperCase();
-
- F> transformInput = F1Functions., String> o(printLetters).f(toUpperCase);
-
- IO readAndPrintResult = IOFunctions.bind(readInput, transformInput);
-
- IO program = IOFunctions.bind(userInput, nothing -> readAndPrintResult);
-
- IOFunctions.toSafe(program).run();
-
- }
-}
+package com.baeldung.fj;
+
+import fj.F;
+import fj.F1Functions;
+import fj.Unit;
+import fj.data.IO;
+import fj.data.IOFunctions;
+
+public class FunctionalJavaIOMain {
+
+ public static IO printLetters(final String s) {
+ return () -> {
+ for (int i = 0; i < s.length(); i++) {
+ System.out.println(s.charAt(i));
+ }
+ return Unit.unit();
+ };
+ }
+
+ public static void main(String[] args) {
+
+ F> printLetters = i -> printLetters(i);
+
+ IO lowerCase = IOFunctions.stdoutPrintln("What's your first Name ?");
+
+ IO input = IOFunctions.stdoutPrint("First Name: ");
+
+ IO userInput = IOFunctions.append(lowerCase, input);
+
+ IO readInput = IOFunctions.stdinReadLine();
+
+ F toUpperCase = i -> i.toUpperCase();
+
+ F> transformInput = F1Functions., String> o(printLetters).f(toUpperCase);
+
+ IO readAndPrintResult = IOFunctions.bind(readInput, transformInput);
+
+ IO program = IOFunctions.bind(userInput, nothing -> readAndPrintResult);
+
+ IOFunctions.toSafe(program).run();
+
+ }
+}
diff --git a/libraries/src/main/java/com/baeldung/fj/FunctionalJavaMain.java b/libraries-6/src/main/java/com/baeldung/fj/FunctionalJavaMain.java
similarity index 96%
rename from libraries/src/main/java/com/baeldung/fj/FunctionalJavaMain.java
rename to libraries-6/src/main/java/com/baeldung/fj/FunctionalJavaMain.java
index c6412f2923..1a59e6c22a 100644
--- a/libraries/src/main/java/com/baeldung/fj/FunctionalJavaMain.java
+++ b/libraries-6/src/main/java/com/baeldung/fj/FunctionalJavaMain.java
@@ -1,48 +1,48 @@
-package com.baeldung.fj;
-
-import fj.F;
-import fj.Show;
-import fj.data.Array;
-import fj.data.List;
-import fj.data.Option;
-import fj.function.Characters;
-import fj.function.Integers;
-
-public class FunctionalJavaMain {
-
- public static final F isEven = i -> i % 2 == 0;
-
- public static void main(String[] args) {
-
- List fList = List.list(3, 4, 5, 6);
- List evenList = fList.map(isEven);
- Show.listShow(Show.booleanShow).println(evenList);
-
- fList = fList.map(i -> i + 1);
- Show.listShow(Show.intShow).println(fList);
-
- Array a = Array.array(17, 44, 67, 2, 22, 80, 1, 27);
- Array b = a.filter(Integers.even);
- Show.arrayShow(Show.intShow).println(b);
-
- Array array = Array.array("Welcome", "To", "baeldung");
- Boolean isExist = array.exists(s -> List.fromString(s).forall(Characters.isLowerCase));
- System.out.println(isExist);
-
- Array intArray = Array.array(17, 44, 67, 2, 22, 80, 1, 27);
- int sum = intArray.foldLeft(Integers.add, 0);
- System.out.println(sum);
-
- Option n1 = Option.some(1);
- Option n2 = Option.some(2);
-
- F> f1 = i -> i % 2 == 0 ? Option.some(i + 100) : Option.none();
-
- Option result1 = n1.bind(f1);
- Option result2 = n2.bind(f1);
-
- Show.optionShow(Show.intShow).println(result1);
- Show.optionShow(Show.intShow).println(result2);
- }
-
-}
+package com.baeldung.fj;
+
+import fj.F;
+import fj.Show;
+import fj.data.Array;
+import fj.data.List;
+import fj.data.Option;
+import fj.function.Characters;
+import fj.function.Integers;
+
+public class FunctionalJavaMain {
+
+ public static final F isEven = i -> i % 2 == 0;
+
+ public static void main(String[] args) {
+
+ List fList = List.list(3, 4, 5, 6);
+ List evenList = fList.map(isEven);
+ Show.listShow(Show.booleanShow).println(evenList);
+
+ fList = fList.map(i -> i + 1);
+ Show.listShow(Show.intShow).println(fList);
+
+ Array a = Array.array(17, 44, 67, 2, 22, 80, 1, 27);
+ Array b = a.filter(Integers.even);
+ Show.arrayShow(Show.intShow).println(b);
+
+ Array array = Array.array("Welcome", "To", "baeldung");
+ Boolean isExist = array.exists(s -> List.fromString(s).forall(Characters.isLowerCase));
+ System.out.println(isExist);
+
+ Array intArray = Array.array(17, 44, 67, 2, 22, 80, 1, 27);
+ int sum = intArray.foldLeft(Integers.add, 0);
+ System.out.println(sum);
+
+ Option n1 = Option.some(1);
+ Option n2 = Option.some(2);
+
+ F> f1 = i -> i % 2 == 0 ? Option.some(i + 100) : Option.none();
+
+ Option result1 = n1.bind(f1);
+ Option result2 = n2.bind(f1);
+
+ Show.optionShow(Show.intShow).println(result1);
+ Show.optionShow(Show.intShow).println(result2);
+ }
+
+}
diff --git a/libraries/src/main/java/com/baeldung/ftp/FtpClient.java b/libraries-6/src/main/java/com/baeldung/ftp/FtpClient.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/ftp/FtpClient.java
rename to libraries-6/src/main/java/com/baeldung/ftp/FtpClient.java
diff --git a/libraries/src/main/java/com/baeldung/javapoet/PersonGenerator.java b/libraries-6/src/main/java/com/baeldung/javapoet/PersonGenerator.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/javapoet/PersonGenerator.java
rename to libraries-6/src/main/java/com/baeldung/javapoet/PersonGenerator.java
diff --git a/libraries/src/main/java/com/baeldung/kafka/TransactionalMessageProducer.java b/libraries-6/src/main/java/com/baeldung/kafka/TransactionalMessageProducer.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/kafka/TransactionalMessageProducer.java
rename to libraries-6/src/main/java/com/baeldung/kafka/TransactionalMessageProducer.java
diff --git a/libraries/src/main/java/com/baeldung/kafka/TransactionalWordCount.java b/libraries-6/src/main/java/com/baeldung/kafka/TransactionalWordCount.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/kafka/TransactionalWordCount.java
rename to libraries-6/src/main/java/com/baeldung/kafka/TransactionalWordCount.java
diff --git a/libraries/src/main/java/com/baeldung/kafka/Tuple.java b/libraries-6/src/main/java/com/baeldung/kafka/Tuple.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/kafka/Tuple.java
rename to libraries-6/src/main/java/com/baeldung/kafka/Tuple.java
diff --git a/libraries/src/main/java/com/baeldung/reflections/ReflectionsApp.java b/libraries-6/src/main/java/com/baeldung/reflections/ReflectionsApp.java
similarity index 97%
rename from libraries/src/main/java/com/baeldung/reflections/ReflectionsApp.java
rename to libraries-6/src/main/java/com/baeldung/reflections/ReflectionsApp.java
index 30da8ea837..4f5b6dd183 100644
--- a/libraries/src/main/java/com/baeldung/reflections/ReflectionsApp.java
+++ b/libraries-6/src/main/java/com/baeldung/reflections/ReflectionsApp.java
@@ -1,71 +1,71 @@
-package com.baeldung.reflections;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.util.Date;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-import org.reflections.Reflections;
-import org.reflections.scanners.MethodAnnotationsScanner;
-import org.reflections.scanners.MethodParameterScanner;
-import org.reflections.scanners.ResourcesScanner;
-import org.reflections.scanners.Scanner;
-import org.reflections.scanners.SubTypesScanner;
-import org.reflections.util.ClasspathHelper;
-import org.reflections.util.ConfigurationBuilder;
-
-public class ReflectionsApp {
-
- public Set> getReflectionsSubTypes() {
- Reflections reflections = new Reflections("org.reflections");
- Set> scannersSet = reflections.getSubTypesOf(Scanner.class);
- return scannersSet;
- }
-
- public Set> getJDKFunctinalInterfaces() {
- Reflections reflections = new Reflections("java.util.function");
- Set> typesSet = reflections.getTypesAnnotatedWith(FunctionalInterface.class);
- return typesSet;
- }
-
- public Set getDateDeprecatedMethods() {
- Reflections reflections = new Reflections(java.util.Date.class, new MethodAnnotationsScanner());
- Set deprecatedMethodsSet = reflections.getMethodsAnnotatedWith(Deprecated.class);
- return deprecatedMethodsSet;
- }
-
- @SuppressWarnings("rawtypes")
- public Set getDateDeprecatedConstructors() {
- Reflections reflections = new Reflections(java.util.Date.class, new MethodAnnotationsScanner());
- Set constructorsSet = reflections.getConstructorsAnnotatedWith(Deprecated.class);
- return constructorsSet;
- }
-
- public Set getMethodsWithDateParam() {
- Reflections reflections = new Reflections(java.text.SimpleDateFormat.class, new MethodParameterScanner());
- Set methodsSet = reflections.getMethodsMatchParams(Date.class);
- return methodsSet;
- }
-
- public Set getMethodsWithVoidReturn() {
- Reflections reflections = new Reflections(java.text.SimpleDateFormat.class, new MethodParameterScanner());
- Set methodsSet = reflections.getMethodsReturn(void.class);
- return methodsSet;
- }
-
- public Set getPomXmlPaths() {
- Reflections reflections = new Reflections(new ResourcesScanner());
- Set resourcesSet = reflections.getResources(Pattern.compile(".*pom\\.xml"));
- return resourcesSet;
- }
-
- public Set> getReflectionsSubTypesUsingBuilder() {
- Reflections reflections = new Reflections(new ConfigurationBuilder().setUrls(ClasspathHelper.forPackage("org.reflections"))
- .setScanners(new SubTypesScanner()));
-
- Set> scannersSet = reflections.getSubTypesOf(Scanner.class);
- return scannersSet;
- }
-
-}
+package com.baeldung.reflections;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.Date;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import org.reflections.Reflections;
+import org.reflections.scanners.MethodAnnotationsScanner;
+import org.reflections.scanners.MethodParameterScanner;
+import org.reflections.scanners.ResourcesScanner;
+import org.reflections.scanners.Scanner;
+import org.reflections.scanners.SubTypesScanner;
+import org.reflections.util.ClasspathHelper;
+import org.reflections.util.ConfigurationBuilder;
+
+public class ReflectionsApp {
+
+ public Set> getReflectionsSubTypes() {
+ Reflections reflections = new Reflections("org.reflections");
+ Set> scannersSet = reflections.getSubTypesOf(Scanner.class);
+ return scannersSet;
+ }
+
+ public Set> getJDKFunctinalInterfaces() {
+ Reflections reflections = new Reflections("java.util.function");
+ Set> typesSet = reflections.getTypesAnnotatedWith(FunctionalInterface.class);
+ return typesSet;
+ }
+
+ public Set getDateDeprecatedMethods() {
+ Reflections reflections = new Reflections(java.util.Date.class, new MethodAnnotationsScanner());
+ Set deprecatedMethodsSet = reflections.getMethodsAnnotatedWith(Deprecated.class);
+ return deprecatedMethodsSet;
+ }
+
+ @SuppressWarnings("rawtypes")
+ public Set getDateDeprecatedConstructors() {
+ Reflections reflections = new Reflections(java.util.Date.class, new MethodAnnotationsScanner());
+ Set constructorsSet = reflections.getConstructorsAnnotatedWith(Deprecated.class);
+ return constructorsSet;
+ }
+
+ public Set getMethodsWithDateParam() {
+ Reflections reflections = new Reflections(java.text.SimpleDateFormat.class, new MethodParameterScanner());
+ Set methodsSet = reflections.getMethodsMatchParams(Date.class);
+ return methodsSet;
+ }
+
+ public Set getMethodsWithVoidReturn() {
+ Reflections reflections = new Reflections(java.text.SimpleDateFormat.class, new MethodParameterScanner());
+ Set methodsSet = reflections.getMethodsReturn(void.class);
+ return methodsSet;
+ }
+
+ public Set getPomXmlPaths() {
+ Reflections reflections = new Reflections(new ResourcesScanner());
+ Set resourcesSet = reflections.getResources(Pattern.compile(".*pom\\.xml"));
+ return resourcesSet;
+ }
+
+ public Set> getReflectionsSubTypesUsingBuilder() {
+ Reflections reflections = new Reflections(new ConfigurationBuilder().setUrls(ClasspathHelper.forPackage("org.reflections"))
+ .setScanners(new SubTypesScanner()));
+
+ Set> scannersSet = reflections.getSubTypesOf(Scanner.class);
+ return scannersSet;
+ }
+
+}
diff --git a/libraries/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java b/libraries-6/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java
similarity index 95%
rename from libraries/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java
rename to libraries-6/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java
index 97ead07470..f79d334b23 100644
--- a/libraries/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java
+++ b/libraries-6/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java
@@ -4,6 +4,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import org.junit.Assert;
import org.junit.Test;
import fj.F;
@@ -96,9 +97,9 @@ public class FunctionalJavaUnitTest {
Option result2 = n2.bind(function);
Option result3 = n3.bind(function);
- assertEquals(Option.none(), result1);
- assertEquals(Option.some(102), result2);
- assertEquals(Option.none(), result3);
+ Assert.assertEquals(Option.none(), result1);
+ Assert.assertEquals(Option.some(102), result2);
+ Assert.assertEquals(Option.none(), result3);
}
@Test
diff --git a/libraries/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java b/libraries-6/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java
rename to libraries-6/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java
diff --git a/libraries/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java b/libraries-6/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java
rename to libraries-6/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java
diff --git a/libraries/src/test/java/com/baeldung/javapoet/test/PersonGeneratorUnitTest.java b/libraries-6/src/test/java/com/baeldung/javapoet/test/PersonGeneratorUnitTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/javapoet/test/PersonGeneratorUnitTest.java
rename to libraries-6/src/test/java/com/baeldung/javapoet/test/PersonGeneratorUnitTest.java
diff --git a/libraries/src/test/java/com/baeldung/javapoet/test/person/Gender.java b/libraries-6/src/test/java/com/baeldung/javapoet/test/person/Gender.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/javapoet/test/person/Gender.java
rename to libraries-6/src/test/java/com/baeldung/javapoet/test/person/Gender.java
diff --git a/libraries/src/test/java/com/baeldung/javapoet/test/person/Person.java b/libraries-6/src/test/java/com/baeldung/javapoet/test/person/Person.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/javapoet/test/person/Person.java
rename to libraries-6/src/test/java/com/baeldung/javapoet/test/person/Person.java
diff --git a/libraries/src/test/java/com/baeldung/javapoet/test/person/Student.java b/libraries-6/src/test/java/com/baeldung/javapoet/test/person/Student.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/javapoet/test/person/Student.java
rename to libraries-6/src/test/java/com/baeldung/javapoet/test/person/Student.java
diff --git a/libraries/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java b/libraries-6/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java
rename to libraries-6/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java
diff --git a/libraries/src/test/java/com/baeldung/reflections/ReflectionsUnitTest.java b/libraries-6/src/test/java/com/baeldung/reflections/ReflectionsUnitTest.java
similarity index 96%
rename from libraries/src/test/java/com/baeldung/reflections/ReflectionsUnitTest.java
rename to libraries-6/src/test/java/com/baeldung/reflections/ReflectionsUnitTest.java
index 9a3ef0747b..b86094b6f4 100644
--- a/libraries/src/test/java/com/baeldung/reflections/ReflectionsUnitTest.java
+++ b/libraries-6/src/test/java/com/baeldung/reflections/ReflectionsUnitTest.java
@@ -1,50 +1,50 @@
-package com.baeldung.reflections;
-
-import static org.junit.jupiter.api.Assertions.assertFalse;
-
-import org.junit.jupiter.api.Test;
-
-public class ReflectionsUnitTest {
-
- @Test
- public void givenTypeThenGetAllSubTypes() {
- ReflectionsApp reflectionsApp = new ReflectionsApp();
- assertFalse(reflectionsApp.getReflectionsSubTypes()
- .isEmpty());
- }
-
- @Test
- public void givenTypeAndUsingBuilderThenGetAllSubTypes() {
- ReflectionsApp reflectionsApp = new ReflectionsApp();
- assertFalse(reflectionsApp.getReflectionsSubTypesUsingBuilder()
- .isEmpty());
- }
-
- @Test
- public void givenAnnotationThenGetAllAnnotatedMethods() {
- ReflectionsApp reflectionsApp = new ReflectionsApp();
- assertFalse(reflectionsApp.getDateDeprecatedMethods()
- .isEmpty());
- }
-
- @Test
- public void givenAnnotationThenGetAllAnnotatedConstructors() {
- ReflectionsApp reflectionsApp = new ReflectionsApp();
- assertFalse(reflectionsApp.getDateDeprecatedConstructors()
- .isEmpty());
- }
-
- @Test
- public void givenParamTypeThenGetAllMethods() {
- ReflectionsApp reflectionsApp = new ReflectionsApp();
- assertFalse(reflectionsApp.getMethodsWithDateParam()
- .isEmpty());
- }
-
- @Test
- public void givenReturnTypeThenGetAllMethods() {
- ReflectionsApp reflectionsApp = new ReflectionsApp();
- assertFalse(reflectionsApp.getMethodsWithVoidReturn()
- .isEmpty());
- }
-}
+package com.baeldung.reflections;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+import org.junit.jupiter.api.Test;
+
+public class ReflectionsUnitTest {
+
+ @Test
+ public void givenTypeThenGetAllSubTypes() {
+ ReflectionsApp reflectionsApp = new ReflectionsApp();
+ assertFalse(reflectionsApp.getReflectionsSubTypes()
+ .isEmpty());
+ }
+
+ @Test
+ public void givenTypeAndUsingBuilderThenGetAllSubTypes() {
+ ReflectionsApp reflectionsApp = new ReflectionsApp();
+ assertFalse(reflectionsApp.getReflectionsSubTypesUsingBuilder()
+ .isEmpty());
+ }
+
+ @Test
+ public void givenAnnotationThenGetAllAnnotatedMethods() {
+ ReflectionsApp reflectionsApp = new ReflectionsApp();
+ assertFalse(reflectionsApp.getDateDeprecatedMethods()
+ .isEmpty());
+ }
+
+ @Test
+ public void givenAnnotationThenGetAllAnnotatedConstructors() {
+ ReflectionsApp reflectionsApp = new ReflectionsApp();
+ assertFalse(reflectionsApp.getDateDeprecatedConstructors()
+ .isEmpty());
+ }
+
+ @Test
+ public void givenParamTypeThenGetAllMethods() {
+ ReflectionsApp reflectionsApp = new ReflectionsApp();
+ assertFalse(reflectionsApp.getMethodsWithDateParam()
+ .isEmpty());
+ }
+
+ @Test
+ public void givenReturnTypeThenGetAllMethods() {
+ ReflectionsApp reflectionsApp = new ReflectionsApp();
+ assertFalse(reflectionsApp.getMethodsWithVoidReturn()
+ .isEmpty());
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/resilience4j/Resilience4jUnitTest.java b/libraries-6/src/test/java/com/baeldung/resilence4j/Resilience4jUnitTest.java
similarity index 99%
rename from libraries/src/test/java/com/baeldung/resilience4j/Resilience4jUnitTest.java
rename to libraries-6/src/test/java/com/baeldung/resilence4j/Resilience4jUnitTest.java
index ced95c99cb..1d69d20bc2 100644
--- a/libraries/src/test/java/com/baeldung/resilience4j/Resilience4jUnitTest.java
+++ b/libraries-6/src/test/java/com/baeldung/resilence4j/Resilience4jUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.resilience4j;
+package com.baeldung.resilence4j;
import io.github.resilience4j.bulkhead.Bulkhead;
import io.github.resilience4j.bulkhead.BulkheadConfig;
diff --git a/libraries/src/test/resources/ftp/baz.txt b/libraries-6/src/test/resources/ftp/baz.txt
similarity index 100%
rename from libraries/src/test/resources/ftp/baz.txt
rename to libraries-6/src/test/resources/ftp/baz.txt
diff --git a/libraries-testing/README.md b/libraries-testing/README.md
index 7098c10d28..ffdefe4b19 100644
--- a/libraries-testing/README.md
+++ b/libraries-testing/README.md
@@ -11,4 +11,4 @@ This module contains articles about test libraries.
- [Introduction to Awaitlity](https://www.baeldung.com/awaitlity-testing)
- [Introduction to Hoverfly in Java](https://www.baeldung.com/hoverfly)
- [Testing with Hamcrest](https://www.baeldung.com/java-junit-hamcrest-guide)
-- [Introduction To DBUnit](https://www.baeldung.com/dbunit)
+- [Introduction To DBUnit](https://www.baeldung.com/java-dbunit)
diff --git a/libraries/README.md b/libraries/README.md
index 79ba8fe55d..b61289504c 100644
--- a/libraries/README.md
+++ b/libraries/README.md
@@ -19,30 +19,4 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m
- [Software Transactional Memory in Java Using Multiverse](https://www.baeldung.com/java-multiverse-stm)
- [Locality-Sensitive Hashing in Java Using Java-LSH](https://www.baeldung.com/locality-sensitive-hashing)
- [Introduction to Neuroph](https://www.baeldung.com/neuroph)
-- [Quick Guide to RSS with Rome](https://www.baeldung.com/rome-rss)
-- [Introduction to PCollections](https://www.baeldung.com/java-pcollections)
-- [Introduction to Eclipse Collections](https://www.baeldung.com/eclipse-collections)
-- [DistinctBy in the Java Stream API](https://www.baeldung.com/java-streams-distinct-by)
-- [Introduction to NoException](https://www.baeldung.com/no-exception)
-- [Spring Yarg Integration](https://www.baeldung.com/spring-yarg)
-- [Delete a Directory Recursively in Java](https://www.baeldung.com/java-delete-directory)
-- [Guide to JDeferred](https://www.baeldung.com/jdeferred)
-- [Introduction to MBassador](https://www.baeldung.com/mbassador)
-- [Using Pairs in Java](https://www.baeldung.com/java-pairs)
-- [Introduction to Caffeine](https://www.baeldung.com/java-caching-caffeine)
-- [Introduction to StreamEx](https://www.baeldung.com/streamex)
-- [A Docker Guide for Java](https://www.baeldung.com/docker-java-api)
-- [Introduction to Akka Actors in Java](https://www.baeldung.com/akka-actors-java)
-- [A Guide to Byte Buddy](https://www.baeldung.com/byte-buddy)
-- [Introduction to jOOL](https://www.baeldung.com/jool)
-- [Consumer Driven Contracts with Pact](https://www.baeldung.com/pact-junit-consumer-driven-contracts)
-- [Introduction to Atlassian Fugue](https://www.baeldung.com/java-fugue)
-- [Publish and Receive Messages with Nats Java Client](https://www.baeldung.com/nats-java-client)
-- [Java Concurrency Utility with JCTools](https://www.baeldung.com/java-concurrency-jc-tools)
-- [Introduction to JavaPoet](https://www.baeldung.com/java-poet)
-- [Guide to Resilience4j](https://www.baeldung.com/resilience4j)
-- [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once)
-- [Implementing a FTP-Client in Java](https://www.baeldung.com/java-ftp-client)
-- [Introduction to Functional Java](https://www.baeldung.com/java-functional-library)
-- [A Guide to the Reflections Library](https://www.baeldung.com/reflections-library)
- More articles [[next -->]](/libraries-2)
diff --git a/libraries/pom.xml b/libraries/pom.xml
index 41bc2b9311..fee66f928d 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -12,18 +12,6 @@
-
-
- com.typesafe.akka
- akka-actor_2.12
- ${typesafe-akka.version}
-
-
- com.typesafe.akka
- akka-testkit_2.12
- ${typesafe-akka.version}
- test
-
org.beykery
@@ -63,18 +51,6 @@
javers-core
${javers.version}
-
-
- io.nats
- jnats
- ${jnats.version}
-
-
-
- rome
- rome
- ${rome.version}
-
net.serenity-bdd
serenity-core
@@ -218,11 +194,6 @@
quartz
${quartz.version}
-
- one.util
- streamex
- ${streamex.version}
-
org.jooq
jool
@@ -245,28 +216,9 @@
${java-lsh.version}
- au.com.dius
- pact-jvm-consumer-junit_2.11
- ${pact.version}
- test
-
-
- org.codehaus.groovy
- groovy-all
-
-
-
-
- org.awaitility
- awaitility
- ${awaitility.version}
- test
-
-
- org.awaitility
- awaitility-proxy
- ${awaitility.version}
- test
+ commons-io
+ commons-io
+ ${commonsio.version}
org.hamcrest
@@ -274,89 +226,12 @@
${org.hamcrest.java-hamcrest.version}
test
-
- net.bytebuddy
- byte-buddy
- ${bytebuddy.version}
-
-
- net.bytebuddy
- byte-buddy-agent
- ${bytebuddy.version}
-
-
- org.pcollections
- pcollections
- ${pcollections.version}
-
-
- com.machinezoo.noexception
- noexception
- ${noexception.version}
-
-
- org.eclipse.collections
- eclipse-collections
- ${eclipse-collections.version}
-
-
- io.vavr
- vavr
- ${vavr.version}
-
-
- com.haulmont.yarg
- yarg
- ${yarg.version}
-
-
- net.engio
- mbassador
- ${mbassador.version}
-
-
- org.jdeferred
- jdeferred-core
- ${jdeferred.version}
-
com.codepoetics
protonpack
${protonpack.version}
-
- org.functionaljava
- functionaljava-java8
- ${functionaljava.version}
-
-
- com.github.ben-manes.caffeine
- caffeine
- ${caffeine.version}
-
-
-
-
- com.github.docker-java
- docker-java
- ${docker.version}
-
-
- org.slf4j
- slf4j-log4j12
-
-
- org.slf4j
- jcl-over-slf4j
-
-
- ch.qos.logback
- logback-classic
-
-
-
-
@@ -364,77 +239,12 @@
google-oauth-client-jetty
${google-api.version}
-
- org.apache.kafka
- kafka-streams
- ${kafka.version}
-
-
- org.apache.kafka
- kafka-clients
- ${kafka.version}
- test
- test
-
-
-
-
- io.atlassian.fugue
- fugue
- ${fugue.version}
-
-
-
- org.jctools
- jctools-core
- ${jctools.version}
-
-
-
-
- io.github.resilience4j
- resilience4j-circuitbreaker
- ${resilience4j.version}
-
-
- io.github.resilience4j
- resilience4j-bulkhead
- ${resilience4j.version}
-
-
- io.github.resilience4j
- resilience4j-retry
- ${resilience4j.version}
-
-
- io.github.resilience4j
- resilience4j-timelimiter
- ${resilience4j.version}
-
-
- com.squareup
- javapoet
- ${javapoet.version}
-
org.hamcrest
hamcrest-all
${hamcrest-all.version}
test
-
-
- org.mockftpserver
- MockFtpServer
- ${mockftpserver.version}
- test
-
-
-
- org.reflections
- reflections
- ${reflections.version}
-
@@ -562,8 +372,6 @@
1.2
3.6.2
3.1.0
- 1.0
-
2.92
1.9.26
1.41.0
@@ -572,26 +380,10 @@
1.1.0
0.10
3.5.0
- 3.0.0
2.0.0.0
- 1.7.1
- 2.1.2
- 1.0
- 8.2.0
- 0.6.5
- 0.9.0
-
1.15
- 2.5.5
1.23.0
- 2.0.0
- 3.0.14
-
0.9.4.0006L
- 2.1.2
- 2.5.11
- 0.12.1
- 1.10.0
1.3
3.2.0-m7
5.1.1
@@ -604,16 +396,9 @@
2.3.0
0.9.12
1.19
- 1.1.0
- 2.0.4
- 1.3.1
- 1.2.6
- 4.8.1
- 4.5.1
3.0.2
- 2.7.1
3.6
- 0.9.11
+ 2.6
diff --git a/maven-all/maven-unused-dependencies/pom.xml b/maven-all/maven-unused-dependencies/pom.xml
new file mode 100644
index 0000000000..825858e481
--- /dev/null
+++ b/maven-all/maven-unused-dependencies/pom.xml
@@ -0,0 +1,47 @@
+
+ 4.0.0
+ com.baeldung
+ maven-unused-dependencies
+ 0.0.1-SNAPSHOT
+
+
+ 3.2.2
+ 1.7.25
+ 3.1.2
+ 3.1
+
+
+
+
+ commons-collections
+ commons-collections
+ ${commons-collections.version}
+
+
+ org.slf4j
+ slf4j-api
+ ${slf4j-api.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ 1.8
+ 1.8
+
+
+
+ maven-dependency-plugin
+ ${maven-dependency-plugin.version}
+
+
+
+
+
\ No newline at end of file
diff --git a/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/mavendependencyplugin/UnusedDependenciesExample.java b/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/mavendependencyplugin/UnusedDependenciesExample.java
new file mode 100644
index 0000000000..c9390880ed
--- /dev/null
+++ b/maven-all/maven-unused-dependencies/src/main/java/com/baeldung/mavendependencyplugin/UnusedDependenciesExample.java
@@ -0,0 +1,17 @@
+package com.baeldung.mavendependencyplugin;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class UnusedDependenciesExample {
+
+ /**
+ * When the Maven dependency analyzer analyzes the code, it will see that the slf4j dependency is being used in this method.
+ *
+ * @return the slf4j {@link Logger}.
+ */
+ public Logger getLogger() {
+ return LoggerFactory.getLogger(UnusedDependenciesExample.class);
+ }
+
+}
diff --git a/netty/README.md b/netty/README.md
new file mode 100644
index 0000000000..30c63cd5a8
--- /dev/null
+++ b/netty/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [HTTP/2 in Netty](https://www.baeldung.com/netty-http2)
diff --git a/oauth2-framework-impl/oauth2-authorization-server/README.md b/oauth2-framework-impl/oauth2-authorization-server/README.md
deleted file mode 100644
index 4bcb9790b1..0000000000
--- a/oauth2-framework-impl/oauth2-authorization-server/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant Articles:
-
-- [Implementing The OAuth 2.0 Authorization Framework Using Jakarta EE](https://www.baeldung.com/java-ee-oauth2-implementation)
diff --git a/oauth2-framework-impl/oauth2-resource-server/README.md b/oauth2-framework-impl/oauth2-resource-server/README.md
deleted file mode 100644
index 4bcb9790b1..0000000000
--- a/oauth2-framework-impl/oauth2-resource-server/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant Articles:
-
-- [Implementing The OAuth 2.0 Authorization Framework Using Jakarta EE](https://www.baeldung.com/java-ee-oauth2-implementation)
diff --git a/persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/BasicConnectionPool.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/BasicConnectionPool.java
index 289db18c53..22ef0e5411 100644
--- a/persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/BasicConnectionPool.java
+++ b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/BasicConnectionPool.java
@@ -14,7 +14,8 @@ public class BasicConnectionPool implements ConnectionPool {
private final List connectionPool;
private final List usedConnections = new ArrayList<>();
private static final int INITIAL_POOL_SIZE = 10;
- private final int MAX_POOL_SIZE = 20;
+ private static final int MAX_POOL_SIZE = 20;
+ private static final int MAX_TIMEOUT = 5;
public static BasicConnectionPool create(String url, String user, String password) throws SQLException {
List pool = new ArrayList<>(INITIAL_POOL_SIZE);
@@ -42,6 +43,11 @@ public class BasicConnectionPool implements ConnectionPool {
}
Connection connection = connectionPool.remove(connectionPool.size() - 1);
+
+ if(!connection.isValid(MAX_TIMEOUT)){
+ connection = createConnection(url, user, password);
+ }
+
usedConnections.add(connection);
return connection;
}
diff --git a/persistence-modules/hibernate-jpa/README.md b/persistence-modules/hibernate-jpa/README.md
index fb48f975bc..514fcedb8a 100644
--- a/persistence-modules/hibernate-jpa/README.md
+++ b/persistence-modules/hibernate-jpa/README.md
@@ -14,3 +14,4 @@ This module contains articles specific to use of Hibernate as a JPA implementati
- [TransactionRequiredException Error](https://www.baeldung.com/jpa-transaction-required-exception)
- [JPA/Hibernate Persistence Context](https://www.baeldung.com/jpa-hibernate-persistence-context)
- [Quick Guide to EntityManager#getReference()](https://www.baeldung.com/jpa-entity-manager-get-reference)
+- [Hibernate Error “No Persistence Provider for EntityManager”](https://www.baeldung.com/hibernate-no-persistence-provider)
diff --git a/persistence-modules/java-mongodb/README.md b/persistence-modules/java-mongodb/README.md
index 5c3c448b03..b79cea6781 100644
--- a/persistence-modules/java-mongodb/README.md
+++ b/persistence-modules/java-mongodb/README.md
@@ -11,3 +11,4 @@ This module contains articles about MongoDB in Java.
- [Introduction to Morphia – Java ODM for MongoDB](https://www.baeldung.com/mongodb-morphia)
- [MongoDB Aggregations Using Java](https://www.baeldung.com/java-mongodb-aggregations)
- [MongoDB BSON to JSON](https://www.baeldung.com/bson-to-json)
+- [BSON to JSON Document Conversion in Java](https://www.baeldung.com/java-convert-bson-to-json)
diff --git a/persistence-modules/spring-boot-persistence-2/README.md b/persistence-modules/spring-boot-persistence-2/README.md
index 5d171fb2ca..3ea93db4fe 100644
--- a/persistence-modules/spring-boot-persistence-2/README.md
+++ b/persistence-modules/spring-boot-persistence-2/README.md
@@ -1,3 +1,4 @@
### Relevant Articles:
- [Using JDBI with Spring Boot](https://www.baeldung.com/spring-boot-jdbi)
+- [Oracle Connection Pooling With Spring](https://www.baeldung.com/spring-oracle-connection-pooling)
diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/TransactionalCompareApplication.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/TransactionalCompareApplication.java
new file mode 100644
index 0000000000..7fee55be8a
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/TransactionalCompareApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.spring.transactional;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+class TransactionalCompareApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(TransactionalCompareApplication.class, args);
+ }
+}
diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/entity/Car.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/entity/Car.java
new file mode 100644
index 0000000000..1219111ffa
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/entity/Car.java
@@ -0,0 +1,60 @@
+package com.baeldung.spring.transactional.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+public class Car {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+
+ private String make;
+
+ private String model;
+
+ public Car() {
+ }
+
+ public Car(Long id, String make, String model) {
+ this.id = id;
+ this.make = make;
+ this.model = model;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getMake() {
+ return make;
+ }
+
+ public void setMake(String make) {
+ this.make = make;
+ }
+
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+
+ @Override
+ public String toString() {
+ return "Car{" +
+ "id=" + id +
+ ", make='" + make + '\'' +
+ ", model='" + model + '\'' +
+ '}';
+ }
+}
diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/repository/CarRepository.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/repository/CarRepository.java
new file mode 100644
index 0000000000..f8ecc8f550
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/repository/CarRepository.java
@@ -0,0 +1,7 @@
+package com.baeldung.spring.transactional.repository;
+
+import com.baeldung.spring.transactional.entity.Car;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface CarRepository extends JpaRepository {
+}
diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/service/CarService.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/service/CarService.java
new file mode 100644
index 0000000000..0821ddb02b
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/service/CarService.java
@@ -0,0 +1,25 @@
+package com.baeldung.spring.transactional.service;
+
+import com.baeldung.spring.transactional.entity.Car;
+import com.baeldung.spring.transactional.repository.CarRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityExistsException;
+
+@Service
+@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.SUPPORTS, readOnly = false, timeout = 30)
+public class CarService {
+
+ @Autowired
+ private CarRepository carRepository;
+
+ @Transactional(rollbackFor = IllegalArgumentException.class, noRollbackFor = EntityExistsException.class,
+ rollbackForClassName = "IllegalArgumentException", noRollbackForClassName = "EntityExistsException")
+ public Car save(Car car) {
+ return carRepository.save(car);
+ }
+}
diff --git a/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/service/RentalService.java b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/service/RentalService.java
new file mode 100644
index 0000000000..0aa0815a98
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-2/src/main/java/com/baeldung/spring/transactional/service/RentalService.java
@@ -0,0 +1,22 @@
+package com.baeldung.spring.transactional.service;
+
+import com.baeldung.spring.transactional.entity.Car;
+import com.baeldung.spring.transactional.repository.CarRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.EntityExistsException;
+import javax.transaction.Transactional;
+
+@Service
+@Transactional(Transactional.TxType.SUPPORTS)
+public class RentalService {
+
+ @Autowired
+ private CarRepository carRepository;
+
+ @Transactional(rollbackOn = IllegalArgumentException.class, dontRollbackOn = EntityExistsException.class)
+ public Car rent(Car car) {
+ return carRepository.save(car);
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-4/README.md b/persistence-modules/spring-data-jpa-4/README.md
index 3884435f75..085dfcb366 100644
--- a/persistence-modules/spring-data-jpa-4/README.md
+++ b/persistence-modules/spring-data-jpa-4/README.md
@@ -6,6 +6,7 @@
- [JPA Entity Lifecycle Events](https://www.baeldung.com/jpa-entity-lifecycle-events)
- [Working with Lazy Element Collections in JPA](https://www.baeldung.com/java-jpa-lazy-collections)
- [Calling Stored Procedures from Spring Data JPA Repositories](https://www.baeldung.com/spring-data-jpa-stored-procedures)
+- [Custom Naming Convention with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-custom-naming)
### Eclipse Config
After importing the project into Eclipse, you may see the following error:
diff --git a/persistence-modules/spring-persistence-simple/pom.xml b/persistence-modules/spring-persistence-simple/pom.xml
index 878c4592f9..7318ec55bd 100644
--- a/persistence-modules/spring-persistence-simple/pom.xml
+++ b/persistence-modules/spring-persistence-simple/pom.xml
@@ -132,13 +132,13 @@
- 5.2.5.RELEASE
+ 5.2.6.RELEASE
5.4.13.Final
8.0.19
1.4.200
- 2.2.6.RELEASE
+ 2.2.7.RELEASE
9.0.0.M26
1.1
4.2.1
diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceConfig.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceConfig.java
index 80f3ff14c5..cdddbaa787 100644
--- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceConfig.java
+++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceConfig.java
@@ -11,7 +11,6 @@ import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
-import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.orm.jpa.JpaTransactionManager;
@@ -26,7 +25,6 @@ import java.util.Properties;
@Configuration
@EnableTransactionManagement
-@EnableJpaRepositories(basePackages = { "com.baeldung.hibernate.dao" }, transactionManagerRef = "jpaTransactionManager")
@EnableJpaAuditing
@PropertySource({ "classpath:persistence-mysql.properties" })
@ComponentScan(basePackages = { "com.baeldung.persistence.dao", "com.baeldung.jpa.dao" })
@@ -97,7 +95,7 @@ public class PersistenceConfig {
return new FooService();
}
- private final Properties hibernateProperties() {
+ private Properties hibernateProperties() {
final Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceJPAConfig.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceJPAConfig.java
index 06cae493c9..e8a2aefd6b 100644
--- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceJPAConfig.java
+++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/config/PersistenceJPAConfig.java
@@ -8,7 +8,6 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
-import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
@@ -24,7 +23,6 @@ import java.util.Properties;
@EnableTransactionManagement
@PropertySource({ "classpath:persistence-h2.properties" })
@ComponentScan({ "com.baeldung.persistence","com.baeldung.jpa.dao" })
-@EnableJpaRepositories(basePackages = "com.baeldung.jpa.dao")
public class PersistenceJPAConfig {
@Autowired
diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/config/PersistenceConfig.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/config/PersistenceConfig.java
index 66b540a692..604923d615 100644
--- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/config/PersistenceConfig.java
+++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/config/PersistenceConfig.java
@@ -1,9 +1,6 @@
package com.baeldung.spring.data.persistence.config;
-import java.util.Properties;
-
-import javax.sql.DataSource;
-
+import com.google.common.base.Preconditions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
@@ -19,14 +16,15 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
-import com.google.common.base.Preconditions;
+import javax.sql.DataSource;
+import java.util.Properties;
@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:persistence-${envTarget:h2}.properties" })
@ComponentScan({ "com.baeldung.spring.data.persistence" })
-// @ImportResource("classpath*:springDataPersistenceConfig.xml")
-@EnableJpaRepositories(basePackages = { "com.baeldung.spring.data.persistence.dao", "com.baeldung.spring.data.persistence.jpaquery" })
+//@ImportResource("classpath*:*springDataJpaRepositoriesConfig.xml")
+@EnableJpaRepositories("com.baeldung.spring.data.persistence.repository")
public class PersistenceConfig {
@Autowired
@@ -40,10 +38,9 @@ public class PersistenceConfig {
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
- em.setPackagesToScan(new String[] { "com.baeldung.spring.data.persistence.model" });
+ em.setPackagesToScan("com.baeldung.spring.data.persistence.model");
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
- // vendorAdapter.set
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(additionalProperties());
@@ -78,7 +75,7 @@ public class PersistenceConfig {
final Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
- // hibernateProperties.setProperty("hibernate.globally_quoted_identifiers", "true");
+
return hibernateProperties;
}
diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/model/User.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/model/User.java
index 09f1092644..1475eccbf0 100644
--- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/model/User.java
+++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/model/User.java
@@ -1,7 +1,6 @@
package com.baeldung.spring.data.persistence.model;
import javax.persistence.*;
-
import java.time.LocalDate;
import java.util.List;
import java.util.Objects;
@@ -13,14 +12,22 @@ public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
+
private String name;
+
private LocalDate creationDate;
+
private LocalDate lastLoginDate;
+
private boolean active;
+
private int age;
+
@Column(unique = true, nullable = false)
private String email;
+
private Integer status;
+
@OneToMany
List possessionList;
@@ -28,7 +35,7 @@ public class User {
super();
}
- public User(String name, LocalDate creationDate,String email, Integer status) {
+ public User(String name, LocalDate creationDate, String email, Integer status) {
this.name = name;
this.creationDate = creationDate;
this.email = email;
@@ -75,7 +82,7 @@ public class User {
public void setAge(final int age) {
this.age = age;
}
-
+
public LocalDate getCreationDate() {
return creationDate;
}
@@ -94,18 +101,18 @@ public class User {
builder.append("User [name=").append(name).append(", id=").append(id).append("]");
return builder.toString();
}
-
+
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id == user.id &&
- age == user.age &&
- Objects.equals(name, user.name) &&
- Objects.equals(creationDate, user.creationDate) &&
- Objects.equals(email, user.email) &&
- Objects.equals(status, user.status);
+ age == user.age &&
+ Objects.equals(name, user.name) &&
+ Objects.equals(creationDate, user.creationDate) &&
+ Objects.equals(email, user.email) &&
+ Objects.equals(status, user.status);
}
@Override
diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/dao/IFooDao.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/IFooDao.java
similarity index 87%
rename from persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/dao/IFooDao.java
rename to persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/IFooDao.java
index d2b746dc8b..0b750e37e1 100644
--- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/dao/IFooDao.java
+++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/IFooDao.java
@@ -1,11 +1,13 @@
-package com.baeldung.spring.data.persistence.dao;
+package com.baeldung.spring.data.persistence.repository;
import com.baeldung.spring.data.persistence.model.Foo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
+
public interface IFooDao extends JpaRepository {
@Query("SELECT f FROM Foo f WHERE LOWER(f.name) = LOWER(:name)")
Foo retrieveByName(@Param("name") String name);
+
}
diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepository.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/UserRepository.java
similarity index 96%
rename from persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepository.java
rename to persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/UserRepository.java
index f22970c401..a8e3a536c3 100644
--- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepository.java
+++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/UserRepository.java
@@ -1,9 +1,4 @@
-package com.baeldung.spring.data.persistence.jpaquery;
-
-import java.time.LocalDate;
-import java.util.Collection;
-import java.util.List;
-import java.util.stream.Stream;
+package com.baeldung.spring.data.persistence.repository;
import com.baeldung.spring.data.persistence.model.User;
import org.springframework.data.domain.Page;
@@ -14,13 +9,18 @@ import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
+import java.time.LocalDate;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Stream;
+
public interface UserRepository extends JpaRepository, UserRepositoryCustom {
Stream findAllByName(String name);
@Query("SELECT u FROM User u WHERE u.status = 1")
Collection findAllActiveUsers();
-
+
@Query("select u from User u where u.email like '%@gmail.com'")
List findUsersWithGmailAddress();
@@ -74,14 +74,14 @@ public interface UserRepository extends JpaRepository, UserReposi
@Query(value = "INSERT INTO Users (name, age, email, status, active) VALUES (:name, :age, :email, :status, :active)", nativeQuery = true)
@Modifying
void insertUser(@Param("name") String name, @Param("age") Integer age, @Param("email") String email, @Param("status") Integer status, @Param("active") boolean active);
-
+
@Modifying
@Query(value = "UPDATE Users u SET status = ? WHERE u.name = ?", nativeQuery = true)
int updateUserSetStatusForNameNativePostgres(Integer status, String name);
-
+
@Query(value = "SELECT u FROM User u WHERE u.name IN :names")
- List findUserByNameList(@Param("names") Collection names);
-
+ List findUserByNameList(@Param("names") Collection names);
+
void deleteAllByCreationDateAfter(LocalDate date);
@Modifying(clearAutomatically = true, flushAutomatically = true)
diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCustom.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/UserRepositoryCustom.java
similarity index 85%
rename from persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCustom.java
rename to persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/UserRepositoryCustom.java
index 8bfcb93158..77e661bbbe 100644
--- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCustom.java
+++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/UserRepositoryCustom.java
@@ -1,14 +1,16 @@
-package com.baeldung.spring.data.persistence.jpaquery;
+package com.baeldung.spring.data.persistence.repository;
+
+import com.baeldung.spring.data.persistence.model.User;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.function.Predicate;
-import com.baeldung.spring.data.persistence.model.User;
-
public interface UserRepositoryCustom {
+
List findUserByEmails(Set emails);
List findAllUsersByPredicates(Collection> predicates);
+
}
diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCustomImpl.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/UserRepositoryCustomImpl.java
similarity index 85%
rename from persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCustomImpl.java
rename to persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/UserRepositoryCustomImpl.java
index f264ca0b44..366b2c54d0 100644
--- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCustomImpl.java
+++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/repository/UserRepositoryCustomImpl.java
@@ -1,5 +1,10 @@
-package com.baeldung.spring.data.persistence.jpaquery;
+package com.baeldung.spring.data.persistence.repository;
+import com.baeldung.spring.data.persistence.model.User;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.criteria.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@@ -7,16 +12,6 @@ import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Path;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
-import com.baeldung.spring.data.persistence.model.User;
-
public class UserRepositoryCustomImpl implements UserRepositoryCustom {
@PersistenceContext
diff --git a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/service/impl/FooService.java b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/service/impl/FooService.java
index cd566ba9f6..c1406b8602 100644
--- a/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/service/impl/FooService.java
+++ b/persistence-modules/spring-persistence-simple/src/main/java/com/baeldung/spring/data/persistence/service/impl/FooService.java
@@ -2,7 +2,7 @@ package com.baeldung.spring.data.persistence.service.impl;
import com.baeldung.spring.data.persistence.model.Foo;
-import com.baeldung.spring.data.persistence.dao.IFooDao;
+import com.baeldung.spring.data.persistence.repository.IFooDao;
import com.baeldung.spring.data.persistence.service.IFooService;
import com.baeldung.spring.data.persistence.service.common.AbstractService;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/persistence-modules/spring-persistence-simple/src/main/resources/springDataPersistenceConfig.xml b/persistence-modules/spring-persistence-simple/src/main/resources/springDataJpaRepositoriesConfig.xml
similarity index 58%
rename from persistence-modules/spring-persistence-simple/src/main/resources/springDataPersistenceConfig.xml
rename to persistence-modules/spring-persistence-simple/src/main/resources/springDataJpaRepositoriesConfig.xml
index 5ea2d9c05b..91778a17af 100644
--- a/persistence-modules/spring-persistence-simple/src/main/resources/springDataPersistenceConfig.xml
+++ b/persistence-modules/spring-persistence-simple/src/main/resources/springDataJpaRepositoriesConfig.xml
@@ -1,12 +1,13 @@
-
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCommon.java b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/repository/UserRepositoryCommon.java
similarity index 99%
rename from persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCommon.java
rename to persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/repository/UserRepositoryCommon.java
index 5874b3c643..13b5b4357d 100644
--- a/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryCommon.java
+++ b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/repository/UserRepositoryCommon.java
@@ -1,4 +1,4 @@
-package com.baeldung.spring.data.persistence.jpaquery;
+package com.baeldung.spring.data.persistence.repository;
import com.baeldung.spring.data.persistence.config.PersistenceConfig;
import com.baeldung.spring.data.persistence.model.User;
diff --git a/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryIntegrationTest.java b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/repository/UserRepositoryIntegrationTest.java
similarity index 94%
rename from persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryIntegrationTest.java
rename to persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/repository/UserRepositoryIntegrationTest.java
index 3bffb51917..c76e345fdd 100644
--- a/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/jpaquery/UserRepositoryIntegrationTest.java
+++ b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/spring/data/persistence/repository/UserRepositoryIntegrationTest.java
@@ -1,8 +1,4 @@
-package com.baeldung.spring.data.persistence.jpaquery;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.time.LocalDate;
+package com.baeldung.spring.data.persistence.repository;
import com.baeldung.spring.data.persistence.config.PersistenceConfig;
import com.baeldung.spring.data.persistence.model.User;
@@ -14,9 +10,10 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
import org.springframework.transaction.annotation.Transactional;
-/**
- * Created by adam.
- */
+import java.time.LocalDate;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
@DirtiesContext
diff --git a/pom.xml b/pom.xml
index 2f4579c999..c6addfa6aa 100644
--- a/pom.xml
+++ b/pom.xml
@@ -811,6 +811,9 @@
jws
libraries
+ libraries-4
+ libraries-5
+ libraries-6
vaadin
vavr
@@ -1012,6 +1015,7 @@
libraries-2
libraries-3
+
libraries-apache-commons
libraries-apache-commons-collections
libraries-apache-commons-io
@@ -1311,6 +1315,9 @@
jws
libraries
+ libraries-4
+ libraries-5
+ libraries-6
vaadin
vavr
diff --git a/reactor-core/README.md b/reactor-core/README.md
index e3cca35f86..0214aa26fd 100644
--- a/reactor-core/README.md
+++ b/reactor-core/README.md
@@ -7,3 +7,4 @@ This module contains articles about Reactor Core.
- [Intro To Reactor Core](https://www.baeldung.com/reactor-core)
- [Combining Publishers in Project Reactor](https://www.baeldung.com/reactor-combine-streams)
- [Programmatically Creating Sequences with Project Reactor](https://www.baeldung.com/flux-sequences-reactor)
+- [How to Extract a Mono’s Content in Java](https://www.baeldung.com/java-string-from-mono)
diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/SpringBootGroovyApplication.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/SpringBootGroovyApplication.groovy
deleted file mode 100644
index 226a2ff53d..0000000000
--- a/spring-boot-groovy/src/main/groovy/com/baeldung/app/SpringBootGroovyApplication.groovy
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.baeldung.app
-
-import org.springframework.boot.SpringApplication
-import org.springframework.boot.autoconfigure.SpringBootApplication
-
-import com.baeldung.app.SpringBootGroovyApplication
-
-@SpringBootApplication
-class SpringBootGroovyApplication {
- static void main(String[] args) {
- SpringApplication.run SpringBootGroovyApplication, args
- }
-}
diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/controller/TodoController.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/controller/TodoController.groovy
deleted file mode 100644
index 02f6d0223b..0000000000
--- a/spring-boot-groovy/src/main/groovy/com/baeldung/app/controller/TodoController.groovy
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.baeldung.app.controller
-
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.web.bind.annotation.DeleteMapping
-import org.springframework.web.bind.annotation.GetMapping
-import org.springframework.web.bind.annotation.PathVariable
-import org.springframework.web.bind.annotation.PostMapping
-import org.springframework.web.bind.annotation.PutMapping
-import org.springframework.web.bind.annotation.RequestBody
-import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.RequestMethod
-import org.springframework.web.bind.annotation.RestController
-
-import com.baeldung.app.entity.Todo
-import com.baeldung.app.service.TodoService
-
-@RestController
-@RequestMapping('todo')
-public class TodoController {
-
- @Autowired
- TodoService todoService
-
- @GetMapping
- List getAllTodoList(){
- todoService.findAll()
- }
-
- @PostMapping
- Todo saveTodo(@RequestBody Todo todo){
- todoService.saveTodo todo
- }
-
- @PutMapping
- Todo updateTodo(@RequestBody Todo todo){
- todoService.updateTodo todo
- }
-
- @DeleteMapping('/{todoId}')
- deleteTodo(@PathVariable Integer todoId){
- todoService.deleteTodo todoId
- }
-
- @GetMapping('/{todoId}')
- Todo getTodoById(@PathVariable Integer todoId){
- todoService.findById todoId
- }
-}
\ No newline at end of file
diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/entity/Todo.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/entity/Todo.groovy
deleted file mode 100644
index 9f1253c5b3..0000000000
--- a/spring-boot-groovy/src/main/groovy/com/baeldung/app/entity/Todo.groovy
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.baeldung.app.entity
-
-import javax.persistence.Column
-import javax.persistence.Entity
-import javax.persistence.GeneratedValue
-import javax.persistence.GenerationType
-import javax.persistence.Id
-import javax.persistence.Table
-
-@Entity
-@Table(name = 'todo')
-class Todo {
- @Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- Integer id
-
- @Column
- String task
-
- @Column
- Boolean isCompleted
-
-}
diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/repository/TodoRepository.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/repository/TodoRepository.groovy
deleted file mode 100644
index c0b35cc37d..0000000000
--- a/spring-boot-groovy/src/main/groovy/com/baeldung/app/repository/TodoRepository.groovy
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.baeldung.app.repository
-
-import org.springframework.data.jpa.repository.JpaRepository
-import org.springframework.stereotype.Repository
-
-import com.baeldung.app.entity.Todo
-
-@Repository
-interface TodoRepository extends JpaRepository {}
\ No newline at end of file
diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/TodoService.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/TodoService.groovy
deleted file mode 100644
index 0a59d93330..0000000000
--- a/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/TodoService.groovy
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.baeldung.app.service
-
-import com.baeldung.app.entity.Todo
-
-interface TodoService {
-
- List findAll()
-
- Todo findById(Integer todoId)
-
- Todo saveTodo(Todo todo)
-
- Todo updateTodo(Todo todo)
-
- Todo deleteTodo(Integer todoId)
-}
diff --git a/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/impl/TodoServiceImpl.groovy b/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/impl/TodoServiceImpl.groovy
deleted file mode 100644
index 6d0ee03a9f..0000000000
--- a/spring-boot-groovy/src/main/groovy/com/baeldung/app/service/impl/TodoServiceImpl.groovy
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.baeldung.app.service.impl
-
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.stereotype.Service
-
-import com.baeldung.app.entity.Todo
-import com.baeldung.app.repository.TodoRepository
-import com.baeldung.app.service.TodoService
-
-@Service
-class TodoServiceImpl implements TodoService {
-
- @Autowired
- TodoRepository todoRepository
-
- @Override
- List findAll() {
- todoRepository.findAll()
- }
-
- @Override
- Todo findById(Integer todoId) {
- todoRepository.findById todoId get()
- }
-
- @Override
- Todo saveTodo(Todo todo){
- todoRepository.save todo
- }
-
- @Override
- Todo updateTodo(Todo todo){
- todoRepository.save todo
- }
-
- @Override
- Todo deleteTodo(Integer todoId){
- todoRepository.deleteById todoId
- }
-}
diff --git a/spring-boot-groovy/src/test/groovy/com/baeldung/app/TodoAppUnitTest.groovy b/spring-boot-groovy/src/test/groovy/com/baeldung/app/TodoAppUnitTest.groovy
deleted file mode 100644
index faf2d64ba7..0000000000
--- a/spring-boot-groovy/src/test/groovy/com/baeldung/app/TodoAppUnitTest.groovy
+++ /dev/null
@@ -1,97 +0,0 @@
-package com.baeldung.app
-
-import static org.junit.jupiter.api.Assertions.assertEquals
-import static org.junit.jupiter.api.Assertions.assertTrue
-
-import org.junit.BeforeClass
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.springframework.boot.test.context.SpringBootTest
-import org.springframework.http.HttpStatus
-import org.springframework.http.MediaType
-import org.springframework.test.context.event.annotation.BeforeTestClass
-import org.springframework.test.context.junit4.SpringRunner
-
-import com.baeldung.app.entity.Todo
-
-import io.restassured.RestAssured
-import io.restassured.response.Response
-
-class TodoAppUnitTest {
- static API_ROOT = 'http://localhost:8081/todo'
- static readingTodoId
- static writingTodoId
-
- @BeforeClass
- static void populateDummyData() {
- Todo readingTodo = new Todo(task: 'Reading', isCompleted: false)
- Todo writingTodo = new Todo(task: 'Writing', isCompleted: false)
-
- final Response readingResponse =
- RestAssured.given()
- .contentType(MediaType.APPLICATION_JSON_VALUE)
- .body(readingTodo).post(API_ROOT)
-
- Todo cookingTodoResponse = readingResponse.as Todo.class
- readingTodoId = cookingTodoResponse.getId()
-
- final Response writingResponse =
- RestAssured.given()
- .contentType(MediaType.APPLICATION_JSON_VALUE)
- .body(writingTodo).post(API_ROOT)
-
- Todo writingTodoResponse = writingResponse.as Todo.class
- writingTodoId = writingTodoResponse.getId()
- }
-
- @Test
- void whenGetAllTodoList_thenOk(){
- final Response response = RestAssured.get(API_ROOT)
-
- assertEquals HttpStatus.OK.value(),response.getStatusCode()
- assertTrue response.as(List.class).size() > 0
- }
-
- @Test
- void whenGetTodoById_thenOk(){
- final Response response =
- RestAssured.get("$API_ROOT/$readingTodoId")
-
- assertEquals HttpStatus.OK.value(),response.getStatusCode()
- Todo todoResponse = response.as Todo.class
- assertEquals readingTodoId,todoResponse.getId()
- }
-
- @Test
- void whenUpdateTodoById_thenOk(){
- Todo todo = new Todo(id:readingTodoId, isCompleted: true)
- final Response response =
- RestAssured.given()
- .contentType(MediaType.APPLICATION_JSON_VALUE)
- .body(todo).put(API_ROOT)
-
- assertEquals HttpStatus.OK.value(),response.getStatusCode()
- Todo todoResponse = response.as Todo.class
- assertTrue todoResponse.getIsCompleted()
- }
-
- @Test
- void whenDeleteTodoById_thenOk(){
- final Response response =
- RestAssured.given()
- .delete("$API_ROOT/$writingTodoId")
-
- assertEquals HttpStatus.OK.value(),response.getStatusCode()
- }
-
- @Test
- void whenSaveTodo_thenOk(){
- Todo todo = new Todo(task: 'Blogging', isCompleted: false)
- final Response response =
- RestAssured.given()
- .contentType(MediaType.APPLICATION_JSON_VALUE)
- .body(todo).post(API_ROOT)
-
- assertEquals HttpStatus.OK.value(),response.getStatusCode()
- }
-}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/pom.xml b/spring-boot-modules/spring-boot-properties/pom.xml
index ec05ec1bdc..ef9c084f4c 100644
--- a/spring-boot-modules/spring-boot-properties/pom.xml
+++ b/spring-boot-modules/spring-boot-properties/pom.xml
@@ -128,6 +128,7 @@
4.4.11
@
2.2.4.RELEASE
+ com.baeldung.buildproperties.Application
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/JdbcProperties.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/JdbcProperties.java
new file mode 100644
index 0000000000..bbd193acba
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/JdbcProperties.java
@@ -0,0 +1,21 @@
+package com.baeldung.configuration.processor;
+
+import org.springframework.boot.context.properties.*;
+import org.springframework.context.annotation.*;
+import org.springframework.beans.factory.annotation.*;
+
+@Configuration
+@ConfigurationProperties(prefix = "com.baeldung")
+public class JdbcProperties {
+
+ @Value("${jdbc.url:jdbc:postgresql:/localhost:5432}")
+ private String jdbcUrl;
+
+ public String getJdbcUrl() {
+ return jdbcUrl;
+ }
+
+ public void setJdbcUrl(String jdbcUrl) {
+ this.jdbcUrl = jdbcUrl;
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/PropertyBeanInjection.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/PropertyBeanInjection.java
index 3bcbf41f54..89a8f9458c 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/PropertyBeanInjection.java
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/PropertyBeanInjection.java
@@ -6,16 +6,23 @@ import org.springframework.stereotype.*;
@Component
public class PropertyBeanInjection {
- private final CustomProperties customProperties;
+ private CustomProperties customProperties;
- PropertyBeanInjection(@Autowired CustomProperties customProperties) {
+ private JdbcProperties jdbcProperties;
+
+ PropertyBeanInjection(@Autowired CustomProperties customProperties, @Autowired JdbcProperties jdbcProperties) {
this.customProperties = customProperties;
+ this.jdbcProperties = jdbcProperties;
}
String getUrl() {
return customProperties.getUrl();
}
+ String getJdbcUrl() {
+ return jdbcProperties.getJdbcUrl();
+ }
+
int getTimeoutInMilliseconds() {
return customProperties.getTimeoutInMilliSeconds();
}
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/Database.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/Database.java
new file mode 100644
index 0000000000..990ede35cd
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/Database.java
@@ -0,0 +1,36 @@
+package com.baeldung.configurationproperties;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+
+@ConfigurationProperties(prefix = "database")
+public class Database {
+
+ String url;
+ String username;
+ String password;
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DatabaseConfig.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DatabaseConfig.java
new file mode 100644
index 0000000000..8f17c98f03
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DatabaseConfig.java
@@ -0,0 +1,23 @@
+package com.baeldung.configurationproperties;
+
+import org.springframework.core.env.Environment;
+import org.springframework.beans.factory.annotation.*;
+import org.springframework.context.annotation.*;
+
+@Configuration
+public class DatabaseConfig {
+
+ @Autowired private Environment env;
+
+ @Bean(name="dataSource")
+ public Database dataSource() {
+
+ Database dataSource = new Database();
+ dataSource.setUrl(env.getProperty("jdbc.url"));
+ dataSource.setUsername(env.getProperty("database.username"));
+ dataSource.setPassword(env.getProperty("database.password"));
+
+ return dataSource;
+ }
+
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DatabaseConfigPropertiesApp.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DatabaseConfigPropertiesApp.java
new file mode 100644
index 0000000000..bb1c937f60
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DatabaseConfigPropertiesApp.java
@@ -0,0 +1,13 @@
+package com.baeldung.configurationproperties;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+@SpringBootApplication
+@ComponentScan(basePackageClasses = {Database.class,DatabaseConfig.class})
+public class DatabaseConfigPropertiesApp{
+
+ public static void main(String[]args) {SpringApplication.run(DatabaseConfigPropertiesApp.class,args);}
+
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/spring/PropertyPlaceholderConfig.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/spring/PropertyPlaceholderConfig.java
new file mode 100644
index 0000000000..0d1eb4ccf7
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/spring/PropertyPlaceholderConfig.java
@@ -0,0 +1,23 @@
+package com.baeldung.properties.spring;
+
+import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.*;
+
+@Configuration
+public class PropertyPlaceholderConfig {
+
+ public PropertyPlaceholderConfig(){
+ super();
+ }
+
+ @Bean
+ public static PropertyPlaceholderConfigurer properties() {
+ PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
+ Resource[] resources = new ClassPathResource[]{ new ClassPathResource("foo.properties") };
+ ppc.setLocations( resources );
+ ppc.setIgnoreUnresolvablePlaceholders( true );
+ return ppc;
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/spring/PropertySourcesPlaceholderConfig.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/spring/PropertySourcesPlaceholderConfig.java
new file mode 100644
index 0000000000..8ff464e4cf
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/properties/spring/PropertySourcesPlaceholderConfig.java
@@ -0,0 +1,24 @@
+package com.baeldung.properties.spring;
+
+import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.*;
+
+@Configuration
+public class PropertySourcesPlaceholderConfig{
+
+ public PropertySourcesPlaceholderConfig(){
+ super();
+ }
+
+ @Bean
+ public static PropertySourcesPlaceholderConfigurer properties(){
+ PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer();
+ Resource[] resources = new ClassPathResource[]{ new ClassPathResource("foo.properties") };
+ pspc.setLocations(resources);
+ pspc.setIgnoreUnresolvablePlaceholders(true);
+ return pspc;
+ }
+
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/application.properties b/spring-boot-modules/spring-boot-properties/src/main/resources/application.properties
index d4d1df7abc..af38556f81 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/resources/application.properties
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/application.properties
@@ -3,6 +3,3 @@ spring.properties.refreshDelay=1000
spring.config.location=file:extra.properties
spring.main.allow-bean-definition-overriding=true
-database.url=jdbc:postgresql:/localhost:5432/instance
-database.username=foo
-database.password=bar
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/configForProperties.xml b/spring-boot-modules/spring-boot-properties/src/main/resources/configForProperties.xml
index d796f791cb..4468bb485f 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/resources/configForProperties.xml
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/configForProperties.xml
@@ -7,10 +7,14 @@
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"
>
-
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/configForPropertyPlaceholderBeans.xml b/spring-boot-modules/spring-boot-properties/src/main/resources/configForPropertyPlaceholderBeans.xml
new file mode 100644
index 0000000000..a296cf5169
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/configForPropertyPlaceholderBeans.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+ classpath:foo.properties
+
+
+
+
+
+
+
+
+ classpath:foo.properties
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/configuration-processor.properties b/spring-boot-modules/spring-boot-properties/src/main/resources/configuration-processor.properties
new file mode 100644
index 0000000000..b68a4fbda3
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/configuration-processor.properties
@@ -0,0 +1,3 @@
+com.baeldung.url=www.abc.test.com
+com.baeldung.jdbc.url=
+com.baeldung.timeout-in-milli-seconds=2000
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/database.properties b/spring-boot-modules/spring-boot-properties/src/main/resources/database.properties
new file mode 100644
index 0000000000..6524ce6109
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/database.properties
@@ -0,0 +1,4 @@
+database.url=jdbc:postgresql:/localhost:5432/instance
+database.username=foo
+database.password=bar
+jdbc.url=jdbc:postgresql:/localhost:5432
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/database.yml b/spring-boot-modules/spring-boot-properties/src/main/resources/database.yml
new file mode 100644
index 0000000000..8404d9411a
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/database.yml
@@ -0,0 +1,5 @@
+database:
+ url: jdbc:postresql:/localhost:5432/instance
+ username: foo
+ password: bar
+secret: foo
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configuration/processor/PropertyBeanInjectionUnitTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configuration/processor/PropertyBeanInjectionUnitTest.java
index bdeb6547c3..eb6add2b94 100644
--- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configuration/processor/PropertyBeanInjectionUnitTest.java
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configuration/processor/PropertyBeanInjectionUnitTest.java
@@ -15,6 +15,11 @@ class PropertyBeanInjectionUnitTest {
@Autowired
private PropertyBeanInjection propertyBeanInjection;
+ @Test
+ void checkThatJdbcPropertiesHaveTheCorrectValueFromPropertiesFile() {
+ Assertions.assertEquals("jdbc:postgresql:/localhost:5432", propertyBeanInjection.getJdbcUrl());
+ }
+
@Test
void checkThatCustomPropertiesHaveTheCorrectValueFromPropertiesFile() {
Assertions.assertEquals("www.abc.test.com", propertyBeanInjection.getUrl());
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/ConfigPropertiesIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/ConfigPropertiesIntegrationTest.java
index 141400b1fe..2b0833c387 100644
--- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/ConfigPropertiesIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/ConfigPropertiesIntegrationTest.java
@@ -4,6 +4,7 @@ import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
@@ -13,13 +14,17 @@ import com.baeldung.properties.AdditionalProperties;
import com.baeldung.properties.ConfigPropertiesDemoApplication;
@RunWith(SpringRunner.class)
-@SpringBootTest(classes = ConfigPropertiesDemoApplication.class)
-@TestPropertySource("classpath:configprops-test.properties")
+@SpringBootTest(classes = {ConfigPropertiesDemoApplication.class, DatabaseConfigPropertiesApp.class})
+@TestPropertySource(locations = {"classpath:configprops-test.properties", "classpath:database-test.properties"})
public class ConfigPropertiesIntegrationTest {
@Autowired
private ConfigProperties properties;
+ @Autowired
+ @Qualifier("dataSource")
+ private Database databaseProperties;
+
@Autowired
private AdditionalProperties additionalProperties;
@@ -53,4 +58,11 @@ public class ConfigPropertiesIntegrationTest {
Assert.assertTrue(additionalProperties.getUnit().equals("km"));
Assert.assertTrue(additionalProperties.getMax() == 100);
}
+
+ @Test
+ public void whenDatabasePropertyQueriedthenReturnsProperty() {
+ Assert.assertTrue(databaseProperties.getUrl().equals("jdbc:postgresql:/localhost:5432"));
+ Assert.assertTrue(databaseProperties.getUsername().equals("foo"));
+ Assert.assertTrue(databaseProperties.getPassword().equals("bar"));
+ }
}
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePlaceholdersJavaConfigIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePlaceholdersJavaConfigIntegrationTest.java
new file mode 100644
index 0000000000..8ebda90321
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePlaceholdersJavaConfigIntegrationTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.properties.multiple;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
+
+import com.baeldung.properties.spring.PropertyPlaceholderConfig;
+import com.baeldung.properties.spring.PropertySourcesPlaceholderConfig;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@SpringJUnitConfig({PropertyPlaceholderConfig.class, PropertySourcesPlaceholderConfig.class})
+public class MultiplePlaceholdersJavaConfigIntegrationTest {
+
+ @Value("${key.something}")
+ private String something;
+
+
+ @Test
+ public void whenReadInjectedValues_thenGetCorrectValues() {
+ assertThat(something).isEqualTo("val");
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePlaceholdersXmlConfigIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePlaceholdersXmlConfigIntegrationTest.java
new file mode 100644
index 0000000000..b863e2e080
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePlaceholdersXmlConfigIntegrationTest.java
@@ -0,0 +1,25 @@
+package com.baeldung.properties.multiple;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+
+@SpringJUnitConfig(locations = "classpath:configForPropertyPlaceholderBeans.xml")
+public class MultiplePlaceholdersXmlConfigIntegrationTest {
+
+ @Value("${foo}")
+ private String something;
+
+ @Value("${key.something}")
+ private String something2;
+
+
+ @Test
+ public void whenReadInjectedValues_thenGetCorrectValues() {
+ assertThat(something).isEqualTo("bar");
+ assertThat(something2).isEqualTo("val");
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePropertiesXmlConfigIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePropertiesXmlConfigIntegrationTest.java
index db71e816dd..6827ee1cf1 100644
--- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePropertiesXmlConfigIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/properties/multiple/MultiplePropertiesXmlConfigIntegrationTest.java
@@ -13,9 +13,12 @@ public class MultiplePropertiesXmlConfigIntegrationTest {
@Value("${key.something2}") private String something2;
+ @Value("${jdbc.url}") private String jdbcUrl;
+
@Test
public void whenReadInjectedValues_thenGetCorrectValues() {
assertThat(something).isEqualTo("val");
assertThat(something2).isEqualTo("val2");
+ assertThat(jdbcUrl).isEqualTo("jdbc:postgresql:/localhost:5432");
}
}
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/test/IntegrationTestSuite.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/test/IntegrationTestSuite.java
index d41d328867..0e0f8f6230 100644
--- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/test/IntegrationTestSuite.java
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/test/IntegrationTestSuite.java
@@ -10,6 +10,8 @@ import com.baeldung.properties.basic.PropertiesWithXmlIntegrationTest;
import com.baeldung.properties.external.ExternalPropertiesWithJavaIntegrationTest;
import com.baeldung.properties.external.ExternalPropertiesWithMultipleXmlsIntegrationTest;
import com.baeldung.properties.external.ExternalPropertiesWithXmlManualTest;
+import com.baeldung.properties.multiple.MultiplePropertiesXmlConfigIntegrationTest;
+import com.baeldung.properties.multiple.MultiplePlaceholdersXmlConfigIntegrationTest;
@RunWith(Suite.class)
@SuiteClasses({ //@formatter:off
@@ -17,8 +19,8 @@ import com.baeldung.properties.external.ExternalPropertiesWithXmlManualTest;
ExternalPropertiesWithJavaIntegrationTest.class,
ExternalPropertiesWithMultipleXmlsIntegrationTest.class,
ExternalPropertiesWithXmlManualTest.class,
- ExtendedPropertiesWithJavaIntegrationTest.class,
- PropertiesWithMultipleXmlsIntegrationTest.class,
+ ExtendedPropertiesWithJavaIntegrationTest.class, MultiplePropertiesXmlConfigIntegrationTest.class,
+ PropertiesWithMultipleXmlsIntegrationTest.class, MultiplePlaceholdersXmlConfigIntegrationTest.class
})// @formatter:on
public final class IntegrationTestSuite {
//
diff --git a/spring-boot-modules/spring-boot-properties/src/test/resources/configuration-processor.properties b/spring-boot-modules/spring-boot-properties/src/test/resources/configuration-processor.properties
index 00369f2eff..b68a4fbda3 100644
--- a/spring-boot-modules/spring-boot-properties/src/test/resources/configuration-processor.properties
+++ b/spring-boot-modules/spring-boot-properties/src/test/resources/configuration-processor.properties
@@ -1,2 +1,3 @@
com.baeldung.url=www.abc.test.com
+com.baeldung.jdbc.url=
com.baeldung.timeout-in-milli-seconds=2000
diff --git a/spring-boot-modules/spring-boot-properties/src/test/resources/database-test.properties b/spring-boot-modules/spring-boot-properties/src/test/resources/database-test.properties
new file mode 100644
index 0000000000..384d0850ab
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/test/resources/database-test.properties
@@ -0,0 +1,3 @@
+jdbc.url=jdbc:postgresql:/localhost:5432
+database.username=foo
+database.password=bar
diff --git a/spring-boot-modules/spring-boot/src/test/resources/README.md b/spring-boot-modules/spring-boot/src/test/resources/README.md
new file mode 100644
index 0000000000..51c95afd9d
--- /dev/null
+++ b/spring-boot-modules/spring-boot/src/test/resources/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [How to Test GraphQL Using Postman](https://www.baeldung.com/graphql-postman)
diff --git a/spring-cloud/spring-cloud-circuit-breaker/README.md b/spring-cloud/spring-cloud-circuit-breaker/README.md
index 040eb0ccee..894be93408 100644
--- a/spring-cloud/spring-cloud-circuit-breaker/README.md
+++ b/spring-cloud/spring-cloud-circuit-breaker/README.md
@@ -3,3 +3,5 @@
This module contains articles about Spring Cloud Circuit Breaker
### Relevant Articles:
+
+- [Quick Guide to Spring Cloud Circuit Breaker](https://www.baeldung.com/spring-cloud-circuit-breaker)
diff --git a/spring-cloud/spring-cloud-gateway/pom.xml b/spring-cloud/spring-cloud-gateway/pom.xml
index 0f62c031cf..c692eed7ec 100644
--- a/spring-cloud/spring-cloud-gateway/pom.xml
+++ b/spring-cloud/spring-cloud-gateway/pom.xml
@@ -1,7 +1,7 @@
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-cloud-gateway
spring-cloud-gateway
@@ -49,6 +49,26 @@
spring-cloud-starter-gateway
+
+
+ org.springframework.cloud
+ spring-cloud-starter-circuitbreaker-reactor-resilience4j
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis-reactive
+
+
+
+
+ it.ozimov
+ embedded-redis
+ ${redis.version}
+ test
+
+
org.hibernate
hibernate-validator-cdi
@@ -69,8 +89,8 @@
test
- org.springframework.boot
- spring-boot-devtools
+ org.springframework.boot
+ spring-boot-devtools
@@ -84,11 +104,10 @@
- Greenwich.SR3
-
-
- 2.1.9.RELEASE
+ Hoxton.SR3
+ 2.2.6.RELEASE
6.0.2.Final
+ 0.7.2
diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/WebFilterGatewayApplication.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/WebFilterGatewayApplication.java
new file mode 100644
index 0000000000..852e5cadba
--- /dev/null
+++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/WebFilterGatewayApplication.java
@@ -0,0 +1,15 @@
+package com.baeldung.springcloudgateway.webfilters;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+
+@SpringBootApplication
+public class WebFilterGatewayApplication {
+
+ public static void main(String[] args) {
+ new SpringApplicationBuilder(WebFilterGatewayApplication.class)
+ .profiles("webfilters")
+ .run(args);
+ }
+
+}
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/config/ModifyBodyRouteConfig.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/config/ModifyBodyRouteConfig.java
new file mode 100644
index 0000000000..7b6188b66a
--- /dev/null
+++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/config/ModifyBodyRouteConfig.java
@@ -0,0 +1,49 @@
+package com.baeldung.springcloudgateway.webfilters.config;
+
+import org.springframework.cloud.gateway.route.RouteLocator;
+import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.MediaType;
+
+import reactor.core.publisher.Mono;
+
+@Configuration
+public class ModifyBodyRouteConfig {
+
+ @Bean
+ public RouteLocator routes(RouteLocatorBuilder builder) {
+ return builder.routes()
+ .route("modify_request_body", r -> r.path("/post")
+ .filters(f -> f.modifyRequestBody(String.class, Hello.class, MediaType.APPLICATION_JSON_VALUE,
+ (exchange, s) -> Mono.just(new Hello(s.toUpperCase())))).uri("https://httpbin.org"))
+ .build();
+ }
+
+ @Bean
+ public RouteLocator responseRoutes(RouteLocatorBuilder builder) {
+ return builder.routes()
+ .route("modify_response_body", r -> r.path("/put/**")
+ .filters(f -> f.modifyResponseBody(String.class, Hello.class, MediaType.APPLICATION_JSON_VALUE,
+ (exchange, s) -> Mono.just(new Hello("New Body")))).uri("https://httpbin.org"))
+ .build();
+ }
+
+ static class Hello {
+ String message;
+
+ public Hello() { }
+
+ public Hello(String message) {
+ this.message = message;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+ }
+}
diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/config/RequestRateLimiterResolverConfig.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/config/RequestRateLimiterResolverConfig.java
new file mode 100644
index 0000000000..f80a742fa6
--- /dev/null
+++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/webfilters/config/RequestRateLimiterResolverConfig.java
@@ -0,0 +1,16 @@
+package com.baeldung.springcloudgateway.webfilters.config;
+
+import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import reactor.core.publisher.Mono;
+
+@Configuration
+public class RequestRateLimiterResolverConfig {
+
+ @Bean
+ KeyResolver userKeyResolver() {
+ return exchange -> Mono.just("1");
+ }
+}
diff --git a/spring-cloud/spring-cloud-gateway/src/main/resources/application-webfilters.yml b/spring-cloud/spring-cloud-gateway/src/main/resources/application-webfilters.yml
new file mode 100644
index 0000000000..3348cbbba0
--- /dev/null
+++ b/spring-cloud/spring-cloud-gateway/src/main/resources/application-webfilters.yml
@@ -0,0 +1,102 @@
+logging:
+ level:
+ org.springframework.cloud.gateway: INFO
+ reactor.netty.http.client: INFO
+
+spring:
+ redis:
+ host: localhost
+ port: 6379
+ cloud:
+ gateway:
+ routes:
+ - id: request_header_route
+ uri: https://httpbin.org
+ predicates:
+ - Path=/get/**
+ filters:
+ - AddRequestHeader=My-Header-Good,Good
+ - AddRequestHeader=My-Header-Remove,Remove
+ - AddRequestParameter=var, good
+ - AddRequestParameter=var2, remove
+ - MapRequestHeader=My-Header-Good, My-Header-Bad
+ - MapRequestHeader=My-Header-Set, My-Header-Bad
+ - SetRequestHeader=My-Header-Set, Set
+ - RemoveRequestHeader=My-Header-Remove
+ - RemoveRequestParameter=var2
+ - PreserveHostHeader
+
+ - id: response_header_route
+ uri: https://httpbin.org
+ predicates:
+ - Path=/header/post/**
+ filters:
+ - AddResponseHeader=My-Header-Good,Good
+ - AddResponseHeader=My-Header-Set,Good
+ - AddResponseHeader=My-Header-Rewrite, password=12345678
+ - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
+ - AddResponseHeader=My-Header-Remove,Remove
+ - SetResponseHeader=My-Header-Set, Set
+ - RemoveResponseHeader=My-Header-Remove
+ - RewriteResponseHeader=My-Header-Rewrite, password=[^&]+, password=***
+ - RewriteLocationResponseHeader=AS_IN_REQUEST, Location, ,
+ - StripPrefix=1
+
+ - id: path_route
+ uri: https://httpbin.org
+ predicates:
+ - Path=/new/post/**
+ filters:
+ - RewritePath=/new(?/?.*), $\{segment}
+ - SetPath=/post
+
+ - id: redirect_route
+ uri: https://httpbin.org
+ predicates:
+ - Path=/fake/post/**
+ filters:
+ - RedirectTo=302, https://httpbin.org
+
+ - id: status_route
+ uri: https://httpbin.org
+ predicates:
+ - Path=/delete/**
+ filters:
+ - SetStatus=401
+
+ - id: size_route
+ uri: https://httpbin.org
+ predicates:
+ - Path=/anything
+ filters:
+ - name: RequestSize
+ args:
+ maxSize: 5000000
+
+ - id: retry_test
+ uri: https://httpbin.org
+ predicates:
+ - Path=/status/502
+ filters:
+ - name: Retry
+ args:
+ retries: 3
+ statuses: BAD_GATEWAY
+ methods: GET,POST
+ backoff:
+ firstBackoff: 10ms
+ maxBackoff: 50ms
+ factor: 2
+ basedOnPreviousValue: false
+
+ - id: request_rate_limiter
+ uri: https://httpbin.org
+ predicates:
+ - Path=/redis/get/**
+ filters:
+ - StripPrefix=1
+ - name: RequestRateLimiter
+ args:
+ redis-rate-limiter.replenishRate: 10
+ redis-rate-limiter.burstCapacity: 5
+ key-resolver: "#{@userKeyResolver}"
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/RedisWebFilterFactoriesLiveTest.java b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/RedisWebFilterFactoriesLiveTest.java
new file mode 100644
index 0000000000..a28eb68775
--- /dev/null
+++ b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/RedisWebFilterFactoriesLiveTest.java
@@ -0,0 +1,64 @@
+package com.baeldung.springcloudgateway.webfilters;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.jupiter.api.RepeatedTest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.boot.test.context.TestConfiguration;
+import org.springframework.boot.test.web.client.TestRestTemplate;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.http.ResponseEntity;
+import org.springframework.test.context.ActiveProfiles;
+
+import redis.embedded.RedisServer;
+
+@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
+@ActiveProfiles("webfilters")
+@TestConfiguration
+public class RedisWebFilterFactoriesLiveTest {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(RedisWebFilterFactoriesLiveTest.class);
+
+ private RedisServer redisServer;
+
+ public RedisWebFilterFactoriesLiveTest() {
+ }
+
+ @Before
+ public void postConstruct() {
+ this.redisServer = new RedisServer(6379);
+ redisServer.start();
+ }
+
+ @LocalServerPort
+ String port;
+
+ @Autowired
+ private TestRestTemplate restTemplate;
+
+ @Autowired
+ TestRestTemplate template;
+
+ @RepeatedTest(25)
+ public void whenCallRedisGetThroughGateway_thenOKStatusOrIsReceived() {
+ String url = "http://localhost:" + port + "/redis/get";
+
+ ResponseEntity r = restTemplate.getForEntity(url, String.class);
+ // assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
+
+ LOGGER.info("Received: status->{}, reason->{}, remaining->{}",
+ r.getStatusCodeValue(), r.getStatusCode().getReasonPhrase(),
+ r.getHeaders().get("X-RateLimit-Remaining"));
+ }
+
+ @After
+ public void preDestroy() {
+ redisServer.stop();
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/WebFilterFactoriesLiveTest.java b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/WebFilterFactoriesLiveTest.java
new file mode 100644
index 0000000000..67e00a42fc
--- /dev/null
+++ b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/WebFilterFactoriesLiveTest.java
@@ -0,0 +1,136 @@
+package com.baeldung.springcloudgateway.webfilters;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import org.assertj.core.api.Condition;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.boot.test.web.client.TestRestTemplate;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.web.reactive.server.WebTestClient;
+import org.springframework.test.web.reactive.server.WebTestClient.ResponseSpec;
+
+@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
+@ActiveProfiles("webfilters")
+public class WebFilterFactoriesLiveTest {
+
+ @LocalServerPort
+ String port;
+
+ @Autowired
+ private WebTestClient client;
+
+ @Autowired
+ private TestRestTemplate restTemplate;
+
+ @BeforeEach
+ public void configureClient() {
+ client = WebTestClient.bindToServer()
+ .baseUrl("http://localhost:" + port)
+ .build();
+ }
+
+ @Test
+ public void whenCallGetThroughGateway_thenAllHTTPRequestHeadersParametersAreSet() throws JSONException {
+ String url = "http://localhost:" + port + "/get";
+ ResponseEntity response = restTemplate.getForEntity(url, String.class);
+ assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
+
+ JSONObject json = new JSONObject(response.getBody());
+ JSONObject headers = json.getJSONObject("headers");
+ assertThat(headers.getString("My-Header-Good")).isEqualTo("Good");
+ assertThat(headers.getString("My-Header-Bad")).isEqualTo("Good");
+ assertThat(headers.getString("My-Header-Set")).isEqualTo("Set");
+ assertTrue(headers.isNull("My-Header-Remove"));
+ JSONObject vars = json.getJSONObject("args");
+ assertThat(vars.getString("var")).isEqualTo("good");
+ }
+
+ @Test
+ public void whenCallHeaderPostThroughGateway_thenAllHTTPResponseHeadersAreSet() {
+ ResponseSpec response = client.post()
+ .uri("/header/post")
+ .exchange();
+
+ response.expectStatus()
+ .isOk()
+ .expectHeader()
+ .valueEquals("My-Header-Rewrite", "password=***")
+ .expectHeader()
+ .valueEquals("My-Header-Set", "Set")
+ .expectHeader()
+ .valueEquals("My-Header-Good", "Good")
+ .expectHeader()
+ .doesNotExist("My-Header-Remove");
+ }
+
+ @Test
+ public void whenCallPostThroughGateway_thenBodyIsRetrieved() throws JSONException {
+ String url = "http://localhost:" + port + "/post";
+
+ HttpEntity entity = new HttpEntity<>("content", new HttpHeaders());
+
+ ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
+ assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
+
+ JSONObject json = new JSONObject(response.getBody());
+ JSONObject data = json.getJSONObject("json");
+ assertThat(data.getString("message")).isEqualTo("CONTENT");
+ }
+
+ @Test
+ public void whenCallPutThroughGateway_thenBodyIsRetrieved() throws JSONException {
+ String url = "http://localhost:" + port + "/put";
+
+ HttpEntity entity = new HttpEntity<>("CONTENT", new HttpHeaders());
+
+ ResponseEntity response = restTemplate.exchange(url, HttpMethod.PUT, entity, String.class);
+ assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
+
+ JSONObject json = new JSONObject(response.getBody());
+ assertThat(json.getString("message")).isEqualTo("New Body");
+ }
+
+ @Test
+ public void whenCallDeleteThroughGateway_thenIsUnauthorizedCodeIsSet() {
+ ResponseSpec response = client.delete()
+ .uri("/delete")
+ .exchange();
+
+ response.expectStatus()
+ .isUnauthorized();
+ }
+
+ @Test
+ public void whenCallFakePostThroughGateway_thenIsUnauthorizedCodeIsSet() {
+ ResponseSpec response = client.post()
+ .uri("/fake/post")
+ .exchange();
+
+ response.expectStatus()
+ .is3xxRedirection();
+ }
+
+ @Test
+ public void whenCallStatus504ThroughGateway_thenCircuitBreakerIsExecuted() throws JSONException {
+ String url = "http://localhost:" + port + "/status/504";
+ ResponseEntity response = restTemplate.getForEntity(url, String.class);
+
+ JSONObject json = new JSONObject(response.getBody());
+ assertThat(json.getString("url")).contains("anything");
+ }
+}
diff --git a/spring-cloud/spring-cloud-gateway/src/test/resources/logback-test.xml b/spring-cloud/spring-cloud-gateway/src/test/resources/logback-test.xml
index 6fcdb6317f..6980d119b1 100644
--- a/spring-cloud/spring-cloud-gateway/src/test/resources/logback-test.xml
+++ b/spring-cloud/spring-cloud-gateway/src/test/resources/logback-test.xml
@@ -3,7 +3,15 @@
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-core-2/README.md b/spring-core-2/README.md
index 947b816db8..10d3080b45 100644
--- a/spring-core-2/README.md
+++ b/spring-core-2/README.md
@@ -14,4 +14,5 @@ This module contains articles about core Spring functionality
- [Spring Events](https://www.baeldung.com/spring-events)
- [Spring Null-Safety Annotations](https://www.baeldung.com/spring-null-safety-annotations)
- [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class)
+- [Running Setup Data on Startup in Spring](https://www.baeldung.com/running-setup-logic-on-startup-in-spring)
- More articles: [[<-- prev]](/spring-core)[[next -->]](/spring-core-3)
diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/BeanFactoryDynamicAutowireService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/BeanFactoryDynamicAutowireService.java
new file mode 100644
index 0000000000..4ad4420489
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/BeanFactoryDynamicAutowireService.java
@@ -0,0 +1,27 @@
+package com.baeldung.dynamic.autowire;
+
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class BeanFactoryDynamicAutowireService {
+ private static final String SERVICE_NAME_SUFFIX = "regionService";
+ private final BeanFactory beanFactory;
+
+ @Autowired
+ public BeanFactoryDynamicAutowireService(BeanFactory beanFactory) {
+ this.beanFactory = beanFactory;
+ }
+
+ public boolean isServerActive(String isoCountryCode, int serverId) {
+ RegionService service = beanFactory.getBean(getRegionServiceBeanName(isoCountryCode), RegionService.class);
+
+ return service.isServerActive(serverId);
+ }
+
+ private String getRegionServiceBeanName(String isoCountryCode) {
+ return isoCountryCode + SERVICE_NAME_SUFFIX;
+ }
+
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/CustomMapFromListDynamicAutowireService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/CustomMapFromListDynamicAutowireService.java
new file mode 100644
index 0000000000..e04c345d51
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/CustomMapFromListDynamicAutowireService.java
@@ -0,0 +1,26 @@
+package com.baeldung.dynamic.autowire;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Service
+public class CustomMapFromListDynamicAutowireService {
+ private final Map servicesByCountryCode;
+
+ @Autowired
+ public CustomMapFromListDynamicAutowireService(List regionServices) {
+ servicesByCountryCode = regionServices.stream()
+ .collect(Collectors.toMap(RegionService::getISOCountryCode, Function.identity()));
+ }
+
+ public boolean isServerActive(String isoCountryCode, int serverId) {
+ RegionService service = servicesByCountryCode.get(isoCountryCode);
+
+ return service.isServerActive(serverId);
+ }
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/DynamicAutowireConfig.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/DynamicAutowireConfig.java
new file mode 100644
index 0000000000..256bd9b495
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/DynamicAutowireConfig.java
@@ -0,0 +1,9 @@
+package com.baeldung.dynamic.autowire;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ComponentScan("com.baeldung.dynamic.autowire")
+public class DynamicAutowireConfig {
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/GBRegionService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/GBRegionService.java
new file mode 100644
index 0000000000..8c6a1372d4
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/GBRegionService.java
@@ -0,0 +1,16 @@
+package com.baeldung.dynamic.autowire;
+
+import org.springframework.stereotype.Service;
+
+@Service("GBregionService")
+public class GBRegionService implements RegionService {
+ @Override
+ public boolean isServerActive(int serverId) {
+ return false;
+ }
+
+ @Override
+ public String getISOCountryCode() {
+ return "GB";
+ }
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/RegionService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/RegionService.java
new file mode 100644
index 0000000000..a2caf38ab3
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/RegionService.java
@@ -0,0 +1,7 @@
+package com.baeldung.dynamic.autowire;
+
+public interface RegionService {
+ boolean isServerActive(int serverId);
+
+ String getISOCountryCode();
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/USRegionService.java b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/USRegionService.java
new file mode 100644
index 0000000000..a2d5f47553
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/dynamic/autowire/USRegionService.java
@@ -0,0 +1,16 @@
+package com.baeldung.dynamic.autowire;
+
+import org.springframework.stereotype.Service;
+
+@Service("USregionService")
+public class USRegionService implements RegionService {
+ @Override
+ public boolean isServerActive(int serverId) {
+ return true;
+ }
+
+ @Override
+ public String getISOCountryCode() {
+ return "US";
+ }
+}
diff --git a/spring-core-4/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java
new file mode 100644
index 0000000000..56582ecb66
--- /dev/null
+++ b/spring-core-4/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.dynamic.autowire;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = DynamicAutowireConfig.class)
+public class DynamicAutowireIntegrationTest {
+
+ @Autowired
+ private BeanFactoryDynamicAutowireService beanFactoryDynamicAutowireService;
+
+ @Autowired
+ private CustomMapFromListDynamicAutowireService customMapFromListDynamicAutowireService;
+
+ @Test
+ public void givenDynamicallyAutowiredBean_whenCheckingServerInGB_thenServerIsNotActive() {
+ assertThat(beanFactoryDynamicAutowireService.isServerActive("GB", 101), is(false));
+ assertThat(customMapFromListDynamicAutowireService.isServerActive("GB", 101), is(false));
+ }
+
+ @Test
+ public void givenDynamicallyAutowiredBean_whenCheckingServerInUS_thenServerIsActive() {
+ assertThat(beanFactoryDynamicAutowireService.isServerActive("US", 101), is(true));
+ assertThat(customMapFromListDynamicAutowireService.isServerActive("US", 101), is(true));
+ }
+}
diff --git a/spring-mvc-basics-2/README.md b/spring-mvc-basics-2/README.md
index e52459bd6e..673b7b1fef 100644
--- a/spring-mvc-basics-2/README.md
+++ b/spring-mvc-basics-2/README.md
@@ -9,7 +9,7 @@ This module contains articles about Spring MVC
- [Servlet Redirect vs Forward](https://www.baeldung.com/servlet-redirect-forward)
- [Apache Tiles Integration with Spring MVC](https://www.baeldung.com/spring-mvc-apache-tiles)
- [Guide to Spring Email](https://www.baeldung.com/spring-email)
-- [Using ThymeLeaf and FreeMarker Emails Templates with Spring](https://www.baeldung.com/thymeleaf-freemarker-email)
+- [Using ThymeLeaf and FreeMarker Emails Templates with Spring](https://www.baeldung.com/spring-email-templates)
- [Request Method Not Supported (405) in Spring](https://www.baeldung.com/spring-request-method-not-supported-405)
- [Spring @RequestParam Annotation](https://www.baeldung.com/spring-request-param)
- More articles: [[more -->]](/spring-mvc-basics-3)
diff --git a/spring-mvc-java-2/README.md b/spring-mvc-java-2/README.md
index b5d5df3cd4..09c8d8b294 100644
--- a/spring-mvc-java-2/README.md
+++ b/spring-mvc-java-2/README.md
@@ -1,3 +1,6 @@
### Relevant Articles:
- [Cache Headers in Spring MVC](https://www.baeldung.com/spring-mvc-cache-headers)
+- [Working with Date Parameters in Spring](https://www.baeldung.com/spring-date-parameters)
+- [Spring MVC @PathVariable with a dot (.) gets truncated](https://www.baeldung.com/spring-mvc-pathvariable-dot)
+- [A Quick Guide to Spring MVC Matrix Variables](https://www.baeldung.com/spring-mvc-matrix-variables)
\ No newline at end of file
diff --git a/spring-mvc-java-2/pom.xml b/spring-mvc-java-2/pom.xml
index d5b7d087ab..af622321cb 100644
--- a/spring-mvc-java-2/pom.xml
+++ b/spring-mvc-java-2/pom.xml
@@ -7,14 +7,14 @@
0.1-SNAPSHOT
spring-mvc-java-2
war
-
+
com.baeldung
parent-boot-2
0.0.1-SNAPSHOT
../parent-boot-2
-
+
javax.servlet
@@ -26,14 +26,27 @@
spring-webmvc
${spring.mvc.version}
-
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+
-
+
+
+ spring-mvc-java-2
+
+
+ src/main/resources
+ true
+
+
+
+
4.0.1
5.2.2.RELEASE
-
\ No newline at end of file
diff --git a/spring-mvc-java-2/src/main/java/com/baeldung/cache/WebConfig.java b/spring-mvc-java-2/src/main/java/com/baeldung/cache/CacheWebConfig.java
similarity index 96%
rename from spring-mvc-java-2/src/main/java/com/baeldung/cache/WebConfig.java
rename to spring-mvc-java-2/src/main/java/com/baeldung/cache/CacheWebConfig.java
index 2f07912e80..95367077bd 100644
--- a/spring-mvc-java-2/src/main/java/com/baeldung/cache/WebConfig.java
+++ b/spring-mvc-java-2/src/main/java/com/baeldung/cache/CacheWebConfig.java
@@ -15,7 +15,7 @@ import java.util.concurrent.TimeUnit;
@EnableWebMvc
@Configuration
@ComponentScan(basePackages = {"com.baeldung.cache"})
-public class WebConfig implements WebMvcConfigurer {
+public class CacheWebConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(final ViewControllerRegistry registry) {
diff --git a/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeConfig.java b/spring-mvc-java-2/src/main/java/com/baeldung/datetime/DateTimeConfig.java
similarity index 100%
rename from spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeConfig.java
rename to spring-mvc-java-2/src/main/java/com/baeldung/datetime/DateTimeConfig.java
diff --git a/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeController.java b/spring-mvc-java-2/src/main/java/com/baeldung/datetime/DateTimeController.java
similarity index 100%
rename from spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeController.java
rename to spring-mvc-java-2/src/main/java/com/baeldung/datetime/DateTimeController.java
diff --git a/spring-mvc-java-2/src/main/java/com/baeldung/matrix/config/MatrixWebConfig.java b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/config/MatrixWebConfig.java
new file mode 100644
index 0000000000..489740fd33
--- /dev/null
+++ b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/config/MatrixWebConfig.java
@@ -0,0 +1,18 @@
+package com.baeldung.matrix.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import org.springframework.web.util.UrlPathHelper;
+
+@Configuration
+public class MatrixWebConfig implements WebMvcConfigurer {
+
+ @Override
+ public void configurePathMatch(PathMatchConfigurer configurer) {
+ final UrlPathHelper urlPathHelper = new UrlPathHelper();
+ urlPathHelper.setRemoveSemicolonContent(false);
+
+ configurer.setUrlPathHelper(urlPathHelper);
+ }
+}
diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/CompanyController.java b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/controller/CompanyController.java
similarity index 81%
rename from spring-mvc-java/src/main/java/com/baeldung/web/controller/CompanyController.java
rename to spring-mvc-java-2/src/main/java/com/baeldung/matrix/controller/CompanyController.java
index af1e729c13..7a21ded026 100644
--- a/spring-mvc-java/src/main/java/com/baeldung/web/controller/CompanyController.java
+++ b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/controller/CompanyController.java
@@ -1,23 +1,16 @@
-package com.baeldung.web.controller;
-
-import java.util.HashMap;
-import java.util.Map;
+package com.baeldung.matrix.controller;
+import com.baeldung.matrix.model.Company;
import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.annotation.MatrixVariable;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
-import com.baeldung.model.Company;
+import java.util.HashMap;
+import java.util.Map;
@Controller
public class CompanyController {
diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/EmployeeController.java b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/controller/EmployeeController.java
similarity index 86%
rename from spring-mvc-java/src/main/java/com/baeldung/web/controller/EmployeeController.java
rename to spring-mvc-java-2/src/main/java/com/baeldung/matrix/controller/EmployeeController.java
index 251287dff8..3f9de2179a 100644
--- a/spring-mvc-java/src/main/java/com/baeldung/web/controller/EmployeeController.java
+++ b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/controller/EmployeeController.java
@@ -1,32 +1,22 @@
-package com.baeldung.web.controller;
+package com.baeldung.matrix.controller;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import com.baeldung.matrix.model.Employee;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.annotation.MatrixVariable;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.SessionAttributes;
+import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
-import com.baeldung.model.Employee;
+import java.util.*;
@SessionAttributes("employees")
@Controller
public class EmployeeController {
- Map employeeMap = new HashMap<>();
+ public Map employeeMap = new HashMap<>();
@ModelAttribute("employees")
public void initEmployees() {
diff --git a/spring-mvc-java/src/main/java/com/baeldung/model/Company.java b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/model/Company.java
similarity index 94%
rename from spring-mvc-java/src/main/java/com/baeldung/model/Company.java
rename to spring-mvc-java-2/src/main/java/com/baeldung/matrix/model/Company.java
index 558507268a..cdf6cb0fd6 100644
--- a/spring-mvc-java/src/main/java/com/baeldung/model/Company.java
+++ b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/model/Company.java
@@ -1,4 +1,4 @@
-package com.baeldung.model;
+package com.baeldung.matrix.model;
public class Company {
diff --git a/spring-mvc-java/src/main/java/com/baeldung/model/Employee.java b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/model/Employee.java
similarity index 97%
rename from spring-mvc-java/src/main/java/com/baeldung/model/Employee.java
rename to spring-mvc-java-2/src/main/java/com/baeldung/matrix/model/Employee.java
index fb0a452219..c3384122b4 100644
--- a/spring-mvc-java/src/main/java/com/baeldung/model/Employee.java
+++ b/spring-mvc-java-2/src/main/java/com/baeldung/matrix/model/Employee.java
@@ -1,4 +1,4 @@
-package com.baeldung.model;
+package com.baeldung.matrix.model;
import javax.xml.bind.annotation.XmlRootElement;
diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/CustomWebMvcConfigurationSupport.java b/spring-mvc-java-2/src/main/java/com/baeldung/pathvariable/CustomWebMvcConfigurationSupport.java
similarity index 93%
rename from spring-mvc-java/src/main/java/com/baeldung/spring/web/config/CustomWebMvcConfigurationSupport.java
rename to spring-mvc-java-2/src/main/java/com/baeldung/pathvariable/CustomWebMvcConfigurationSupport.java
index a0dd7358d0..12c208c623 100644
--- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/CustomWebMvcConfigurationSupport.java
+++ b/spring-mvc-java-2/src/main/java/com/baeldung/pathvariable/CustomWebMvcConfigurationSupport.java
@@ -1,4 +1,4 @@
-package com.baeldung.spring.web.config;
+package com.baeldung.pathvariable;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/SiteController.java b/spring-mvc-java-2/src/main/java/com/baeldung/pathvariable/SiteController.java
similarity index 69%
rename from spring-mvc-java/src/main/java/com/baeldung/web/controller/SiteController.java
rename to spring-mvc-java-2/src/main/java/com/baeldung/pathvariable/SiteController.java
index 3867380665..493161b0eb 100644
--- a/spring-mvc-java/src/main/java/com/baeldung/web/controller/SiteController.java
+++ b/spring-mvc-java-2/src/main/java/com/baeldung/pathvariable/SiteController.java
@@ -1,27 +1,30 @@
-package com.baeldung.web.controller;
+package com.baeldung.pathvariable;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+@RestController
@RequestMapping("/site")
public class SiteController {
- @RequestMapping(value = "/{firstValue}/{secondValue}", method = RequestMethod.GET)
+ @GetMapping("/{firstValue}/{secondValue}")
public String requestWithError(@PathVariable("firstValue") String firstValue,
@PathVariable("secondValue") String secondValue) {
return firstValue + " - " + secondValue;
}
- @RequestMapping(value = "/{firstValue}/{secondValue:.+}", method = RequestMethod.GET)
+ @GetMapping("/{firstValue}/{secondValue:.+}")
public String requestWithRegex(@PathVariable("firstValue") String firstValue,
@PathVariable("secondValue") String secondValue) {
return firstValue + " - " + secondValue;
}
- @RequestMapping(value = "/{firstValue}/{secondValue}/", method = RequestMethod.GET)
+ @GetMapping("/{firstValue}/{secondValue}/")
public String requestWithSlash(@PathVariable("firstValue") String firstValue,
@PathVariable("secondValue") String secondValue) {
diff --git a/spring-mvc-java-2/src/main/webapp/WEB-INF/mvc-servlet.xml b/spring-mvc-java-2/src/main/webapp/WEB-INF/mvc-servlet.xml
new file mode 100644
index 0000000000..00dac5f8cb
--- /dev/null
+++ b/spring-mvc-java-2/src/main/webapp/WEB-INF/mvc-servlet.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+ /WEB-INF/view/
+
+
+ .jsp
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-mvc-java/src/main/webapp/WEB-INF/view/companyHome.jsp b/spring-mvc-java-2/src/main/webapp/WEB-INF/view/companyHome.jsp
similarity index 100%
rename from spring-mvc-java/src/main/webapp/WEB-INF/view/companyHome.jsp
rename to spring-mvc-java-2/src/main/webapp/WEB-INF/view/companyHome.jsp
diff --git a/spring-mvc-java/src/main/webapp/WEB-INF/view/companyView.jsp b/spring-mvc-java-2/src/main/webapp/WEB-INF/view/companyView.jsp
similarity index 100%
rename from spring-mvc-java/src/main/webapp/WEB-INF/view/companyView.jsp
rename to spring-mvc-java-2/src/main/webapp/WEB-INF/view/companyView.jsp
diff --git a/spring-mvc-java/src/main/webapp/WEB-INF/view/employeeHome.jsp b/spring-mvc-java-2/src/main/webapp/WEB-INF/view/employeeHome.jsp
similarity index 100%
rename from spring-mvc-java/src/main/webapp/WEB-INF/view/employeeHome.jsp
rename to spring-mvc-java-2/src/main/webapp/WEB-INF/view/employeeHome.jsp
diff --git a/spring-mvc-java/src/main/webapp/WEB-INF/view/employeeView.jsp b/spring-mvc-java-2/src/main/webapp/WEB-INF/view/employeeView.jsp
similarity index 100%
rename from spring-mvc-java/src/main/webapp/WEB-INF/view/employeeView.jsp
rename to spring-mvc-java-2/src/main/webapp/WEB-INF/view/employeeView.jsp
diff --git a/spring-mvc-java-2/src/main/webapp/WEB-INF/web.xml b/spring-mvc-java-2/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..86a24e7646
--- /dev/null
+++ b/spring-mvc-java-2/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,22 @@
+
+
+ Spring MVC Application 2
+
+
+ mvc
+
+ org.springframework.web.servlet.DispatcherServlet
+
+
+ contextConfigLocation
+ /WEB-INF/mvc-servlet.xml
+
+ 1
+
+
+
+ mvc
+ /
+
+
\ No newline at end of file
diff --git a/spring-mvc-java-2/src/test/java/com/baeldung/cache/CacheControlControllerIntegrationTest.java b/spring-mvc-java-2/src/test/java/com/baeldung/cache/CacheControlControllerIntegrationTest.java
index 7acfe5e480..1e34dd182b 100644
--- a/spring-mvc-java-2/src/test/java/com/baeldung/cache/CacheControlControllerIntegrationTest.java
+++ b/spring-mvc-java-2/src/test/java/com/baeldung/cache/CacheControlControllerIntegrationTest.java
@@ -19,7 +19,7 @@ import static org.springframework.http.HttpHeaders.IF_UNMODIFIED_SINCE;
@ExtendWith(SpringExtension.class)
@WebAppConfiguration
-@ContextConfiguration(classes = {WebConfig.class, WebConfig.class})
+@ContextConfiguration(classes = {CacheWebConfig.class, CacheWebConfig.class})
public class CacheControlControllerIntegrationTest {
@Autowired
diff --git a/spring-mvc-java/src/test/java/com/baeldung/web/controller/EmployeeMvcIntegrationTest.java b/spring-mvc-java-2/src/test/java/com/baeldung/matrix/EmployeeMvcIntegrationTest.java
similarity index 81%
rename from spring-mvc-java/src/test/java/com/baeldung/web/controller/EmployeeMvcIntegrationTest.java
rename to spring-mvc-java-2/src/test/java/com/baeldung/matrix/EmployeeMvcIntegrationTest.java
index 86420a5fbd..c061c1efc7 100644
--- a/spring-mvc-java/src/test/java/com/baeldung/web/controller/EmployeeMvcIntegrationTest.java
+++ b/spring-mvc-java-2/src/test/java/com/baeldung/matrix/EmployeeMvcIntegrationTest.java
@@ -1,11 +1,7 @@
-package com.baeldung.web.controller;
-
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
-import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
+package com.baeldung.matrix;
+import com.baeldung.matrix.config.MatrixWebConfig;
+import com.baeldung.matrix.controller.EmployeeController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -18,11 +14,13 @@ import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
-import com.baeldung.spring.web.config.WebConfig;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
-@ContextConfiguration(classes = WebConfig.class)
+@ContextConfiguration(classes = { MatrixWebConfig.class, EmployeeController.class })
public class EmployeeMvcIntegrationTest {
@Autowired
diff --git a/spring-mvc-java/src/test/java/com/baeldung/web/controller/EmployeeNoMvcIntegrationTest.java b/spring-mvc-java-2/src/test/java/com/baeldung/matrix/EmployeeNoMvcIntegrationTest.java
similarity index 86%
rename from spring-mvc-java/src/test/java/com/baeldung/web/controller/EmployeeNoMvcIntegrationTest.java
rename to spring-mvc-java-2/src/test/java/com/baeldung/matrix/EmployeeNoMvcIntegrationTest.java
index e84c20c973..2ca70cc0b9 100644
--- a/spring-mvc-java/src/test/java/com/baeldung/web/controller/EmployeeNoMvcIntegrationTest.java
+++ b/spring-mvc-java-2/src/test/java/com/baeldung/matrix/EmployeeNoMvcIntegrationTest.java
@@ -1,5 +1,8 @@
-package com.baeldung.web.controller;
+package com.baeldung.matrix;
+import com.baeldung.matrix.config.MatrixWebConfig;
+import com.baeldung.matrix.controller.EmployeeController;
+import com.baeldung.matrix.model.Employee;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -9,12 +12,9 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
-import com.baeldung.model.Employee;
-import com.baeldung.spring.web.config.WebConfig;
-
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
-@ContextConfiguration(classes = WebConfig.class)
+@ContextConfiguration(classes = { MatrixWebConfig.class, EmployeeController.class })
public class EmployeeNoMvcIntegrationTest {
@Autowired
diff --git a/spring-mvc-java/README.md b/spring-mvc-java/README.md
index f1263860f9..877d92901a 100644
--- a/spring-mvc-java/README.md
+++ b/spring-mvc-java/README.md
@@ -8,12 +8,9 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
### Relevant Articles:
- [Integration Testing in Spring](https://www.baeldung.com/integration-testing-in-spring)
-- [A Quick Guide to Spring MVC Matrix Variables](https://www.baeldung.com/spring-mvc-matrix-variables)
- [File Upload with Spring MVC](https://www.baeldung.com/spring-file-upload)
- [Introduction to HtmlUnit](https://www.baeldung.com/htmlunit)
- [Upload and Display Excel Files with Spring MVC](https://www.baeldung.com/spring-mvc-excel-files)
- [web.xml vs Initializer with Spring](https://www.baeldung.com/spring-xml-vs-java-config)
-- [Spring MVC @PathVariable with a dot (.) gets truncated](https://www.baeldung.com/spring-mvc-pathvariable-dot)
-- [Working with Date Parameters in Spring](https://www.baeldung.com/spring-date-parameters)
- [A Java Web Application Without a web.xml](https://www.baeldung.com/java-web-app-without-web-xml)
- [Accessing Spring MVC Model Objects in JavaScript](https://www.baeldung.com/spring-mvc-model-objects-js)
diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml
index 49a0db03ed..7ce33dd3e3 100644
--- a/spring-security-modules/pom.xml
+++ b/spring-security-modules/pom.xml
@@ -31,6 +31,7 @@
spring-security-mvc-persisted-remember-me
spring-security-mvc-socket
spring-security-oidc
+ spring-security-okta
spring-security-react
spring-security-rest
spring-security-rest-basic-auth
diff --git a/spring-security-modules/spring-security-core/README.md b/spring-security-modules/spring-security-core/README.md
index e42dfecaa0..f28b3abb2b 100644
--- a/spring-security-modules/spring-security-core/README.md
+++ b/spring-security-modules/spring-security-core/README.md
@@ -8,6 +8,7 @@ This module contains articles about core Spring Security
- [Introduction to Spring Method Security](https://www.baeldung.com/spring-security-method-security)
- [Overview and Need for DelegatingFilterProxy in Spring](https://www.baeldung.com/spring-delegating-filter-proxy)
- [Deny Access on Missing @PreAuthorize to Spring Controller Methods](https://www.baeldung.com/spring-deny-access)
+- [Spring Security: Check If a User Has a Role in Java](https://www.baeldung.com/spring-security-check-user-role)
### Build the Project
diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java
index 67072b5d61..7e6b2c3d9c 100644
--- a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java
+++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java
@@ -42,62 +42,4 @@ public class TaskController {
return ResponseEntity.ok().body(tasks);
}
-
- /**
- * Example of restricting specific endpoints to specific roles using @PreAuthorize.
- */
- @GetMapping("/manager")
- @PreAuthorize("hasRole('ROLE_MANAGER')")
- public ResponseEntity> getAlManagerTasks() {
- Iterable tasks = taskService.findAll();
-
- return ResponseEntity.ok().body(tasks);
- }
-
- /**
- * Example of restricting specific endpoints to specific roles using SecurityContext.
- */
- @GetMapping("/actuator")
- public ResponseEntity> getAlActuatorTasks() {
- Authentication auth = SecurityContextHolder.getContext().getAuthentication();
- if (auth != null && auth.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("ACTUATOR")))
- {
- return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
- }
-
- Iterable tasks = taskService.findAll();
-
- return ResponseEntity.ok().body(tasks);
- }
-
- /**
- * Example of restricting specific endpoints to specific roles using UserDetailsService.
- */
- @GetMapping("/admin")
- public ResponseEntity> getAlAdminTasks() {
- if(userDetailsService != null) {
- UserDetails details = userDetailsService.loadUserByUsername("pam");
- if (details != null && details.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("ADMIN"))) {
- return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
- }
- }
-
- Iterable tasks = taskService.findAll();
-
- return ResponseEntity.ok().body(tasks);
- }
-
- /**
- * Example of restricting specific endpoints to specific roles using HttpServletRequest.
- */
- @GetMapping("/admin2")
- public ResponseEntity> getAlAdminTasksUsingServlet(HttpServletRequest request) {
- if (!request.isUserInRole("ROLE_ADMIN")) {
- return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
- }
-
- Iterable tasks = taskService.findAll();
-
- return ResponseEntity.ok().body(tasks);
- }
}
diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/App.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/App.java
new file mode 100644
index 0000000000..357583a572
--- /dev/null
+++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/App.java
@@ -0,0 +1,11 @@
+package com.baeldung.checkrolejava;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class App {
+ public static void main(String[] args) {
+ SpringApplication.run(com.baeldung.app.App.class, args);
+ }
+}
diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/UnauthorizedException.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/UnauthorizedException.java
new file mode 100644
index 0000000000..11fe9f9e5f
--- /dev/null
+++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/UnauthorizedException.java
@@ -0,0 +1,8 @@
+package com.baeldung.checkrolejava;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@ResponseStatus(value = HttpStatus.UNAUTHORIZED)
+public class UnauthorizedException extends RuntimeException {
+}
diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/UserController.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/UserController.java
new file mode 100644
index 0000000000..3092e94c7f
--- /dev/null
+++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/checkrolejava/UserController.java
@@ -0,0 +1,62 @@
+package com.baeldung.checkrolejava;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+
+import javax.servlet.http.HttpServletRequest;
+
+@Controller
+public class UserController {
+
+ @Autowired
+ private UserDetailsService userDetailsService;
+
+ @PreAuthorize("hasRole('ROLE_ADMIN')")
+ @GetMapping("/user/{id}")
+ public String getUser(@PathVariable("id") String id) {
+ return "user";
+ }
+
+ @PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_MANAGER')")
+ @GetMapping("/users")
+ public String getUsers() {
+ return "users";
+ }
+
+ @GetMapping("v2/user/{id}")
+ public String getUserUsingSecurityContext() {
+ Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+ if (auth != null && auth.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("ADMIN"))) {
+ return "user";
+ }
+
+ throw new UnauthorizedException();
+ }
+
+ @GetMapping("v2/users")
+ public String getUsersUsingDetailsService() {
+ UserDetails details = userDetailsService.loadUserByUsername("mike");
+ if (details != null && details.getAuthorities().stream()
+ .anyMatch(a -> a.getAuthority().equals("ADMIN"))) {
+ return "users";
+ }
+
+ throw new UnauthorizedException();
+ }
+
+ @GetMapping("v3/users")
+ public String getUsers(HttpServletRequest request) {
+ if (request.isUserInRole("ROLE_ADMIN")) {
+ return "users";
+ }
+
+ throw new UnauthorizedException();
+ }
+}
diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/application.properties b/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/application.properties
index 9edd853f2c..84347c2664 100644
--- a/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/application.properties
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/test/resources/customlogouthandler/application.properties
@@ -1,5 +1,4 @@
-spring.datasource.url=jdbc:postgresql://localhost:5432/test
+spring.datasource.driver-class-name=org.h2.Driver
+spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username=test
-spring.datasource.password=test
-
-spring.jpa.hibernate.ddl-auto=create
+spring.datasource.password=test
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-okta/pom.xml b/spring-security-modules/spring-security-okta/pom.xml
new file mode 100644
index 0000000000..c5ff9013b5
--- /dev/null
+++ b/spring-security-modules/spring-security-okta/pom.xml
@@ -0,0 +1,62 @@
+
+
+ 4.0.0
+ spring-security-okta
+ 1.0-SNAPSHOT
+ spring-security-okta
+ war
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ com.okta.spring
+ okta-spring-boot-starter
+ ${okta.spring.version}
+
+
+ com.okta.spring
+ okta-spring-sdk
+ ${okta.spring.version}
+
+
+
+
+ spring-security-okta
+
+
+ src/main/resources
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ true
+
+
+
+
+ repackage
+
+
+
+
+
+
+
+
+ 1.4.0
+
+
diff --git a/spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/Application.java b/spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/Application.java
new file mode 100644
index 0000000000..0c5cc94f10
--- /dev/null
+++ b/spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/Application.java
@@ -0,0 +1,13 @@
+package com.baeldung.okta;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/controller/AdminController.java b/spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/controller/AdminController.java
new file mode 100644
index 0000000000..c7786c4006
--- /dev/null
+++ b/spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/controller/AdminController.java
@@ -0,0 +1,43 @@
+package com.baeldung.okta.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.okta.sdk.client.Client;
+import com.okta.sdk.resource.user.User;
+import com.okta.sdk.resource.user.UserBuilder;
+import com.okta.sdk.resource.user.UserList;
+
+@RestController
+public class AdminController {
+
+ @Autowired
+ public Client client;
+
+ @GetMapping("/users")
+ public UserList getUsers() {
+ return client.listUsers();
+ }
+
+ @GetMapping("/user")
+ public UserList searchUserByEmail(@RequestParam String query) {
+ return client.listUsers(query, null, null, null, null);
+ }
+
+ @GetMapping("/createUser")
+ public User createUser() {
+ char[] tempPassword = {'P','a','$','$','w','0','r','d'};
+ User user = UserBuilder.instance()
+ .setEmail("norman.lewis@email.com")
+ .setFirstName("Norman")
+ .setLastName("Lewis")
+ .setPassword(tempPassword)
+ .setActive(true)
+ .buildAndCreate(client);
+ return user;
+ }
+
+}
+
diff --git a/spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/controller/HomeController.java b/spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/controller/HomeController.java
new file mode 100644
index 0000000000..b8f3ec4e10
--- /dev/null
+++ b/spring-security-modules/spring-security-okta/src/main/java/com/baeldung/okta/controller/HomeController.java
@@ -0,0 +1,16 @@
+package com.baeldung.okta.controller;
+
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.security.oauth2.core.oidc.user.OidcUser;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class HomeController {
+
+ @GetMapping("/")
+ public String home(@AuthenticationPrincipal OidcUser user) {
+ return "Welcome, "+ user.getFullName() +"!";
+ }
+
+}
diff --git a/spring-security-modules/spring-security-okta/src/main/resources/application.properties b/spring-security-modules/spring-security-okta/src/main/resources/application.properties
new file mode 100644
index 0000000000..4a584e3c29
--- /dev/null
+++ b/spring-security-modules/spring-security-okta/src/main/resources/application.properties
@@ -0,0 +1,8 @@
+okta.oauth2.issuer= //Auth server issuer URL
+okta.oauth2.client-id= //Client ID of our Okta application
+okta.oauth2.client-secret= //Client secret of our Okta application
+okta.oauth2.redirect-uri=/authorization-code/callback
+
+#Okta Spring SDK configs
+okta.client.orgUrl= //orgURL
+okta.client.token= //token generated
\ No newline at end of file
diff --git a/spring-swagger-codegen/spring-swagger-codegen-app/README.md b/spring-swagger-codegen/spring-swagger-codegen-app/README.md
index 1cb9e35d99..8740b17ba3 100644
--- a/spring-swagger-codegen/spring-swagger-codegen-app/README.md
+++ b/spring-swagger-codegen/spring-swagger-codegen-app/README.md
@@ -1,3 +1,3 @@
## Spring Swagger Codegen App
-This module contains the code for [Generate Spring Boot REST Client with Swagger](http://www.baeldung.com/spring-boot-rest-client-swagger-codegen).
+This module contains the code for Generate Spring Boot REST Client with Swagger.
diff --git a/spring-thymeleaf-2/README.md b/spring-thymeleaf-2/README.md
index d5c5ead43d..a8c067a443 100644
--- a/spring-thymeleaf-2/README.md
+++ b/spring-thymeleaf-2/README.md
@@ -13,4 +13,5 @@ This module contains articles about Spring with Thymeleaf
- [Working with Boolean in Thymeleaf](https://www.baeldung.com/thymeleaf-boolean)
- [Working With Custom HTML Attributes in Thymeleaf](https://www.baeldung.com/thymeleaf-custom-html-attributes)
- [How to Create an Executable JAR with Maven](https://www.baeldung.com/executable-jar-with-maven)
+- [Spring MVC Data and Thymeleaf](https://www.baeldung.com/spring-mvc-thymeleaf-data)
- [[<-- prev]](/spring-thymeleaf)
diff --git a/stripe/pom.xml b/stripe/pom.xml
index 07d2968f5f..48505c9e4e 100644
--- a/stripe/pom.xml
+++ b/stripe/pom.xml
@@ -11,9 +11,9 @@
com.baeldung
- parent-boot-1
+ parent-boot-2
0.0.1-SNAPSHOT
- ../parent-boot-1
+ ../parent-boot-2
@@ -28,9 +28,6 @@
org.projectlombok
lombok
- ${lombok.version}
-
com.stripe
diff --git a/stripe/src/main/java/com/baeldung/stripe/ChargeRequest.java b/stripe/src/main/java/com/baeldung/stripe/ChargeRequest.java
index a5c056b659..190911afb3 100644
--- a/stripe/src/main/java/com/baeldung/stripe/ChargeRequest.java
+++ b/stripe/src/main/java/com/baeldung/stripe/ChargeRequest.java
@@ -13,4 +13,27 @@ public class ChargeRequest {
private Currency currency;
private String stripeEmail;
private String stripeToken;
+ public String getDescription() {
+ return description;
+ }
+ public int getAmount() {
+ return amount;
+ }
+ public Currency getCurrency() {
+ return currency;
+ }
+ public String getStripeEmail() {
+ return stripeEmail;
+ }
+ public String getStripeToken() {
+ return stripeToken;
+ }
+ public void setDescription(String description) {
+ this.description = description;
+ }
+ public void setCurrency(Currency currency) {
+ this.currency = currency;
+ }
+
+
}
diff --git a/stripe/src/main/resources/application.properties b/stripe/src/main/resources/application.properties
new file mode 100644
index 0000000000..f36df33897
--- /dev/null
+++ b/stripe/src/main/resources/application.properties
@@ -0,0 +1,2 @@
+STRIPE_SECRET_KEY=
+STRIPE_PUBLIC_KEY=
\ No newline at end of file
diff --git a/stripe/src/main/resources/static/index.html b/stripe/src/main/resources/static/index.html
index 090a01e91d..d7ba2bef91 100644
--- a/stripe/src/main/resources/static/index.html
+++ b/stripe/src/main/resources/static/index.html
@@ -1,7 +1,7 @@
-
+
diff --git a/terraform/README.md b/terraform/README.md
new file mode 100644
index 0000000000..19abd2ff20
--- /dev/null
+++ b/terraform/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Introduction to Terraform](https://www.baeldung.com/ops/terraform-intro)
diff --git a/testing-modules/junit5-annotations/README.md b/testing-modules/junit5-annotations/README.md
index 02d4cd652a..bd51bb3d2d 100644
--- a/testing-modules/junit5-annotations/README.md
+++ b/testing-modules/junit5-annotations/README.md
@@ -7,3 +7,4 @@ This module contains articles about JUnit 5 Annotations
- [JUnit 5 Conditional Test Execution with Annotations](https://www.baeldung.com/junit-5-conditional-test-execution)
- [JUnit5 Programmatic Extension Registration with @RegisterExtension](https://www.baeldung.com/junit-5-registerextension-annotation)
- [Guide to JUnit 5 Parameterized Tests](https://www.baeldung.com/parameterized-tests-junit-5)
+- [Writing Templates for Test Cases Using JUnit 5](https://www.baeldung.com/junit5-test-templates)
diff --git a/testing-modules/mockito-2/README.md b/testing-modules/mockito-2/README.md
index 6c9ddee01d..329228186f 100644
--- a/testing-modules/mockito-2/README.md
+++ b/testing-modules/mockito-2/README.md
@@ -5,3 +5,4 @@
- [Mockito Strict Stubbing and The UnnecessaryStubbingException](https://www.baeldung.com/mockito-unnecessary-stubbing-exception)
- [Mockito and Fluent APIs](https://www.baeldung.com/mockito-fluent-apis)
- [Mocking the ObjectMapper readValue() Method](https://www.baeldung.com/mockito-mock-jackson-read-value)
+- [Introduction to Mockito’s AdditionalAnswers](https://www.baeldung.com/mockito-additionalanswers)