From fe6bb0e286fe060c6337bf1623e77bd7d179b283 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Thu, 5 Oct 2023 11:44:52 +0530 Subject: [PATCH 001/294] Primary Commit --- core-java-modules/core-java-streams-5/pom.xml | 6 + .../FirstMatchingElementUnitTest.java | 104 ++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java diff --git a/core-java-modules/core-java-streams-5/pom.xml b/core-java-modules/core-java-streams-5/pom.xml index dc97d81b3d..042186c9bf 100644 --- a/core-java-modules/core-java-streams-5/pom.xml +++ b/core-java-modules/core-java-streams-5/pom.xml @@ -43,6 +43,12 @@ vavr ${vavr.version} + + com.codepoetics + protonpack + 1.16 + + diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java new file mode 100644 index 0000000000..3e9cbcdc0b --- /dev/null +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java @@ -0,0 +1,104 @@ +package com.baeldung.streams.firstmatchingelement; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.Optional; +import java.util.OptionalInt; +import java.util.stream.IntStream; + +import org.assertj.core.util.Lists; +import org.junit.Test; + +import com.codepoetics.protonpack.StreamUtils; + +public class FirstMatchingElementUnitTest { + + @Test + public void testWithForLoop() { + List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); + int index = -1; + for (int i = 0; i < dataList.size(); i++) { + if (dataList.get(i) instanceof Boolean) { + index = i; + } + } + assertEquals(2, index); + } + + @Test + public void testWithIndexOf() { + List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); + Optional booleanData = dataList.stream() + .filter(data -> data instanceof Boolean) + .findFirst(); + int index = booleanData.isPresent() ? dataList.indexOf(booleanData.get()) : -1; + assertEquals(2, index); + } + + @Test + public void testWithIterator() { + List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); + int index = -1; + Iterator iterator = dataList.iterator(); + while (iterator.hasNext()) { + Object data = iterator.next(); + if (data instanceof Boolean) { + index = dataList.indexOf(data); + break; + } + } + assertEquals(2, index); + } + + @Test + public void testWithListIterator() { + List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); + int index = -1; + ListIterator listIterator = dataList.listIterator(); + while (listIterator.hasNext()) { + if (listIterator.next() instanceof Boolean) { + index = listIterator.previousIndex(); + break; + } + } + assertEquals(2, index); + } + + @Test + public void testWithTakeAWhile() { + List dataList = Lists.newArrayList("String", 1, Boolean.TRUE, 2, 3); + OptionalInt booleanIndex = dataList.stream() + .takeWhile(data -> !(data instanceof Boolean)) + .mapToInt(dataList::indexOf) + .max(); + + if (booleanIndex.isPresent() && dataList.get(booleanIndex.getAsInt()) instanceof Boolean) { + assertEquals(2, booleanIndex.getAsInt()); + } + } + + @Test + public void testWithIntStream() { + List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); + int index = IntStream.of(0, dataList.size() - 1) + .filter(streamIndex -> dataList.get(streamIndex) instanceof Boolean) + .findFirst() + .orElse(-1); + assertEquals(2, index); + } + + @Test + public void testWithZipWithIndex() { + List dataList = Lists.newArrayList("String", 1, Boolean.TRUE, 2, 3); + int index = StreamUtils.zipWithIndex(dataList.stream()) + .filter(i -> i.getValue() instanceof Boolean) + .mapToInt(i -> Long.valueOf(i.getIndex()) + .intValue()) + .findFirst() + .orElse(-1); + assertEquals(2, index); + } +} From 31b23630ecf500e83a1c9c3039078d113e15ef17 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Fri, 6 Oct 2023 18:53:27 +0530 Subject: [PATCH 002/294] More Cases covered --- core-java-modules/core-java-streams-5/pom.xml | 11 +- .../FirstMatchingElementUnitTest.java | 101 +++++++++++------- 2 files changed, 71 insertions(+), 41 deletions(-) diff --git a/core-java-modules/core-java-streams-5/pom.xml b/core-java-modules/core-java-streams-5/pom.xml index 042186c9bf..6092b1278e 100644 --- a/core-java-modules/core-java-streams-5/pom.xml +++ b/core-java-modules/core-java-streams-5/pom.xml @@ -48,7 +48,16 @@ protonpack 1.16 - + + org.apache.commons + commons-collections4 + 4.4 + + + one.util + streamex + 0.8.1 + diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java index 3e9cbcdc0b..34e6e62cef 100644 --- a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java @@ -5,42 +5,35 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.Iterator; import java.util.List; import java.util.ListIterator; -import java.util.Optional; import java.util.OptionalInt; import java.util.stream.IntStream; +import org.apache.commons.collections4.IterableUtils; import org.assertj.core.util.Lists; import org.junit.Test; import com.codepoetics.protonpack.StreamUtils; +import com.google.common.collect.Iterables; + +import io.vavr.collection.Stream; +import one.util.streamex.EntryStream; public class FirstMatchingElementUnitTest { - @Test - public void testWithForLoop() { - List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); - int index = -1; - for (int i = 0; i < dataList.size(); i++) { - if (dataList.get(i) instanceof Boolean) { - index = i; - } - } - assertEquals(2, index); - } + private final List dataList = Lists.newArrayList("String", Boolean.TRUE, Integer.valueOf(10), Boolean.FALSE, Double.valueOf(20.0)); @Test - public void testWithIndexOf() { - List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); - Optional booleanData = dataList.stream() + public void whenCalled_thenFindIndexUsingStream() { + int index = dataList.stream() .filter(data -> data instanceof Boolean) - .findFirst(); - int index = booleanData.isPresent() ? dataList.indexOf(booleanData.get()) : -1; - assertEquals(2, index); + .mapToInt(data -> dataList.indexOf(data)) + .findFirst() + .orElse(-1); + assertEquals(1, index); } @Test - public void testWithIterator() { - List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); + public void whenCalled_thenFindIndexUsingStreamIterator() { int index = -1; Iterator iterator = dataList.iterator(); while (iterator.hasNext()) { @@ -50,12 +43,11 @@ public class FirstMatchingElementUnitTest { break; } } - assertEquals(2, index); + assertEquals(1, index); } @Test - public void testWithListIterator() { - List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); + public void whenCalled_thenFindIndexUsingStreamListIterator() { int index = -1; ListIterator listIterator = dataList.listIterator(); while (listIterator.hasNext()) { @@ -64,41 +56,70 @@ public class FirstMatchingElementUnitTest { break; } } - assertEquals(2, index); + assertEquals(1, index); } @Test - public void testWithTakeAWhile() { - List dataList = Lists.newArrayList("String", 1, Boolean.TRUE, 2, 3); + public void whenCalled_thenFindIndexUsingIntStream() { + int index = IntStream.range(0, dataList.size() - 1) + .filter(streamIndex -> dataList.get(streamIndex) instanceof Boolean) + .findFirst() + .orElse(-1); + assertEquals(1, index); + } + + @Test + public void whenCalled_thenFindIndexUsingStreamTakeWhile() { OptionalInt booleanIndex = dataList.stream() .takeWhile(data -> !(data instanceof Boolean)) .mapToInt(dataList::indexOf) .max(); if (booleanIndex.isPresent() && dataList.get(booleanIndex.getAsInt()) instanceof Boolean) { - assertEquals(2, booleanIndex.getAsInt()); + assertEquals(1, booleanIndex.getAsInt()); } } @Test - public void testWithIntStream() { - List dataList = Lists.newArrayList("String", 1, Boolean.TRUE); - int index = IntStream.of(0, dataList.size() - 1) - .filter(streamIndex -> dataList.get(streamIndex) instanceof Boolean) - .findFirst() - .orElse(-1); - assertEquals(2, index); - } - - @Test - public void testWithZipWithIndex() { - List dataList = Lists.newArrayList("String", 1, Boolean.TRUE, 2, 3); + public void whenCalled_thenFindIndexUsingZipWithIndex() { int index = StreamUtils.zipWithIndex(dataList.stream()) .filter(i -> i.getValue() instanceof Boolean) .mapToInt(i -> Long.valueOf(i.getIndex()) .intValue()) .findFirst() .orElse(-1); - assertEquals(2, index); + assertEquals(1, index); + } + + @Test + public void whenCalled_thenFindIndexUsingGoogleGuava() { + int index = Iterables.indexOf(dataList, data -> data instanceof Boolean); + assertEquals(1, index); + } + + @Test + public void whenCalled_thenFindIndexUsingApacheCommons() { + int index = IterableUtils.indexOf(dataList, data -> data instanceof Boolean); + assertEquals(1, index); + } + + @Test + public void whenCalled_thenFindIndexUsingStreamEx() { + Integer foundIndex = EntryStream.of(dataList) + .filterKeyValue((index, data) -> data instanceof Boolean) + .keys() + .findFirst() + .orElse(-1); + assertEquals(1, foundIndex); + } + + @Test + public void whenCalled_thenFindIndexUsingVavrStream() { + Integer foundIndex = Stream.of(dataList.toArray()) + .zipWithIndex() + .find(tuple -> tuple._1() instanceof Boolean) + .map(tuple -> tuple._2()) + .getOrElse(-1); + assertEquals(1, foundIndex); } } From 10da2b32ba321fbaff34a2a93c385b6684a39f92 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Fri, 6 Oct 2023 19:11:54 +0530 Subject: [PATCH 003/294] Indentation Corrections on POM --- core-java-modules/core-java-streams-5/pom.xml | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/core-java-modules/core-java-streams-5/pom.xml b/core-java-modules/core-java-streams-5/pom.xml index 6092b1278e..d7b05f6bac 100644 --- a/core-java-modules/core-java-streams-5/pom.xml +++ b/core-java-modules/core-java-streams-5/pom.xml @@ -43,21 +43,21 @@ vavr ${vavr.version} - - com.codepoetics - protonpack - 1.16 - - - org.apache.commons - commons-collections4 - 4.4 - - - one.util - streamex - 0.8.1 - + + com.codepoetics + protonpack + 1.16 + + + org.apache.commons + commons-collections4 + 4.4 + + + one.util + streamex + 0.8.1 + From 51603e4af61517d5668bffbd6f8254945c76e715 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Sat, 7 Oct 2023 23:28:10 +0530 Subject: [PATCH 004/294] Merge Conflict Fixed --- core-java-modules/core-java-streams-5/pom.xml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/core-java-modules/core-java-streams-5/pom.xml b/core-java-modules/core-java-streams-5/pom.xml index d7baf84d30..adffb4cf19 100644 --- a/core-java-modules/core-java-streams-5/pom.xml +++ b/core-java-modules/core-java-streams-5/pom.xml @@ -48,6 +48,21 @@ guava ${guava.version} + + com.codepoetics + protonpack + 1.16 + + + org.apache.commons + commons-collections4 + 4.4 + + + one.util + streamex + 0.8.1 + From ca432bbe6b036d2a4c18914e2e44b8803d27631f Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Sun, 8 Oct 2023 21:57:29 +0530 Subject: [PATCH 005/294] Updating as per Jira comments --- core-java-modules/core-java-streams-5/pom.xml | 10 ---- .../FirstMatchingElementUnitTest.java | 51 ++++--------------- 2 files changed, 10 insertions(+), 51 deletions(-) diff --git a/core-java-modules/core-java-streams-5/pom.xml b/core-java-modules/core-java-streams-5/pom.xml index adffb4cf19..bdfa4cb76d 100644 --- a/core-java-modules/core-java-streams-5/pom.xml +++ b/core-java-modules/core-java-streams-5/pom.xml @@ -48,21 +48,11 @@ guava ${guava.version} - - com.codepoetics - protonpack - 1.16 - org.apache.commons commons-collections4 4.4 - - one.util - streamex - 0.8.1 - diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java index 34e6e62cef..a7bcef55ec 100644 --- a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java @@ -5,19 +5,14 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.Iterator; import java.util.List; import java.util.ListIterator; -import java.util.OptionalInt; import java.util.stream.IntStream; import org.apache.commons.collections4.IterableUtils; import org.assertj.core.util.Lists; import org.junit.Test; -import com.codepoetics.protonpack.StreamUtils; import com.google.common.collect.Iterables; -import io.vavr.collection.Stream; -import one.util.streamex.EntryStream; - public class FirstMatchingElementUnitTest { private final List dataList = Lists.newArrayList("String", Boolean.TRUE, Integer.valueOf(10), Boolean.FALSE, Double.valueOf(20.0)); @@ -70,25 +65,18 @@ public class FirstMatchingElementUnitTest { @Test public void whenCalled_thenFindIndexUsingStreamTakeWhile() { - OptionalInt booleanIndex = dataList.stream() + int lastIndex = dataList.size() - 1; + int predicateIndex = dataList.stream() .takeWhile(data -> !(data instanceof Boolean)) .mapToInt(dataList::indexOf) - .max(); - - if (booleanIndex.isPresent() && dataList.get(booleanIndex.getAsInt()) instanceof Boolean) { - assertEquals(1, booleanIndex.getAsInt()); - } - } - - @Test - public void whenCalled_thenFindIndexUsingZipWithIndex() { - int index = StreamUtils.zipWithIndex(dataList.stream()) - .filter(i -> i.getValue() instanceof Boolean) - .mapToInt(i -> Long.valueOf(i.getIndex()) - .intValue()) - .findFirst() + .max() .orElse(-1); - assertEquals(1, index); + + if (predicateIndex != 1 && predicateIndex != lastIndex) { + assertEquals(1, predicateIndex + 1); + } else { + assertEquals(lastIndex, predicateIndex); + } } @Test @@ -99,27 +87,8 @@ public class FirstMatchingElementUnitTest { @Test public void whenCalled_thenFindIndexUsingApacheCommons() { + List dataList = Lists.newArrayList("String", Boolean.TRUE, Integer.valueOf(10), Boolean.FALSE, Double.valueOf(20.0)); int index = IterableUtils.indexOf(dataList, data -> data instanceof Boolean); assertEquals(1, index); } - - @Test - public void whenCalled_thenFindIndexUsingStreamEx() { - Integer foundIndex = EntryStream.of(dataList) - .filterKeyValue((index, data) -> data instanceof Boolean) - .keys() - .findFirst() - .orElse(-1); - assertEquals(1, foundIndex); - } - - @Test - public void whenCalled_thenFindIndexUsingVavrStream() { - Integer foundIndex = Stream.of(dataList.toArray()) - .zipWithIndex() - .find(tuple -> tuple._1() instanceof Boolean) - .map(tuple -> tuple._2()) - .getOrElse(-1); - assertEquals(1, foundIndex); - } } From 1002f9b196159f564949424a74ebb99e69484729 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Sun, 8 Oct 2023 21:59:20 +0530 Subject: [PATCH 006/294] Correction --- .../firstmatchingelement/FirstMatchingElementUnitTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java index a7bcef55ec..fb834cd23c 100644 --- a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java @@ -87,7 +87,6 @@ public class FirstMatchingElementUnitTest { @Test public void whenCalled_thenFindIndexUsingApacheCommons() { - List dataList = Lists.newArrayList("String", Boolean.TRUE, Integer.valueOf(10), Boolean.FALSE, Double.valueOf(20.0)); int index = IterableUtils.indexOf(dataList, data -> data instanceof Boolean); assertEquals(1, index); } From 9c152ce3bdc4261589266d7a386c830dd3eb3b7a Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Mon, 9 Oct 2023 20:10:12 +0530 Subject: [PATCH 007/294] Review Comment Implementation --- core-java-modules/core-java-streams-5/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-streams-5/pom.xml b/core-java-modules/core-java-streams-5/pom.xml index bdfa4cb76d..77c477cf40 100644 --- a/core-java-modules/core-java-streams-5/pom.xml +++ b/core-java-modules/core-java-streams-5/pom.xml @@ -51,7 +51,7 @@ org.apache.commons commons-collections4 - 4.4 + ${commons-collections4.version} From a78b189d695869991ba8d378090488b1d9733264 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Mon, 9 Oct 2023 23:27:14 +0530 Subject: [PATCH 008/294] Indentation fixes --- .../FirstMatchingElementUnitTest.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java index fb834cd23c..43feea0074 100644 --- a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java @@ -20,10 +20,10 @@ public class FirstMatchingElementUnitTest { @Test public void whenCalled_thenFindIndexUsingStream() { int index = dataList.stream() - .filter(data -> data instanceof Boolean) - .mapToInt(data -> dataList.indexOf(data)) - .findFirst() - .orElse(-1); + .filter(data -> data instanceof Boolean) + .mapToInt(data -> dataList.indexOf(data)) + .findFirst() + .orElse(-1); assertEquals(1, index); } @@ -57,9 +57,9 @@ public class FirstMatchingElementUnitTest { @Test public void whenCalled_thenFindIndexUsingIntStream() { int index = IntStream.range(0, dataList.size() - 1) - .filter(streamIndex -> dataList.get(streamIndex) instanceof Boolean) - .findFirst() - .orElse(-1); + .filter(streamIndex -> dataList.get(streamIndex) instanceof Boolean) + .findFirst() + .orElse(-1); assertEquals(1, index); } @@ -67,10 +67,10 @@ public class FirstMatchingElementUnitTest { public void whenCalled_thenFindIndexUsingStreamTakeWhile() { int lastIndex = dataList.size() - 1; int predicateIndex = dataList.stream() - .takeWhile(data -> !(data instanceof Boolean)) - .mapToInt(dataList::indexOf) - .max() - .orElse(-1); + .takeWhile(data -> !(data instanceof Boolean)) + .mapToInt(dataList::indexOf) + .max() + .orElse(-1); if (predicateIndex != 1 && predicateIndex != lastIndex) { assertEquals(1, predicateIndex + 1); From 3caca638defb364835f0b9ae6a99e4805c4c99f0 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Thu, 12 Oct 2023 02:58:49 +0530 Subject: [PATCH 009/294] Review Comment Implementation --- .../streams/firstmatchingelement/User.java | 21 ++++++++ .../FirstMatchingElementUnitTest.java | 52 ++++++++++--------- 2 files changed, 48 insertions(+), 25 deletions(-) create mode 100644 core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/firstmatchingelement/User.java diff --git a/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/firstmatchingelement/User.java b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/firstmatchingelement/User.java new file mode 100644 index 0000000000..cb29af529a --- /dev/null +++ b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/firstmatchingelement/User.java @@ -0,0 +1,21 @@ +package com.baeldung.streams.firstmatchingelement; + +public class User { + + private String userName; + private Integer userId; + + public User(Integer userId, String userName) { + this.userId = userId; + this.userName = userName; + } + + public String getUserName() { + return userName; + } + + public Integer getUserId() { + return userId; + } + +} diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java index 43feea0074..d1ca588047 100644 --- a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java @@ -15,26 +15,27 @@ import com.google.common.collect.Iterables; public class FirstMatchingElementUnitTest { - private final List dataList = Lists.newArrayList("String", Boolean.TRUE, Integer.valueOf(10), Boolean.FALSE, Double.valueOf(20.0)); + private List userList = Lists.newArrayList(new User(1, "David"), new User(2, "John"), new User(3, "Roger"), new User(4, "John")); + private String searchName = "John"; @Test - public void whenCalled_thenFindIndexUsingStream() { - int index = dataList.stream() - .filter(data -> data instanceof Boolean) - .mapToInt(data -> dataList.indexOf(data)) + public void whenUsingIndexOf_thenFindFirstMatchingUserIndex() { + int index = userList.stream() + .filter(user -> searchName.equals(user.getUserName())) + .mapToInt(user -> userList.indexOf(user)) .findFirst() .orElse(-1); assertEquals(1, index); } @Test - public void whenCalled_thenFindIndexUsingStreamIterator() { + public void whenUsingIterator_thenFindFirstMatchingUserIndex() { int index = -1; - Iterator iterator = dataList.iterator(); + Iterator iterator = userList.iterator(); while (iterator.hasNext()) { - Object data = iterator.next(); - if (data instanceof Boolean) { - index = dataList.indexOf(data); + User user = iterator.next(); + if (searchName.equals(user.getUserName())) { + index = userList.indexOf(user); break; } } @@ -42,11 +43,12 @@ public class FirstMatchingElementUnitTest { } @Test - public void whenCalled_thenFindIndexUsingStreamListIterator() { + public void whenUsingListIterator_thenFindFirstMatchingUserIndex() { int index = -1; - ListIterator listIterator = dataList.listIterator(); + ListIterator listIterator = userList.listIterator(); while (listIterator.hasNext()) { - if (listIterator.next() instanceof Boolean) { + if (searchName.equals(listIterator.next() + .getUserName())) { index = listIterator.previousIndex(); break; } @@ -55,20 +57,20 @@ public class FirstMatchingElementUnitTest { } @Test - public void whenCalled_thenFindIndexUsingIntStream() { - int index = IntStream.range(0, dataList.size() - 1) - .filter(streamIndex -> dataList.get(streamIndex) instanceof Boolean) + public void whenUsingIntStream_thenFindFirstMatchingUserIndex() { + int index = IntStream.range(0, userList.size() - 1) + .filter(streamIndex -> searchName.equals(userList.get(streamIndex).getUserName())) .findFirst() .orElse(-1); assertEquals(1, index); } @Test - public void whenCalled_thenFindIndexUsingStreamTakeWhile() { - int lastIndex = dataList.size() - 1; - int predicateIndex = dataList.stream() - .takeWhile(data -> !(data instanceof Boolean)) - .mapToInt(dataList::indexOf) + public void whenUsingTakeWhile_thenFindFirstMatchingUserIndex() { + int lastIndex = userList.size() - 1; + int predicateIndex = userList.stream() + .takeWhile(user -> !(searchName.equals(user.getUserName()))) + .mapToInt(userList::indexOf) .max() .orElse(-1); @@ -80,14 +82,14 @@ public class FirstMatchingElementUnitTest { } @Test - public void whenCalled_thenFindIndexUsingGoogleGuava() { - int index = Iterables.indexOf(dataList, data -> data instanceof Boolean); + public void whenUsingGoogleGuava_thenFindFirstMatchingUserIndex() { + int index = Iterables.indexOf(userList, user -> searchName.equals(user.getUserName())); assertEquals(1, index); } @Test - public void whenCalled_thenFindIndexUsingApacheCommons() { - int index = IterableUtils.indexOf(dataList, data -> data instanceof Boolean); + public void whenUsingApacheCommons_thenFindFirstMatchingUserIndex() { + int index = IterableUtils.indexOf(userList, user -> searchName.equals(user.getUserName())); assertEquals(1, index); } } From 63b435c0974f08f3f38ae8d0d20cd28a27f51bd6 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Fri, 20 Oct 2023 18:43:27 +0530 Subject: [PATCH 010/294] Method removal for Iterators --- .../FirstMatchingElementUnitTest.java | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java index d1ca588047..373833e9f7 100644 --- a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java @@ -2,9 +2,7 @@ package com.baeldung.streams.firstmatchingelement; import static org.junit.jupiter.api.Assertions.assertEquals; -import java.util.Iterator; import java.util.List; -import java.util.ListIterator; import java.util.stream.IntStream; import org.apache.commons.collections4.IterableUtils; @@ -28,34 +26,6 @@ public class FirstMatchingElementUnitTest { assertEquals(1, index); } - @Test - public void whenUsingIterator_thenFindFirstMatchingUserIndex() { - int index = -1; - Iterator iterator = userList.iterator(); - while (iterator.hasNext()) { - User user = iterator.next(); - if (searchName.equals(user.getUserName())) { - index = userList.indexOf(user); - break; - } - } - assertEquals(1, index); - } - - @Test - public void whenUsingListIterator_thenFindFirstMatchingUserIndex() { - int index = -1; - ListIterator listIterator = userList.listIterator(); - while (listIterator.hasNext()) { - if (searchName.equals(listIterator.next() - .getUserName())) { - index = listIterator.previousIndex(); - break; - } - } - assertEquals(1, index); - } - @Test public void whenUsingIntStream_thenFindFirstMatchingUserIndex() { int index = IntStream.range(0, userList.size() - 1) From 2f34022dedcdd4c480ed228807ced76b6eed7ff9 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Tue, 31 Oct 2023 18:11:34 +0530 Subject: [PATCH 011/294] Test Case Update --- .../FirstMatchingElementUnitTest.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java index 373833e9f7..48171bab65 100644 --- a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java @@ -3,6 +3,7 @@ package com.baeldung.streams.firstmatchingelement; import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.IntStream; import org.apache.commons.collections4.IterableUtils; @@ -17,12 +18,17 @@ public class FirstMatchingElementUnitTest { private String searchName = "John"; @Test - public void whenUsingIndexOf_thenFindFirstMatchingUserIndex() { + public void whenUsingStream_thenFindFirstMatchingUserIndex() { + AtomicInteger counter = new AtomicInteger(-1); int index = userList.stream() - .filter(user -> searchName.equals(user.getUserName())) - .mapToInt(user -> userList.indexOf(user)) + .filter(user -> { + counter.getAndIncrement(); + return searchName.equals(user.getUserName()); + }) + .map(user -> counter.get()) .findFirst() .orElse(-1); + assertEquals(1, index); } From 2628fe1eb0254330f05010e1219b64c7d9201b2f Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Tue, 7 Nov 2023 23:13:46 +0530 Subject: [PATCH 012/294] Review Comment changes --- .../FirstMatchingElementUnitTest.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java index 48171bab65..2021014957 100644 --- a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java @@ -44,9 +44,13 @@ public class FirstMatchingElementUnitTest { @Test public void whenUsingTakeWhile_thenFindFirstMatchingUserIndex() { int lastIndex = userList.size() - 1; + AtomicInteger counter = new AtomicInteger(-1); int predicateIndex = userList.stream() - .takeWhile(user -> !(searchName.equals(user.getUserName()))) - .mapToInt(userList::indexOf) + .takeWhile(user -> { + counter.getAndIncrement(); + return !(searchName.equals(user.getUserName())); + }) + .mapToInt(user -> counter.get()) .max() .orElse(-1); From c7bd43e881bc52aa1d79f41be942c25f60f3483c Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Tue, 7 Nov 2023 23:14:34 +0530 Subject: [PATCH 013/294] formatting change --- .../FirstMatchingElementUnitTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java index 2021014957..19585a9e9b 100644 --- a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java @@ -46,10 +46,10 @@ public class FirstMatchingElementUnitTest { int lastIndex = userList.size() - 1; AtomicInteger counter = new AtomicInteger(-1); int predicateIndex = userList.stream() - .takeWhile(user -> { - counter.getAndIncrement(); - return !(searchName.equals(user.getUserName())); - }) + .takeWhile(user -> { + counter.getAndIncrement(); + return !(searchName.equals(user.getUserName())); + }) .mapToInt(user -> counter.get()) .max() .orElse(-1); From ab70c92934138684377a2ae99c2c6ae6ff5f484f Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Wed, 8 Nov 2023 22:44:29 +0530 Subject: [PATCH 014/294] Updating map method --- .../firstmatchingelement/FirstMatchingElementUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java index 19585a9e9b..347dadf961 100644 --- a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java @@ -25,7 +25,7 @@ public class FirstMatchingElementUnitTest { counter.getAndIncrement(); return searchName.equals(user.getUserName()); }) - .map(user -> counter.get()) + .mapToInt(user -> counter.get()) .findFirst() .orElse(-1); From 7135047ba1ee35b1cec031a7e653fd68426a0806 Mon Sep 17 00:00:00 2001 From: maenolis Date: Wed, 15 Nov 2023 08:33:33 +0200 Subject: [PATCH 015/294] Initial commit for lazy lambda article --- core-java-modules/core-java-21/pom.xml | 13 +++++++-- .../baeldung/lazylambda/LambdaSupplier.java | 16 ++++++++++ .../lazylambda/LazyLambdaSupplier.java | 22 ++++++++++++++ .../LazyLambdaThreadSafeSupplier.java | 29 +++++++++++++++++++ .../lazylambda/LambdaSupplierUnitTest.java | 24 +++++++++++++++ .../LazyLambdaSupplierUnitTest.java | 23 +++++++++++++++ .../LazyLambdaThreadSafeSupplierUnitTest.java | 23 +++++++++++++++ 7 files changed, 147 insertions(+), 3 deletions(-) create mode 100644 core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java create mode 100644 core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java create mode 100644 core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java create mode 100644 core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java create mode 100644 core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java create mode 100644 core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java diff --git a/core-java-modules/core-java-21/pom.xml b/core-java-modules/core-java-21/pom.xml index bfe1cd2c78..98e73c89c0 100644 --- a/core-java-modules/core-java-21/pom.xml +++ b/core-java-modules/core-java-21/pom.xml @@ -22,9 +22,7 @@ 21 false - - --enable-preview - + --enable-preview @@ -38,6 +36,15 @@ + + + org.mockito + mockito-core + 5.7.0 + test + + + 21 21 diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java new file mode 100644 index 0000000000..a9c4c78edd --- /dev/null +++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java @@ -0,0 +1,16 @@ +package com.baeldung.lazylambda; + +import java.util.function.Supplier; + +public class LambdaSupplier { + + private final Supplier expensiveData; + + public LambdaSupplier(Supplier expensiveData) { + this.expensiveData = expensiveData; + } + + public T getData() { + return expensiveData.get(); + } +} diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java new file mode 100644 index 0000000000..484fadbe90 --- /dev/null +++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java @@ -0,0 +1,22 @@ +package com.baeldung.lazylambda; + +import java.util.function.Supplier; + +public class LazyLambdaSupplier { + + private final Supplier expensiveData; + + private T data; + + public LazyLambdaSupplier(Supplier expensiveData) { + this.expensiveData = expensiveData; + } + + public T getData() { + if (data != null) { + return data; + } + return data = expensiveData.get(); + } + +} diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java new file mode 100644 index 0000000000..27180ced7d --- /dev/null +++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java @@ -0,0 +1,29 @@ +package com.baeldung.lazylambda; + +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; + +public class LazyLambdaThreadSafeSupplier { + + private final Supplier expensiveData; + + private final AtomicReference data; + + public LazyLambdaThreadSafeSupplier(Supplier expensiveData) { + this.expensiveData = expensiveData; + data = new AtomicReference<>(); + } + + public T getData() { + if (data.get() == null) { + synchronized (data) { + if (data.get() == null) { + data.set(expensiveData.get()); + } + } + } + + return data.get(); + } + +} diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java new file mode 100644 index 0000000000..b2d8b91043 --- /dev/null +++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java @@ -0,0 +1,24 @@ +package com.baeldung.lazylambda; + +import java.util.function.Supplier; + +import org.junit.Test; +import org.mockito.Mockito; + +public class LambdaSupplierUnitTest { + + @Test + public void whenCalledMultipleTimes_thenShouldBeCalledMultipleTimes() { + @SuppressWarnings("unchecked") + Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); + Mockito.when(mockedExpensiveFunction.get()).thenReturn("expensive call"); + LambdaSupplier testee = new LambdaSupplier<>(mockedExpensiveFunction); + Mockito.verify(mockedExpensiveFunction, Mockito.never()).get(); + testee.getData(); + testee.getData(); + testee.getData(); + testee.getData(); + Mockito.verify(mockedExpensiveFunction, Mockito.times(4)).get(); + } + +} diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java new file mode 100644 index 0000000000..37464afe2e --- /dev/null +++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.lazylambda; + +import java.util.function.Supplier; + +import org.junit.Test; +import org.mockito.Mockito; + +public class LazyLambdaSupplierUnitTest { + + @Test + public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() { + @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); + Mockito.when(mockedExpensiveFunction.get()).thenReturn("expensive call"); + LazyLambdaSupplier testee = new LazyLambdaSupplier<>(mockedExpensiveFunction); + Mockito.verify(mockedExpensiveFunction, Mockito.never()).get(); + testee.getData(); + testee.getData(); + testee.getData(); + testee.getData(); + Mockito.verify(mockedExpensiveFunction, Mockito.times(1)).get(); + } + +} diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java new file mode 100644 index 0000000000..a67600c974 --- /dev/null +++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.lazylambda; + +import java.util.function.Supplier; + +import org.junit.Test; +import org.mockito.Mockito; + +public class LazyLambdaThreadSafeSupplierUnitTest { + + @Test + public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() { + @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); + Mockito.when(mockedExpensiveFunction.get()).thenReturn("expensive call"); + LazyLambdaThreadSafeSupplier testee = new LazyLambdaThreadSafeSupplier<>(mockedExpensiveFunction); + Mockito.verify(mockedExpensiveFunction, Mockito.never()).get(); + testee.getData(); + testee.getData(); + testee.getData(); + testee.getData(); + Mockito.verify(mockedExpensiveFunction, Mockito.times(1)).get(); + } + +} From 2ed78462c830a7560d8c748d661a3586178a5fb0 Mon Sep 17 00:00:00 2001 From: maenolis Date: Wed, 15 Nov 2023 08:36:28 +0200 Subject: [PATCH 016/294] Code formatting --- .../baeldung/lazylambda/LambdaSupplierUnitTest.java | 12 +++++++----- .../lazylambda/LazyLambdaSupplierUnitTest.java | 9 ++++++--- .../LazyLambdaThreadSafeSupplierUnitTest.java | 9 ++++++--- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java index b2d8b91043..8b705286c2 100644 --- a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java +++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java @@ -9,16 +9,18 @@ public class LambdaSupplierUnitTest { @Test public void whenCalledMultipleTimes_thenShouldBeCalledMultipleTimes() { - @SuppressWarnings("unchecked") - Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); - Mockito.when(mockedExpensiveFunction.get()).thenReturn("expensive call"); + @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); + Mockito.when(mockedExpensiveFunction.get()) + .thenReturn("expensive call"); LambdaSupplier testee = new LambdaSupplier<>(mockedExpensiveFunction); - Mockito.verify(mockedExpensiveFunction, Mockito.never()).get(); + Mockito.verify(mockedExpensiveFunction, Mockito.never()) + .get(); testee.getData(); testee.getData(); testee.getData(); testee.getData(); - Mockito.verify(mockedExpensiveFunction, Mockito.times(4)).get(); + Mockito.verify(mockedExpensiveFunction, Mockito.times(4)) + .get(); } } diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java index 37464afe2e..4f110dfba7 100644 --- a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java +++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java @@ -10,14 +10,17 @@ public class LazyLambdaSupplierUnitTest { @Test public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() { @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); - Mockito.when(mockedExpensiveFunction.get()).thenReturn("expensive call"); + Mockito.when(mockedExpensiveFunction.get()) + .thenReturn("expensive call"); LazyLambdaSupplier testee = new LazyLambdaSupplier<>(mockedExpensiveFunction); - Mockito.verify(mockedExpensiveFunction, Mockito.never()).get(); + Mockito.verify(mockedExpensiveFunction, Mockito.never()) + .get(); testee.getData(); testee.getData(); testee.getData(); testee.getData(); - Mockito.verify(mockedExpensiveFunction, Mockito.times(1)).get(); + Mockito.verify(mockedExpensiveFunction, Mockito.times(1)) + .get(); } } diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java index a67600c974..7870b5a111 100644 --- a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java +++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java @@ -10,14 +10,17 @@ public class LazyLambdaThreadSafeSupplierUnitTest { @Test public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() { @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); - Mockito.when(mockedExpensiveFunction.get()).thenReturn("expensive call"); + Mockito.when(mockedExpensiveFunction.get()) + .thenReturn("expensive call"); LazyLambdaThreadSafeSupplier testee = new LazyLambdaThreadSafeSupplier<>(mockedExpensiveFunction); - Mockito.verify(mockedExpensiveFunction, Mockito.never()).get(); + Mockito.verify(mockedExpensiveFunction, Mockito.never()) + .get(); testee.getData(); testee.getData(); testee.getData(); testee.getData(); - Mockito.verify(mockedExpensiveFunction, Mockito.times(1)).get(); + Mockito.verify(mockedExpensiveFunction, Mockito.times(1)) + .get(); } } From aa357f8b644bdffcba977fdacdb3bb5f687d1b6d Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Thu, 16 Nov 2023 14:43:14 +0530 Subject: [PATCH 017/294] Review comment update --- .../firstmatchingelement/FirstMatchingElementUnitTest.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java index 347dadf961..dbca587ec1 100644 --- a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java @@ -43,7 +43,6 @@ public class FirstMatchingElementUnitTest { @Test public void whenUsingTakeWhile_thenFindFirstMatchingUserIndex() { - int lastIndex = userList.size() - 1; AtomicInteger counter = new AtomicInteger(-1); int predicateIndex = userList.stream() .takeWhile(user -> { @@ -54,11 +53,7 @@ public class FirstMatchingElementUnitTest { .max() .orElse(-1); - if (predicateIndex != 1 && predicateIndex != lastIndex) { - assertEquals(1, predicateIndex + 1); - } else { - assertEquals(lastIndex, predicateIndex); - } + assertEquals(1, predicateIndex + 1); } @Test From 52c96522c1fe23476f4cf9dc89de153d45ee8a16 Mon Sep 17 00:00:00 2001 From: anujgaud <146576725+anujgaud@users.noreply.github.com> Date: Sat, 18 Nov 2023 00:24:38 +0530 Subject: [PATCH 018/294] Add Code for converting LocalDate to ISO 8601 --- .../localdatetoiso/LocalDateToISO.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java new file mode 100644 index 0000000000..7ef5c9bf56 --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java @@ -0,0 +1,25 @@ +package com.baeldung.localDateToISO; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.util.Date; + +import org.apache.commons.lang3.time.DateFormatUtils; + +public class LocalDateToISO { + public String formatUsingDateTimeFormatter(LocalDate localDate) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssX"); + String formattedDate = localDate.atStartOfDay().atOffset(ZoneOffset.UTC).format(formatter); + return formattedDate; + } + + public String formatUsingSimpleDateFormat(LocalDate date) { + Date utilDate = Date.from(date.atStartOfDay(ZoneOffset.UTC).toInstant()); + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); + String formattedDate = dateFormat.format(utilDate); + return formattedDate; + } +} From eaf6ce5fbe54cbdaeaf36772b760474faab60407 Mon Sep 17 00:00:00 2001 From: anujgaud <146576725+anujgaud@users.noreply.github.com> Date: Sat, 18 Nov 2023 00:27:03 +0530 Subject: [PATCH 019/294] Add unit tests for LocalDate to ISO 8601 --- .../LocalDateToISOUnitTest.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java new file mode 100644 index 0000000000..994d0ea356 --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.localDateToISO; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import java.time.LocalDate; + +public class LocalDateToISOUnitTest { + @Test + public void givenLocalDate_whenUsingDateTimeFormatterThenISOFormat(){ + LocalDateToISO localDateToISO = new LocalDateToISO(); + LocalDate localDate = LocalDate.of(2023, 11, 6); + + String expected = "2023-11-06T00:00:00Z"; + String actual = localDateToISO.formatUsingDateTimeFormatter(localDate); + assertEquals(expected, actual); + } + + @Test + public void givenLocalDate_whenUsingSimpleDateFormatThenISOFormat(){ + LocalDateToISO localDateToISO = new LocalDateToISO(); + LocalDate localDate = LocalDate.of(2023, 11, 6); + + String expected = "2023-11-06T00:00:00Z"; + String actual = localDateToISO.formatUsingSimpleDateFormat(localDate); + assertEquals(expected, actual); + } +} From 293322e3a3bc1038021d8ab0c319f19b77c0041f Mon Sep 17 00:00:00 2001 From: anujgaud <146576725+anujgaud@users.noreply.github.com> Date: Sat, 18 Nov 2023 00:58:52 +0530 Subject: [PATCH 020/294] Add Joda library support --- .../com/baeldung/localdatetoiso/LocalDateToISO.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java index 7ef5c9bf56..969006a720 100644 --- a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java +++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java @@ -9,6 +9,10 @@ import java.util.Date; import org.apache.commons.lang3.time.DateFormatUtils; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.joda.time.format.DateTimeFormat; + public class LocalDateToISO { public String formatUsingDateTimeFormatter(LocalDate localDate) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssX"); @@ -22,4 +26,11 @@ public class LocalDateToISO { String formattedDate = dateFormat.format(utilDate); return formattedDate; } + + public String formatUsingJodaTime(org.joda.time.LocalDate localDate) { + DateTime dateTime = localDate.toDateTimeAtStartOfDay(DateTimeZone.UTC); + org.joda.time.format.DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'"); + String formattedDate = formatter.print(localDate); + return formattedDate; + } } From dd89145547200ff4b48bf7198e5bec743e6b0b83 Mon Sep 17 00:00:00 2001 From: anujgaud <146576725+anujgaud@users.noreply.github.com> Date: Sat, 18 Nov 2023 00:59:55 +0530 Subject: [PATCH 021/294] Add unit test for JodaTime method --- .../localdatetoiso/LocalDateToISOUnitTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java index 994d0ea356..077c7ca858 100644 --- a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java @@ -25,4 +25,14 @@ public class LocalDateToISOUnitTest { String actual = localDateToISO.formatUsingSimpleDateFormat(localDate); assertEquals(expected, actual); } + + @Test + public void givenLocalDate_whenUsingJodaTimeThenISOFormat() { + LocalDateToISO localDateToISO = new LocalDateToISO(); + org.joda.time.LocalDate localDate = new org.joda.time.LocalDate(2023, 11, 6); + + String expected = "2023-11-06T00:00:00Z"; + String actual = localDateToISO.formatUsingJodaTime(localDate); + assertEquals(expected, actual); + } } From 62c3d6bf328220c3bf66828cd71eeb3f9e71d845 Mon Sep 17 00:00:00 2001 From: maenolis Date: Fri, 17 Nov 2023 22:44:42 +0200 Subject: [PATCH 022/294] Moved to core-java-function module Added concurrent tests --- .../LazyLambdaSupplierUnitTest.java | 26 ---------- .../LazyLambdaThreadSafeSupplierUnitTest.java | 26 ---------- .../baeldung/lazylambda/LambdaSupplier.java | 2 +- .../lazylambda/LazyLambdaSupplier.java | 7 ++- .../LazyLambdaThreadSafeSupplier.java | 7 +-- .../lazylambda/LambdaSupplierUnitTest.java | 4 +- .../LazyLambdaSupplierUnitTest.java | 51 ++++++++++++++++++ .../LazyLambdaThreadSafeSupplierUnitTest.java | 52 +++++++++++++++++++ 8 files changed, 110 insertions(+), 65 deletions(-) delete mode 100644 core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java delete mode 100644 core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java rename core-java-modules/{core-java-21 => core-java-function}/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java (85%) rename core-java-modules/{core-java-21 => core-java-function}/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java (70%) rename core-java-modules/{core-java-21 => core-java-function}/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java (79%) rename core-java-modules/{core-java-21 => core-java-function}/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java (85%) create mode 100644 core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java create mode 100644 core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java deleted file mode 100644 index 4f110dfba7..0000000000 --- a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baeldung.lazylambda; - -import java.util.function.Supplier; - -import org.junit.Test; -import org.mockito.Mockito; - -public class LazyLambdaSupplierUnitTest { - - @Test - public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() { - @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); - Mockito.when(mockedExpensiveFunction.get()) - .thenReturn("expensive call"); - LazyLambdaSupplier testee = new LazyLambdaSupplier<>(mockedExpensiveFunction); - Mockito.verify(mockedExpensiveFunction, Mockito.never()) - .get(); - testee.getData(); - testee.getData(); - testee.getData(); - testee.getData(); - Mockito.verify(mockedExpensiveFunction, Mockito.times(1)) - .get(); - } - -} diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java deleted file mode 100644 index 7870b5a111..0000000000 --- a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baeldung.lazylambda; - -import java.util.function.Supplier; - -import org.junit.Test; -import org.mockito.Mockito; - -public class LazyLambdaThreadSafeSupplierUnitTest { - - @Test - public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() { - @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); - Mockito.when(mockedExpensiveFunction.get()) - .thenReturn("expensive call"); - LazyLambdaThreadSafeSupplier testee = new LazyLambdaThreadSafeSupplier<>(mockedExpensiveFunction); - Mockito.verify(mockedExpensiveFunction, Mockito.never()) - .get(); - testee.getData(); - testee.getData(); - testee.getData(); - testee.getData(); - Mockito.verify(mockedExpensiveFunction, Mockito.times(1)) - .get(); - } - -} diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java b/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java similarity index 85% rename from core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java rename to core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java index a9c4c78edd..36cd1b31ae 100644 --- a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java +++ b/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java @@ -4,7 +4,7 @@ import java.util.function.Supplier; public class LambdaSupplier { - private final Supplier expensiveData; + protected final Supplier expensiveData; public LambdaSupplier(Supplier expensiveData) { this.expensiveData = expensiveData; diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java b/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java similarity index 70% rename from core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java rename to core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java index 484fadbe90..dce3cc4997 100644 --- a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java +++ b/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java @@ -2,16 +2,15 @@ package com.baeldung.lazylambda; import java.util.function.Supplier; -public class LazyLambdaSupplier { - - private final Supplier expensiveData; +public class LazyLambdaSupplier extends LambdaSupplier { private T data; public LazyLambdaSupplier(Supplier expensiveData) { - this.expensiveData = expensiveData; + super(expensiveData); } + @Override public T getData() { if (data != null) { return data; diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java b/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java similarity index 79% rename from core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java rename to core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java index 27180ced7d..32eec0a5d8 100644 --- a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java +++ b/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java @@ -3,14 +3,12 @@ package com.baeldung.lazylambda; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Supplier; -public class LazyLambdaThreadSafeSupplier { - - private final Supplier expensiveData; +public class LazyLambdaThreadSafeSupplier extends LambdaSupplier { private final AtomicReference data; public LazyLambdaThreadSafeSupplier(Supplier expensiveData) { - this.expensiveData = expensiveData; + super(expensiveData); data = new AtomicReference<>(); } @@ -22,7 +20,6 @@ public class LazyLambdaThreadSafeSupplier { } } } - return data.get(); } diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java b/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java similarity index 85% rename from core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java rename to core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java index 8b705286c2..f0a500e084 100644 --- a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java +++ b/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java @@ -17,9 +17,7 @@ public class LambdaSupplierUnitTest { .get(); testee.getData(); testee.getData(); - testee.getData(); - testee.getData(); - Mockito.verify(mockedExpensiveFunction, Mockito.times(4)) + Mockito.verify(mockedExpensiveFunction, Mockito.times(2)) .get(); } diff --git a/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java b/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java new file mode 100644 index 0000000000..1371983a3d --- /dev/null +++ b/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java @@ -0,0 +1,51 @@ +package com.baeldung.lazylambda; + +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; + +import org.junit.Test; +import org.mockito.Mockito; +import org.mockito.stubbing.Answer; + +public class LazyLambdaSupplierUnitTest { + + @Test + public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() { + @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); + Mockito.when(mockedExpensiveFunction.get()) + .thenReturn("expensive call"); + LazyLambdaSupplier testee = new LazyLambdaSupplier<>(mockedExpensiveFunction); + Mockito.verify(mockedExpensiveFunction, Mockito.never()) + .get(); + testee.getData(); + testee.getData(); + Mockito.verify(mockedExpensiveFunction, Mockito.times(1)) + .get(); + } + + @Test + public void whenCalledMultipleTimesConcurrently_thenShouldBeCalledMultipleTimes() throws InterruptedException { + @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); + Mockito.when(mockedExpensiveFunction.get()) + .thenAnswer((Answer) invocation -> { + Thread.sleep(1000L); + return "Late response!"; + }); + LazyLambdaSupplier testee = new LazyLambdaSupplier<>(mockedExpensiveFunction); + Mockito.verify(mockedExpensiveFunction, Mockito.never()) + .get(); + + ExecutorService executorService = Executors.newFixedThreadPool(4); + executorService.invokeAll(List.of(testee::getData, testee::getData)); + executorService.shutdown(); + if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) { + executorService.shutdownNow(); + } + + Mockito.verify(mockedExpensiveFunction, Mockito.times(2)) + .get(); + } +} diff --git a/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java b/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java new file mode 100644 index 0000000000..83bd49aa7e --- /dev/null +++ b/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java @@ -0,0 +1,52 @@ +package com.baeldung.lazylambda; + +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; + +import org.junit.Test; +import org.mockito.Mockito; +import org.mockito.stubbing.Answer; + +public class LazyLambdaThreadSafeSupplierUnitTest { + + @Test + public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() { + @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); + Mockito.when(mockedExpensiveFunction.get()) + .thenReturn("expensive call"); + LazyLambdaThreadSafeSupplier testee = new LazyLambdaThreadSafeSupplier<>(mockedExpensiveFunction); + Mockito.verify(mockedExpensiveFunction, Mockito.never()) + .get(); + testee.getData(); + testee.getData(); + Mockito.verify(mockedExpensiveFunction, Mockito.times(1)) + .get(); + } + + @Test + public void whenCalledMultipleTimesConcurrently_thenShouldBeCalledOnlyOnce() throws InterruptedException { + @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); + Mockito.when(mockedExpensiveFunction.get()) + .thenAnswer((Answer) invocation -> { + Thread.sleep(1000L); + return "Late response!"; + }); + LazyLambdaThreadSafeSupplier testee = new LazyLambdaThreadSafeSupplier<>(mockedExpensiveFunction); + Mockito.verify(mockedExpensiveFunction, Mockito.never()) + .get(); + + ExecutorService executorService = Executors.newFixedThreadPool(4); + executorService.invokeAll(List.of(testee::getData, testee::getData)); + executorService.shutdown(); + if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) { + executorService.shutdownNow(); + } + + Mockito.verify(mockedExpensiveFunction, Mockito.times(1)) + .get(); + } + +} From 0a3b02fd2411eec6b5fd959a30711c6b5a91e031 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 05:48:43 +0100 Subject: [PATCH 023/294] JAVA-26765: Update spring-boot-data-3 to new mysql connector --- spring-boot-modules/spring-boot-data-3/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-boot-modules/spring-boot-data-3/pom.xml b/spring-boot-modules/spring-boot-data-3/pom.xml index 6c2edbb864..7c0f4b3ffd 100644 --- a/spring-boot-modules/spring-boot-data-3/pom.xml +++ b/spring-boot-modules/spring-boot-data-3/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung spring-boot-data-3 @@ -30,8 +30,8 @@ ${aws-secretsmanager-jdbc.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime From ddf0c7bef89e971decbfc62f19afdecc5a79ec04 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 05:55:12 +0100 Subject: [PATCH 024/294] JAVA-26765: Update design-patterns-architectural to new mysql connector --- patterns-modules/design-patterns-architectural/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/patterns-modules/design-patterns-architectural/pom.xml b/patterns-modules/design-patterns-architectural/pom.xml index 4efcca0c6b..addcdfe390 100644 --- a/patterns-modules/design-patterns-architectural/pom.xml +++ b/patterns-modules/design-patterns-architectural/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 design-patterns-architectural 1.0 @@ -36,8 +36,8 @@ ${hibernate-core.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector.version} jar @@ -65,7 +65,7 @@ 5.2.16.Final - 6.0.6 + 8.2.0 2.7.5 5.3.0 2.7.5 From 2dd443b291dd0d7846fd4ff9c14c843e50acf08c Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 06:00:50 +0100 Subject: [PATCH 025/294] JAVA-26765: Update jhipster-6/bookstore-monolith to new mysql connector --- jhipster-6/bookstore-monolith/pom.xml | 70 +++++++++++++-------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/jhipster-6/bookstore-monolith/pom.xml b/jhipster-6/bookstore-monolith/pom.xml index a35abb9c19..2a5368c9ac 100644 --- a/jhipster-6/bookstore-monolith/pom.xml +++ b/jhipster-6/bookstore-monolith/pom.xml @@ -90,10 +90,10 @@ io.springfox springfox-bean-validators - - - - + + + + com.zaxxer HikariCP @@ -107,8 +107,8 @@ commons-lang3 - mysql - mysql-connector-java + com.mysql + mysql-connector-j org.assertj @@ -136,10 +136,10 @@ net.logstash.logback logstash-logback-encoder - - - - + + + + org.mapstruct mapstruct @@ -423,28 +423,28 @@ jib-maven-plugin ${jib-maven-plugin.version} - - openjdk:8-jre-alpine - - - bookstore:latest - - - - sh - - chmod +x /entrypoint.sh && sync && /entrypoint.sh - - - 8080 - - - ALWAYS - 0 - - true - - + + openjdk:8-jre-alpine + + + bookstore:latest + + + + sh + + chmod +x /entrypoint.sh && sync && /entrypoint.sh + + + 8080 + + + ALWAYS + 0 + + true + + org.liquibase @@ -1137,9 +1137,9 @@ jdt_apt false - - - + + + 3.0.1 From d4b7888a6e0172568e29185e6b55e6546468f4cb Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 06:05:05 +0100 Subject: [PATCH 026/294] JAVA-26765: Update spring-cloud-modules/spring-cloud-vault to new mysql connector --- spring-cloud-modules/spring-cloud-vault/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-cloud-modules/spring-cloud-vault/pom.xml b/spring-cloud-modules/spring-cloud-vault/pom.xml index e4cf020986..58a28bdf5a 100644 --- a/spring-cloud-modules/spring-cloud-vault/pom.xml +++ b/spring-cloud-modules/spring-cloud-vault/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.spring.cloud spring-cloud-vault @@ -42,8 +42,8 @@ test - mysql - mysql-connector-java + com.mysql + mysql-connector-j org.springframework.boot From 9b0e3227bee652018b3d51b0772b8d28ec0522f0 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 06:08:12 +0100 Subject: [PATCH 027/294] JAVA-26765: Update spring-cloud-modules/spring-cloud-aws to new mysql connector --- spring-cloud-modules/spring-cloud-aws/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-cloud-modules/spring-cloud-aws/pom.xml b/spring-cloud-modules/spring-cloud-aws/pom.xml index ff376b02cb..328ddd50de 100644 --- a/spring-cloud-modules/spring-cloud-aws/pom.xml +++ b/spring-cloud-modules/spring-cloud-aws/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.spring.cloud spring-cloud-aws @@ -69,8 +69,8 @@ postgresql - mysql - mysql-connector-java + com.mysql + mysql-connector-j From ec40d41eb1821ed3e46c59407a3c11c43a95200b Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 06:14:18 +0100 Subject: [PATCH 028/294] JAVA-26765: Update spring-cloud-modules/spring-cloud-task/springcloudtaskbatch to new mysql connector --- .../spring-cloud-task/springcloudtaskbatch/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/pom.xml b/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/pom.xml index 7dbbb27a77..f7c13e881f 100644 --- a/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/pom.xml +++ b/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.cloud springcloudtaskbatch @@ -23,8 +23,8 @@ spring-boot-starter-data-jpa - mysql - mysql-connector-java + com.mysql + mysql-connector-j org.springframework.cloud From 64006c8374890ba880993e3fc86d8e21d6fd90f7 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 06:17:34 +0100 Subject: [PATCH 029/294] JAVA-26765: Update web-modules/vraptor to new mysql connector --- web-modules/vraptor/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/web-modules/vraptor/pom.xml b/web-modules/vraptor/pom.xml index 25f8b5d5e5..b26a29e004 100644 --- a/web-modules/vraptor/pom.xml +++ b/web-modules/vraptor/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 vraptor vraptor @@ -80,8 +80,8 @@ ${vraptor-hibernate.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector.version} @@ -118,7 +118,7 @@ 8.0.1.Final 4.1.0-RC3 4.0.4 - 8.0.8-dmr + 8.2.0 0.4 2.3.27-incubating 2.1 From 215a61c122e5a78fbfc56dbe5e2cdf6afef2dc79 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 06:23:59 +0100 Subject: [PATCH 030/294] JAVA-26765: Update web-modules/java-lite to new mysql connector --- web-modules/java-lite/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/web-modules/java-lite/pom.xml b/web-modules/java-lite/pom.xml index 7f1c9182f7..024d38420e 100644 --- a/web-modules/java-lite/pom.xml +++ b/web-modules/java-lite/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.baeldung java-lite @@ -22,8 +22,8 @@ ${activeweb.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.connector.java.version} @@ -88,7 +88,7 @@ 9.4.8.v20171121 1.4.13 1.15 - 5.1.45 + 8.2.0 1.7.0 1.15 From 275de7fd815cbc42fad50e29388f0bb98266a3a7 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 06:27:21 +0100 Subject: [PATCH 031/294] JAVA-26765: Update spring-security-web-boot-1 to new mysql connector --- .../spring-security-web-boot-1/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-security-modules/spring-security-web-boot-1/pom.xml b/spring-security-modules/spring-security-web-boot-1/pom.xml index 08adb700ec..baa9f8e1e5 100644 --- a/spring-security-modules/spring-security-web-boot-1/pom.xml +++ b/spring-security-modules/spring-security-web-boot-1/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-security-web-boot-1 0.0.1-SNAPSHOT @@ -45,8 +45,8 @@ spring-security-data - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime From a76341d307fa6c464201edcf7f1a0ec3362394e6 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 06:30:57 +0100 Subject: [PATCH 032/294] JAVA-26765: Update spring-security-web-boot-2 to new mysql connector --- .../spring-security-web-boot-2/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-security-modules/spring-security-web-boot-2/pom.xml b/spring-security-modules/spring-security-web-boot-2/pom.xml index 2255f8b035..7dcba3cd3e 100644 --- a/spring-security-modules/spring-security-web-boot-2/pom.xml +++ b/spring-security-modules/spring-security-web-boot-2/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-security-web-boot-2 0.0.1-SNAPSHOT @@ -45,8 +45,8 @@ spring-security-data - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime From 1379b2dd94d28d646529603050ec8e2026b982c6 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 21:50:28 +0100 Subject: [PATCH 033/294] JAVA-26765: Update persistence-modules/hibernate-jpa to new mysql connector --- persistence-modules/hibernate-jpa/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/hibernate-jpa/pom.xml b/persistence-modules/hibernate-jpa/pom.xml index 5a99c1c4d0..603c749e95 100644 --- a/persistence-modules/hibernate-jpa/pom.xml +++ b/persistence-modules/hibernate-jpa/pom.xml @@ -56,8 +56,8 @@ ${hibernate.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.version} @@ -83,7 +83,7 @@ - 8.0.32 + 8.2.0 2.6.0 3.0.4 2.1.214 From e33de9ef00a5fa3afb796febb0130fa3ae70265e Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 21:53:11 +0100 Subject: [PATCH 034/294] JAVA-26765: Update persistence-modules/hibernate-libraries to new mysql connector --- persistence-modules/hibernate-libraries/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/persistence-modules/hibernate-libraries/pom.xml b/persistence-modules/hibernate-libraries/pom.xml index 3f4da28296..15292689eb 100644 --- a/persistence-modules/hibernate-libraries/pom.xml +++ b/persistence-modules/hibernate-libraries/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 hibernate-libraries 0.0.1-SNAPSHOT @@ -63,8 +63,8 @@ test - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.version} runtime @@ -168,7 +168,7 @@ 2.0.0 3.8.1 3.8.1 - 8.0.19 + 8.2.0 2.1.3.RELEASE From 30bca1ce27a417c145155e3d15037e6b8577fb21 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 21:54:42 +0100 Subject: [PATCH 035/294] JAVA-26765: Update persistence-modules/activejdbc to new mysql connector --- persistence-modules/activejdbc/pom.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/persistence-modules/activejdbc/pom.xml b/persistence-modules/activejdbc/pom.xml index a661fc3abb..602235b892 100644 --- a/persistence-modules/activejdbc/pom.xml +++ b/persistence-modules/activejdbc/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 activejdbc 1.0-SNAPSHOT @@ -28,8 +28,8 @@ - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.connector.version} @@ -64,8 +64,8 @@ - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.connector.version} @@ -76,7 +76,7 @@ 3.4-j11 development.test,development - 8.0.32 + 8.2.0 \ No newline at end of file From 6d43ac0b9d619c78e9805a2f8bf2311ec293eda6 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 22:00:26 +0100 Subject: [PATCH 036/294] JAVA-26765: Update persistence-modules/spring-data-jpa-repo to new mysql connector --- persistence-modules/spring-data-jpa-repo/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/persistence-modules/spring-data-jpa-repo/pom.xml b/persistence-modules/spring-data-jpa-repo/pom.xml index 26fff365a1..debf9690f6 100644 --- a/persistence-modules/spring-data-jpa-repo/pom.xml +++ b/persistence-modules/spring-data-jpa-repo/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-data-jpa-repo spring-data-jpa-repo @@ -27,8 +27,8 @@ spring-boot-starter-data-jdbc - mysql - mysql-connector-java + com.mysql + mysql-connector-j org.postgresql From 97623cf4c612a9af4c221667dc6dae5b766c52ec Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 22:02:14 +0100 Subject: [PATCH 037/294] JAVA-26765: Update persistence-modules/spring-data-shardingsphere to new mysql connector --- persistence-modules/spring-data-shardingsphere/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/spring-data-shardingsphere/pom.xml b/persistence-modules/spring-data-shardingsphere/pom.xml index c1ca313038..117a3ae7fe 100644 --- a/persistence-modules/spring-data-shardingsphere/pom.xml +++ b/persistence-modules/spring-data-shardingsphere/pom.xml @@ -17,7 +17,7 @@ 5.3.2 - 8.0.33 + 8.2.0 @@ -43,8 +43,8 @@ test - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.version} From ff96e6a70a25933b4b7d8fccc76fbe61e5dca042 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 22:09:19 +0100 Subject: [PATCH 038/294] JAVA-26765: Update persistence-modules/spring-data-rest-querydsl to new mysql connector --- persistence-modules/spring-data-rest-querydsl/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/persistence-modules/spring-data-rest-querydsl/pom.xml b/persistence-modules/spring-data-rest-querydsl/pom.xml index dc1cf64006..89db7d24a5 100644 --- a/persistence-modules/spring-data-rest-querydsl/pom.xml +++ b/persistence-modules/spring-data-rest-querydsl/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-data-rest-querydsl 1.0 @@ -28,8 +28,8 @@ spring-boot-starter-data-jpa - mysql - mysql-connector-java + com.mysql + mysql-connector-j com.querydsl From 8a98a730c65b86d0972a5701391558fe7e62c6e1 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 22:14:39 +0100 Subject: [PATCH 039/294] JAVA-26765: Update persistence-modules/spring-jdbc to new mysql connector --- persistence-modules/spring-jdbc/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/persistence-modules/spring-jdbc/pom.xml b/persistence-modules/spring-jdbc/pom.xml index 08e43e8292..1aa9f4f851 100644 --- a/persistence-modules/spring-jdbc/pom.xml +++ b/persistence-modules/spring-jdbc/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-jdbc spring-jdbc @@ -27,8 +27,8 @@ h2 - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime From d250fb85147724fa41ba1a28dbd4f28ba6ce6b09 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 22:16:34 +0100 Subject: [PATCH 040/294] JAVA-26765: Update persistence-modules/spring-data-jpa-query-2 to new mysql connector --- persistence-modules/spring-data-jpa-query-2/pom.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/persistence-modules/spring-data-jpa-query-2/pom.xml b/persistence-modules/spring-data-jpa-query-2/pom.xml index 1282d1d8a0..62bf7f0314 100644 --- a/persistence-modules/spring-data-jpa-query-2/pom.xml +++ b/persistence-modules/spring-data-jpa-query-2/pom.xml @@ -36,9 +36,9 @@ ${jta.version} - mysql - mysql-connector-java - 3.1.12 + com.mysql + mysql-connector-j + ${mysql.version} com.google.guava @@ -85,6 +85,7 @@ 9.0.0.M26 1.1 + 8.2.0 \ No newline at end of file From d3426ed5a310d20c928e12bd59b1578054d4b147 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 22:19:54 +0100 Subject: [PATCH 041/294] JAVA-26765: Update persistence-modules/spring-enterprise to new mysql connector --- persistence-modules/hibernate-enterprise/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/hibernate-enterprise/pom.xml b/persistence-modules/hibernate-enterprise/pom.xml index 954f8f40d3..caf7b37a41 100644 --- a/persistence-modules/hibernate-enterprise/pom.xml +++ b/persistence-modules/hibernate-enterprise/pom.xml @@ -35,8 +35,8 @@ ${geodb.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.version} @@ -79,7 +79,7 @@ 6.1.7.Final - 8.0.32 + 8.2.0 2.6.0 0.9 From e78f30f89299e26f15e86eecdaaab3af58c0c961 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 22:22:49 +0100 Subject: [PATCH 042/294] JAVA-26765: Update persistence-modules/spring-boot-persistence to new mysql connector --- persistence-modules/spring-boot-persistence/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/spring-boot-persistence/pom.xml b/persistence-modules/spring-boot-persistence/pom.xml index 3c77386ddd..123e21ce59 100644 --- a/persistence-modules/spring-boot-persistence/pom.xml +++ b/persistence-modules/spring-boot-persistence/pom.xml @@ -47,8 +47,8 @@ tomcat-jdbc - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} @@ -72,7 +72,7 @@ 2.23.0 2.0.1.Final - 8.0.31 + 8.2.0 com.baeldung.boot.Application From 5f9c8b078b3545ee9862b768fd353bd51e58a847 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 22:24:44 +0100 Subject: [PATCH 043/294] JAVA-26765: Update persistence-modules/spring-hibernate-6 to new mysql connector --- persistence-modules/spring-hibernate-6/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/persistence-modules/spring-hibernate-6/pom.xml b/persistence-modules/spring-hibernate-6/pom.xml index a13117e68c..f3ea82dfad 100644 --- a/persistence-modules/spring-hibernate-6/pom.xml +++ b/persistence-modules/spring-hibernate-6/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-hibernate-6 0.1-SNAPSHOT @@ -84,8 +84,8 @@ ${hsqldb.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} @@ -102,7 +102,7 @@ 6.1.3 6.2.8.Final - 8.0.7-dmr + 8.2.0 9.0.80 From 1f5f4af22ab4f72e00c6bde52946cda4687982cf Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Tue, 21 Nov 2023 14:09:04 +0100 Subject: [PATCH 044/294] GST-4 Timefold Solver --- pom.xml | 2 + timefold-solver/README.md | 7 +++ timefold-solver/pom.xml | 44 ++++++++++++++ .../com/baeldung/timefoldsolver/Employee.java | 32 +++++++++++ .../com/baeldung/timefoldsolver/Shift.java | 57 +++++++++++++++++++ .../timefoldsolver/ShiftSchedule.java | 47 +++++++++++++++ .../timefoldsolver/ShiftScheduleApp.java | 54 ++++++++++++++++++ .../ShiftScheduleConstraintProvider.java | 37 ++++++++++++ .../ShiftScheduleConstraintProviderTest.java | 50 ++++++++++++++++ 9 files changed, 330 insertions(+) create mode 100644 timefold-solver/README.md create mode 100644 timefold-solver/pom.xml create mode 100644 timefold-solver/src/main/java/com/baeldung/timefoldsolver/Employee.java create mode 100644 timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java create mode 100644 timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java create mode 100644 timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java create mode 100644 timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProvider.java create mode 100644 timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java diff --git a/pom.xml b/pom.xml index 7099dd8cbc..8729aa8f5c 100644 --- a/pom.xml +++ b/pom.xml @@ -894,6 +894,7 @@ tensorflow-java testing-modules testing-modules/mockito-simple + timefold-solver vaadin vavr-modules vertx-modules @@ -1139,6 +1140,7 @@ tensorflow-java testing-modules testing-modules/mockito-simple + timefold-solver vaadin vavr-modules vertx-modules diff --git a/timefold-solver/README.md b/timefold-solver/README.md new file mode 100644 index 0000000000..b7a2dbe14b --- /dev/null +++ b/timefold-solver/README.md @@ -0,0 +1,7 @@ +## OptaPlanner + +This module contains articles about OptaPlanner. + +### Relevant articles + +- [A Guide to OptaPlanner](https://www.baeldung.com/opta-planner) diff --git a/timefold-solver/pom.xml b/timefold-solver/pom.xml new file mode 100644 index 0000000000..2a219a593c --- /dev/null +++ b/timefold-solver/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + timefold-solver + timefold-solver + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + + ai.timefold.solver + timefold-solver-bom + ${version.ai.timefold.solver} + pom + import + + + + + + ai.timefold.solver + timefold-solver-core + + + ai.timefold.solver + timefold-solver-test + test + + + + + 17 + 17 + 1.4.0 + + + diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Employee.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Employee.java new file mode 100644 index 0000000000..c755896201 --- /dev/null +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Employee.java @@ -0,0 +1,32 @@ +package com.baeldung.timefoldsolver; + +import java.util.Set; + +public class Employee { + + private String name; + private Set skills; + + public Employee(String name, Set skills) { + this.name = name; + this.skills = skills; + } + + @Override + public String toString() { + return name; + } + + // ************************************************************************ + // Getters and setters + // ************************************************************************ + + public String getName() { + return name; + } + + public Set getSkills() { + return skills; + } + +} diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java new file mode 100644 index 0000000000..04087134c6 --- /dev/null +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java @@ -0,0 +1,57 @@ +package com.baeldung.timefoldsolver; + +import java.time.LocalDateTime; + +import ai.timefold.solver.core.api.domain.entity.PlanningEntity; +import ai.timefold.solver.core.api.domain.variable.PlanningVariable; + +@PlanningEntity +public class Shift { + + private LocalDateTime start; + private LocalDateTime end; + private String requiredSkill; + + @PlanningVariable + private Employee employee; + + // A no-arg constructor is required for @PlanningEntity annotated classes + public Shift() {} + + public Shift(LocalDateTime start, LocalDateTime end, String requiredSkill) { + this(start, end, requiredSkill, null); + } + + public Shift(LocalDateTime start, LocalDateTime end, String requiredSkill, Employee employee) { + this.start = start; + this.end = end; + this.requiredSkill = requiredSkill; + this.employee = employee; + } + + @Override + public String toString() { + return start + " - " + end; + } + + // ************************************************************************ + // Getters and setters + // ************************************************************************ + + public LocalDateTime getStart() { + return start; + } + + public LocalDateTime getEnd() { + return end; + } + + public String getRequiredSkill() { + return requiredSkill; + } + + public Employee getEmployee() { + return employee; + } + +} diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java new file mode 100644 index 0000000000..85abc8eb66 --- /dev/null +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java @@ -0,0 +1,47 @@ +package com.baeldung.timefoldsolver; + +import java.util.List; + +import ai.timefold.solver.core.api.domain.solution.PlanningEntityCollectionProperty; +import ai.timefold.solver.core.api.domain.solution.PlanningScore; +import ai.timefold.solver.core.api.domain.solution.PlanningSolution; +import ai.timefold.solver.core.api.domain.valuerange.ValueRangeProvider; +import ai.timefold.solver.core.api.score.buildin.hardsoft.HardSoftScore; + +@PlanningSolution +public class ShiftSchedule { + + @ValueRangeProvider + private List employees; + @PlanningEntityCollectionProperty + private List shifts; + + @PlanningScore + private HardSoftScore score = null; + + // A no-arg constructor is required for @PlanningSolution annotated classes + public ShiftSchedule() { + } + + public ShiftSchedule(List employees, List shifts) { + this.employees = employees; + this.shifts = shifts; + } + + // ************************************************************************ + // Getters and setters + // ************************************************************************ + + public List getEmployees() { + return employees; + } + + public List getShifts() { + return shifts; + } + + public HardSoftScore getScore() { + return score; + } + +} diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java new file mode 100644 index 0000000000..9c25922dea --- /dev/null +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java @@ -0,0 +1,54 @@ +package com.baeldung.timefoldsolver; + +import java.time.Duration; +import java.time.LocalDate; +import java.util.List; +import java.util.Set; + +import ai.timefold.solver.core.api.solver.Solver; +import ai.timefold.solver.core.api.solver.SolverFactory; +import ai.timefold.solver.core.config.solver.SolverConfig; + +public class ShiftScheduleApp { + + public static void main(String[] args) { + SolverFactory solverFactory = SolverFactory.create(new SolverConfig() + .withSolutionClass(ShiftSchedule.class) + .withEntityClasses(Shift.class) + .withConstraintProviderClass(ShiftScheduleConstraintProvider.class) + // The solver runs only for 5 seconds on this small dataset. + // It's recommended to run for at least 5 minutes ("5m") otherwise. + .withTerminationSpentLimit(Duration.ofSeconds(5))); + Solver solver = solverFactory.buildSolver(); + + ShiftSchedule problem = loadProblem(); + ShiftSchedule solution = solver.solve(problem); + printSolution(solution); + } + + private static ShiftSchedule loadProblem() { + LocalDate monday = LocalDate.of(2030, 4, 1); + LocalDate tuesday = LocalDate.of(2030, 4, 2); + return new ShiftSchedule(List.of( + new Employee("Ann", Set.of("Bartender")), + new Employee("Beth", Set.of("Waiter", "Bartender")), + new Employee("Carl", Set.of("Waiter")) + ), List.of( + new Shift(monday.atTime(6, 0), monday.atTime(14, 0), "Waiter"), + new Shift(monday.atTime(9, 0), monday.atTime(17, 0), "Bartender"), + new Shift(monday.atTime(14, 0), monday.atTime(22, 0), "Bartender"), + new Shift(tuesday.atTime(6, 0), tuesday.atTime(14, 0), "Waiter"), + new Shift(tuesday.atTime(14, 0), tuesday.atTime(22, 0), "Bartender") + )); + } + + private static void printSolution(ShiftSchedule solution) { + System.out.println("Shift assignments"); + for (Shift shift : solution.getShifts()) { + System.out.println(" " + shift.getStart().toLocalDate() + + " " + shift.getStart().toLocalTime() + " - " + shift.getEnd().toLocalTime() + + ": " + shift.getEmployee().getName()); + } + } + +} diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProvider.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProvider.java new file mode 100644 index 0000000000..0846429460 --- /dev/null +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProvider.java @@ -0,0 +1,37 @@ +package com.baeldung.timefoldsolver; + +import ai.timefold.solver.core.api.score.buildin.hardsoft.HardSoftScore; +import ai.timefold.solver.core.api.score.stream.Constraint; +import ai.timefold.solver.core.api.score.stream.ConstraintFactory; +import ai.timefold.solver.core.api.score.stream.ConstraintProvider; + +import static ai.timefold.solver.core.api.score.stream.Joiners.equal; + +public class ShiftScheduleConstraintProvider implements ConstraintProvider { + + @Override + public Constraint[] defineConstraints(ConstraintFactory constraintFactory) { + return new Constraint[] { + atMostOneShiftPerDay(constraintFactory), + requiredSkill(constraintFactory) + }; + } + + public Constraint atMostOneShiftPerDay(ConstraintFactory constraintFactory) { + return constraintFactory.forEach(Shift.class) + .join(Shift.class, + equal(shift -> shift.getStart().toLocalDate()), + equal(Shift::getEmployee)) + .filter((shift1, shift2) -> shift1 != shift2) + .penalize(HardSoftScore.ONE_HARD) + .asConstraint("At most one shift per day"); + } + + public Constraint requiredSkill(ConstraintFactory constraintFactory) { + return constraintFactory.forEach(Shift.class) + .filter(shift -> !shift.getEmployee().getSkills().contains(shift.getRequiredSkill())) + .penalize(HardSoftScore.ONE_HARD) + .asConstraint("Required skill"); + } + +} diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java new file mode 100644 index 0000000000..9979f5d5e0 --- /dev/null +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java @@ -0,0 +1,50 @@ +package com.baeldung.timefoldsolver; + +import java.time.LocalDate; +import java.util.Set; + +import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; +import org.junit.jupiter.api.Test; + +class ShiftScheduleConstraintProviderTest { + + private static final LocalDate MONDAY = LocalDate.of(2030, 4, 1); + private static final LocalDate TUESDAY = LocalDate.of(2030, 4, 2); + + ConstraintVerifier constraintVerifier = ConstraintVerifier.build( + new ShiftScheduleConstraintProvider(), ShiftSchedule.class, Shift.class); + + @Test + void atMostOneShiftPerDay() { + Employee ann = new Employee("Ann", null); + constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) + .given( + ann, + new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), + new Shift(MONDAY.atTime(14, 0), MONDAY.atTime(22, 0), null, ann)) + // Penalizes both A-B and B-A. To avoid that, use forEachUniquePair() in the constraint instead. + .penalizesBy(2); + constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) + .given( + ann, + new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), + new Shift(TUESDAY.atTime(14, 0), TUESDAY.atTime(22, 0), null, ann)) + .penalizesBy(0); + } + + @Test + void requiredSkill() { + Employee ann = new Employee("Ann", Set.of("Waiter")); + constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::requiredSkill) + .given( + ann, + new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Cook", ann)) + .penalizesBy(1); + constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::requiredSkill) + .given( + ann, + new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Waiter", ann)) + .penalizesBy(0); + } + +} From 3e5904ed8cd9ce15beb96fc4df126c2d4a03f12b Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:10:52 +0100 Subject: [PATCH 045/294] JAVA-26765: Update persistence-modules/core-java-persistence to new mysql connector --- persistence-modules/core-java-persistence/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/persistence-modules/core-java-persistence/pom.xml b/persistence-modules/core-java-persistence/pom.xml index e8add07fbf..e0300f5b9c 100644 --- a/persistence-modules/core-java-persistence/pom.xml +++ b/persistence-modules/core-java-persistence/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.core-java-persistence core-java-persistence @@ -53,8 +53,8 @@ ${springframework.boot.spring-boot-starter.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector.version} runtime @@ -66,7 +66,7 @@ 0.9.5.5 3.0.4 6.0.6 - 8.0.32 + 8.2.0 \ No newline at end of file From 8c3b770e4bd1bdc5b6801febc38053301de43250 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:19:32 +0100 Subject: [PATCH 046/294] JAVA-26765: Update persistence-modules/ibernate-queries to new mysql connector --- persistence-modules/hibernate-queries/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/hibernate-queries/pom.xml b/persistence-modules/hibernate-queries/pom.xml index 76f230a72d..0a736346a4 100644 --- a/persistence-modules/hibernate-queries/pom.xml +++ b/persistence-modules/hibernate-queries/pom.xml @@ -60,8 +60,8 @@ ${hibernate.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.version} @@ -96,7 +96,7 @@ 6.0.6 3.0.3 9.0.0.M26 - 8.0.32 + 8.2.0 2.6.0 2.1.214 6.3.1.Final From b180714d75ac41a559230e3535f15d80c63ecaa7 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:21:15 +0100 Subject: [PATCH 047/294] JAVA-26765: Update persistence-modules/spring-jpa to new mysql connector --- persistence-modules/spring-jpa/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/persistence-modules/spring-jpa/pom.xml b/persistence-modules/spring-jpa/pom.xml index 10e44c0ce4..91766318e6 100644 --- a/persistence-modules/spring-jpa/pom.xml +++ b/persistence-modules/spring-jpa/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-jpa 0.1-SNAPSHOT @@ -54,8 +54,8 @@ ${javassist.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} runtime @@ -117,7 +117,7 @@ 6.0.6 3.29.2-GA - 8.0.33 + 8.2.0 3.1.0 6.0.0 From 78a3c17a3e619d0af3dbe47e702eef5e643d5460 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:24:44 +0100 Subject: [PATCH 048/294] JAVA-26765: Update persistence-modules/apache-cayenne to new mysql connector --- persistence-modules/apache-cayenne/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/apache-cayenne/pom.xml b/persistence-modules/apache-cayenne/pom.xml index 87bf6fe30b..3715198d84 100644 --- a/persistence-modules/apache-cayenne/pom.xml +++ b/persistence-modules/apache-cayenne/pom.xml @@ -22,8 +22,8 @@ ${cayenne.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.connector.version} runtime @@ -40,7 +40,7 @@ - 5.1.44 + 8.2.0 4.0.M5 From 6fbaa02f92a0c94badf78fc00593557b828a6d1d Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:28:38 +0100 Subject: [PATCH 049/294] JAVA-26765: Update persistence-modules/core-java-persistence-2 to new mysql connector --- persistence-modules/core-java-persistence-2/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/core-java-persistence-2/pom.xml b/persistence-modules/core-java-persistence-2/pom.xml index 2013bdb6af..dea261adca 100644 --- a/persistence-modules/core-java-persistence-2/pom.xml +++ b/persistence-modules/core-java-persistence-2/pom.xml @@ -28,8 +28,8 @@ test - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.driver.version} @@ -85,7 +85,7 @@ 8.4.1.jre11 10.2.0.4.0 - 8.0.22 + 8.2.0 3.11.11 20220320 07.00.00-MS-GA From 844e537a5323ab630e471a70adab1de57058d1a0 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:32:04 +0100 Subject: [PATCH 050/294] JAVA-26765: Update persistence-modules/java-jpa to new mysql connector --- persistence-modules/java-jpa/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/java-jpa/pom.xml b/persistence-modules/java-jpa/pom.xml index b96b24582e..169a2e8fd7 100644 --- a/persistence-modules/java-jpa/pom.xml +++ b/persistence-modules/java-jpa/pom.xml @@ -70,8 +70,8 @@ ${javax.annotation.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.version} @@ -135,7 +135,7 @@ 2.1.214 4.0.0 1.3.2 - 8.0.33 + 8.2.0 \ No newline at end of file From a8db23aac25d2946102f7a1c894cb850e013ee61 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:36:50 +0100 Subject: [PATCH 051/294] JAVA-26765: Update persistence-modules/java-jpa-3 to new mysql connector --- persistence-modules/java-jpa-3/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/java-jpa-3/pom.xml b/persistence-modules/java-jpa-3/pom.xml index 0237da7ece..fa3a972623 100644 --- a/persistence-modules/java-jpa-3/pom.xml +++ b/persistence-modules/java-jpa-3/pom.xml @@ -29,8 +29,8 @@ ${h2.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.version} @@ -86,7 +86,7 @@ 5.4.14.Final 2.7.4 - 8.0.21 + 8.2.0 2.2 3.3.3 3.0.0 From 0f05a581e20ffa31e1fd7d7cf909f4bb43935fde Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:37:13 +0100 Subject: [PATCH 052/294] JAVA-26765: Update persistence-modules/spring-boot-persistence-2 to new mysql connector --- persistence-modules/spring-boot-persistence-2/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/spring-boot-persistence-2/pom.xml b/persistence-modules/spring-boot-persistence-2/pom.xml index 6bca6df2b9..7d6b6909c4 100644 --- a/persistence-modules/spring-boot-persistence-2/pom.xml +++ b/persistence-modules/spring-boot-persistence-2/pom.xml @@ -94,8 +94,8 @@ tomcat-jdbc - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} @@ -135,7 +135,7 @@ 2.0.7 1.4.6 - 8.0.33 + 8.2.0 \ No newline at end of file From 15b097bb8af8849eeaf9ef64ec74689bcdd52a20 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:44:04 +0100 Subject: [PATCH 053/294] JAVA-26765: Update persistence-modules/liquibase to new mysql connector --- persistence-modules/liquibase/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/liquibase/pom.xml b/persistence-modules/liquibase/pom.xml index 2fc5803037..90397aec4d 100644 --- a/persistence-modules/liquibase/pom.xml +++ b/persistence-modules/liquibase/pom.xml @@ -14,8 +14,8 @@ - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} @@ -36,7 +36,7 @@ - 5.1.6 + 8.2.0 3.4.2 From e512b83e8bfbf92ca443e35137a75017c459ec3e Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:46:01 +0100 Subject: [PATCH 054/294] JAVA-26765: Update persistence-modules/spring-boto-mysql to new mysql connector --- persistence-modules/spring-boot-mysql/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/persistence-modules/spring-boot-mysql/pom.xml b/persistence-modules/spring-boot-mysql/pom.xml index de1836797c..5c392d2464 100644 --- a/persistence-modules/spring-boot-mysql/pom.xml +++ b/persistence-modules/spring-boot-mysql/pom.xml @@ -33,8 +33,8 @@ true - mysql - mysql-connector-java + com.mysql + mysql-connector-j From 4245d664b700e8919b2cf8e838453885ba221092 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:48:44 +0100 Subject: [PATCH 055/294] JAVA-26765: Update persistence-modules/spring-hibernate-5 to new mysql connector --- persistence-modules/spring-hibernate-5/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/spring-hibernate-5/pom.xml b/persistence-modules/spring-hibernate-5/pom.xml index e559fe1394..32441473bb 100644 --- a/persistence-modules/spring-hibernate-5/pom.xml +++ b/persistence-modules/spring-hibernate-5/pom.xml @@ -99,8 +99,8 @@ ${hsqldb.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} @@ -133,7 +133,7 @@ 5.2.10.Final 5.8.2.Final - 8.0.7-dmr + 8.2.0 9.0.0.M26 1.1 2.3.0.1 From ac8d8ef5c965d18b08441394a70ba93e20740f39 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:50:52 +0100 Subject: [PATCH 056/294] JAVA-26765: Update persistence-modules/read-only-transactions to new mysql connector --- persistence-modules/read-only-transactions/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/read-only-transactions/pom.xml b/persistence-modules/read-only-transactions/pom.xml index 9a347fde88..c485a0d2a8 100644 --- a/persistence-modules/read-only-transactions/pom.xml +++ b/persistence-modules/read-only-transactions/pom.xml @@ -38,8 +38,8 @@ test - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.version} @@ -67,7 +67,7 @@ - 8.0.21 + 8.2.0 4.0.3 5.6.1.Final 2.6.1 From 93ac0a07dc684975f28c8c345c5f7bdaae203518 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:53:37 +0100 Subject: [PATCH 057/294] JAVA-26765: Update persistence-modules/hibernate5 to new mysql connector --- persistence-modules/hibernate5/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml index 1a2c65c6ba..f93fe6c9e7 100644 --- a/persistence-modules/hibernate5/pom.xml +++ b/persistence-modules/hibernate5/pom.xml @@ -30,8 +30,8 @@ ${hibernate.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.version} @@ -58,7 +58,7 @@ 5.4.24.Final - 6.0.6 + 8.2.0 2.2.3 2.1.214 From 2fd61d0f0b43befcc38a10dc79597d690ee03d8d Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:57:36 +0100 Subject: [PATCH 058/294] JAVA-26765: Update persistence-modules/spring-hibernate-3 to new mysql connector --- persistence-modules/spring-hibernate-3/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/spring-hibernate-3/pom.xml b/persistence-modules/spring-hibernate-3/pom.xml index 306c4995d2..61b253d0d2 100644 --- a/persistence-modules/spring-hibernate-3/pom.xml +++ b/persistence-modules/spring-hibernate-3/pom.xml @@ -37,8 +37,8 @@ ${javassist.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} runtime @@ -79,7 +79,7 @@ 3.21.0-GA 3.6.10.Final - 5.1.40 + 8.2.0 8.5.8 From b8c35c0c10345346fa67983b1585c71662f47fdc Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:58:58 +0100 Subject: [PATCH 059/294] JAVA-26765: Update persistence-modules/flyway to new mysql connector --- persistence-modules/flyway/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/persistence-modules/flyway/pom.xml b/persistence-modules/flyway/pom.xml index 18ff9fdb39..df35f85bfb 100644 --- a/persistence-modules/flyway/pom.xml +++ b/persistence-modules/flyway/pom.xml @@ -25,8 +25,8 @@ spring-boot-starter-jdbc - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime From 9088596b1eeb51e539f6a1e5cc4d1e0ed2761123 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 05:18:45 +0100 Subject: [PATCH 060/294] JAVA-26765: Update persistence-modules/parent-boot-2 to new mysql connector --- parent-boot-2/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml index b79be81a66..9b40dbbe8e 100644 --- a/parent-boot-2/pom.xml +++ b/parent-boot-2/pom.xml @@ -25,8 +25,8 @@ import - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} @@ -106,7 +106,7 @@ 1.0.22.RELEASE 2.7.11 1.9.20.1 - 8.0.31 + 8.2.0 \ No newline at end of file From 882016134cf95f69e7388b4303e8f45c15414eee Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 05:20:55 +0100 Subject: [PATCH 061/294] JAVA-26765: Update persistence-modules/spring-exceptions to new mysql connector --- spring-exceptions/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-exceptions/pom.xml b/spring-exceptions/pom.xml index e0071a4206..02a531fe18 100644 --- a/spring-exceptions/pom.xml +++ b/spring-exceptions/pom.xml @@ -60,8 +60,8 @@ ${javassist.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} runtime @@ -162,7 +162,7 @@ 3.21.0-GA 5.2.5.Final - 5.1.40 + 8.2.0 7.0.73 10.13.1.1 From 13ffae329e11628ab23d65a40e9ae37ac112832e Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 05:23:41 +0100 Subject: [PATCH 062/294] JAVA-26765: Update persistence-modules/spring-mvc-forms-jsp to new mysql connector --- spring-web-modules/spring-mvc-forms-jsp/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-web-modules/spring-mvc-forms-jsp/pom.xml b/spring-web-modules/spring-mvc-forms-jsp/pom.xml index 5096c6e23d..636551b555 100644 --- a/spring-web-modules/spring-mvc-forms-jsp/pom.xml +++ b/spring-web-modules/spring-mvc-forms-jsp/pom.xml @@ -43,8 +43,8 @@ ${jstl.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} @@ -104,7 +104,7 @@ 8.0.1.Final 5.2.5.Final - 6.0.6 + 8.2.0 1.3.2 From 349091f9e05b26dd5f648fcf0ee33a0abc02eb5d Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 05:26:06 +0100 Subject: [PATCH 063/294] JAVA-26765: Update persistence-modules/spring-rest-testing to new mysql connector --- spring-web-modules/spring-rest-testing/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-web-modules/spring-rest-testing/pom.xml b/spring-web-modules/spring-rest-testing/pom.xml index 67b3115a6f..db1ec6c165 100644 --- a/spring-web-modules/spring-rest-testing/pom.xml +++ b/spring-web-modules/spring-rest-testing/pom.xml @@ -103,8 +103,8 @@ ${javassist.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime From 4c05325ee09c976dceb48569d4c761d0dbc2b8d6 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 05:28:20 +0100 Subject: [PATCH 064/294] JAVA-26765: Update persistence-modules/spring-rest-query-language to new mysql connector --- spring-web-modules/spring-rest-query-language/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-web-modules/spring-rest-query-language/pom.xml b/spring-web-modules/spring-rest-query-language/pom.xml index 987d678439..b44972603d 100644 --- a/spring-web-modules/spring-rest-query-language/pom.xml +++ b/spring-web-modules/spring-rest-query-language/pom.xml @@ -140,8 +140,8 @@ ${javassist.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime From cf03d6e96b0311e4df08baa3def4721811d5e0de Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 05:30:32 +0100 Subject: [PATCH 065/294] JAVA-26765: Update persistence-modules/cas-secured-app to new mysql connector --- security-modules/cas/cas-secured-app/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/security-modules/cas/cas-secured-app/pom.xml b/security-modules/cas/cas-secured-app/pom.xml index 7c4864b1c0..b5ac123b21 100644 --- a/security-modules/cas/cas-secured-app/pom.xml +++ b/security-modules/cas/cas-secured-app/pom.xml @@ -41,8 +41,8 @@ spring-boot-starter-data-jpa - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime From e4d65e524fcde125cbfdd36b3f61590b3d823dfd Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 05:38:17 +0100 Subject: [PATCH 066/294] Fix: spring-boot-mysql --- persistence-modules/spring-boot-mysql/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/spring-boot-mysql/pom.xml b/persistence-modules/spring-boot-mysql/pom.xml index 5c392d2464..6c19b92314 100644 --- a/persistence-modules/spring-boot-mysql/pom.xml +++ b/persistence-modules/spring-boot-mysql/pom.xml @@ -56,7 +56,7 @@ - 8.0.23 + 8.2.0 \ No newline at end of file From 39f5de4e30413ce808e18afd400ff6d42e1f0dc4 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Thu, 23 Nov 2023 20:54:11 +0530 Subject: [PATCH 067/294] Review Comments --- .../FirstMatchingElementUnitTest.java | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java index dbca587ec1..da4522d097 100644 --- a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java @@ -1,20 +1,20 @@ package com.baeldung.streams.firstmatchingelement; -import static org.junit.jupiter.api.Assertions.assertEquals; + +import static org.junit.Assert.assertEquals; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.IntStream; import org.apache.commons.collections4.IterableUtils; -import org.assertj.core.util.Lists; import org.junit.Test; import com.google.common.collect.Iterables; public class FirstMatchingElementUnitTest { - private List userList = Lists.newArrayList(new User(1, "David"), new User(2, "John"), new User(3, "Roger"), new User(4, "John")); + private List userList = List.of(new User(1, "David"), new User(2, "John"), new User(3, "Roger"), new User(4, "John")); private String searchName = "John"; @Test @@ -43,17 +43,11 @@ public class FirstMatchingElementUnitTest { @Test public void whenUsingTakeWhile_thenFindFirstMatchingUserIndex() { - AtomicInteger counter = new AtomicInteger(-1); - int predicateIndex = userList.stream() - .takeWhile(user -> { - counter.getAndIncrement(); - return !(searchName.equals(user.getUserName())); - }) - .mapToInt(user -> counter.get()) - .max() - .orElse(-1); - - assertEquals(1, predicateIndex + 1); + long predicateIndex = userList.stream() + .takeWhile(user -> !user.getUserName() + .equals(searchName)) + .count(); + assertEquals(1, predicateIndex); } @Test From 6e11ac36a26a1ee5e67bdad3285b58da4589944a Mon Sep 17 00:00:00 2001 From: Harpal Singh Date: Thu, 23 Nov 2023 18:45:27 +0100 Subject: [PATCH 068/294] JAVA-26765: Remove unwanted spaces from bookstore-monolith --- jhipster-6/bookstore-monolith/pom.xml | 66 +++++++++++++-------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/jhipster-6/bookstore-monolith/pom.xml b/jhipster-6/bookstore-monolith/pom.xml index 2a5368c9ac..efe3d2a118 100644 --- a/jhipster-6/bookstore-monolith/pom.xml +++ b/jhipster-6/bookstore-monolith/pom.xml @@ -90,10 +90,10 @@ io.springfox springfox-bean-validators - - - - + + + + com.zaxxer HikariCP @@ -136,10 +136,10 @@ net.logstash.logback logstash-logback-encoder - - - - + + + + org.mapstruct mapstruct @@ -423,28 +423,28 @@ jib-maven-plugin ${jib-maven-plugin.version} - - openjdk:8-jre-alpine - - - bookstore:latest - - - - sh - - chmod +x /entrypoint.sh && sync && /entrypoint.sh - - - 8080 - - - ALWAYS - 0 - - true - - + + openjdk:8-jre-alpine + + + bookstore:latest + + + + sh + + chmod +x /entrypoint.sh && sync && /entrypoint.sh + + + 8080 + + + ALWAYS + 0 + + true + + org.liquibase @@ -1137,9 +1137,9 @@ jdt_apt false - - - + + + 3.0.1 From 179e6e5de26ec55ccbd3dc8194c15f76575bc349 Mon Sep 17 00:00:00 2001 From: Harpal Singh Date: Fri, 24 Nov 2023 00:13:52 +0100 Subject: [PATCH 069/294] JAVA-26765: Remove unwanted spaces from xml --- patterns-modules/design-patterns-architectural/pom.xml | 4 ++-- persistence-modules/activejdbc/pom.xml | 4 ++-- persistence-modules/core-java-persistence/pom.xml | 4 ++-- persistence-modules/hibernate-libraries/pom.xml | 4 ++-- persistence-modules/spring-data-jpa-repo/pom.xml | 4 ++-- persistence-modules/spring-data-rest-querydsl/pom.xml | 4 ++-- persistence-modules/spring-hibernate-6/pom.xml | 4 ++-- persistence-modules/spring-jdbc/pom.xml | 4 ++-- persistence-modules/spring-jpa/pom.xml | 4 ++-- spring-boot-modules/spring-boot-data-3/pom.xml | 4 ++-- spring-cloud-modules/spring-cloud-aws/pom.xml | 4 ++-- .../spring-cloud-task/springcloudtaskbatch/pom.xml | 4 ++-- spring-cloud-modules/spring-cloud-vault/pom.xml | 4 ++-- spring-security-modules/spring-security-web-boot-1/pom.xml | 4 ++-- spring-security-modules/spring-security-web-boot-2/pom.xml | 4 ++-- web-modules/java-lite/pom.xml | 4 ++-- web-modules/vraptor/pom.xml | 4 ++-- 17 files changed, 34 insertions(+), 34 deletions(-) diff --git a/patterns-modules/design-patterns-architectural/pom.xml b/patterns-modules/design-patterns-architectural/pom.xml index addcdfe390..20f320f073 100644 --- a/patterns-modules/design-patterns-architectural/pom.xml +++ b/patterns-modules/design-patterns-architectural/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 design-patterns-architectural 1.0 diff --git a/persistence-modules/activejdbc/pom.xml b/persistence-modules/activejdbc/pom.xml index 602235b892..e41af5c64b 100644 --- a/persistence-modules/activejdbc/pom.xml +++ b/persistence-modules/activejdbc/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 activejdbc 1.0-SNAPSHOT diff --git a/persistence-modules/core-java-persistence/pom.xml b/persistence-modules/core-java-persistence/pom.xml index e0300f5b9c..5d5c36ef01 100644 --- a/persistence-modules/core-java-persistence/pom.xml +++ b/persistence-modules/core-java-persistence/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.core-java-persistence core-java-persistence diff --git a/persistence-modules/hibernate-libraries/pom.xml b/persistence-modules/hibernate-libraries/pom.xml index 15292689eb..5b1879b78e 100644 --- a/persistence-modules/hibernate-libraries/pom.xml +++ b/persistence-modules/hibernate-libraries/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 hibernate-libraries 0.0.1-SNAPSHOT diff --git a/persistence-modules/spring-data-jpa-repo/pom.xml b/persistence-modules/spring-data-jpa-repo/pom.xml index debf9690f6..1c58b5afa5 100644 --- a/persistence-modules/spring-data-jpa-repo/pom.xml +++ b/persistence-modules/spring-data-jpa-repo/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-data-jpa-repo spring-data-jpa-repo diff --git a/persistence-modules/spring-data-rest-querydsl/pom.xml b/persistence-modules/spring-data-rest-querydsl/pom.xml index 89db7d24a5..0fe9d381cf 100644 --- a/persistence-modules/spring-data-rest-querydsl/pom.xml +++ b/persistence-modules/spring-data-rest-querydsl/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-data-rest-querydsl 1.0 diff --git a/persistence-modules/spring-hibernate-6/pom.xml b/persistence-modules/spring-hibernate-6/pom.xml index f3ea82dfad..3cd69a963e 100644 --- a/persistence-modules/spring-hibernate-6/pom.xml +++ b/persistence-modules/spring-hibernate-6/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-hibernate-6 0.1-SNAPSHOT diff --git a/persistence-modules/spring-jdbc/pom.xml b/persistence-modules/spring-jdbc/pom.xml index 1aa9f4f851..1cf4c141b3 100644 --- a/persistence-modules/spring-jdbc/pom.xml +++ b/persistence-modules/spring-jdbc/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-jdbc spring-jdbc diff --git a/persistence-modules/spring-jpa/pom.xml b/persistence-modules/spring-jpa/pom.xml index 91766318e6..61950d9c93 100644 --- a/persistence-modules/spring-jpa/pom.xml +++ b/persistence-modules/spring-jpa/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-jpa 0.1-SNAPSHOT diff --git a/spring-boot-modules/spring-boot-data-3/pom.xml b/spring-boot-modules/spring-boot-data-3/pom.xml index 7c0f4b3ffd..4afafe3c19 100644 --- a/spring-boot-modules/spring-boot-data-3/pom.xml +++ b/spring-boot-modules/spring-boot-data-3/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung spring-boot-data-3 diff --git a/spring-cloud-modules/spring-cloud-aws/pom.xml b/spring-cloud-modules/spring-cloud-aws/pom.xml index 328ddd50de..3de0c7146a 100644 --- a/spring-cloud-modules/spring-cloud-aws/pom.xml +++ b/spring-cloud-modules/spring-cloud-aws/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.spring.cloud spring-cloud-aws diff --git a/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/pom.xml b/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/pom.xml index f7c13e881f..53bc37212c 100644 --- a/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/pom.xml +++ b/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.cloud springcloudtaskbatch diff --git a/spring-cloud-modules/spring-cloud-vault/pom.xml b/spring-cloud-modules/spring-cloud-vault/pom.xml index 58a28bdf5a..1698b1f357 100644 --- a/spring-cloud-modules/spring-cloud-vault/pom.xml +++ b/spring-cloud-modules/spring-cloud-vault/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.spring.cloud spring-cloud-vault diff --git a/spring-security-modules/spring-security-web-boot-1/pom.xml b/spring-security-modules/spring-security-web-boot-1/pom.xml index baa9f8e1e5..e93b0b4f03 100644 --- a/spring-security-modules/spring-security-web-boot-1/pom.xml +++ b/spring-security-modules/spring-security-web-boot-1/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-security-web-boot-1 0.0.1-SNAPSHOT diff --git a/spring-security-modules/spring-security-web-boot-2/pom.xml b/spring-security-modules/spring-security-web-boot-2/pom.xml index 7dcba3cd3e..d3684dd282 100644 --- a/spring-security-modules/spring-security-web-boot-2/pom.xml +++ b/spring-security-modules/spring-security-web-boot-2/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-security-web-boot-2 0.0.1-SNAPSHOT diff --git a/web-modules/java-lite/pom.xml b/web-modules/java-lite/pom.xml index 024d38420e..be079d484e 100644 --- a/web-modules/java-lite/pom.xml +++ b/web-modules/java-lite/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.baeldung java-lite diff --git a/web-modules/vraptor/pom.xml b/web-modules/vraptor/pom.xml index b26a29e004..d952cd71e5 100644 --- a/web-modules/vraptor/pom.xml +++ b/web-modules/vraptor/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 vraptor vraptor From c519d2be47c15ecad61d3f9e21b3e198c565d352 Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Fri, 24 Nov 2023 09:35:01 +0000 Subject: [PATCH 070/294] https://jira.baeldung.com/browse/BAEL-7268 --- .../baeldung/unixtime/UnixTimeUnitTest.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/unixtime/UnixTimeUnitTest.java diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/unixtime/UnixTimeUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/unixtime/UnixTimeUnitTest.java new file mode 100644 index 0000000000..d1518ceef5 --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/unixtime/UnixTimeUnitTest.java @@ -0,0 +1,50 @@ +package com.baeldung.unixtime; + + +import static org.junit.Assert.assertEquals; + +import java.time.Instant; +import java.util.Date; + +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.junit.jupiter.api.Test; + +public class UnixTimeUnitTest { + + @Test + public void givenCurrentTimeUsingDateApi_whenConvertedToUnixTime_thenConsistent() { + long marginOfError = 1L; + Date date = new Date(); + long longTime = date.getTime() / 1000L; + + for (int i = 0; i < 10; i++) { + long unixTime = System.currentTimeMillis() / 1000L; + assertEquals(longTime, unixTime, marginOfError); + } + } + + @Test + public void givenCurrentTimeUsingInstantNow_whenConvertedToUnixTime_thenConsistent() { + long marginOfError = 1L; + long longTime = Instant.now().getEpochSecond(); + + for (int i = 0; i < 10; i++) { + long unixTime = System.currentTimeMillis() / 1000L; + assertEquals(longTime, unixTime, marginOfError); + } + } + + @Test + public void givenCurrentTimeUsingJodaTime_whenConvertedToUnixTime_thenConsistent() { + long marginOfError = 1L; + DateTime dateTime = DateTime.now(DateTimeZone.UTC); + long longTime = dateTime.getMillis() / 1000L; + + for (int i = 0; i < 10; i++) { + long unixTime = System.currentTimeMillis() / 1000L; + assertEquals(longTime, unixTime, marginOfError); + } + } + +} From 39a7c066059b7db29fb75b98a5cc03a6d7843b5b Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Fri, 24 Nov 2023 15:08:56 +0100 Subject: [PATCH 071/294] Remove commetn blocks Co-authored-by: Liam Williams --- .../src/main/java/com/baeldung/timefoldsolver/Shift.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java index 04087134c6..9c7b663ecd 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java @@ -34,10 +34,6 @@ public class Shift { return start + " - " + end; } - // ************************************************************************ - // Getters and setters - // ************************************************************************ - public LocalDateTime getStart() { return start; } From 8e8331376ef326e5efc059a804373beb9b5311de Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Fri, 24 Nov 2023 15:09:03 +0100 Subject: [PATCH 072/294] Remove commetn blocks Co-authored-by: Liam Williams --- .../src/main/java/com/baeldung/timefoldsolver/Employee.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Employee.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Employee.java index c755896201..ef4752a8c6 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Employee.java +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Employee.java @@ -17,10 +17,6 @@ public class Employee { return name; } - // ************************************************************************ - // Getters and setters - // ************************************************************************ - public String getName() { return name; } From 2478475ceae6da380542501956604ff65fc88cd6 Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Fri, 24 Nov 2023 15:09:14 +0100 Subject: [PATCH 073/294] Remove comment blocks Co-authored-by: Liam Williams --- .../main/java/com/baeldung/timefoldsolver/ShiftSchedule.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java index 85abc8eb66..7794d46a28 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java @@ -28,10 +28,6 @@ public class ShiftSchedule { this.shifts = shifts; } - // ************************************************************************ - // Getters and setters - // ************************************************************************ - public List getEmployees() { return employees; } From 464bf4cda6c028505aaa357afa0d8c5454b9e093 Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Fri, 24 Nov 2023 15:12:23 +0100 Subject: [PATCH 074/294] Fields default to null. Co-authored-by: Liam Williams --- .../main/java/com/baeldung/timefoldsolver/ShiftSchedule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java index 7794d46a28..794c31e5b7 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java @@ -17,7 +17,7 @@ public class ShiftSchedule { private List shifts; @PlanningScore - private HardSoftScore score = null; + private HardSoftScore score; // A no-arg constructor is required for @PlanningSolution annotated classes public ShiftSchedule() { From 783d9dbd0189b6f427190b28db22e5ebe5b123bb Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Fri, 24 Nov 2023 21:01:28 +0100 Subject: [PATCH 075/294] Use slf4j --- .../com/baeldung/timefoldsolver/ShiftScheduleApp.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java index 9c25922dea..9170e2363f 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java @@ -8,9 +8,13 @@ import java.util.Set; import ai.timefold.solver.core.api.solver.Solver; import ai.timefold.solver.core.api.solver.SolverFactory; import ai.timefold.solver.core.config.solver.SolverConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ShiftScheduleApp { + private static final Logger logger = LoggerFactory.getLogger(ShiftScheduleApp.class); + public static void main(String[] args) { SolverFactory solverFactory = SolverFactory.create(new SolverConfig() .withSolutionClass(ShiftSchedule.class) @@ -43,9 +47,9 @@ public class ShiftScheduleApp { } private static void printSolution(ShiftSchedule solution) { - System.out.println("Shift assignments"); + logger.info("Shift assignments"); for (Shift shift : solution.getShifts()) { - System.out.println(" " + shift.getStart().toLocalDate() + logger.info(" " + shift.getStart().toLocalDate() + " " + shift.getStart().toLocalTime() + " - " + shift.getEnd().toLocalTime() + ": " + shift.getEmployee().getName()); } From 3df51484f27a8ee07507d827df34f17c8e80af6f Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Fri, 24 Nov 2023 21:17:46 +0100 Subject: [PATCH 076/294] improve comment --- .../timefoldsolver/ShiftScheduleConstraintProviderTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java index 9979f5d5e0..9477e892eb 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java @@ -22,7 +22,8 @@ class ShiftScheduleConstraintProviderTest { ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(MONDAY.atTime(14, 0), MONDAY.atTime(22, 0), null, ann)) - // Penalizes both A-B and B-A. To avoid that, use forEachUniquePair() in the constraint instead. + // Penalizes by 2 because both {shiftA, shiftB} and {shiftB, shiftA} match. + // To avoid that, use forEachUniquePair() in the constraint instead. .penalizesBy(2); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) .given( From 07a6999e56bd27aa2d0fc6b1b779245c814663a6 Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Fri, 24 Nov 2023 21:40:29 +0100 Subject: [PATCH 077/294] format with baeldung style --- .../com/baeldung/timefoldsolver/Shift.java | 3 +- .../timefoldsolver/ShiftScheduleApp.java | 42 +++++++++---------- .../ShiftScheduleConstraintProvider.java | 28 ++++++------- .../ShiftScheduleConstraintProviderTest.java | 37 +++++++--------- 4 files changed, 48 insertions(+), 62 deletions(-) diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java index 9c7b663ecd..2ef2f2a1b9 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java @@ -16,7 +16,8 @@ public class Shift { private Employee employee; // A no-arg constructor is required for @PlanningEntity annotated classes - public Shift() {} + public Shift() { + } public Shift(LocalDateTime start, LocalDateTime end, String requiredSkill) { this(start, end, requiredSkill, null); diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java index 9170e2363f..24666ac6aa 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java @@ -5,24 +5,24 @@ import java.time.LocalDate; import java.util.List; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import ai.timefold.solver.core.api.solver.Solver; import ai.timefold.solver.core.api.solver.SolverFactory; import ai.timefold.solver.core.config.solver.SolverConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class ShiftScheduleApp { private static final Logger logger = LoggerFactory.getLogger(ShiftScheduleApp.class); public static void main(String[] args) { - SolverFactory solverFactory = SolverFactory.create(new SolverConfig() - .withSolutionClass(ShiftSchedule.class) - .withEntityClasses(Shift.class) - .withConstraintProviderClass(ShiftScheduleConstraintProvider.class) - // The solver runs only for 5 seconds on this small dataset. - // It's recommended to run for at least 5 minutes ("5m") otherwise. - .withTerminationSpentLimit(Duration.ofSeconds(5))); + SolverFactory solverFactory = SolverFactory.create(new SolverConfig().withSolutionClass(ShiftSchedule.class) + .withEntityClasses(Shift.class) + .withConstraintProviderClass(ShiftScheduleConstraintProvider.class) + // The solver runs only for 5 seconds on this small dataset. + // It's recommended to run for at least 5 minutes ("5m") otherwise. + .withTerminationSpentLimit(Duration.ofSeconds(5))); Solver solver = solverFactory.buildSolver(); ShiftSchedule problem = loadProblem(); @@ -33,25 +33,21 @@ public class ShiftScheduleApp { private static ShiftSchedule loadProblem() { LocalDate monday = LocalDate.of(2030, 4, 1); LocalDate tuesday = LocalDate.of(2030, 4, 2); - return new ShiftSchedule(List.of( - new Employee("Ann", Set.of("Bartender")), - new Employee("Beth", Set.of("Waiter", "Bartender")), - new Employee("Carl", Set.of("Waiter")) - ), List.of( - new Shift(monday.atTime(6, 0), monday.atTime(14, 0), "Waiter"), - new Shift(monday.atTime(9, 0), monday.atTime(17, 0), "Bartender"), - new Shift(monday.atTime(14, 0), monday.atTime(22, 0), "Bartender"), - new Shift(tuesday.atTime(6, 0), tuesday.atTime(14, 0), "Waiter"), - new Shift(tuesday.atTime(14, 0), tuesday.atTime(22, 0), "Bartender") - )); + return new ShiftSchedule( + List.of(new Employee("Ann", Set.of("Bartender")), new Employee("Beth", Set.of("Waiter", "Bartender")), new Employee("Carl", Set.of("Waiter"))), + List.of(new Shift(monday.atTime(6, 0), monday.atTime(14, 0), "Waiter"), new Shift(monday.atTime(9, 0), monday.atTime(17, 0), "Bartender"), + new Shift(monday.atTime(14, 0), monday.atTime(22, 0), "Bartender"), new Shift(tuesday.atTime(6, 0), tuesday.atTime(14, 0), "Waiter"), + new Shift(tuesday.atTime(14, 0), tuesday.atTime(22, 0), "Bartender"))); } private static void printSolution(ShiftSchedule solution) { logger.info("Shift assignments"); for (Shift shift : solution.getShifts()) { - logger.info(" " + shift.getStart().toLocalDate() - + " " + shift.getStart().toLocalTime() + " - " + shift.getEnd().toLocalTime() - + ": " + shift.getEmployee().getName()); + logger.info(" " + shift.getStart() + .toLocalDate() + " " + shift.getStart() + .toLocalTime() + " - " + shift.getEnd() + .toLocalTime() + ": " + shift.getEmployee() + .getName()); } } diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProvider.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProvider.java index 0846429460..bd308dacbf 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProvider.java +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProvider.java @@ -1,37 +1,35 @@ package com.baeldung.timefoldsolver; +import static ai.timefold.solver.core.api.score.stream.Joiners.equal; + import ai.timefold.solver.core.api.score.buildin.hardsoft.HardSoftScore; import ai.timefold.solver.core.api.score.stream.Constraint; import ai.timefold.solver.core.api.score.stream.ConstraintFactory; import ai.timefold.solver.core.api.score.stream.ConstraintProvider; -import static ai.timefold.solver.core.api.score.stream.Joiners.equal; - public class ShiftScheduleConstraintProvider implements ConstraintProvider { @Override public Constraint[] defineConstraints(ConstraintFactory constraintFactory) { - return new Constraint[] { - atMostOneShiftPerDay(constraintFactory), - requiredSkill(constraintFactory) - }; + return new Constraint[] { atMostOneShiftPerDay(constraintFactory), requiredSkill(constraintFactory) }; } public Constraint atMostOneShiftPerDay(ConstraintFactory constraintFactory) { return constraintFactory.forEach(Shift.class) - .join(Shift.class, - equal(shift -> shift.getStart().toLocalDate()), - equal(Shift::getEmployee)) - .filter((shift1, shift2) -> shift1 != shift2) - .penalize(HardSoftScore.ONE_HARD) - .asConstraint("At most one shift per day"); + .join(Shift.class, equal(shift -> shift.getStart() + .toLocalDate()), equal(Shift::getEmployee)) + .filter((shift1, shift2) -> shift1 != shift2) + .penalize(HardSoftScore.ONE_HARD) + .asConstraint("At most one shift per day"); } public Constraint requiredSkill(ConstraintFactory constraintFactory) { return constraintFactory.forEach(Shift.class) - .filter(shift -> !shift.getEmployee().getSkills().contains(shift.getRequiredSkill())) - .penalize(HardSoftScore.ONE_HARD) - .asConstraint("Required skill"); + .filter(shift -> !shift.getEmployee() + .getSkills() + .contains(shift.getRequiredSkill())) + .penalize(HardSoftScore.ONE_HARD) + .asConstraint("Required skill"); } } diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java index 9477e892eb..c4741a831b 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java @@ -3,49 +3,40 @@ package com.baeldung.timefoldsolver; import java.time.LocalDate; import java.util.Set; -import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; import org.junit.jupiter.api.Test; +import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; + class ShiftScheduleConstraintProviderTest { private static final LocalDate MONDAY = LocalDate.of(2030, 4, 1); private static final LocalDate TUESDAY = LocalDate.of(2030, 4, 2); - ConstraintVerifier constraintVerifier = ConstraintVerifier.build( - new ShiftScheduleConstraintProvider(), ShiftSchedule.class, Shift.class); + ConstraintVerifier constraintVerifier = ConstraintVerifier.build(new ShiftScheduleConstraintProvider(), + ShiftSchedule.class, Shift.class); @Test void atMostOneShiftPerDay() { Employee ann = new Employee("Ann", null); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) - .given( - ann, - new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), - new Shift(MONDAY.atTime(14, 0), MONDAY.atTime(22, 0), null, ann)) - // Penalizes by 2 because both {shiftA, shiftB} and {shiftB, shiftA} match. - // To avoid that, use forEachUniquePair() in the constraint instead. - .penalizesBy(2); + .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(MONDAY.atTime(14, 0), MONDAY.atTime(22, 0), null, ann)) + // Penalizes by 2 because both {shiftA, shiftB} and {shiftB, shiftA} match. + // To avoid that, use forEachUniquePair() in the constraint instead. + .penalizesBy(2); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) - .given( - ann, - new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), - new Shift(TUESDAY.atTime(14, 0), TUESDAY.atTime(22, 0), null, ann)) - .penalizesBy(0); + .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(TUESDAY.atTime(14, 0), TUESDAY.atTime(22, 0), null, ann)) + .penalizesBy(0); } @Test void requiredSkill() { Employee ann = new Employee("Ann", Set.of("Waiter")); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::requiredSkill) - .given( - ann, - new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Cook", ann)) - .penalizesBy(1); + .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Cook", ann)) + .penalizesBy(1); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::requiredSkill) - .given( - ann, - new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Waiter", ann)) - .penalizesBy(0); + .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Waiter", ann)) + .penalizesBy(0); } } From dfd736183f64d84efdd29ecbbc5f1795cb21ca75 Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Fri, 24 Nov 2023 21:44:10 +0100 Subject: [PATCH 078/294] Adjust test names --- .../ShiftScheduleConstraintProviderTest.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java index c4741a831b..0832cd7bdd 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java @@ -16,24 +16,33 @@ class ShiftScheduleConstraintProviderTest { ShiftSchedule.class, Shift.class); @Test - void atMostOneShiftPerDay() { + void whenTwoShiftsOnOneDay_thenPenalize() { Employee ann = new Employee("Ann", null); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(MONDAY.atTime(14, 0), MONDAY.atTime(22, 0), null, ann)) // Penalizes by 2 because both {shiftA, shiftB} and {shiftB, shiftA} match. // To avoid that, use forEachUniquePair() in the constraint instead. .penalizesBy(2); + } + @Test + void whenTwoShiftsOnDifferentDays_thenDoNotPenalize() { + Employee ann = new Employee("Ann", null); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(TUESDAY.atTime(14, 0), TUESDAY.atTime(22, 0), null, ann)) .penalizesBy(0); } @Test - void requiredSkill() { + void whenEmployeeLacksRequiredSkill_thenPenalize() { Employee ann = new Employee("Ann", Set.of("Waiter")); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::requiredSkill) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Cook", ann)) .penalizesBy(1); + } + + @Test + void whenEmployeeHasRequiredSkill_thenDoNotPenalize() { + Employee ann = new Employee("Ann", Set.of("Waiter")); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::requiredSkill) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Waiter", ann)) .penalizesBy(0); From fa272d33953eb2b765be896acba462a5f2a28650 Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Sat, 25 Nov 2023 05:25:47 +0000 Subject: [PATCH 079/294] Retrieving Unix Time in Java --- .../baeldung/unixtime/UnixTimeUnitTest.java | 50 ++++++++----------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/unixtime/UnixTimeUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/unixtime/UnixTimeUnitTest.java index d1518ceef5..eedd897e91 100644 --- a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/unixtime/UnixTimeUnitTest.java +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/unixtime/UnixTimeUnitTest.java @@ -1,50 +1,42 @@ package com.baeldung.unixtime; - import static org.junit.Assert.assertEquals; - import java.time.Instant; +import java.time.LocalDate; + +import java.time.Month; +import java.time.ZoneId; import java.util.Date; import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; + import org.junit.jupiter.api.Test; public class UnixTimeUnitTest { @Test - public void givenCurrentTimeUsingDateApi_whenConvertedToUnixTime_thenConsistent() { - long marginOfError = 1L; - Date date = new Date(); - long longTime = date.getTime() / 1000L; - - for (int i = 0; i < 10; i++) { - long unixTime = System.currentTimeMillis() / 1000L; - assertEquals(longTime, unixTime, marginOfError); - } + public void givenTimeUsingDateApi_whenConvertedToUnixTime_thenMatch() { + Date date = new Date(2023 - 1900, 1, 15, 0, 0, 0); + long expected = 1676419200; + long actual = date.getTime() / 1000L; + assertEquals(expected, actual); } @Test - public void givenCurrentTimeUsingInstantNow_whenConvertedToUnixTime_thenConsistent() { - long marginOfError = 1L; - long longTime = Instant.now().getEpochSecond(); - - for (int i = 0; i < 10; i++) { - long unixTime = System.currentTimeMillis() / 1000L; - assertEquals(longTime, unixTime, marginOfError); - } + public void givenTimeUsingJodaTime_whenConvertedToUnixTime_thenMatch() { + DateTime dateTime = new DateTime(2023, 2, 15, 00, 00, 00, 0); + long expected = 1676419200; + long actual = dateTime.getMillis() / 1000L; + assertEquals(expected, actual); } @Test - public void givenCurrentTimeUsingJodaTime_whenConvertedToUnixTime_thenConsistent() { - long marginOfError = 1L; - DateTime dateTime = DateTime.now(DateTimeZone.UTC); - long longTime = dateTime.getMillis() / 1000L; - - for (int i = 0; i < 10; i++) { - long unixTime = System.currentTimeMillis() / 1000L; - assertEquals(longTime, unixTime, marginOfError); - } + public void givenTimeUsingLocalDate_whenConvertedToUnixTime_thenMatch() { + LocalDate date = LocalDate.of(2023, Month.FEBRUARY, 15); + Instant instant = date.atStartOfDay().atZone(ZoneId.of("UTC")).toInstant(); + long expected = 1676419200; + long actual = instant.getEpochSecond(); + assertEquals(expected, actual); } } From 25bfddf417ea1ce8feb994101ccf771f38c4ef02 Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Sat, 25 Nov 2023 14:15:27 +0100 Subject: [PATCH 080/294] Limit solving duration to 2 seconds --- .../java/com/baeldung/timefoldsolver/ShiftScheduleApp.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java index 24666ac6aa..e8dc02e2b3 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java @@ -20,9 +20,9 @@ public class ShiftScheduleApp { SolverFactory solverFactory = SolverFactory.create(new SolverConfig().withSolutionClass(ShiftSchedule.class) .withEntityClasses(Shift.class) .withConstraintProviderClass(ShiftScheduleConstraintProvider.class) - // The solver runs only for 5 seconds on this small dataset. - // It's recommended to run for at least 5 minutes ("5m") otherwise. - .withTerminationSpentLimit(Duration.ofSeconds(5))); + // The solver runs only for 2 seconds on this tiny dataset. + // It's recommended to run for at least 5 minutes ("5m") on large datasets. + .withTerminationSpentLimit(Duration.ofSeconds(2))); Solver solver = solverFactory.buildSolver(); ShiftSchedule problem = loadProblem(); From 5df3c5711ada202a685a1f193f0bb2a32986c806 Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Sat, 25 Nov 2023 14:35:43 +0100 Subject: [PATCH 081/294] Make PMD happy --- ...erTest.java => ShiftScheduleConstraintProviderUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename timefold-solver/src/test/java/com/baeldung/timefoldsolver/{ShiftScheduleConstraintProviderTest.java => ShiftScheduleConstraintProviderUnitTest.java} (97%) diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java similarity index 97% rename from timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java rename to timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java index 0832cd7bdd..3a3f4dc032 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java @@ -7,7 +7,7 @@ import org.junit.jupiter.api.Test; import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; -class ShiftScheduleConstraintProviderTest { +class ShiftScheduleConstraintProviderUnitTest { private static final LocalDate MONDAY = LocalDate.of(2030, 4, 1); private static final LocalDate TUESDAY = LocalDate.of(2030, 4, 2); From 2e60ba50079fbe296f326a281cda547ffc7bd2de Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Sat, 25 Nov 2023 21:09:32 +0100 Subject: [PATCH 082/294] Turn into a unit test to avoid main() --- timefold-solver/pom.xml | 4 ++-- .../ShiftScheduleConstraintProviderUnitTest.java | 1 + .../ShiftScheduleSolverUnitTest.java} | 13 ++++++++----- 3 files changed, 11 insertions(+), 7 deletions(-) rename timefold-solver/src/{main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java => test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java} (86%) diff --git a/timefold-solver/pom.xml b/timefold-solver/pom.xml index 2a219a593c..a16afb9e54 100644 --- a/timefold-solver/pom.xml +++ b/timefold-solver/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 timefold-solver timefold-solver diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java index 3a3f4dc032..3f68ef701e 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java @@ -24,6 +24,7 @@ class ShiftScheduleConstraintProviderUnitTest { // To avoid that, use forEachUniquePair() in the constraint instead. .penalizesBy(2); } + @Test void whenTwoShiftsOnDifferentDays_thenDoNotPenalize() { Employee ann = new Employee("Ann", null); diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java similarity index 86% rename from timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java rename to timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java index e8dc02e2b3..45a84b40da 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java @@ -5,18 +5,21 @@ import java.time.LocalDate; import java.util.List; import java.util.Set; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ai.timefold.solver.core.api.solver.Solver; import ai.timefold.solver.core.api.solver.SolverFactory; import ai.timefold.solver.core.config.solver.SolverConfig; +import ai.timefold.solver.core.config.solver.termination.TerminationConfig; -public class ShiftScheduleApp { +public class ShiftScheduleSolverUnitTest { - private static final Logger logger = LoggerFactory.getLogger(ShiftScheduleApp.class); + private static final Logger logger = LoggerFactory.getLogger(ShiftScheduleSolverUnitTest.class); - public static void main(String[] args) { + @Test + public void solve() { SolverFactory solverFactory = SolverFactory.create(new SolverConfig().withSolutionClass(ShiftSchedule.class) .withEntityClasses(Shift.class) .withConstraintProviderClass(ShiftScheduleConstraintProvider.class) @@ -30,7 +33,7 @@ public class ShiftScheduleApp { printSolution(solution); } - private static ShiftSchedule loadProblem() { + private ShiftSchedule loadProblem() { LocalDate monday = LocalDate.of(2030, 4, 1); LocalDate tuesday = LocalDate.of(2030, 4, 2); return new ShiftSchedule( @@ -40,7 +43,7 @@ public class ShiftScheduleApp { new Shift(tuesday.atTime(14, 0), tuesday.atTime(22, 0), "Bartender"))); } - private static void printSolution(ShiftSchedule solution) { + private void printSolution(ShiftSchedule solution) { logger.info("Shift assignments"); for (Shift shift : solution.getShifts()) { logger.info(" " + shift.getStart() From 289281024037e63530b434b360816710c014c1da Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Sun, 26 Nov 2023 11:55:41 +0200 Subject: [PATCH 083/294] baeldung-articles: baeldung-articlesBAEL-7234 Commit to a new article (How to convert JsonNode to ObjectNode). Adding a test class (JsonNodeToJsonObjectUnitTest). --- .../JsonNodeToJsonObjectUnitTest.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java diff --git a/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java b/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java new file mode 100644 index 0000000000..e5a12869ea --- /dev/null +++ b/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.jsonnodetojsonobject; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.JsonNode; + +import org.junit.Test; + +import static org.junit.Assert.*; + +public class JsonNodeToJsonObjectUnitTest { + public static String jsonString = "{\"name\": \"John\", \"gender\": \"male\", \"company\": \"Baeldung\", \"isEmployee\": true, \"age\": 30}"; + + @Test + public void givenJsonNode_whenConvertingToObjectNode_thenVerifyFieldsIntegrity() throws JsonProcessingException { + + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode jsonNode = objectMapper.readTree(jsonString); + ObjectNode objectNode = objectMapper.createObjectNode().setAll((ObjectNode) jsonNode); + + assertEquals("John", objectNode.get("name").asText()); + assertEquals("male", objectNode.get("gender").asText()); + assertEquals("Baeldung", objectNode.get("company").asText()); + assertTrue(objectNode.get("isEmployee").asBoolean()); + assertEquals(30, objectNode.get("age").asInt()); + } +} From 7b83abb7ae45c027906a1df7c71a4cf0607c8649 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Sun, 26 Nov 2023 23:51:38 +0530 Subject: [PATCH 084/294] Review Comments --- .../FirstMatchingElementUnitTest.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java index da4522d097..db9415e94b 100644 --- a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java @@ -44,12 +44,20 @@ public class FirstMatchingElementUnitTest { @Test public void whenUsingTakeWhile_thenFindFirstMatchingUserIndex() { long predicateIndex = userList.stream() - .takeWhile(user -> !user.getUserName() - .equals(searchName)) + .takeWhile(user -> !user.getUserName().equals(searchName)) .count(); assertEquals(1, predicateIndex); } - + + @Test + public void whenUsingTakeWhile_thenFindIndexFromNoMatchingElement() { + List userList = List.of(new User(1, "David"), new User(2, "Vick"), new User(3, "Roger"), new User(4, "James")); + long predicateIndex = userList.stream() + .takeWhile(user -> !user.getUserName().equals(searchName)) + .count(); + assertEquals(4, predicateIndex); + } + @Test public void whenUsingGoogleGuava_thenFindFirstMatchingUserIndex() { int index = Iterables.indexOf(userList, user -> searchName.equals(user.getUserName())); From 7284c7462c591bd872241cfc5f4a0543398b5bf7 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Mon, 27 Nov 2023 10:19:12 +0530 Subject: [PATCH 085/294] BAEL-7259 --- persistence-modules/java-harperdb/pom.xml | 61 +++ .../src/main/resources/data-model.puml | 41 ++ .../baledung/harperdb/HarperDBApiService.java | 74 ++++ .../baledung/harperdb/HarperDBContainer.java | 42 +++ .../baledung/harperdb/HarperDBLiveTest.java | 336 +++++++++++++++++ .../harperdb/HarperDBLiveTestOld.java | 356 ++++++++++++++++++ 6 files changed, 910 insertions(+) create mode 100644 persistence-modules/java-harperdb/pom.xml create mode 100644 persistence-modules/java-harperdb/src/main/resources/data-model.puml create mode 100644 persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java create mode 100644 persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java create mode 100644 persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java create mode 100644 persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTestOld.java diff --git a/persistence-modules/java-harperdb/pom.xml b/persistence-modules/java-harperdb/pom.xml new file mode 100644 index 0000000000..896a58f858 --- /dev/null +++ b/persistence-modules/java-harperdb/pom.xml @@ -0,0 +1,61 @@ + + + 4.0.0 + + com.baeldung + java-harperdb + 1.0-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 9 + 9 + + + + + + + com.baeldung + persistence-modules + 1.0.0-SNAPSHOT + + + + com.baeldung + java-harperdb + 4.2 + system + ${project.basedir}/lib/cdata.jdbc.harperdb.jar + + + org.testcontainers + testcontainers + test + + + + + + + org.testcontainers + testcontainers-bom + 1.19.3 + pom + import + + + + + + 19 + 19 + UTF-8 + + + \ No newline at end of file diff --git a/persistence-modules/java-harperdb/src/main/resources/data-model.puml b/persistence-modules/java-harperdb/src/main/resources/data-model.puml new file mode 100644 index 0000000000..8e3681c749 --- /dev/null +++ b/persistence-modules/java-harperdb/src/main/resources/data-model.puml @@ -0,0 +1,41 @@ +@startuml +'https://gist.github.com/QuantumGhost/0955a45383a0b6c0bc24f9654b3cb561 +' uncomment the line below if you're using computer with a retina display +' skinparam dpi 300 +!theme sketchy-outline +!define Table(name,desc) class name as "desc" << (T, #63b175) >> +' we use bold for primary key +' green color for unique +' and underscore for not_null +!define primary_key(x) x +!define unique(x) x +!define not_null(x) x +' other tags available: +' +' , where color is a color name or html color code +' (#FFAACC) +' see: http://plantuml.com/classes.html#More +hide methods +hide stereotypes + +' entities + + +Table(Teacher, "Teacher") { + primary_key(Id) Number + Name Varchar + joining_date Date +} +Table(Subject, "Subject") { + primary_key(Id) Number + Name Varchar +} +Table(Teacher_Details, "Teacher_Details") { + primary_key(Id) Number + teacher_id Number + subject_id Number +} + +Teacher_Details "*" -left-> "1" Subject: " " +Teacher "1" -left-> "*" Teacher_Details: " " +@enduml \ No newline at end of file diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java new file mode 100644 index 0000000000..1eedd8648f --- /dev/null +++ b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java @@ -0,0 +1,74 @@ +package com.baledung.harperdb; + +import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.classic.methods.HttpPost; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.ClassicHttpRequest; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.HttpEntity; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.io.entity.StringEntity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.Base64; + +public class HarperDBApiService { + private String url; + private String base64auth; + + public HarperDBApiService(String url, String user, String password) { + this.url = url; + this.base64auth = Base64.getEncoder() + .encodeToString(new StringBuilder().append(user).append(":").append(password).toString().getBytes()); + } + + private static final Logger LOGGER = LoggerFactory.getLogger(HarperDBApiService.class); + + public void createSchema(String schema) throws IOException { + String requestBody = "{\"operation\":\"create_schema\", \"" + "schema\":\"" + schema + "\"" + "}"; + executeHttpPostRequest(requestBody); + } + + public void createTable(String schema, String table, String ... attributes) throws IOException { + String createTableReq = "{\"operation\":\"create_table\"," + + "\"schema\":\"" + schema + + "\",\"table\":\"" + table + + "\",\"hash_attribute\":\"id\"" + + "}"; + executeHttpPostRequest(createTableReq); + LOGGER.info("created table:" + table); + for (String attribute : attributes) { + String createAttrReq = "{\"operation\":\"create_attribute\",\"schema\":\"" + + schema + "\",\"table\":\"" + + table + "\",\"attribute\":\"" + + attribute + "\"" + + "}"; + executeHttpPostRequest(createAttrReq); + LOGGER.info("created attribute:" + attribute + " in table:" + table); + } + } + + public void insertRecords(String schema, String table, String records) throws IOException { + String requestBody = "{\"table\":" + "\"" + table + "\"," + + "\"schema\":" + "\"" + schema + "\"" + "," + + "\"operation\":" + "\"" + "insert" + "\"" + "," + + "\"records\":" + records + + "}"; + executeHttpPostRequest(requestBody); + } + + private void executeHttpPostRequest(String httpRequest) throws IOException { + LOGGER.info("Post request body:" + httpRequest); + + try (CloseableHttpClient closeableHttpClient = HttpClientBuilder.create().build()) { + HttpPost request = new HttpPost(this.url); + request.addHeader("Authorization", "Basic " + this.base64auth); + request.addHeader("Content-Type", "application/json"); + request.setEntity((HttpEntity) new StringEntity(httpRequest)); + CloseableHttpResponse response = closeableHttpClient.execute((ClassicHttpRequest) request); + LOGGER.info("REST API response:" + response.toString()); + assert(200 == response.getCode()); + } + } +} diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java new file mode 100644 index 0000000000..79656b1b73 --- /dev/null +++ b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java @@ -0,0 +1,42 @@ +package com.baledung.harperdb; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.containers.GenericContainer; + +import java.util.Map; + +public class HarperDBContainer { + private final static Logger LOGGER = LoggerFactory.getLogger(HarperDBContainer.class); + + + + private static final Map DEFAULT_ENV_MAP = Map.of( + "HDB_ADMIN_USERNAME", "admin", + "HDB_ADMIN_PASSWORD", "password", + "OPERATIONSAPI_NETWORK_PORT", "9925", + "ROOTPATH", "/home/harperdb/hdb", + "LOGGING_STDSTREAMS", "true" + ); + + private static final Integer[] DEFAULT_EXPOSED_PORTS = {9925, 9926}; + + private static final String HARPER_DOCKER_IMAGE = "harperdb/harperdb:latest"; + + public void stop() { + harperDBContainer.stop(); + } + GenericContainer harperDBContainer; + public GenericContainer installHarperDB() { + harperDBContainer = new GenericContainer(HARPER_DOCKER_IMAGE) + .withEnv(DEFAULT_ENV_MAP) + .withExposedPorts(DEFAULT_EXPOSED_PORTS); + return harperDBContainer; + } + + public GenericContainer installHarperDB(String dockerImgage, final Map envMap, final Integer ... exposedPorts) { + return new GenericContainer(dockerImgage) + .withEnv(envMap) + .withExposedPorts(exposedPorts); + } +} diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java new file mode 100644 index 0000000000..767d9d971b --- /dev/null +++ b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java @@ -0,0 +1,336 @@ +package com.baledung.harperdb; + +import cdata.jdbc.harperdb.HarperDBConnectionPoolDataSource; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.containers.GenericContainer; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.sql.*; +import java.util.Properties; + +import static org.junit.jupiter.api.Assertions.*; + +public class HarperDBLiveTest { + private static final Logger logger = LoggerFactory.getLogger(HarperDBLiveTest.class); + + private static String host; + + private static Integer port; + + private static HarperDBContainer harperDBContainer; + private static HarperDBApiService harperDbApiService; + + @BeforeAll + static void setupHarperDB() throws IOException, InterruptedException, URISyntaxException { + installHarperDB(); + initHarperDBApiService(); + setupDB(); + } + + private static void installHarperDB() { + harperDBContainer = new HarperDBContainer(); + + GenericContainer genericContainer = harperDBContainer.installHarperDB(); + + host = genericContainer.getHost(); + genericContainer.start(); + + port = genericContainer.getFirstMappedPort(); + } + + private static void initHarperDBApiService() { + String url = "http://localhost:" + port + "/"; + harperDbApiService = new HarperDBApiService(url, "admin", "password"); + } + + private static void setupDB() throws URISyntaxException, IOException { + harperDbApiService.createSchema("Demo"); + + harperDbApiService.createTable("Demo", "Subject", "name"); + harperDbApiService.createTable("Demo", "Teacher", "name", "joining_date", "subject_id"); + harperDbApiService.createTable("Demo", "Teacher_Details", "teacher_id", "subject_id"); + + insertSubjectRecords(); + insertTeacherRecords(); + insertTeacherDetailsRecords(); + } + + private static void insertSubjectRecords() throws IOException { + String records = "[" + + "{\"id\":1, \"name\":\"English\"}," + + "{\"id\":2, \"name\":\"Maths\"}," + + "{\"id\":3, \"name\":\"Science\"}" + + "]"; + + harperDbApiService.insertRecords("Demo", "Subject", records); + } + + private static void insertTeacherRecords() throws IOException { + String records = "[" + + "{\"id\":1, \"name\":\"Parthiv Pradhan\", \"joining_date\":\"04-05-2000\"}," + + "{\"id\":2, \"name\":\"David Martinez\", \"joining_date\":\"20-10-2005\"}," + + "{\"id\":3, \"name\":\"Liam Williams\", \"joining_date\":\"04-06-1997\"}," + + "{\"id\":4, \"name\":\"Robin Williams\", \"joining_date\":\"01-01-2020\"}," + + "{\"id\":5, \"name\":\"Eric Martin\", \"joining_date\":\"04-05-2022\"}," + + "{\"id\":6, \"name\":\"Sajjan Nagendra\", \"joining_date\":\"02-02-1999\"}" + + "]"; + harperDbApiService.insertRecords("Demo", "Teacher", records); + } + + private static void insertTeacherDetailsRecords() throws IOException { + String records = "[" + + "{\"id\":1, \"teacher_id\":1, \"subject_id\":1}," + + "{\"id\":2, \"teacher_id\":1, \"subject_id\":2}," + + "{\"id\":3, \"teacher_id\":2, \"subject_id\":3 }," + + "{\"id\":4, \"teacher_id\":3, \"subject_id\":1}," + + "{\"id\":5, \"teacher_id\":3, \"subject_id\":3}," + + "{\"id\":6, \"teacher_id\":4, \"subject_id\":2}," + + "{\"id\":7, \"teacher_id\":5, \"subject_id\":3}," + + "{\"id\":8, \"teacher_id\":6, \"subject_id\":1}," + + "{\"id\":9, \"teacher_id\":6, \"subject_id\":2}," + + "{\"id\":15, \"teacher_id\":6, \"subject_id\":3}" + + "]"; + + harperDbApiService.insertRecords("Demo", "Teacher_Details", records); + } + + @AfterAll + static void stopHarperDB() { + harperDBContainer.stop(); + } + + @Test + void whenConnectionInfoInURL_thenConnectSuccess() throws SQLException { + assertDoesNotThrow(() -> { + final String JDBC_URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; + + try (Connection connection = DriverManager.getConnection(JDBC_URL)) { + connection.createStatement().executeQuery("select 1"); + logger.info("Connection Successful"); + } + }); + } + + @Test + void whenConnectionInfoInProperties_thenConnectSuccess() throws SQLException { + assertDoesNotThrow(() -> { + Properties prop = new Properties(); + prop.setProperty("Server", "127.0.0.1:" + port); + prop.setProperty("User", "admin"); + prop.setProperty("Password", "password"); + + try (Connection connection = DriverManager.getConnection("jdbc:harperdb:", prop)) { + connection.createStatement().executeQuery("select 1"); + logger.info("Connection Successful"); + } + }); + } + + @Test + void whenConnectionPooling_thenConnectSuccess() throws SQLException { + assertDoesNotThrow(() -> { + HarperDBConnectionPoolDataSource harperdbPoolDataSource = new HarperDBConnectionPoolDataSource(); + final String JDBC_URL = "jdbc:harperdb:UseConnectionPooling=true;PoolMaxSize=2;Server=127.0.0.1:" + port + + ";User=admin;Password=password;"; + harperdbPoolDataSource.setURL(JDBC_URL); + + try(Connection connection = harperdbPoolDataSource.getPooledConnection().getConnection()) { + connection.createStatement().executeQuery("select 1"); + logger.info("Connection Pool Successful"); + } + }); + } + + private static Connection getConnection() throws SQLException { + String URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; + return DriverManager.getConnection(URL); + } + + @Test + void givenStatement_whenFetchRecord_thenSuccess() throws SQLException { + final String SQL_QUERY = "select id, name, grade from Demo.student"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery(SQL_QUERY); + while (resultSet.next()) { + int id = resultSet.getInt("id"); + String name = resultSet.getString("name"); + int grade = resultSet.getInt("grade"); + assertNotNull(Integer.valueOf(id)); + logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); + } + } + } + + @Test + void givenStatement_whenInsertRecord_thenSuccess() throws SQLException { + final String INSERT_SQL = "insert into Demo.student(id, name, grade) values (10, 'Barak', 3)"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); + } + } + + @Test + void givenStatement_whenInsertRecordInTableWithoutAttributes_thenSuccess() throws SQLException { + final String INSERT_SQL = "insert into Demo.teacher(id, name, joining_date) " + + "values (7, 'David Sirocco', '04-05-2004'), (8, 'Ali Azmat', '04-10-2000')"; + final String QUERY_SQL = "select name, joining_date from Demo.teacher where name = ?"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); + PreparedStatement preparedStatement = connection.prepareStatement(QUERY_SQL); + preparedStatement.setString(1, "David Sirocco"); + ResultSet resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + String teacherName = resultSet.getString("name"); + String joinDate = resultSet.getString("joining_date"); + assertEquals("David Sirocco", teacherName); + assertEquals("04-05-2004", joinDate); + logger.info("name:" + teacherName + " joining date:" + joinDate); + } + } + } + + @Test + void givenStatement_whenUpdateRecord_thenSuccess() throws SQLException { + final String UPDATE_SQL = "update Demo.student set grade = 4 where id = 5"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(UPDATE_SQL)); + assertEquals(1, statement.getUpdateCount()); + } + } + + @Test + void givenStatement_whenDeleteRecord_thenSuccess() throws SQLException { + final String DELETE_SQL = "delete from Demo.student where id = 3"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(DELETE_SQL)); + assertEquals(1, statement.getUpdateCount()); + } + } + + @Test + void givenPreparedStatement_whenFetchRecord_thenSuccess() throws SQLException { + final String SQL_QUERY = "select id, name, grade from Demo.student where name = ? and grade = ?"; + + try(Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(SQL_QUERY); + preparedStatement.setString(1, "Robin"); + preparedStatement.setInt(2, 4); + ResultSet resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + int id = resultSet.getInt("id"); + String name = resultSet.getString("name"); + int grade = resultSet.getInt("grade"); + assertNotNull(Integer.valueOf(id)); + assertEquals("Robin", name); + logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); + } + } + } + + @Test + void givenPreparedStatement_whenDeleteRecord_thenSuccess() throws SQLException { + final String DELETE_SQL = "delete from Demo.student where name = ?"; + + try(Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(DELETE_SQL); + preparedStatement.setString(1, "James"); + assertDoesNotThrow(() -> preparedStatement.execute()); + assertEquals(1, preparedStatement.getUpdateCount()); + } + } + + @Test + void givenPreparedStatement_whenUpdateRecord_thenSuccess() throws SQLException { + final String UPDATE_SQL = "update Demo.student set grade = ? where id = ? and name = ?"; + + try(Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_SQL); + preparedStatement.setInt(1, 5); + preparedStatement.setInt(2, 1); + preparedStatement.setString(3, "John"); + assertDoesNotThrow(() -> preparedStatement.execute()); + assertEquals(1, preparedStatement.getUpdateCount()); + } + } + + //@Test + void whenAddtoBatch_thenExecuteBatchIsSuccess() throws SQLException { + final String INSERT_SQL = "insert into Demo.teacher(id, name, joining_date, subject_id)" + + "values(?, ?, ?, ?)"; + + try(Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(INSERT_SQL); + preparedStatement.setInt(1, 9); + preparedStatement.setString(2, "Bret Lee"); + preparedStatement.setString(3, "07-08-2002"); + preparedStatement.setString(4, "[1, 3]"); + preparedStatement.addBatch(); + + preparedStatement.setInt(1, 10); + preparedStatement.setString(2, "Sarah Glimmer"); + preparedStatement.setString(3, "07-08-1997"); + preparedStatement.setString(4, "[1, 2]"); + + preparedStatement.addBatch(); + + assertDoesNotThrow(() -> preparedStatement.executeBatch()); + } + } + + + @Test + void whenExecuteJoinQuery_thenResultSuccess() throws SQLException { + final String JOIN_QUERY = "SELECT t.name as teacher_name, s.name as subject_name " + + "from Demo.teacher AS t INNER JOIN Demo.subject AS s ON t.subject_id = s.id"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + + + ResultSet resultSet = statement.executeQuery(JOIN_QUERY); + while (resultSet.next()) { + logger.info("Teacher Name:" + resultSet.getString("teacher_name") + " Subject Name:" + + resultSet.getString("subject_name")); + } + + + } + + } + + @Test + void whenExecuteStoredToCreateTable_thenSuccess() throws SQLException { + final String CREATE_TABLE_SQL = "CreateTable"; + try(Connection connection = getConnection()) { + CallableStatement callableStatement = connection.prepareCall(CREATE_TABLE_SQL); + + callableStatement.setString("SchemaName", "prod"); //schema gets created too + callableStatement.setString("TableName", "subject"); + callableStatement.setString("PrimaryKey", "id"); + Boolean result = callableStatement.execute(); + + ResultSet resultSet = callableStatement.getResultSet(); + + while(resultSet.next()) { + String tableCreated = resultSet.getString("Success"); + assertEquals("true", tableCreated); + logger.info("result of the callable execute:" + tableCreated); + } + } + } +} diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTestOld.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTestOld.java new file mode 100644 index 0000000000..8becea76a5 --- /dev/null +++ b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTestOld.java @@ -0,0 +1,356 @@ +package com.baledung.harperdb; + +import cdata.jdbc.harperdb.HarperDBConnectionPoolDataSource; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.classic.methods.HttpPost; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.ClassicHttpRequest; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.HttpEntity; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.io.entity.StringEntity; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.containers.GenericContainer; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.sql.*; +import java.util.Map; +import java.util.Properties; + +import static org.junit.jupiter.api.Assertions.*; + +public class HarperDBLiveTestOld { + private static final Logger logger = LoggerFactory.getLogger(HarperDBLiveTestOld.class); + + private static String host; + + private static Integer port; + + private static GenericContainer harperDBContainer; + + @BeforeAll + static void setupHarperDB() throws IOException, InterruptedException, URISyntaxException { + installHarperDB(); + setupDB(); + } + + private static void installHarperDB() { + Map envMap = Map.of( + "HDB_ADMIN_USERNAME", "admin", + "HDB_ADMIN_PASSWORD", "password", + "OPERATIONSAPI_NETWORK_PORT", "9925", + "ROOTPATH", "/home/harperdb/hdb", + "LOGGING_STDSTREAMS", "true" + ); + + harperDBContainer = new GenericContainer("harperdb/harperdb:latest") + .withEnv(envMap) + .withExposedPorts(9925, 9926); + host = harperDBContainer.getHost(); + harperDBContainer.start(); + port = harperDBContainer.getFirstMappedPort(); + logger.info("DB Host:" + host + "\n DB Port:" + port); + } + + private static void setupDB() throws URISyntaxException, IOException { + setupSchema("demo"); + createTable("demo", "student", "name", "grade", "subject_id"); + createTable("demo", "teacher", "name", "joining_date", "subject_id"); + insertRecords(); + } + + private static void setupSchema(String schema) throws URISyntaxException, IOException { + String requestBody = "{\"operation\":\"create_schema\", \"" + "schema\":\"" + schema + "\"" + "}"; + executeHttpPostRequest(requestBody); + } + + private static void executeHttpPostRequest(String httpRequest) throws IOException { + logger.info("Post request body:" + httpRequest); + + try (CloseableHttpClient closeableHttpClient = HttpClientBuilder.create().build()) { + HttpPost request = new HttpPost("http://localhost:" + port + "/"); + request.addHeader("Authorization", "Basic YWRtaW46cGFzc3dvcmQ="); + request.addHeader("Content-Type", "application/json"); + request.setEntity((HttpEntity) new StringEntity(httpRequest)); + CloseableHttpResponse response = closeableHttpClient.execute((ClassicHttpRequest) request); + logger.info("REST API response:" + response.toString()); + assertEquals(200, response.getCode()); + } + } + + private void insertStudentRecords() { + + } + + private void insertSubjectRecords() { + + } + + private void insertTeacherRecords() { + + } + + private static void createTable(String schemaName, String tableName, String... attributes) throws IOException { + String createTableReq = "{\"operation\":\"create_table\",\"schema\":\"" + + schemaName + "\",\"table\":\"" + + tableName + "\",\"hash_attribute\":\"id\"" + + "}"; + executeHttpPostRequest(createTableReq); + logger.info("created table:" + tableName); + for (String attribute : attributes) { + String createAttrReq = "{\"operation\":\"create_attribute\",\"schema\":\"" + + schemaName + "\",\"table\":\"" + + tableName + "\",\"attribute\":\"" + + attribute + "\"" + + "}"; + executeHttpPostRequest(createAttrReq); + logger.info("created attribute:" + attribute + " in table:" + tableName); + } + } + + private static void insertRecords() throws IOException { + + String table = "student"; + String schema = "demo"; + String operation = "insert"; + String records = "[" + + "{\"id\":1, \"name\":\"John\", \"grade\":4}," + + "{\"id\":2, \"name\":\"James\", \"grade\":1}," + + "{\"id\":3, \"name\":\"Williams\", \"grade\":1}," + + "{\"id\":4, \"name\":\"Robin\", \"grade\":4}," + + "{\"id\":5, \"name\":\"Torry\", \"grade\":3}," + + "{\"id\":6, \"name\":\"Nancy\", \"grade\":5}," + + "{\"id\":7, \"name\":\"Mary\", \"grade\":5}," + + "{\"id\":8, \"name\":\"Jenny\", \"grade\":6}," + + "{\"id\":9, \"name\":\"Katy\", \"grade\":6}," + + "{\"id\":15, \"name\":\"Michael\", \"grade\":6}" + + "]"; + String requestBody = "{\"table\":" + "\"" + table + "\"," + + "\"schema\":" + "\"" + schema + "\"" + "," + + "\"operation\":" + "\"" + operation + "\"" + "," + + "\"records\":" + records + + "}"; + String sql = "{" + + "\"operation\":\"sql\", " + + "\"sql\":\"insert into demo.student(id, name, grade) values" + + "(1, 'John', 4), (2, 'James', 1), (3, 'Williams', 1), (4, 'Robin', 4), (5, 'Torry', 3)," + + " (6, 'Nancy', 5), (7, 'Mary', 5), (8, 'Jenny', 6), (9, 'Katy', 6)\"" + + "}"; + executeHttpPostRequest(requestBody); + } + + @AfterAll + static void stopHarperDB() { + harperDBContainer.stop(); + } + + @Test + void whenConnectionInfoInURL_thenConnectSuccess() throws SQLException { + assertDoesNotThrow(() -> { + String URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; + + try (Connection connection = DriverManager.getConnection(URL)) { + connection.createStatement().executeQuery("select 1"); + logger.info("Connection Successful"); + } + }); + } + + @Test + void whenConnectionInfoInProperties_thenConnectSuccess() throws SQLException { + assertDoesNotThrow(() -> { + Properties prop = new Properties(); + prop.setProperty("Server", "127.0.0.1:" + port); + prop.setProperty("User", "admin"); + prop.setProperty("Password", "password"); + + try (Connection connection = DriverManager.getConnection("jdbc:harperdb:", prop)) { + connection.createStatement().executeQuery("select 1"); + logger.info("Connection Successful"); + } + }); + } + + @Test + void whenConnectionPooling_thenConnectSuccess() throws SQLException { + assertDoesNotThrow(() -> { + HarperDBConnectionPoolDataSource harperdbPoolDataSource = new HarperDBConnectionPoolDataSource(); + String URL = "jdbc:harperdb:UseConnectionPooling=true;PoolMaxSize=2;Server=127.0.0.1:" + port + + ";User=admin;Password=1234;"; + harperdbPoolDataSource.setURL(URL); + + try(Connection connection = harperdbPoolDataSource.getPooledConnection().getConnection()) { + connection.createStatement().executeQuery("select 1"); + logger.info("Connection Successful"); + } + }); + } + + private static Connection getConnection() throws SQLException { + String URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; + return DriverManager.getConnection(URL); + } + + @Test + void givenStatement_whenFetchRecord_thenSuccess() throws SQLException { + final String SQL_QUERY = "select id, name, grade from demo.student"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery(SQL_QUERY); + while (resultSet.next()) { + int id = resultSet.getInt("id"); + String name = resultSet.getString("name"); + int grade = resultSet.getInt("grade"); + assertNotNull(Integer.valueOf(id)); + logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); + } + } + } + + @Test + void givenStatement_whenInsertRecord_thenSuccess() throws SQLException { + final String INSERT_SQL = "insert into demo.student(id, name, grade) values (10, 'Barak', 3)"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); + } + } + + @Test + void givenStatement_whenInsertRecordInTableWithoutAttributes_thenSuccess() throws SQLException { + final String INSERT_SQL = "insert into demo.teacher(id, name, joining_date) " + + "values (1, 'David Martinez', '04-05-2004'), (2, 'Eric Martin', '04-10-2000')"; + final String QUERY_SQL = "select name, joining_date from demo.teacher where name = ?"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); + PreparedStatement preparedStatement = connection.prepareStatement(QUERY_SQL); + preparedStatement.setString(1, "Eric Martin"); + ResultSet resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + String teacherName = resultSet.getString("name"); + String joinDate = resultSet.getString("joining_date"); + assertEquals("Eric Martin", teacherName); + assertEquals("04-10-2000", joinDate); + logger.info("name:" + teacherName + " joining date:" + joinDate); + } + } + } + + @Test + void givenStatement_whenUpdateRecord_thenSuccess() throws SQLException { + final String UPDATE_SQL = "update demo.student set grade = 4 where id = 5"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(UPDATE_SQL)); + assertEquals(1, statement.getUpdateCount()); + } + } + + @Test + void givenStatement_whenDeleteRecord_thenSuccess() throws SQLException { + final String DELETE_SQL = "delete from demo.student where id = 3"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(DELETE_SQL)); + assertEquals(1, statement.getUpdateCount()); + } + } + + @Test + void givenPreparedStatement_whenFetchRecord_thenSuccess() throws SQLException { + final String SQL_QUERY = "select id, name, grade from demo.student where name = ? and grade = ?"; + + try(Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(SQL_QUERY); + preparedStatement.setString(1, "Robin"); + preparedStatement.setInt(2, 4); + ResultSet resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + int id = resultSet.getInt("id"); + String name = resultSet.getString("name"); + int grade = resultSet.getInt("grade"); + assertNotNull(Integer.valueOf(id)); + assertEquals("Robin", name); + logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); + } + } + } + + @Test + void givenPreparedStatement_whenDeleteRecord_thenSuccess() throws SQLException { + final String DELETE_SQL = "delete from demo.student where name = ?"; + + try(Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(DELETE_SQL); + preparedStatement.setString(1, "James"); + assertDoesNotThrow(() -> preparedStatement.execute()); + assertEquals(1, preparedStatement.getUpdateCount()); + } + } + + @Test + void givenPreparedStatement_whenUpdateRecord_thenSuccess() throws SQLException { + final String UPDATE_SQL = "update demo.student set grade = ? where id = ? and name = ?"; + + try(Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_SQL); + preparedStatement.setInt(1, 5); + preparedStatement.setInt(2, 1); + preparedStatement.setString(3, "John"); + assertDoesNotThrow(() -> preparedStatement.execute()); + assertEquals(1, preparedStatement.getUpdateCount()); + } + } + + @Test + void whenAddtoBatch_thenExecuteBatchIsSuccess() throws SQLException { + final String INSERT_SQL = "insert into demo.teacher(id, name, joining_date)" + + "values(?, ?, ?)"; + + try(Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(INSERT_SQL); + preparedStatement.setInt(1, 1); + preparedStatement.setString(2, "Bret Lee"); + preparedStatement.setString(3, "07-08-2002"); + preparedStatement.addBatch(); + + preparedStatement.setInt(1, 2); + preparedStatement.setString(2, "Sarah Glimmer"); + preparedStatement.setString(3, "07-08-1997"); + preparedStatement.addBatch(); + + assertDoesNotThrow(() -> preparedStatement.executeBatch()); + } + } + + @Test + void whenExecuteStoredToCreateTable_thenSuccess() throws SQLException { + final String CREATE_TABLE_SQL = "CreateTable"; + try(Connection connection = getConnection()) { + CallableStatement callableStatement = connection.prepareCall(CREATE_TABLE_SQL); + + callableStatement.setString("SchemaName", "prod"); //schema gets created too + callableStatement.setString("TableName", "subject"); + callableStatement.setString("PrimaryKey", "id"); + Boolean result = callableStatement.execute(); + + ResultSet resultSet = callableStatement.getResultSet(); + + while(resultSet.next()) { + String tableCreated = resultSet.getString("Success"); + assertEquals("true", tableCreated); + logger.info("result of the callable execute:" + tableCreated); + } + } + } +} From 1a63be903582dd95c93499039a363f91c678d281 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Mon, 27 Nov 2023 10:27:27 +0530 Subject: [PATCH 086/294] BAEL-7259 --- .../baledung/harperdb/HarperDBApiService.java | 38 +++--- .../baledung/harperdb/HarperDBContainer.java | 32 ++--- .../baledung/harperdb/HarperDBLiveTest.java | 123 ++++++++---------- 3 files changed, 89 insertions(+), 104 deletions(-) diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java index 1eedd8648f..15178f9769 100644 --- a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java +++ b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java @@ -14,17 +14,20 @@ import java.io.IOException; import java.util.Base64; public class HarperDBApiService { + private static final Logger LOGGER = LoggerFactory.getLogger(HarperDBApiService.class); private String url; private String base64auth; public HarperDBApiService(String url, String user, String password) { this.url = url; this.base64auth = Base64.getEncoder() - .encodeToString(new StringBuilder().append(user).append(":").append(password).toString().getBytes()); + .encodeToString(new StringBuilder().append(user) + .append(":") + .append(password) + .toString() + .getBytes()); } - private static final Logger LOGGER = LoggerFactory.getLogger(HarperDBApiService.class); - public void createSchema(String schema) throws IOException { String requestBody = "{\"operation\":\"create_schema\", \"" + "schema\":\"" + schema + "\"" + "}"; executeHttpPostRequest(requestBody); @@ -32,18 +35,18 @@ public class HarperDBApiService { public void createTable(String schema, String table, String ... attributes) throws IOException { String createTableReq = "{\"operation\":\"create_table\"," - + "\"schema\":\"" + schema - + "\",\"table\":\"" + table - + "\",\"hash_attribute\":\"id\"" - + "}"; + + "\"schema\":\"" + schema + + "\",\"table\":\"" + table + + "\",\"hash_attribute\":\"id\"" + + "}"; executeHttpPostRequest(createTableReq); LOGGER.info("created table:" + table); for (String attribute : attributes) { String createAttrReq = "{\"operation\":\"create_attribute\",\"schema\":\"" - + schema + "\",\"table\":\"" - + table + "\",\"attribute\":\"" - + attribute + "\"" - + "}"; + + schema + "\",\"table\":\"" + + table + "\",\"attribute\":\"" + + attribute + "\"" + + "}"; executeHttpPostRequest(createAttrReq); LOGGER.info("created attribute:" + attribute + " in table:" + table); } @@ -51,24 +54,25 @@ public class HarperDBApiService { public void insertRecords(String schema, String table, String records) throws IOException { String requestBody = "{\"table\":" + "\"" + table + "\"," - + "\"schema\":" + "\"" + schema + "\"" + "," - + "\"operation\":" + "\"" + "insert" + "\"" + "," - + "\"records\":" + records - + "}"; + + "\"schema\":" + "\"" + schema + "\"" + "," + + "\"operation\":" + "\"" + "insert" + "\"" + "," + + "\"records\":" + records + + "}"; executeHttpPostRequest(requestBody); } private void executeHttpPostRequest(String httpRequest) throws IOException { LOGGER.info("Post request body:" + httpRequest); - try (CloseableHttpClient closeableHttpClient = HttpClientBuilder.create().build()) { + try (CloseableHttpClient closeableHttpClient = HttpClientBuilder.create() + .build()) { HttpPost request = new HttpPost(this.url); request.addHeader("Authorization", "Basic " + this.base64auth); request.addHeader("Content-Type", "application/json"); request.setEntity((HttpEntity) new StringEntity(httpRequest)); CloseableHttpResponse response = closeableHttpClient.execute((ClassicHttpRequest) request); LOGGER.info("REST API response:" + response.toString()); - assert(200 == response.getCode()); + assert (200 == response.getCode()); } } } diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java index 79656b1b73..5ce6e069ce 100644 --- a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java +++ b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java @@ -1,42 +1,36 @@ package com.baledung.harperdb; +import java.util.Map; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testcontainers.containers.GenericContainer; -import java.util.Map; - public class HarperDBContainer { + private final static Logger LOGGER = LoggerFactory.getLogger(HarperDBContainer.class); + private static final Map DEFAULT_ENV_MAP = Map.of("HDB_ADMIN_USERNAME", "admin", "HDB_ADMIN_PASSWORD", "password", + "OPERATIONSAPI_NETWORK_PORT", "9925", "ROOTPATH", "/home/harperdb/hdb", "LOGGING_STDSTREAMS", "true"); - - private static final Map DEFAULT_ENV_MAP = Map.of( - "HDB_ADMIN_USERNAME", "admin", - "HDB_ADMIN_PASSWORD", "password", - "OPERATIONSAPI_NETWORK_PORT", "9925", - "ROOTPATH", "/home/harperdb/hdb", - "LOGGING_STDSTREAMS", "true" - ); - - private static final Integer[] DEFAULT_EXPOSED_PORTS = {9925, 9926}; + private static final Integer[] DEFAULT_EXPOSED_PORTS = { 9925, 9926 }; private static final String HARPER_DOCKER_IMAGE = "harperdb/harperdb:latest"; public void stop() { harperDBContainer.stop(); } + GenericContainer harperDBContainer; + public GenericContainer installHarperDB() { - harperDBContainer = new GenericContainer(HARPER_DOCKER_IMAGE) - .withEnv(DEFAULT_ENV_MAP) - .withExposedPorts(DEFAULT_EXPOSED_PORTS); + harperDBContainer = new GenericContainer(HARPER_DOCKER_IMAGE).withEnv(DEFAULT_ENV_MAP) + .withExposedPorts(DEFAULT_EXPOSED_PORTS); return harperDBContainer; } - public GenericContainer installHarperDB(String dockerImgage, final Map envMap, final Integer ... exposedPorts) { - return new GenericContainer(dockerImgage) - .withEnv(envMap) - .withExposedPorts(exposedPorts); + public GenericContainer installHarperDB(String dockerImgage, final Map envMap, final Integer... exposedPorts) { + return new GenericContainer(dockerImgage).withEnv(envMap) + .withExposedPorts(exposedPorts); } } diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java index 767d9d971b..42ef04dadf 100644 --- a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java +++ b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java @@ -1,6 +1,7 @@ package com.baledung.harperdb; import cdata.jdbc.harperdb.HarperDBConnectionPoolDataSource; + import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -16,6 +17,7 @@ import java.util.Properties; import static org.junit.jupiter.api.Assertions.*; public class HarperDBLiveTest { + private static final Logger logger = LoggerFactory.getLogger(HarperDBLiveTest.class); private static String host; @@ -61,40 +63,27 @@ public class HarperDBLiveTest { } private static void insertSubjectRecords() throws IOException { - String records = "[" - + "{\"id\":1, \"name\":\"English\"}," - + "{\"id\":2, \"name\":\"Maths\"}," - + "{\"id\":3, \"name\":\"Science\"}" - + "]"; + String records = "[" + "{\"id\":1, \"name\":\"English\"}," + "{\"id\":2, \"name\":\"Maths\"}," + "{\"id\":3, \"name\":\"Science\"}" + "]"; harperDbApiService.insertRecords("Demo", "Subject", records); } - private static void insertTeacherRecords() throws IOException { - String records = "[" + - "{\"id\":1, \"name\":\"Parthiv Pradhan\", \"joining_date\":\"04-05-2000\"}," - + "{\"id\":2, \"name\":\"David Martinez\", \"joining_date\":\"20-10-2005\"}," - + "{\"id\":3, \"name\":\"Liam Williams\", \"joining_date\":\"04-06-1997\"}," - + "{\"id\":4, \"name\":\"Robin Williams\", \"joining_date\":\"01-01-2020\"}," - + "{\"id\":5, \"name\":\"Eric Martin\", \"joining_date\":\"04-05-2022\"}," - + "{\"id\":6, \"name\":\"Sajjan Nagendra\", \"joining_date\":\"02-02-1999\"}" - + "]"; + private static void insertTeacherRecords() throws IOException { + String records = "[" + "{\"id\":1, \"name\":\"Parthiv Pradhan\", \"joining_date\":\"04-05-2000\"}," + + "{\"id\":2, \"name\":\"David Martinez\", \"joining_date\":\"20-10-2005\"}," + + "{\"id\":3, \"name\":\"Liam Williams\", \"joining_date\":\"04-06-1997\"}," + + "{\"id\":4, \"name\":\"Robin Williams\", \"joining_date\":\"01-01-2020\"}," + + "{\"id\":5, \"name\":\"Eric Martin\", \"joining_date\":\"04-05-2022\"}," + + "{\"id\":6, \"name\":\"Sajjan Nagendra\", \"joining_date\":\"02-02-1999\"}" + "]"; harperDbApiService.insertRecords("Demo", "Teacher", records); } private static void insertTeacherDetailsRecords() throws IOException { - String records = "[" - + "{\"id\":1, \"teacher_id\":1, \"subject_id\":1}," - + "{\"id\":2, \"teacher_id\":1, \"subject_id\":2}," - + "{\"id\":3, \"teacher_id\":2, \"subject_id\":3 }," - + "{\"id\":4, \"teacher_id\":3, \"subject_id\":1}," - + "{\"id\":5, \"teacher_id\":3, \"subject_id\":3}," - + "{\"id\":6, \"teacher_id\":4, \"subject_id\":2}," - + "{\"id\":7, \"teacher_id\":5, \"subject_id\":3}," - + "{\"id\":8, \"teacher_id\":6, \"subject_id\":1}," - + "{\"id\":9, \"teacher_id\":6, \"subject_id\":2}," - + "{\"id\":15, \"teacher_id\":6, \"subject_id\":3}" - + "]"; + String records = "[" + "{\"id\":1, \"teacher_id\":1, \"subject_id\":1}," + "{\"id\":2, \"teacher_id\":1, \"subject_id\":2}," + + "{\"id\":3, \"teacher_id\":2, \"subject_id\":3 }," + "{\"id\":4, \"teacher_id\":3, \"subject_id\":1}," + + "{\"id\":5, \"teacher_id\":3, \"subject_id\":3}," + "{\"id\":6, \"teacher_id\":4, \"subject_id\":2}," + + "{\"id\":7, \"teacher_id\":5, \"subject_id\":3}," + "{\"id\":8, \"teacher_id\":6, \"subject_id\":1}," + + "{\"id\":9, \"teacher_id\":6, \"subject_id\":2}," + "{\"id\":15, \"teacher_id\":6, \"subject_id\":3}" + "]"; harperDbApiService.insertRecords("Demo", "Teacher_Details", records); } @@ -110,7 +99,8 @@ public class HarperDBLiveTest { final String JDBC_URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; try (Connection connection = DriverManager.getConnection(JDBC_URL)) { - connection.createStatement().executeQuery("select 1"); + connection.createStatement() + .executeQuery("select 1"); logger.info("Connection Successful"); } }); @@ -125,7 +115,8 @@ public class HarperDBLiveTest { prop.setProperty("Password", "password"); try (Connection connection = DriverManager.getConnection("jdbc:harperdb:", prop)) { - connection.createStatement().executeQuery("select 1"); + connection.createStatement() + .executeQuery("select 1"); logger.info("Connection Successful"); } }); @@ -135,12 +126,13 @@ public class HarperDBLiveTest { void whenConnectionPooling_thenConnectSuccess() throws SQLException { assertDoesNotThrow(() -> { HarperDBConnectionPoolDataSource harperdbPoolDataSource = new HarperDBConnectionPoolDataSource(); - final String JDBC_URL = "jdbc:harperdb:UseConnectionPooling=true;PoolMaxSize=2;Server=127.0.0.1:" + port - + ";User=admin;Password=password;"; + final String JDBC_URL = "jdbc:harperdb:UseConnectionPooling=true;PoolMaxSize=2;Server=127.0.0.1:" + port + ";User=admin;Password=password;"; harperdbPoolDataSource.setURL(JDBC_URL); - try(Connection connection = harperdbPoolDataSource.getPooledConnection().getConnection()) { - connection.createStatement().executeQuery("select 1"); + try (Connection connection = harperdbPoolDataSource.getPooledConnection() + .getConnection()) { + connection.createStatement() + .executeQuery("select 1"); logger.info("Connection Pool Successful"); } }); @@ -155,7 +147,7 @@ public class HarperDBLiveTest { void givenStatement_whenFetchRecord_thenSuccess() throws SQLException { final String SQL_QUERY = "select id, name, grade from Demo.student"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(SQL_QUERY); while (resultSet.next()) { @@ -172,7 +164,7 @@ public class HarperDBLiveTest { void givenStatement_whenInsertRecord_thenSuccess() throws SQLException { final String INSERT_SQL = "insert into Demo.student(id, name, grade) values (10, 'Barak', 3)"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { Statement statement = connection.createStatement(); assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); } @@ -180,11 +172,11 @@ public class HarperDBLiveTest { @Test void givenStatement_whenInsertRecordInTableWithoutAttributes_thenSuccess() throws SQLException { - final String INSERT_SQL = "insert into Demo.teacher(id, name, joining_date) " - + "values (7, 'David Sirocco', '04-05-2004'), (8, 'Ali Azmat', '04-10-2000')"; + final String INSERT_SQL = + "insert into Demo.teacher(id, name, joining_date) " + "values (7, 'David Sirocco', '04-05-2004'), (8, 'Ali Azmat', '04-10-2000')"; final String QUERY_SQL = "select name, joining_date from Demo.teacher where name = ?"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { Statement statement = connection.createStatement(); assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); PreparedStatement preparedStatement = connection.prepareStatement(QUERY_SQL); @@ -204,7 +196,7 @@ public class HarperDBLiveTest { void givenStatement_whenUpdateRecord_thenSuccess() throws SQLException { final String UPDATE_SQL = "update Demo.student set grade = 4 where id = 5"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { Statement statement = connection.createStatement(); assertDoesNotThrow(() -> statement.execute(UPDATE_SQL)); assertEquals(1, statement.getUpdateCount()); @@ -215,7 +207,7 @@ public class HarperDBLiveTest { void givenStatement_whenDeleteRecord_thenSuccess() throws SQLException { final String DELETE_SQL = "delete from Demo.student where id = 3"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { Statement statement = connection.createStatement(); assertDoesNotThrow(() -> statement.execute(DELETE_SQL)); assertEquals(1, statement.getUpdateCount()); @@ -226,27 +218,27 @@ public class HarperDBLiveTest { void givenPreparedStatement_whenFetchRecord_thenSuccess() throws SQLException { final String SQL_QUERY = "select id, name, grade from Demo.student where name = ? and grade = ?"; - try(Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(SQL_QUERY); - preparedStatement.setString(1, "Robin"); - preparedStatement.setInt(2, 4); - ResultSet resultSet = preparedStatement.executeQuery(); - while (resultSet.next()) { - int id = resultSet.getInt("id"); - String name = resultSet.getString("name"); - int grade = resultSet.getInt("grade"); - assertNotNull(Integer.valueOf(id)); - assertEquals("Robin", name); - logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); - } - } + try (Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(SQL_QUERY); + preparedStatement.setString(1, "Robin"); + preparedStatement.setInt(2, 4); + ResultSet resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + int id = resultSet.getInt("id"); + String name = resultSet.getString("name"); + int grade = resultSet.getInt("grade"); + assertNotNull(Integer.valueOf(id)); + assertEquals("Robin", name); + logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); + } + } } @Test void givenPreparedStatement_whenDeleteRecord_thenSuccess() throws SQLException { final String DELETE_SQL = "delete from Demo.student where name = ?"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { PreparedStatement preparedStatement = connection.prepareStatement(DELETE_SQL); preparedStatement.setString(1, "James"); assertDoesNotThrow(() -> preparedStatement.execute()); @@ -258,7 +250,7 @@ public class HarperDBLiveTest { void givenPreparedStatement_whenUpdateRecord_thenSuccess() throws SQLException { final String UPDATE_SQL = "update Demo.student set grade = ? where id = ? and name = ?"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_SQL); preparedStatement.setInt(1, 5); preparedStatement.setInt(2, 1); @@ -270,10 +262,9 @@ public class HarperDBLiveTest { //@Test void whenAddtoBatch_thenExecuteBatchIsSuccess() throws SQLException { - final String INSERT_SQL = "insert into Demo.teacher(id, name, joining_date, subject_id)" - + "values(?, ?, ?, ?)"; + final String INSERT_SQL = "insert into Demo.teacher(id, name, joining_date, subject_id)" + "values(?, ?, ?, ?)"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { PreparedStatement preparedStatement = connection.prepareStatement(INSERT_SQL); preparedStatement.setInt(1, 9); preparedStatement.setString(2, "Bret Lee"); @@ -292,23 +283,19 @@ public class HarperDBLiveTest { } } - @Test void whenExecuteJoinQuery_thenResultSuccess() throws SQLException { - final String JOIN_QUERY = "SELECT t.name as teacher_name, s.name as subject_name " + - "from Demo.teacher AS t INNER JOIN Demo.subject AS s ON t.subject_id = s.id"; + final String JOIN_QUERY = + "SELECT t.name as teacher_name, s.name as subject_name " + "from Demo.teacher AS t INNER JOIN Demo.subject AS s ON t.subject_id = s.id"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { Statement statement = connection.createStatement(); - ResultSet resultSet = statement.executeQuery(JOIN_QUERY); while (resultSet.next()) { - logger.info("Teacher Name:" + resultSet.getString("teacher_name") + " Subject Name:" - + resultSet.getString("subject_name")); + logger.info("Teacher Name:" + resultSet.getString("teacher_name") + " Subject Name:" + resultSet.getString("subject_name")); } - } } @@ -316,7 +303,7 @@ public class HarperDBLiveTest { @Test void whenExecuteStoredToCreateTable_thenSuccess() throws SQLException { final String CREATE_TABLE_SQL = "CreateTable"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { CallableStatement callableStatement = connection.prepareCall(CREATE_TABLE_SQL); callableStatement.setString("SchemaName", "prod"); //schema gets created too @@ -326,7 +313,7 @@ public class HarperDBLiveTest { ResultSet resultSet = callableStatement.getResultSet(); - while(resultSet.next()) { + while (resultSet.next()) { String tableCreated = resultSet.getString("Success"); assertEquals("true", tableCreated); logger.info("result of the callable execute:" + tableCreated); From 367e9e6c2a0c332b774320bef8ee8818a3fce200 Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Mon, 27 Nov 2023 08:45:03 +0100 Subject: [PATCH 087/294] Assert the solution --- .../ShiftScheduleConstraintProviderUnitTest.java | 2 +- .../timefoldsolver/ShiftScheduleSolverUnitTest.java | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java index 3f68ef701e..fbe6ebccaf 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java @@ -21,7 +21,7 @@ class ShiftScheduleConstraintProviderUnitTest { constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(MONDAY.atTime(14, 0), MONDAY.atTime(22, 0), null, ann)) // Penalizes by 2 because both {shiftA, shiftB} and {shiftB, shiftA} match. - // To avoid that, use forEachUniquePair() in the constraint instead. + // To avoid that, use forEachUniquePair() in the constraint instead of forEach().join() in the implementation. .penalizesBy(2); } diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java index 45a84b40da..8b57fb42b6 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java @@ -1,5 +1,7 @@ package com.baeldung.timefoldsolver; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + import java.time.Duration; import java.time.LocalDate; import java.util.List; @@ -23,13 +25,17 @@ public class ShiftScheduleSolverUnitTest { SolverFactory solverFactory = SolverFactory.create(new SolverConfig().withSolutionClass(ShiftSchedule.class) .withEntityClasses(Shift.class) .withConstraintProviderClass(ShiftScheduleConstraintProvider.class) - // The solver runs only for 2 seconds on this tiny dataset. - // It's recommended to run for at least 5 minutes ("5m") on large datasets. - .withTerminationSpentLimit(Duration.ofSeconds(2))); + // For this dataset, we know the optimal score in advance (which is normally not the case). + // So we can use .withBestScoreLimit() instead of .withTerminationSpentLimit(). + .withTerminationConfig(new TerminationConfig().withBestScoreLimit("0hard/0soft"))); Solver solver = solverFactory.buildSolver(); ShiftSchedule problem = loadProblem(); ShiftSchedule solution = solver.solve(problem); + assertThat(solution.getShifts().size()).isNotZero(); + for (Shift shift : solution.getShifts()) { + assertThat(shift.getEmployee()).isNotNull(); + } printSolution(solution); } From e78928e37646d2aef20118dc2c27e42cc89ea4d1 Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Mon, 27 Nov 2023 14:15:25 +0200 Subject: [PATCH 088/294] Update JsonNodeToJsonObjectUnitTest.java --- .../jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java b/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java index e5a12869ea..38d097e5b8 100644 --- a/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java +++ b/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java @@ -10,6 +10,7 @@ import org.junit.Test; import static org.junit.Assert.*; public class JsonNodeToJsonObjectUnitTest { + public static String jsonString = "{\"name\": \"John\", \"gender\": \"male\", \"company\": \"Baeldung\", \"isEmployee\": true, \"age\": 30}"; @Test From 43fd0973ddeec97155f6c787336d05e05d0f8144 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Mon, 27 Nov 2023 23:15:13 +0530 Subject: [PATCH 089/294] BAEL-7259 --- .../baledung/harperdb/HarperDBLiveTest.java | 349 +++++++++--------- 1 file changed, 177 insertions(+), 172 deletions(-) diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java index 42ef04dadf..1cd377dc6d 100644 --- a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java +++ b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java @@ -12,6 +12,7 @@ import org.testcontainers.containers.GenericContainer; import java.io.IOException; import java.net.URISyntaxException; import java.sql.*; +import java.util.Arrays; import java.util.Properties; import static org.junit.jupiter.api.Assertions.*; @@ -63,18 +64,22 @@ public class HarperDBLiveTest { } private static void insertSubjectRecords() throws IOException { - String records = "[" + "{\"id\":1, \"name\":\"English\"}," + "{\"id\":2, \"name\":\"Maths\"}," + "{\"id\":3, \"name\":\"Science\"}" + "]"; + String records = "[" + + "{\"id\":1, \"name\":\"English\"}," + + "{\"id\":2, \"name\":\"Maths\"}," + + "{\"id\":3, \"name\":\"Science\"}" + + "]"; harperDbApiService.insertRecords("Demo", "Subject", records); } private static void insertTeacherRecords() throws IOException { - String records = "[" + "{\"id\":1, \"name\":\"Parthiv Pradhan\", \"joining_date\":\"04-05-2000\"}," + - "{\"id\":2, \"name\":\"David Martinez\", \"joining_date\":\"20-10-2005\"}," + - "{\"id\":3, \"name\":\"Liam Williams\", \"joining_date\":\"04-06-1997\"}," + + String records = "[" + "{\"id\":1, \"name\":\"James Cameron\", \"joining_date\":\"04-05-2000\"}," + + "{\"id\":2, \"name\":\"Joe Biden\", \"joining_date\":\"20-10-2005\"}," + + "{\"id\":3, \"name\":\"Jessie Williams\", \"joining_date\":\"04-06-1997\"}," + "{\"id\":4, \"name\":\"Robin Williams\", \"joining_date\":\"01-01-2020\"}," + - "{\"id\":5, \"name\":\"Eric Martin\", \"joining_date\":\"04-05-2022\"}," + - "{\"id\":6, \"name\":\"Sajjan Nagendra\", \"joining_date\":\"02-02-1999\"}" + "]"; + "{\"id\":5, \"name\":\"Eric Johnson\", \"joining_date\":\"04-05-2022\"}," + + "{\"id\":6, \"name\":\"Raghu Yadav\", \"joining_date\":\"02-02-1999\"}" + "]"; harperDbApiService.insertRecords("Demo", "Teacher", records); } @@ -138,175 +143,13 @@ public class HarperDBLiveTest { }); } - private static Connection getConnection() throws SQLException { - String URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; - return DriverManager.getConnection(URL); - } - - @Test - void givenStatement_whenFetchRecord_thenSuccess() throws SQLException { - final String SQL_QUERY = "select id, name, grade from Demo.student"; - - try (Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - ResultSet resultSet = statement.executeQuery(SQL_QUERY); - while (resultSet.next()) { - int id = resultSet.getInt("id"); - String name = resultSet.getString("name"); - int grade = resultSet.getInt("grade"); - assertNotNull(Integer.valueOf(id)); - logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); - } - } - } - - @Test - void givenStatement_whenInsertRecord_thenSuccess() throws SQLException { - final String INSERT_SQL = "insert into Demo.student(id, name, grade) values (10, 'Barak', 3)"; - - try (Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); - } - } - - @Test - void givenStatement_whenInsertRecordInTableWithoutAttributes_thenSuccess() throws SQLException { - final String INSERT_SQL = - "insert into Demo.teacher(id, name, joining_date) " + "values (7, 'David Sirocco', '04-05-2004'), (8, 'Ali Azmat', '04-10-2000')"; - final String QUERY_SQL = "select name, joining_date from Demo.teacher where name = ?"; - - try (Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); - PreparedStatement preparedStatement = connection.prepareStatement(QUERY_SQL); - preparedStatement.setString(1, "David Sirocco"); - ResultSet resultSet = preparedStatement.executeQuery(); - while (resultSet.next()) { - String teacherName = resultSet.getString("name"); - String joinDate = resultSet.getString("joining_date"); - assertEquals("David Sirocco", teacherName); - assertEquals("04-05-2004", joinDate); - logger.info("name:" + teacherName + " joining date:" + joinDate); - } - } - } - - @Test - void givenStatement_whenUpdateRecord_thenSuccess() throws SQLException { - final String UPDATE_SQL = "update Demo.student set grade = 4 where id = 5"; - - try (Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - assertDoesNotThrow(() -> statement.execute(UPDATE_SQL)); - assertEquals(1, statement.getUpdateCount()); - } - } - - @Test - void givenStatement_whenDeleteRecord_thenSuccess() throws SQLException { - final String DELETE_SQL = "delete from Demo.student where id = 3"; - - try (Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - assertDoesNotThrow(() -> statement.execute(DELETE_SQL)); - assertEquals(1, statement.getUpdateCount()); - } - } - - @Test - void givenPreparedStatement_whenFetchRecord_thenSuccess() throws SQLException { - final String SQL_QUERY = "select id, name, grade from Demo.student where name = ? and grade = ?"; - - try (Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(SQL_QUERY); - preparedStatement.setString(1, "Robin"); - preparedStatement.setInt(2, 4); - ResultSet resultSet = preparedStatement.executeQuery(); - while (resultSet.next()) { - int id = resultSet.getInt("id"); - String name = resultSet.getString("name"); - int grade = resultSet.getInt("grade"); - assertNotNull(Integer.valueOf(id)); - assertEquals("Robin", name); - logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); - } - } - } - - @Test - void givenPreparedStatement_whenDeleteRecord_thenSuccess() throws SQLException { - final String DELETE_SQL = "delete from Demo.student where name = ?"; - - try (Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(DELETE_SQL); - preparedStatement.setString(1, "James"); - assertDoesNotThrow(() -> preparedStatement.execute()); - assertEquals(1, preparedStatement.getUpdateCount()); - } - } - - @Test - void givenPreparedStatement_whenUpdateRecord_thenSuccess() throws SQLException { - final String UPDATE_SQL = "update Demo.student set grade = ? where id = ? and name = ?"; - - try (Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_SQL); - preparedStatement.setInt(1, 5); - preparedStatement.setInt(2, 1); - preparedStatement.setString(3, "John"); - assertDoesNotThrow(() -> preparedStatement.execute()); - assertEquals(1, preparedStatement.getUpdateCount()); - } - } - - //@Test - void whenAddtoBatch_thenExecuteBatchIsSuccess() throws SQLException { - final String INSERT_SQL = "insert into Demo.teacher(id, name, joining_date, subject_id)" + "values(?, ?, ?, ?)"; - - try (Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(INSERT_SQL); - preparedStatement.setInt(1, 9); - preparedStatement.setString(2, "Bret Lee"); - preparedStatement.setString(3, "07-08-2002"); - preparedStatement.setString(4, "[1, 3]"); - preparedStatement.addBatch(); - - preparedStatement.setInt(1, 10); - preparedStatement.setString(2, "Sarah Glimmer"); - preparedStatement.setString(3, "07-08-1997"); - preparedStatement.setString(4, "[1, 2]"); - - preparedStatement.addBatch(); - - assertDoesNotThrow(() -> preparedStatement.executeBatch()); - } - } - - @Test - void whenExecuteJoinQuery_thenResultSuccess() throws SQLException { - final String JOIN_QUERY = - "SELECT t.name as teacher_name, s.name as subject_name " + "from Demo.teacher AS t INNER JOIN Demo.subject AS s ON t.subject_id = s.id"; - - try (Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - - ResultSet resultSet = statement.executeQuery(JOIN_QUERY); - while (resultSet.next()) { - logger.info("Teacher Name:" + resultSet.getString("teacher_name") + " Subject Name:" + resultSet.getString("subject_name")); - } - - } - - } - @Test void whenExecuteStoredToCreateTable_thenSuccess() throws SQLException { - final String CREATE_TABLE_SQL = "CreateTable"; + final String CREATE_TABLE_PROC = "CreateTable"; try (Connection connection = getConnection()) { - CallableStatement callableStatement = connection.prepareCall(CREATE_TABLE_SQL); + CallableStatement callableStatement = connection.prepareCall(CREATE_TABLE_PROC); - callableStatement.setString("SchemaName", "prod"); //schema gets created too + callableStatement.setString("SchemaName", "prod"); callableStatement.setString("TableName", "subject"); callableStatement.setString("PrimaryKey", "id"); Boolean result = callableStatement.execute(); @@ -316,8 +159,170 @@ public class HarperDBLiveTest { while (resultSet.next()) { String tableCreated = resultSet.getString("Success"); assertEquals("true", tableCreated); - logger.info("result of the callable execute:" + tableCreated); + logger.info("Table Created Successfully"); } } } + + @Test + void givenStatement_whenInsertRecord_thenSuccess() throws SQLException { + final String INSERT_SQL = "insert into Demo.Subject(id, name) values " + + "(4, 'Social Studies')," + + "(5, 'Geography')"; + + try (Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); + assertEquals(2, statement.getUpdateCount()); + } + } + @Test + void givenPrepareStatement_whenAddToBatch_thenSuccess() throws SQLException { + final String INSERT_SQL = "insert into Demo.Teacher(id, name, joining_date) values" + + "(?, ?, ?)"; + + try (Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(INSERT_SQL); + preparedStatement.setInt(1, 7); + preparedStatement.setString(2, "Bret Lee"); + preparedStatement.setString(3, "07-08-2002"); + preparedStatement.addBatch(); + + preparedStatement.setInt(1, 8); + preparedStatement.setString(2, "Sarah Glimmer"); + preparedStatement.setString(3, "07-08-1997"); + preparedStatement.addBatch(); + + int[] recordsInserted = preparedStatement.executeBatch(); + + assertEquals(2, Arrays.stream(recordsInserted).sum()); + } + } + + + private static Connection getConnection() throws SQLException { + String URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; + return DriverManager.getConnection(URL); + } + + @Test + void givenStatement_whenFetchRecord_thenSuccess() throws SQLException { + final String SQL_QUERY = "select id, name from Demo.Subject where name = 'Maths'"; + + try (Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery(SQL_QUERY); + while (resultSet.next()) { + int id = resultSet.getInt("id"); + String name = resultSet.getString("name"); + assertNotNull(Integer.valueOf(id)); + assertEquals("Maths", name); + logger.info("Subject id:" + id + " Subject Name:" + name); + } + } + } + + @Test + void givenPreparedStatement_whenExecuteJoinQuery_thenSuccess() throws SQLException { + final String JOIN_QUERY = "SELECT t.name as teacher_name, t.joining_date as joining_date, s.name as subject_name " + + "from Demo.Teacher_Details AS td " + + "INNER JOIN Demo.Teacher AS t ON t.id = td.teacher_id " + + "INNER JOIN Demo.Subject AS s on s.id = td.subject_id " + + "where t.name = ?"; + + try (Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(JOIN_QUERY); + preparedStatement.setString(1, "Eric Johnson"); + + ResultSet resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + String teacherName = resultSet.getString("teacher_name"); + String subjectName = resultSet.getString("subject_name"); + String joiningDate = resultSet.getString("joining_date"); + assertEquals("Eric Johnson", teacherName); + assertEquals("Maths", subjectName); + logger.info("Teacher Name:" + teacherName + " Subject Name:" + subjectName + " Joining Date:" + joiningDate); + } + } + } + @Test + void givenPreparedStatement_whenFetchRecord_thenSuccess() throws SQLException { + final String SQL_QUERY = "select id, name from Demo.Subject where name = ?"; + + try (Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(SQL_QUERY); + preparedStatement.setString(1, "Maths"); + + ResultSet resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + int id = resultSet.getInt("id"); + String name = resultSet.getString("name"); + assertNotNull(Integer.valueOf(id)); + assertEquals("Maths", name); + logger.info("Subject id:" + id + " Subject Name:" + name); + } + } + } + + + @Test + void givenStatement_whenUpdateRecord_thenSuccess() throws SQLException { + final String UPDATE_SQL = "update Demo.Teacher_Details set subject_id = 2 " + + "where teacher_id in (2, 5)"; + final String UPDATE_SQL_WITH_SUB_QUERY = "update Demo.Teacher_Details " + + "set subject_id = (select id from Demo.Subject where name = 'Maths') " + + "where teacher_id in (select id from Demo.Teacher where name in ('Joe Biden', 'Eric Johnson'))"; + + try (Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(UPDATE_SQL)); + assertEquals(2, statement.getUpdateCount()); + } + + try (Connection connection = getConnection()) { + assertThrows(SQLException.class, () -> connection.createStatement().execute(UPDATE_SQL_WITH_SUB_QUERY)); + } + } + + @Test + void givenPreparedStatement_whenUpdateRecord_thenSuccess() throws SQLException { + final String UPDATE_SQL = "update Demo.Teacher_Details set subject_id = ? " + + "where teacher_id in (?, ?)"; + + try (Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_SQL); + preparedStatement.setInt(1, 1); + //following is not supported by the HarperDB driver + //Integer[] teacherIds = {4, 5}; + //Array teacherIdArray = connection.createArrayOf(Integer.class.getTypeName(), teacherIds); + preparedStatement.setInt(2, 4); + preparedStatement.setInt(3, 5); + assertDoesNotThrow(() -> preparedStatement.execute()); + assertEquals(2, preparedStatement.getUpdateCount()); + } + } + + @Test + void givenStatement_whenDeleteRecord_thenSuccess() throws SQLException { + final String DELETE_SQL = "delete from Demo.Teacher_Details where teacher_id = 6 and subject_id = 3"; + + try (Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(DELETE_SQL)); + assertEquals(1, statement.getUpdateCount()); + } + } + + @Test + void givenPreparedStatement_whenDeleteRecord_thenSuccess() throws SQLException { + final String DELETE_SQL = "delete from Demo.Teacher_Details where teacher_id = ? and subject_id = ?"; + + try (Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(DELETE_SQL); + preparedStatement.setInt(1, 6); + preparedStatement.setInt(2, 2); + assertDoesNotThrow(() -> preparedStatement.execute()); + assertEquals(1, preparedStatement.getUpdateCount()); + } + } } From 50de40daa27f61c0e5ba52d6c2d11f6e93a6c8a6 Mon Sep 17 00:00:00 2001 From: SGWebFreelancer Date: Tue, 28 Nov 2023 10:19:27 +0800 Subject: [PATCH 090/294] Unit Testing for CompletableFuture class --- .../CompletableFutureTest.java | 150 ++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTest.java diff --git a/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTest.java b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTest.java new file mode 100644 index 0000000000..25e8ea4c81 --- /dev/null +++ b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTest.java @@ -0,0 +1,150 @@ +package com.baeldung.concurrent.completablefuture; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; + +import org.junit.Test; + +public class CompletableFutureTest { + + @Test + public void givenAsyncTask_whenProcessingAsyncSucceed_thenReturnSuccess() throws ExecutionException, InterruptedException { + Microservice mockMicroserviceA = mock(Microservice.class); + Microservice mockMicroserviceB = mock(Microservice.class); + + when(mockMicroserviceA.retrieveAsync(any())).thenReturn(CompletableFuture.completedFuture("Hello")); + when(mockMicroserviceB.retrieveAsync(any())).thenReturn(CompletableFuture.completedFuture("World")); + + CompletableFuture resultFuture = processAsync(List.of(mockMicroserviceA, mockMicroserviceB)); + + String result = resultFuture.get(); + assertEquals("HelloWorld", result); + } + + @Test + public void givenAsyncTask_whenProcessingAsyncWithException_thenReturnException() throws ExecutionException, InterruptedException { + Microservice mockMicroserviceA = mock(Microservice.class); + Microservice mockMicroserviceB = mock(Microservice.class); + + when(mockMicroserviceA.retrieveAsync(any())).thenReturn(CompletableFuture.completedFuture("Hello")); + when(mockMicroserviceB.retrieveAsync(any())).thenReturn(CompletableFuture.failedFuture(new RuntimeException("Simulated Exception"))); + CompletableFuture resultFuture = processAsync(List.of(mockMicroserviceA, mockMicroserviceB)); + // Use assertThrows to verify that the expected exception is thrown + ExecutionException exception = assertThrows(ExecutionException.class, resultFuture::get); + // Assert the exception message + assertEquals("Simulated Exception", exception.getCause() + .getMessage()); + } + + @Test + public void givenAsyncTask_whenProcessingAsyncWithTimeout_thenHandleTimeoutException() throws ExecutionException, InterruptedException { + Microservice mockMicroserviceA = mock(Microservice.class); + Microservice mockMicroserviceB = mock(Microservice.class); + Executor delayedExecutor = CompletableFuture.delayedExecutor(200, TimeUnit.MILLISECONDS); + when(mockMicroserviceA.retrieveAsync(any())).thenReturn(CompletableFuture.supplyAsync(() -> "Hello", delayedExecutor)); + Executor delayedExecutor2 = CompletableFuture.delayedExecutor(500, TimeUnit.MILLISECONDS); + when(mockMicroserviceB.retrieveAsync(any())).thenReturn(CompletableFuture.supplyAsync(() -> "World", delayedExecutor2)); + CompletableFuture resultFuture = processAsync(List.of(mockMicroserviceA, mockMicroserviceB)); + assertThrows(TimeoutException.class, () -> resultFuture.get(300, TimeUnit.MILLISECONDS)); + } + + @Test + public void givenCompletableFuture_whenCompleted_thenStateIsDone() { + Executor delayedExecutor = CompletableFuture.delayedExecutor(200, TimeUnit.MILLISECONDS); + CompletableFuture cf1 = CompletableFuture.supplyAsync(() -> "Hello", delayedExecutor); + CompletableFuture cf2 = CompletableFuture.supplyAsync(() -> " World"); + CompletableFuture cf3 = CompletableFuture.supplyAsync(() -> "!"); + CompletableFuture[] cfs = new CompletableFuture[] { cf1, cf2, cf3 }; + + CompletableFuture allCf = CompletableFuture.allOf(cfs); + + assertFalse(allCf.isDone()); + allCf.join(); + String result = Arrays.stream(cfs) + .map(CompletableFuture::join) + .collect(Collectors.joining()); + + assertFalse(allCf.isCancelled()); + assertTrue(allCf.isDone()); + assertFalse(allCf.isCompletedExceptionally()); + assertEquals(result, "Hello World!"); + } + + @Test + public void givenCompletableFuture_whenCompletedWithException_thenStateIsCompletedExceptionally() throws ExecutionException, InterruptedException { + Executor delayedExecutor = CompletableFuture.delayedExecutor(200, TimeUnit.MILLISECONDS); + CompletableFuture cf1 = CompletableFuture.supplyAsync(() -> "Hello", delayedExecutor); + CompletableFuture cf2 = CompletableFuture.failedFuture(new RuntimeException("Simulated Exception")); + CompletableFuture cf3 = CompletableFuture.supplyAsync(() -> "!"); + CompletableFuture[] cfs = new CompletableFuture[] { cf1, cf2, cf3 }; + + CompletableFuture allCf = CompletableFuture.allOf(cfs); + + assertFalse(allCf.isDone()); + assertFalse(allCf.isCompletedExceptionally()); + + // Exception is expected, assert the cause + CompletionException exception = assertThrows(CompletionException.class, allCf::join); + + assertEquals("Simulated Exception", exception.getCause() + .getMessage()); + assertTrue(allCf.isCompletedExceptionally()); + assertTrue(allCf.isDone()); + assertFalse(allCf.isCancelled()); + } + + @Test + public void givenCompletableFuture_whenCancelled_thenStateIsCancelled() throws ExecutionException, InterruptedException { + Executor delayedExecutor = CompletableFuture.delayedExecutor(200, TimeUnit.MILLISECONDS); + CompletableFuture cf1 = CompletableFuture.supplyAsync(() -> "Hello", delayedExecutor); + CompletableFuture cf2 = CompletableFuture.supplyAsync(() -> " World"); + CompletableFuture cf3 = CompletableFuture.supplyAsync(() -> "!"); + CompletableFuture[] cfs = new CompletableFuture[] { cf1, cf2, cf3 }; + CompletableFuture allCf = CompletableFuture.allOf(cfs); + assertFalse(allCf.isDone()); + assertFalse(allCf.isCompletedExceptionally()); + allCf.cancel(true); + assertTrue(allCf.isCancelled()); + assertTrue(allCf.isDone()); + } + + CompletableFuture processAsync(List microservices) { + List> dataFetchFutures = fetchDataAsync(microservices); + return combineResults(dataFetchFutures); + } + + private List> fetchDataAsync(List microservices) { + return microservices.stream() + .map(client -> client.retrieveAsync("")) + .collect(Collectors.toList()); + } + + private CompletableFuture combineResults(List> dataFetchFutures) { + return CompletableFuture.allOf(dataFetchFutures.toArray(new CompletableFuture[0])) + .thenApply(v -> dataFetchFutures.stream() + .map(future -> future.exceptionally(ex -> { + throw new CompletionException(ex); + }) + .join()) + .collect(Collectors.joining())); + } + + interface Microservice { + CompletableFuture retrieveAsync(String input); + } +} From 93b63daa27efd5c20a69b5395f09a9c085b060cb Mon Sep 17 00:00:00 2001 From: SGWebFreelancer Date: Tue, 28 Nov 2023 10:24:39 +0800 Subject: [PATCH 091/294] Fix test file name --- ...ompletableFutureTest.java => CompletableFutureUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/{CompletableFutureTest.java => CompletableFutureUnitTest.java} (99%) diff --git a/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTest.java b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureUnitTest.java similarity index 99% rename from core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTest.java rename to core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureUnitTest.java index 25e8ea4c81..5953c6d87a 100644 --- a/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTest.java +++ b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureUnitTest.java @@ -20,7 +20,7 @@ import java.util.stream.Collectors; import org.junit.Test; -public class CompletableFutureTest { +public class CompletableFutureUnitTest { @Test public void givenAsyncTask_whenProcessingAsyncSucceed_thenReturnSuccess() throws ExecutionException, InterruptedException { From fcc9c4c6ce83adcb43fa2b12abb17c29994c7b85 Mon Sep 17 00:00:00 2001 From: anujgaud <146576725+anujgaud@users.noreply.github.com> Date: Wed, 29 Nov 2023 01:49:35 +0530 Subject: [PATCH 092/294] Add milliseconds --- .../com/baeldung/localdatetoiso/LocalDateToISO.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java index 969006a720..a04d554d5a 100644 --- a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java +++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java @@ -12,25 +12,24 @@ import org.apache.commons.lang3.time.DateFormatUtils; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.ISODateTimeFormat; public class LocalDateToISO { public String formatUsingDateTimeFormatter(LocalDate localDate) { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssX"); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX"); String formattedDate = localDate.atStartOfDay().atOffset(ZoneOffset.UTC).format(formatter); return formattedDate; } public String formatUsingSimpleDateFormat(LocalDate date) { Date utilDate = Date.from(date.atStartOfDay(ZoneOffset.UTC).toInstant()); - DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX"); String formattedDate = dateFormat.format(utilDate); return formattedDate; } public String formatUsingJodaTime(org.joda.time.LocalDate localDate) { - DateTime dateTime = localDate.toDateTimeAtStartOfDay(DateTimeZone.UTC); - org.joda.time.format.DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'"); - String formattedDate = formatter.print(localDate); - return formattedDate; + org.joda.time.format.DateTimeFormatter formatter = ISODateTimeFormat.dateTime(); + return formatter.print(localDate.toDateTimeAtStartOfDay(DateTimeZone.UTC)); } } From ecba15ffb748457103ca69985a2221e4450d33d9 Mon Sep 17 00:00:00 2001 From: anujgaud <146576725+anujgaud@users.noreply.github.com> Date: Wed, 29 Nov 2023 01:51:58 +0530 Subject: [PATCH 093/294] Update tests --- .../com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java index 077c7ca858..7e45f4cba1 100644 --- a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java @@ -11,7 +11,7 @@ public class LocalDateToISOUnitTest { LocalDateToISO localDateToISO = new LocalDateToISO(); LocalDate localDate = LocalDate.of(2023, 11, 6); - String expected = "2023-11-06T00:00:00Z"; + String expected = "2023-11-06T00:00:00.000Z"; String actual = localDateToISO.formatUsingDateTimeFormatter(localDate); assertEquals(expected, actual); } @@ -21,7 +21,7 @@ public class LocalDateToISOUnitTest { LocalDateToISO localDateToISO = new LocalDateToISO(); LocalDate localDate = LocalDate.of(2023, 11, 6); - String expected = "2023-11-06T00:00:00Z"; + String expected = "2023-11-06T00:00:00.000Z"; String actual = localDateToISO.formatUsingSimpleDateFormat(localDate); assertEquals(expected, actual); } @@ -31,7 +31,7 @@ public class LocalDateToISOUnitTest { LocalDateToISO localDateToISO = new LocalDateToISO(); org.joda.time.LocalDate localDate = new org.joda.time.LocalDate(2023, 11, 6); - String expected = "2023-11-06T00:00:00Z"; + String expected = "2023-11-06T00:00:00.000Z"; String actual = localDateToISO.formatUsingJodaTime(localDate); assertEquals(expected, actual); } From 118195d99689ea24033eddad68584da4b4ad2de1 Mon Sep 17 00:00:00 2001 From: anujgaud <146576725+anujgaud@users.noreply.github.com> Date: Wed, 29 Nov 2023 01:56:50 +0530 Subject: [PATCH 094/294] Add Apache Commons Lang support --- .../java/com/baeldung/localdatetoiso/LocalDateToISO.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java index a04d554d5a..a62be336ca 100644 --- a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java +++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java @@ -14,6 +14,8 @@ import org.joda.time.DateTimeZone; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.ISODateTimeFormat; +import org.apache.commons.lang3.time.FastDateFormat; + public class LocalDateToISO { public String formatUsingDateTimeFormatter(LocalDate localDate) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX"); @@ -32,4 +34,11 @@ public class LocalDateToISO { org.joda.time.format.DateTimeFormatter formatter = ISODateTimeFormat.dateTime(); return formatter.print(localDate.toDateTimeAtStartOfDay(DateTimeZone.UTC)); } + + public String formatUsingApacheCommonsLang(LocalDate localDate) { + Date date = Date.from(localDate.atStartOfDay().toInstant(ZoneOffset.UTC)); + String formattedDate = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss.sss'Z'", TimeZone.getTimeZone("UTC")) + .format(date); + return formattedDate; + } } From 677f4277f23e4a2d1b4003d6f68db0e20456023a Mon Sep 17 00:00:00 2001 From: anujgaud <146576725+anujgaud@users.noreply.github.com> Date: Wed, 29 Nov 2023 01:57:30 +0530 Subject: [PATCH 095/294] Add Unit test for commons Lang --- .../localdatetoiso/LocalDateToISOUnitTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java index 7e45f4cba1..c8a77d3e39 100644 --- a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java @@ -35,4 +35,14 @@ public class LocalDateToISOUnitTest { String actual = localDateToISO.formatUsingJodaTime(localDate); assertEquals(expected, actual); } + + @Test + public void givenLocalDate_whenUsingApacheCommonsLangThenISOFormat() { + LocalDateToISO localDateToISO = new LocalDateToISO(); + LocalDate localDate = LocalDate.of(2023, 11, 6); + + String expected = "2023-11-06T00:00:00.000Z"; + String actual = localDateToISO.formatUsingApacheCommonsLang(localDate); + assertEquals(expected, actual); + } } From eac9c4d5e90218a5b5e9f9b53384bc7afc4176b7 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Wed, 29 Nov 2023 19:45:34 +0530 Subject: [PATCH 096/294] BAEL-7259 --- persistence-modules/java-harperdb/pom.xml | 11 +- .../baledung/harperdb/HarperDBLiveTest.java | 109 +++++++++++++----- .../src/test/resources/UserDefinedViews.json | 5 + .../java-harperdb/src/test/resources/test.db | 0 4 files changed, 90 insertions(+), 35 deletions(-) create mode 100644 persistence-modules/java-harperdb/src/test/resources/UserDefinedViews.json create mode 100644 persistence-modules/java-harperdb/src/test/resources/test.db diff --git a/persistence-modules/java-harperdb/pom.xml b/persistence-modules/java-harperdb/pom.xml index 896a58f858..56b63948c9 100644 --- a/persistence-modules/java-harperdb/pom.xml +++ b/persistence-modules/java-harperdb/pom.xml @@ -38,6 +38,11 @@ testcontainers test + + org.apache.derby + derby + 10.13.1.1 + @@ -52,10 +57,4 @@ - - 19 - 19 - UTF-8 - - \ No newline at end of file diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java index 1cd377dc6d..5908a57560 100644 --- a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java +++ b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java @@ -11,8 +11,10 @@ import org.testcontainers.containers.GenericContainer; import java.io.IOException; import java.net.URISyntaxException; +import java.net.URL; import java.sql.*; import java.util.Arrays; +import java.util.Map; import java.util.Properties; import static org.junit.jupiter.api.Assertions.*; @@ -21,11 +23,10 @@ public class HarperDBLiveTest { private static final Logger logger = LoggerFactory.getLogger(HarperDBLiveTest.class); - private static String host; - private static Integer port; private static HarperDBContainer harperDBContainer; + private static HarperDBApiService harperDbApiService; @BeforeAll @@ -40,7 +41,6 @@ public class HarperDBLiveTest { GenericContainer genericContainer = harperDBContainer.installHarperDB(); - host = genericContainer.getHost(); genericContainer.start(); port = genericContainer.getFirstMappedPort(); @@ -51,7 +51,7 @@ public class HarperDBLiveTest { harperDbApiService = new HarperDBApiService(url, "admin", "password"); } - private static void setupDB() throws URISyntaxException, IOException { + private static void setupDB() throws IOException { harperDbApiService.createSchema("Demo"); harperDbApiService.createTable("Demo", "Subject", "name"); @@ -99,7 +99,7 @@ public class HarperDBLiveTest { } @Test - void whenConnectionInfoInURL_thenConnectSuccess() throws SQLException { + void whenConnectionInfoInURL_thenConnectSuccess() { assertDoesNotThrow(() -> { final String JDBC_URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; @@ -112,7 +112,7 @@ public class HarperDBLiveTest { } @Test - void whenConnectionInfoInProperties_thenConnectSuccess() throws SQLException { + void whenConnectionInfoInProperties_thenConnectSuccess() { assertDoesNotThrow(() -> { Properties prop = new Properties(); prop.setProperty("Server", "127.0.0.1:" + port); @@ -128,7 +128,7 @@ public class HarperDBLiveTest { } @Test - void whenConnectionPooling_thenConnectSuccess() throws SQLException { + void whenConnectionPooling_thenConnectSuccess() { assertDoesNotThrow(() -> { HarperDBConnectionPoolDataSource harperdbPoolDataSource = new HarperDBConnectionPoolDataSource(); final String JDBC_URL = "jdbc:harperdb:UseConnectionPooling=true;PoolMaxSize=2;Server=127.0.0.1:" + port + ";User=admin;Password=password;"; @@ -176,6 +176,7 @@ public class HarperDBLiveTest { assertEquals(2, statement.getUpdateCount()); } } + @Test void givenPrepareStatement_whenAddToBatch_thenSuccess() throws SQLException { final String INSERT_SQL = "insert into Demo.Teacher(id, name, joining_date) values" @@ -199,12 +200,23 @@ public class HarperDBLiveTest { } } - private static Connection getConnection() throws SQLException { String URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; return DriverManager.getConnection(URL); } + private static Connection getConnection(Map properties) throws SQLException { + Properties prop = new Properties(); + prop.setProperty("Server", "127.0.0.1:" + port); + prop.setProperty("User", "admin"); + prop.setProperty("Password", "password"); + for (Map.Entry entry : properties.entrySet()) { + prop.setProperty(entry.getKey(), entry.getValue()); + } + + return DriverManager.getConnection("jdbc:harperdb:", prop); + } + @Test void givenStatement_whenFetchRecord_thenSuccess() throws SQLException { final String SQL_QUERY = "select id, name from Demo.Subject where name = 'Maths'"; @@ -213,9 +225,9 @@ public class HarperDBLiveTest { Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(SQL_QUERY); while (resultSet.next()) { - int id = resultSet.getInt("id"); + Integer id = resultSet.getInt("id"); String name = resultSet.getString("name"); - assertNotNull(Integer.valueOf(id)); + assertNotNull(id); assertEquals("Maths", name); logger.info("Subject id:" + id + " Subject Name:" + name); } @@ -245,25 +257,6 @@ public class HarperDBLiveTest { } } } - @Test - void givenPreparedStatement_whenFetchRecord_thenSuccess() throws SQLException { - final String SQL_QUERY = "select id, name from Demo.Subject where name = ?"; - - try (Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(SQL_QUERY); - preparedStatement.setString(1, "Maths"); - - ResultSet resultSet = preparedStatement.executeQuery(); - while (resultSet.next()) { - int id = resultSet.getInt("id"); - String name = resultSet.getString("name"); - assertNotNull(Integer.valueOf(id)); - assertEquals("Maths", name); - logger.info("Subject id:" + id + " Subject Name:" + name); - } - } - } - @Test void givenStatement_whenUpdateRecord_thenSuccess() throws SQLException { @@ -325,4 +318,62 @@ public class HarperDBLiveTest { assertEquals(1, preparedStatement.getUpdateCount()); } } + + @Test + void givenTempTable_whenInsertIntoSelectTempTable_thenSuccess() throws SQLException { + try (Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> { + statement.execute("insert into Teacher#TEMP(id, name, joining_date) " + + "values('12', 'David Flinch', '04-04-2014')"); + statement.execute("insert into Teacher#TEMP(id, name, joining_date) " + + "values('13', 'Stephen Hawkins', '04-07-2017')"); + statement.execute("insert into Teacher#TEMP(id, name, joining_date) " + + "values('14', 'Albert Einstein', '12-08-2020')"); + statement.execute("insert into Teacher#TEMP(id, name, joining_date) " + + "values('15', 'Leo Tolstoy', '20-08-2022')"); + }); + assertDoesNotThrow(() -> statement.execute("insert into Demo.Teacher(id, name, joining_date) " + + "select id, name, joining_date from Teacher#TEMP")); + ResultSet resultSet = statement.executeQuery("select count(id) as rows from Demo.Teacher where id in" + + " (12, 13, 14, 15)"); + resultSet.next(); + int totalRows = resultSet.getInt("rows"); + logger.info("total number of rows fetched:" + totalRows); + assertEquals(4, totalRows); + } + } + + @Test + void givenUserDefinedView_whenQueryView_thenSuccess() throws SQLException { + URL url = ClassLoader.getSystemClassLoader().getResource("UserDefinedViews.json"); + + String folderPath = url.getPath().substring(0, url.getPath().lastIndexOf('/')); + + try(Connection connection = getConnection(Map.of("Location", folderPath))) { + PreparedStatement preparedStatement = connection.prepareStatement("select teacher_name,subject_name" + + " from UserViews.View_Teacher_Details where subject_name = ?"); + preparedStatement.setString(1, "Science"); + ResultSet resultSet = preparedStatement.executeQuery(); + while(resultSet.next()) { + assertEquals("Science", resultSet.getString("subject_name")); + logger.info("Science Teacher Name:" + resultSet.getString("teacher_name")); + } + } + } + + @Test + void givenAutoCache_whenQuery_thenSuccess() throws SQLException { + URL url = ClassLoader.getSystemClassLoader().getResource("test.db"); + String folderPath = url.getPath().substring(0, url.getPath().lastIndexOf('/')); + logger.info("Cache Location:" + folderPath); + try(Connection connection = getConnection(Map.of("AutoCache", "true", "CacheLocation", folderPath))) { + PreparedStatement preparedStatement = connection.prepareStatement("select id, name from Demo.Subject"); + + ResultSet resultSet = preparedStatement.executeQuery(); + while(resultSet.next()) { + logger.info("Subject Name:" + resultSet.getString("name")); + } + } + } } diff --git a/persistence-modules/java-harperdb/src/test/resources/UserDefinedViews.json b/persistence-modules/java-harperdb/src/test/resources/UserDefinedViews.json new file mode 100644 index 0000000000..fba67def3c --- /dev/null +++ b/persistence-modules/java-harperdb/src/test/resources/UserDefinedViews.json @@ -0,0 +1,5 @@ +{ + "View_Teacher_Details": { + "query": "SELECT t.name as teacher_name, t.joining_date as joining_date, s.name as subject_name from Demo.Teacher_Details AS td INNER JOIN Demo.Teacher AS t ON t.id = td.teacher_id INNER JOIN Demo.Subject AS s on s.id = td.subject_id" + } +} \ No newline at end of file diff --git a/persistence-modules/java-harperdb/src/test/resources/test.db b/persistence-modules/java-harperdb/src/test/resources/test.db new file mode 100644 index 0000000000..e69de29bb2 From 952f1d2cd2f11c88dc9b24584c08acf36805ec44 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Wed, 29 Nov 2023 19:56:38 +0530 Subject: [PATCH 097/294] Deleted unused file --- .../harperdb/HarperDBLiveTestOld.java | 356 ------------------ 1 file changed, 356 deletions(-) delete mode 100644 persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTestOld.java diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTestOld.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTestOld.java deleted file mode 100644 index 8becea76a5..0000000000 --- a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTestOld.java +++ /dev/null @@ -1,356 +0,0 @@ -package com.baledung.harperdb; - -import cdata.jdbc.harperdb.HarperDBConnectionPoolDataSource; -import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.classic.methods.HttpPost; -import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.CloseableHttpClient; -import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; -import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.HttpClientBuilder; -import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.ClassicHttpRequest; -import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.HttpEntity; -import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.io.entity.StringEntity; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testcontainers.containers.GenericContainer; - -import java.io.IOException; -import java.net.URISyntaxException; -import java.sql.*; -import java.util.Map; -import java.util.Properties; - -import static org.junit.jupiter.api.Assertions.*; - -public class HarperDBLiveTestOld { - private static final Logger logger = LoggerFactory.getLogger(HarperDBLiveTestOld.class); - - private static String host; - - private static Integer port; - - private static GenericContainer harperDBContainer; - - @BeforeAll - static void setupHarperDB() throws IOException, InterruptedException, URISyntaxException { - installHarperDB(); - setupDB(); - } - - private static void installHarperDB() { - Map envMap = Map.of( - "HDB_ADMIN_USERNAME", "admin", - "HDB_ADMIN_PASSWORD", "password", - "OPERATIONSAPI_NETWORK_PORT", "9925", - "ROOTPATH", "/home/harperdb/hdb", - "LOGGING_STDSTREAMS", "true" - ); - - harperDBContainer = new GenericContainer("harperdb/harperdb:latest") - .withEnv(envMap) - .withExposedPorts(9925, 9926); - host = harperDBContainer.getHost(); - harperDBContainer.start(); - port = harperDBContainer.getFirstMappedPort(); - logger.info("DB Host:" + host + "\n DB Port:" + port); - } - - private static void setupDB() throws URISyntaxException, IOException { - setupSchema("demo"); - createTable("demo", "student", "name", "grade", "subject_id"); - createTable("demo", "teacher", "name", "joining_date", "subject_id"); - insertRecords(); - } - - private static void setupSchema(String schema) throws URISyntaxException, IOException { - String requestBody = "{\"operation\":\"create_schema\", \"" + "schema\":\"" + schema + "\"" + "}"; - executeHttpPostRequest(requestBody); - } - - private static void executeHttpPostRequest(String httpRequest) throws IOException { - logger.info("Post request body:" + httpRequest); - - try (CloseableHttpClient closeableHttpClient = HttpClientBuilder.create().build()) { - HttpPost request = new HttpPost("http://localhost:" + port + "/"); - request.addHeader("Authorization", "Basic YWRtaW46cGFzc3dvcmQ="); - request.addHeader("Content-Type", "application/json"); - request.setEntity((HttpEntity) new StringEntity(httpRequest)); - CloseableHttpResponse response = closeableHttpClient.execute((ClassicHttpRequest) request); - logger.info("REST API response:" + response.toString()); - assertEquals(200, response.getCode()); - } - } - - private void insertStudentRecords() { - - } - - private void insertSubjectRecords() { - - } - - private void insertTeacherRecords() { - - } - - private static void createTable(String schemaName, String tableName, String... attributes) throws IOException { - String createTableReq = "{\"operation\":\"create_table\",\"schema\":\"" - + schemaName + "\",\"table\":\"" - + tableName + "\",\"hash_attribute\":\"id\"" - + "}"; - executeHttpPostRequest(createTableReq); - logger.info("created table:" + tableName); - for (String attribute : attributes) { - String createAttrReq = "{\"operation\":\"create_attribute\",\"schema\":\"" - + schemaName + "\",\"table\":\"" - + tableName + "\",\"attribute\":\"" - + attribute + "\"" - + "}"; - executeHttpPostRequest(createAttrReq); - logger.info("created attribute:" + attribute + " in table:" + tableName); - } - } - - private static void insertRecords() throws IOException { - - String table = "student"; - String schema = "demo"; - String operation = "insert"; - String records = "[" + - "{\"id\":1, \"name\":\"John\", \"grade\":4}," - + "{\"id\":2, \"name\":\"James\", \"grade\":1}," - + "{\"id\":3, \"name\":\"Williams\", \"grade\":1}," - + "{\"id\":4, \"name\":\"Robin\", \"grade\":4}," - + "{\"id\":5, \"name\":\"Torry\", \"grade\":3}," - + "{\"id\":6, \"name\":\"Nancy\", \"grade\":5}," - + "{\"id\":7, \"name\":\"Mary\", \"grade\":5}," - + "{\"id\":8, \"name\":\"Jenny\", \"grade\":6}," - + "{\"id\":9, \"name\":\"Katy\", \"grade\":6}," - + "{\"id\":15, \"name\":\"Michael\", \"grade\":6}" - + "]"; - String requestBody = "{\"table\":" + "\"" + table + "\"," - + "\"schema\":" + "\"" + schema + "\"" + "," - + "\"operation\":" + "\"" + operation + "\"" + "," - + "\"records\":" + records - + "}"; - String sql = "{" - + "\"operation\":\"sql\", " - + "\"sql\":\"insert into demo.student(id, name, grade) values" - + "(1, 'John', 4), (2, 'James', 1), (3, 'Williams', 1), (4, 'Robin', 4), (5, 'Torry', 3)," - + " (6, 'Nancy', 5), (7, 'Mary', 5), (8, 'Jenny', 6), (9, 'Katy', 6)\"" - + "}"; - executeHttpPostRequest(requestBody); - } - - @AfterAll - static void stopHarperDB() { - harperDBContainer.stop(); - } - - @Test - void whenConnectionInfoInURL_thenConnectSuccess() throws SQLException { - assertDoesNotThrow(() -> { - String URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; - - try (Connection connection = DriverManager.getConnection(URL)) { - connection.createStatement().executeQuery("select 1"); - logger.info("Connection Successful"); - } - }); - } - - @Test - void whenConnectionInfoInProperties_thenConnectSuccess() throws SQLException { - assertDoesNotThrow(() -> { - Properties prop = new Properties(); - prop.setProperty("Server", "127.0.0.1:" + port); - prop.setProperty("User", "admin"); - prop.setProperty("Password", "password"); - - try (Connection connection = DriverManager.getConnection("jdbc:harperdb:", prop)) { - connection.createStatement().executeQuery("select 1"); - logger.info("Connection Successful"); - } - }); - } - - @Test - void whenConnectionPooling_thenConnectSuccess() throws SQLException { - assertDoesNotThrow(() -> { - HarperDBConnectionPoolDataSource harperdbPoolDataSource = new HarperDBConnectionPoolDataSource(); - String URL = "jdbc:harperdb:UseConnectionPooling=true;PoolMaxSize=2;Server=127.0.0.1:" + port - + ";User=admin;Password=1234;"; - harperdbPoolDataSource.setURL(URL); - - try(Connection connection = harperdbPoolDataSource.getPooledConnection().getConnection()) { - connection.createStatement().executeQuery("select 1"); - logger.info("Connection Successful"); - } - }); - } - - private static Connection getConnection() throws SQLException { - String URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; - return DriverManager.getConnection(URL); - } - - @Test - void givenStatement_whenFetchRecord_thenSuccess() throws SQLException { - final String SQL_QUERY = "select id, name, grade from demo.student"; - - try(Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - ResultSet resultSet = statement.executeQuery(SQL_QUERY); - while (resultSet.next()) { - int id = resultSet.getInt("id"); - String name = resultSet.getString("name"); - int grade = resultSet.getInt("grade"); - assertNotNull(Integer.valueOf(id)); - logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); - } - } - } - - @Test - void givenStatement_whenInsertRecord_thenSuccess() throws SQLException { - final String INSERT_SQL = "insert into demo.student(id, name, grade) values (10, 'Barak', 3)"; - - try(Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); - } - } - - @Test - void givenStatement_whenInsertRecordInTableWithoutAttributes_thenSuccess() throws SQLException { - final String INSERT_SQL = "insert into demo.teacher(id, name, joining_date) " - + "values (1, 'David Martinez', '04-05-2004'), (2, 'Eric Martin', '04-10-2000')"; - final String QUERY_SQL = "select name, joining_date from demo.teacher where name = ?"; - - try(Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); - PreparedStatement preparedStatement = connection.prepareStatement(QUERY_SQL); - preparedStatement.setString(1, "Eric Martin"); - ResultSet resultSet = preparedStatement.executeQuery(); - while (resultSet.next()) { - String teacherName = resultSet.getString("name"); - String joinDate = resultSet.getString("joining_date"); - assertEquals("Eric Martin", teacherName); - assertEquals("04-10-2000", joinDate); - logger.info("name:" + teacherName + " joining date:" + joinDate); - } - } - } - - @Test - void givenStatement_whenUpdateRecord_thenSuccess() throws SQLException { - final String UPDATE_SQL = "update demo.student set grade = 4 where id = 5"; - - try(Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - assertDoesNotThrow(() -> statement.execute(UPDATE_SQL)); - assertEquals(1, statement.getUpdateCount()); - } - } - - @Test - void givenStatement_whenDeleteRecord_thenSuccess() throws SQLException { - final String DELETE_SQL = "delete from demo.student where id = 3"; - - try(Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - assertDoesNotThrow(() -> statement.execute(DELETE_SQL)); - assertEquals(1, statement.getUpdateCount()); - } - } - - @Test - void givenPreparedStatement_whenFetchRecord_thenSuccess() throws SQLException { - final String SQL_QUERY = "select id, name, grade from demo.student where name = ? and grade = ?"; - - try(Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(SQL_QUERY); - preparedStatement.setString(1, "Robin"); - preparedStatement.setInt(2, 4); - ResultSet resultSet = preparedStatement.executeQuery(); - while (resultSet.next()) { - int id = resultSet.getInt("id"); - String name = resultSet.getString("name"); - int grade = resultSet.getInt("grade"); - assertNotNull(Integer.valueOf(id)); - assertEquals("Robin", name); - logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); - } - } - } - - @Test - void givenPreparedStatement_whenDeleteRecord_thenSuccess() throws SQLException { - final String DELETE_SQL = "delete from demo.student where name = ?"; - - try(Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(DELETE_SQL); - preparedStatement.setString(1, "James"); - assertDoesNotThrow(() -> preparedStatement.execute()); - assertEquals(1, preparedStatement.getUpdateCount()); - } - } - - @Test - void givenPreparedStatement_whenUpdateRecord_thenSuccess() throws SQLException { - final String UPDATE_SQL = "update demo.student set grade = ? where id = ? and name = ?"; - - try(Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_SQL); - preparedStatement.setInt(1, 5); - preparedStatement.setInt(2, 1); - preparedStatement.setString(3, "John"); - assertDoesNotThrow(() -> preparedStatement.execute()); - assertEquals(1, preparedStatement.getUpdateCount()); - } - } - - @Test - void whenAddtoBatch_thenExecuteBatchIsSuccess() throws SQLException { - final String INSERT_SQL = "insert into demo.teacher(id, name, joining_date)" - + "values(?, ?, ?)"; - - try(Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(INSERT_SQL); - preparedStatement.setInt(1, 1); - preparedStatement.setString(2, "Bret Lee"); - preparedStatement.setString(3, "07-08-2002"); - preparedStatement.addBatch(); - - preparedStatement.setInt(1, 2); - preparedStatement.setString(2, "Sarah Glimmer"); - preparedStatement.setString(3, "07-08-1997"); - preparedStatement.addBatch(); - - assertDoesNotThrow(() -> preparedStatement.executeBatch()); - } - } - - @Test - void whenExecuteStoredToCreateTable_thenSuccess() throws SQLException { - final String CREATE_TABLE_SQL = "CreateTable"; - try(Connection connection = getConnection()) { - CallableStatement callableStatement = connection.prepareCall(CREATE_TABLE_SQL); - - callableStatement.setString("SchemaName", "prod"); //schema gets created too - callableStatement.setString("TableName", "subject"); - callableStatement.setString("PrimaryKey", "id"); - Boolean result = callableStatement.execute(); - - ResultSet resultSet = callableStatement.getResultSet(); - - while(resultSet.next()) { - String tableCreated = resultSet.getString("Success"); - assertEquals("true", tableCreated); - logger.info("result of the callable execute:" + tableCreated); - } - } - } -} From c2b0f73f33cf69030747c5f693bb149ea6f98870 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Wed, 29 Nov 2023 20:01:31 +0530 Subject: [PATCH 098/294] included persistence-modules/java-harperdb --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 7099dd8cbc..219fc19071 100644 --- a/pom.xml +++ b/pom.xml @@ -819,6 +819,7 @@ performance-tests persistence-modules persistence-modules/spring-data-neo4j + persistence-modules/java-harperdb protobuffer quarkus-modules reactive-systems From 44e565ffe82395c5dca2464588b43ac8734e3446 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Wed, 29 Nov 2023 17:25:49 +0200 Subject: [PATCH 099/294] [JAVA-26711] Upgraded shedlock to latest version(5.10.0) --- spring-boot-modules/spring-boot-libraries/pom.xml | 2 +- .../scheduling/shedlock/BaeldungTaskScheduler.java | 4 ++-- spring-core-2/pom.xml | 12 ------------ 3 files changed, 3 insertions(+), 15 deletions(-) diff --git a/spring-boot-modules/spring-boot-libraries/pom.xml b/spring-boot-modules/spring-boot-libraries/pom.xml index b0f0c780aa..fd3daa1a79 100644 --- a/spring-boot-modules/spring-boot-libraries/pom.xml +++ b/spring-boot-modules/spring-boot-libraries/pom.xml @@ -225,7 +225,7 @@ 2.2.4 3.2.0 0.23.0 - 2.1.0 + 5.10.0 1.5-beta1 2.1 2.6.0 diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/BaeldungTaskScheduler.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/BaeldungTaskScheduler.java index cd5f63e962..c03d351c20 100644 --- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/BaeldungTaskScheduler.java +++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/BaeldungTaskScheduler.java @@ -1,13 +1,13 @@ package com.baeldung.scheduling.shedlock; -import net.javacrumbs.shedlock.core.SchedulerLock; +import net.javacrumbs.shedlock.spring.annotation.SchedulerLock; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component class BaeldungTaskScheduler { @Scheduled(cron = "0 0/15 * * * ?") - @SchedulerLock(name = "TaskScheduler_scheduledTask", lockAtLeastForString = "PT5M", lockAtMostForString = "PT14M") + @SchedulerLock(name = "TaskScheduler_scheduledTask", lockAtLeastFor = "PT5M", lockAtMostFor = "PT14M") public void scheduledTask() { System.out.println("Running ShedLock task"); } diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml index f27b16acc3..bed0d730b2 100644 --- a/spring-core-2/pom.xml +++ b/spring-core-2/pom.xml @@ -119,17 +119,6 @@ spring-boot-starter-test test - - - net.javacrumbs.shedlock - shedlock-spring - ${shedlock.version} - - - net.javacrumbs.shedlock - shedlock-provider-jdbc-template - ${shedlock.version} - org.projectlombok lombok @@ -161,7 +150,6 @@ 1.3.2 3.6 - 2.1.0 3.22.0-GA 3.2.2 From 1c5e81fa34cb4876dcca0b8498bc6142d5cf9bee Mon Sep 17 00:00:00 2001 From: uzma Date: Thu, 30 Nov 2023 01:31:02 +0000 Subject: [PATCH 100/294] [BAEL-7073] code for executor service --- .../executorservice/ExecuteExample.java | 25 ++++++++++++++ .../executorservice/SubmitExample.java | 34 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/ExecuteExample.java create mode 100644 core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/SubmitExample.java diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/ExecuteExample.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/ExecuteExample.java new file mode 100644 index 0000000000..8331ff84fc --- /dev/null +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/ExecuteExample.java @@ -0,0 +1,25 @@ +package com.baeldung.concurrent.executorservice; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class ExecuteExample { + public static void main(String[] args) + { + ExecutorService executorService = Executors.newFixedThreadPool(2); + // Task using Runnable + Runnable task = () -> + { + int[] numbers = {1, 2, 3, 4, 5}; + int sum = 0; + for (int num : numbers) { + sum += num; + } + System.out.println("Sum calculated using execute:" + sum); + }; + // Submit the task using execute + executorService.execute(task); executorService.shutdown(); + + } + +} diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/SubmitExample.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/SubmitExample.java new file mode 100644 index 0000000000..93fa77be1d --- /dev/null +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/SubmitExample.java @@ -0,0 +1,34 @@ +package com.baeldung.concurrent.executorservice; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +public class SubmitExample { + public static void main(String[] args) + { + ExecutorService executorService = Executors.newFixedThreadPool(2); + Callable task = () -> + { + int[] numbers = {1, 2, 3, 4, 5}; + int sum = 0; + for (int num : numbers) { + sum += num; + } + return sum; + }; + // Submit the task and obtain a Future + Future result = executorService.submit(task); + try { + // Get the result + int sum = result.get(); + System.out.println("Sum calculated using submit:" + sum); + } catch (InterruptedException | ExecutionException e) + { + e.printStackTrace(); + } + executorService.shutdown(); + } +} \ No newline at end of file From 7683cff43d657d890fe8c10b3967f85f20ad0f5a Mon Sep 17 00:00:00 2001 From: gaepi Date: Thu, 30 Nov 2023 10:20:20 +0100 Subject: [PATCH 101/294] JAVA-26724 | kafka testcontainers version update --- apache-kafka-2/pom.xml | 2 +- apache-kafka/pom.xml | 2 +- spring-boot-modules/spring-boot-documentation/pom.xml | 2 +- spring-kafka-2/pom.xml | 2 +- spring-kafka/pom.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apache-kafka-2/pom.xml b/apache-kafka-2/pom.xml index d1f74e8aae..cd21a60e14 100644 --- a/apache-kafka-2/pom.xml +++ b/apache-kafka-2/pom.xml @@ -62,7 +62,7 @@ 5.7.0 2.8.0 - 1.15.3 + 1.19.3 1.15.3 2.15.2 diff --git a/apache-kafka/pom.xml b/apache-kafka/pom.xml index 494bc94961..22be7a83c6 100644 --- a/apache-kafka/pom.xml +++ b/apache-kafka/pom.xml @@ -182,7 +182,7 @@ 3.4.0 - 1.15.3 + 1.19.3 1.15.3 1.16.1 3.0.0 diff --git a/spring-boot-modules/spring-boot-documentation/pom.xml b/spring-boot-modules/spring-boot-documentation/pom.xml index 3ac2799258..30a82660af 100644 --- a/spring-boot-modules/spring-boot-documentation/pom.xml +++ b/spring-boot-modules/spring-boot-documentation/pom.xml @@ -95,7 +95,7 @@ 2.2.11 0.14.0 0.14.0 - 1.18.3 + 1.19.3 diff --git a/spring-kafka-2/pom.xml b/spring-kafka-2/pom.xml index fdf7da7438..05da9418b7 100644 --- a/spring-kafka-2/pom.xml +++ b/spring-kafka-2/pom.xml @@ -64,7 +64,7 @@ - 1.16.2 + 1.19.3 3.0.12 3.6.0 1.16.2 diff --git a/spring-kafka/pom.xml b/spring-kafka/pom.xml index 7ff7a9710a..ddef3ca180 100644 --- a/spring-kafka/pom.xml +++ b/spring-kafka/pom.xml @@ -92,7 +92,7 @@ 3.0.5 1.10.5 - 1.16.2 + 1.19.3 \ No newline at end of file From 57eaebe8d5e116cfc52c9b0c3b5b343db0eef202 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Thu, 30 Nov 2023 19:40:11 +0530 Subject: [PATCH 102/294] BAEL-7259: renamed package --- .../com/{baledung => baeldung}/harperdb/HarperDBApiService.java | 2 +- .../com/{baledung => baeldung}/harperdb/HarperDBContainer.java | 2 +- .../com/{baledung => baeldung}/harperdb/HarperDBLiveTest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename persistence-modules/java-harperdb/src/test/java/com/{baledung => baeldung}/harperdb/HarperDBApiService.java (99%) rename persistence-modules/java-harperdb/src/test/java/com/{baledung => baeldung}/harperdb/HarperDBContainer.java (97%) rename persistence-modules/java-harperdb/src/test/java/com/{baledung => baeldung}/harperdb/HarperDBLiveTest.java (99%) diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBApiService.java similarity index 99% rename from persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java rename to persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBApiService.java index 15178f9769..361e17bd83 100644 --- a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java +++ b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBApiService.java @@ -1,4 +1,4 @@ -package com.baledung.harperdb; +package com.baeldung.harperdb; import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.classic.methods.HttpPost; import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.CloseableHttpClient; diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBContainer.java similarity index 97% rename from persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java rename to persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBContainer.java index 5ce6e069ce..12ef87fa99 100644 --- a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java +++ b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBContainer.java @@ -1,4 +1,4 @@ -package com.baledung.harperdb; +package com.baeldung.harperdb; import java.util.Map; diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBLiveTest.java similarity index 99% rename from persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java rename to persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBLiveTest.java index 5908a57560..34d2f8d29b 100644 --- a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java +++ b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBLiveTest.java @@ -1,4 +1,4 @@ -package com.baledung.harperdb; +package com.baeldung.harperdb; import cdata.jdbc.harperdb.HarperDBConnectionPoolDataSource; From 35b88b06afae92c4271eabb5764771731f973c79 Mon Sep 17 00:00:00 2001 From: Maiklins Date: Thu, 30 Nov 2023 16:10:46 +0100 Subject: [PATCH 103/294] Update README.md --- core-java-modules/core-java-8-datetime-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-8-datetime-2/README.md b/core-java-modules/core-java-8-datetime-2/README.md index f7ada52da6..6fe450816e 100644 --- a/core-java-modules/core-java-8-datetime-2/README.md +++ b/core-java-modules/core-java-8-datetime-2/README.md @@ -8,4 +8,5 @@ - [Add Minutes to a Time String in Java](https://www.baeldung.com/java-string-time-add-mins) - [Round the Date in Java](https://www.baeldung.com/java-round-the-date) - [Representing Furthest Possible Date in Java](https://www.baeldung.com/java-date-represent-max) +- [Retrieving Unix Time in Java](https://www.baeldung.com/java-retrieve-unix-time) - [[<-- Prev]](/core-java-modules/core-java-datetime-java8-1) From 208ff083c847a1d495cde6e4b31222435dda38ff Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Thu, 30 Nov 2023 18:11:39 +0100 Subject: [PATCH 104/294] BAEL-7143: virtual threads vs webflux --- spring-reactive-modules/pom.xml | 1 + .../spring-reactive-performance/.gitignore | 25 ++++++ .../spring-reactive-performance/README.md | 3 + .../spring-reactive-performance/pom.xml | 77 +++++++++++++++++++ .../reactive/performance/Application.java | 13 ++++ .../reactive/performance/KafkaTemplate.java | 14 ++++ .../performance/ProductAddedToCartEvent.java | 6 ++ .../reactive/performance/model/Price.java | 9 +++ .../reactive/performance/model/Product.java | 43 +++++++++++ .../virtualthreads/DiscountService.java | 11 +++ .../virtualthreads/ProductRepository.java | 8 ++ .../virtualthreads/ProductService.java | 47 +++++++++++ .../performance/webflux/DiscountService.java | 11 +++ .../webflux/ProductRepository.java | 8 ++ .../performance/webflux/ProductService.java | 40 ++++++++++ .../src/main/resources/application.yml | 5 ++ .../src/main/resources/logback.xml | 13 ++++ .../performance/ApplicationUnitTest.java | 12 +++ .../performance}/AmqpReactiveController.java | 2 +- .../performance}/DestinationsConfig.java | 2 +- .../MessageListenerContainerFactory.java | 2 +- .../SpringWebfluxAmqpApplication.java | 2 +- .../SpringWebfluxAmqpLiveTest.java | 2 +- 23 files changed, 351 insertions(+), 5 deletions(-) create mode 100644 spring-reactive-modules/spring-reactive-performance/.gitignore create mode 100644 spring-reactive-modules/spring-reactive-performance/README.md create mode 100644 spring-reactive-modules/spring-reactive-performance/pom.xml create mode 100644 spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/Application.java create mode 100644 spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/KafkaTemplate.java create mode 100644 spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/ProductAddedToCartEvent.java create mode 100644 spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/model/Price.java create mode 100644 spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/model/Product.java create mode 100644 spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/DiscountService.java create mode 100644 spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/ProductRepository.java create mode 100644 spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/ProductService.java create mode 100644 spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/DiscountService.java create mode 100644 spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/ProductRepository.java create mode 100644 spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/ProductService.java create mode 100644 spring-reactive-modules/spring-reactive-performance/src/main/resources/application.yml create mode 100644 spring-reactive-modules/spring-reactive-performance/src/main/resources/logback.xml create mode 100644 spring-reactive-modules/spring-reactive-performance/src/test/java/com/baeldung/spring/reactive/performance/ApplicationUnitTest.java rename spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/{amqp => reactive/performance}/AmqpReactiveController.java (99%) rename spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/{amqp => reactive/performance}/DestinationsConfig.java (96%) rename spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/{amqp => reactive/performance}/MessageListenerContainerFactory.java (94%) rename spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/{amqp => reactive/performance}/SpringWebfluxAmqpApplication.java (95%) rename spring-reactive-modules/spring-webflux-amqp/src/test/java/com/baeldung/spring/{amqp => reactive/performance}/SpringWebfluxAmqpLiveTest.java (91%) diff --git a/spring-reactive-modules/pom.xml b/spring-reactive-modules/pom.xml index 61a3c3d17d..a16046ee48 100644 --- a/spring-reactive-modules/pom.xml +++ b/spring-reactive-modules/pom.xml @@ -28,6 +28,7 @@ spring-reactive-data-couchbase spring-reactive spring-reactive-exceptions + spring-reactor spring-webflux-amqp diff --git a/spring-reactive-modules/spring-reactive-performance/.gitignore b/spring-reactive-modules/spring-reactive-performance/.gitignore new file mode 100644 index 0000000000..82eca336e3 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-performance/.gitignore @@ -0,0 +1,25 @@ +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-performance/README.md b/spring-reactive-modules/spring-reactive-performance/README.md new file mode 100644 index 0000000000..16aac3d419 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-performance/README.md @@ -0,0 +1,3 @@ +## Spring Reactive Performance + +This module contains articles about reactive Spring Boot. diff --git a/spring-reactive-modules/spring-reactive-performance/pom.xml b/spring-reactive-modules/spring-reactive-performance/pom.xml new file mode 100644 index 0000000000..d7a69560dd --- /dev/null +++ b/spring-reactive-modules/spring-reactive-performance/pom.xml @@ -0,0 +1,77 @@ + + + 4.0.0 + com.baeldung.spring + spring-reactive-performance + 1.0.0-SNAPSHOT + spring-reactive-performance + jar + Spring Reactive Performance + + + com.baeldung.spring.reactive + spring-reactive-modules + 1.0.0-SNAPSHOT + + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + + + + org.springframework.boot + spring-boot-starter-webflux + + + + org.springframework.boot + spring-boot-starter-webflux + + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 21 + 21 + + false + + + + org.apache.maven.plugins + maven-surefire-plugin + + --enable-preview + + + + + + + 21 + 3.2.0 + + \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/Application.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/Application.java new file mode 100644 index 0000000000..284ddfce30 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/Application.java @@ -0,0 +1,13 @@ +package com.baeldung.spring.reactive.performance; + +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-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/KafkaTemplate.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/KafkaTemplate.java new file mode 100644 index 0000000000..cf8684690e --- /dev/null +++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/KafkaTemplate.java @@ -0,0 +1,14 @@ +package com.baeldung.spring.reactive.performance; + +import java.util.concurrent.CompletableFuture; + +public class KafkaTemplate { + + // For simplicity in this example and article, an actual Kafka client isn't utilized. + // The focus remains on demonstrating the basic principles without the complexities of a full Kafka client setup. + + public CompletableFuture send(String topic, K key, V value) { + System.out.println("Sending message to topic: " + topic + " with value: " + value); + return CompletableFuture.completedFuture(null); + } +} \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/ProductAddedToCartEvent.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/ProductAddedToCartEvent.java new file mode 100644 index 0000000000..08743d109c --- /dev/null +++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/ProductAddedToCartEvent.java @@ -0,0 +1,6 @@ +package com.baeldung.spring.reactive.performance; + +import java.math.BigDecimal; + +public record ProductAddedToCartEvent(String productId, BigDecimal price, String currency, String cartId) { +} \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/model/Price.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/model/Price.java new file mode 100644 index 0000000000..271ca26c96 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/model/Price.java @@ -0,0 +1,9 @@ +package com.baeldung.spring.reactive.performance.model; + +import java.math.BigDecimal; + +public record Price(BigDecimal value, String currency) { + public Price applyDiscount(BigDecimal discount) { + return new Price(value.subtract(discount), currency); + } +} \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/model/Product.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/model/Product.java new file mode 100644 index 0000000000..d4aa751089 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/model/Product.java @@ -0,0 +1,43 @@ +package com.baeldung.spring.reactive.performance.model; + +import java.math.BigDecimal; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document(collation = "products") +public record Product ( + @Id + String id, + String name, + BigDecimal basePriceValue, + String currency, + Category category +) { + + public Price basePrice() { + return new Price(basePriceValue, currency); + } + + public enum Category { + ELECTRONICS(false), + CLOTHING(true), + ACCESSORIES(false), + GARDENING(false), + SPORTS(true); + + private final boolean eligibleForPromotion; + + Category(boolean eligibleForPromotion) { + this.eligibleForPromotion = eligibleForPromotion; + } + + public boolean isEligibleForDiscount() { + return eligibleForPromotion; + } + + public boolean notEligibleForPromotion() { + return !eligibleForPromotion; + } + } +} \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/DiscountService.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/DiscountService.java new file mode 100644 index 0000000000..89554396b2 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/DiscountService.java @@ -0,0 +1,11 @@ +package com.baeldung.spring.reactive.performance.virtualthreads; + +import java.math.BigDecimal; + +class DiscountService { + + public BigDecimal discountForProduct(String productId) { + return BigDecimal.valueOf(10); + } + +} \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/ProductRepository.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/ProductRepository.java new file mode 100644 index 0000000000..f0ebff5cfd --- /dev/null +++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/ProductRepository.java @@ -0,0 +1,8 @@ +package com.baeldung.spring.reactive.performance.virtualthreads; + +import org.springframework.data.mongodb.repository.MongoRepository; + +import com.baeldung.spring.reactive.performance.model.Product; + +interface ProductRepository extends MongoRepository { +} \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/ProductService.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/ProductService.java new file mode 100644 index 0000000000..5395770d7e --- /dev/null +++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/ProductService.java @@ -0,0 +1,47 @@ +package com.baeldung.spring.reactive.performance.virtualthreads; + +import java.math.BigDecimal; + +import com.baeldung.spring.reactive.performance.KafkaTemplate; +import com.baeldung.spring.reactive.performance.ProductAddedToCartEvent; +import com.baeldung.spring.reactive.performance.model.Price; +import com.baeldung.spring.reactive.performance.model.Product; + +class ProductService { + private final String PRODUCT_ADDED_TO_CART_TOPIC = "product-added-to-cart"; + + private final ProductRepository repository; + private final DiscountService discountService; + private final KafkaTemplate kafkaTemplate; + + public ProductService(ProductRepository repository, DiscountService discountService) { + this.repository = repository; + this.discountService = discountService; + this.kafkaTemplate = new KafkaTemplate<>(); + } + + public void addProductToCart(String productId, String cartId) { + Thread.startVirtualThread(() -> computePriceAndPublishMessage(productId, cartId)); + } + + private void computePriceAndPublishMessage(String productId, String cartId) { + Product product = repository.findById(productId) + .orElseThrow(() -> new IllegalArgumentException("not found!")); + + Price price = computePrice(productId, product); + + var event = new ProductAddedToCartEvent(productId, price.value(), price.currency(), cartId); + kafkaTemplate.send(PRODUCT_ADDED_TO_CART_TOPIC, cartId, event); + } + + private Price computePrice(String productId, Product product) { + if (product.category() + .isEligibleForDiscount()) { + BigDecimal discount = discountService.discountForProduct(productId); + return product.basePrice() + .applyDiscount(discount); + } + return product.basePrice(); + } + +} \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/DiscountService.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/DiscountService.java new file mode 100644 index 0000000000..ebe6b9a8a4 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/DiscountService.java @@ -0,0 +1,11 @@ +package com.baeldung.spring.reactive.performance.webflux; + +import java.math.BigDecimal; + +import reactor.core.publisher.Mono; + +class DiscountService { + public Mono discountForProduct(String productId) { + return Mono.just(BigDecimal.valueOf(10)); + } +} \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/ProductRepository.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/ProductRepository.java new file mode 100644 index 0000000000..5ab4497a27 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/ProductRepository.java @@ -0,0 +1,8 @@ +package com.baeldung.spring.reactive.performance.webflux; + +import org.springframework.data.mongodb.repository.ReactiveMongoRepository; + +import com.baeldung.spring.reactive.performance.model.Product; + +interface ProductRepository extends ReactiveMongoRepository { +} \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/ProductService.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/ProductService.java new file mode 100644 index 0000000000..0e950b501e --- /dev/null +++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/ProductService.java @@ -0,0 +1,40 @@ +package com.baeldung.spring.reactive.performance.webflux; + +import com.baeldung.spring.reactive.performance.KafkaTemplate; +import com.baeldung.spring.reactive.performance.ProductAddedToCartEvent; +import com.baeldung.spring.reactive.performance.model.Price; +import com.baeldung.spring.reactive.performance.model.Product; + +import reactor.core.publisher.Mono; + +class ProductService { + private final String PRODUCT_ADDED_TO_CART_TOPIC = "product-added-to-cart"; + + private final ProductRepository repository; + private final DiscountService discountService; + private final KafkaTemplate kafkaTemplate; + + public ProductService(ProductRepository repository, DiscountService discountService) { + this.repository = repository; + this.discountService = discountService; + this.kafkaTemplate = new KafkaTemplate<>(); + } + + public void addProductToCart(String productId, String cartId) { + repository.findById(productId) + .switchIfEmpty(Mono.error(() -> new IllegalArgumentException("not found!"))) + .flatMap(this::computePrice) + .map(price -> new ProductAddedToCartEvent(productId, price.value(), price.currency(), cartId)) + .subscribe(event -> kafkaTemplate.send(PRODUCT_ADDED_TO_CART_TOPIC, cartId, event)); + } + + private Mono computePrice(Product product) { + if (product.category() + .isEligibleForDiscount()) { + return discountService.discountForProduct(product.id()) + .map(product.basePrice()::applyDiscount); + } + return Mono.just(product.basePrice()); + } + +} \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/resources/application.yml b/spring-reactive-modules/spring-reactive-performance/src/main/resources/application.yml new file mode 100644 index 0000000000..335ae17af1 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-performance/src/main/resources/application.yml @@ -0,0 +1,5 @@ + + + + + diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/resources/logback.xml b/spring-reactive-modules/spring-reactive-performance/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-performance/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-performance/src/test/java/com/baeldung/spring/reactive/performance/ApplicationUnitTest.java b/spring-reactive-modules/spring-reactive-performance/src/test/java/com/baeldung/spring/reactive/performance/ApplicationUnitTest.java new file mode 100644 index 0000000000..df69e7eb72 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-performance/src/test/java/com/baeldung/spring/reactive/performance/ApplicationUnitTest.java @@ -0,0 +1,12 @@ +package com.baeldung.spring.reactive.performance; + +import org.junit.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class ApplicationUnitTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } +} diff --git a/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/AmqpReactiveController.java b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/AmqpReactiveController.java similarity index 99% rename from spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/AmqpReactiveController.java rename to spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/AmqpReactiveController.java index b71c32bd05..6249c280d7 100644 --- a/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/AmqpReactiveController.java +++ b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/AmqpReactiveController.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.amqp; +package com.baeldung.spring.reactive.performance; import java.time.Duration; diff --git a/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/DestinationsConfig.java b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/DestinationsConfig.java similarity index 96% rename from spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/DestinationsConfig.java rename to spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/DestinationsConfig.java index 0f9a0d890f..2e830dba01 100644 --- a/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/DestinationsConfig.java +++ b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/DestinationsConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.amqp; +package com.baeldung.spring.reactive.performance; import java.util.HashMap; import java.util.Map; diff --git a/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/MessageListenerContainerFactory.java b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/MessageListenerContainerFactory.java similarity index 94% rename from spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/MessageListenerContainerFactory.java rename to spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/MessageListenerContainerFactory.java index d868e6afa8..b1735ab205 100644 --- a/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/MessageListenerContainerFactory.java +++ b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/MessageListenerContainerFactory.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.amqp; +package com.baeldung.spring.reactive.performance; import org.springframework.amqp.core.AcknowledgeMode; import org.springframework.amqp.rabbit.connection.ConnectionFactory; diff --git a/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/SpringWebfluxAmqpApplication.java b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/SpringWebfluxAmqpApplication.java similarity index 95% rename from spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/SpringWebfluxAmqpApplication.java rename to spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/SpringWebfluxAmqpApplication.java index d6a7a84d30..73747ccc43 100644 --- a/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/SpringWebfluxAmqpApplication.java +++ b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/SpringWebfluxAmqpApplication.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.amqp; +package com.baeldung.spring.reactive.performance; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-reactive-modules/spring-webflux-amqp/src/test/java/com/baeldung/spring/amqp/SpringWebfluxAmqpLiveTest.java b/spring-reactive-modules/spring-webflux-amqp/src/test/java/com/baeldung/spring/reactive/performance/SpringWebfluxAmqpLiveTest.java similarity index 91% rename from spring-reactive-modules/spring-webflux-amqp/src/test/java/com/baeldung/spring/amqp/SpringWebfluxAmqpLiveTest.java rename to spring-reactive-modules/spring-webflux-amqp/src/test/java/com/baeldung/spring/reactive/performance/SpringWebfluxAmqpLiveTest.java index 81782ce575..1222bb4569 100644 --- a/spring-reactive-modules/spring-webflux-amqp/src/test/java/com/baeldung/spring/amqp/SpringWebfluxAmqpLiveTest.java +++ b/spring-reactive-modules/spring-webflux-amqp/src/test/java/com/baeldung/spring/reactive/performance/SpringWebfluxAmqpLiveTest.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.amqp; +package com.baeldung.spring.reactive.performance; import org.junit.Test; import org.springframework.test.web.reactive.server.WebTestClient; From f86a8acd55c01076534d859d8b535ac2537c5d0f Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Thu, 30 Nov 2023 18:16:52 +0100 Subject: [PATCH 105/294] BAEL-7143: added comment for submodule --- spring-reactive-modules/pom.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spring-reactive-modules/pom.xml b/spring-reactive-modules/pom.xml index a16046ee48..1b30b0f062 100644 --- a/spring-reactive-modules/pom.xml +++ b/spring-reactive-modules/pom.xml @@ -28,9 +28,11 @@ spring-reactive-data-couchbase spring-reactive spring-reactive-exceptions - spring-reactor spring-webflux-amqp + + + From e076a171eef9c30d47716f3fa81bf4ad6414046a Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Thu, 30 Nov 2023 22:54:02 +0530 Subject: [PATCH 106/294] JAVA-26736 Upgrade jackson to latest version --- core-java-modules/core-java-11-3/pom.xml | 2 +- core-java-modules/core-java-collections-list-5/pom.xml | 2 +- core-java-modules/core-java-collections-maps-6/pom.xml | 2 +- core-java-modules/core-java-string-operations-3/pom.xml | 2 +- .../baeldung/versioncomparison/VersionComparisonUnitTest.java | 2 +- jackson-modules/jackson-polymorphic-deserialization/pom.xml | 4 ++-- jackson-simple/pom.xml | 2 +- persistence-modules/hibernate-mapping/pom.xml | 2 +- persistence-modules/spring-data-elasticsearch/pom.xml | 2 +- pom.xml | 2 +- spring-batch/pom.xml | 2 +- spring-boot-modules/spring-boot-resilience4j/pom.xml | 2 +- .../custom-validations-opeanpi-codegen/pom.xml | 2 +- testing-modules/mocks-2/pom.xml | 2 +- 14 files changed, 15 insertions(+), 15 deletions(-) diff --git a/core-java-modules/core-java-11-3/pom.xml b/core-java-modules/core-java-11-3/pom.xml index 22db9e62ab..0161f4dcca 100644 --- a/core-java-modules/core-java-11-3/pom.xml +++ b/core-java-modules/core-java-11-3/pom.xml @@ -45,7 +45,7 @@ 11 11 - 2.14.1 + 2.16.0 2.10 diff --git a/core-java-modules/core-java-collections-list-5/pom.xml b/core-java-modules/core-java-collections-list-5/pom.xml index b8832df357..c89ad0fad9 100644 --- a/core-java-modules/core-java-collections-list-5/pom.xml +++ b/core-java-modules/core-java-collections-list-5/pom.xml @@ -67,7 +67,7 @@ 1.21 2.2 2.10.1 - 2.15.2 + 2.16.0 20230618 \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps-6/pom.xml b/core-java-modules/core-java-collections-maps-6/pom.xml index 8c35dcee6e..fd28e9cc57 100644 --- a/core-java-modules/core-java-collections-maps-6/pom.xml +++ b/core-java-modules/core-java-collections-maps-6/pom.xml @@ -20,7 +20,7 @@ com.fasterxml.jackson.core jackson-databind - 2.13.1 + 2.16.0 org.openjdk.jmh diff --git a/core-java-modules/core-java-string-operations-3/pom.xml b/core-java-modules/core-java-string-operations-3/pom.xml index 0558e71a35..59d14805a0 100644 --- a/core-java-modules/core-java-string-operations-3/pom.xml +++ b/core-java-modules/core-java-string-operations-3/pom.xml @@ -72,7 +72,7 @@ 5.3.9 3.6.3 6.1.1 - 2.11.1 + 2.16.0 3.1.0 diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/versioncomparison/VersionComparisonUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/versioncomparison/VersionComparisonUnitTest.java index 145e9788e4..a99778201a 100644 --- a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/versioncomparison/VersionComparisonUnitTest.java +++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/versioncomparison/VersionComparisonUnitTest.java @@ -87,7 +87,7 @@ public class VersionComparisonUnitTest { assertTrue(version1_1_maven.compareTo(version1_1_gradle) < 0); Version version1_1_snapshot = new Version(1, 1, 0, "snapshot", null, null); - assertEquals(0, version1_1.compareTo(version1_1_snapshot)); + assertEquals(1, version1_1.compareTo(version1_1_snapshot)); assertTrue(version1_1_snapshot.isSnapshot()); } diff --git a/jackson-modules/jackson-polymorphic-deserialization/pom.xml b/jackson-modules/jackson-polymorphic-deserialization/pom.xml index 0d88c19500..cbf67e5013 100644 --- a/jackson-modules/jackson-polymorphic-deserialization/pom.xml +++ b/jackson-modules/jackson-polymorphic-deserialization/pom.xml @@ -16,7 +16,7 @@ com.fasterxml.jackson.core jackson-core - ${jackson-core.version} + ${jackson.version} org.reflections @@ -36,7 +36,7 @@ - 2.15.2 + 2.16.0 0.9.11 diff --git a/jackson-simple/pom.xml b/jackson-simple/pom.xml index 3bf523bbfa..2ba3868ee2 100644 --- a/jackson-simple/pom.xml +++ b/jackson-simple/pom.xml @@ -33,7 +33,7 @@ - 2.15.2 + 2.16.0 17 diff --git a/persistence-modules/hibernate-mapping/pom.xml b/persistence-modules/hibernate-mapping/pom.xml index 0ce112b9e6..45d8e24b41 100644 --- a/persistence-modules/hibernate-mapping/pom.xml +++ b/persistence-modules/hibernate-mapping/pom.xml @@ -86,7 +86,7 @@ 3.0.1-b11 1.1 1.4.2 - 2.14.2 + 2.16.0 \ No newline at end of file diff --git a/persistence-modules/spring-data-elasticsearch/pom.xml b/persistence-modules/spring-data-elasticsearch/pom.xml index 6535b9ac4b..91dc3ee4d2 100644 --- a/persistence-modules/spring-data-elasticsearch/pom.xml +++ b/persistence-modules/spring-data-elasticsearch/pom.xml @@ -60,7 +60,7 @@ 5.1.2 8.9.0 - 2.15.2 + 2.16.0 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 32b8e8c8c8..1c685bc5e3 100644 --- a/pom.xml +++ b/pom.xml @@ -1221,7 +1221,7 @@ 1.2 2.3.3 1.2 - 2.15.2 + 2.16.0 1.5 1.9.2 5.9.2 diff --git a/spring-batch/pom.xml b/spring-batch/pom.xml index 20b0ef6d1c..bca0030729 100644 --- a/spring-batch/pom.xml +++ b/spring-batch/pom.xml @@ -77,7 +77,7 @@ 5.8 4.0.0 4.0.2 - 2.14.2 + 2.16.0 4.5.14 1.5.3 com.baeldung.batchtesting.SpringBatchApplication diff --git a/spring-boot-modules/spring-boot-resilience4j/pom.xml b/spring-boot-modules/spring-boot-resilience4j/pom.xml index 355ef8f92d..2f3af8f9d2 100644 --- a/spring-boot-modules/spring-boot-resilience4j/pom.xml +++ b/spring-boot-modules/spring-boot-resilience4j/pom.xml @@ -53,7 +53,7 @@ 2.35.0 2.0.2 - 2.15.2 + 2.16.0 \ No newline at end of file diff --git a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml index 95d3239b96..ded02da62c 100644 --- a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml +++ b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml @@ -88,7 +88,7 @@ 2.17.1 1.7.0 3.3.4 - 2.10.0.pr3 + 2.16.0 5.1.0 diff --git a/testing-modules/mocks-2/pom.xml b/testing-modules/mocks-2/pom.xml index 22a5198b8c..2ef1a03dff 100644 --- a/testing-modules/mocks-2/pom.xml +++ b/testing-modules/mocks-2/pom.xml @@ -33,7 +33,7 @@ 1.6.0 - 2.13.4 + 2.16.0 5.3.25 From 339b269caa64a5647d10f66b98815698968ba20f Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Thu, 30 Nov 2023 18:35:21 +0000 Subject: [PATCH 107/294] Update article httpsecurity vs websecurity --- .../WebSecurityConfig.java | 87 ++++++++++++++----- .../controller/AdminController.java | 15 ++++ 2 files changed, 80 insertions(+), 22 deletions(-) create mode 100644 spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/controller/AdminController.java diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java index 46a82918aa..f5b799065b 100644 --- a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java @@ -1,35 +1,78 @@ package com.baeldung.httpsecurityvswebsecurity; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.firewall.HttpFirewall; +import org.springframework.security.web.firewall.StrictHttpFirewall; + +import java.util.ArrayList; +import java.util.List; + +import static org.springframework.security.config.Customizer.withDefaults; @Configuration -public class WebSecurityConfig extends WebSecurityConfigurerAdapter { +@EnableWebSecurity +public class WebSecurityConfig { - @Autowired - private UserDetailsService userDetailsService; - - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth - .userDetailsService(userDetailsService) - .passwordEncoder(new BCryptPasswordEncoder()); + @Bean + public HttpFirewall allowHttpMethod() { + List allowedMethods = new ArrayList(); + allowedMethods.add("GET"); + allowedMethods.add("POST"); + StrictHttpFirewall firewall = new StrictHttpFirewall(); + firewall.setAllowedHttpMethods(allowedMethods); + return firewall; } - @Override - protected void configure(HttpSecurity http) throws Exception { - http.authorizeRequests() - .antMatchers("/") - .permitAll() + @Bean + public WebSecurityCustomizer fireWall() { + return (web) -> web.httpFirewall(allowHttpMethod()); + } + + @Bean + public WebSecurityCustomizer ignoringCustomizer() { + return (web) -> web.ignoring().antMatchers("/resources/**", "/static/**"); + } + + @Bean + public WebSecurityCustomizer debugSecurity() { + return (web) -> web.debug(true); + } + + @Bean + public InMemoryUserDetailsManager userDetailsService() { + UserDetails user = User.withUsername("user") + .password(encoder().encode("userPass")) + .roles("ADMIN") + .build(); + return new InMemoryUserDetailsManager(user); + } + + @Bean + public PasswordEncoder encoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http.authorizeHttpRequests((authorize) -> authorize.antMatchers("/admin/**") + .hasRole("ADMIN") .anyRequest() - .authenticated() - .and() - .formLogin(); + .permitAll()) + .httpBasic(withDefaults()) + .formLogin(withDefaults()) + .csrf(AbstractHttpConfigurer::disable); + return http.build(); } + } diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/controller/AdminController.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/controller/AdminController.java new file mode 100644 index 0000000000..cd1daee17e --- /dev/null +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/controller/AdminController.java @@ -0,0 +1,15 @@ +package com.baeldung.httpsecurityvswebsecurity.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/admin") +public class AdminController { + + @RequestMapping("/greeting") + public String hello() { + return "Hello Admin"; + } + +} From dea22a68632b94ee4dfe45c64ec631fd350fdba2 Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Thu, 30 Nov 2023 18:42:41 +0000 Subject: [PATCH 108/294] Update article httpsecurity vs websecurity --- .../SecurityConfiguration.java | 78 +++++++++++++++++ .../WebSecurityConfig.java | 87 +++++-------------- 2 files changed, 100 insertions(+), 65 deletions(-) create mode 100644 spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/SecurityConfiguration.java diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/SecurityConfiguration.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/SecurityConfiguration.java new file mode 100644 index 0000000000..5c0853e6f3 --- /dev/null +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/SecurityConfiguration.java @@ -0,0 +1,78 @@ +package com.baeldung.httpsecurityvswebsecurity; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.firewall.HttpFirewall; +import org.springframework.security.web.firewall.StrictHttpFirewall; + +import java.util.ArrayList; +import java.util.List; + +import static org.springframework.security.config.Customizer.withDefaults; + +@Configuration +@EnableWebSecurity +public class SecurityConfiguration { + + @Bean + public HttpFirewall allowHttpMethod() { + List allowedMethods = new ArrayList(); + allowedMethods.add("GET"); + allowedMethods.add("POST"); + StrictHttpFirewall firewall = new StrictHttpFirewall(); + firewall.setAllowedHttpMethods(allowedMethods); + return firewall; + } + + @Bean + public WebSecurityCustomizer fireWall() { + return (web) -> web.httpFirewall(allowHttpMethod()); + } + + @Bean + public WebSecurityCustomizer ignoringCustomizer() { + return (web) -> web.ignoring().antMatchers("/resources/**", "/static/**"); + } + + @Bean + public WebSecurityCustomizer debugSecurity() { + return (web) -> web.debug(true); + } + + @Bean + public InMemoryUserDetailsManager userDetailsService() { + UserDetails user = User.withUsername("user") + .password(encoder().encode("userPass")) + .roles("ADMIN") + .build(); + return new InMemoryUserDetailsManager(user); + } + + @Bean + public PasswordEncoder encoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http.authorizeHttpRequests((authorize) -> authorize.antMatchers("/admin/**") + .hasRole("ADMIN") + .anyRequest() + .permitAll()) + .httpBasic(withDefaults()) + .formLogin(withDefaults()) + .csrf(AbstractHttpConfigurer::disable); + return http.build(); + } + +} diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java index f5b799065b..46a82918aa 100644 --- a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java @@ -1,78 +1,35 @@ package com.baeldung.httpsecurityvswebsecurity; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; -import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; -import org.springframework.security.core.userdetails.User; -import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.firewall.HttpFirewall; -import org.springframework.security.web.firewall.StrictHttpFirewall; - -import java.util.ArrayList; -import java.util.List; - -import static org.springframework.security.config.Customizer.withDefaults; @Configuration -@EnableWebSecurity -public class WebSecurityConfig { +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - @Bean - public HttpFirewall allowHttpMethod() { - List allowedMethods = new ArrayList(); - allowedMethods.add("GET"); - allowedMethods.add("POST"); - StrictHttpFirewall firewall = new StrictHttpFirewall(); - firewall.setAllowedHttpMethods(allowedMethods); - return firewall; + @Autowired + private UserDetailsService userDetailsService; + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth + .userDetailsService(userDetailsService) + .passwordEncoder(new BCryptPasswordEncoder()); } - @Bean - public WebSecurityCustomizer fireWall() { - return (web) -> web.httpFirewall(allowHttpMethod()); - } - - @Bean - public WebSecurityCustomizer ignoringCustomizer() { - return (web) -> web.ignoring().antMatchers("/resources/**", "/static/**"); - } - - @Bean - public WebSecurityCustomizer debugSecurity() { - return (web) -> web.debug(true); - } - - @Bean - public InMemoryUserDetailsManager userDetailsService() { - UserDetails user = User.withUsername("user") - .password(encoder().encode("userPass")) - .roles("ADMIN") - .build(); - return new InMemoryUserDetailsManager(user); - } - - @Bean - public PasswordEncoder encoder() { - return new BCryptPasswordEncoder(); - } - - @Bean - public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - http.authorizeHttpRequests((authorize) -> authorize.antMatchers("/admin/**") - .hasRole("ADMIN") + @Override + protected void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers("/") + .permitAll() .anyRequest() - .permitAll()) - .httpBasic(withDefaults()) - .formLogin(withDefaults()) - .csrf(AbstractHttpConfigurer::disable); - return http.build(); + .authenticated() + .and() + .formLogin(); } - } From 920dc80c41f5376e2d583ce8732584f70bc88cba Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Thu, 30 Nov 2023 21:12:51 +0100 Subject: [PATCH 109/294] BAEL-7143: renamed package --- .../{reactive/performance => amqp}/AmqpReactiveController.java | 2 +- .../{reactive/performance => amqp}/DestinationsConfig.java | 2 +- .../performance => amqp}/MessageListenerContainerFactory.java | 2 +- .../performance => amqp}/SpringWebfluxAmqpApplication.java | 2 +- .../performance => amqp}/SpringWebfluxAmqpLiveTest.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/{reactive/performance => amqp}/AmqpReactiveController.java (99%) rename spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/{reactive/performance => amqp}/DestinationsConfig.java (96%) rename spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/{reactive/performance => amqp}/MessageListenerContainerFactory.java (94%) rename spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/{reactive/performance => amqp}/SpringWebfluxAmqpApplication.java (95%) rename spring-reactive-modules/spring-webflux-amqp/src/test/java/com/baeldung/spring/{reactive/performance => amqp}/SpringWebfluxAmqpLiveTest.java (91%) diff --git a/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/AmqpReactiveController.java b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/AmqpReactiveController.java similarity index 99% rename from spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/AmqpReactiveController.java rename to spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/AmqpReactiveController.java index 6249c280d7..b71c32bd05 100644 --- a/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/AmqpReactiveController.java +++ b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/AmqpReactiveController.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.reactive.performance; +package com.baeldung.spring.amqp; import java.time.Duration; diff --git a/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/DestinationsConfig.java b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/DestinationsConfig.java similarity index 96% rename from spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/DestinationsConfig.java rename to spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/DestinationsConfig.java index 2e830dba01..0f9a0d890f 100644 --- a/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/DestinationsConfig.java +++ b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/DestinationsConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.reactive.performance; +package com.baeldung.spring.amqp; import java.util.HashMap; import java.util.Map; diff --git a/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/MessageListenerContainerFactory.java b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/MessageListenerContainerFactory.java similarity index 94% rename from spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/MessageListenerContainerFactory.java rename to spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/MessageListenerContainerFactory.java index b1735ab205..d868e6afa8 100644 --- a/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/MessageListenerContainerFactory.java +++ b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/MessageListenerContainerFactory.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.reactive.performance; +package com.baeldung.spring.amqp; import org.springframework.amqp.core.AcknowledgeMode; import org.springframework.amqp.rabbit.connection.ConnectionFactory; diff --git a/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/SpringWebfluxAmqpApplication.java b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/SpringWebfluxAmqpApplication.java similarity index 95% rename from spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/SpringWebfluxAmqpApplication.java rename to spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/SpringWebfluxAmqpApplication.java index 73747ccc43..d6a7a84d30 100644 --- a/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/reactive/performance/SpringWebfluxAmqpApplication.java +++ b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/SpringWebfluxAmqpApplication.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.reactive.performance; +package com.baeldung.spring.amqp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-reactive-modules/spring-webflux-amqp/src/test/java/com/baeldung/spring/reactive/performance/SpringWebfluxAmqpLiveTest.java b/spring-reactive-modules/spring-webflux-amqp/src/test/java/com/baeldung/spring/amqp/SpringWebfluxAmqpLiveTest.java similarity index 91% rename from spring-reactive-modules/spring-webflux-amqp/src/test/java/com/baeldung/spring/reactive/performance/SpringWebfluxAmqpLiveTest.java rename to spring-reactive-modules/spring-webflux-amqp/src/test/java/com/baeldung/spring/amqp/SpringWebfluxAmqpLiveTest.java index 1222bb4569..81782ce575 100644 --- a/spring-reactive-modules/spring-webflux-amqp/src/test/java/com/baeldung/spring/reactive/performance/SpringWebfluxAmqpLiveTest.java +++ b/spring-reactive-modules/spring-webflux-amqp/src/test/java/com/baeldung/spring/amqp/SpringWebfluxAmqpLiveTest.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.reactive.performance; +package com.baeldung.spring.amqp; import org.junit.Test; import org.springframework.test.web.reactive.server.WebTestClient; From a2ca867a5874152ef03e5829f438f56ae7fa402c Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Thu, 30 Nov 2023 21:22:36 +0100 Subject: [PATCH 110/294] BAEL-7143: fixed formatting --- .../performance/virtualthreads/ProductService.java | 8 +++----- .../performance/webflux/ProductService.java | 13 ++++++------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/ProductService.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/ProductService.java index 5395770d7e..f174e4c6fe 100644 --- a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/ProductService.java +++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/virtualthreads/ProductService.java @@ -26,7 +26,7 @@ class ProductService { private void computePriceAndPublishMessage(String productId, String cartId) { Product product = repository.findById(productId) - .orElseThrow(() -> new IllegalArgumentException("not found!")); + .orElseThrow(() -> new IllegalArgumentException("not found!")); Price price = computePrice(productId, product); @@ -35,11 +35,9 @@ class ProductService { } private Price computePrice(String productId, Product product) { - if (product.category() - .isEligibleForDiscount()) { + if (product.category().isEligibleForDiscount()) { BigDecimal discount = discountService.discountForProduct(productId); - return product.basePrice() - .applyDiscount(discount); + return product.basePrice().applyDiscount(discount); } return product.basePrice(); } diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/ProductService.java b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/ProductService.java index 0e950b501e..90519ec627 100644 --- a/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/ProductService.java +++ b/spring-reactive-modules/spring-reactive-performance/src/main/java/com/baeldung/spring/reactive/performance/webflux/ProductService.java @@ -22,17 +22,16 @@ class ProductService { public void addProductToCart(String productId, String cartId) { repository.findById(productId) - .switchIfEmpty(Mono.error(() -> new IllegalArgumentException("not found!"))) - .flatMap(this::computePrice) - .map(price -> new ProductAddedToCartEvent(productId, price.value(), price.currency(), cartId)) - .subscribe(event -> kafkaTemplate.send(PRODUCT_ADDED_TO_CART_TOPIC, cartId, event)); + .switchIfEmpty(Mono.error(() -> new IllegalArgumentException("not found!"))) + .flatMap(this::computePrice) + .map(price -> new ProductAddedToCartEvent(productId, price.value(), price.currency(), cartId)) + .subscribe(event -> kafkaTemplate.send(PRODUCT_ADDED_TO_CART_TOPIC, cartId, event)); } private Mono computePrice(Product product) { - if (product.category() - .isEligibleForDiscount()) { + if (product.category().isEligibleForDiscount()) { return discountService.discountForProduct(product.id()) - .map(product.basePrice()::applyDiscount); + .map(product.basePrice()::applyDiscount); } return Mono.just(product.basePrice()); } From d7bb6bc0a77ae8e4645ee5a582d61a560ad42ded Mon Sep 17 00:00:00 2001 From: MohamedHelmyKassab <137485958+MohamedHelmyKassab@users.noreply.github.com> Date: Fri, 1 Dec 2023 02:59:17 +0200 Subject: [PATCH 111/294] This commit is related to BAEL-7113 (#15331) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds a new test class "RoundNumberToNearestMultipleUnitTest" that suggests multiplе mеthods for rounding up a numbеr to thе nеarеst multiplе of 5 in Java. --- .../RoundNumberToNearestMultipleUnitTest.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/roundnumbertonearestmultiple/RoundNumberToNearestMultipleUnitTest.java diff --git a/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/roundnumbertonearestmultiple/RoundNumberToNearestMultipleUnitTest.java b/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/roundnumbertonearestmultiple/RoundNumberToNearestMultipleUnitTest.java new file mode 100644 index 0000000000..24090be343 --- /dev/null +++ b/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/roundnumbertonearestmultiple/RoundNumberToNearestMultipleUnitTest.java @@ -0,0 +1,41 @@ +package com.baeldung.roundnumbertonearestmultiple; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class RoundNumberToNearestMultipleUnitTest { + + public static int originalNumber = 18; + public static int expectedRoundedNumber = 20; + public static int nearest = 5; + + @Test + public void givenNumber_whenUsingBasicMathOperations_thenRoundUpToNearestMultipleOf5() { + + int roundedNumber = (originalNumber % nearest == 0) ? originalNumber : ((originalNumber / nearest) + 1) * nearest; + assertEquals(expectedRoundedNumber, roundedNumber); + } + + @Test + public void givenNumber_whenUsingMathCeil_thenRoundUpToNearestMultipleOf5() { + + int roundedNumber = (int) (Math.ceil(originalNumber / (float) (nearest)) * nearest); + assertEquals(expectedRoundedNumber, roundedNumber); + } + + @Test + public void givenNumber_whenUsingMathRound_thenRoundUpToNearestMultipleOf5() { + + int roundedNumber = Math.round(originalNumber / (float) (nearest)) * nearest; + assertEquals(expectedRoundedNumber, roundedNumber); + } + + @Test + public void givenNumber_whenUsingMathFloor_thenRoundUpToNearestMultipleOf5() { + + int roundedNumber = (int) (Math.floor((double) (originalNumber + nearest / 2) / nearest) * nearest); + assertEquals(expectedRoundedNumber, roundedNumber); + } + +} From 671957da9b04903a6985460cc36f6b9555b1156f Mon Sep 17 00:00:00 2001 From: Mo Helmy <135069400+BenHelmyBen@users.noreply.github.com> Date: Fri, 1 Dec 2023 03:02:46 +0200 Subject: [PATCH 112/294] This PR is related to BAEL-6315 (#15337) * This commit is related to BAEL-6315 This commit aims to add two classes Contact and Person. * This commit is related to BAEL-6315 This commit aims to add a test class DeserializationUnitTest. --- .../com/baeldung/deserialization/Contact.java | 5 +++ .../com/baeldung/deserialization/Person.java | 5 +++ .../DeserializationUnitTest.java | 39 +++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Contact.java create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Person.java create mode 100644 core-java-modules/core-java-20/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Contact.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Contact.java new file mode 100644 index 0000000000..80df1393af --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Contact.java @@ -0,0 +1,5 @@ +package com.baeldung.deserialization; + +public record Contact(String email, String phone) { + // Constructor, getters, and other methods are automatically generated +} diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Person.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Person.java new file mode 100644 index 0000000000..38e3882668 --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Person.java @@ -0,0 +1,5 @@ +package com.baeldung.deserialization; + +public record Person(String name, int age, String address, Contact contact) { + // Constructor, getters, and other methods are automatically generated +} \ No newline at end of file diff --git a/core-java-modules/core-java-20/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java b/core-java-modules/core-java-20/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java new file mode 100644 index 0000000000..1256505e0d --- /dev/null +++ b/core-java-modules/core-java-20/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.deserialization; + +import com.google.gson.Gson; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class DeserializationUnitTest { + + @Test + public void givenJsonString_whenDeserialized_thenPersonRecordCreated() { + String json = "{\"name\":\"John Doe\",\"age\":30,\"address\":\"123 Main St\"}"; + + Person person = new Gson().fromJson(json, Person.class); + + assertEquals("John Doe", person.name()); + assertEquals(30, person.age()); + assertEquals("123 Main St", person.address()); + } + + @Test + public void givenNestedJsonString_whenDeserialized_thenPersonRecordCreated() { + String json = "{\"name\":\"John Doe\",\"age\":30,\"address\":\"123 Main St\",\"contact\":{\"email\":\"john.doe@example.com\",\"phone\":\"555-1234\"}}"; + + Person person = new Gson().fromJson(json, Person.class); + + assertNotNull(person); + assertEquals("John Doe", person.name()); + assertEquals(30, person.age()); + assertEquals("123 Main St", person.address()); + + Contact contact = person.contact(); + + assertNotNull(contact); + assertEquals("john.doe@example.com", contact.email()); + assertEquals("555-1234", contact.phone()); + } +} From 1f7efeddaf524f0d178214c55ef35e2265e509e6 Mon Sep 17 00:00:00 2001 From: Mikhail Polivakha <68962645+Mikhail2048@users.noreply.github.com> Date: Fri, 1 Dec 2023 04:07:18 +0300 Subject: [PATCH 113/294] BAEL-6953 implemented (#15304) * BAEL-6953 implemented * BAEL-6953 added live test * Fixed test --- .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 62076 bytes pom.xml | 1 + spring-kafka-3/pom.xml | 36 +++++++++++ .../com/baeldung/spring/kafka/SomeData.java | 37 ++++++++++++ .../spring/kafka/ListenerConfiguration.java | 42 +++++++++++++ .../spring/kafka/ProducerConfiguration.java | 40 ++++++++++++ .../spring/kafka/TrustedPackagesLiveTest.java | 57 ++++++++++++++++++ 7 files changed, 213 insertions(+) create mode 100644 gradle-modules/gradle-7/toolchains-feature/gradle/wrapper/gradle-wrapper.jar create mode 100644 spring-kafka-3/pom.xml create mode 100644 spring-kafka-3/src/main/java/com/baeldung/spring/kafka/SomeData.java create mode 100644 spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ListenerConfiguration.java create mode 100644 spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ProducerConfiguration.java create mode 100644 spring-kafka-3/src/test/java/com/baeldung/spring/kafka/TrustedPackagesLiveTest.java diff --git a/gradle-modules/gradle-7/toolchains-feature/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle-7/toolchains-feature/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..c1962a79e29d3e0ab67b14947c167a862655af9b GIT binary patch literal 62076 zcmb5VV{~QRw)Y#`wrv{~+qP{x72B%VwzFc}c2cp;N~)5ZbDrJayPv(!dGEd-##*zr z)#n-$y^sH|_dchh3@8{H5D*j;5D<{i*8l5IFJ|DjL!e)upfGNX(kojugZ3I`oH1PvW`wFW_ske0j@lB9bX zO;2)`y+|!@X(fZ1<2n!Qx*)_^Ai@Cv-dF&(vnudG?0CsddG_&Wtae(n|K59ew)6St z#dj7_(Cfwzh$H$5M!$UDd8=4>IQsD3xV=lXUq($;(h*$0^yd+b{qq63f0r_de#!o_ zXDngc>zy`uor)4A^2M#U*DC~i+dc<)Tb1Tv&~Ev@oM)5iJ4Sn#8iRw16XXuV50BS7 zdBL5Mefch(&^{luE{*5qtCZk$oFr3RH=H!c3wGR=HJ(yKc_re_X9pD` zJ;uxPzUfVpgU>DSq?J;I@a+10l0ONXPcDkiYcihREt5~T5Gb}sT0+6Q;AWHl`S5dV>lv%-p9l#xNNy7ZCr%cyqHY%TZ8Q4 zbp&#ov1*$#grNG#1vgfFOLJCaNG@K|2!W&HSh@3@Y%T?3YI75bJp!VP*$*!< z;(ffNS_;@RJ`=c7yX04!u3JP*<8jeqLHVJu#WV&v6wA!OYJS4h<_}^QI&97-;=ojW zQ-1t)7wnxG*5I%U4)9$wlv5Fr;cIizft@&N+32O%B{R1POm$oap@&f| zh+5J{>U6ftv|vAeKGc|zC=kO(+l7_cLpV}-D#oUltScw})N>~JOZLU_0{Ka2e1evz z{^a*ZrLr+JUj;)K&u2CoCAXLC2=fVScI(m_p~0FmF>>&3DHziouln?;sxW`NB}cSX z8?IsJB)Z=aYRz!X=yJn$kyOWK%rCYf-YarNqKzmWu$ZvkP12b4qH zhS9Q>j<}(*frr?z<%9hl*i^#@*O2q(Z^CN)c2c z>1B~D;@YpG?G!Yk+*yn4vM4sO-_!&m6+`k|3zd;8DJnxsBYtI;W3We+FN@|tQ5EW= z!VU>jtim0Mw#iaT8t_<+qKIEB-WwE04lBd%Letbml9N!?SLrEG$nmn7&W(W`VB@5S zaY=sEw2}i@F_1P4OtEw?xj4@D6>_e=m=797#hg}f*l^`AB|Y0# z9=)o|%TZFCY$SzgSjS|8AI-%J4x}J)!IMxY3_KYze`_I=c1nmrk@E8c9?MVRu)7+Ue79|)rBX7tVB7U|w4*h(;Gi3D9le49B38`wuv zp7{4X^p+K4*$@gU(Tq3K1a#3SmYhvI42)GzG4f|u zwQFT1n_=n|jpi=70-yE9LA+d*T8u z`=VmmXJ_f6WmZveZPct$Cgu^~gFiyL>Lnpj*6ee>*0pz=t$IJ}+rE zsf@>jlcG%Wx;Cp5x)YSVvB1$yyY1l&o zvwX=D7k)Dn;ciX?Z)Pn8$flC8#m`nB&(8?RSdBvr?>T9?E$U3uIX7T?$v4dWCa46 z+&`ot8ZTEgp7G+c52oHJ8nw5}a^dwb_l%MOh(ebVj9>_koQP^$2B~eUfSbw9RY$_< z&DDWf2LW;b0ZDOaZ&2^i^g+5uTd;GwO(-bbo|P^;CNL-%?9mRmxEw~5&z=X^Rvbo^WJW=n_%*7974RY}JhFv46> zd}`2|qkd;89l}R;i~9T)V-Q%K)O=yfVKNM4Gbacc7AOd>#^&W&)Xx!Uy5!BHnp9kh z`a(7MO6+Ren#>R^D0K)1sE{Bv>}s6Rb9MT14u!(NpZOe-?4V=>qZ>}uS)!y~;jEUK z&!U7Fj&{WdgU#L0%bM}SYXRtM5z!6M+kgaMKt%3FkjWYh=#QUpt$XX1!*XkpSq-pl zhMe{muh#knk{9_V3%qdDcWDv}v)m4t9 zQhv{;} zc{}#V^N3H>9mFM8`i`0p+fN@GqX+kl|M94$BK3J-X`Hyj8r!#x6Vt(PXjn?N)qedP z=o1T^#?1^a{;bZ&x`U{f?}TMo8ToN zkHj5v|}r}wDEi7I@)Gj+S1aE-GdnLN+$hw!=DzglMaj#{qjXi_dwpr|HL(gcCXwGLEmi|{4&4#OZ4ChceA zKVd4K!D>_N=_X;{poT~4Q+!Le+ZV>=H7v1*l%w`|`Dx8{)McN@NDlQyln&N3@bFpV z_1w~O4EH3fF@IzJ9kDk@7@QctFq8FbkbaH7K$iX=bV~o#gfh?2JD6lZf(XP>~DACF)fGFt)X%-h1yY~MJU{nA5 ze2zxWMs{YdX3q5XU*9hOH0!_S24DOBA5usB+Ws$6{|AMe*joJ?RxfV}*7AKN9V*~J zK+OMcE@bTD>TG1*yc?*qGqjBN8mgg@h1cJLDv)0!WRPIkC` zZrWXrceVw;fB%3`6kq=a!pq|hFIsQ%ZSlo~)D z|64!aCnw-?>}AG|*iOl44KVf8@|joXi&|)1rB;EQWgm+iHfVbgllP$f!$Wf42%NO5b(j9Bw6L z;0dpUUK$5GX4QbMlTmLM_jJt!ur`_0~$b#BB7FL*%XFf<b__1o)Ao3rlobbN8-(T!1d-bR8D3S0@d zLI!*GMb5s~Q<&sjd}lBb8Nr0>PqE6_!3!2d(KAWFxa{hm`@u|a(%#i(#f8{BP2wbs zt+N_slWF4IF_O|{w`c~)Xvh&R{Au~CFmW#0+}MBd2~X}t9lz6*E7uAD`@EBDe$>7W zzPUkJx<`f$0VA$=>R57^(K^h86>09?>_@M(R4q($!Ck6GG@pnu-x*exAx1jOv|>KH zjNfG5pwm`E-=ydcb+3BJwuU;V&OS=6yM^4Jq{%AVqnTTLwV`AorIDD}T&jWr8pB&j28fVtk_y*JRP^t@l*($UZ z6(B^-PBNZ+z!p?+e8@$&jCv^EWLb$WO=}Scr$6SM*&~B95El~;W_0(Bvoha|uQ1T< zO$%_oLAwf1bW*rKWmlD+@CP&$ObiDy=nh1b2ejz%LO9937N{LDe7gle4i!{}I$;&Y zkexJ9Ybr+lrCmKWg&}p=`2&Gf10orS?4$VrzWidT=*6{KzOGMo?KI0>GL0{iFWc;C z+LPq%VH5g}6V@-tg2m{C!-$fapJ9y}c$U}aUmS{9#0CM*8pC|sfer!)nG7Ji>mfRh z+~6CxNb>6eWKMHBz-w2{mLLwdA7dA-qfTu^A2yG1+9s5k zcF=le_UPYG&q!t5Zd_*E_P3Cf5T6821bO`daa`;DODm8Ih8k89=RN;-asHIigj`n=ux>*f!OC5#;X5i;Q z+V!GUy0|&Y_*8k_QRUA8$lHP;GJ3UUD08P|ALknng|YY13)}!!HW@0z$q+kCH%xet zlWf@BXQ=b=4}QO5eNnN~CzWBbHGUivG=`&eWK}beuV*;?zt=P#pM*eTuy3 zP}c#}AXJ0OIaqXji78l;YrP4sQe#^pOqwZUiiN6^0RCd#D271XCbEKpk`HI0IsN^s zES7YtU#7=8gTn#lkrc~6)R9u&SX6*Jk4GFX7){E)WE?pT8a-%6P+zS6o&A#ml{$WX zABFz#i7`DDlo{34)oo?bOa4Z_lNH>n;f0nbt$JfAl~;4QY@}NH!X|A$KgMmEsd^&Y zt;pi=>AID7ROQfr;MsMtClr5b0)xo|fwhc=qk33wQ|}$@?{}qXcmECh>#kUQ-If0$ zseb{Wf4VFGLNc*Rax#P8ko*=`MwaR-DQ8L8V8r=2N{Gaips2_^cS|oC$+yScRo*uF zUO|5=?Q?{p$inDpx*t#Xyo6=s?bbN}y>NNVxj9NZCdtwRI70jxvm3!5R7yiWjREEd zDUjrsZhS|P&|Ng5r+f^kA6BNN#|Se}_GF>P6sy^e8kBrgMv3#vk%m}9PCwUWJg-AD zFnZ=}lbi*mN-AOm zCs)r=*YQAA!`e#1N>aHF=bb*z*hXH#Wl$z^o}x##ZrUc=kh%OHWhp=7;?8%Xj||@V?1c ziWoaC$^&04;A|T)!Zd9sUzE&$ODyJaBpvqsw19Uiuq{i#VK1!htkdRWBnb z`{rat=nHArT%^R>u#CjjCkw-7%g53|&7z-;X+ewb?OLWiV|#nuc8mp*LuGSi3IP<<*Wyo9GKV7l0Noa4Jr0g3p_$ z*R9{qn=?IXC#WU>48-k5V2Oc_>P;4_)J@bo1|pf=%Rcbgk=5m)CJZ`caHBTm3%!Z9 z_?7LHr_BXbKKr=JD!%?KhwdYSdu8XxPoA{n8^%_lh5cjRHuCY9Zlpz8g+$f@bw@0V z+6DRMT9c|>1^3D|$Vzc(C?M~iZurGH2pXPT%F!JSaAMdO%!5o0uc&iqHx?ImcX6fI zCApkzc~OOnfzAd_+-DcMp&AOQxE_EsMqKM{%dRMI5`5CT&%mQO?-@F6tE*xL?aEGZ z8^wH@wRl`Izx4sDmU>}Ym{ybUm@F83qqZPD6nFm?t?(7>h*?`fw)L3t*l%*iw0Qu#?$5eq!Qc zpQvqgSxrd83NsdO@lL6#{%lsYXWen~d3p4fGBb7&5xqNYJ)yn84!e1PmPo7ChVd%4 zHUsV0Mh?VpzZD=A6%)Qrd~i7 z96*RPbid;BN{Wh?adeD_p8YU``kOrGkNox3D9~!K?w>#kFz!4lzOWR}puS(DmfjJD z`x0z|qB33*^0mZdM&6$|+T>fq>M%yoy(BEjuh9L0>{P&XJ3enGpoQRx`v6$txXt#c z0#N?b5%srj(4xmPvJxrlF3H%OMB!jvfy z;wx8RzU~lb?h_}@V=bh6p8PSb-dG|-T#A?`c&H2`_!u+uenIZe`6f~A7r)`9m8atC zt(b|6Eg#!Q*DfRU=Ix`#B_dK)nnJ_+>Q<1d7W)eynaVn`FNuN~%B;uO2}vXr5^zi2 z!ifIF5@Zlo0^h~8+ixFBGqtweFc`C~JkSq}&*a3C}L?b5Mh-bW=e)({F_g4O3 zb@SFTK3VD9QuFgFnK4Ve_pXc3{S$=+Z;;4+;*{H}Rc;845rP?DLK6G5Y-xdUKkA6E3Dz&5f{F^FjJQ(NSpZ8q-_!L3LL@H* zxbDF{gd^U3uD;)a)sJwAVi}7@%pRM&?5IaUH%+m{E)DlA_$IA1=&jr{KrhD5q&lTC zAa3c)A(K!{#nOvenH6XrR-y>*4M#DpTTOGQEO5Jr6kni9pDW`rvY*fs|ItV;CVITh z=`rxcH2nEJpkQ^(;1c^hfb8vGN;{{oR=qNyKtR1;J>CByul*+=`NydWnSWJR#I2lN zTvgnR|MBx*XFsfdA&;tr^dYaqRZp*2NwkAZE6kV@1f{76e56eUmGrZ>MDId)oqSWw z7d&r3qfazg+W2?bT}F)4jD6sWaw`_fXZGY&wnGm$FRPFL$HzVTH^MYBHWGCOk-89y zA+n+Q6EVSSCpgC~%uHfvyg@ufE^#u?JH?<73A}jj5iILz4Qqk5$+^U(SX(-qv5agK znUkfpke(KDn~dU0>gdKqjTkVk`0`9^0n_wzXO7R!0Thd@S;U`y)VVP&mOd-2 z(hT(|$=>4FY;CBY9#_lB$;|Wd$aOMT5O_3}DYXEHn&Jrc3`2JiB`b6X@EUOD zVl0S{ijm65@n^19T3l%>*;F(?3r3s?zY{thc4%AD30CeL_4{8x6&cN}zN3fE+x<9; zt2j1RRVy5j22-8U8a6$pyT+<`f+x2l$fd_{qEp_bfxfzu>ORJsXaJn4>U6oNJ#|~p z`*ZC&NPXl&=vq2{Ne79AkQncuxvbOG+28*2wU$R=GOmns3W@HE%^r)Fu%Utj=r9t` zd;SVOnA(=MXgnOzI2@3SGKHz8HN~Vpx&!Ea+Df~`*n@8O=0!b4m?7cE^K*~@fqv9q zF*uk#1@6Re_<^9eElgJD!nTA@K9C732tV~;B`hzZ321Ph=^BH?zXddiu{Du5*IPg} zqDM=QxjT!Rp|#Bkp$(mL)aar)f(dOAXUiw81pX0DC|Y4;>Vz>>DMshoips^8Frdv} zlTD=cKa48M>dR<>(YlLPOW%rokJZNF2gp8fwc8b2sN+i6&-pHr?$rj|uFgktK@jg~ zIFS(%=r|QJ=$kvm_~@n=ai1lA{7Z}i+zj&yzY+!t$iGUy|9jH#&oTNJ;JW-3n>DF+ z3aCOzqn|$X-Olu_p7brzn`uk1F*N4@=b=m;S_C?#hy{&NE#3HkATrg?enaVGT^$qIjvgc61y!T$9<1B@?_ibtDZ{G zeXInVr5?OD_nS_O|CK3|RzzMmu+8!#Zb8Ik;rkIAR%6?$pN@d<0dKD2c@k2quB%s( zQL^<_EM6ow8F6^wJN1QcPOm|ehA+dP(!>IX=Euz5qqIq}Y3;ibQtJnkDmZ8c8=Cf3 zu`mJ!Q6wI7EblC5RvP*@)j?}W=WxwCvF3*5Up_`3*a~z$`wHwCy)2risye=1mSp%p zu+tD6NAK3o@)4VBsM!@);qgsjgB$kkCZhaimHg&+k69~drbvRTacWKH;YCK(!rC?8 zP#cK5JPHSw;V;{Yji=55X~S+)%(8fuz}O>*F3)hR;STU`z6T1aM#Wd+FP(M5*@T1P z^06O;I20Sk!bxW<-O;E081KRdHZrtsGJflFRRFS zdi5w9OVDGSL3 zNrC7GVsGN=b;YH9jp8Z2$^!K@h=r-xV(aEH@#JicPy;A0k1>g1g^XeR`YV2HfmqXY zYbRwaxHvf}OlCAwHoVI&QBLr5R|THf?nAevV-=~V8;gCsX>jndvNOcFA+DI+zbh~# zZ7`qNk&w+_+Yp!}j;OYxIfx_{f0-ONc?mHCiCUak=>j>~>YR4#w# zuKz~UhT!L~GfW^CPqG8Lg)&Rc6y^{%3H7iLa%^l}cw_8UuG;8nn9)kbPGXS}p3!L_ zd#9~5CrH8xtUd?{d2y^PJg+z(xIfRU;`}^=OlehGN2=?}9yH$4Rag}*+AWotyxfCJ zHx=r7ZH>j2kV?%7WTtp+-HMa0)_*DBBmC{sd$)np&GEJ__kEd`xB5a2A z*J+yx>4o#ZxwA{;NjhU*1KT~=ZK~GAA;KZHDyBNTaWQ1+;tOFFthnD)DrCn`DjBZ% zk$N5B4^$`n^jNSOr=t(zi8TN4fpaccsb`zOPD~iY=UEK$0Y70bG{idLx@IL)7^(pL z{??Bnu=lDeguDrd%qW1)H)H`9otsOL-f4bSu};o9OXybo6J!Lek`a4ff>*O)BDT_g z<6@SrI|C9klY(>_PfA^qai7A_)VNE4c^ZjFcE$Isp>`e5fLc)rg@8Q_d^Uk24$2bn z9#}6kZ2ZxS9sI(RqT7?El2@B+($>eBQrNi_k#CDJ8D9}8$mmm z4oSKO^F$i+NG)-HE$O6s1--6EzJa?C{x=QgK&c=)b(Q9OVoAXYEEH20G|q$}Hue%~ zO3B^bF=t7t48sN zWh_zA`w~|){-!^g?6Mqf6ieV zFx~aPUOJGR=4{KsW7I?<=J2|lY`NTU=lt=%JE9H1vBpkcn=uq(q~=?iBt_-r(PLBM zP-0dxljJO>4Wq-;stY)CLB4q`-r*T$!K2o}?E-w_i>3_aEbA^MB7P5piwt1dI-6o!qWCy0 ztYy!x9arGTS?kabkkyv*yxvsPQ7Vx)twkS6z2T@kZ|kb8yjm+^$|sEBmvACeqbz)RmxkkDQX-A*K!YFziuhwb|ym>C$}U|J)4y z$(z#)GH%uV6{ec%Zy~AhK|+GtG8u@c884Nq%w`O^wv2#A(&xH@c5M`Vjk*SR_tJnq z0trB#aY)!EKW_}{#L3lph5ow=@|D5LzJYUFD6 z7XnUeo_V0DVSIKMFD_T0AqAO|#VFDc7c?c-Q%#u00F%!_TW1@JVnsfvm@_9HKWflBOUD~)RL``-!P;(bCON_4eVdduMO>?IrQ__*zE@7(OX zUtfH@AX*53&xJW*Pu9zcqxGiM>xol0I~QL5B%Toog3Jlenc^WbVgeBvV8C8AX^Vj& z^I}H})B=VboO%q1;aU5ACMh{yK4J;xlMc`jCnZR^!~LDs_MP&8;dd@4LDWw~*>#OT zeZHwdQWS!tt5MJQI~cw|Ka^b4c|qyd_ly(+Ql2m&AAw^ zQeSXDOOH!!mAgzAp0z)DD>6Xo``b6QwzUV@w%h}Yo>)a|xRi$jGuHQhJVA%>)PUvK zBQ!l0hq<3VZ*RnrDODP)>&iS^wf64C;MGqDvx>|p;35%6(u+IHoNbK z;Gb;TneFo*`zUKS6kwF*&b!U8e5m4YAo03a_e^!5BP42+r)LFhEy?_7U1IR<; z^0v|DhCYMSj<-;MtY%R@Fg;9Kky^pz_t2nJfKWfh5Eu@_l{^ph%1z{jkg5jQrkvD< z#vdK!nku*RrH~TdN~`wDs;d>XY1PH?O<4^U4lmA|wUW{Crrv#r%N>7k#{Gc44Fr|t z@UZP}Y-TrAmnEZ39A*@6;ccsR>)$A)S>$-Cj!=x$rz7IvjHIPM(TB+JFf{ehuIvY$ zsDAwREg*%|=>Hw$`us~RP&3{QJg%}RjJKS^mC_!U;E5u>`X`jW$}P`Mf}?7G7FX#{ zE(9u1SO;3q@ZhDL9O({-RD+SqqPX)`0l5IQu4q)49TUTkxR(czeT}4`WV~pV*KY&i zAl3~X%D2cPVD^B43*~&f%+Op)wl<&|D{;=SZwImydWL6@_RJjxP2g)s=dH)u9Npki zs~z9A+3fj0l?yu4N0^4aC5x)Osnm0qrhz@?nwG_`h(71P znbIewljU%T*cC=~NJy|)#hT+lx#^5MuDDnkaMb*Efw9eThXo|*WOQzJ*#3dmRWm@! zfuSc@#kY{Um^gBc^_Xdxnl!n&y&}R4yAbK&RMc+P^Ti;YIUh|C+K1|=Z^{nZ}}rxH*v{xR!i%qO~o zTr`WDE@k$M9o0r4YUFFeQO7xCu_Zgy)==;fCJ94M_rLAv&~NhfvcLWCoaGg2ao~3e zBG?Ms9B+efMkp}7BhmISGWmJsKI@a8b}4lLI48oWKY|8?zuuNc$lt5Npr+p7a#sWu zh!@2nnLBVJK!$S~>r2-pN||^w|fY`CT{TFnJy`B|e5;=+_v4l8O-fkN&UQbA4NKTyntd zqK{xEKh}U{NHoQUf!M=2(&w+eef77VtYr;xs%^cPfKLObyOV_9q<(%76-J%vR>w9!us-0c-~Y?_EVS%v!* z15s2s3eTs$Osz$JayyH|5nPAIPEX=U;r&p;K14G<1)bvn@?bM5kC{am|C5%hyxv}a z(DeSKI5ZfZ1*%dl8frIX2?);R^^~LuDOpNpk-2R8U1w92HmG1m&|j&J{EK=|p$;f9 z7Rs5|jr4r8k5El&qcuM+YRlKny%t+1CgqEWO>3;BSRZi(LA3U%Jm{@{y+A+w(gzA< z7dBq6a1sEWa4cD0W7=Ld9z0H7RI^Z7vl(bfA;72j?SWCo`#5mVC$l1Q2--%V)-uN* z9ha*s-AdfbDZ8R8*fpwjzx=WvOtmSzGFjC#X)hD%Caeo^OWjS(3h|d9_*U)l%{Ab8 zfv$yoP{OuUl@$(-sEVNt{*=qi5P=lpxWVuz2?I7Dc%BRc+NGNw+323^ z5BXGfS71oP^%apUo(Y#xkxE)y?>BFzEBZ}UBbr~R4$%b7h3iZu3S(|A;&HqBR{nK& z$;GApNnz=kNO^FL&nYcfpB7Qg;hGJPsCW44CbkG1@l9pn0`~oKy5S777uH)l{irK!ru|X+;4&0D;VE*Ii|<3P zUx#xUqvZT5kVQxsF#~MwKnv7;1pR^0;PW@$@T7I?s`_rD1EGUdSA5Q(C<>5SzE!vw z;{L&kKFM-MO>hy#-8z`sdVx})^(Dc-dw;k-h*9O2_YZw}|9^y-|8RQ`BWJUJL(Cer zP5Z@fNc>pTXABbTRY-B5*MphpZv6#i802giwV&SkFCR zGMETyUm(KJbh+&$8X*RB#+{surjr;8^REEt`2&Dubw3$mx>|~B5IKZJ`s_6fw zKAZx9&PwBqW1Oz0r0A4GtnZd7XTKViX2%kPfv+^X3|_}RrQ2e3l=KG_VyY`H?I5&CS+lAX5HbA%TD9u6&s#v!G> zzW9n4J%d5ye7x0y`*{KZvqyXUfMEE^ZIffzI=Hh|3J}^yx7eL=s+TPH(Q2GT-sJ~3 zI463C{(ag7-hS1ETtU;_&+49ABt5!A7CwLwe z=SoA8mYZIQeU;9txI=zcQVbuO%q@E)JI+6Q!3lMc=Gbj(ASg-{V27u>z2e8n;Nc*pf}AqKz1D>p9G#QA+7mqqrEjGfw+85Uyh!=tTFTv3|O z+)-kFe_8FF_EkTw!YzwK^Hi^_dV5x-Ob*UWmD-})qKj9@aE8g240nUh=g|j28^?v7 zHRTBo{0KGaWBbyX2+lx$wgXW{3aUab6Bhm1G1{jTC7ota*JM6t+qy)c5<@ zpc&(jVdTJf(q3xB=JotgF$X>cxh7k*(T`-V~AR+`%e?YOeALQ2Qud( zz35YizXt(aW3qndR}fTw1p()Ol4t!D1pitGNL95{SX4ywzh0SF;=!wf=?Q?_h6!f* zh7<+GFi)q|XBsvXZ^qVCY$LUa{5?!CgwY?EG;*)0ceFe&=A;!~o`ae}Z+6me#^sv- z1F6=WNd6>M(~ z+092z>?Clrcp)lYNQl9jN-JF6n&Y0mp7|I0dpPx+4*RRK+VQI~>en0Dc;Zfl+x z_e_b7s`t1_A`RP3$H}y7F9_na%D7EM+**G_Z0l_nwE+&d_kc35n$Fxkd4r=ltRZhh zr9zER8>j(EdV&Jgh(+i}ltESBK62m0nGH6tCBr90!4)-`HeBmz54p~QP#dsu%nb~W z7sS|(Iydi>C@6ZM(Us!jyIiszMkd)^u<1D+R@~O>HqZIW&kearPWmT>63%_t2B{_G zX{&a(gOYJx!Hq=!T$RZ&<8LDnxsmx9+TBL0gTk$|vz9O5GkK_Yx+55^R=2g!K}NJ3 zW?C;XQCHZl7H`K5^BF!Q5X2^Mj93&0l_O3Ea3!Ave|ixx+~bS@Iv18v2ctpSt4zO{ zp#7pj!AtDmti$T`e9{s^jf(ku&E|83JIJO5Qo9weT6g?@vX!{7)cNwymo1+u(YQ94 zopuz-L@|5=h8A!(g-MXgLJC0MA|CgQF8qlonnu#j z;uCeq9ny9QSD|p)9sp3ebgY3rk#y0DA(SHdh$DUm^?GI<>%e1?&}w(b zdip1;P2Z=1wM+$q=TgLP$}svd!vk+BZ@h<^4R=GS2+sri7Z*2f`9 z5_?i)xj?m#pSVchk-SR!2&uNhzEi+#5t1Z$o0PoLGz*pT64%+|Wa+rd5Z}60(j?X= z{NLjtgRb|W?CUADqOS@(*MA-l|E342NxRaxLTDqsOyfWWe%N(jjBh}G zm7WPel6jXijaTiNita+z(5GCO0NM=Melxud57PP^d_U## zbA;9iVi<@wr0DGB8=T9Ab#2K_#zi=$igyK48@;V|W`fg~7;+!q8)aCOo{HA@vpSy-4`^!ze6-~8|QE||hC{ICKllG9fbg_Y7v z$jn{00!ob3!@~-Z%!rSZ0JO#@>|3k10mLK0JRKP-Cc8UYFu>z93=Ab-r^oL2 zl`-&VBh#=-?{l1TatC;VweM^=M7-DUE>m+xO7Xi6vTEsReyLs8KJ+2GZ&rxw$d4IT zPXy6pu^4#e;;ZTsgmG+ZPx>piodegkx2n0}SM77+Y*j^~ICvp#2wj^BuqRY*&cjmL zcKp78aZt>e{3YBb4!J_2|K~A`lN=u&5j!byw`1itV(+Q_?RvV7&Z5XS1HF)L2v6ji z&kOEPmv+k_lSXb{$)of~(BkO^py&7oOzpjdG>vI1kcm_oPFHy38%D4&A4h_CSo#lX z2#oqMCTEP7UvUR3mwkPxbl8AMW(e{ARi@HCYLPSHE^L<1I}OgZD{I#YH#GKnpRmW3 z2jkz~Sa(D)f?V?$gNi?6)Y;Sm{&?~2p=0&BUl_(@hYeX8YjaRO=IqO7neK0RsSNdYjD zaw$g2sG(>JR=8Iz1SK4`*kqd_3-?;_BIcaaMd^}<@MYbYisWZm2C2|Np_l|8r9yM|JkUngSo@?wci(7&O9a z%|V(4C1c9pps0xxzPbXH=}QTxc2rr7fXk$9`a6TbWKPCz&p=VsB8^W96W=BsB|7bc zf(QR8&Ktj*iz)wK&mW`#V%4XTM&jWNnDF56O+2bo<3|NyUhQ%#OZE8$Uv2a@J>D%t zMVMiHh?es!Ex19q&6eC&L=XDU_BA&uR^^w>fpz2_`U87q_?N2y;!Z!bjoeKrzfC)} z?m^PM=(z{%n9K`p|7Bz$LuC7!>tFOuN74MFELm}OD9?%jpT>38J;=1Y-VWtZAscaI z_8jUZ#GwWz{JqvGEUmL?G#l5E=*m>`cY?m*XOc*yOCNtpuIGD+Z|kn4Xww=BLrNYS zGO=wQh}Gtr|7DGXLF%|`G>J~l{k^*{;S-Zhq|&HO7rC_r;o`gTB7)uMZ|WWIn@e0( zX$MccUMv3ABg^$%_lNrgU{EVi8O^UyGHPNRt%R!1#MQJn41aD|_93NsBQhP80yP<9 zG4(&0u7AtJJXLPcqzjv`S~5;Q|5TVGccN=Uzm}K{v)?f7W!230C<``9(64}D2raRU zAW5bp%}VEo{4Rko`bD%Ehf=0voW?-4Mk#d3_pXTF!-TyIt6U+({6OXWVAa;s-`Ta5 zTqx&8msH3+DLrVmQOTBOAj=uoxKYT3DS1^zBXM?1W+7gI!aQNPYfUl{3;PzS9*F7g zWJN8x?KjBDx^V&6iCY8o_gslO16=kh(|Gp)kz8qlQ`dzxQv;)V&t+B}wwdi~uBs4? zu~G|}y!`3;8#vIMUdyC7YEx6bb^1o}G!Jky4cN?BV9ejBfN<&!4M)L&lRKiuMS#3} z_B}Nkv+zzxhy{dYCW$oGC&J(Ty&7%=5B$sD0bkuPmj7g>|962`(Q{ZZMDv%YMuT^KweiRDvYTEop3IgFv#)(w>1 zSzH>J`q!LK)c(AK>&Ib)A{g`Fdykxqd`Yq@yB}E{gnQV$K!}RsgMGWqC3DKE(=!{}ekB3+(1?g}xF>^icEJbc z5bdxAPkW90atZT+&*7qoLqL#p=>t-(-lsnl2XMpZcYeW|o|a322&)yO_8p(&Sw{|b zn(tY$xn5yS$DD)UYS%sP?c|z>1dp!QUD)l;aW#`%qMtQJjE!s2z`+bTSZmLK7SvCR z=@I4|U^sCwZLQSfd*ACw9B@`1c1|&i^W_OD(570SDLK`MD0wTiR8|$7+%{cF&){$G zU~|$^Ed?TIxyw{1$e|D$050n8AjJvvOWhLtLHbSB|HIfjMp+gu>DraHZJRrdO53(= z+o-f{+qNog+qSLB%KY;5>Av6X(>-qYk3IIEwZ5~6a+P9lMpC^ z8CJ0q>rEpjlsxCvJm=kms@tlN4+sv}He`xkr`S}bGih4t`+#VEIt{1veE z{ZLtb_pSbcfcYPf4=T1+|BtR!x5|X#x2TZEEkUB6kslKAE;x)*0x~ES0kl4Dex4e- zT2P~|lT^vUnMp{7e4OExfxak0EE$Hcw;D$ehTV4a6hqxru0$|Mo``>*a5=1Ym0u>BDJKO|=TEWJ5jZu!W}t$Kv{1!q`4Sn7 zrxRQOt>^6}Iz@%gA3&=5r;Lp=N@WKW;>O!eGIj#J;&>+3va^~GXRHCY2}*g#9ULab zitCJt-OV0*D_Q3Q`p1_+GbPxRtV_T`jyATjax<;zZ?;S+VD}a(aN7j?4<~>BkHK7bO8_Vqfdq1#W&p~2H z&w-gJB4?;Q&pG9%8P(oOGZ#`!m>qAeE)SeL*t8KL|1oe;#+uOK6w&PqSDhw^9-&Fa zuEzbi!!7|YhlWhqmiUm!muO(F8-F7|r#5lU8d0+=;<`{$mS=AnAo4Zb^{%p}*gZL! zeE!#-zg0FWsSnablw!9$<&K(#z!XOW z;*BVx2_+H#`1b@>RtY@=KqD)63brP+`Cm$L1@ArAddNS1oP8UE$p05R=bvZoYz+^6 z<)!v7pRvi!u_-V?!d}XWQR1~0q(H3{d^4JGa=W#^Z<@TvI6J*lk!A zZ*UIKj*hyO#5akL*Bx6iPKvR3_2-^2mw|Rh-3O_SGN3V9GRo52Q;JnW{iTGqb9W99 z7_+F(Op6>~3P-?Q8LTZ-lwB}xh*@J2Ni5HhUI3`ct|*W#pqb>8i*TXOLn~GlYECIj zhLaa_rBH|1jgi(S%~31Xm{NB!30*mcsF_wgOY2N0XjG_`kFB+uQuJbBm3bIM$qhUyE&$_u$gb zpK_r{99svp3N3p4yHHS=#csK@j9ql*>j0X=+cD2dj<^Wiu@i>c_v zK|ovi7}@4sVB#bzq$n3`EgI?~xDmkCW=2&^tD5RuaSNHf@Y!5C(Is$hd6cuyoK|;d zO}w2AqJPS`Zq+(mc*^%6qe>1d&(n&~()6-ZATASNPsJ|XnxelLkz8r1x@c2XS)R*H(_B=IN>JeQUR;T=i3<^~;$<+8W*eRKWGt7c#>N`@;#!`kZ!P!&{9J1>_g8Zj zXEXxmA=^{8A|3=Au+LfxIWra)4p<}1LYd_$1KI0r3o~s1N(x#QYgvL4#2{z8`=mXy zQD#iJ0itk1d@Iy*DtXw)Wz!H@G2St?QZFz zVPkM%H8Cd2EZS?teQN*Ecnu|PrC!a7F_XX}AzfZl3fXfhBtc2-)zaC2eKx*{XdM~QUo4IwcGgVdW69 z1UrSAqqMALf^2|(I}hgo38l|Ur=-SC*^Bo5ej`hb;C$@3%NFxx5{cxXUMnTyaX{>~ zjL~xm;*`d08bG_K3-E+TI>#oqIN2=An(C6aJ*MrKlxj?-;G zICL$hi>`F%{xd%V{$NhisHSL~R>f!F7AWR&7b~TgLu6!3s#~8|VKIX)KtqTH5aZ8j zY?wY)XH~1_a3&>#j7N}0az+HZ;is;Zw(Am{MX}YhDTe(t{ZZ;TG}2qWYO+hdX}vp9 z@uIRR8g#y~-^E`Qyem(31{H0&V?GLdq9LEOb2(ea#e-$_`5Q{T%E?W(6 z(XbX*Ck%TQM;9V2LL}*Tf`yzai{0@pYMwBu%(I@wTY!;kMrzcfq0w?X`+y@0ah510 zQX5SU(I!*Fag4U6a7Lw%LL;L*PQ}2v2WwYF(lHx_Uz2ceI$mnZ7*eZ?RFO8UvKI0H z9Pq-mB`mEqn6n_W9(s~Jt_D~j!Ln9HA)P;owD-l~9FYszs)oEKShF9Zzcmnb8kZ7% zQ`>}ki1kwUO3j~ zEmh140sOkA9v>j@#56ymn_RnSF`p@9cO1XkQy6_Kog?0ivZDb`QWOX@tjMd@^Qr(p z!sFN=A)QZm!sTh(#q%O{Ovl{IxkF!&+A)w2@50=?a-+VuZt6On1;d4YtUDW{YNDN_ zG@_jZi1IlW8cck{uHg^g=H58lPQ^HwnybWy@@8iw%G! zwB9qVGt_?~M*nFAKd|{cGg+8`+w{j_^;nD>IrPf-S%YjBslSEDxgKH{5p)3LNr!lD z4ii)^%d&cCXIU7UK?^ZQwmD(RCd=?OxmY(Ko#+#CsTLT;p#A%{;t5YpHFWgl+@)N1 zZ5VDyB;+TN+g@u~{UrWrv)&#u~k$S&GeW)G{M#&Di)LdYk?{($Cq zZGMKeYW)aMtjmKgvF0Tg>Mmkf9IB#2tYmH-s%D_9y3{tfFmX1BSMtbe<(yqAyWX60 zzkgSgKb3c{QPG2MalYp`7mIrYg|Y<4Jk?XvJK)?|Ecr+)oNf}XLPuTZK%W>;<|r+% zTNViRI|{sf1v7CsWHvFrkQ$F7+FbqPQ#Bj7XX=#M(a~9^80}~l-DueX#;b}Ajn3VE z{BWI}$q{XcQ3g{(p>IOzFcAMDG0xL)H%wA)<(gl3I-oVhK~u_m=hAr&oeo|4lZbf} z+pe)c34Am<=z@5!2;_lwya;l?xV5&kWe}*5uBvckm(d|7R>&(iJNa6Y05SvlZcWBlE{{%2- z`86)Y5?H!**?{QbzGG~|k2O%eA8q=gxx-3}&Csf6<9BsiXC)T;x4YmbBIkNf;0Nd5 z%whM^!K+9zH>on_<&>Ws?^v-EyNE)}4g$Fk?Z#748e+GFp)QrQQETx@u6(1fk2!(W zWiCF~MomG*y4@Zk;h#2H8S@&@xwBIs|82R*^K(i*0MTE%Rz4rgO&$R zo9Neb;}_ulaCcdn3i17MO3NxzyJ=l;LU*N9ztBJ30j=+?6>N4{9YXg$m=^9@Cl9VY zbo^{yS@gU=)EpQ#;UIQBpf&zfCA;00H-ee=1+TRw@(h%W=)7WYSb5a%$UqNS@oI@= zDrq|+Y9e&SmZrH^iA>Of8(9~Cf-G(P^5Xb%dDgMMIl8gk6zdyh`D3OGNVV4P9X|EvIhplXDld8d z^YWtYUz@tpg*38Xys2?zj$F8%ivA47cGSl;hjD23#*62w3+fwxNE7M7zVK?x_`dBSgPK zWY_~wF~OEZi9|~CSH8}Xi>#8G73!QLCAh58W+KMJJC81{60?&~BM_0t-u|VsPBxn* zW7viEKwBBTsn_A{g@1!wnJ8@&h&d>!qAe+j_$$Vk;OJq`hrjzEE8Wjtm)Z>h=*M25 zOgETOM9-8xuuZ&^@rLObtcz>%iWe%!uGV09nUZ*nxJAY%&KAYGY}U1WChFik7HIw% zZP$3Bx|TG_`~19XV7kfi2GaBEhKap&)Q<9`aPs#^!kMjtPb|+-fX66z3^E)iwyXK7 z8)_p<)O{|i&!qxtgBvWXx8*69WO$5zACl++1qa;)0zlXf`eKWl!0zV&I`8?sG)OD2Vy?reNN<{eK+_ za4M;Hh%&IszR%)&gpgRCP}yheQ+l#AS-GnY81M!kzhWxIR?PW`G3G?} z$d%J28uQIuK@QxzGMKU_;r8P0+oIjM+k)&lZ39i#(ntY)*B$fdJnQ3Hw3Lsi8z&V+ zZly2}(Uzpt2aOubRjttzqrvinBFH4jrN)f0hy)tj4__UTwN)#1fj3-&dC_Vh7}ri* zfJ=oqLMJ-_<#rwVyN}_a-rFBe2>U;;1(7UKH!$L??zTbbzP#bvyg7OQBGQklJ~DgP zd<1?RJ<}8lWwSL)`jM53iG+}y2`_yUvC!JkMpbZyb&50V3sR~u+lok zT0uFRS-yx@8q4fPRZ%KIpLp8R#;2%c&Ra4p(GWRT4)qLaPNxa&?8!LRVdOUZ)2vrh zBSx&kB%#Y4!+>~)<&c>D$O}!$o{<1AB$M7-^`h!eW;c(3J~ztoOgy6Ek8Pwu5Y`Xion zFl9fb!k2`3uHPAbd(D^IZmwR5d8D$495nN2`Ue&`W;M-nlb8T-OVKt|fHk zBpjX$a(IR6*-swdNk@#}G?k6F-~c{AE0EWoZ?H|ZpkBxqU<0NUtvubJtwJ1mHV%9v?GdDw; zAyXZiD}f0Zdt-cl9(P1la+vQ$Er0~v}gYJVwQazv zH#+Z%2CIfOf90fNMGos|{zf&N`c0@x0N`tkFv|_9af3~<0z@mnf*e;%r*Fbuwl-IW z{}B3=(mJ#iwLIPiUP`J3SoP~#)6v;aRXJ)A-pD2?_2_CZ#}SAZ<#v7&Vk6{*i(~|5 z9v^nC`T6o`CN*n%&9+bopj^r|E(|pul;|q6m7Tx+U|UMjWK8o-lBSgc3ZF=rP{|l9 zc&R$4+-UG6i}c==!;I#8aDIbAvgLuB66CQLRoTMu~jdw`fPlKy@AKYWS-xyZzPg&JRAa@m-H43*+ne!8B7)HkQY4 zIh}NL4Q79a-`x;I_^>s$Z4J4-Ngq=XNWQ>yAUCoe&SMAYowP>r_O}S=V+3=3&(O=h zNJDYNs*R3Y{WLmBHc?mFEeA4`0Y`_CN%?8qbDvG2m}kMAiqCv`_BK z_6a@n`$#w6Csr@e2YsMx8udNWtNt=kcqDZdWZ-lGA$?1PA*f4?X*)hjn{sSo8!bHz zb&lGdAgBx@iTNPK#T_wy`KvOIZvTWqSHb=gWUCKXAiB5ckQI`1KkPx{{%1R*F2)Oc z(9p@yG{fRSWE*M9cdbrO^)8vQ2U`H6M>V$gK*rz!&f%@3t*d-r3mSW>D;wYxOhUul zk~~&ip5B$mZ~-F1orsq<|1bc3Zpw6)Ws5;4)HilsN;1tx;N6)tuePw& z==OlmaN*ybM&-V`yt|;vDz(_+UZ0m&&9#{9O|?0I|4j1YCMW;fXm}YT$0%EZ5^YEI z4i9WV*JBmEU{qz5O{#bs`R1wU%W$qKx?bC|e-iS&d*Qm7S=l~bMT{~m3iZl+PIXq{ zn-c~|l)*|NWLM%ysfTV-oR0AJ3O>=uB-vpld{V|cWFhI~sx>ciV9sPkC*3i0Gg_9G!=4ar*-W?D9)?EFL1=;O+W8}WGdp8TT!Fgv z{HKD`W>t(`Cds_qliEzuE!r{ihwEv1l5o~iqlgjAyGBi)$%zNvl~fSlg@M=C{TE;V zQkH`zS8b&!ut(m)%4n2E6MB>p*4(oV>+PT51#I{OXs9j1vo>9I<4CL1kv1aurV*AFZ^w_qfVL*G2rG@D2 zrs87oV3#mf8^E5hd_b$IXfH6vHe&lm@7On~Nkcq~YtE!}ad~?5*?X*>y`o;6Q9lkk zmf%TYonZM`{vJg$`lt@MXsg%*&zZZ0uUSse8o=!=bfr&DV)9Y6$c!2$NHyYAQf*Rs zk{^?gl9E z5Im8wlAsvQ6C2?DyG@95gUXZ3?pPijug25g;#(esF_~3uCj3~94}b*L>N2GSk%Qst z=w|Z>UX$m!ZOd(xV*2xvWjN&c5BVEdVZ0wvmk)I+YxnyK%l~caR=7uNQ=+cnNTLZ@&M!I$Mj-r{!P=; z`C2)D=VmvK8@T5S9JZoRtN!S*D_oqOxyy!q6Zk|~4aT|*iRN)fL)c>-yycR>-is0X zKrko-iZw(f(!}dEa?hef5yl%p0-v-8#8CX8!W#n2KNyT--^3hq6r&`)5Y@>}e^4h- zlPiDT^zt}Ynk&x@F8R&=)k8j$=N{w9qUcIc&)Qo9u4Y(Ae@9tA`3oglxjj6c{^pN( zQH+Uds2=9WKjH#KBIwrQI%bbs`mP=7V>rs$KG4|}>dxl_k!}3ZSKeEen4Iswt96GGw`E6^5Ov)VyyY}@itlj&sao|>Sb5 zeY+#1EK(}iaYI~EaHQkh7Uh>DnzcfIKv8ygx1Dv`8N8a6m+AcTa-f;17RiEed>?RT zk=dAksmFYPMV1vIS(Qc6tUO+`1jRZ}tcDP? zt)=7B?yK2RcAd1+Y!$K5*ds=SD;EEqCMG6+OqPoj{&8Y5IqP(&@zq@=A7+X|JBRi4 zMv!czlMPz)gt-St2VZwDD=w_S>gRpc-g zUd*J3>bXeZ?Psjohe;z7k|d<*T21PA1i)AOi8iMRwTBSCd0ses{)Q`9o&p9rsKeLaiY zluBw{1r_IFKR76YCAfl&_S1*(yFW8HM^T()&p#6y%{(j7Qu56^ZJx1LnN`-RTwimdnuo*M8N1ISl+$C-%=HLG-s} zc99>IXRG#FEWqSV9@GFW$V8!{>=lSO%v@X*pz*7()xb>=yz{E$3VE;e)_Ok@A*~El zV$sYm=}uNlUxV~6e<6LtYli1!^X!Ii$L~j4e{sI$tq_A(OkGquC$+>Rw3NFObV2Z)3Rt~Jr{oYGnZaFZ^g5TDZlg;gaeIP} z!7;T{(9h7mv{s@piF{-35L=Ea%kOp;^j|b5ZC#xvD^^n#vPH=)lopYz1n?Kt;vZmJ z!FP>Gs7=W{sva+aO9S}jh0vBs+|(B6Jf7t4F^jO3su;M13I{2rd8PJjQe1JyBUJ5v zcT%>D?8^Kp-70bP8*rulxlm)SySQhG$Pz*bo@mb5bvpLAEp${?r^2!Wl*6d7+0Hs_ zGPaC~w0E!bf1qFLDM@}zso7i~(``)H)zRgcExT_2#!YOPtBVN5Hf5~Ll3f~rWZ(UsJtM?O*cA1_W0)&qz%{bDoA}{$S&-r;0iIkIjbY~ zaAqH45I&ALpP=9Vof4OapFB`+_PLDd-0hMqCQq08>6G+C;9R~}Ug_nm?hhdkK$xpI zgXl24{4jq(!gPr2bGtq+hyd3%Fg%nofK`psHMs}EFh@}sdWCd!5NMs)eZg`ZlS#O0 zru6b8#NClS(25tXqnl{|Ax@RvzEG!+esNW-VRxba(f`}hGoqci$U(g30i}2w9`&z= zb8XjQLGN!REzGx)mg~RSBaU{KCPvQx8)|TNf|Oi8KWgv{7^tu}pZq|BS&S<53fC2K4Fw6>M^s$R$}LD*sUxdy6Pf5YKDbVet;P!bw5Al-8I1Nr(`SAubX5^D9hk6$agWpF}T#Bdf{b9-F#2WVO*5N zp+5uGgADy7m!hAcFz{-sS0kM7O)qq*rC!>W@St~^OW@R1wr{ajyYZq5H!T?P0e+)a zaQ%IL@X_`hzp~vRH0yUblo`#g`LMC%9}P;TGt+I7qNcBSe&tLGL4zqZqB!Bfl%SUa z6-J_XLrnm*WA`34&mF+&e1sPCP9=deazrM=Pc4Bn(nV;X%HG^4%Afv4CI~&l!Sjzb z{rHZ3od0!Al{}oBO>F*mOFAJrz>gX-vs!7>+_G%BB(ljWh$252j1h;9p~xVA=9_`P z5KoFiz96_QsTK%B&>MSXEYh`|U5PjX1(+4b#1PufXRJ*uZ*KWdth1<0 zsAmgjT%bowLyNDv7bTUGy|g~N34I-?lqxOUtFpTLSV6?o?<7-UFy*`-BEUsrdANh} zBWkDt2SAcGHRiqz)x!iVoB~&t?$yn6b#T=SP6Ou8lW=B>=>@ik93LaBL56ub`>Uo!>0@O8?e)$t(sgy$I z6tk3nS@yFFBC#aFf?!d_3;%>wHR;A3f2SP?Na8~$r5C1N(>-ME@HOpv4B|Ty7%jAv zR}GJwsiJZ5@H+D$^Cwj#0XA_(m^COZl8y7Vv(k=iav1=%QgBOVzeAiw zaDzzdrxzj%sE^c9_uM5D;$A_7)Ln}BvBx^=)fO+${ou%B*u$(IzVr-gH3=zL6La;G zu0Kzy5CLyNGoKRtK=G0-w|tnwI)puPDOakRzG(}R9fl7#<|oQEX;E#yCWVg95 z;NzWbyF&wGg_k+_4x4=z1GUcn6JrdX4nOVGaAQ8#^Ga>aFvajQN{!+9rgO-dHP zIp@%&ebVg}IqnRWwZRTNxLds+gz2@~VU(HI=?Epw>?yiEdZ>MjajqlO>2KDxA>)cj z2|k%dhh%d8SijIo1~20*5YT1eZTDkN2rc^zWr!2`5}f<2f%M_$to*3?Ok>e9$X>AV z2jYmfAd)s|(h?|B(XYrIfl=Wa_lBvk9R1KaP{90-z{xKi+&8=dI$W0+qzX|ZovWGOotP+vvYR(o=jo?k1=oG?%;pSqxcU* zWVGVMw?z__XQ9mnP!hziHC`ChGD{k#SqEn*ph6l46PZVkm>JF^Q{p&0=MKy_6apts z`}%_y+Tl_dSP(;Ja&sih$>qBH;bG;4;75)jUoVqw^}ee=ciV;0#t09AOhB^Py7`NC z-m+ybq1>_OO+V*Z>dhk}QFKA8V?9Mc4WSpzj{6IWfFpF7l^au#r7&^BK2Ac7vCkCn{m0uuN93Ee&rXfl1NBY4NnO9lFUp zY++C1I;_{#OH#TeP2Dp?l4KOF8ub?m6zE@XOB5Aiu$E~QNBM@;r+A5mF2W1-c7>ex zHiB=WJ&|`6wDq*+xv8UNLVUy4uW1OT>ey~Xgj@MMpS@wQbHAh>ysYvdl-1YH@&+Q! z075(Qd4C!V`9Q9jI4 zSt{HJRvZec>vaL_brKhQQwbpQd4_Lmmr0@1GdUeU-QcC{{8o=@nwwf>+dIKFVzPriGNX4VjHCa zTbL9w{Y2V87c2ofX%`(48A+4~mYTiFFl!e{3K^C_k%{&QTsgOd0*95KmWN)P}m zTRr{`f7@=v#+z_&fKYkQT!mJn{*crj%ZJz#(+c?>cD&2Lo~FFAWy&UG*Op^pV`BR^I|g?T>4l5;b|5OQ@t*?_Slp`*~Y3`&RfKD^1uLezIW(cE-Dq2z%I zBi8bWsz0857`6e!ahet}1>`9cYyIa{pe53Kl?8|Qg2RGrx@AlvG3HAL-^9c^1GW;)vQt8IK+ zM>!IW*~682A~MDlyCukldMd;8P|JCZ&oNL(;HZgJ>ie1PlaInK7C@Jg{3kMKYui?e!b`(&?t6PTb5UPrW-6DVU%^@^E`*y-Fd(p|`+JH&MzfEq;kikdse ziFOiDWH(D< zyV7Rxt^D0_N{v?O53N$a2gu%1pxbeK;&ua`ZkgSic~$+zvt~|1Yb=UfKJW2F7wC^evlPf(*El+#}ZBy0d4kbVJsK- z05>;>?HZO(YBF&v5tNv_WcI@O@LKFl*VO?L(!BAd!KbkVzo;v@~3v`-816GG?P zY+H3ujC>5=Am3RIZDdT#0G5A6xe`vGCNq88ZC1aVXafJkUlcYmHE^+Z{*S->ol%-O znm9R0TYTr2w*N8Vs#s-5=^w*{Y}qp5GG)Yt1oLNsH7y~N@>Eghms|K*Sdt_u!&I}$ z+GSdFTpbz%KH+?B%Ncy;C`uW6oWI46(tk>r|5|-K6)?O0d_neghUUOa9BXHP*>vi; z={&jIGMn-92HvInCMJcyXwHTJ42FZp&Wxu+9Rx;1x(EcIQwPUQ@YEQQ`bbMy4q3hP zNFoq~Qd0=|xS-R}k1Im3;8s{BnS!iaHIMLx)aITl)+)?Yt#fov|Eh>}dv@o6R{tG>uHsy&jGmWN5+*wAik|78(b?jtysPHC#e+Bzz~V zS3eEXv7!Qn4uWi!FS3B?afdD*{fr9>B~&tc671fi--V}~E4un;Q|PzZRwk-azprM$4AesvUb5`S`(5x#5VJ~4%ET6&%GR$}muHV-5lTsCi_R|6KM(g2PCD@|yOpKluT zakH!1V7nKN)?6JmC-zJoA#ciFux8!)ajiY%K#RtEg$gm1#oKUKX_Ms^%hvKWi|B=~ zLbl-L)-=`bfhl`>m!^sRR{}cP`Oim-{7}oz4p@>Y(FF5FUEOfMwO!ft6YytF`iZRq zfFr{!&0Efqa{1k|bZ4KLox;&V@ZW$997;+Ld8Yle91he{BfjRhjFTFv&^YuBr^&Pe zswA|Bn$vtifycN8Lxr`D7!Kygd7CuQyWqf}Q_PM}cX~S1$-6xUD%-jrSi24sBTFNz(Fy{QL2AmNbaVggWOhP;UY4D>S zqKr!UggZ9Pl9Nh_H;qI`-WoH{ceXj?m8y==MGY`AOJ7l0Uu z)>M%?dtaz2rjn1SW3k+p`1vs&lwb%msw8R!5nLS;upDSxViY98IIbxnh{}mRfEp=9 zbrPl>HEJeN7J=KnB6?dwEA6YMs~chHNG?pJsEj#&iUubdf3JJwu=C(t?JpE6xMyhA3e}SRhunDC zn-~83*9=mADUsk^sCc%&&G1q5T^HR9$P#2DejaG`Ui*z1hI#h7dwpIXg)C{8s< z%^#@uQRAg-$z&fmnYc$Duw63_Zopx|n{Bv*9Xau{a)2%?H<6D>kYY7_)e>OFT<6TT z0A}MQLgXbC2uf`;67`mhlcUhtXd)Kbc$PMm=|V}h;*_%vCw4L6r>3Vi)lE5`8hkSg zNGmW-BAOO)(W((6*e_tW&I>Nt9B$xynx|sj^ux~?q?J@F$L4;rnm_xy8E*JYwO-02u9_@@W0_2@?B@1J{y~Q39N3NX^t7#`=34Wh)X~sU&uZWgS1Z09%_k|EjA4w_QqPdY`oIdv$dJZ;(!k)#U8L+|y~gCzn+6WmFt#d{OUuKHqh1-uX_p*Af8pFYkYvKPKBxyid4KHc}H` z*KcyY;=@wzXYR{`d{6RYPhapShXIV?0cg_?ahZ7do)Ot#mxgXYJYx}<%E1pX;zqHd zf!c(onm{~#!O$2`VIXezECAHVd|`vyP)Uyt^-075X@NZDBaQt<>trA3nY-Dayki4S zZ^j6CCmx1r46`4G9794j-WC0&R9(G7kskS>=y${j-2;(BuIZTLDmAyWTG~`0)Bxqk zd{NkDe9ug|ms@0A>JVmB-IDuse9h?z9nw!U6tr7t-Lri5H`?TjpV~8(gZWFq4Vru4 z!86bDB;3lpV%{rZ`3gtmcRH1hjj!loI9jN>6stN6A*ujt!~s!2Q+U1(EFQEQb(h4E z6VKuRouEH`G6+8Qv2C)K@^;ldIuMVXdDDu}-!7FS8~k^&+}e9EXgx~)4V4~o6P^52 z)a|`J-fOirL^oK}tqD@pqBZi_;7N43%{IQ{v&G9^Y^1?SesL`;Z(dt!nn9Oj5Odde%opv&t zxJ><~b#m+^KV&b?R#)fRi;eyqAJ_0(nL*61yPkJGt;gZxSHY#t>ATnEl-E%q$E16% zZdQfvhm5B((y4E3Hk6cBdwGdDy?i5CqBlCVHZr-rI$B#>Tbi4}Gcvyg_~2=6O9D-8 zY2|tKrNzbVR$h57R?Pe+gUU_il}ZaWu|Az#QO@};=|(L-RVf0AIW zq#pO+RfM7tdV`9lI6g;{qABNId`fG%U9Va^ravVT^)CklDcx)YJKeJdGpM{W1v8jg z@&N+mR?BPB=K1}kNwXk_pj44sd>&^;d!Z~P>O78emE@Qp@&8PyB^^4^2f7e)gekMv z2aZNvP@;%i{+_~>jK7*2wQc6nseT^n6St9KG#1~Y@$~zR_=AcO2hF5lCoH|M&c{vR zSp(GRVVl=T*m~dIA;HvYm8HOdCkW&&4M~UDd^H)`p__!4k+6b)yG0Zcek8OLw$C^K z3-BbLiG_%qX|ZYpXJ$(c@aa7b4-*IQkDF}=gZSV`*ljP|5mWuHSCcf$5qqhZTv&P?I$z^>}qP(q!Aku2yA5vu38d8x*q{6-1`%PrE_r0-9Qo?a#7Zbz#iGI7K<(@k^|i4QJ1H z4jx?{rZbgV!me2VT72@nBjucoT zUM9;Y%TCoDop?Q5fEQ35bCYk7!;gH*;t9t-QHLXGmUF;|vm365#X)6b2Njsyf1h9JW#x$;@x5Nx2$K$Z-O3txa%;OEbOn6xBzd4n4v)Va=sj5 z%rb#j7{_??Tjb8(Hac<^&s^V{yO-BL*uSUk2;X4xt%NC8SjO-3?;Lzld{gM5A=9AV z)DBu-Z8rRvXXwSVDH|dL-3FODWhfe1C_iF``F05e{dl(MmS|W%k-j)!7(ARkV?6r~ zF=o42y+VapxdZn;GnzZfGu<6oG-gQ7j7Zvgo7Am@jYxC2FpS@I;Jb%EyaJDBQC(q% zKlZ}TVu!>;i3t~OAgl@QYy1X|T~D{HOyaS*Bh}A}S#a9MYS{XV{R-|niEB*W%GPW! zP^NU(L<}>Uab<;)#H)rYbnqt|dOK(-DCnY==%d~y(1*{D{Eo1cqIV8*iMfx&J*%yh zx=+WHjt0q2m*pLx8=--UqfM6ZWjkev>W-*}_*$Y(bikH`#-Gn#!6_ zIA&kxn;XYI;eN9yvqztK-a113A%97in5CL5Z&#VsQ4=fyf&3MeKu70)(x^z_uw*RG zo2Pv&+81u*DjMO6>Mrr7vKE2CONqR6C0(*;@4FBM;jPIiuTuhQ-0&C)JIzo_k>TaS zN_hB;_G=JJJvGGpB?uGgSeKaix~AkNtYky4P7GDTW6{rW{}V9K)Cn^vBYKe*OmP!; zohJs=l-0sv5&phSCi&8JSrokrKP$LVa!LbtlN#T^cedgH@ijt5T-Acxd9{fQY z4qsg1O{|U5Rzh_j;9QD(g*j+*=xULyi-FY|-mUXl7-2O`TYQny<@jSQ%^ye*VW_N< z4mmvhrDYBJ;QSoPvwgi<`7g*Pwg5ANA8i%Kum;<=i|4lwEdN+`)U3f2%bcRZRK!P z70kd~`b0vX=j20UM5rBO#$V~+grM)WRhmzb15ya^Vba{SlSB4Kn}zf#EmEEhGruj| zBn0T2n9G2_GZXnyHcFkUlzdRZEZ0m&bP-MxNr zd;kl7=@l^9TVrg;Y6J(%!p#NV*Lo}xV^Nz0#B*~XRk0K2hgu5;7R9}O=t+R(r_U%j z$`CgPL|7CPH&1cK5vnBo<1$P{WFp8#YUP%W)rS*a_s8kKE@5zdiAh*cjmLiiKVoWD z!y$@Cc5=Wj^VDr$!04FI#%pu6(a9 zM_FAE+?2tp2<$Sqp5VtADB>yY*cRR+{OeZ5g2zW=`>(tA~*-T)X|ahF{xQmypWp%2X{385+=0S|Jyf`XA-c7wAx`#5n2b-s*R>m zP30qtS8aUXa1%8KT8p{=(yEvm2Gvux5z22;isLuY5kN{IIGwYE1Pj);?AS@ex~FEt zQ`Gc|)o-eOyCams!|F0_;YF$nxcMl^+z0sSs@ry01hpsy3p<|xOliR zr-dxK0`DlAydK!br?|Xi(>buASy4@C8)ccRCJ3w;v&tA1WOCaieifLl#(J% zODPi5fr~ASdz$Hln~PVE6xekE{Xb286t(UtYhDWo8JWN6sNyRVkIvC$unIl8QMe@^ z;1c<0RO5~Jv@@gtDGPDOdqnECOurq@l02NC#N98-suyq_)k(`G=O`dJU8I8LcP!4z z8fkgqViqFbR+3IkwLa)^>Z@O{qxTLU63~^lod{@${q;-l?S|4Tq0)As-Gz!D(*P)Vf6wm6B8GGWi7B)Q^~T?sseZeI+}LyBAG!LRZn_ktDlht1j2ok@ljteyuNUkG67 zipkCx-7k(FZQhYjZ%T9X7`tO99$Wj~K`9r0IkWhPul`Q_t1YnVK=YI1dMc_b!FEU4 zkv=PGf{5$P#w{|m92tfVnsnfd%%KW;1a*cLmga4bSYl^*49M4cs+Fe>P!n=$G6hL6 z>IM&0+c(Nvr0I!5CGx7WK*Z3V^w0+QcF=hU0B4=+;=tn*+XDxKa;NB-z4O~I zf}TSb^Z;L_Og>!D1`;w@zf@GCqCUNY%N?IPmEkTco^}bX~BWM_Hamu05>#B zBh%QfUeHPu`MsYVQQ3hOT;HmP_C|nOl zjluk7vaSICyQ01h`^c)DWp>cxPjGEc6D^~2L79hyK_J#<9H#8o`&XM4=aB`@< z<|1oR6Djf))P1l2C{qSwa4u-&LDG{FLz#ym_@I+vo}D}#%;vNN%& zW&9||THv_^B!1Fo+$3A6hEAed$I-{a^6FVvwMtT~e%*&RvY5mj<@(-{y^xn6ZCYqNK|#v^xbWpy15YL18z#Y&5YwOnd!A*@>k^7CaX0~4*6QB{Bgh$KJqesFc(lSQ{iQAKY%Ge}2CeuFJ{4YmgrP(gpcH zXJQjSH^cw`Z0tV^axT&RkOBP2A~#fvmMFrL&mwdDn<*l3;3A425_lzHL`+6sT9LeY zu@TH0u4tj199jQBzz*~Up5)7=4OP%Ok{rxQYNb!hphAoW-BFJn>O=%ov*$ir?dIx% z56Y`>?(1YQ8Fc(D7pq2`9swz@*RIoTAvMT%CPbt;$P%eG(P%*ZMjklLoXqTE*Jg^T zlEQbMi@_E|ll_>pTJ!(-x41R}4sY<5A2VVQ^#4eE{imHt#NEi+#p#EBC2C=9B4A|n zqe03T*czDqQ-VxZ+jPQG!}!M0SlFm^@wTW?otBZ+q~xkk29u1i7Q|kaJ(9{AiP1`p zbEe5&!>V;1wnQ1-Qpyn2B5!S(lh=38hl6IilCC6n4|yz~q94S9_5+Od*$c)%r|)f~ z;^-lf=6POs>Ur4i-F>-wm;3(v7Y_itzt)*M!b~&oK%;re(p^>zS#QZ+Rt$T#Y%q1{ zx+?@~+FjR1MkGr~N`OYBSsVr}lcBZ+ij!0SY{^w((2&U*M`AcfSV9apro+J{>F&tX zT~e zMvsv$Q)AQl_~);g8OOt4plYESr8}9?T!yO(Wb?b~1n0^xVG;gAP}d}#%^9wqN7~F5 z!jWIpqxZ28LyT|UFH!u?V>F6&Hd~H|<(3w*o{Ps>G|4=z`Ws9oX5~)V=uc?Wmg6y< zJKnB4Opz^9v>vAI)ZLf2$pJdm>ZwOzCX@Yw0;-fqB}Ow+u`wglzwznQAP(xbs`fA7 zylmol=ea)g}&;8;)q0h7>xCJA+01w+RY`x`RO% z9g1`ypy?w-lF8e5xJXS4(I^=k1zA46V)=lkCv?k-3hR9q?oZPzwJl$yOHWeMc9wFuE6;SObNsmC4L6;eWPuAcfHoxd59gD7^Xsb$lS_@xI|S-gb? z*;u@#_|4vo*IUEL2Fxci+@yQY6<&t=oNcWTVtfi1Ltveqijf``a!Do0s5e#BEhn5C zBXCHZJY-?lZAEx>nv3k1lE=AN10vz!hpeUY9gy4Xuy940j#Rq^yH`H0W2SgXtn=X1 zV6cY>fVbQhGwQIaEG!O#p)aE8&{gAS z^oVa-0M`bG`0DE;mV)ATVNrt;?j-o*?Tdl=M&+WrW12B{+5Um)qKHd_HIv@xPE+;& zPI|zXfrErYzDD2mOhtrZLAQ zP#f9e!vqBSyoKZ#{n6R1MAW$n8wH~)P3L~CSeBrk4T0dzIp&g9^(_5zY*7$@l%%nL zG$Z}u8pu^Mw}%{_KDBaDjp$NWes|DGAn~WKg{Msbp*uPiH9V|tJ_pLQROQY?T0Pmt zs4^NBZbn7B^L%o#q!-`*+cicZS9Ycu+m)rDb98CJ+m1u}e5ccKwbc0|q)ICBEnLN# zV)8P1s;r@hE3sG2wID0@`M9XIn~hm+W1(scCZr^Vs)w4PKIW_qasyjbOBC`ixG8K$ z9xu^v(xNy4HV{wu2z-B87XG#yWu~B6@|*X#BhR!_jeF*DG@n_RupAvc{DsC3VCHT# za6Z&9k#<*y?O0UoK3MLlSX6wRh`q&E>DOZTG=zRxj0pR0c3vskjPOqkh9;o>a1>!P zxD|LU0qw6S4~iN8EIM2^$k72(=a6-Tk?%1uSj@0;u$0f*LhC%|mC`m`w#%W)IK zN_UvJkmzdP84ZV7CP|@k>j^ zPa%;PDu1TLyNvLQdo!i1XA|49nN}DuTho6=z>Vfduv@}mpM({Jh289V%W@9opFELb z?R}D#CqVew1@W=XY-SoMNul(J)zX(BFP?#@9x<&R!D1X&d|-P;VS5Gmd?Nvu$eRNM zG;u~o*~9&A2k&w}IX}@x>LMHv`ith+t6`uQGZP8JyVimg>d}n$0dDw$Av{?qU=vRq zU@e2worL8vTFtK@%pdbaGdUK*BEe$XE=pYxE_q{(hUR_Gzkn=c#==}ZS^C6fKBIfG z@hc);p+atn`3yrTY^x+<y`F0>p02jUL8cgLa|&yknDj;g73m&Sm&@ju91?uG*w?^d%Yap&d2Bp3v7KlQmh z(N<38o-iRk9*UV?wFirV>|46JqxOZ_o8xv_eJ1dv} zw&zDHZOU%`U{9ckU8DS$lB6J!B`JuThCnwKphODv`3bd?_=~tjNHstM>xoA53-p#F zLCVB^E`@r_D>yHLr10Sm4NRX8FQ+&zw)wt)VsPmLK|vLwB-}}jwEIE!5fLE;(~|DA ztMr8D0w^FPKp{trPYHXI7-;UJf;2+DOpHt%*qRgdWawy1qdsj%#7|aRSfRmaT=a1> zJ8U>fcn-W$l-~R3oikH+W$kRR&a$L!*HdKD_g}2eu*3p)twz`D+NbtVCD|-IQdJlFnZ0%@=!g`nRA(f!)EnC0 zm+420FOSRm?OJ;~8D2w5HD2m8iH|diz%%gCWR|EjYI^n7vRN@vcBrsyQ;zha15{uh zJ^HJ`lo+k&C~bcjhccoiB77-5=SS%s7UC*H!clrU$4QY@aPf<9 z0JGDeI(6S%|K-f@U#%SP`{>6NKP~I#&rSHBTUUvHn#ul4*A@BcRR`#yL%yfZj*$_% zAa$P%`!8xJp+N-Zy|yRT$gj#4->h+eV)-R6l}+)9_3lq*A6)zZ)bnogF9`5o!)ub3 zxCx|7GPCqJlnRVPb&!227Ok@-5N2Y6^j#uF6ihXjTRfbf&ZOP zVc$!`$ns;pPW_=n|8Kw4*2&qx+WMb9!DQ7lC1f@DZyr|zeQcC|B6ma*0}X%BSmFJ6 zeDNWGf=Pmmw5b{1)OZ6^CMK$kw2z*fqN+oup2J8E^)mHj?>nWhBIN|hm#Km4eMyL= zXRqzro9k7(ulJi5J^<`KHJAh-(@W=5x>9+YMFcx$6A5dP-5i6u!k*o-zD z37IkyZqjlNh*%-)rAQrCjJo)u9Hf9Yb1f3-#a=nY&M%a{t0g7w6>{AybZ9IY46i4+%^u zwq}TCN@~S>i7_2T>GdvrCkf&=-OvQV9V3$RR_Gk7$t}63L}Y6d_4l{3b#f9vup-7s z3yKz5)54OVLzH~Ty=HwVC=c$Tl=cvi1L?R>*#ki4t6pgqdB$sx6O(IIvYO8Q>&kq;c3Y-T?b z*6XAc?orv>?V7#vxmD7geKjf%v~%yjbp%^`%e>dw96!JAm4ybAJLo0+4=TB% zShgMl)@@lgdotD?C1Ok^o&hFRYfMbmlbfk677k%%Qy-BG3V9txEjZmK+QY5nlL2D$Wq~04&rwN`-ujpp)wUm5YQc}&tK#zUR zW?HbbHFfSDsT{Xh&RoKiGp)7WPX4 zD^3(}^!TS|hm?YC16YV59v9ir>ypihBLmr?LAY87PIHgRv*SS>FqZwNJKgf6hy8?9 zaGTxa*_r`ZhE|U9S*pn5Mngb7&%!as3%^ifE@zDvX`GP+=oz@p)rAl2KL}ZO1!-us zY`+7ln`|c!2=?tVsO{C}=``aibcdc1N#;c^$BfJr84=5DCy+OT4AB1BUWkDw1R$=FneVh*ajD&(j2IcWH8stMShVcMe zAi6d7p)>hgPJbcb(=NMw$Bo;gQ}3=hCQsi{6{2s~=ZEOizY(j{zYY-W8RiNjycv00 z8(JpE{}=CHx0ib3(nZgo776X=wBUbfk$y2r*}aNG@A0_zOa4k3?1EeH7Z43{@IP>{^M+M`M)0w*@Go z>kg~UfgP1{vH+IU(0p(VRVlLNMHN1C&3cFnp*}4d1a*kwHJL)rjf`Fi5z)#RGTr7E zOhWfTtQyCo&8_N(zIYEugQI}_k|2X(=dMA43Nt*e93&otv`ha-i;ACB$tIK% zRDOtU^1CD5>7?&Vbh<+cz)(CBM}@a)qZ^ld?uYfp3OjiZOCP7u6~H# zMU;=U=1&DQ9Qp|7j4qpN5Dr7sH(p^&Sqy|{uH)lIv3wk?xoVuN`ILg}HUCLs1Bp2^ za8&M?ZQVWFX>Rg4_i$C$U`89i6O(RmWQ4&O=?B6@6`a8fI)Q6q0t{&o%)|n7jN)7V z{S;u+{UzXnUJN}bCE&4u5wBxaFv7De0huAjhy#o~6NH&1X{OA4Y>v0$F-G*gZqFym zhTZ7~nfaMdN8I&2ri;fk*`LhES$vkyq-dBuRF!BC)q%;lt0`Z(*=Sl>uvU`LAvbyt zL1|M@Jas<@1hK!prK}$@&fbf70o7>3&CovCKi815v$6T7R&1GOG~R4pEu2B z%bxG{n`u$7ps(}Tt(P608J@{+>X(?=-j8CkF!T79c`1@E%?vOL%TYrMe1ozi<##IsIC1YRojP!gD%|+7|z^-Vj$a85gbmtB#unyoy%gw9m1yB z|L^-wylT%}=pNpq!QYz9zoV7>zM2g2d9lm{Q zP|dx3=De3NSNGuMWRdO_ctQJUud?_96HbrHiSKmp;{MHZhX#*L+^I11#r;grJ8_21 zt6b*wmCaAw(>A`ftjlL@vi06Z7xF<&xNOrTHrDeMHk*$$+pGK0p+|}H=Kgl{=naBy zclyQsRTraO4!uo})OTSp_x`^0jj7>|H=FOGnAbKT_LuSUiSd3QuCMq>sEhB=V63Nm zZxrtB0)U@x2A#VHqo2ab=pn~tu>kJ;TVASb_&ePAgVcic@>^YM?^LYRLr^O12>~45 z-EE?-Z$xjxsN92EaBi)~D~1OzRVH`o!)kYv7IIx??(B)>R|xa&(wmlU2gdV0+N+3% z7r$w5(L<|?@46ITJZS5koAELgVV_&KHj(9KG??A);@gL`s1th*c#t5>U(*+nb0+H% zOhJG5tth59%*>S~JIi%<0VAi;k>}&(Ojg!fyH0(fza!1kA~a}Vt{|3z{`Pt@VuYyB zFUt(kR$<`X_J&UQ%;ui2zob1!H{PL8X>>wbpGn~@&h__AfBit)4`D^#->1+Qn^MH9 zYD?%)Pa)D-xQzVGm!g)N$^_z`9)(>)gyQ+(7N@k4GO?~43wcE-|77;CPwPXHQcfcJ^I&IOOah zzL|dhoR*#m5sw{b&L=@<-30s9F|{@V05;4Wf6Z_1gpZnJ*SVN}3O7)-=yYuj2)O0d zX=I9TzzTK%QG&ujvS!F*aJ8eqt4|#VE;``yKqCx7#8QC7AmVn+zW9km3L5TN=R>{5 zLcW`6NKkTz`c{`-w!X9zMG;JZP|skLGs7qBHaWj7Ew!VR=`>n30NX)7j~-RbDmQ6b zHr)zVcn^~e2xqFCBG4P$ZCcRDml-&1^5fqN=CHgBVu1yTg32_N>tZ;N%h*TwOf^1lE#w1$yF$kXaP|V$2XuZ+3wH4Ws6%U;^iP|c6`#etHogQ+E@+~PZ1zdGAty6qTmBM z>!)Wfgq~%lD)m>avXMm)ReN}s9!T_>ic6xA|m7$(&n(Z&j} zHC=}~I(^-*PS2pc7%>)6w}F1il&p*0jX1z)jSvG%S{I3d9w$A|5;TS)4w81yzq5f8 zZVfF~`74m1KXQg|`OS>;FCgZw!AL;2PV{&8%~rG!;`eD=g!luE0k40GjIgjD!JSDNf$eW zZtPMF)&EH_#?IwVLEx&Tosh9K8Ln4Pb$`j2=><6MAezsQvhP#YNnw&cL>12xf)dPz z1tk;{SH6HDcbV0x(+5=2n;A->&iYDa5Zr9$&j?2iAz-(l1;#Vc3-ULyqRV9d0*psG7QHE! z*J=*^sKK?iTO$g*+j~C?QzzIu`6Z{2N-ANrd5*?o%x& z&WMin)$Wq%G!?{EH(2}A?Wx@ zn8|q7xPad4Gu>l^&SBl|mhUxp;S+Cb125`h5aBz9pM34$7n-GHGx*=yqAphZKkds7 z$=5Jnt*6&8@y80jNXm|>2IR<$D5frk;c2f5zLS5xe*^W>kkZa5R1+Am34;mo{Gr=Z zD=z8fgTHwx%)7hzjOo9*Cogbru8GgDzrE;3y%TR+u`|zz%c0Tyd8;#EQXdr4Rgx(2LPRzVI2FwsbXwnF;DP^fg zdYOd|zU&AqgCJ;R+?oSgEgZM`ZX>7&$A-j2m|Tcz4ictXoQkz6Tr<2zhOudU16k<7 zLdk&FCL>=a^>0gV@m#9SnMd)R$5&1mh8p2McnUbk;1|C;`7pPkYjf|o>|a6`x`z1O zt>8~Q%zHX%C=D2!;_1eo3qfbB4QQK^{ON_f*7XhLk{6sr2(KIVmax}fUtF-zHZiUd zHPb9jidV`dE;lsw?1uQH!b%MvPE|lh9-8R_z4^PC8{XAf?S73(n*FvYPoMES+LfOx zcjm4ZZOmKY>M2e${QBVT+XnBQ(oC0fAYcXi7+=}_!hS9m>Y%G@zxn3z#Pb;bJ~-kI zAHNmWgQJp$e8L-uKQ|c4B;#0BTsfRB+}pl7xe=2_1U7pahx5S$TVbRnU0oi1?Wh|A zR7ebg9TK1GgKa4@ic#q_*<;c8?CkjX zMMyq`J()_&(j-FZY7q%z6CN^a0%V{UL)jmrvEg{doZd?qIjgJ^UPr(QUs`68;qkdI zzj_XBQ|#K2U!5?fmIEtXX6^rFY;h4=Vx<-C(d;W6Bi_Xsg{ZJPL*K;I?5U$=V-BNP zn9pKiMc=hZNe**GZBw1kVs#-8c2ZRjol}}^V@^}BqY7c0=!mA;v0`d|(d;R-iT|GK z>zt>Tt3oV09%Y;^RM6=p9C-ys_a``HB_D-pnyX(CeA(GiJqx7xxFE52Y`j~iMv;sP z%jPmx#8p%5`flAU(b!c9XBvV+fygn`BP-C#lyRa;9%>YyW6~A_g?@2J+oY0HAg{qO znT4%ViCgw&eE=W8yt-0{cw`tMieWOG3wyNX#3a^qPhE8TH1?QhwhR~}Ic zZ^q$TF8$p0b0=L8aw&qaTjuAYPmr-6x;U*k*vRnOaBwb_( z5+ls5b(E!(71*l)M&(7ZEgBCtB{6Kh#ArV4u0iNnK!ml!nK5=3;9e76yD9oU4xTAK zPGsGkjtFMMY3pRP5u07;#af?b0C7u) zD^=9X@DRasHaf#c>4rF5GAT!Ggj0!7!z?Q-1_X6ZP2g|+?nVutp|rp}eFlKc8}Q&_ z17$NpDQvQolMWZfj0W0|WKm`nd_KXYH_#wRRzs1aRBYqo#feM}a?joONn30Z4Z9PG zg1c!_<52-9D53Wq4z8pUzGkEFm1@Ws(kp4}CO7csZ-7+b)^)M)(xo}_IpTLl7}5BmbBCI{4>rw>4c_gBQHtRd5Z=SW&6Qp2qMOjr3W+ZRmP;S(U+h=^BHKohhRp6Zgf zwt&$zQXhMm@kh1@SB%dIE*kFDZym3Mky$NRljX?}&JGK`PIV1C;Pf!JV{hb4y;Ju- zlpfEPUd+mV5XQH<#BRFhZ}>b#IdF?a?x;rBg-v)@fZpA?+J{3WZjbl3E zv(a&1=pGYPxP@K!6Qg5Vx=-jwc=BA{xL3+QWb&9~DGS1EFkIC+>55{dvY4LV@s5$C zKJmCjigp7?m27*GN_GROz}y+y5%iIj=*JTYccaFjvD&VN%ewfSp=0P zspdFfDqj?gs!N64cEy5uR~wD>af!1PE*xo{^a^8BPIL2=U>B!m2AM0Jf<8qWLoHxi zxQfkbbwkRXgJgLW_j{ZkCxHLBU{@D6T5u90UNs5P769Zei|C$@nA5$L$4ZvxQl1i? z8vLHg17}e{zM$=&h%8Swbfz7yw~X^N|7Chp1bC(oV72l#R8&%Ne5>F=7wR(dB; zkDX!%&fxS19JBjP<6H7+!dO`nPLvB~xn{aDh#^iHKP|A5UQlCG%v%x9@q1w2fa#&% za^UwHu!~(qrv99G%9_e4OBbJ-CkB*1M_?t6UXZ#}4JFDzB|x(1Z}ckuiY}${zj`eVo})!rN8Je z%h2CVJG1$K$2deXx^h8trLs~Han^e>_-M6@0o4C7d548|#mKtm@DvdVAX5ZzA8=*! zKq5C+cM9u)qJ%YBJ1UAcG}6Ji4=$piaZ(K@>1BiD;$R9bR*QP`dH2T=)dgW#f7U)S zZ~i#VYLOnUZt^~Iu3x8QPJaHVUxtRyipQ+tbmWKl14iW1!f6JSDvT$xt8>~7-1ZlJ zU|)Ab*lhvz-JO!$a}RBH9u8$=R)*qeD@iS@(px~OVvML-qqO5&Ujnhw1>G~**Ld{W zE+7h|!{rDZ#;ipZx4^Tcr9vnO)0>WFPzpFu*MYST(`GFzCq*@Gqse6VwDH#x?-{rs z+=dqd$W0*AuAEhzM@GC&!oZa1*lRsx>>mP>DNYigdm^A~xzo}=uV$w#iadO+!&q_~ zT>AsHXOEGsNyfcJt2V$rhGxaIcTEvZr7CMVEu=>l30N~52^71U^<_uw6h@v@`BA2! z)ViU+wF#^$=5o44TpOj?#eyq*+A&c0ghrt8%}SiK)FgLk-;-^+ zXt|1}1vcKAAuR|?L*a8;04p%!M~U2~UC-OJK)DMtBQ#+ZttJgDFNA4zchA*T)cN(E zmpIMLU*c*NrCSV^qdLXD751DsO`#V#K1BVX4qI-B3Rg(zcvlg^mgY^V3Q*5RRQ4-8 z_kAlUisma2SNEx47euK5Y#eu_-gwRW0}M90hEI}eIJ9aU?t11^jSCn4>e~XLSF7Y3 z7JF)1ZbS_P<$<#y(*u@w!jF4FW_f~bxzi%cgP~B1K5N6GFYSAf=D_s5XomU0G9I%Y zPWc{&MItPR#^Le)?zsRkQMmHx^Cnn&;TrPzRVG`wyNH*U;|r3^2NY(z0lwikP}cWF z`p%R@?dy*7H~0&3ST>L9)b7#kwg+|n0#E&-FNf+Z_t7tpa711FogBPV`S3MW_FMGQ zJ@8Z}qXR4-l%p76mvcH`{Fu(^O;8H2@#LZUH#9p6!EX$AEYV$c`s zkPimL3kv>y=WQ+?KIAuim``%cAeBhA6g8}p_*FBH(#{vKi)CIz_D)DFXPql*ccC}O zRW;+Y6V@=&*d6QJUbRxPX+-_24tc-hYHEFaP-IAj*|-P5%xbWujQvu#TF>xigr_r! znuu7b(!PyYX=O#>;+0cGRx>Sy39(3y=TCf_BZ$<%m#inup$>o(3dA1Byfsip8S975-iVe7UklFm|$4&kaJ!n66_k-7-k}Z_?){LQe&wTeJ^CR{u6p+U#4_iSZZ1wjB-1gVGNQqnkk*-wFLj(eK8Ut{waU zb1jwb2I?Wg&98jSQWom8c?2>BWt*!3WQ?>fB$KguB9_sStno%x=JXPEFrT|hh~Po2 zSPzu3IL10O?9U(3{X8OLN-!l6DJVtgr$yYXeAPh~%(FECDe;$mIY7R4Miv1GEFk9x zpw`}E5M)qTr60D^;a#OCd0xP*w8y+my1^l8Qd*V`wLoj)GFFj;;esW2PMO=sbas{yX6asXIJ$|LW< zts$A+JaxoM({kv+2d@#bhl?#V#FZn_=8tTTvup?Vq!p!46W{be)EP=VlYE|UzAU}) zz})UzJVWi;9br0k&5>}sqwa_`TP*c}^$9+q)Dks#qEVg>p)71sqKF-YLP@UF{(>lp7;CHAWK;K0TZ_+?>EtZKprfU@;52a1IU8HNx-mnoZrb8| zP8FPb#T$0VE+G-l508;d{DSfC6#dbp(j|^i^I3z9?Qmkr+(dw^w??h}WTN{_ls-GuE~lF;1Urgbtq|Ud_r>wecb@?{{z? zX>X$&Ud+(I(5}5d^>&Z2m+qy=h#vR*lS084ATwUWZLg6PX1Ft+YI`0iI)ynij}{4X zrQE!Mr1m^-?kw<|VT0mG+5J{!;j;zJT`?_=P*09n+=e``CN|7rC$u~Ksg7LSMS(Q~ z51!n1htcK0q7*K-*u0?c8ZlvPXcNwXmFe0Or2}}R@?j@{ECCNZ6va1tZ>|ZOgGZ1j z9?mRkeSK%{X4O>J$@hyFsD)7s67Uldb>O93wQQiV%-FfbEY_@q>1VUstIJs|QgB`o1z**F#s z^joAYN~5{EQ_wZ~R6-nEV#HsQbNU59dT;G zovb$}pb=LdR^{W2Nh~8yWfq*vC_DvJxM=)2N`5x+N6Sl`3{Wl@$*BYol#0^idTuM` zJ=prt$REkxn6%dimg%99{(Dt6D67sTUR6l1F@9&Z9<)XgWK#x zVohUH6>_xRuw1^V**+BCZ@dZj97T*67OBO>6UUivH`<@ray~ym^E?bO=vKqFfK3Kv z`RKxs4raHacB<(XAeH`@0G*K2@ill_U@m=icT@F{k1PU3j4VBde`ThtW8%Z~A>)45ARjQCDXbH}_rS^IxHGp#utBEj3W3KSAU+$6I4s~9OWueETo!J-f~+DV8< z+VMtdcQ?M+?S}kl&uImYiIUJ-K0-te7W4sdWpS6Fqs-I!Tj{8Qp6lMn$Zm8uU)s{X z8|O}HN%8sEl4em&qv{VBq{}$@cCG{B z5~3DY$WRYSkO~z=sxRct5^G5bPZW;LF)(zY)HREgpRrkYV@H3^BTD6u+bJE~$cqr< zw@Gb3^|n*kHZ%Vnu6~B7pB4iM0C4kDuk8Q1R^<(x%>|sCOl%CTe^N)K?Tiepg?|#m z94!og0*38u|67h%*!)SJhUdvFimsktaqp#im9IpH-$fQc79gi259qPkEZ)XU?2uWW zRg?$8`vl;V%-Tk+rwpTGaxy)h%3AmF^78<#i+Q6~M4#>J4`NNEEzy~xZ&O*9q%}@7 zs9XBO#vSKSM<-OjPIDzO9JiAYFWrK14Am{uZT=S3zaCu~K%kZo&u*=k9L#xi6vyaG zQFD76MOE&=c1G;7Zivp<%%fRq+@3wgZg>k@AYQf|*Qyzy$tqc20m?F5nGbG@V#gW` z8RMb2oBxgiqa?)_G6&-;L#(HCoaJrs_ED{IUZ^$~)+e#0iZT!AJDb2V{Sen*70TO& zyI`*~#ZdLFhYP_#DTuoqQ0OS6j0o15r{}O&YoT5wCp|x_dD{#Y;Y}0P1ta?2VEh4* ztrRN5tL6UvoH@M9L z=%FKpf@iSp2P>C(*o<-Ng4qF#A?i!AxjXLG8%Gm`$rZxw;ZqSvv5@@sZ|N*~do5fb zKWR)T_>`kxaS|MHFh`-`fc`C%=i@EFk$O&)*_OVrgP4MWsZkE2RJB(WC>w}him zb3KV>1I&nHP9};o8Kw-K$wF8`(R?UMzNB22kSIn#dEe|V-CuMw8I7|#`qSB6dpYg$ zoaDHj%zV6*;`u`VVdsTBKv&g75Q`68rdQU6O>_wkMT9d!z@)q2E)R3(j$*C4jp$Fo z2pE>*ih{4Xzh}W+5!Qw)#M*^E(0X-6-!%wj@4*^)8F=N*0Y5Or+>d= zhMNs@R~>R9;KmyP@I@bpU3&w?)jj0rGrb@q)P>wLVbz1!TZY$#+H-mK6B^0{vdvt0 zaJ0~7p%I#1PpPm1DvBzh7*UsCl^I5^`@XzPzbg+v3T_WyKN?TJ9J=57v^IUO`aQN} z@>Y>WIj+gT@-sobU-tW%L5GP(qY?Eep&I;@osY}O*3i1Ar?Sv|EI6S-pK_!~*A$K| zs-hHESqd`vv;zIzgv2ho5-hsIL5Ke~siJ(v0`Qm7W_Rms2rB67=p&HGRhA-)$p-BS zvXSmgGIGgeJMBcsgp=L8U3Ep$VPBFhvJ!3M5{pocGBS~iZj0({9Jt9nbC{Z$LVb%= zGqzRBjlqkAU{#sOX56})^QjX;jQ26M`poAFIZ#H31td9sQlgBBrfIYgDC9+kO~}s{ zb1i*{#{5tPWhv4pecAZygXG>?5xKx7iPXd?nR;QaIfhlhqNBaLDy>9Yd1Sf3P!s4~ zhfHaFGsIFy&ZM=6^qc>>V>o!zk%5Lk5BtS7oU=YfjWUN;c zrh$6Cyr%KC@QNTzTZvb)QXQkV)01MEY+EzC%CJx)Q&6MM={paB}Dp=qCn^eJ}5LeXG9Gqynt0ir>DvSIZ=i?*_xR3=% zppf1w51ypF2KL6ug zCm}eCi>&>xT;Idzh^PmtDWrU(&eC2hAt(nmd#?;W)*&4lb2Z2Ykv*XLNDEm`_1n3C z`l!wZwiF9b?mN@z?s~>v%hT01C{E3md6M5_Xi3fKD6s26Tt~Z>8|~Ao9ds!cF_Y1| zRG>!=TD0k0`|T*)oX!SlSt8g4Uh@nc(QosCoen@i*ZCSyh|IliliuhEw$8?4ZL9N2 zMQ%%S=3Tj_QilhHW@cSr1UYTtDem{A-ZxyCa$K9A%(!`X_?ieJzXbfERST|JxqmbL zHe!hSqYk|!=!$8CJ5>q}Pj63@Q#PO{gpVb+0-qHFM`j5x_s#~dxvy5u62vywq8upP z_)N)3n9cn7YEf2D8L}x0#_B_~>HT8;;8JC5q+}1gEyd%XqYvY?deQzwD1Lx{ghI3; zv?f;&6CY$H&dDL$k#)hb)5lIqUZ~oU!z)hMI!B9THhw?9!}ykqpFJ|hB?JjV9uwqb z3_70pMV^C7I<3Cg&yMi8JJ3V2gYTOMV=IopfZ#1o>&+j-mB-V${Ok(f?I3{+vR~zE_RR$?9xI~^% z53~ z&bCl+6UeKkUWJ-%mnK{9K>?(3BM3C`@xi}v8)q#;YJhMr5dWvMtAL7X``!bHv~(%m zH8d#Q4N6G~lEW}aGn9ZZNT?v9bV$emf)dg#ASDV?(nu+wpu!_X;(vL<<1zBo-~X&N z>keyizVGaP&c65DbIyEwFn2%(L`P424ZI3nFBA%w{yJ?E} zlwSKF;jIhs(!TFOdMUW|(=qHjr#U-k>`>1u1_yL5Gyy;7@WTOt_)nfIp{D9kwR8f0 z;^Fq=iF(&yd|z30&+I`FBM-P6ouHQ@96TkIe@9=pDDL#_zgXos)-ri5lX-&2D~DsI z4R>xVM$c&aFLgFjwq{1I;jpODOx|n*#@e2+Wgdkm(E(Fad_)peD`1^CJ2TpglmgoC)F(Z)F7y2rzzDU^4wvO{bzw{mzSs4tF;*qabKkC?D!j!tbF z4D_6zbqFVI>n@2-Qmg1BiDdD}>E(72)aMv1Y9duOxwlG|E!L(QmQ#j5vmN@a7v{zIt3qQSP?96^$ITE=h~sLn|N|v8YqmA~-0HWgcPHZ@!3Dzm2X{Bozc{qm>J`Ehp}`FQ%Ecbw%+|H8f`pykvo-%&0a z?&ZtJF*{#AYs8Z|z(IFI8sBiZs)L!C9#1W@;hEInZZZdPz2ZnmhoSP9VHQt7mzZUZ zhM!!5IJbe4Z@zEoMjKaxH&Px8p}1<0YmtWwcG@ZPY@*oQSteU zRy+W=Rs>sJ##v^8EJJt0=5---o<@^?fOEp=N<~xXvcf?$gXD0zVHziRMMmC#Mp3o ze(eT!dvjmXp9_C%pV_>{H=nsqYO)n1J?Ihi zjy7f00`|S<;)I!ZyUO{~#+wXX)z(BWsN|$7n9s}H%ZzE8YQv#vRTHjq@D%tYyfe=3)|7jYxRT#E16nFk&1jFC6CH5d4kiJCVq+%r_$Rec7=G!GuZ-0*$5N2GqXB(dqWPS1Um4{xgi2k=;eO_LDy&GR=Q!)bjKY{f!0yoc0Rol&!E`2BkI$5y4U^*k0=GyL-m8XJL%8prM%;fwyX9M^ zs48n3Oh#a>FVWI7dsm~*l0$^J)lxnfTTw~1ceZ73yNvNurwd`;+^1XuucaFN85M8? z$fNl!D9g*O>6IE^POaoDq`86Sw0t4%jIi`&*EEZI?wwOiEvH8(qpfyDvAe`4pWf7k z3-pFgeT{qtj)B!1ZamZ5g3z6Nd40P(%^Kf@#!uzbIk~8w`9wbhWc~1E|sw6-FsOqrhb2DLDwlaq@)Y zAi$KoA=Vyn=Yxqxtf7wu*$47Ht>WZi{AdeN79#9ws~CtE;~gC$q7T>*5yKK3VT)Q=sllRR}lBIGd17+bOu| zeUeUrMgF=Gjk-{epAyUd_KNgwZK_Pz=H$+{4~E_ZRa3IJpU~IZ5U4Z3l%u3{Ls~`H z(iysmm+!HBJTC-$EpHM9yrXUM^_FZ(3sdmsyZ6=lU8bb3V(WK>P0$l~#QA&NMj@OA z*OQ>^-s_D-bda022~!G!bTh7@FR>t!1r`Js1;4$(^_*hH-_pUPf5C}K-v$%i#KBB! zU{~a7)R>ix z#LA|<6v#rwKkB1JBLWkWu#M0#8i1J0e4dFDP3jrlFfxhkDs%Q~)e6e7fR$U?e$<{x zfZb0?UMsB|E}Fk)@|^{)_^L7O%rp1GRNig@bUX(^6}6HoGi8IXoSKpI1A(GV)uA=7 zOXG&KjZYVjYn6}2YV0yfnKsnpDlF)h$Gv--|6$BsWFg|IWnp|#sk}zOAb6Bb?vb@t zs^7=4IdiKE_rUT@rG!D4Zy zcnas#XT77V&%igMXY(lQS|)lgO{pN9!P-94KeZH_+PK5jESYCSPMN)=D(JIAVeB%D zI_>_lvD;pylkZ#Ral0IzC6ei$J$4NnGw(pnVd`&aaNT5mfq-4)aPjj(v;`VvJ6Xxjm@3DX+Kju z@9-h++s7x>idTEL zd)ptYy?P2$S*_DI;eMR0ZdAuS)~fGEZEguO&+3AwW@Sw$&KvgJr6aGK*Ar;0wx`lr z7V&!+9C7`VcV^t+Wj~AweOGQL!)0)serr$8Fez7kC(VSVRdjqpQuq964RW^2euIre zh10&Tv)|dj*CoRozrW<4y_+5}3EGRok+G7ODl3-CF1r?JYDdw&NbcVT=7ljq_K+8bMeG3uRw@3=cof?j+v+WaKI`WqwByf#7aFK3 z0+R34xQ-6nxQ&9xJKl}`C9FlUe1-h^i?5fr5kjot#MA-$%k106t>*gM+yF3m2X#=1tt07`cK)37dA^A4d8%6R>@0U-UZ~wSvzMlK$tlm~aK`%e8|quXyH`aLM0#Dcu%sqEsKV%i zVn_*W-Qbnl)h?RP>)$rZ5JL!*H;Z{ zk7(FB`lo~h&zB|S6j-Na;y$QM*rn^tkO{>#DWZN@IwJps3*Nm&ox0{{;=J~hvPb-* zvAOEPImrdq()yl~`j`Q;R1Y%CdLKKw*;gtNaM~WDO95YXsTjKCOdRD2Is@aVRTYFD zpS=_EB!@Ub&c*JmNMF=F+)Bq)52|=83IEG;M5(Ol*97!W(S-5X-5w&7->`1Pw-0Ml zpA>jaofnyPQTCzoIG}OK9j^nn>F>jC#$iSnJY8y6ue4nxs@3HtfNx01XVK7NcX#Cu z34g-z=0!7ip&@wI>>6ynJYyFTEgH6DA?b>~V%2s_@NPDza5&6cno!S(|85*74}6_M z%s1c4`B{lqMu``(4~Jk#_`^=tu36TgXPv_}{lhhyi(rrSM_uoVVNuZOuxCXom9|wg zNf&BtzX=hVi*4dG&1J!^QW;O%fQ$jVH=W74B8WR)*tM1{(@cHRqiS_W6R^h8uxd@zV>KNI zR(-LNNkLqh>e=CmL|q9sRHm#15%q$o7_GQMp8FLX-HGnJ<+(;k{Q%+Sk+!^mM+2#1y9+gG2IDZGt%;Cfk{+ zT5}^x=!i2$tnH_se6eC zkn;kK>%ICpo=X&=cSsbxQ|AjJ;5Ff;AyIj>$YA8cw*?W^Nn}S|1jrbf@Bd zr82I8KlOh4#5C0sw3oVvuC0NFPKH4S0$~F$U4JM1Im$B%%oGm_5$Lnr{#Pv}eL1k& zMP(pG$MI^8&!nYffq#$zJ^3GF|cC%2d4V@qKV#fu6u2O

k)oKu82Fu=RODzQrHPEC+Mz{hW(G7VuCl8g1ou-Ot!41bp_>OC1&@A_6e*hc)1X zMuDvzEZyB*fW1^+7dL0%ofr;-xT6B@0~|VazatI{60!X=po^uOr6UB$1POKmuI_&b zOL&O+w*!>`k+y%?Z|wm4$@_1|WC|pKM(F{k8TR$-4hs?i|GBc9)qa{vYq)~5qa(2N zsR?s}0Pp^ufVGEB8oE9VCFa0K$x0HSpem!tIyR69y0rnjg8cqjmWyz7*Kx3~X> z|BZX}Y;oVB1HX@l9_-y7dI*WgruY@?rC&64`}3W`ECA>O@Y#Q@JS<4WBF(QbwJqHM zt)fE#6jTSyZ^E8y0INaIf!omWjvS=@15`O%V2CKg+}z=M9##kLKRN0uJuK250bXVU zwzT&n@30^dzKnlL^us;wClg?CKWEtiEb#zhPVx{PxFQiwEPp^C53zN21EdZAz?3D& zC6fK|_!S5Mq&0z;xWGLEv}!zjfpRg_orp7|fXMx=uP!@X`yT@5(N_Hza}p5fBk&|)J7fZ`NQ9Nz@5xT? zi?iV$q+bG!2LZUpF)>Yl!u;DEHV3!i{ipcJm_8Gj@Dac%N3|SQVGqRhrJ;WOR|CtrwzPTW^&$A6!A$E)h7xohm>hA8p{PUZ~ z_&zeg@OL3PxPtzkfsNZAqXCZ8Is7yQ+plm~8;}|~DEkv&f@?q5hB*OGQYXuwVQOp0 z?QQ`6qyp|-$47wjuV74IE_x2I17$+grwMBE^25d<5!lYhnszuh|5Yk;RB+Uk*hk=m zu73=E^7ul{40{A^?Rg^fq0ZfZO@C1HupR*_d;J>lkFv6&x&}4N;t}1T@2}~AC^<3b zA}RxFPPZe5R{_6dIN9N-GT29Oa}RzA2ekKuEVZbuMOB?Xf**`N5&m}?)TjigdY(rF z?~+a=`0);TlDa1j)1G`AfW? zRl883QPq=w zbB|bHEx%_u*$t@Yl#Vc;y*?2W^|^NJ)DmioQFr~1&>MSBL_b(YIpGWdDm3bT=Mgm1 e+h0K+-~H6qzyuy}`;+tYAZFmzUSVSYum1yJqxCBQ literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index 32b8e8c8c8..167509d2b3 100644 --- a/pom.xml +++ b/pom.xml @@ -867,6 +867,7 @@ spring-jersey spring-jinq spring-kafka-2 + spring-kafka-3 spring-kafka spring-katharsis spring-mobile diff --git a/spring-kafka-3/pom.xml b/spring-kafka-3/pom.xml new file mode 100644 index 0000000000..972412d18e --- /dev/null +++ b/spring-kafka-3/pom.xml @@ -0,0 +1,36 @@ + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + 4.0.0 + + spring-kafka-3 + jar + + spring-kafka-3 + + + + org.springframework.kafka + spring-kafka + + + com.fasterxml.jackson.core + jackson-databind + + + org.springframework.kafka + spring-kafka-test + test + + + + + 3.0.12 + + diff --git a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/SomeData.java b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/SomeData.java new file mode 100644 index 0000000000..eb2e57c33d --- /dev/null +++ b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/SomeData.java @@ -0,0 +1,37 @@ +package com.baeldung.spring.kafka; + +import java.time.Instant; + +public class SomeData { + + private String id; + private String type; + private String status; + private Instant timestamp; + + public SomeData() { + } + + public SomeData(String id, String type, String status, Instant timestamp) { + this.id = id; + this.type = type; + this.status = status; + this.timestamp = timestamp; + } + + public String getId() { + return id; + } + + public String getType() { + return type; + } + + public String getStatus() { + return status; + } + + public Instant getTimestamp() { + return timestamp; + } +} diff --git a/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ListenerConfiguration.java b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ListenerConfiguration.java new file mode 100644 index 0000000000..e35b1ee415 --- /dev/null +++ b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ListenerConfiguration.java @@ -0,0 +1,42 @@ +package com.baeldung.spring.kafka; + +import java.util.Map; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; +import org.springframework.kafka.core.ConsumerFactory; +import org.springframework.kafka.core.DefaultKafkaConsumerFactory; +import org.springframework.kafka.support.serializer.JsonDeserializer; + +@Configuration +public class ListenerConfiguration { + + @Bean("messageListenerContainer") + public ConcurrentKafkaListenerContainerFactory messageListenerContainer() { + ConcurrentKafkaListenerContainerFactory container = new ConcurrentKafkaListenerContainerFactory<>(); + container.setConsumerFactory(someDataConsumerFactory()); + return container; + } + + @Bean + public ConsumerFactory someDataConsumerFactory() { + JsonDeserializer payloadJsonDeserializer = new JsonDeserializer<>(); + payloadJsonDeserializer.trustedPackages("com.baeldung.spring.kafka"); + return new DefaultKafkaConsumerFactory<>( + consumerConfigs(), + new StringDeserializer(), + payloadJsonDeserializer + ); + } + + @Bean + public Map consumerConfigs() { + return Map.of( + ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "PLAINTEXT://localhost:9092", + ConsumerConfig.GROUP_ID_CONFIG, "some-group-id" + ); + } +} \ No newline at end of file diff --git a/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ProducerConfiguration.java b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ProducerConfiguration.java new file mode 100644 index 0000000000..7373424841 --- /dev/null +++ b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ProducerConfiguration.java @@ -0,0 +1,40 @@ +package com.baeldung.spring.kafka; + +import org.apache.kafka.clients.producer.ProducerConfig; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.core.DefaultKafkaProducerFactory; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.core.ProducerFactory; +import org.springframework.kafka.support.serializer.JsonSerializer; +import org.springframework.kafka.support.serializer.StringOrBytesSerializer; + +import java.time.Instant; +import java.util.Map; + +@Configuration +public class ProducerConfiguration { + + @Bean + public KafkaTemplate kafkaTemplate() { + return new KafkaTemplate<>(producerFactory()); + } + + @Bean + public ProducerFactory producerFactory() { + JsonSerializer jsonSerializer = new JsonSerializer<>(); + jsonSerializer.setAddTypeInfo(true); + return new DefaultKafkaProducerFactory<>( + producerFactoryConfig(), + new StringOrBytesSerializer(), + jsonSerializer + ); + } + + @Bean + public Map producerFactoryConfig() { + return Map.of( + ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "PLAINTEXT://localhost:9092" + ); + } +} \ No newline at end of file diff --git a/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/TrustedPackagesLiveTest.java b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/TrustedPackagesLiveTest.java new file mode 100644 index 0000000000..fa4b79cd65 --- /dev/null +++ b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/TrustedPackagesLiveTest.java @@ -0,0 +1,57 @@ +package com.baeldung.spring.kafka; + +import java.time.Instant; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import org.apache.kafka.clients.producer.ProducerRecord; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.stereotype.Component; + +/** + * This test requires a running instance of kafka to be present + */ +@SpringBootTest +public class TrustedPackagesLiveTest { + + @Autowired + private KafkaTemplate kafkaTemplate; + + @SpyBean + TestConsumer testConsumer; + + @Test + void givenMessageInTheTopic_whenTypeInfoPackageIsTrusted_thenMessageIsSuccessfullyConsumed() throws InterruptedException { + CountDownLatch latch = new CountDownLatch(1); + + Mockito.doAnswer(invocationOnMock -> { + try { + latch.countDown(); + return invocationOnMock.callRealMethod(); + } catch (Exception e) { + return null; + } + }).when(testConsumer).onMessage(Mockito.any()); + + SomeData someData = new SomeData("1", "active", "sent", Instant.now()); + kafkaTemplate.send(new ProducerRecord<>("sourceTopic", null, someData)); + + Assertions.assertTrue(latch.await(20L, TimeUnit.SECONDS)); + } + + @Component + static class TestConsumer { + + @KafkaListener(topics = "sourceTopic", containerFactory = "messageListenerContainer") + public void onMessage(SomeData someData) { + + } + } +} From a58783707caf2a8b3c1d27f13393724c92a8b69d Mon Sep 17 00:00:00 2001 From: ovidiu-mihai98 <138307181+ovidiumihaitacu@users.noreply.github.com> Date: Thu, 16 Nov 2023 11:50:18 +0200 Subject: [PATCH 114/294] [BAEL-7067] Difference Between Entity and DTO --- .../entitydtodifferences/Application.java | 12 +++ .../controller/UserController.java | 39 ++++++++ .../entitydtodifferences/dto/BookDto.java | 30 ++++++ .../dto/UserCreationDto.java | 48 ++++++++++ .../dto/UserResponseDto.java | 48 ++++++++++ .../entitydtodifferences/entity/Book.java | 39 ++++++++ .../entitydtodifferences/entity/User.java | 90 ++++++++++++++++++ .../mapper/UserMapper.java | 34 +++++++ .../repository/UserRepository.java | 11 +++ .../ApplicationIntegrationTest.java | 15 +++ .../UserControllerIntegrationTest.java | 93 +++++++++++++++++++ .../entity/BookUnitTest.java | 19 ++++ .../entity/UserUnitTest.java | 51 ++++++++++ .../mapper/UserMapperUnitTest.java | 87 +++++++++++++++++ 14 files changed, 616 insertions(+) create mode 100644 spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/Application.java create mode 100644 spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/controller/UserController.java create mode 100644 spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/BookDto.java create mode 100644 spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserCreationDto.java create mode 100644 spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserResponseDto.java create mode 100644 spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/Book.java create mode 100644 spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/User.java create mode 100644 spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/mapper/UserMapper.java create mode 100644 spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/repository/UserRepository.java create mode 100644 spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/ApplicationIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/controller/UserControllerIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/BookUnitTest.java create mode 100644 spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/UserUnitTest.java create mode 100644 spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/mapper/UserMapperUnitTest.java diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/Application.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/Application.java new file mode 100644 index 0000000000..4a780ac17a --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/Application.java @@ -0,0 +1,12 @@ +package com.baeldung.entitydtodifferences; + +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-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/controller/UserController.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/controller/UserController.java new file mode 100644 index 0000000000..66cecacd9b --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/controller/UserController.java @@ -0,0 +1,39 @@ +package com.baeldung.entitydtodifferences.controller; + +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.entitydtodifferences.dto.UserCreationDto; +import com.baeldung.entitydtodifferences.dto.UserResponseDto; +import com.baeldung.entitydtodifferences.mapper.UserMapper; +import com.baeldung.entitydtodifferences.repository.UserRepository; + +@RestController +@RequestMapping("/users") +public class UserController { + + private final UserRepository userRepository; + + public UserController(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @GetMapping + public List getUsers() { + return userRepository.findAll() + .stream() + .map(UserMapper::toDto) + .collect(Collectors.toList()); + } + + @PostMapping + public UserResponseDto createUser(@RequestBody UserCreationDto userCreationDto) { + return UserMapper.toDto(userRepository.save(UserMapper.toEntity(userCreationDto))); + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/BookDto.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/BookDto.java new file mode 100644 index 0000000000..a5ee25f105 --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/BookDto.java @@ -0,0 +1,30 @@ +package com.baeldung.entitydtodifferences.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class BookDto { + + @JsonProperty("NAME") + private final String name; + + @JsonProperty("AUTHOR") + private final String author; + + // Default constructor for Jackson deserialization + public BookDto() { + this(null, null); + } + + public BookDto(String name, String author) { + this.name = name; + this.author = author; + } + + public String getName() { + return name; + } + + public String getAuthor() { + return author; + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserCreationDto.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserCreationDto.java new file mode 100644 index 0000000000..0859c042cf --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserCreationDto.java @@ -0,0 +1,48 @@ +package com.baeldung.entitydtodifferences.dto; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class UserCreationDto { + + @JsonProperty("FIRST_NAME") + private final String firstName; + + @JsonProperty("LAST_NAME") + private final String lastName; + + @JsonProperty("ADDRESS") + private final String address; + + @JsonProperty("BOOKS") + private final List books; + + // Default constructor for Jackson deserialization + public UserCreationDto() { + this(null, null, null, null); + } + + public UserCreationDto(String firstName, String lastName, String address, List books) { + this.firstName = firstName; + this.lastName = lastName; + this.address = address; + this.books = books; + } + + public String getFirstName() { + return firstName; + } + + public String getLastName() { + return lastName; + } + + public String getAddress() { + return address; + } + + public List getBooks() { + return books; + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserResponseDto.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserResponseDto.java new file mode 100644 index 0000000000..910689dd41 --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserResponseDto.java @@ -0,0 +1,48 @@ +package com.baeldung.entitydtodifferences.dto; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class UserResponseDto { + + @JsonProperty("ID") + private final Long id; + + @JsonProperty("FIRST_NAME") + private final String firstName; + + @JsonProperty("LAST_NAME") + private final String lastName; + + @JsonProperty("BOOKS") + private final List books; + + // Default constructor for Jackson deserialization + public UserResponseDto() { + this(null, null, null, null); + } + + public UserResponseDto(Long id, String firstName, String lastName, List books) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + this.books = books; + } + + public Long getId() { + return id; + } + + public String getFirstName() { + return firstName; + } + + public String getLastName() { + return lastName; + } + + public List getBooks() { + return books; + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/Book.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/Book.java new file mode 100644 index 0000000000..88e895467a --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/Book.java @@ -0,0 +1,39 @@ +package com.baeldung.entitydtodifferences.entity; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "books") +public class Book { + + @Id + private String name; + private String author; + + // Default constructor for JPA deserialization + public Book() { + } + + public Book(String name, String author) { + this.name = name; + this.author = author; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/User.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/User.java new file mode 100644 index 0000000000..6a404e9f1f --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/User.java @@ -0,0 +1,90 @@ +package com.baeldung.entitydtodifferences.entity; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +@Entity +@Table(name = "users") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String firstName; + private String lastName; + private String address; + + @OneToMany(cascade = CascadeType.ALL) + private List books; + + // Default constructor for JPA deserialization + public User() { + } + + public User(String firstName, String lastName, String address, List books) { + this.firstName = firstName; + this.lastName = lastName; + this.address = address; + this.books = books; + } + + public String getNameOfMostOwnedBook() { + Map bookOwnershipCount = books.stream() + .collect(Collectors.groupingBy(Book::getName, Collectors.counting())); + return bookOwnershipCount.entrySet() + .stream() + .max(Map.Entry.comparingByValue()) + .map(Map.Entry::getKey) + .orElse(null); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public List getBooks() { + return books; + } + + public void setBooks(List books) { + this.books = books; + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/mapper/UserMapper.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/mapper/UserMapper.java new file mode 100644 index 0000000000..0c6899f98b --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/mapper/UserMapper.java @@ -0,0 +1,34 @@ +package com.baeldung.entitydtodifferences.mapper; + +import java.util.stream.Collectors; + +import com.baeldung.entitydtodifferences.dto.BookDto; +import com.baeldung.entitydtodifferences.dto.UserCreationDto; +import com.baeldung.entitydtodifferences.dto.UserResponseDto; +import com.baeldung.entitydtodifferences.entity.Book; +import com.baeldung.entitydtodifferences.entity.User; + +public class UserMapper { + + public static UserResponseDto toDto(User entity) { + return new UserResponseDto(entity.getId(), entity.getFirstName(), entity.getLastName(), entity.getBooks() + .stream() + .map(UserMapper::toDto) + .collect(Collectors.toList())); + } + + public static User toEntity(UserCreationDto dto) { + return new User(dto.getFirstName(), dto.getLastName(), dto.getAddress(), dto.getBooks() + .stream() + .map(UserMapper::toEntity) + .collect(Collectors.toList())); + } + + public static BookDto toDto(Book entity) { + return new BookDto(entity.getName(), entity.getAuthor()); + } + + public static Book toEntity(BookDto dto) { + return new Book(dto.getName(), dto.getAuthor()); + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/repository/UserRepository.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/repository/UserRepository.java new file mode 100644 index 0000000000..4529de698e --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/repository/UserRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.entitydtodifferences.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.baeldung.entitydtodifferences.entity.User; + +@Repository +public interface UserRepository extends JpaRepository { + +} diff --git a/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/ApplicationIntegrationTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/ApplicationIntegrationTest.java new file mode 100644 index 0000000000..839bb381ec --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/ApplicationIntegrationTest.java @@ -0,0 +1,15 @@ +package com.baeldung.entitydtodifferences; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class ApplicationIntegrationTest { + + @Test + public void contextLoads() { + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/controller/UserControllerIntegrationTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/controller/UserControllerIntegrationTest.java new file mode 100644 index 0000000000..83e359e378 --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/controller/UserControllerIntegrationTest.java @@ -0,0 +1,93 @@ +package com.baeldung.entitydtodifferences.controller; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Arrays; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import com.baeldung.entitydtodifferences.entity.Book; +import com.baeldung.entitydtodifferences.entity.User; +import com.baeldung.entitydtodifferences.repository.UserRepository; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +@SpringBootTest +@AutoConfigureMockMvc +public class UserControllerIntegrationTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private UserRepository userRepository; + + @Autowired + private ObjectMapper objectMapper; + + @BeforeEach + public void beforeEach() { + userRepository.deleteAll(); + } + + @Test + public void givenUsersAreExisting_whenGetUsers_thenUsersAreReturned() throws Exception { + //given + Book book1 = new Book("Book1", "Author1"); + Book book2 = new Book("Book2", "Author2"); + User savedUser = userRepository.save(new User("John", "Doe", "123 Main St", Arrays.asList(book1, book2))); + String expectedJson = String.format( + "[{\"ID\":%s,\"FIRST_NAME\":\"John\",\"LAST_NAME\":\"Doe\",\"BOOKS\":[{\"NAME\":\"Book1\",\"AUTHOR\":\"Author1\"},{\"NAME\":\"Book2\",\"AUTHOR\":\"Author2\"}]}]", + savedUser.getId()); + //when + MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/users") + .contentType(MediaType.APPLICATION_JSON)) + .andReturn(); + //then + assertEquals(expectedJson, result.getResponse() + .getContentAsString()); + } + + @Test + public void givenValidUser_whenPostUser_thenUserIsCreated() throws Exception { + //given + String user = "{\"FIRST_NAME\":\"John\",\"LAST_NAME\":\"Doe\",\"BOOKS\":[{\"NAME\":\"Book1\",\"AUTHOR\":\"Author1\"},{\"NAME\":\"Book2\",\"AUTHOR\":\"Author2\"}]}"; + //when + MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post("/users") + .content(user) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andReturn(); + JsonNode responseJson = objectMapper.readTree(result.getResponse() + .getContentAsString()); + //then + assertEquals("John", responseJson.get("FIRST_NAME") + .asText()); + assertEquals("Doe", responseJson.get("LAST_NAME") + .asText()); + assertTrue(responseJson.has("BOOKS")); + JsonNode booksArray = responseJson.get("BOOKS"); + assertEquals(2, booksArray.size()); + assertEquals("Book1", booksArray.get(0) + .get("NAME") + .asText()); + assertEquals("Author1", booksArray.get(0) + .get("AUTHOR") + .asText()); + assertEquals("Book2", booksArray.get(1) + .get("NAME") + .asText()); + assertEquals("Author2", booksArray.get(1) + .get("AUTHOR") + .asText()); + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/BookUnitTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/BookUnitTest.java new file mode 100644 index 0000000000..60e229b7c9 --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/BookUnitTest.java @@ -0,0 +1,19 @@ +package com.baeldung.entitydtodifferences.entity; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import org.junit.Test; + +public class BookUnitTest { + + @Test + public void whenBookInitialized_thenInitializedCorrectly() { + //when + Book book = new Book("Book1", "Author1"); + //then + assertNotNull(book); + assertEquals("Book1", book.getName()); + assertEquals("Author1", book.getAuthor()); + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/UserUnitTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/UserUnitTest.java new file mode 100644 index 0000000000..0d1efe7129 --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/UserUnitTest.java @@ -0,0 +1,51 @@ +package com.baeldung.entitydtodifferences.entity; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.util.Arrays; +import java.util.Collections; + +import org.junit.Test; + +public class UserUnitTest { + + @Test + public void whenUserInitialized_thenInitializedCorrectly() { + //when + Book book1 = new Book("Book1", "Author1"); + Book book2 = new Book("Book2", "Author2"); + User user = new User("John", "Doe", "123 Main St", Arrays.asList(book1, book2)); + //then + assertNotNull(user); + assertEquals("John", user.getFirstName()); + assertEquals("Doe", user.getLastName()); + assertEquals("123 Main St", user.getAddress()); + assertEquals(2, user.getBooks() + .size()); + } + + @Test + public void givenUserOwningMultipleBooks_whenGetNameOfMostOwnedBook_thenComputedCorrectly() { + //given + Book book1 = new Book("Book1", "Author1"); + Book book2 = new Book("Book2", "Author2"); + Book book3 = new Book("Book2", "Author3"); + User user = new User("John", "Doe", "123 Main St", Arrays.asList(book1, book2, book3)); + //when + String mostOwnedBook = user.getNameOfMostOwnedBook(); + //then + assertEquals("Book2", mostOwnedBook); + } + + @Test + public void givenUserWithNoBooks_henGetNameOfMostOwnedBook_thenReturnedNull() { + //given + User user = new User("John", "Doe", "123 Main St", Collections.emptyList()); + //when + String mostOwnedBook = user.getNameOfMostOwnedBook(); + //then + assertNull(mostOwnedBook); + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/mapper/UserMapperUnitTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/mapper/UserMapperUnitTest.java new file mode 100644 index 0000000000..5154898877 --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/mapper/UserMapperUnitTest.java @@ -0,0 +1,87 @@ +package com.baeldung.entitydtodifferences.mapper; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; + +import com.baeldung.entitydtodifferences.dto.BookDto; +import com.baeldung.entitydtodifferences.dto.UserCreationDto; +import com.baeldung.entitydtodifferences.dto.UserResponseDto; +import com.baeldung.entitydtodifferences.entity.Book; +import com.baeldung.entitydtodifferences.entity.User; + +public class UserMapperUnitTest { + + @Test + public void givenUserEntity_whenMappedToDto_thenMappedCorrectly() { + //given + Book book1 = new Book("Book1", "Author1"); + Book book2 = new Book("Book2", "Author2"); + User user = new User("John", "Doe", "123 Main St", Arrays.asList(book1, book2)); + //when + UserResponseDto userDto = UserMapper.toDto(user); + //then + assertEquals(user.getId(), userDto.getId()); + assertEquals(user.getFirstName(), userDto.getFirstName()); + assertEquals(user.getLastName(), userDto.getLastName()); + List bookDtos = userDto.getBooks(); + assertEquals(2, bookDtos.size()); + assertEquals(book1.getName(), bookDtos.get(0) + .getName()); + assertEquals(book1.getAuthor(), bookDtos.get(0) + .getAuthor()); + assertEquals(book2.getName(), bookDtos.get(1) + .getName()); + assertEquals(book2.getAuthor(), bookDtos.get(1) + .getAuthor()); + } + + @Test + public void givenUserDto_whenMappedToEntity_thenMappedCorrectly() { + //given + BookDto bookDto1 = new BookDto("Book3", "Author3"); + BookDto bookDto2 = new BookDto("Book4", "Author4"); + UserCreationDto userDto = new UserCreationDto("Jane", "Doe", "456 Oak St", Arrays.asList(bookDto1, bookDto2)); + //when + User user = UserMapper.toEntity(userDto); + //then + assertEquals(user.getFirstName(), userDto.getFirstName()); + assertEquals(user.getLastName(), userDto.getLastName()); + assertEquals(user.getAddress(), userDto.getAddress()); + List books = user.getBooks(); + assertEquals(2, books.size()); + assertEquals(bookDto1.getName(), books.get(0) + .getName()); + assertEquals(bookDto1.getAuthor(), books.get(0) + .getAuthor()); + assertEquals(bookDto2.getName(), books.get(1) + .getName()); + assertEquals(bookDto2.getAuthor(), books.get(1) + .getAuthor()); + } + + @Test + public void givenBookEntity_whenMappedToDto_thenMappedCorrectly() { + //given + Book book = new Book("Book5", "Author5"); + //when + BookDto bookDto = UserMapper.toDto(book); + //then + assertEquals(book.getName(), bookDto.getName()); + assertEquals(book.getAuthor(), bookDto.getAuthor()); + } + + @Test + public void givenBookDto_whenMappedToEntity_thenMappedCorrectly() { + //given + BookDto bookDto = new BookDto("Book6", "Author6"); + //when + Book book = UserMapper.toEntity(bookDto); + //then + assertEquals(bookDto.getName(), book.getName()); + assertEquals(bookDto.getAuthor(), book.getAuthor()); + } +} From 720789d02679baac9f3e4d9dd3036c030124e190 Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Fri, 1 Dec 2023 09:14:50 +0000 Subject: [PATCH 115/294] MismatchedInputException: Cannot deserialize instance --- .../mismatchedinputexception/Animals.java | 27 +++++++++++++ .../mismatchedinputexception/Book.java | 27 +++++++++++++ .../MismatchedinputExceptionUnitTest.java | 39 +++++++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Animals.java create mode 100644 jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Book.java create mode 100644 jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mismatchedinputexception/MismatchedinputExceptionUnitTest.java diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Animals.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Animals.java new file mode 100644 index 0000000000..1ad1014414 --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Animals.java @@ -0,0 +1,27 @@ +package com.baeldung.mismatchedinputexception; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class Animals { + + private final int id; + private String name; + + + public Animals(@JsonProperty("id") int id, @JsonProperty("name")String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Book.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Book.java new file mode 100644 index 0000000000..28fe118ac5 --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Book.java @@ -0,0 +1,27 @@ +package com.baeldung.mismatchedinputexception; + +public class Book { + + private int id; + private String title; + + public Book(int id, String title) { + this.id = id; + this.title = title; + } + + public Book() { + } + + public int getId() { + return id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mismatchedinputexception/MismatchedinputExceptionUnitTest.java b/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mismatchedinputexception/MismatchedinputExceptionUnitTest.java new file mode 100644 index 0000000000..178ad1a8db --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mismatchedinputexception/MismatchedinputExceptionUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.mismatchedinputexception; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class MismatchedinputExceptionUnitTest { + + @Test + void givenJsonString_whenDeserializingToJavaObjectWithImmutableField_thenIdIsCorrect() throws JsonProcessingException { + String jsonString = "{\"id\":10,\"name\":\"Dog\"}"; + ObjectMapper mapper = new ObjectMapper(); + Animals animal = mapper.readValue(jsonString, Animals.class); + assertEquals(animal.getId(),10); + } + + @Test + void givenJsonString_whenDeserializingToBook_thenIdIsCorrect() throws JsonProcessingException { + String jsonString = "{\"id\":\"10\",\"title\":\"Harry Potter\"}"; + ObjectMapper mapper = new ObjectMapper(); + Book book = mapper.readValue(jsonString, Book.class); + assertEquals(book.getId(),10); + } + + + @Test + void givenJsonString_whenDeserializingToBookList_thenTitleIsCorrect() throws JsonProcessingException { + String jsonString = "[{\"id\":\"10\",\"title\":\"Harry Potter\"}]"; + ObjectMapper mapper = new ObjectMapper(); + List book = mapper.readValue(jsonString, new TypeReference>(){}); + assertEquals(book.get(0).getTitle(),"Harry Potter"); + } + +} \ No newline at end of file From c7118d9960e7734d63f3391404ba4f2087dbcafc Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Fri, 1 Dec 2023 13:16:51 +0200 Subject: [PATCH 116/294] [JAVA-27541] Upgraded spring-quartz to spring boot 3 (#15322) --- spring-quartz/pom.xml | 4 ++-- .../baeldung/springquartz/basics/scheduler/QrtzScheduler.java | 2 +- .../springquartz/basics/scheduler/SpringQrtzScheduler.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-quartz/pom.xml b/spring-quartz/pom.xml index e8919bfadb..ddae53f64f 100644 --- a/spring-quartz/pom.xml +++ b/spring-quartz/pom.xml @@ -11,9 +11,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-3 diff --git a/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/QrtzScheduler.java b/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/QrtzScheduler.java index ccf9fca8c1..37bd82ef3b 100644 --- a/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/QrtzScheduler.java +++ b/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/QrtzScheduler.java @@ -6,7 +6,7 @@ import static org.quartz.TriggerBuilder.newTrigger; import java.io.IOException; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.baeldung.springquartz.config.AutoWiringSpringBeanJobFactory; import org.quartz.*; diff --git a/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/SpringQrtzScheduler.java b/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/SpringQrtzScheduler.java index f824765efe..c113482c76 100644 --- a/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/SpringQrtzScheduler.java +++ b/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/SpringQrtzScheduler.java @@ -1,6 +1,6 @@ package org.baeldung.springquartz.basics.scheduler; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import javax.sql.DataSource; import org.baeldung.springquartz.config.AutoWiringSpringBeanJobFactory; From 6508331a74b68db3a1a02ca2ff214f060c30d6f7 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Fri, 1 Dec 2023 13:19:46 +0200 Subject: [PATCH 117/294] [JAVA-27538] Upgraded spring-shell to spring boot 3 (#15328) --- spring-shell/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-shell/pom.xml b/spring-shell/pom.xml index 24fe5b0fb6..bdd495b836 100644 --- a/spring-shell/pom.xml +++ b/spring-shell/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-3 From ef76f798fb016a3f2899faf0be2715d7763ac863 Mon Sep 17 00:00:00 2001 From: Singh Harpal Date: Fri, 1 Dec 2023 17:51:41 +0530 Subject: [PATCH 118/294] JAVA-26769: Update/Migrate to new version of Junit4 --- core-java-modules/core-java-collections-maps-6/pom.xml | 2 +- core-java-modules/core-java-numbers-conversions/pom.xml | 2 +- maven-modules/dependency-exclusion/pom.xml | 2 +- microservices-modules/rest-express/pom.xml | 3 +-- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/core-java-modules/core-java-collections-maps-6/pom.xml b/core-java-modules/core-java-collections-maps-6/pom.xml index 8c35dcee6e..0d1732edb4 100644 --- a/core-java-modules/core-java-collections-maps-6/pom.xml +++ b/core-java-modules/core-java-collections-maps-6/pom.xml @@ -40,7 +40,7 @@ junit junit - 4.13.1 + ${junit.version} test diff --git a/core-java-modules/core-java-numbers-conversions/pom.xml b/core-java-modules/core-java-numbers-conversions/pom.xml index d014675ead..43809e8453 100644 --- a/core-java-modules/core-java-numbers-conversions/pom.xml +++ b/core-java-modules/core-java-numbers-conversions/pom.xml @@ -27,7 +27,7 @@ junit junit - 4.13.2 + ${junit.version} test diff --git a/maven-modules/dependency-exclusion/pom.xml b/maven-modules/dependency-exclusion/pom.xml index 6e348377b0..6a491e552f 100644 --- a/maven-modules/dependency-exclusion/pom.xml +++ b/maven-modules/dependency-exclusion/pom.xml @@ -62,7 +62,7 @@ junit junit - 4.13 + ${junit.version} diff --git a/microservices-modules/rest-express/pom.xml b/microservices-modules/rest-express/pom.xml index 182d14cfbf..1b22bb8117 100644 --- a/microservices-modules/rest-express/pom.xml +++ b/microservices-modules/rest-express/pom.xml @@ -73,7 +73,7 @@ junit junit - ${junit4.version} + ${junit.version} jar test true @@ -143,7 +143,6 @@ 0.11.3 1.0 0.4.8 - 4.11 2.4.1 2.0 From 76a2939e7db4c9f374d29cb8d860c4e86047eb78 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Fri, 1 Dec 2023 12:14:25 -0800 Subject: [PATCH 119/294] JAVA-27645 Check article code matches github (#15323) --- .../baeldung/keyword/InstanceOfUnitTest.java | 18 ++++++------ .../libraries/opencsv/Application.java | 28 +++++++++---------- .../opencsv/OpenCsvIntegrationTest.java | 14 +++++----- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/InstanceOfUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/InstanceOfUnitTest.java index 6ba8ed024c..dc81a0290b 100644 --- a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/InstanceOfUnitTest.java +++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/InstanceOfUnitTest.java @@ -11,55 +11,55 @@ import static org.junit.jupiter.api.Assertions.*; public class InstanceOfUnitTest { @Test - void giveWhenInstanceIsCorrect_thenReturnTrue() { + void givenWhenInstanceIsCorrect_thenReturnTrue() { Ring ring = new Ring(); assertTrue(ring instanceof Round); } @Test - void giveWhenObjectIsInstanceOfType_thenReturnTrue() { + void givenWhenObjectIsInstanceOfType_thenReturnTrue() { Circle circle = new Circle(); assertTrue(circle instanceof Circle); } @Test - void giveWhenInstanceIsOfSubtype_thenReturnTrue() { + void givenWhenInstanceIsOfSubtype_thenReturnTrue() { Circle circle = new Circle(); assertTrue(circle instanceof Round); } @Test - void giveWhenTypeIsInterface_thenReturnTrue() { + void givenWhenTypeIsInterface_thenReturnTrue() { Circle circle = new Circle(); assertTrue(circle instanceof Shape); } @Test - void giveWhenTypeIsOfObjectType_thenReturnTrue() { + void givenWhenTypeIsOfObjectType_thenReturnTrue() { Thread thread = new Thread(); assertTrue(thread instanceof Object); } @Test - void giveWhenInstanceValueIsNull_thenReturnFalse() { + void givenWhenInstanceValueIsNull_thenReturnFalse() { Circle circle = null; assertFalse(circle instanceof Round); } @Test - void giveWhenComparingClassInDiffHierarchy_thenCompilationError() { + void givenWhenComparingClassInDiffHierarchy_thenCompilationError() { //assertFalse( circle instanceof Triangle); } @Test - void giveWhenStream_whenCastWithoutInstanceOfChk_thenGetException() { + void givenWhenStream_whenCastWithoutInstanceOfChk_thenGetException() { Stream roundStream = Stream.of(new Ring(), new Ring(), new Circle()); assertThrows(ClassCastException.class, () -> roundStream.map(it -> (Ring) it).collect(Collectors.toList())); } @Test - void giveWhenStream_whenCastAfterInstanceOfChk_thenGetExpectedResult() { + void givenWhenStream_whenCastAfterInstanceOfChk_thenGetExpectedResult() { Stream roundStream = Stream.of(new Ring(), new Ring(), new Circle()); List ringList = roundStream.filter(it -> it instanceof Ring).map(it -> (Ring) it).collect(Collectors.toList()); assertEquals(2, ringList.size()); diff --git a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/Application.java b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/Application.java index cee73f674e..e18277b328 100644 --- a/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/Application.java +++ b/libraries-data-io/src/main/java/com/baeldung/libraries/opencsv/Application.java @@ -14,52 +14,52 @@ import java.util.List; public class Application { // CSV Reader Examples - public static List readLineByLineSyncExample() throws Exception { + public static List readLineByLineExample() throws Exception { Path path = Helpers.twoColumnCsvPath(); return CsvReaderExamples.readLineByLine(path); } - public static List readAllLinesSyncExample() throws Exception { + public static List readAllLinesExample() throws Exception { Path path = Helpers.twoColumnCsvPath(); return CsvReaderExamples.readAllLines(path); } // CSV Writer Examples - public static String writeLineByLineSyncExample() throws Exception { + public static String writeLineByLineExample() throws Exception { Path path = Helpers.fileOutOnePath(); return CsvWriterExamples.writeLineByLine(Helpers.fourColumnCsvString(), path); } - public static String writeAllLinesSyncExample() throws Exception { + public static String writeAllLinesExample() throws Exception { Path path = Helpers.fileOutAllPath(); return CsvWriterExamples.writeAllLines(Helpers.fourColumnCsvString(), path); } // Bean Examples - public static List simpleSyncPositionBeanExample() throws Exception { + public static List simplePositionBeanExample() throws Exception { Path path = Helpers.twoColumnCsvPath(); return BeanExamples.beanBuilderExample(path, SimplePositionBean.class); } - public static List namedSyncColumnBeanExample() throws Exception { + public static List namedColumnBeanExample() throws Exception { Path path = Helpers.namedColumnCsvPath(); return BeanExamples.beanBuilderExample(path, NamedColumnBean.class); } - public static String writeSyncCsvFromBeanExample() throws Exception { + public static String writeCsvFromBeanExample() throws Exception { Path path = Helpers.fileOutBeanPath(); return BeanExamples.writeCsvFromBean(path); } public static void main(String[] args) { try { - simpleSyncPositionBeanExample(); - namedSyncColumnBeanExample(); - writeSyncCsvFromBeanExample(); - readLineByLineSyncExample(); - readAllLinesSyncExample(); - writeLineByLineSyncExample(); - writeAllLinesSyncExample(); + simplePositionBeanExample(); + namedColumnBeanExample(); + writeCsvFromBeanExample(); + readLineByLineExample(); + readAllLinesExample(); + writeLineByLineExample(); + writeAllLinesExample(); } catch (Exception e) { throw new RuntimeException("Error during csv processing", e); } diff --git a/libraries-data-io/src/test/java/com/baeldung/libraries/opencsv/OpenCsvIntegrationTest.java b/libraries-data-io/src/test/java/com/baeldung/libraries/opencsv/OpenCsvIntegrationTest.java index 6745b9be7f..c3c85c5baa 100644 --- a/libraries-data-io/src/test/java/com/baeldung/libraries/opencsv/OpenCsvIntegrationTest.java +++ b/libraries-data-io/src/test/java/com/baeldung/libraries/opencsv/OpenCsvIntegrationTest.java @@ -13,7 +13,7 @@ public class OpenCsvIntegrationTest { @Test public void givenSampleData_whenReadUsingPosition_thenContentsRead() throws Exception { - List values = Application.simpleSyncPositionBeanExample(); + List values = Application.simplePositionBeanExample(); assertThat(values) .extracting(Object::toString) @@ -28,7 +28,7 @@ public class OpenCsvIntegrationTest { @Test public void givenSampleData_whenReadUsingNamedColumn_thenContentsRead() throws Exception { - List values = Application.namedSyncColumnBeanExample(); + List values = Application.namedColumnBeanExample(); assertThat(values) .extracting(Object::toString) @@ -41,7 +41,7 @@ public class OpenCsvIntegrationTest { @Test public void givenSampleData_whenReadLineByLine_thenContentsRead() throws Exception { - List lineByLineContents = Application.readLineByLineSyncExample(); + List lineByLineContents = Application.readLineByLineExample(); assertThat(lineByLineContents) .containsExactly( @@ -56,7 +56,7 @@ public class OpenCsvIntegrationTest { @Test public void givenSampleData_whenReadAllLines_thenContentsRead() throws Exception { - List contents = Application.readAllLinesSyncExample(); + List contents = Application.readAllLinesExample(); assertThat(contents) .containsExactly( @@ -70,7 +70,7 @@ public class OpenCsvIntegrationTest { @Test public void givenSampleData_whenWriteCsvUsingBean_thenContentsWritten() throws Exception { - String contents = Application.writeSyncCsvFromBeanExample(); + String contents = Application.writeCsvFromBeanExample(); assertThat(contents.split(NEW_LINE)) .containsExactly( @@ -82,7 +82,7 @@ public class OpenCsvIntegrationTest { @Test public void givenSampleData_whenWriteCsvLineByLine_thenContentsWritten() throws Exception { - String contents = Application.writeLineByLineSyncExample(); + String contents = Application.writeLineByLineExample(); assertThat(contents.split(NEW_LINE)) .containsExactly( @@ -94,7 +94,7 @@ public class OpenCsvIntegrationTest { @Test public void givenSampleData_whenWriteCsvAllLines_thenContentsWritten() throws Exception { - String contents = Application.writeAllLinesSyncExample(); + String contents = Application.writeAllLinesExample(); assertThat(contents.split(NEW_LINE)) .containsExactly( From 0c7025b080732eedc94716cdfaceef634862b556 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Sat, 2 Dec 2023 10:25:25 +0530 Subject: [PATCH 120/294] BAEL-7259: review comments implemented --- persistence-modules/java-harperdb/pom.xml | 6 +++++- pom.xml | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/persistence-modules/java-harperdb/pom.xml b/persistence-modules/java-harperdb/pom.xml index 56b63948c9..318f4b7460 100644 --- a/persistence-modules/java-harperdb/pom.xml +++ b/persistence-modules/java-harperdb/pom.xml @@ -29,7 +29,7 @@ com.baeldung java-harperdb - 4.2 + ${haperdb-driver.version} system ${project.basedir}/lib/cdata.jdbc.harperdb.jar @@ -57,4 +57,8 @@ + + 4.2 + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 219fc19071..27fe5947dd 100644 --- a/pom.xml +++ b/pom.xml @@ -818,8 +818,8 @@ pdf performance-tests persistence-modules + persistence-modules/java-harperdb persistence-modules/spring-data-neo4j - persistence-modules/java-harperdb protobuffer quarkus-modules reactive-systems From c8973d8cf3fab40c82c9dca3eb9a18de209388b4 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 2 Dec 2023 13:17:07 +0530 Subject: [PATCH 121/294] JAVA-27357 Improve core-java-os build time --- .../test/java/com/baeldung/example/soundapi/AppUnitTest.java | 2 +- .../java/com/baeldung/java9/process/ProcessApiUnitTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-os/src/test/java/com/baeldung/example/soundapi/AppUnitTest.java b/core-java-modules/core-java-os/src/test/java/com/baeldung/example/soundapi/AppUnitTest.java index 27bc750d8a..849f71dc03 100644 --- a/core-java-modules/core-java-os/src/test/java/com/baeldung/example/soundapi/AppUnitTest.java +++ b/core-java-modules/core-java-os/src/test/java/com/baeldung/example/soundapi/AppUnitTest.java @@ -23,7 +23,7 @@ public class AppUnitTest { soundRecorder.build(af); try { soundRecorder.start(); - Thread.sleep(20000); + Thread.sleep(5000); soundRecorder.stop(); } catch (InterruptedException ex) { fail("Exception: " + ex); diff --git a/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessApiUnitTest.java b/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessApiUnitTest.java index c3f390d8ae..dae1a705ed 100644 --- a/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessApiUnitTest.java +++ b/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessApiUnitTest.java @@ -69,7 +69,7 @@ public class ProcessApiUnitTest { }); }); - Thread.sleep(10000); + Thread.sleep(5000); childProc = ProcessHandle.current().children(); childProc.forEach(procHandle -> { @@ -100,7 +100,7 @@ public class ProcessApiUnitTest { private void waistCPU() throws NoSuchAlgorithmException { ArrayList randArr = new ArrayList(4096); SecureRandom sr = SecureRandom.getInstanceStrong(); - Duration somecpu = Duration.ofMillis(4200L); + Duration somecpu = Duration.ofMillis(2000L); Instant end = Instant.now().plus(somecpu); while (Instant.now().isBefore(end)) { // System.out.println(sr.nextInt()); From 9b744641be519dd9e16ca73b11f25b918f0c3c17 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sat, 2 Dec 2023 11:16:12 +0200 Subject: [PATCH 122/294] [JAVA-26711] --- .../src/main/resources/application.yml | 2 +- .../spring-boot-libraries/src/main/resources/schema.sql | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 spring-boot-modules/spring-boot-libraries/src/main/resources/schema.sql diff --git a/spring-boot-modules/spring-boot-libraries/src/main/resources/application.yml b/spring-boot-modules/spring-boot-libraries/src/main/resources/application.yml index 3477520208..03c24f7778 100644 --- a/spring-boot-modules/spring-boot-libraries/src/main/resources/application.yml +++ b/spring-boot-modules/spring-boot-libraries/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: datasource: driverClassName: org.h2.Driver - url: jdbc:h2:mem:shedlock_DB;INIT=CREATE SCHEMA IF NOT EXISTS shedlock;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE + url: jdbc:h2:mem:shedlock_db;INIT=CREATE SCHEMA IF NOT EXISTS shedlock;DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE username: sa password: diff --git a/spring-boot-modules/spring-boot-libraries/src/main/resources/schema.sql b/spring-boot-modules/spring-boot-libraries/src/main/resources/schema.sql new file mode 100644 index 0000000000..d5a5d51b74 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries/src/main/resources/schema.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS shedlock( + name VARCHAR(64) NOT NULL, + lock_until TIMESTAMP NOT NULL, + locked_at TIMESTAMP NOT NULL, + locked_by VARCHAR(255) NOT NULL, + PRIMARY KEY (name) +); \ No newline at end of file From cf033c3934545e5327e0e40e06a58c836b5985e8 Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Sat, 2 Dec 2023 12:01:10 +0100 Subject: [PATCH 123/294] rename and improve test whenSolve_thenScoreIsOptimalAndAllShiftsAssigned --- .../baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java index 8b57fb42b6..f0cf126236 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java @@ -11,6 +11,7 @@ import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import ai.timefold.solver.core.api.score.buildin.hardsoft.HardSoftScore; import ai.timefold.solver.core.api.solver.Solver; import ai.timefold.solver.core.api.solver.SolverFactory; import ai.timefold.solver.core.config.solver.SolverConfig; @@ -21,7 +22,7 @@ public class ShiftScheduleSolverUnitTest { private static final Logger logger = LoggerFactory.getLogger(ShiftScheduleSolverUnitTest.class); @Test - public void solve() { + public void whenSolve_thenScoreIsOptimalAndAllShiftsAssigned() { SolverFactory solverFactory = SolverFactory.create(new SolverConfig().withSolutionClass(ShiftSchedule.class) .withEntityClasses(Shift.class) .withConstraintProviderClass(ShiftScheduleConstraintProvider.class) @@ -32,6 +33,7 @@ public class ShiftScheduleSolverUnitTest { ShiftSchedule problem = loadProblem(); ShiftSchedule solution = solver.solve(problem); + assertThat(solution.getScore()).isEqualTo(HardSoftScore.ZERO); assertThat(solution.getShifts().size()).isNotZero(); for (Shift shift : solution.getShifts()) { assertThat(shift.getEmployee()).isNotNull(); From 9e8f67ad03ba65f772f390ff6b1035353742091f Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Sat, 2 Dec 2023 12:03:19 +0100 Subject: [PATCH 124/294] Improve forEachUniquePair comment further --- .../timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java index fbe6ebccaf..2f929ace34 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java @@ -21,7 +21,7 @@ class ShiftScheduleConstraintProviderUnitTest { constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(MONDAY.atTime(14, 0), MONDAY.atTime(22, 0), null, ann)) // Penalizes by 2 because both {shiftA, shiftB} and {shiftB, shiftA} match. - // To avoid that, use forEachUniquePair() in the constraint instead of forEach().join() in the implementation. + // To avoid that, use forEachUniquePair(Shift) instead of forEach(Shift).join(Shift) in ShiftScheduleConstraintProvider.atMostOneShiftPerDay(). .penalizesBy(2); } From eb63164dc6f03b6dcc5fc74ba5b5ee71a151c446 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Sat, 2 Dec 2023 21:38:58 +0530 Subject: [PATCH 125/294] BAEL-7308: Comparing One String with Multiple Values in One Expression in Java --- .../java/compareany/CompareAnyUnitTest.java | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-7/src/test/java/compareany/CompareAnyUnitTest.java diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/compareany/CompareAnyUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/compareany/CompareAnyUnitTest.java new file mode 100644 index 0000000000..778746753c --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/src/test/java/compareany/CompareAnyUnitTest.java @@ -0,0 +1,97 @@ +package compareany; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.Arrays; +import java.util.Set; + +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.Test; + +public class CompareAnyUnitTest { + + @Test + void givenStrings_whenCompareUsingIf_thenSuccess() { + String presentString = "Apple"; + String notPresentString = "Avocado"; + + assertTrue(matchAnyWithIf(presentString, "Mango", "Papaya", "PineApple", "Apple")); + assertFalse(matchAnyWithIf(notPresentString, "Mango", "Papaya", "PineApple", "Apple")); + } + + @Test + void givenStrings_whenCompareUsingArrayUtils_thenSuccess() { + String presentString = "Apple"; + String notPresentString = "Avocado"; + + assertTrue(compareWithAnyUsingArrayUtils(presentString, "Mango", "Papaya", "PineApple", "Apple")); + assertFalse(compareWithAnyUsingArrayUtils(notPresentString, "Mango", "Papaya", "PineApple", "Apple")); + } + + @Test + void givenStrings_whenCompareUsingStringUtils_thenSuccess() { + String presentString = "Apple"; + String notPresentString = "Avocado"; + + assertTrue(compareWithAnyUsingStringUtils(presentString, "Mango", "Papaya", "PineApple", "Apple")); + assertFalse(compareWithAnyUsingStringUtils(notPresentString, "Mango", "Papaya", "PineApple", "Apple")); + } + + @Test + void givenStrings_whenCompareUsingStream_thenSuccess() { + String presentString = "Apple"; + String notPresentString = "Avocado"; + + assertTrue(compareWithAnyUsingStream(presentString, "Mango", "Papaya", "PineApple", "Apple")); + assertFalse(compareWithAnyUsingStream(notPresentString, "Mango", "Papaya", "PineApple", "Apple")); + } + + @Test + void givenStrings_whenCompareUsingSet_thenSuccess() { + String presentString = "Apple"; + String notPresentString = "Avocado"; + + assertTrue(compareWithAnyUsingSet(presentString, "Mango", "Papaya", "PineApple", "Apple")); + assertFalse(compareWithAnyUsingSet(notPresentString, "Mango", "Papaya", "PineApple", "Apple")); + } + + @Test + void givenStrings_whenCompareUsingRegularExpression_thenSuccess() { + String presentString = "Apple"; + String notPresentString = "Avocado"; + + assertTrue(compareWithAnyUsingRegularExpression(presentString, "Mango", "Papaya", "PineApple", "Apple")); + assertFalse(compareWithAnyUsingRegularExpression(notPresentString, "Mango", "Papaya", "PineApple", "Apple")); + } + + private boolean matchAnyWithIf(String str, String ... strs) { + for(String s : strs) { + if (str.equals(s)) { + return true; + } + } + return false; + } + + private boolean compareWithAnyUsingStringUtils(String str, String ... strs) { + return StringUtils.containsAny(str, strs); + } + + private boolean compareWithAnyUsingSet(String str, String ... strs) { + return Set.of(strs).contains(str); + } + + private static boolean compareWithAnyUsingRegularExpression(String str, String ... strs) { + return str.matches(String.join("|", strs)); + } + + private static boolean compareWithAnyUsingStream(String str, String ... strs) { + return Arrays.stream(strs).anyMatch(str::equals); + } + + private static boolean compareWithAnyUsingArrayUtils(String str, String ... strs) { + return ArrayUtils.contains(strs, str); + } + +} From f2adeb59566c6e9660004e2afc0bba8b9108d40b Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Sat, 2 Dec 2023 20:20:40 +0100 Subject: [PATCH 126/294] BDD style --- .../ShiftScheduleConstraintProviderUnitTest.java | 8 ++++---- .../timefoldsolver/ShiftScheduleSolverUnitTest.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java index 2f929ace34..c8ec5b53c4 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java @@ -16,7 +16,7 @@ class ShiftScheduleConstraintProviderUnitTest { ShiftSchedule.class, Shift.class); @Test - void whenTwoShiftsOnOneDay_thenPenalize() { + void givenTwoShiftsOnOneDay_whenApplyingAtMostOneShiftPerDayConstraint_thenPenalize() { Employee ann = new Employee("Ann", null); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(MONDAY.atTime(14, 0), MONDAY.atTime(22, 0), null, ann)) @@ -26,7 +26,7 @@ class ShiftScheduleConstraintProviderUnitTest { } @Test - void whenTwoShiftsOnDifferentDays_thenDoNotPenalize() { + void givenTwoShiftsOnDifferentDays_whenApplyingAtMostOneShiftPerDayConstraint_thenDoNotPenalize() { Employee ann = new Employee("Ann", null); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(TUESDAY.atTime(14, 0), TUESDAY.atTime(22, 0), null, ann)) @@ -34,7 +34,7 @@ class ShiftScheduleConstraintProviderUnitTest { } @Test - void whenEmployeeLacksRequiredSkill_thenPenalize() { + void givenEmployeeLacksRequiredSkill_whenApplyingRequiredSkillConstraint_thenPenalize() { Employee ann = new Employee("Ann", Set.of("Waiter")); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::requiredSkill) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Cook", ann)) @@ -42,7 +42,7 @@ class ShiftScheduleConstraintProviderUnitTest { } @Test - void whenEmployeeHasRequiredSkill_thenDoNotPenalize() { + void givenEmployeeHasRequiredSkill_whenApplyingRequiredSkillConstraint_thenDoNotPenalize() { Employee ann = new Employee("Ann", Set.of("Waiter")); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::requiredSkill) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Waiter", ann)) diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java index f0cf126236..873ce1a853 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java @@ -22,7 +22,7 @@ public class ShiftScheduleSolverUnitTest { private static final Logger logger = LoggerFactory.getLogger(ShiftScheduleSolverUnitTest.class); @Test - public void whenSolve_thenScoreIsOptimalAndAllShiftsAssigned() { + public void given3Employees5Shifts_whenSolve_thenScoreIsOptimalAndAllShiftsAssigned() { SolverFactory solverFactory = SolverFactory.create(new SolverConfig().withSolutionClass(ShiftSchedule.class) .withEntityClasses(Shift.class) .withConstraintProviderClass(ShiftScheduleConstraintProvider.class) From d8c84e0ea2546fcd6b34e441ebc7f46a80b7c7ab Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Sat, 2 Dec 2023 19:05:17 -0700 Subject: [PATCH 127/294] [BAEL-7170] Examples of colon character in Java (#15298) --- .../baeldung/colonexamples/ColonExamples.java | 178 ++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 core-java-modules/core-java-lang-operators-2/src/main/java/com/baeldung/colonexamples/ColonExamples.java diff --git a/core-java-modules/core-java-lang-operators-2/src/main/java/com/baeldung/colonexamples/ColonExamples.java b/core-java-modules/core-java-lang-operators-2/src/main/java/com/baeldung/colonexamples/ColonExamples.java new file mode 100644 index 0000000000..873e28c3f6 --- /dev/null +++ b/core-java-modules/core-java-lang-operators-2/src/main/java/com/baeldung/colonexamples/ColonExamples.java @@ -0,0 +1,178 @@ +package com.baeldung.colonexamples; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Connection; +import java.util.*; +import java.util.stream.Collectors; + +/** + * Examples of the different ways Java uses the colon (:) character. + */ +public class ColonExamples { + + private final static Logger LOG = LoggerFactory.getLogger(ColonExamples.class); + + public void example1_enhancedForLoop() { + + // Original style + for(int i = 0; i < 10; i++) { + // do something + } + + // Using enhanced for loop + int[] numbers = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9}; + for(int i : numbers) { + // do something + } + + // Using List instead of array + List numbersList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); + for(Integer i : numbersList) { + // do something + } + } + + public void example2_switchStatement(String animal) { + + // Original style + if(animal.equals("cat")) { + System.out.println("meow"); + } + else if(animal.equals("lion")) { + System.out.println("roar"); + } + else if(animal.equals("dog") || animal.equals("seal")) { + System.out.println("bark"); + } + else { + System.out.println("unknown"); + } + + // Using switch statement + switch(animal) { + case "cat": + System.out.println("meow"); + break; + case "lion": + System.out.println("roar"); + break; + case "dog": + case "seal": + System.out.println("bark"); + break; + default: + System.out.println("unknown"); + } + } + + public void example3_labels() { + + // For loops without labels + for(int i = 0; i < 10; i++) { + for (int j = 0; j < 10; j++) { + if (checkSomeCondition()) { + break; + } + } + } + + outterLoop: for(int i = 0; i < 10; i++) { + innerLoop: for (int j = 0; j < 10; j++) { + if (checkSomeCondition()) { + break outterLoop; + } + } + } + } + + public void example4_ternaryOperator() { + + // Original way using if/else + int x; + if(checkSomeCondition()) { + x = 1; + } + else { + x = 2; + } + + // Using ternary operator + x = checkSomeCondition() ? 1 : 2; + + // Using with other statements + boolean remoteCallResult = callRemoteApi(); + LOG.info(String.format( + "The result of the remote API call %s successful", + remoteCallResult ? "was" : "was not" + )); + } + + public void example5_methodReferences() { + // Original way without lambdas and method references + List names = Arrays.asList("ross", "joey", "chandler"); + List upperCaseNames = new ArrayList<>(); + for(String name : names) { + upperCaseNames.add(name.toUpperCase()); + } + + // Using method reference with stream map operation + List petNames = Arrays.asList("ross", "joey", "chandler"); + List petUpperCaseNames = petNames + .stream() + .map(String::toUpperCase) + .collect(Collectors.toList()); + + // Method reference with stream filter + List pets = Arrays.asList(new Cat(), new Dog(), new Parrot()); + List onlyDogs = pets + .stream() + .filter(Dog.class::isInstance) + .collect(Collectors.toList()); + + // Method reference with constructors + Set onlyDogsSet = pets + .stream() + .filter(Dog.class::isInstance) + .collect(Collectors.toCollection(TreeSet::new)); + } + + public void example6_asserttion() { + // Original way without assertions + Connection conn = getConnection(); + if(conn == null) { + throw new RuntimeException("Connection is null"); + } + + // Using assert keyword + assert getConnection() != null : "Connection is null"; + } + + private boolean checkSomeCondition() { + return new Random().nextBoolean(); + } + + private boolean callRemoteApi() { + return new Random().nextBoolean(); + } + + private Connection getConnection() { + return null; + } + + private static interface Animal { + + } + private static class Dog implements Animal { + + } + + private static class Cat implements Animal { + + } + + private static class Parrot implements Animal { + + } +} From 722180e2a84c2d445ba9d9fa75d8da45a5e2a547 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:03:41 +0800 Subject: [PATCH 128/294] Update README.md [skip ci] --- gradle-modules/gradle-7/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradle-modules/gradle-7/README.md b/gradle-modules/gradle-7/README.md index fe05a4b9bc..c452ee8b33 100644 --- a/gradle-modules/gradle-7/README.md +++ b/gradle-modules/gradle-7/README.md @@ -5,4 +5,5 @@ - [Working With Multiple Repositories in Gradle](https://www.baeldung.com/java-gradle-multiple-repositories) - [Different Dependency Version Declarations in Gradle](https://www.baeldung.com/gradle-different-dependency-version-declarations) - [Generating Javadoc With Gradle](https://www.baeldung.com/java-gradle-javadoc) -- [Generating WSDL Stubs With Gradle](https://www.baeldung.com/java-gradle-create-wsdl-stubs) \ No newline at end of file +- [Generating WSDL Stubs With Gradle](https://www.baeldung.com/java-gradle-create-wsdl-stubs) +- [Gradle Proxy Configuration](https://www.baeldung.com/gradle-proxy-configuration) From d080d2f9f7413f3e8d4f9c999e100f84f732d50c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:11:07 +0800 Subject: [PATCH 129/294] Update README.md [skip ci] --- core-java-modules/core-java-lang-6/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-6/README.md b/core-java-modules/core-java-lang-6/README.md index 91c0e5212c..fe79a8ecd4 100644 --- a/core-java-modules/core-java-lang-6/README.md +++ b/core-java-modules/core-java-lang-6/README.md @@ -9,3 +9,4 @@ This module contains articles about core features in the Java language - [Get a Random Element From a Set in Java](https://www.baeldung.com/java-set-draw-sample) - [Stop Executing Further Code in Java](https://www.baeldung.com/java-stop-running-code) - [Using the Apache Commons Lang 3 for Comparing Objects in Java](https://www.baeldung.com/java-apache-commons-lang-3-compare-objects) +- [Return First Non-null Value in Java](https://www.baeldung.com/java-first-non-null) From 894d87b029508d9d4f2d60194cc477964bdfa3bc Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:13:25 +0800 Subject: [PATCH 130/294] Update README.md [skip ci] --- core-java-modules/core-java-security-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-security-4/README.md b/core-java-modules/core-java-security-4/README.md index 236715713b..3c910e50be 100644 --- a/core-java-modules/core-java-security-4/README.md +++ b/core-java-modules/core-java-security-4/README.md @@ -5,4 +5,5 @@ This module contains articles about core Java Security ### Relevant Articles: - [Check if Certificate Is Self-Signed or CA-Signed With Java](https://www.baeldung.com/java-check-certificate-sign) - [Extract CN From X509 Certificate in Java](https://www.baeldung.com/java-extract-common-name-x509-certificate) +- [Check Certificate Name and Alias in Keystore File](https://www.baeldung.com/java-keystore-check-certificate-name-alias) - More articles: [[<-- prev]](/core-java-modules/core-java-security-3) From 2e27265f5a71bb20523c8a5feaf49a0b6ff6512d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:18:44 +0800 Subject: [PATCH 131/294] Update README.md [skip ci] --- core-java-modules/core-java-collections-maps-7/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-collections-maps-7/README.md b/core-java-modules/core-java-collections-maps-7/README.md index c9f39dd2fa..7e16f2503d 100644 --- a/core-java-modules/core-java-collections-maps-7/README.md +++ b/core-java-modules/core-java-collections-maps-7/README.md @@ -4,5 +4,5 @@ - [How to Write Hashmap to CSV File](https://www.baeldung.com/java-write-hashmap-csv) - [How to Get First or Last Entry From a LinkedHashMap in Java](https://www.baeldung.com/java-linkedhashmap-first-last-key-value-pair) - [How to Write and Read a File with a Java HashMap](https://www.baeldung.com/java-hashmap-write-read-file) -- [Limiting the Max Size of a HashMap in Java](https://www.baeldung.com/java-hashmap-max-size) -- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-6) \ No newline at end of file +- [Limiting the Max Size of a HashMap in Java](https://www.baeldung.com/java-hashmap-size-bound) +- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-6) From 3327571ab92e88f573dff57b4bc5928692d5f4d8 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:20:34 +0800 Subject: [PATCH 132/294] Update README.md [skip ci] --- spring-scheduling/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-scheduling/README.md b/spring-scheduling/README.md index 4ee306c0e0..4c42c60c37 100644 --- a/spring-scheduling/README.md +++ b/spring-scheduling/README.md @@ -5,3 +5,4 @@ - [How To Do @Async in Spring](https://www.baeldung.com/spring-async) - [Conditionally Enable Scheduled Jobs in Spring](https://www.baeldung.com/spring-scheduled-enabled-conditionally) - [Remote Debugging with IntelliJ IDEA](https://www.baeldung.com/intellij-remote-debugging) +- [Setup Asynchronous Retry Mechanism in Spring](https://www.baeldung.com/spring-async-retry) From cf341070d7e62f51eb56e3f90741a930fafde874 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 13:59:00 +0800 Subject: [PATCH 133/294] Update README.md [skip ci] --- spring-boot-modules/spring-boot-mvc-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-mvc-5/README.md b/spring-boot-modules/spring-boot-mvc-5/README.md index 782adb7b34..c72d72c84f 100644 --- a/spring-boot-modules/spring-boot-mvc-5/README.md +++ b/spring-boot-modules/spring-boot-mvc-5/README.md @@ -5,3 +5,4 @@ This module contains articles about Spring Web MVC in Spring Boot projects. ### Relevant Articles: - [Enable and Disable Endpoints at Runtime With Spring Boot](https://www.baeldung.com/spring-boot-enable-disable-endpoints-at-runtime) - [Extracting a Custom Header From the Request](https://www.baeldung.com/spring-extract-custom-header-request) +- [Modify Request Body Before Reaching Controller in Spring Boot](https://www.baeldung.com/spring-boot-change-request-body-before-controller) From 3081399bd2a83b9f904d1fe085084214ea5871e8 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 14:02:45 +0800 Subject: [PATCH 134/294] Update README.md [skip ci] --- core-java-modules/core-java-uuid/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-uuid/README.md b/core-java-modules/core-java-uuid/README.md index bd7bd9d9da..a32c1ae04f 100644 --- a/core-java-modules/core-java-uuid/README.md +++ b/core-java-modules/core-java-uuid/README.md @@ -6,3 +6,4 @@ - [Validate UUID String in Java](https://www.baeldung.com/java-validate-uuid-string) - [Generate the Same UUID From a String in Java](https://www.baeldung.com/java-generate-same-uuid-from-string) - [Generating Time Based UUIDs](https://www.baeldung.com/java-generating-time-based-uuids) +- [Generating Unique Positive long Using UUID in Java](https://www.baeldung.com/java-uuid-unique-long-generation) From f53d91745449f1467d49acdc07c0b039d9d6bf9c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 14:07:32 +0800 Subject: [PATCH 135/294] Update README.md [skip ci] --- core-java-modules/core-java-collections-maps-7/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-maps-7/README.md b/core-java-modules/core-java-collections-maps-7/README.md index 7e16f2503d..b4ef933ab8 100644 --- a/core-java-modules/core-java-collections-maps-7/README.md +++ b/core-java-modules/core-java-collections-maps-7/README.md @@ -5,4 +5,5 @@ - [How to Get First or Last Entry From a LinkedHashMap in Java](https://www.baeldung.com/java-linkedhashmap-first-last-key-value-pair) - [How to Write and Read a File with a Java HashMap](https://www.baeldung.com/java-hashmap-write-read-file) - [Limiting the Max Size of a HashMap in Java](https://www.baeldung.com/java-hashmap-size-bound) +- [How to Sort LinkedHashMap By Values in Java](https://www.baeldung.com/java-sort-linkedhashmap-using-values) - More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-6) From 5eba53af3876c06c9c4357f435505cce60f00db8 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 14:11:04 +0800 Subject: [PATCH 136/294] Update README.md [skip ci] --- core-java-modules/core-java-datetime-conversion/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-datetime-conversion/README.md b/core-java-modules/core-java-datetime-conversion/README.md index c7ba333222..f30a21f84c 100644 --- a/core-java-modules/core-java-datetime-conversion/README.md +++ b/core-java-modules/core-java-datetime-conversion/README.md @@ -11,3 +11,4 @@ This module contains articles about converting between Java date and time object - [Conversion From 12-Hour Time to 24-Hour Time in Java](https://www.baeldung.com/java-convert-time-format) - [Convert Epoch Time to LocalDate and LocalDateTime](https://www.baeldung.com/java-convert-epoch-localdate) - [Convert Timestamp String to Long in Java](https://www.baeldung.com/java-convert-timestamp-string-long) +- [Convert Long Timestamp to LocalDateTime in Java](https://www.baeldung.com/java-convert-long-timestamp-localdatetime) From 0adcb51cc10771d439ec813e30e944184657f8e8 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 14:13:05 +0800 Subject: [PATCH 137/294] Update README.md [skip ci] --- core-java-modules/core-java-collections-maps-7/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-maps-7/README.md b/core-java-modules/core-java-collections-maps-7/README.md index b4ef933ab8..73b36394a3 100644 --- a/core-java-modules/core-java-collections-maps-7/README.md +++ b/core-java-modules/core-java-collections-maps-7/README.md @@ -6,4 +6,5 @@ - [How to Write and Read a File with a Java HashMap](https://www.baeldung.com/java-hashmap-write-read-file) - [Limiting the Max Size of a HashMap in Java](https://www.baeldung.com/java-hashmap-size-bound) - [How to Sort LinkedHashMap By Values in Java](https://www.baeldung.com/java-sort-linkedhashmap-using-values) +- [How to Increment a Map Value in Java](https://www.baeldung.com/java-increment-map-value) - More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-6) From 9b5f00295233df9e7f79dc5f3fad8a1b5aa0f8c0 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 14:14:17 +0800 Subject: [PATCH 138/294] Update README.md [skip ci] --- javafx/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javafx/README.md b/javafx/README.md index 7db1478129..d6ea5b226f 100644 --- a/javafx/README.md +++ b/javafx/README.md @@ -7,4 +7,4 @@ This module contains articles about JavaFX. - [Introduction to JavaFx](https://www.baeldung.com/javafx) - [Display Custom Items in JavaFX ListView](https://www.baeldung.com/javafx-listview-display-custom-items) - [Adding EventHandler to JavaFX Button](https://www.baeldung.com/javafx-button-eventhandler) - +- [How to Use a Custom Font in Java](https://www.baeldung.com/java-custom-font) From 692f3b201a8a081664963b039a27ea41f3e5a318 Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Sun, 3 Dec 2023 07:19:26 +0000 Subject: [PATCH 139/294] Final Static Variables in Java --- .../java/com/baeldung/finalstatic/Bike.java | 14 ++++++++++ .../baeldung/finalstatic/BikeUnitTest.java | 28 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 core-java-modules/core-java-lang-6/src/main/java/com/baeldung/finalstatic/Bike.java create mode 100644 core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java diff --git a/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/finalstatic/Bike.java b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/finalstatic/Bike.java new file mode 100644 index 0000000000..6467ccc395 --- /dev/null +++ b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/finalstatic/Bike.java @@ -0,0 +1,14 @@ +package com.baeldung.finalstatic; + +import java.util.HashMap; + +public class Bike { + public static final int TIRE = 2; + public static final int PEDAL; + public static final HashMap PART = new HashMap<>(); + + static { + PEDAL = 5; + } + +} diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java new file mode 100644 index 0000000000..bd7f578a9a --- /dev/null +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.finalstatic; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class BikeUnitTest { + + @Test + void givenTireConstantSetUponDeclaration_whenGetTire_thenReturnTwo() { + assertEquals(2, Bike.TIRE); + } + + @Test + void givenPedalConstantSetByStaticBlock_whenGetPedal_thenReturnFive() { + assertEquals(5, Bike.PEDAL); + } + + @Test + void givenPartConstantObject_whenObjectStateChanged_thenCorrect() { + Bike.PART.put("seat", 1); + assertEquals(1, Bike.PART.get("seat")); + + Bike.PART.put("seat", 5); + assertEquals(5, Bike.PART.get("seat")); + } + +} \ No newline at end of file From f763b57b7a00c3f5653e6076173c28156345dd7c Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Sun, 3 Dec 2023 11:09:55 +0000 Subject: [PATCH 140/294] Final Static Variables in Java --- .../src/test/java/com/baeldung/finalstatic/BikeUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java index bd7f578a9a..3699a061ab 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java @@ -2,7 +2,7 @@ package com.baeldung.finalstatic; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; class BikeUnitTest { From 7f1bfe6a875067c655b384aa202f5c43daa93f36 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sun, 3 Dec 2023 17:55:52 +0100 Subject: [PATCH 141/294] [chk-double-is-int] check if doulbe is integer (#15312) --- core-java-modules/core-java-numbers-7/pom.xml | 37 +++++++++ .../CheckDoubleIsAnIntegerUnitTest.java | 83 +++++++++++++++++++ core-java-modules/pom.xml | 2 +- 3 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 core-java-modules/core-java-numbers-7/pom.xml create mode 100644 core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/doubleisint/CheckDoubleIsAnIntegerUnitTest.java diff --git a/core-java-modules/core-java-numbers-7/pom.xml b/core-java-modules/core-java-numbers-7/pom.xml new file mode 100644 index 0000000000..dec3084108 --- /dev/null +++ b/core-java-modules/core-java-numbers-7/pom.xml @@ -0,0 +1,37 @@ + + 4.0.0 + core-java-numbers-7 + core-java-numbers-7 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + com.google.guava + guava + ${guava.version} + + + + core-java-numbers-7 + + + src/main/resources + true + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/doubleisint/CheckDoubleIsAnIntegerUnitTest.java b/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/doubleisint/CheckDoubleIsAnIntegerUnitTest.java new file mode 100644 index 0000000000..90d2c52595 --- /dev/null +++ b/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/doubleisint/CheckDoubleIsAnIntegerUnitTest.java @@ -0,0 +1,83 @@ +package com.baeldung.doubleisint; + +import com.google.common.math.DoubleMath; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class CheckDoubleIsAnIntegerUnitTest { + + boolean notNaNOrInfinity(double d) { + return !(Double.isNaN(d) || Double.isInfinite(d)); + } + + @Test + void whenConvertingToInt_thenGetExpectedResult() { + double d1 = 42.0D; + boolean d1IsInteger = notNaNOrInfinity(d1) && (int) d1 == d1; + assertTrue(d1IsInteger); + + double d2 = 42.42D; + boolean d2IsInteger = notNaNOrInfinity(d2) && (int) d2 == d2; + assertFalse(d2IsInteger); + + double d3 = 2.0D * Integer.MAX_VALUE; + boolean d3IsInteger = notNaNOrInfinity(d3) && (int) d3 == d3; + assertTrue(!d3IsInteger); // <-- fails if exceeding Integer's range + } + + @Test + void whenUsingModuloOperator_thenGetExpectedResult() { + double d1 = 42.0D; + boolean d1IsInteger = notNaNOrInfinity(d1) && (d1 % 1) == 0; + assertTrue(d1IsInteger); + + double d2 = 42.42D; + boolean d2IsInteger = notNaNOrInfinity(d2) && (d2 % 1) == 0; + assertFalse(d2IsInteger); + + double d3 = 2.0D * Integer.MAX_VALUE; + boolean d3IsInteger = notNaNOrInfinity(d3) && (d3 % 1) == 0; + assertTrue(d3IsInteger); + + } + + + @Test + void whenCheckingFloorOrCeilingValue_thenGetExpectedResult() { + double d1 = 42.0D; + boolean d1IsInteger = notNaNOrInfinity(d1) && Math.floor(d1) == d1; + assertTrue(d1IsInteger); + + double d2 = 42.42D; + boolean d2IsInteger = notNaNOrInfinity(d2) && Math.floor(d2) == d2; + assertFalse(d2IsInteger); + + double d3 = 2.0D * Integer.MAX_VALUE; + boolean d3IsInteger = notNaNOrInfinity(d3) && Math.floor(d3) == d3; + assertTrue(d3IsInteger); + + } + + @Test + void whenUsingGuava_thenGetExpectedResult() { + double d1 = 42.0D; + boolean d1IsInteger = DoubleMath.isMathematicalInteger(d1); + assertTrue(d1IsInteger); + + double d2 = 42.42D; + boolean d2IsInteger = DoubleMath.isMathematicalInteger(d2); + assertFalse(d2IsInteger); + + double d3 = 2.0D * Integer.MAX_VALUE; + boolean d3IsInteger = DoubleMath.isMathematicalInteger(d3); + assertTrue(d3IsInteger); + + boolean isInfinityInt = DoubleMath.isMathematicalInteger(Double.POSITIVE_INFINITY); + assertFalse(isInfinityInt); + + boolean isNanInt = DoubleMath.isMathematicalInteger(Double.NaN); + assertFalse(isNanInt); + } +} \ No newline at end of file diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index b3ef8167a5..c0c44eba9a 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -166,6 +166,7 @@ core-java-numbers-4 core-java-numbers-5 core-java-numbers-6 + core-java-numbers-7 core-java-optional core-java-perf core-java-properties @@ -225,5 +226,4 @@ - From e6501ada078ccf1c2c281be027168ad69408eee9 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Sun, 3 Dec 2023 21:19:12 +0200 Subject: [PATCH 142/294] JAVA-26705 Upgrade lombok to latest version (#15305) Co-authored-by: timis1 --- aws-modules/aws-reactive/pom.xml | 1 - core-java-modules/core-java-collections-list-5/pom.xml | 2 +- deeplearning4j/pom.xml | 1 - ksqldb/pom.xml | 2 +- kubernetes-modules/k8s-admission-controller/pom.xml | 1 + libraries-data-db/pom.xml | 1 + logging-modules/logback/pom.xml | 1 - messaging-modules/postgres-notify/pom.xml | 1 + .../messaging/postgresql/controller/OrdersController.java | 2 +- .../messaging/postgresql/service/NotificationHandler.java | 2 +- .../baeldung/messaging/postgresql/service/OrdersService.java | 4 ++-- netflix-modules/mantis/pom.xml | 1 + persistence-modules/fauna/pom.xml | 1 + persistence-modules/r2dbc/pom.xml | 1 + persistence-modules/scylladb/pom.xml | 1 + persistence-modules/spring-boot-persistence-2/pom.xml | 1 + persistence-modules/spring-data-cosmosdb/pom.xml | 1 + persistence-modules/spring-data-elasticsearch/pom.xml | 2 +- persistence-modules/spring-data-mongodb-reactive/pom.xml | 1 + persistence-modules/spring-data-redis/pom.xml | 1 + pom.xml | 2 +- reactive-systems/inventory-service/pom.xml | 1 + reactive-systems/order-service/pom.xml | 1 + reactive-systems/shipping-service/pom.xml | 1 + saas-modules/stripe/pom.xml | 1 + security-modules/sql-injection-samples/pom.xml | 1 + spring-4/pom.xml | 1 + spring-5-webflux/pom.xml | 1 + spring-boot-modules/spring-boot-3-2/pom.xml | 1 + spring-boot-modules/spring-boot-graphql/pom.xml | 1 + .../java/com/baeldung/graphql/intro/SpringContextTest.java | 1 - spring-boot-modules/spring-boot-logging-log4j2/pom.xml | 1 + spring-boot-modules/spring-boot-mvc-birt/pom.xml | 1 + spring-boot-modules/spring-boot-mvc/pom.xml | 1 + .../spring-cloud-archaius-dynamodb-config/pom.xml | 1 - .../spring-cloud-archaius-jdbc-config/pom.xml | 4 ---- .../spring-cloud-eureka-feign-client-integration-test/pom.xml | 1 + spring-core-2/pom.xml | 1 + spring-credhub/pom.xml | 1 + spring-kafka-2/pom.xml | 1 + spring-kafka/pom.xml | 1 + spring-reactive-modules/spring-reactive-2/pom.xml | 1 + spring-reactive-modules/spring-reactive-3/pom.xml | 1 + spring-reactive-modules/spring-reactive-client/pom.xml | 1 + .../spring-reactive-data-couchbase/pom.xml | 1 - spring-reactive-modules/spring-reactive-data/pom.xml | 1 + spring-reactive-modules/spring-reactive-security/pom.xml | 1 + spring-security-modules/spring-security-azuread/pom.xml | 1 + spring-security-modules/spring-security-opa/pom.xml | 1 + spring-web-modules/spring-mvc-forms-thymeleaf/pom.xml | 1 + testing-modules/cucumber/pom.xml | 1 + testing-modules/spring-mockito/pom.xml | 1 + 52 files changed, 46 insertions(+), 18 deletions(-) diff --git a/aws-modules/aws-reactive/pom.xml b/aws-modules/aws-reactive/pom.xml index e6b50cadb2..22bd62c2ee 100644 --- a/aws-modules/aws-reactive/pom.xml +++ b/aws-modules/aws-reactive/pom.xml @@ -93,7 +93,6 @@ 2.2.1.RELEASE 2.17.283 - 1.18.20 \ No newline at end of file diff --git a/core-java-modules/core-java-collections-list-5/pom.xml b/core-java-modules/core-java-collections-list-5/pom.xml index c89ad0fad9..c11781eeda 100644 --- a/core-java-modules/core-java-collections-list-5/pom.xml +++ b/core-java-modules/core-java-collections-list-5/pom.xml @@ -39,7 +39,7 @@ org.projectlombok lombok - 1.18.26 + ${lombok.version} provided diff --git a/deeplearning4j/pom.xml b/deeplearning4j/pom.xml index 875d8cdf85..aab19a166d 100644 --- a/deeplearning4j/pom.xml +++ b/deeplearning4j/pom.xml @@ -68,7 +68,6 @@ 0.9.1 4.3.5 - 1.18.20 \ No newline at end of file diff --git a/ksqldb/pom.xml b/ksqldb/pom.xml index e55398d635..ebb3bfa7ee 100644 --- a/ksqldb/pom.xml +++ b/ksqldb/pom.xml @@ -17,7 +17,7 @@ confluent confluent-repo - http://packages.confluent.io/maven/ + https://packages.confluent.io/maven/ diff --git a/kubernetes-modules/k8s-admission-controller/pom.xml b/kubernetes-modules/k8s-admission-controller/pom.xml index 18bf98a830..4c41bf7ca0 100644 --- a/kubernetes-modules/k8s-admission-controller/pom.xml +++ b/kubernetes-modules/k8s-admission-controller/pom.xml @@ -22,6 +22,7 @@ org.projectlombok lombok + ${lombok.version} true diff --git a/libraries-data-db/pom.xml b/libraries-data-db/pom.xml index ed184d72e0..5f1ff489f4 100644 --- a/libraries-data-db/pom.xml +++ b/libraries-data-db/pom.xml @@ -152,6 +152,7 @@ org.projectlombok lombok + ${lombok.version} io.ebean diff --git a/logging-modules/logback/pom.xml b/logging-modules/logback/pom.xml index 8df95c18bb..fbd180c74d 100644 --- a/logging-modules/logback/pom.xml +++ b/logging-modules/logback/pom.xml @@ -121,7 +121,6 @@ 2.0.0 1.4.8 2.0.4 - 1.18.22 \ No newline at end of file diff --git a/messaging-modules/postgres-notify/pom.xml b/messaging-modules/postgres-notify/pom.xml index 876519f40c..571065b98d 100644 --- a/messaging-modules/postgres-notify/pom.xml +++ b/messaging-modules/postgres-notify/pom.xml @@ -41,6 +41,7 @@ org.projectlombok lombok true + ${lombok.version} diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/controller/OrdersController.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/controller/OrdersController.java index 70daa14abd..4a1db320dc 100644 --- a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/controller/OrdersController.java +++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/controller/OrdersController.java @@ -42,7 +42,7 @@ public class OrdersController { public ResponseEntity getOrderById(@PathVariable Long id) { Optional o = orders.findById(id); - if (o.isEmpty()) { + if (!o.isPresent()) { return ResponseEntity.notFound().build(); } diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotificationHandler.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotificationHandler.java index 61b970f3a2..da333b89ff 100644 --- a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotificationHandler.java +++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotificationHandler.java @@ -23,7 +23,7 @@ public class NotificationHandler implements Consumer{ public void accept(PGNotification t) { log.info("Notification received: pid={}, name={}, param={}",t.getPID(),t.getName(),t.getParameter()); Optional order = orders.findById(Long.valueOf(t.getParameter())); - if ( !order.isEmpty()) { + if ( order.isPresent()) { log.info("order details: {}", order.get()); } } diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/OrdersService.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/OrdersService.java index cc369c1f3e..038c2f6492 100644 --- a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/OrdersService.java +++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/OrdersService.java @@ -43,14 +43,14 @@ public class OrdersService { @Transactional(readOnly = true) public Optional findById(Long id) { Optional o = Optional.ofNullable(ordersCache.get(id, Order.class)); - if ( !o.isEmpty() ) { + if ( o.isPresent() ) { log.info("findById: cache hit, id={}",id); return o; } log.info("findById: cache miss, id={}",id); o = repo.findById(id); - if ( o.isEmpty()) { + if ( !o.isPresent()) { return o; } diff --git a/netflix-modules/mantis/pom.xml b/netflix-modules/mantis/pom.xml index 351f079481..ed57eed01e 100644 --- a/netflix-modules/mantis/pom.xml +++ b/netflix-modules/mantis/pom.xml @@ -43,6 +43,7 @@ org.projectlombok lombok + ${lombok.version} org.springframework diff --git a/persistence-modules/fauna/pom.xml b/persistence-modules/fauna/pom.xml index a0626e0cd2..c6350b37d7 100644 --- a/persistence-modules/fauna/pom.xml +++ b/persistence-modules/fauna/pom.xml @@ -44,6 +44,7 @@ org.projectlombok lombok provided + ${lombok.version} diff --git a/persistence-modules/r2dbc/pom.xml b/persistence-modules/r2dbc/pom.xml index 5260bb9860..a2c8e3148d 100644 --- a/persistence-modules/r2dbc/pom.xml +++ b/persistence-modules/r2dbc/pom.xml @@ -52,6 +52,7 @@ org.projectlombok lombok + ${lombok.version} org.springframework.boot diff --git a/persistence-modules/scylladb/pom.xml b/persistence-modules/scylladb/pom.xml index f84db87742..66dd89afa9 100644 --- a/persistence-modules/scylladb/pom.xml +++ b/persistence-modules/scylladb/pom.xml @@ -37,6 +37,7 @@ org.projectlombok lombok true + ${lombok.version} org.springframework.boot diff --git a/persistence-modules/spring-boot-persistence-2/pom.xml b/persistence-modules/spring-boot-persistence-2/pom.xml index 7d6b6909c4..9b22e6902c 100644 --- a/persistence-modules/spring-boot-persistence-2/pom.xml +++ b/persistence-modules/spring-boot-persistence-2/pom.xml @@ -74,6 +74,7 @@ org.projectlombok lombok true + ${lombok.version} org.springframework.boot diff --git a/persistence-modules/spring-data-cosmosdb/pom.xml b/persistence-modules/spring-data-cosmosdb/pom.xml index 30dc4f999c..fbd4af9456 100644 --- a/persistence-modules/spring-data-cosmosdb/pom.xml +++ b/persistence-modules/spring-data-cosmosdb/pom.xml @@ -32,6 +32,7 @@ org.projectlombok lombok + ${lombok.version} diff --git a/persistence-modules/spring-data-elasticsearch/pom.xml b/persistence-modules/spring-data-elasticsearch/pom.xml index 91dc3ee4d2..b8edae68d3 100644 --- a/persistence-modules/spring-data-elasticsearch/pom.xml +++ b/persistence-modules/spring-data-elasticsearch/pom.xml @@ -40,7 +40,7 @@ org.projectlombok lombok - 1.18.28 + ${lombok.version} org.springframework.boot diff --git a/persistence-modules/spring-data-mongodb-reactive/pom.xml b/persistence-modules/spring-data-mongodb-reactive/pom.xml index 85c9a4c4b6..46b2e8067f 100644 --- a/persistence-modules/spring-data-mongodb-reactive/pom.xml +++ b/persistence-modules/spring-data-mongodb-reactive/pom.xml @@ -35,6 +35,7 @@ org.projectlombok lombok + ${lombok.version} io.projectreactor diff --git a/persistence-modules/spring-data-redis/pom.xml b/persistence-modules/spring-data-redis/pom.xml index 052935e215..382cdf83f5 100644 --- a/persistence-modules/spring-data-redis/pom.xml +++ b/persistence-modules/spring-data-redis/pom.xml @@ -27,6 +27,7 @@ org.projectlombok lombok + ${lombok.version} io.projectreactor diff --git a/pom.xml b/pom.xml index cee9d9125b..73a21684e4 100644 --- a/pom.xml +++ b/pom.xml @@ -1234,7 +1234,7 @@ 3.12.2 3.3.0 3.21.0 - 1.18.28 + 1.18.30 2.1.214 32.1.3-jre 3.3.0 diff --git a/reactive-systems/inventory-service/pom.xml b/reactive-systems/inventory-service/pom.xml index 4aeec24922..baf5151fdc 100644 --- a/reactive-systems/inventory-service/pom.xml +++ b/reactive-systems/inventory-service/pom.xml @@ -31,6 +31,7 @@ org.projectlombok lombok true + ${lombok.version} org.springframework.boot diff --git a/reactive-systems/order-service/pom.xml b/reactive-systems/order-service/pom.xml index b9e5d36d3a..b6cfb70678 100644 --- a/reactive-systems/order-service/pom.xml +++ b/reactive-systems/order-service/pom.xml @@ -31,6 +31,7 @@ org.projectlombok lombok true + ${lombok.version} org.springframework.boot diff --git a/reactive-systems/shipping-service/pom.xml b/reactive-systems/shipping-service/pom.xml index 5fac674bbc..8f94dabdea 100644 --- a/reactive-systems/shipping-service/pom.xml +++ b/reactive-systems/shipping-service/pom.xml @@ -31,6 +31,7 @@ org.projectlombok lombok true + ${lombok.version} org.springframework.boot diff --git a/saas-modules/stripe/pom.xml b/saas-modules/stripe/pom.xml index 44bc5be4a8..77bb912b7b 100644 --- a/saas-modules/stripe/pom.xml +++ b/saas-modules/stripe/pom.xml @@ -27,6 +27,7 @@ org.projectlombok lombok + ${lombok.version} com.stripe diff --git a/security-modules/sql-injection-samples/pom.xml b/security-modules/sql-injection-samples/pom.xml index 7953e43ebe..37779e0d14 100644 --- a/security-modules/sql-injection-samples/pom.xml +++ b/security-modules/sql-injection-samples/pom.xml @@ -38,6 +38,7 @@ org.projectlombok lombok + ${lombok.version} provided diff --git a/spring-4/pom.xml b/spring-4/pom.xml index 681747c1f6..ad05123543 100644 --- a/spring-4/pom.xml +++ b/spring-4/pom.xml @@ -57,6 +57,7 @@ org.projectlombok lombok + ${lombok.version} provided diff --git a/spring-5-webflux/pom.xml b/spring-5-webflux/pom.xml index fe6dbe5292..8a381b250a 100644 --- a/spring-5-webflux/pom.xml +++ b/spring-5-webflux/pom.xml @@ -46,6 +46,7 @@ org.projectlombok lombok + ${lombok.version} org.springframework.boot diff --git a/spring-boot-modules/spring-boot-3-2/pom.xml b/spring-boot-modules/spring-boot-3-2/pom.xml index c85488d44b..e48b232a52 100644 --- a/spring-boot-modules/spring-boot-3-2/pom.xml +++ b/spring-boot-modules/spring-boot-3-2/pom.xml @@ -79,6 +79,7 @@ org.projectlombok lombok + ${lombok.version} true diff --git a/spring-boot-modules/spring-boot-graphql/pom.xml b/spring-boot-modules/spring-boot-graphql/pom.xml index d3c122709d..b3f27f1b84 100644 --- a/spring-boot-modules/spring-boot-graphql/pom.xml +++ b/spring-boot-modules/spring-boot-graphql/pom.xml @@ -59,6 +59,7 @@ org.projectlombok lombok + ${lombok.version} com.h2database diff --git a/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/intro/SpringContextTest.java b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/intro/SpringContextTest.java index 87bebf644c..a2e63a96f8 100644 --- a/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/intro/SpringContextTest.java +++ b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/intro/SpringContextTest.java @@ -1,6 +1,5 @@ package com.baeldung.graphql.intro; -import com.baeldung.graphql.intro.GraphqlApplication; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; diff --git a/spring-boot-modules/spring-boot-logging-log4j2/pom.xml b/spring-boot-modules/spring-boot-logging-log4j2/pom.xml index 31c0f4bd02..de21a99ab3 100644 --- a/spring-boot-modules/spring-boot-logging-log4j2/pom.xml +++ b/spring-boot-modules/spring-boot-logging-log4j2/pom.xml @@ -40,6 +40,7 @@ org.projectlombok lombok + ${lombok.version} provided diff --git a/spring-boot-modules/spring-boot-mvc-birt/pom.xml b/spring-boot-modules/spring-boot-mvc-birt/pom.xml index cc4b7f8283..b2cda67974 100644 --- a/spring-boot-modules/spring-boot-mvc-birt/pom.xml +++ b/spring-boot-modules/spring-boot-mvc-birt/pom.xml @@ -48,6 +48,7 @@ org.projectlombok lombok + ${lombok.version} provided diff --git a/spring-boot-modules/spring-boot-mvc/pom.xml b/spring-boot-modules/spring-boot-mvc/pom.xml index 963cda61b9..ab1c867d66 100644 --- a/spring-boot-modules/spring-boot-mvc/pom.xml +++ b/spring-boot-modules/spring-boot-mvc/pom.xml @@ -92,6 +92,7 @@ org.projectlombok lombok + ${lombok.version} diff --git a/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/pom.xml b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/pom.xml index 600fedc774..371b5c2976 100644 --- a/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/pom.xml +++ b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/pom.xml @@ -44,7 +44,6 @@ 1.11.407 5.0.3 0.7.6 - 1.18.26 \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/pom.xml b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/pom.xml index 2871f129b5..1ef57d4be3 100644 --- a/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/pom.xml +++ b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/pom.xml @@ -34,8 +34,4 @@ - - 1.18.26 - - \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml index 08a85d191a..e540645f30 100644 --- a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml +++ b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml @@ -74,6 +74,7 @@ org.projectlombok lombok + ${lombok.version} org.testcontainers diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml index f27b16acc3..a3c793b93a 100644 --- a/spring-core-2/pom.xml +++ b/spring-core-2/pom.xml @@ -133,6 +133,7 @@ org.projectlombok lombok + ${lombok.version} diff --git a/spring-credhub/pom.xml b/spring-credhub/pom.xml index defe378b6b..f257d549bf 100644 --- a/spring-credhub/pom.xml +++ b/spring-credhub/pom.xml @@ -23,6 +23,7 @@ org.projectlombok lombok + ${lombok.version} org.springframework.credhub diff --git a/spring-kafka-2/pom.xml b/spring-kafka-2/pom.xml index 05da9418b7..7a4d5a5fea 100644 --- a/spring-kafka-2/pom.xml +++ b/spring-kafka-2/pom.xml @@ -38,6 +38,7 @@ org.projectlombok lombok + ${lombok.version} org.springframework.kafka diff --git a/spring-kafka/pom.xml b/spring-kafka/pom.xml index ddef3ca180..6428734de2 100644 --- a/spring-kafka/pom.xml +++ b/spring-kafka/pom.xml @@ -48,6 +48,7 @@ org.projectlombok lombok + ${lombok.version} org.springframework.kafka diff --git a/spring-reactive-modules/spring-reactive-2/pom.xml b/spring-reactive-modules/spring-reactive-2/pom.xml index 90c5300cc8..a5552bfe51 100644 --- a/spring-reactive-modules/spring-reactive-2/pom.xml +++ b/spring-reactive-modules/spring-reactive-2/pom.xml @@ -37,6 +37,7 @@ org.projectlombok lombok provided + ${lombok.version} org.springframework.boot diff --git a/spring-reactive-modules/spring-reactive-3/pom.xml b/spring-reactive-modules/spring-reactive-3/pom.xml index bf2cdbbf2d..17c9690157 100644 --- a/spring-reactive-modules/spring-reactive-3/pom.xml +++ b/spring-reactive-modules/spring-reactive-3/pom.xml @@ -46,6 +46,7 @@ org.projectlombok lombok + ${lombok.version} org.springframework.boot diff --git a/spring-reactive-modules/spring-reactive-client/pom.xml b/spring-reactive-modules/spring-reactive-client/pom.xml index 5736ce497f..fe53584cc9 100644 --- a/spring-reactive-modules/spring-reactive-client/pom.xml +++ b/spring-reactive-modules/spring-reactive-client/pom.xml @@ -106,6 +106,7 @@ org.projectlombok lombok + ${lombok.version} org.mockito diff --git a/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml b/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml index 2ac8ad19ac..e0b21087fa 100644 --- a/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml +++ b/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml @@ -140,7 +140,6 @@ 2.2.6.RELEASE 2.17.1 - 1.18.26 \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-data/pom.xml b/spring-reactive-modules/spring-reactive-data/pom.xml index a598315d5d..576a1d9f86 100644 --- a/spring-reactive-modules/spring-reactive-data/pom.xml +++ b/spring-reactive-modules/spring-reactive-data/pom.xml @@ -53,6 +53,7 @@ org.projectlombok lombok true + ${lombok.version} io.projectreactor diff --git a/spring-reactive-modules/spring-reactive-security/pom.xml b/spring-reactive-modules/spring-reactive-security/pom.xml index cf34b21083..25b9f4c38f 100644 --- a/spring-reactive-modules/spring-reactive-security/pom.xml +++ b/spring-reactive-modules/spring-reactive-security/pom.xml @@ -41,6 +41,7 @@ org.projectlombok lombok compile + ${lombok.version} org.apache.geronimo.specs diff --git a/spring-security-modules/spring-security-azuread/pom.xml b/spring-security-modules/spring-security-azuread/pom.xml index 7e67a7e635..11d6b876c1 100644 --- a/spring-security-modules/spring-security-azuread/pom.xml +++ b/spring-security-modules/spring-security-azuread/pom.xml @@ -48,6 +48,7 @@ org.projectlombok lombok true + ${lombok.version} org.springframework.boot diff --git a/spring-security-modules/spring-security-opa/pom.xml b/spring-security-modules/spring-security-opa/pom.xml index a6240f6e69..81c4709124 100644 --- a/spring-security-modules/spring-security-opa/pom.xml +++ b/spring-security-modules/spring-security-opa/pom.xml @@ -23,6 +23,7 @@ org.projectlombok lombok + ${lombok.version} com.google.guava diff --git a/spring-web-modules/spring-mvc-forms-thymeleaf/pom.xml b/spring-web-modules/spring-mvc-forms-thymeleaf/pom.xml index eb31723798..9c9d6804ae 100644 --- a/spring-web-modules/spring-mvc-forms-thymeleaf/pom.xml +++ b/spring-web-modules/spring-mvc-forms-thymeleaf/pom.xml @@ -27,6 +27,7 @@ org.projectlombok lombok + ${lombok.version} diff --git a/testing-modules/cucumber/pom.xml b/testing-modules/cucumber/pom.xml index 6d178b86a3..c1d99bb492 100644 --- a/testing-modules/cucumber/pom.xml +++ b/testing-modules/cucumber/pom.xml @@ -42,6 +42,7 @@ org.projectlombok lombok provided + ${lombok.version} io.cucumber diff --git a/testing-modules/spring-mockito/pom.xml b/testing-modules/spring-mockito/pom.xml index 6283ea2d1f..8e13f511d2 100644 --- a/testing-modules/spring-mockito/pom.xml +++ b/testing-modules/spring-mockito/pom.xml @@ -29,6 +29,7 @@ org.projectlombok lombok + ${lombok.version} From 5d13422a53d95116560abe2d48da18e8107d56b3 Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Sun, 3 Dec 2023 22:17:16 +0100 Subject: [PATCH 143/294] BAEL-7258: kafka listener without spring --- .../kafka/consumer/CustomKafkaListener.java | 68 +++++++++++++++ .../KafkaListenerWithoutSpringLiveTest.java | 85 +++++++++++++++++++ 2 files changed, 153 insertions(+) create mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/consumer/CustomKafkaListener.java create mode 100644 apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/KafkaListenerWithoutSpringLiveTest.java diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/consumer/CustomKafkaListener.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/consumer/CustomKafkaListener.java new file mode 100644 index 0000000000..58987d473b --- /dev/null +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/consumer/CustomKafkaListener.java @@ -0,0 +1,68 @@ +package com.baeldung.kafka.consumer; + +import java.io.Closeable; +import java.time.Duration; +import java.util.Arrays; +import java.util.Properties; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Consumer; +import java.util.logging.Logger; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.common.serialization.StringDeserializer; + +public class CustomKafkaListener implements Runnable, Closeable { + + private static final Logger log = Logger.getLogger(CustomKafkaListener.class.getName()); + + private final String topic; + private final KafkaConsumer consumer; + + private final AtomicBoolean running = new AtomicBoolean(false); + private Consumer recordConsumer; + + + public CustomKafkaListener(String topic, KafkaConsumer consumer) { + this.topic = topic; + this.consumer = consumer; + this.recordConsumer = record -> log.info("received: " + record); + } + + public CustomKafkaListener(String topic, String bootstrapServers) { + this(topic, defaultKafkaConsumer(bootstrapServers)); + } + + private static KafkaConsumer defaultKafkaConsumer(String boostrapServers) { + Properties props = new Properties(); + props.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, boostrapServers); + props.setProperty(ConsumerConfig.GROUP_ID_CONFIG, "test_group_id"); + props.setProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); + props.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + props.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + return new KafkaConsumer<>(props); + } + + public CustomKafkaListener doForEach(Consumer newConsumer) { + recordConsumer = recordConsumer.andThen(newConsumer); + return this; + } + + @Override + public void run() { + running.set(true); + consumer.subscribe(Arrays.asList(topic)); + + while (running.get()) { + consumer.poll(Duration.ofMillis(100)) + .forEach(record -> recordConsumer.accept(record.value())); + } + } + + @Override + public void close() { + running.set(false); + consumer.close(); + } + +} diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/KafkaListenerWithoutSpringLiveTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/KafkaListenerWithoutSpringLiveTest.java new file mode 100644 index 0000000000..213344d0a8 --- /dev/null +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/KafkaListenerWithoutSpringLiveTest.java @@ -0,0 +1,85 @@ +package com.baeldung.kafka.consumer; + +import static java.time.Duration.ofMillis; +import static java.time.Duration.ofSeconds; +import static java.util.Arrays.asList; +import static org.assertj.core.api.Assertions.assertThat; +import static org.testcontainers.shaded.org.awaitility.Awaitility.await; + +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import java.util.concurrent.CompletableFuture; + +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.serialization.StringSerializer; +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.KafkaContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.shaded.org.awaitility.Awaitility; +import org.testcontainers.utility.DockerImageName; + +@Testcontainers +class KafkaListenerWithoutSpringLiveTest { + + @Container + private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); + + static { + Awaitility.setDefaultTimeout(ofSeconds(1L)); + Awaitility.setDefaultPollInterval(ofMillis(50L)); + } + + @Test + void test() { + // given + String topic = "baeldung.articles.published"; + String bootstrapServers = KAFKA_CONTAINER.getBootstrapServers(); + List consumedMessages = new ArrayList<>(); + + // when + try (CustomKafkaListener listener = new CustomKafkaListener(topic, bootstrapServers)) { + CompletableFuture.runAsync(() -> + listener.doForEach(consumedMessages::add).run() + ); + } + // and + publishArticles(topic, asList( + "Introduction to Kafka", + "Kotlin for Java Developers", + "Reactive Spring Boot", + "Deploying Spring Boot Applications", + "Spring Security" + )); + + // then + await().untilAsserted(() -> assertThat(consumedMessages) + .containsExactlyInAnyOrder( + "Introduction to Kafka", + "Kotlin for Java Developers", + "Reactive Spring Boot", + "Deploying Spring Boot Applications", + "Spring Security" + )); + } + + private void publishArticles(String topic, List articles) { + try (KafkaProducer producer = testKafkaProducer()) { + articles.stream() + .map(article -> new ProducerRecord(topic, article)) + .forEach(producer::send); + } + } + + private static KafkaProducer testKafkaProducer() { + Properties props = new Properties(); + props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + return new KafkaProducer<>(props); + } + +} \ No newline at end of file From 596c10de0acbd550c61b374f03cd78241b7a01ae Mon Sep 17 00:00:00 2001 From: uzma Date: Sun, 3 Dec 2023 22:23:51 +0000 Subject: [PATCH 144/294] [BAEL-7073] fix code style --- .../executorservice/ExecuteExample.java | 31 +++++++------ .../executorservice/SubmitExample.java | 43 +++++++++---------- 2 files changed, 35 insertions(+), 39 deletions(-) diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/ExecuteExample.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/ExecuteExample.java index 8331ff84fc..6b6d6e3e8a 100644 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/ExecuteExample.java +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/ExecuteExample.java @@ -4,22 +4,21 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ExecuteExample { - public static void main(String[] args) - { - ExecutorService executorService = Executors.newFixedThreadPool(2); - // Task using Runnable - Runnable task = () -> - { - int[] numbers = {1, 2, 3, 4, 5}; - int sum = 0; - for (int num : numbers) { - sum += num; - } - System.out.println("Sum calculated using execute:" + sum); - }; - // Submit the task using execute - executorService.execute(task); executorService.shutdown(); + public static void main(String[] args) { + ExecutorService executorService = Executors.newFixedThreadPool(2); + // Task using Runnable + Runnable task = () -> { + int[] numbers = { 1, 2, 3, 4, 5 }; + int sum = 0; + for (int num : numbers) { + sum += num; + } + System.out.println("Sum calculated using execute:" + sum); + }; + // Submit the task using execute + executorService.execute(task); + executorService.shutdown(); - } + } } diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/SubmitExample.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/SubmitExample.java index 93fa77be1d..cd715edcc0 100644 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/SubmitExample.java +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/SubmitExample.java @@ -7,28 +7,25 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; public class SubmitExample { - public static void main(String[] args) - { - ExecutorService executorService = Executors.newFixedThreadPool(2); - Callable task = () -> - { - int[] numbers = {1, 2, 3, 4, 5}; - int sum = 0; - for (int num : numbers) { - sum += num; - } - return sum; - }; - // Submit the task and obtain a Future - Future result = executorService.submit(task); - try { - // Get the result - int sum = result.get(); - System.out.println("Sum calculated using submit:" + sum); - } catch (InterruptedException | ExecutionException e) - { - e.printStackTrace(); + public static void main(String[] args) { + ExecutorService executorService = Executors.newFixedThreadPool(2); + Callable task = () -> { + int[] numbers = { 1, 2, 3, 4, 5 }; + int sum = 0; + for (int num : numbers) { + sum += num; + } + return sum; + }; + // Submit the task and obtain a Future + Future result = executorService.submit(task); + try { + // Get the result + int sum = result.get(); + System.out.println("Sum calculated using submit:" + sum); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + executorService.shutdown(); } - executorService.shutdown(); - } } \ No newline at end of file From e6c2c4ab6427cbce20aec559ad37e367fabefc95 Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Mon, 4 Dec 2023 09:15:45 +0000 Subject: [PATCH 145/294] https://jira.baeldung.com/browse/BAEL-7169 --- .../src/test/java/com/baeldung/finalstatic/BikeUnitTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java index 3699a061ab..7b32b0906c 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java @@ -25,4 +25,9 @@ class BikeUnitTest { assertEquals(5, Bike.PART.get("seat")); } + @Test + void givenMathClass_whenAccessingPiConstant_thenVerifyPiValueIsCorrect() { + assertEquals(3.141592653589793, Math.PI); + } + } \ No newline at end of file From 67e11e004e464359406396e1b9bb276b00bfb1d6 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Mon, 4 Dec 2023 13:11:26 +0200 Subject: [PATCH 146/294] [JAVA-27743] Upgraded spring-integration module to spring 6 & java 17 (#15343) --- spring-integration/pom.xml | 26 +++++++++---------- .../baeldung/dsl/JavaDSLFileCopyConfig.java | 18 ++++++------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/spring-integration/pom.xml b/spring-integration/pom.xml index abf5cfb3d6..315f549c12 100644 --- a/spring-integration/pom.xml +++ b/spring-integration/pom.xml @@ -17,7 +17,6 @@ - org.springframework.integration spring-integration-core @@ -29,11 +28,6 @@ ${javax-activation.version} true - - javax.mail - mail - ${javax-mail.version} - org.springframework.integration spring-integration-twitter @@ -85,16 +79,21 @@ h2 ${h2.version} - - javax.xml.bind - jaxb-api - ${jaxb-api.version} - org.postgresql postgresql ${postgresql.version} + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + com.sun.mail + jakarta.mail + ${jakarta.mail.version} + @@ -124,14 +123,13 @@ - 5.1.13.RELEASE + 6.0.0 1.1.4.RELEASE 5.0.13.RELEASE - 1.4.7 1.1.1 2.10 - 2.3.0 42.3.8 + 2.0.1 \ No newline at end of file diff --git a/spring-integration/src/main/java/com/baeldung/dsl/JavaDSLFileCopyConfig.java b/spring-integration/src/main/java/com/baeldung/dsl/JavaDSLFileCopyConfig.java index adaeac5386..8afd39e9ab 100644 --- a/spring-integration/src/main/java/com/baeldung/dsl/JavaDSLFileCopyConfig.java +++ b/spring-integration/src/main/java/com/baeldung/dsl/JavaDSLFileCopyConfig.java @@ -1,6 +1,7 @@ package com.baeldung.dsl; import java.io.File; +import java.time.Duration; import java.util.Scanner; import java.util.concurrent.TimeUnit; @@ -14,7 +15,6 @@ import org.springframework.integration.config.EnableIntegration; import org.springframework.integration.core.GenericSelector; import org.springframework.integration.core.MessageSource; import org.springframework.integration.dsl.IntegrationFlow; -import org.springframework.integration.dsl.IntegrationFlows; import org.springframework.integration.dsl.Pollers; import org.springframework.integration.dsl.MessageChannels; import org.springframework.integration.file.FileReadingMessageSource; @@ -69,7 +69,7 @@ public class JavaDSLFileCopyConfig { @Bean public IntegrationFlow fileMover() { - return IntegrationFlows.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10000))) + return IntegrationFlow.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10000))) .filter(onlyJpgs()) .handle(targetDirectory()) .get(); @@ -77,7 +77,7 @@ public class JavaDSLFileCopyConfig { // @Bean public IntegrationFlow fileMoverWithLambda() { - return IntegrationFlows.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10000))) + return IntegrationFlow.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10000))) .filter(message -> ((File) message).getName() .endsWith(".jpg")) .handle(targetDirectory()) @@ -92,7 +92,7 @@ public class JavaDSLFileCopyConfig { // @Bean public IntegrationFlow fileMoverWithPriorityChannel() { - return IntegrationFlows.from(sourceDirectory()) + return IntegrationFlow.from(sourceDirectory()) .filter(onlyJpgs()) .channel("alphabetically") .handle(targetDirectory()) @@ -113,7 +113,7 @@ public class JavaDSLFileCopyConfig { // @Bean public IntegrationFlow fileReader() { - return IntegrationFlows.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10))) + return IntegrationFlow.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10))) .filter(onlyJpgs()) .channel("holdingTank") .get(); @@ -121,16 +121,16 @@ public class JavaDSLFileCopyConfig { // @Bean public IntegrationFlow fileWriter() { - return IntegrationFlows.from("holdingTank") - .bridge(e -> e.poller(Pollers.fixedRate(1, TimeUnit.SECONDS, 20))) + return IntegrationFlow.from("holdingTank") + .bridge(e -> e.poller(Pollers.fixedRate(Duration.of(1, TimeUnit.SECONDS.toChronoUnit()), Duration.of(20, TimeUnit.SECONDS.toChronoUnit())))) .handle(targetDirectory()) .get(); } // @Bean public IntegrationFlow anotherFileWriter() { - return IntegrationFlows.from("holdingTank") - .bridge(e -> e.poller(Pollers.fixedRate(2, TimeUnit.SECONDS, 10))) + return IntegrationFlow.from("holdingTank") + .bridge(e -> e.poller(Pollers.fixedRate(Duration.of(2, TimeUnit.SECONDS.toChronoUnit()), Duration.of(10, TimeUnit.SECONDS.toChronoUnit())))) .handle(anotherTargetDirectory()) .get(); } From 75afba12d1dcc269cdbeb97060ef6f8a40082b1f Mon Sep 17 00:00:00 2001 From: Sam Gardner Date: Mon, 4 Dec 2023 13:18:04 +0000 Subject: [PATCH 147/294] BAEL-7240 Add example code for verifying lambda calls with mockito --- .../baeldung/lambdacalls/LambdaExample.java | 26 ++++++++++++ .../lambdacalls/LambdaCallsUnitTest.java | 41 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 testing-modules/mockito-2/src/main/java/com/baeldung/lambdacalls/LambdaExample.java create mode 100644 testing-modules/mockito-2/src/test/java/com/baeldung/lambdacalls/LambdaCallsUnitTest.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/lambdacalls/LambdaExample.java b/testing-modules/mockito-2/src/main/java/com/baeldung/lambdacalls/LambdaExample.java new file mode 100644 index 0000000000..bc6274eb18 --- /dev/null +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/lambdacalls/LambdaExample.java @@ -0,0 +1,26 @@ +package com.baeldung.lambdacalls; + +import java.util.ArrayList; + +public class LambdaExample { + + private BrickLayer brickLayer = new BrickLayer(); + + static ArrayList bricksList = new ArrayList<>(); + + public void createWall(String bricks){ + Runnable build = () -> brickLayer.layBricks(bricks); + build.run(); + } + + public ArrayList getBricksList(){ + return bricksList; + } + + static class BrickLayer { + void layBricks(String bricks){ + bricksList.add(bricks); + } + } + +} diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/lambdacalls/LambdaCallsUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/lambdacalls/LambdaCallsUnitTest.java new file mode 100644 index 0000000000..67127c641c --- /dev/null +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/lambdacalls/LambdaCallsUnitTest.java @@ -0,0 +1,41 @@ +package com.baeldung.lambdacalls; + +import static com.baeldung.lambdacalls.LambdaExample.*; +import static junit.framework.TestCase.assertEquals; +import static org.mockito.Mockito.verify; + +import java.util.ArrayList; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class LambdaCallsUnitTest { + + @Mock + private/**/ BrickLayer brickLayer; + @InjectMocks + private LambdaExample lambdaExample; + + @Test + public void whenCallingALambda_thenTheInvocationCanBeConfirmedWithCorrectArguments(){ + String bricks = "red bricks"; + lambdaExample.createWall(bricks); + verify(brickLayer).layBricks(bricks); + } + + @Test + public void whenCallingALambda_thenCorrectBehaviourIsPerformed(){ + LambdaExample lambdaExample = new LambdaExample(); + String bricks = "red bricks"; + + lambdaExample.createWall(bricks); + ArrayList bricksList = lambdaExample.getBricksList(); + + assertEquals(bricks, bricksList.get(0)); + } + +} From 9bf766f6195b67bb79127d3855ac110a195cf21d Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Mon, 4 Dec 2023 11:37:09 -0300 Subject: [PATCH 148/294] BAEL ???? - Intro to XPath with Java - quick fix Based on email feedback. * Changing `childs` to `childNodes` * Changing `nodeList = (NodeList)` to `NodeList nodeList = (NodeList)` --- xml/src/main/java/com/baeldung/xml/DefaultParser.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xml/src/main/java/com/baeldung/xml/DefaultParser.java b/xml/src/main/java/com/baeldung/xml/DefaultParser.java index 83280aa0f2..63e4a453c3 100644 --- a/xml/src/main/java/com/baeldung/xml/DefaultParser.java +++ b/xml/src/main/java/com/baeldung/xml/DefaultParser.java @@ -163,10 +163,10 @@ public class DefaultParser { private void clean(Node node) { - NodeList childs = node.getChildNodes(); + NodeList childNodes = node.getChildNodes(); - for (int n = childs.getLength() - 1; n >= 0; n--) { - Node child = childs.item(n); + for (int n = childNodes.getLength() - 1; n >= 0; n--) { + Node child = childNodes.item(n); short nodeType = child.getNodeType(); if (nodeType == Node.ELEMENT_NODE) From e8c97fd6e57ac7902955516c9f027d6132a6c77f Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Mon, 4 Dec 2023 22:05:54 +0530 Subject: [PATCH 149/294] BAEL-7062 - Fetching Index from List using Streams (#14914) * Primary Commit * More Cases covered * Indentation Corrections on POM * Merge Conflict Fixed * Updating as per Jira comments * Correction * Review Comment Implementation * Indentation fixes * Review Comment Implementation * Method removal for Iterators * Test Case Update * Review Comment changes * formatting change * Updating map method * Review comment update * Review Comments * Review Comments --- core-java-modules/core-java-streams-5/pom.xml | 5 ++ .../streams/firstmatchingelement/User.java | 21 ++++++ .../FirstMatchingElementUnitTest.java | 72 +++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/firstmatchingelement/User.java create mode 100644 core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java diff --git a/core-java-modules/core-java-streams-5/pom.xml b/core-java-modules/core-java-streams-5/pom.xml index e217271f4c..33cd69f761 100644 --- a/core-java-modules/core-java-streams-5/pom.xml +++ b/core-java-modules/core-java-streams-5/pom.xml @@ -48,6 +48,11 @@ guava ${guava.version} + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + diff --git a/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/firstmatchingelement/User.java b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/firstmatchingelement/User.java new file mode 100644 index 0000000000..cb29af529a --- /dev/null +++ b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/firstmatchingelement/User.java @@ -0,0 +1,21 @@ +package com.baeldung.streams.firstmatchingelement; + +public class User { + + private String userName; + private Integer userId; + + public User(Integer userId, String userName) { + this.userId = userId; + this.userName = userName; + } + + public String getUserName() { + return userName; + } + + public Integer getUserId() { + return userId; + } + +} diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java new file mode 100644 index 0000000000..db9415e94b --- /dev/null +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java @@ -0,0 +1,72 @@ +package com.baeldung.streams.firstmatchingelement; + + +import static org.junit.Assert.assertEquals; + +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.IntStream; + +import org.apache.commons.collections4.IterableUtils; +import org.junit.Test; + +import com.google.common.collect.Iterables; + +public class FirstMatchingElementUnitTest { + + private List userList = List.of(new User(1, "David"), new User(2, "John"), new User(3, "Roger"), new User(4, "John")); + private String searchName = "John"; + + @Test + public void whenUsingStream_thenFindFirstMatchingUserIndex() { + AtomicInteger counter = new AtomicInteger(-1); + int index = userList.stream() + .filter(user -> { + counter.getAndIncrement(); + return searchName.equals(user.getUserName()); + }) + .mapToInt(user -> counter.get()) + .findFirst() + .orElse(-1); + + assertEquals(1, index); + } + + @Test + public void whenUsingIntStream_thenFindFirstMatchingUserIndex() { + int index = IntStream.range(0, userList.size() - 1) + .filter(streamIndex -> searchName.equals(userList.get(streamIndex).getUserName())) + .findFirst() + .orElse(-1); + assertEquals(1, index); + } + + @Test + public void whenUsingTakeWhile_thenFindFirstMatchingUserIndex() { + long predicateIndex = userList.stream() + .takeWhile(user -> !user.getUserName().equals(searchName)) + .count(); + assertEquals(1, predicateIndex); + } + + @Test + public void whenUsingTakeWhile_thenFindIndexFromNoMatchingElement() { + List userList = List.of(new User(1, "David"), new User(2, "Vick"), new User(3, "Roger"), new User(4, "James")); + long predicateIndex = userList.stream() + .takeWhile(user -> !user.getUserName().equals(searchName)) + .count(); + assertEquals(4, predicateIndex); + } + + @Test + public void whenUsingGoogleGuava_thenFindFirstMatchingUserIndex() { + int index = Iterables.indexOf(userList, user -> searchName.equals(user.getUserName())); + assertEquals(1, index); + } + + @Test + public void whenUsingApacheCommons_thenFindFirstMatchingUserIndex() { + int index = IterableUtils.indexOf(userList, user -> searchName.equals(user.getUserName())); + assertEquals(1, index); + } +} From b55f4db54907227aaead6a856c003e666f4340ec Mon Sep 17 00:00:00 2001 From: anujgaud <146576725+anujgaud@users.noreply.github.com> Date: Mon, 4 Dec 2023 23:15:47 +0530 Subject: [PATCH 150/294] Fix package name --- .../main/java/com/baeldung/localdatetoiso/LocalDateToISO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java index a62be336ca..e09d823ce4 100644 --- a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java +++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/localdatetoiso/LocalDateToISO.java @@ -1,4 +1,4 @@ -package com.baeldung.localDateToISO; +package com.baeldung.localdatetoiso; import java.text.DateFormat; import java.text.SimpleDateFormat; From 89db04b79bc22a00b7e0a7ed5fdfd0f399946624 Mon Sep 17 00:00:00 2001 From: anujgaud <146576725+anujgaud@users.noreply.github.com> Date: Mon, 4 Dec 2023 23:17:06 +0530 Subject: [PATCH 151/294] Fix Package name --- .../com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java index c8a77d3e39..28378c61fc 100644 --- a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.localDateToISO; +package com.baeldung.localdatetoiso; import static org.junit.Assert.assertEquals; From d660f1b8fe00fa0ffe9d532876a35cbfebb4aafe Mon Sep 17 00:00:00 2001 From: anujgaud <146576725+anujgaud@users.noreply.github.com> Date: Mon, 4 Dec 2023 23:21:46 +0530 Subject: [PATCH 152/294] Append _ before then --- .../baeldung/localdatetoiso/LocalDateToISOUnitTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java index 28378c61fc..06b25c8e44 100644 --- a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java @@ -7,7 +7,7 @@ import java.time.LocalDate; public class LocalDateToISOUnitTest { @Test - public void givenLocalDate_whenUsingDateTimeFormatterThenISOFormat(){ + public void givenLocalDate_whenUsingDateTimeFormatter_thenISOFormat(){ LocalDateToISO localDateToISO = new LocalDateToISO(); LocalDate localDate = LocalDate.of(2023, 11, 6); @@ -17,7 +17,7 @@ public class LocalDateToISOUnitTest { } @Test - public void givenLocalDate_whenUsingSimpleDateFormatThenISOFormat(){ + public void givenLocalDate_whenUsingSimpleDateFormat_thenISOFormat(){ LocalDateToISO localDateToISO = new LocalDateToISO(); LocalDate localDate = LocalDate.of(2023, 11, 6); @@ -27,7 +27,7 @@ public class LocalDateToISOUnitTest { } @Test - public void givenLocalDate_whenUsingJodaTimeThenISOFormat() { + public void givenLocalDate_whenUsingJodaTime_thenISOFormat() { LocalDateToISO localDateToISO = new LocalDateToISO(); org.joda.time.LocalDate localDate = new org.joda.time.LocalDate(2023, 11, 6); @@ -37,7 +37,7 @@ public class LocalDateToISOUnitTest { } @Test - public void givenLocalDate_whenUsingApacheCommonsLangThenISOFormat() { + public void givenLocalDate_whenUsingApacheCommonsLang_thenISOFormat() { LocalDateToISO localDateToISO = new LocalDateToISO(); LocalDate localDate = LocalDate.of(2023, 11, 6); From 296e5498e827ed1508b54218e0afbba0617f35ac Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Mon, 4 Dec 2023 23:24:24 +0530 Subject: [PATCH 153/294] BAEL-7308: Comparing One String with Multiple Values in One Expression in Java --- .../java/compareany/CompareAnyUnitTest.java | 72 ++++++++++++++----- 1 file changed, 54 insertions(+), 18 deletions(-) diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/compareany/CompareAnyUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/compareany/CompareAnyUnitTest.java index 778746753c..2d6af5456a 100644 --- a/core-java-modules/core-java-string-operations-7/src/test/java/compareany/CompareAnyUnitTest.java +++ b/core-java-modules/core-java-string-operations-7/src/test/java/compareany/CompareAnyUnitTest.java @@ -1,6 +1,7 @@ package compareany; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Arrays; import java.util.Set; @@ -16,8 +17,8 @@ public class CompareAnyUnitTest { String presentString = "Apple"; String notPresentString = "Avocado"; - assertTrue(matchAnyWithIf(presentString, "Mango", "Papaya", "PineApple", "Apple")); - assertFalse(matchAnyWithIf(notPresentString, "Mango", "Papaya", "PineApple", "Apple")); + assertTrue(matchAnyWithIf(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(matchAnyWithIf(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } @Test @@ -25,8 +26,8 @@ public class CompareAnyUnitTest { String presentString = "Apple"; String notPresentString = "Avocado"; - assertTrue(compareWithAnyUsingArrayUtils(presentString, "Mango", "Papaya", "PineApple", "Apple")); - assertFalse(compareWithAnyUsingArrayUtils(notPresentString, "Mango", "Papaya", "PineApple", "Apple")); + assertTrue(compareWithAnyUsingArrayUtils(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareWithAnyUsingArrayUtils(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } @Test @@ -34,17 +35,34 @@ public class CompareAnyUnitTest { String presentString = "Apple"; String notPresentString = "Avocado"; - assertTrue(compareWithAnyUsingStringUtils(presentString, "Mango", "Papaya", "PineApple", "Apple")); - assertFalse(compareWithAnyUsingStringUtils(notPresentString, "Mango", "Papaya", "PineApple", "Apple")); + assertTrue(compareWithAnyUsingStringUtils(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareWithAnyUsingStringUtils(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } + @Test + void givenStrings_whenCompareCaseInsensitiveUsingStringUtils_thenSuccess() { + String presentString = "APPLE"; + String notPresentString = "AVOCADO"; + + assertTrue(compareWithAnyCaseInsensitiveUsingStringUtils(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareWithAnyCaseInsensitiveUsingStringUtils(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); + } @Test void givenStrings_whenCompareUsingStream_thenSuccess() { String presentString = "Apple"; String notPresentString = "Avocado"; - assertTrue(compareWithAnyUsingStream(presentString, "Mango", "Papaya", "PineApple", "Apple")); - assertFalse(compareWithAnyUsingStream(notPresentString, "Mango", "Papaya", "PineApple", "Apple")); + assertTrue(compareWithAnyUsingStream(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareWithAnyUsingStream(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); + } + + @Test + void givenStrings_whenCompareCaseInsensitiveUsingStream_thenSuccess() { + String presentString = "APPLE"; + String notPresentString = "AVOCADO"; + + assertTrue(compareWithAnyCaseInsensitiveUsingStream(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareWithAnyCaseInsensitiveUsingStream(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } @Test @@ -52,8 +70,8 @@ public class CompareAnyUnitTest { String presentString = "Apple"; String notPresentString = "Avocado"; - assertTrue(compareWithAnyUsingSet(presentString, "Mango", "Papaya", "PineApple", "Apple")); - assertFalse(compareWithAnyUsingSet(notPresentString, "Mango", "Papaya", "PineApple", "Apple")); + assertTrue(compareWithAnyUsingSet(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareWithAnyUsingSet(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } @Test @@ -61,8 +79,17 @@ public class CompareAnyUnitTest { String presentString = "Apple"; String notPresentString = "Avocado"; - assertTrue(compareWithAnyUsingRegularExpression(presentString, "Mango", "Papaya", "PineApple", "Apple")); - assertFalse(compareWithAnyUsingRegularExpression(notPresentString, "Mango", "Papaya", "PineApple", "Apple")); + assertTrue(compareWithAnyUsingRegularExpression(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareWithAnyUsingRegularExpression(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); + } + + @Test + void givenStrings_whenCompareCaseInsensitiveUsingRegularExpression_thenSuccess() { + String presentString = "APPLE"; + String notPresentString = "AVOCADO"; + + assertTrue(compareWithAnyCaseInsensitiveUsingRegularExpression(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareWithAnyCaseInsensitiveUsingRegularExpression(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } private boolean matchAnyWithIf(String str, String ... strs) { @@ -78,20 +105,29 @@ public class CompareAnyUnitTest { return StringUtils.containsAny(str, strs); } + private boolean compareWithAnyCaseInsensitiveUsingStringUtils(String str, String ... strs) { + return StringUtils.containsAnyIgnoreCase(str, strs); + } + private boolean compareWithAnyUsingSet(String str, String ... strs) { return Set.of(strs).contains(str); } - private static boolean compareWithAnyUsingRegularExpression(String str, String ... strs) { + private boolean compareWithAnyUsingRegularExpression(String str, String ... strs) { return str.matches(String.join("|", strs)); } - private static boolean compareWithAnyUsingStream(String str, String ... strs) { + private boolean compareWithAnyCaseInsensitiveUsingRegularExpression(String str, String ... strs) { + return str.matches("(?i)" + String.join("|", strs)); + } + + private boolean compareWithAnyUsingStream(String str, String ... strs) { return Arrays.stream(strs).anyMatch(str::equals); } - - private static boolean compareWithAnyUsingArrayUtils(String str, String ... strs) { + private boolean compareWithAnyCaseInsensitiveUsingStream(String str, String ... strs) { + return Arrays.stream(strs).anyMatch(str::equalsIgnoreCase); + } + private boolean compareWithAnyUsingArrayUtils(String str, String ... strs) { return ArrayUtils.contains(strs, str); } - } From cf858a14930d2fa32de16b761f332c9895b1a551 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 5 Dec 2023 07:13:20 +0200 Subject: [PATCH 154/294] Java 27490 (#15217) * [JAVA-27490] Set java.version of JDK 9+ profile to JDK 17 * [JAVA-27490] Removed java.version from modules * [JAVA-27490] Commented modules that are failing * [JAVA-27490] Clean up * [JAVA-27490] Clean up --- .../core-groovy-2/gmavenplus-pom.xml | 1 - core-java-modules/core-java-12/pom.xml | 4 -- core-java-modules/core-java-13/pom.xml | 4 -- core-java-modules/core-java-15/pom.xml | 4 -- .../pom.xml | 1 - core-java-modules/pom.xml | 16 +++--- .../multi-module-caching/pom.xml | 2 - docker-modules/pom.xml | 4 -- httpclient-simple/pom.xml | 1 - jackson-simple/pom.xml | 1 - jhipster-6/bookstore-monolith/pom.xml | 1 - kubernetes-modules/kubernetes-spring/pom.xml | 4 -- lightrun/lightrun-api-service/pom.xml | 4 -- lightrun/lightrun-tasks-service/pom.xml | 4 -- lightrun/lightrun-users-service/pom.xml | 4 -- maven-modules/maven-exec-plugin/pom.xml | 1 - maven-modules/maven-generate-war/pom.xml | 3 - messaging-modules/pom.xml | 4 +- messaging-modules/postgres-notify/pom.xml | 3 - parent-boot-3/pom.xml | 3 - persistence-modules/fauna/pom.xml | 1 - persistence-modules/pom.xml | 10 ++-- persistence-modules/rethinkdb/pom.xml | 4 -- .../spring-data-cassandra-2/pom.xml | 1 - pom.xml | 56 +++++++++---------- .../spring-project/pom.xml | 3 - spring-boot-modules/pom.xml | 2 +- .../spring-boot-cassandre/pom.xml | 1 - spring-boot-modules/spring-boot-redis/pom.xml | 1 - .../spring-boot-telegram/pom.xml | 1 - spring-native/pom-nativeimage.xml | 3 - spring-pulsar/pom.xml | 1 - .../spring-security-azuread/pom.xml | 4 -- .../reactive-resource-server/pom.xml | 4 +- .../servlet-resource-server/pom.xml | 4 +- .../spring-security-saml2/pom.xml | 1 - spring-soap/pom.xml | 1 - .../pom.xml | 1 - spring-vault/pom.xml | 1 - testing-modules/pom.xml | 4 +- 40 files changed, 48 insertions(+), 125 deletions(-) diff --git a/core-groovy-modules/core-groovy-2/gmavenplus-pom.xml b/core-groovy-modules/core-groovy-2/gmavenplus-pom.xml index 975ad6f689..256b5e88ab 100644 --- a/core-groovy-modules/core-groovy-2/gmavenplus-pom.xml +++ b/core-groovy-modules/core-groovy-2/gmavenplus-pom.xml @@ -167,7 +167,6 @@ UTF-8 3.9 - 1.8 1.2.3 diff --git a/core-java-modules/core-java-12/pom.xml b/core-java-modules/core-java-12/pom.xml index 8165549d8c..ae61bdfad0 100644 --- a/core-java-modules/core-java-12/pom.xml +++ b/core-java-modules/core-java-12/pom.xml @@ -21,8 +21,4 @@ - - 17 - - \ No newline at end of file diff --git a/core-java-modules/core-java-13/pom.xml b/core-java-modules/core-java-13/pom.xml index 52cf227583..b8ec8cfdb9 100644 --- a/core-java-modules/core-java-13/pom.xml +++ b/core-java-modules/core-java-13/pom.xml @@ -13,8 +13,4 @@ 0.0.1-SNAPSHOT - - 17 - - \ No newline at end of file diff --git a/core-java-modules/core-java-15/pom.xml b/core-java-modules/core-java-15/pom.xml index 3996c69fa4..e6193b4ea3 100644 --- a/core-java-modules/core-java-15/pom.xml +++ b/core-java-modules/core-java-15/pom.xml @@ -26,8 +26,4 @@ - - 17 - - \ No newline at end of file diff --git a/core-java-modules/core-java-collections-conversions-2/pom.xml b/core-java-modules/core-java-collections-conversions-2/pom.xml index da6b6a564a..7723daa6db 100644 --- a/core-java-modules/core-java-collections-conversions-2/pom.xml +++ b/core-java-modules/core-java-collections-conversions-2/pom.xml @@ -43,7 +43,6 @@ 0.10.3 - 11 3.2.0 \ No newline at end of file diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index c0c44eba9a..d20a1650b9 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -59,16 +59,16 @@ core-java-lang-oop-constructors-2 core-java-methods core-java-networking-3 - core-java-os + core-java-perf-2 core-java-streams-4 core-java-streams-5 core-java-streams-collect core-java-streams-maps core-java-string-algorithms-3 - core-java-string-operations-3 + core-java-string-operations-4 - core-java-string-operations-5 + core-java-time-measurements core-java-annotations @@ -123,13 +123,13 @@ core-java-io core-java-io-2 core-java-io-3 - core-java-io-4 + core-java-io-5 core-java-io-apis core-java-io-apis-2 core-java-io-conversions core-java-jar - core-java-jndi + core-java-jvm core-java-jvm-2 core-java-jvm-3 @@ -144,11 +144,11 @@ core-java-lang-oop-constructors core-java-lang-oop-patterns core-java-lang-oop-generics - core-java-lang-oop-modifiers + core-java-lang-oop-types core-java-lang-oop-types-2 core-java-lang-oop-inheritance - core-java-lang-oop-methods + core-java-lang-oop-others core-java-lang-operators core-java-lang-operators-2 @@ -185,8 +185,8 @@ core-java-string-algorithms core-java-string-algorithms-2 core-java-string-apis + core-java-swing - core-java-string-apis-2 core-java-string-conversions core-java-string-conversions-2 core-java-string-conversions-3 diff --git a/docker-modules/docker-caching/multi-module-caching/pom.xml b/docker-modules/docker-caching/multi-module-caching/pom.xml index bebfb85e8a..f2b52f246d 100644 --- a/docker-modules/docker-caching/multi-module-caching/pom.xml +++ b/docker-modules/docker-caching/multi-module-caching/pom.xml @@ -25,8 +25,6 @@ - UTF-8 - 1.8 32.1.3-jre diff --git a/docker-modules/pom.xml b/docker-modules/pom.xml index b4c5240718..4eeab746eb 100644 --- a/docker-modules/pom.xml +++ b/docker-modules/pom.xml @@ -24,8 +24,4 @@ docker-java-jar - - 11 - - \ No newline at end of file diff --git a/httpclient-simple/pom.xml b/httpclient-simple/pom.xml index a0f2dd6514..e0488bf0b1 100644 --- a/httpclient-simple/pom.xml +++ b/httpclient-simple/pom.xml @@ -203,7 +203,6 @@ - 17 1.16.0 diff --git a/jackson-simple/pom.xml b/jackson-simple/pom.xml index 2ba3868ee2..daa6504709 100644 --- a/jackson-simple/pom.xml +++ b/jackson-simple/pom.xml @@ -34,7 +34,6 @@ 2.16.0 - 17 \ No newline at end of file diff --git a/jhipster-6/bookstore-monolith/pom.xml b/jhipster-6/bookstore-monolith/pom.xml index efe3d2a118..0db1f46b1e 100644 --- a/jhipster-6/bookstore-monolith/pom.xml +++ b/jhipster-6/bookstore-monolith/pom.xml @@ -1125,7 +1125,6 @@ 3.0.0 - 11 2.12.6 v10.15.0 6.4.1 diff --git a/kubernetes-modules/kubernetes-spring/pom.xml b/kubernetes-modules/kubernetes-spring/pom.xml index 05532ab0b0..64322055d1 100644 --- a/kubernetes-modules/kubernetes-spring/pom.xml +++ b/kubernetes-modules/kubernetes-spring/pom.xml @@ -46,8 +46,4 @@ - - 11 - - \ No newline at end of file diff --git a/lightrun/lightrun-api-service/pom.xml b/lightrun/lightrun-api-service/pom.xml index b7ed5f951b..77dbbb8b99 100644 --- a/lightrun/lightrun-api-service/pom.xml +++ b/lightrun/lightrun-api-service/pom.xml @@ -40,8 +40,4 @@ - - 17 - - \ No newline at end of file diff --git a/lightrun/lightrun-tasks-service/pom.xml b/lightrun/lightrun-tasks-service/pom.xml index 2689a9794d..773c81a9d5 100644 --- a/lightrun/lightrun-tasks-service/pom.xml +++ b/lightrun/lightrun-tasks-service/pom.xml @@ -65,8 +65,4 @@ - - 17 - - \ No newline at end of file diff --git a/lightrun/lightrun-users-service/pom.xml b/lightrun/lightrun-users-service/pom.xml index 40594db725..0b3e856069 100644 --- a/lightrun/lightrun-users-service/pom.xml +++ b/lightrun/lightrun-users-service/pom.xml @@ -57,8 +57,4 @@ - - 17 - - \ No newline at end of file diff --git a/maven-modules/maven-exec-plugin/pom.xml b/maven-modules/maven-exec-plugin/pom.xml index 1bac52ae2c..370b344167 100644 --- a/maven-modules/maven-exec-plugin/pom.xml +++ b/maven-modules/maven-exec-plugin/pom.xml @@ -47,7 +47,6 @@ 1.2.6 3.11.0 3.1.0 - 1.8 \ No newline at end of file diff --git a/maven-modules/maven-generate-war/pom.xml b/maven-modules/maven-generate-war/pom.xml index 7de3f15298..d73ffe8b1d 100644 --- a/maven-modules/maven-generate-war/pom.xml +++ b/maven-modules/maven-generate-war/pom.xml @@ -70,10 +70,7 @@ - 11 2.17.1 - 11 - 11 \ No newline at end of file diff --git a/messaging-modules/pom.xml b/messaging-modules/pom.xml index 27524637ab..f96d57b960 100644 --- a/messaging-modules/pom.xml +++ b/messaging-modules/pom.xml @@ -20,8 +20,8 @@ jgroups rabbitmq spring-amqp - spring-apache-camel - spring-jms + + postgres-notify diff --git a/messaging-modules/postgres-notify/pom.xml b/messaging-modules/postgres-notify/pom.xml index 571065b98d..a9b930543b 100644 --- a/messaging-modules/postgres-notify/pom.xml +++ b/messaging-modules/postgres-notify/pom.xml @@ -46,9 +46,6 @@ - - 1.8 - diff --git a/parent-boot-3/pom.xml b/parent-boot-3/pom.xml index 9f9d6f7901..f1ab699c83 100644 --- a/parent-boot-3/pom.xml +++ b/parent-boot-3/pom.xml @@ -233,9 +233,6 @@ 3.1.5 5.8.2 0.9.17 - 17 - ${java.version} - ${java.version} 1.4.4 2.0.3 diff --git a/persistence-modules/fauna/pom.xml b/persistence-modules/fauna/pom.xml index c6350b37d7..4c37c2ae9e 100644 --- a/persistence-modules/fauna/pom.xml +++ b/persistence-modules/fauna/pom.xml @@ -58,7 +58,6 @@ - 17 4.2.0 diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index d9ee7e358c..41ff596ccf 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -60,15 +60,15 @@ solr spring-boot-persistence-2 - spring-boot-persistence-3 - spring-boot-mysql + + spring-boot-persistence spring-boot-persistence-h2 spring-boot-persistence-mongodb spring-boot-persistence-mongodb-2 spring-boot-persistence-mongodb-3 spring-data-arangodb - spring-data-cassandra + spring-data-cassandra-test spring-data-cosmosdb spring-data-couchbase-2 @@ -108,8 +108,8 @@ spring-jpa spring-jpa-2 spring-jdbc - spring-jdbc-2 - spring-jooq + spring-jdbc-2 + spring-mybatis spring-persistence-simple spring-data-yugabytedb diff --git a/persistence-modules/rethinkdb/pom.xml b/persistence-modules/rethinkdb/pom.xml index 17c7036ed3..352be80469 100644 --- a/persistence-modules/rethinkdb/pom.xml +++ b/persistence-modules/rethinkdb/pom.xml @@ -46,8 +46,4 @@ - - 17 - - diff --git a/persistence-modules/spring-data-cassandra-2/pom.xml b/persistence-modules/spring-data-cassandra-2/pom.xml index 01b5ce5ed6..6532da7f95 100644 --- a/persistence-modules/spring-data-cassandra-2/pom.xml +++ b/persistence-modules/spring-data-cassandra-2/pom.xml @@ -99,7 +99,6 @@ - 11 3.4.15 1.19.0 1.1.0 diff --git a/pom.xml b/pom.xml index 73a21684e4..6dc2fdb4c3 100644 --- a/pom.xml +++ b/pom.xml @@ -715,7 +715,7 @@ azure bazel checker-framework - core-groovy-modules + core-java-modules custom-pmd data-structures @@ -756,7 +756,7 @@ jersey jetbrains jgit - jhipster-6 + jib jmeter jmh @@ -800,7 +800,7 @@ lombok-modules lucene mapstruct - maven-modules + mesos-marathon messaging-modules metrics @@ -836,19 +836,19 @@ spring-activiti spring-actuator spring-aop-2 - spring-aop + spring-batch-2 spring-batch spring-boot-modules spring-boot-rest spring-cloud-modules/spring-cloud-azure spring-cloud-modules/spring-cloud-circuit-breaker - spring-cloud-modules/spring-cloud-contract - spring-cloud-modules/spring-cloud-data-flow + + spring-cloud-modules/spring-cloud-eureka spring-cloud-modules/spring-cloud-netflix-feign spring-cloud-modules/spring-cloud-security - spring-cloud-modules/spring-cloud-stream-starters + spring-cloud-modules/spring-cloud-zuul-eureka-integration spring-core-2 spring-core-3 @@ -856,14 +856,14 @@ spring-core spring-credhub spring-cucumber - spring-di-2 + spring-di-3 spring-di-4 spring-di spring-drools spring-ejb-modules spring-exceptions - spring-integration + spring-jenkins-pipeline spring-jersey spring-jinq @@ -891,7 +891,7 @@ spring-web-modules spring-websockets - tablesaw + tensorflow-java testing-modules testing-modules/mockito-simple @@ -900,16 +900,16 @@ vertx-modules web-modules webrtc - xml-2 + xml xstream UTF-8 - 11 - 11 - 11 + 17 + 17 + 17 @@ -961,7 +961,7 @@ azure bazel checker-framework - core-groovy-modules + core-java-modules custom-pmd data-structures @@ -1002,7 +1002,7 @@ jersey jetbrains jgit - jhipster-6 + jib jmeter jmh @@ -1046,7 +1046,7 @@ lombok-modules lucene mapstruct - maven-modules + mesos-marathon messaging-modules metrics @@ -1081,19 +1081,19 @@ spring-activiti spring-actuator spring-aop-2 - spring-aop + spring-batch-2 spring-batch spring-boot-modules spring-boot-rest spring-cloud-modules/spring-cloud-azure spring-cloud-modules/spring-cloud-circuit-breaker - spring-cloud-modules/spring-cloud-contract - spring-cloud-modules/spring-cloud-data-flow + + spring-cloud-modules/spring-cloud-eureka spring-cloud-modules/spring-cloud-netflix-feign spring-cloud-modules/spring-cloud-security - spring-cloud-modules/spring-cloud-stream-starters + spring-cloud-modules/spring-cloud-zuul-eureka-integration spring-core-2 spring-core-3 @@ -1101,14 +1101,14 @@ spring-core spring-credhub spring-cucumber - spring-di-2 + spring-di-3 spring-di-4 spring-di spring-drools spring-ejb-modules spring-exceptions - spring-integration + spring-jenkins-pipeline spring-jersey spring-jinq @@ -1135,7 +1135,7 @@ spring-web-modules spring-websockets - tablesaw + tensorflow-java testing-modules testing-modules/mockito-simple @@ -1144,16 +1144,16 @@ vertx-modules web-modules webrtc - xml-2 + xml xstream UTF-8 - 11 - 11 - 11 + 17 + 17 + 17 diff --git a/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml b/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml index 74deab3558..c3ee41223f 100644 --- a/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml +++ b/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml @@ -253,10 +253,7 @@ 1.17.2 - 11 0.12.1 - 11 - 11 3.1.0 0.9.11 2.0.8 diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 433f23f4ba..eaf04cf015 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -42,7 +42,7 @@ spring-boot-exceptions spring-boot-flowable spring-boot-graphql - spring-boot-groovy + spring-boot-jasypt spring-boot-jsp diff --git a/spring-boot-modules/spring-boot-cassandre/pom.xml b/spring-boot-modules/spring-boot-cassandre/pom.xml index e2964183d2..3834d7b88c 100644 --- a/spring-boot-modules/spring-boot-cassandre/pom.xml +++ b/spring-boot-modules/spring-boot-cassandre/pom.xml @@ -40,7 +40,6 @@ - 11 4.2.1 5.0.7 2.5.1 diff --git a/spring-boot-modules/spring-boot-redis/pom.xml b/spring-boot-modules/spring-boot-redis/pom.xml index fa6b5a59c1..57a894e2fc 100644 --- a/spring-boot-modules/spring-boot-redis/pom.xml +++ b/spring-boot-modules/spring-boot-redis/pom.xml @@ -73,7 +73,6 @@ - 15 6.0.3 0.7.3 diff --git a/spring-boot-modules/spring-boot-telegram/pom.xml b/spring-boot-modules/spring-boot-telegram/pom.xml index 9077e90400..a26566819a 100644 --- a/spring-boot-modules/spring-boot-telegram/pom.xml +++ b/spring-boot-modules/spring-boot-telegram/pom.xml @@ -39,7 +39,6 @@ - 17 6.7.0 diff --git a/spring-native/pom-nativeimage.xml b/spring-native/pom-nativeimage.xml index 6d42bedbe1..4fc01e4574 100644 --- a/spring-native/pom-nativeimage.xml +++ b/spring-native/pom-nativeimage.xml @@ -114,9 +114,6 @@ 2.7.1 0.12.1 0.9.17 - 1.8 - 1.8 - 1.8 diff --git a/spring-pulsar/pom.xml b/spring-pulsar/pom.xml index a1c834f830..b2feaddfb1 100644 --- a/spring-pulsar/pom.xml +++ b/spring-pulsar/pom.xml @@ -43,7 +43,6 @@ - 17 0.2.0 diff --git a/spring-security-modules/spring-security-azuread/pom.xml b/spring-security-modules/spring-security-azuread/pom.xml index 11d6b876c1..b32a1eb16a 100644 --- a/spring-security-modules/spring-security-azuread/pom.xml +++ b/spring-security-modules/spring-security-azuread/pom.xml @@ -11,10 +11,6 @@ spring-security-azuread - - 1.8 - - org.springframework.boot diff --git a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/pom.xml b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/pom.xml index 3d5ff0cb69..a5ce06f4d9 100644 --- a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/pom.xml +++ b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/pom.xml @@ -12,9 +12,7 @@ reactive-resource-server reactive-resource-server Demo project for Spring Boot reactive resource-server - - 17 - + org.springframework.boot diff --git a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/pom.xml b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/pom.xml index eb507fc3d3..44403cf341 100644 --- a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/pom.xml +++ b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/pom.xml @@ -12,9 +12,7 @@ servlet-resource-server servlet-resource-server Demo project for Spring Boot servlet resource-server - - 17 - + org.springframework.boot diff --git a/spring-security-modules/spring-security-saml2/pom.xml b/spring-security-modules/spring-security-saml2/pom.xml index 6de69fd201..64a4e22627 100644 --- a/spring-security-modules/spring-security-saml2/pom.xml +++ b/spring-security-modules/spring-security-saml2/pom.xml @@ -82,7 +82,6 @@ - 17 4.1.1 diff --git a/spring-soap/pom.xml b/spring-soap/pom.xml index 6c49f1f39c..c796b08e9a 100644 --- a/spring-soap/pom.xml +++ b/spring-soap/pom.xml @@ -102,7 +102,6 @@ - 17 4.0.0 3.1.0 0.15.3 diff --git a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml index ded02da62c..b1c2bf61f1 100644 --- a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml +++ b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml @@ -83,7 +83,6 @@ - 11 3.0.0 2.17.1 1.7.0 diff --git a/spring-vault/pom.xml b/spring-vault/pom.xml index b3690c7b7f..768303cb4b 100644 --- a/spring-vault/pom.xml +++ b/spring-vault/pom.xml @@ -83,7 +83,6 @@ 2.3.4 2.20.140 3.1.3 - 17 \ No newline at end of file diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml index fa72b1e696..b2e73570d5 100644 --- a/testing-modules/pom.xml +++ b/testing-modules/pom.xml @@ -34,8 +34,8 @@ load-testing-comparison mockito - mocks - mocks-2 + + mockserver parallel-tests-junit powermock From d935c4fe23efbfd30039e81b3ce6fd186841922b Mon Sep 17 00:00:00 2001 From: Sameer Date: Tue, 5 Dec 2023 12:04:33 +0530 Subject: [PATCH 155/294] BAEL 7138 Difference between String and StringBuffer in Java (#15351) * string vs stringBuffer comparison * BAEL-7138 Difference between String and StringBuffer in Java --------- Co-authored-by: Sahil --- .../main/java/com/baeldung/stringbuffer/ComparePerformance.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/ComparePerformance.java b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/ComparePerformance.java index 28cd2e64e9..4d045fe318 100644 --- a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/ComparePerformance.java +++ b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/ComparePerformance.java @@ -28,6 +28,7 @@ public class ComparePerformance { @Benchmark public String benchmarkStringConcatenation() { + strFinal = ""; strFinal += strInitial; return strFinal; } From a662ef5fa69d2bade3ca876f9538a62d2f0babe9 Mon Sep 17 00:00:00 2001 From: anujgaud <146576725+anujgaud@users.noreply.github.com> Date: Tue, 5 Dec 2023 18:31:21 +0530 Subject: [PATCH 156/294] Address review comments --- .../baeldung/localdatetoiso/LocalDateToISOUnitTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java index 06b25c8e44..1979c91eca 100644 --- a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/localdatetoiso/LocalDateToISOUnitTest.java @@ -7,7 +7,7 @@ import java.time.LocalDate; public class LocalDateToISOUnitTest { @Test - public void givenLocalDate_whenUsingDateTimeFormatter_thenISOFormat(){ + void givenLocalDate_whenUsingDateTimeFormatter_thenISOFormat(){ LocalDateToISO localDateToISO = new LocalDateToISO(); LocalDate localDate = LocalDate.of(2023, 11, 6); @@ -17,7 +17,7 @@ public class LocalDateToISOUnitTest { } @Test - public void givenLocalDate_whenUsingSimpleDateFormat_thenISOFormat(){ + void givenLocalDate_whenUsingSimpleDateFormat_thenISOFormat(){ LocalDateToISO localDateToISO = new LocalDateToISO(); LocalDate localDate = LocalDate.of(2023, 11, 6); @@ -27,7 +27,7 @@ public class LocalDateToISOUnitTest { } @Test - public void givenLocalDate_whenUsingJodaTime_thenISOFormat() { + void givenLocalDate_whenUsingJodaTime_thenISOFormat() { LocalDateToISO localDateToISO = new LocalDateToISO(); org.joda.time.LocalDate localDate = new org.joda.time.LocalDate(2023, 11, 6); @@ -37,7 +37,7 @@ public class LocalDateToISOUnitTest { } @Test - public void givenLocalDate_whenUsingApacheCommonsLang_thenISOFormat() { + void givenLocalDate_whenUsingApacheCommonsLang_thenISOFormat() { LocalDateToISO localDateToISO = new LocalDateToISO(); LocalDate localDate = LocalDate.of(2023, 11, 6); From 9a003c4bf4c2aa9e074e016b7681b879aa2be3a2 Mon Sep 17 00:00:00 2001 From: maenolis Date: Tue, 5 Dec 2023 17:21:04 +0200 Subject: [PATCH 157/294] Unnecessary change revert. --- core-java-modules/core-java-21/pom.xml | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/core-java-modules/core-java-21/pom.xml b/core-java-modules/core-java-21/pom.xml index 98e73c89c0..bfe1cd2c78 100644 --- a/core-java-modules/core-java-21/pom.xml +++ b/core-java-modules/core-java-21/pom.xml @@ -22,7 +22,9 @@ 21 false - --enable-preview + + --enable-preview + @@ -36,15 +38,6 @@ - - - org.mockito - mockito-core - 5.7.0 - test - - - 21 21 From 3a8bae0c8ea7a93b11d9f91435a7f0831c341bb3 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Tue, 5 Dec 2023 23:20:42 +0530 Subject: [PATCH 158/294] BAEL-7308: Comparing One String with Multiple Values in One Expression in Java --- .../compareany/CompareAnyBenchmark.java | 92 +++++++++++++++++++ .../compareany/CompareAnyUnitTest.java | 8 +- 2 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyBenchmark.java rename core-java-modules/core-java-string-operations-7/src/test/java/{ => com/baeldung}/compareany/CompareAnyUnitTest.java (94%) diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyBenchmark.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyBenchmark.java new file mode 100644 index 0000000000..70cd1bb3ff --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyBenchmark.java @@ -0,0 +1,92 @@ +package com.baeldung.compareany; + +import java.util.Arrays; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +@State(Scope.Benchmark) +@BenchmarkMode(Mode.AverageTime) +@Warmup(iterations = 2) +@Measurement(iterations = 5) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@Fork(value = 1) +public class CompareAnyBenchmark { + private final String[] groupOfFruits = {"Apple", "Mango", "Dragon Fruit", "Water Melon", "Avocado", "Guava", "Orange"}; + private final String fruit = "Apple"; + + @Benchmark + public boolean compareWithAnyUsingStringUtils() { + return StringUtils.containsAny(fruit, groupOfFruits); + } + + @Benchmark + public boolean compareWithAnyCaseInsensitiveUsingStringUtils() { + return StringUtils.containsAnyIgnoreCase(fruit, groupOfFruits); + } + + @Benchmark + public boolean compareWithAnyUsingSet() { + return Set.of(groupOfFruits).contains(fruit); + } + + @Benchmark + public boolean compareWithAnyUsingRegularExpression() { + return fruit.matches(String.join("|", groupOfFruits)); + } + + @Benchmark + public boolean compareWithAnyCaseInsensitiveUsingRegularExpression() { + return fruit.matches("(?i)" + String.join("|", groupOfFruits)); + } + + @Benchmark + public boolean compareWithAnyUsingStream() { + return Arrays.stream(groupOfFruits).anyMatch(fruit::equals); + } + + @Benchmark + public boolean compareWithAnyCaseInsensitiveUsingStream() { + return Arrays.stream(groupOfFruits).anyMatch(fruit::equalsIgnoreCase); + } + + @Benchmark + public boolean compareWithAnyUsingArrayUtils() { + return ArrayUtils.contains(groupOfFruits, fruit); + } + + @Benchmark + public boolean compareWithAnyWithIf() { + for(String s : groupOfFruits) { + if (fruit.equals(s)) { + return true; + } + } + return false; + } + + public static void main(String[] args) throws Exception { + Options options = new OptionsBuilder().include(CompareAnyBenchmark.class.getSimpleName()) + .threads(1) + .shouldFailOnError(true) + .shouldDoGC(true) + .jvmArgs("-server") + .build(); + new Runner(options).run(); + } + +} diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/compareany/CompareAnyUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyUnitTest.java similarity index 94% rename from core-java-modules/core-java-string-operations-7/src/test/java/compareany/CompareAnyUnitTest.java rename to core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyUnitTest.java index 2d6af5456a..0995eaf372 100644 --- a/core-java-modules/core-java-string-operations-7/src/test/java/compareany/CompareAnyUnitTest.java +++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyUnitTest.java @@ -1,4 +1,4 @@ -package compareany; +package com.baeldung.compareany; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -17,8 +17,8 @@ public class CompareAnyUnitTest { String presentString = "Apple"; String notPresentString = "Avocado"; - assertTrue(matchAnyWithIf(presentString, "Mango", "Papaya", "Pineapple", "Apple")); - assertFalse(matchAnyWithIf(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertTrue(compareWithAnyWithIf(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareWithAnyWithIf(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } @Test @@ -92,7 +92,7 @@ public class CompareAnyUnitTest { assertFalse(compareWithAnyCaseInsensitiveUsingRegularExpression(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } - private boolean matchAnyWithIf(String str, String ... strs) { + private boolean compareWithAnyWithIf(String str, String ... strs) { for(String s : strs) { if (str.equals(s)) { return true; From 11c468f576ae5374cb111718436c57d69bd07533 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Wed, 6 Dec 2023 03:18:19 +0100 Subject: [PATCH 159/294] [bigdecimal-zero] bigdecimal zero vs constructor (#15355) --- ...BigDecimalZeroVsNewBigDecimalUnitTest.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/bigdecimalzero/BigDecimalZeroVsNewBigDecimalUnitTest.java diff --git a/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/bigdecimalzero/BigDecimalZeroVsNewBigDecimalUnitTest.java b/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/bigdecimalzero/BigDecimalZeroVsNewBigDecimalUnitTest.java new file mode 100644 index 0000000000..a10a615e2f --- /dev/null +++ b/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/bigdecimalzero/BigDecimalZeroVsNewBigDecimalUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.bigdecimalzero; + +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; + +import static org.junit.jupiter.api.Assertions.*; + +public class BigDecimalZeroVsNewBigDecimalUnitTest { + @Test + void whenComparingZeroAndNewBigDecimal_thenGetExpectedResult() { + BigDecimal bd1 = new BigDecimal("42.00"); + BigDecimal bd2 = new BigDecimal("42.0000"); + assertEquals(0, bd1.compareTo(bd2)); + + assertNotEquals(bd1, bd2); + + BigDecimal zero0 = new BigDecimal(0); + assertNotEquals(zero0, new BigDecimal("0.000")); + + BigDecimal zero = BigDecimal.ZERO; + assertEquals(zero, zero0); + } + + @Test + void whenCallingBigDecimalZero_thenAlwaysGetTheSameObject() { + BigDecimal z1 = BigDecimal.ZERO; + BigDecimal z2 = BigDecimal.ZERO; + assertSame(z1, z2); + } + + @Test + void whenCallingNewBigDecimal_thenAlwaysGetTheSameObject() { + BigDecimal z1 = new BigDecimal(0); + BigDecimal z2 = new BigDecimal(0); + assertNotSame(z1, z2); + } + +} \ No newline at end of file From 8ad1043d556756ae024ddb91a6307975bc7e988c Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Wed, 6 Dec 2023 14:12:25 +0530 Subject: [PATCH 160/294] BAEL-7308: Comparing One String with Multiple Values in One Expression in Java --- .../compareany/CompareAnyBenchmark.java | 10 ++++++++-- .../compareany/CompareAnyUnitTest.java | 18 ++++++++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyBenchmark.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyBenchmark.java index 70cd1bb3ff..9a4e5e9431 100644 --- a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyBenchmark.java +++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyBenchmark.java @@ -1,6 +1,7 @@ package com.baeldung.compareany; import java.util.Arrays; +import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -31,12 +32,12 @@ public class CompareAnyBenchmark { @Benchmark public boolean compareWithAnyUsingStringUtils() { - return StringUtils.containsAny(fruit, groupOfFruits); + return StringUtils.equalsAny(fruit, groupOfFruits); } @Benchmark public boolean compareWithAnyCaseInsensitiveUsingStringUtils() { - return StringUtils.containsAnyIgnoreCase(fruit, groupOfFruits); + return StringUtils.equalsAnyIgnoreCase(fruit, groupOfFruits); } @Benchmark @@ -44,6 +45,11 @@ public class CompareAnyBenchmark { return Set.of(groupOfFruits).contains(fruit); } + @Benchmark + public boolean compareWithAnyUsingList() { + return List.of(groupOfFruits).contains(fruit); + } + @Benchmark public boolean compareWithAnyUsingRegularExpression() { return fruit.matches(String.join("|", groupOfFruits)); diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyUnitTest.java index 0995eaf372..818035971d 100644 --- a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyUnitTest.java +++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyUnitTest.java @@ -4,6 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Arrays; +import java.util.List; import java.util.Set; import org.apache.commons.lang3.ArrayUtils; @@ -74,6 +75,15 @@ public class CompareAnyUnitTest { assertFalse(compareWithAnyUsingSet(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } + @Test + void givenStrings_whenCompareUsingList_thenSuccess() { + String presentString = "Apple"; + String notPresentString = "Avocado"; + + assertTrue(compareWithAnyUsingList(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareWithAnyUsingList(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); + } + @Test void givenStrings_whenCompareUsingRegularExpression_thenSuccess() { String presentString = "Apple"; @@ -102,17 +112,21 @@ public class CompareAnyUnitTest { } private boolean compareWithAnyUsingStringUtils(String str, String ... strs) { - return StringUtils.containsAny(str, strs); + return StringUtils.equalsAny(str, strs); } private boolean compareWithAnyCaseInsensitiveUsingStringUtils(String str, String ... strs) { - return StringUtils.containsAnyIgnoreCase(str, strs); + return StringUtils.equalsAnyIgnoreCase(str, strs); } private boolean compareWithAnyUsingSet(String str, String ... strs) { return Set.of(strs).contains(str); } + private boolean compareWithAnyUsingList(String str, String ... strs) { + return List.of(strs).contains(str); + } + private boolean compareWithAnyUsingRegularExpression(String str, String ... strs) { return str.matches(String.join("|", strs)); } From 155389fbc29f6e862104d60bffa1c18cb9e40685 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 6 Dec 2023 14:25:31 +0200 Subject: [PATCH 161/294] [JAVA-27738] (#15363) * [JAVA-27738] Upgraded core-groovy modules to jdk 17 * [JAVA-27738] Re enabled core-groovy modules * [JAVA-27738] Formatting --- core-groovy-modules/core-groovy-2/pom.xml | 11 +++++++++-- pom.xml | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/core-groovy-modules/core-groovy-2/pom.xml b/core-groovy-modules/core-groovy-2/pom.xml index de750daf0f..cc1d860ad1 100644 --- a/core-groovy-modules/core-groovy-2/pom.xml +++ b/core-groovy-modules/core-groovy-2/pom.xml @@ -13,6 +13,13 @@ 1.0.0-SNAPSHOT + + + groovy-plugins-release + https://groovy.jfrog.io/artifactory/plugins-release-local + + + org.apache.commons @@ -156,8 +163,8 @@ 1.1.3 3.4.2 3.8.1 - 3.7.0 - 3.0.8-01 + 3.9.0 + 3.0.9-03 diff --git a/pom.xml b/pom.xml index 6dc2fdb4c3..eb780e5168 100644 --- a/pom.xml +++ b/pom.xml @@ -715,7 +715,7 @@ azure bazel checker-framework - + core-groovy-modules core-java-modules custom-pmd data-structures @@ -961,7 +961,7 @@ azure bazel checker-framework - + core-groovy-modules core-java-modules custom-pmd data-structures From b6f45db73d3771fdc4b84fa823eb308fc640e869 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Wed, 6 Dec 2023 18:55:46 +0530 Subject: [PATCH 162/294] BAEL-6910, Renamed to LiveTest --- ...Test.java => CassandraConnectionDetailsLiveTest.java} | 9 +++++++-- ...Test.java => CouchbaseConnectionDetailsLiveTest.java} | 7 ++++++- ....java => ElasticsearchConnectionDetailsLiveTest.java} | 9 +++++++-- ...ationTest.java => JdbcConnectionDetailsLiveTest.java} | 9 +++++++-- ...tionTest.java => KafkaConnectionDetailsLiveTest.java} | 7 ++++++- ...onTest.java => MongoDBConnectionDetailsLiveTest.java} | 7 ++++++- ...tionTest.java => Neo4jConnectionDetailsLiveTest.java} | 7 ++++++- ...tionTest.java => R2dbcConnectionDetailsLiveTest.java} | 9 +++++++-- ...nTest.java => RabbitmqConnectionDetailsLiveTest.java} | 9 +++++++-- ...st.java => RedisCacheConnnectionDetailsLiveTest.java} | 9 +++++++-- 10 files changed, 66 insertions(+), 16 deletions(-) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{CassandraConnectionDetailsIntegrationTest.java => CassandraConnectionDetailsLiveTest.java} (80%) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{CouchbaseConnectionDetailsIntegrationTest.java => CouchbaseConnectionDetailsLiveTest.java} (77%) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{ElasticsearchConnectionDetailsIntegrationTest.java => ElasticsearchConnectionDetailsLiveTest.java} (81%) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{JdbcConnectionDetailsIntegrationTest.java => JdbcConnectionDetailsLiveTest.java} (79%) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{KafkaConnectionDetailsIntegrationTest.java => KafkaConnectionDetailsLiveTest.java} (78%) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{MongoDBConnectionDetailsIntegrationTest.java => MongoDBConnectionDetailsLiveTest.java} (85%) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{Neo4jConnectionDetailsIntegrationTest.java => Neo4jConnectionDetailsLiveTest.java} (81%) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{R2dbcConnectionDetailsIntegrationTest.java => R2dbcConnectionDetailsLiveTest.java} (80%) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{RabbitmqConnectionDetailsIntegrationTest.java => RabbitmqConnectionDetailsLiveTest.java} (85%) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{RedisCacheConnnectionDetailsIntegrationTest.java => RedisCacheConnnectionDetailsLiveTest.java} (76%) diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsLiveTest.java similarity index 80% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsLiveTest.java index 4130b6cb6b..9198cc1f68 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.CustomCassandraConnectionDetailsConfiguration; @@ -22,8 +27,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue; @ComponentScan(basePackages = "com.baeldung.connectiondetails") @TestPropertySource(locations = {"classpath:connectiondetails/application-cassandra.properties"}) @ActiveProfiles("cassandra") -public class CassandraConnectionDetailsIntegrationTest { - private static final Logger logger = LoggerFactory.getLogger(CassandraConnectionDetailsIntegrationTest.class); +public class CassandraConnectionDetailsLiveTest { + private static final Logger logger = LoggerFactory.getLogger(CassandraConnectionDetailsLiveTest.class); @Autowired private CassandraTemplate cassandraTemplate; @Test diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsLiveTest.java similarity index 77% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsLiveTest.java index 454aad4c6c..6f19382950 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.CustomCouchBaseConnectionDetailsConfiguration; @@ -20,7 +25,7 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @ComponentScan(basePackages = "com.baeldung.connectiondetails") @TestPropertySource(locations = {"classpath:connectiondetails/application-couch.properties"}) @ActiveProfiles("couch") -public class CouchbaseConnectionDetailsIntegrationTest { +public class CouchbaseConnectionDetailsLiveTest { @Autowired private Cluster cluster; @Test diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsLiveTest.java similarity index 81% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsLiveTest.java index ee698cd6ea..10d0e9d019 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.CustomElasticsearchConnectionDetailsConfiguration; @@ -24,8 +29,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue; @ComponentScan(basePackages = "com.baeldung.connectiondetails") @TestPropertySource(locations = {"classpath:connectiondetails/application-elastic.properties"}) @ActiveProfiles("elastic") -public class ElasticsearchConnectionDetailsIntegrationTest { - private static final Logger logger = LoggerFactory.getLogger(ElasticsearchConnectionDetailsIntegrationTest.class); +public class ElasticsearchConnectionDetailsLiveTest { + private static final Logger logger = LoggerFactory.getLogger(ElasticsearchConnectionDetailsLiveTest.class); @Autowired private ElasticsearchTemplate elasticsearchTemplate; diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsLiveTest.java similarity index 79% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsLiveTest.java index 748bc27b0b..b074eb9bfd 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.JdbcConnectionDetailsConfiguration; @@ -25,8 +30,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; @ComponentScan(basePackages = "com.baeldung.connectiondetails") @TestPropertySource(locations = {"classpath:connectiondetails/application-jdbc.properties"}) @ActiveProfiles("jdbc") -public class JdbcConnectionDetailsIntegrationTest { - private static final Logger logger = LoggerFactory.getLogger(JdbcConnectionDetailsIntegrationTest.class); +public class JdbcConnectionDetailsLiveTest { + private static final Logger logger = LoggerFactory.getLogger(JdbcConnectionDetailsLiveTest.class); @Autowired private JdbcTemplate jdbcTemplate; @Test diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsLiveTest.java similarity index 78% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsLiveTest.java index bc0e174b3f..f23e610d3a 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.CustomKafkaConnectionDetailsConfiguration; @@ -21,7 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @ComponentScan(basePackages = "com.baeldung.connectiondetails") @TestPropertySource(locations = {"classpath:connectiondetails/application-kafka.properties"}) @ActiveProfiles("kafka") -public class KafkaConnectionDetailsIntegrationTest { +public class KafkaConnectionDetailsLiveTest { @Autowired private KafkaTemplate kafkaTemplate; diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsLiveTest.java similarity index 85% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsLiveTest.java index 868ebfea98..e2dceff9ec 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.MongoDBConnectionDetailsConfiguration; @@ -26,7 +31,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; @ComponentScan(basePackages = "com.baeldung.connectiondetails") @TestPropertySource(locations = {"classpath:connectiondetails/application-mongo.properties"}) @ActiveProfiles("mongo") -public class MongoDBConnectionDetailsIntegrationTest { +public class MongoDBConnectionDetailsLiveTest { @Autowired private MongoTemplate mongoTemplate; diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsLiveTest.java similarity index 81% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsLiveTest.java index 943ed7bdea..8eb9ec44d2 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.CustomNeo4jConnectionDetailsConfiguration; @@ -22,7 +27,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; @ComponentScan(basePackages = "com.baeldung.connectiondetails") @TestPropertySource(locations = {"classpath:connectiondetails/application-neo4j.properties"}) @ActiveProfiles("neo4j") -public class Neo4jConnectionDetailsIntegrationTest { +public class Neo4jConnectionDetailsLiveTest { @Autowired private Neo4jTemplate neo4jTemplate; diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsLiveTest.java similarity index 80% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsLiveTest.java index 5f8c8349fb..460a48e7ff 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.R2dbcPostgresConnectionDetailsConfiguration; @@ -20,8 +25,8 @@ import java.util.List; @Import(R2dbcPostgresConnectionDetailsConfiguration.class) @TestPropertySource(locations = {"classpath:connectiondetails/application-r2dbc.properties"}) @ActiveProfiles("r2dbc") -public class R2dbcConnectionDetailsIntegrationTest { - Logger logger = LoggerFactory.getLogger(R2dbcConnectionDetailsIntegrationTest.class); +public class R2dbcConnectionDetailsLiveTest { + Logger logger = LoggerFactory.getLogger(R2dbcConnectionDetailsLiveTest.class); @Autowired private R2dbcEntityTemplate r2dbcEntityTemplate; diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsLiveTest.java similarity index 85% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsLiveTest.java index 9e10973ed7..5f7eb055eb 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.RabbitMQConnectionDetailsConfiguration; @@ -25,9 +30,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; @Import(RabbitMQConnectionDetailsConfiguration.class) @TestPropertySource(locations = {"classpath:connectiondetails/application-rabbitmq.properties"}) @ActiveProfiles("rabbitmq") -public class RabbitmqConnectionDetailsIntegrationTest { +public class RabbitmqConnectionDetailsLiveTest { - private static final Logger logger = LoggerFactory.getLogger(RabbitmqConnectionDetailsIntegrationTest.class); + private static final Logger logger = LoggerFactory.getLogger(RabbitmqConnectionDetailsLiveTest.class); @Autowired private RabbitTemplate rabbitTemplate; diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsLiveTest.java similarity index 76% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsLiveTest.java index 5dbd2d6c03..919f968323 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.RedisConnectionDetailsConfiguration; @@ -20,8 +25,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; @Import(RedisConnectionDetailsConfiguration.class) @TestPropertySource(locations = {"classpath:connectiondetails/application-redis.properties"}) @ActiveProfiles("redis") -public class RedisCacheConnnectionDetailsIntegrationTest { - private static final Logger logger = LoggerFactory.getLogger(RedisCacheConnnectionDetailsIntegrationTest.class); +public class RedisCacheConnnectionDetailsLiveTest { + private static final Logger logger = LoggerFactory.getLogger(RedisCacheConnnectionDetailsLiveTest.class); @Autowired RedisTemplate redisTemplate; From e144d0599bb78ccf86b5e0c62fd8e571180d764b Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Wed, 6 Dec 2023 21:47:52 +0530 Subject: [PATCH 163/294] Java 28508 Fix formatting of POMs Modules A to C (#15359) --- apache-kafka-2/pom.xml | 2 +- aws-modules/aws-dynamodb/pom.xml | 4 +- aws-modules/pom.xml | 13 ++--- core-java-modules/core-java-20/pom.xml | 54 +++++++++---------- .../pom.xml | 2 +- .../core-java-collections-maps-6/pom.xml | 7 +-- .../core-java-collections-maps-7/pom.xml | 14 ++--- .../core-java-reflection-3/pom.xml | 4 +- .../core-java-string-operations-2/pom.xml | 8 +-- 9 files changed, 56 insertions(+), 52 deletions(-) diff --git a/apache-kafka-2/pom.xml b/apache-kafka-2/pom.xml index cd21a60e14..dedd5df602 100644 --- a/apache-kafka-2/pom.xml +++ b/apache-kafka-2/pom.xml @@ -55,7 +55,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.databind.version} + ${jackson.databind.version} diff --git a/aws-modules/aws-dynamodb/pom.xml b/aws-modules/aws-dynamodb/pom.xml index adce036733..155d48c240 100644 --- a/aws-modules/aws-dynamodb/pom.xml +++ b/aws-modules/aws-dynamodb/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 aws-dynamodb 0.1.0-SNAPSHOT diff --git a/aws-modules/pom.xml b/aws-modules/pom.xml index 06cea2f260..ce27a4f2e0 100644 --- a/aws-modules/pom.xml +++ b/aws-modules/pom.xml @@ -5,6 +5,13 @@ 4.0.0 aws-modules aws-modules + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + com.amazonaws @@ -15,12 +22,6 @@ pom - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - aws-app-sync aws-dynamodb diff --git a/core-java-modules/core-java-20/pom.xml b/core-java-modules/core-java-20/pom.xml index ad0a956b80..68c6ca4c93 100644 --- a/core-java-modules/core-java-20/pom.xml +++ b/core-java-modules/core-java-20/pom.xml @@ -3,19 +3,34 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + core-java-20 + com.baeldung.core-java-modules core-java-modules 0.0.1-SNAPSHOT - core-java-20 - - - 20 - 20 - UTF-8 - + + + jakarta.servlet + jakarta.servlet-api + 6.0.0 + provided + + + org.assertj + assertj-core + 3.24.2 + test + + + org.mockito + mockito-junit-jupiter + 5.2.0 + test + + @@ -41,25 +56,10 @@ - - - jakarta.servlet - jakarta.servlet-api - 6.0.0 - provided - - - org.assertj - assertj-core - 3.24.2 - test - - - org.mockito - mockito-junit-jupiter - 5.2.0 - test - - + + 20 + 20 + UTF-8 + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-operations-advanced/pom.xml b/core-java-modules/core-java-arrays-operations-advanced/pom.xml index 52787cc0c9..265577f75e 100644 --- a/core-java-modules/core-java-arrays-operations-advanced/pom.xml +++ b/core-java-modules/core-java-arrays-operations-advanced/pom.xml @@ -57,7 +57,7 @@ - + 11 diff --git a/core-java-modules/core-java-collections-maps-6/pom.xml b/core-java-modules/core-java-collections-maps-6/pom.xml index eec59616e7..a0cdc07644 100644 --- a/core-java-modules/core-java-collections-maps-6/pom.xml +++ b/core-java-modules/core-java-collections-maps-6/pom.xml @@ -13,9 +13,6 @@ 0.0.1-SNAPSHOT - - 5.2.5.RELEASE - com.fasterxml.jackson.core @@ -51,4 +48,8 @@ + + 5.2.5.RELEASE + + \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps-7/pom.xml b/core-java-modules/core-java-collections-maps-7/pom.xml index 2d08c0a438..bd355bea1e 100644 --- a/core-java-modules/core-java-collections-maps-7/pom.xml +++ b/core-java-modules/core-java-collections-maps-7/pom.xml @@ -1,15 +1,11 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 core-java-collections-maps-7 core-java-collections-maps-7 jar - - 2.10.1 - 1.5 - core-java-modules @@ -63,4 +59,10 @@ + + + 2.10.1 + 1.5 + + diff --git a/core-java-modules/core-java-reflection-3/pom.xml b/core-java-modules/core-java-reflection-3/pom.xml index fa5fe897e0..e60652f1f2 100644 --- a/core-java-modules/core-java-reflection-3/pom.xml +++ b/core-java-modules/core-java-reflection-3/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 core-java-reflection-3 core-java-reflection-3 diff --git a/core-java-modules/core-java-string-operations-2/pom.xml b/core-java-modules/core-java-string-operations-2/pom.xml index 27071e5427..76f21aa726 100644 --- a/core-java-modules/core-java-string-operations-2/pom.xml +++ b/core-java-modules/core-java-string-operations-2/pom.xml @@ -44,10 +44,10 @@ commons-codec ${commons-codec.version} - - org.springframework - spring-core - ${spring-core.version} + + org.springframework + spring-core + ${spring-core.version} From b5f48cee006ce961d15a9d72fdc06603e5b21c32 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Wed, 6 Dec 2023 08:41:19 -0800 Subject: [PATCH 164/294] JAVA-28505 Fix references to parent (#15345) --- .../custom-validations-opeanpi-codegen/pom.xml | 3 +-- spring-swagger-codegen/pom.xml | 1 + .../spring-swagger-codegen-api-client/pom.xml | 1 - spring-swagger-codegen/spring-swagger-codegen-app/pom.xml | 1 - 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml index b1c2bf61f1..136f5b8907 100644 --- a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml +++ b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml @@ -11,9 +11,8 @@ com.baeldung - parent-boot-2 + spring-swagger-codegen 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-swagger-codegen/pom.xml b/spring-swagger-codegen/pom.xml index d4fff7eb63..ce28f28c22 100644 --- a/spring-swagger-codegen/pom.xml +++ b/spring-swagger-codegen/pom.xml @@ -16,6 +16,7 @@ + custom-validations-opeanpi-codegen spring-swagger-codegen-api-client spring-openapi-generator-api-client spring-swagger-codegen-app diff --git a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml index af12f9cef0..5ad15f6851 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml @@ -33,7 +33,6 @@ com.baeldung spring-swagger-codegen 0.0.1-SNAPSHOT - ../../spring-swagger-codegen diff --git a/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml index d3f57474ef..a7969df518 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml @@ -10,7 +10,6 @@ com.baeldung spring-swagger-codegen 0.0.1-SNAPSHOT - ../../spring-swagger-codegen From cab75d510a258d26868fa95867f6afdec553769e Mon Sep 17 00:00:00 2001 From: MohamedHelmyKassab <137485958+MohamedHelmyKassab@users.noreply.github.com> Date: Wed, 6 Dec 2023 23:04:02 +0200 Subject: [PATCH 165/294] This commit is related to BAEL-7104 (#15368) This commit aims to add a test class "SkipInputStreamUnitTest" that provide a test method that utilizes the skip() method. --- .../SkipInputStreamUnitTest.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 core-java-modules/core-java-streams/src/test/java/com/baeldung/skipinputstream/SkipInputStreamUnitTest.java diff --git a/core-java-modules/core-java-streams/src/test/java/com/baeldung/skipinputstream/SkipInputStreamUnitTest.java b/core-java-modules/core-java-streams/src/test/java/com/baeldung/skipinputstream/SkipInputStreamUnitTest.java new file mode 100644 index 0000000000..a41e5642fe --- /dev/null +++ b/core-java-modules/core-java-streams/src/test/java/com/baeldung/skipinputstream/SkipInputStreamUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.skipinputstream; + +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; + +import static org.junit.Assert.assertArrayEquals; + +public class SkipInputStreamUnitTest { + @Test + public void givenInputStreamWithBytes_whenSkipBytes_thenRemainingBytes() throws IOException { + byte[] inputData = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + InputStream inputStream = new ByteArrayInputStream(inputData); + + long bytesToSkip = 3; + long skippedBytes = inputStream.skip(bytesToSkip); + + assertArrayEquals(new byte[]{4, 5, 6, 7, 8, 9, 10}, readRemainingBytes(inputStream)); + + assert skippedBytes == bytesToSkip : "Incorrect number of bytes skipped"; + } + + private byte[] readRemainingBytes(InputStream inputStream) throws IOException { + byte[] buffer = new byte[inputStream.available()]; + int bytesRead = inputStream.read(buffer); + if (bytesRead == -1) { + throw new IOException("End of stream reached"); + } + return buffer; + } +} From 4e3e693f7109722c9db87d0367e69df527eb77bd Mon Sep 17 00:00:00 2001 From: Mo Helmy <135069400+BenHelmyBen@users.noreply.github.com> Date: Wed, 6 Dec 2023 23:08:38 +0200 Subject: [PATCH 166/294] This commit is related to BAEL-6920 (#15371) This commit aims to add a class "StringMaxLengthMain" showing the string max length. --- .../stringmaxlength/StringMaxLengthMain.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/stringmaxlength/StringMaxLengthMain.java diff --git a/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/stringmaxlength/StringMaxLengthMain.java b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/stringmaxlength/StringMaxLengthMain.java new file mode 100644 index 0000000000..42d0c05582 --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/stringmaxlength/StringMaxLengthMain.java @@ -0,0 +1,35 @@ +package com.baeldung.stringmaxlength; + +public class StringMaxLengthMain { + + public static void main(String[] args) { + displayRuntimeMaxStringLength(); + displayMaxStringLength(); + simulateStringOverflow(); + } + + public static void simulateStringOverflow() { + try { + int maxLength = Integer.MAX_VALUE; + char[] charArray = new char[maxLength]; + for (int i = 0; i < maxLength; i++) { + charArray[i] = 'a'; + } + String longString = new String(charArray); + System.out.println("Successfully created a string of length: " + longString.length()); + } catch (OutOfMemoryError e) { + System.err.println("Overflow error: Attempting to create a string longer than Integer.MAX_VALUE"); + e.printStackTrace(); + } + } + + public static void displayRuntimeMaxStringLength() { + long maxMemory = Runtime.getRuntime().maxMemory(); + System.out.println("Maximum String length based on available memory: " + (maxMemory)); + } + + public static void displayMaxStringLength() { + int maxStringLength = Integer.MAX_VALUE; + System.out.println("Maximum String length based on Integer.MAX_VALUE: " + maxStringLength); + } +} \ No newline at end of file From 97aaeed2c0a9dcf4b72664db6957c3ba8005d324 Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Thu, 7 Dec 2023 08:21:13 +0100 Subject: [PATCH 167/294] Fix Timefold Solver readme + remove unpublished article --- timefold-solver/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/timefold-solver/README.md b/timefold-solver/README.md index b7a2dbe14b..1abc4d4ca0 100644 --- a/timefold-solver/README.md +++ b/timefold-solver/README.md @@ -1,7 +1,6 @@ -## OptaPlanner +## Timefold Solver -This module contains articles about OptaPlanner. +This module contains articles about (Timefold Solver)[https://timefold.ai]. ### Relevant articles -- [A Guide to OptaPlanner](https://www.baeldung.com/opta-planner) From 232730dbbbbab342cf98191015e609f36fa8f76f Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Thu, 7 Dec 2023 12:27:02 +0200 Subject: [PATCH 168/294] JAVA-27674 Upgrade apache-httpclient to v5 (#15329) --- apache-httpclient/pom.xml | 12 +++--------- .../baeldung/httpclient/HttpAsyncClientLiveTest.java | 4 ++-- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/apache-httpclient/pom.xml b/apache-httpclient/pom.xml index 3b178d4df8..f671c93cfc 100644 --- a/apache-httpclient/pom.xml +++ b/apache-httpclient/pom.xml @@ -63,11 +63,6 @@ ${wiremock.version} test - - org.apache.httpcomponents - httpclient - ${httpclient.version} - @@ -84,10 +79,9 @@ 5.6.1 3.3.1 - 5.2 - 5.2 - 5.2 - 4.5.14 + 5.2.2 + 5.2.2 + 5.2.2 diff --git a/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java index 50cf1b7a64..7b818f871a 100644 --- a/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java +++ b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java @@ -25,6 +25,7 @@ import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBu import org.apache.hc.client5.http.impl.routing.DefaultProxyRoutePlanner; import org.apache.hc.client5.http.protocol.HttpClientContext; import org.apache.hc.client5.http.ssl.ClientTlsStrategyBuilder; +import org.apache.hc.client5.http.ssl.NoopHostnameVerifier; import org.apache.hc.core5.http.HttpHost; import org.apache.hc.core5.http.HttpResponse; import org.apache.hc.core5.http.nio.ssl.TlsStrategy; @@ -33,7 +34,6 @@ import org.apache.hc.core5.http.protocol.HttpContext; import org.apache.hc.core5.reactor.IOReactorConfig; import org.apache.hc.core5.ssl.SSLContexts; import org.apache.hc.core5.ssl.TrustStrategy; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.junit.jupiter.api.Test; @@ -120,7 +120,7 @@ class HttpAsyncClientLiveTest extends GetRequestMockServer { .build(); final TlsStrategy tlsStrategy = ClientTlsStrategyBuilder.create() - .setHostnameVerifier(SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER) + .setHostnameVerifier(NoopHostnameVerifier.INSTANCE) .setSslContext(sslContext) .build(); From 19184bdf406461c21b3ba48873626f89b8dfc49f Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 7 Dec 2023 13:12:55 +0200 Subject: [PATCH 169/294] [JAVA-27761] Upgraded spring-reactive-2 to spring boot 3 (#15293) --- .../spring-reactive-2/pom.xml | 18 ++++-- ...n.java => Spring6ReactiveApplication.java} | 4 +- .../consumer/ConsumerSSEApplication.java | 7 +- .../reactive/urlmatch/FormHandler.java | 2 +- .../com/baeldung/reactive/util/CpuUtils.java | 2 +- .../staticcontent/StaticContentConfig.java | 2 +- .../FunctionalValidationsApplication.java | 9 +-- .../model/AnnotatedRequestEntity.java | 4 +- .../backpressure/BackpressureUnitTest.java | 64 +++++++++---------- ...ernsUsingHandlerMethodIntegrationTest.java | 4 +- 10 files changed, 60 insertions(+), 56 deletions(-) rename spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/{Spring5ReactiveApplication.java => Spring6ReactiveApplication.java} (77%) diff --git a/spring-reactive-modules/spring-reactive-2/pom.xml b/spring-reactive-modules/spring-reactive-2/pom.xml index a5552bfe51..fac93154c8 100644 --- a/spring-reactive-modules/spring-reactive-2/pom.xml +++ b/spring-reactive-modules/spring-reactive-2/pom.xml @@ -10,9 +10,10 @@ spring sample project about new features - com.baeldung.spring.reactive - spring-reactive-modules - 1.0.0-SNAPSHOT + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -45,8 +46,8 @@ test - com.github.tomakehurst - wiremock-jre8 + org.wiremock + wiremock ${wiremock.version} test @@ -64,6 +65,11 @@ org.springframework.boot spring-boot-starter-tomcat + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + @@ -116,7 +122,7 @@ 1.0.1.RELEASE - 2.24.0 + 3.3.1 \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring6ReactiveApplication.java similarity index 77% rename from spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java rename to spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring6ReactiveApplication.java index ef862dd957..f716af4a0e 100644 --- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java +++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring6ReactiveApplication.java @@ -5,10 +5,10 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; @SpringBootApplication(exclude = { RedisAutoConfiguration.class }) -public class Spring5ReactiveApplication{ +public class Spring6ReactiveApplication { public static void main(String[] args) { - SpringApplication.run(Spring5ReactiveApplication.class, args); + SpringApplication.run(Spring6ReactiveApplication.class, args); } } diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/serversentevents/consumer/ConsumerSSEApplication.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/serversentevents/consumer/ConsumerSSEApplication.java index d8edaf7fd5..bec7dd2e0c 100644 --- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/serversentevents/consumer/ConsumerSSEApplication.java +++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/serversentevents/consumer/ConsumerSSEApplication.java @@ -22,9 +22,10 @@ public class ConsumerSSEApplication { @Bean public SecurityWebFilterChain sseConsumerSpringSecurityFilterChain(ServerHttpSecurity http) { - http.authorizeExchange() - .anyExchange() - .permitAll(); + http.authorizeExchange(auth -> auth + .anyExchange().permitAll() + ) + .csrf(ServerHttpSecurity.CsrfSpec::disable); return http.build(); } diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java index 7b1fb06459..1652e2f25d 100644 --- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java +++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java @@ -34,7 +34,7 @@ public class FormHandler { private AtomicLong extractData(List dataBuffers) { AtomicLong atomicLong = new AtomicLong(0); - dataBuffers.forEach(d -> atomicLong.addAndGet(d.asByteBuffer() + dataBuffers.forEach(d -> atomicLong.addAndGet(d.toByteBuffer() .array().length)); return atomicLong; } diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/util/CpuUtils.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/util/CpuUtils.java index 8d16434920..20cc162cde 100644 --- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/util/CpuUtils.java +++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/util/CpuUtils.java @@ -9,7 +9,7 @@ public class CpuUtils { private static OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); static Double getUsage() { - return (operatingSystemMXBean.getSystemCpuLoad() / operatingSystemMXBean.getAvailableProcessors()) * 100; + return (operatingSystemMXBean.getCpuLoad() / operatingSystemMXBean.getAvailableProcessors()) * 100; } } diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java index 1fbb9958e7..456eec8f84 100644 --- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java +++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java @@ -23,7 +23,7 @@ public class StaticContentConfig { GET("/"), request -> ok() .contentType(MediaType.TEXT_HTML) - .syncBody(html) + .bodyValue(html) ); } diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java index 4cbb65dc60..bcbd4d55d7 100644 --- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java +++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java @@ -15,10 +15,11 @@ public class FunctionalValidationsApplication { @Bean public SecurityWebFilterChain functionalValidationsSpringSecurityFilterChain(ServerHttpSecurity http) { - http.authorizeExchange() - .anyExchange() - .permitAll(); - http.csrf().disable(); + http.authorizeExchange(auth -> auth + .anyExchange().permitAll() + ) + .csrf(ServerHttpSecurity.CsrfSpec::disable); + return http.build(); } } diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java index 992f07481c..6ca6c369c1 100644 --- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java +++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java @@ -1,7 +1,7 @@ package com.baeldung.validations.functional.model; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/backpressure/BackpressureUnitTest.java b/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/backpressure/BackpressureUnitTest.java index a12d762fe5..c087e10b3f 100644 --- a/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/backpressure/BackpressureUnitTest.java +++ b/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/backpressure/BackpressureUnitTest.java @@ -24,49 +24,45 @@ public class BackpressureUnitTest { ); StepVerifier.create(limit) - .expectSubscription() - .thenRequest(15) - .expectNext(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) - .expectNext(11, 12, 13, 14, 15) - .thenRequest(10) - .expectNext(16, 17, 18, 19, 20, 21, 22, 23, 24, 25) - .verifyComplete(); + .expectSubscription() + .thenRequest(15) + .expectNext(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) + .expectNext(11, 12, 13, 14, 15) + .thenRequest(10) + .expectNext(16, 17, 18, 19, 20, 21, 22, 23, 24, 25) + .verifyComplete(); } @Test public void whenRequestingChunks10_thenMessagesAreReceived() { Flux request = Flux.range(1, 50); - request.subscribe( - integer -> LOGGER.debug(String.valueOf(integer)), - err -> err.printStackTrace(), - () -> LOGGER.debug("All 50 items have been successfully processed!!!"), - subscription -> { - for (int i = 0; i < 5; i++) { - LOGGER.debug("Requesting the next 10 elements!!!"); - subscription.request(10); - } - } - ); + request.subscribe(integer -> LOGGER.debug(String.valueOf(integer)), err -> err.printStackTrace(), () -> LOGGER.debug("All 50 items have been successfully processed!!!"), subscription -> { + for (int i = 0; i < 5; i++) { + LOGGER.debug("Requesting the next 10 elements!!!"); + subscription.request(10); + } + }); StepVerifier.create(request) - .expectSubscription() - .thenRequest(10) - .expectNext(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) - .thenRequest(10) - .expectNext(11, 12, 13, 14, 15, 16, 17, 18, 19, 20) - .thenRequest(10) - .expectNext(21, 22, 23, 24, 25, 26, 27 , 28, 29 ,30) - .thenRequest(10) - .expectNext(31, 32, 33, 34, 35, 36, 37 , 38, 39 ,40) - .thenRequest(10) - .expectNext(41, 42, 43, 44, 45, 46, 47 , 48, 49 ,50) - .verifyComplete(); + .expectSubscription() + .thenRequest(10) + .expectNext(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) + .thenRequest(10) + .expectNext(11, 12, 13, 14, 15, 16, 17, 18, 19, 20) + .thenRequest(10) + .expectNext(21, 22, 23, 24, 25, 26, 27, 28, 29, 30) + .thenRequest(10) + .expectNext(31, 32, 33, 34, 35, 36, 37, 38, 39, 40) + .thenRequest(10) + .expectNext(41, 42, 43, 44, 45, 46, 47, 48, 49, 50) + .verifyComplete(); } @Test public void whenCancel_thenSubscriptionFinished() { - Flux cancel = Flux.range(1, 10).log(); + Flux cancel = Flux.range(1, 10) + .log(); cancel.subscribe(new BaseSubscriber() { @Override @@ -78,9 +74,9 @@ public class BackpressureUnitTest { }); StepVerifier.create(cancel) - .expectNext(1, 2, 3) - .thenCancel() - .verify(); + .expectNext(1, 2, 3) + .thenCancel() + .verify(); } } diff --git a/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java b/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java index 0b4607b54a..4069888dcd 100644 --- a/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java +++ b/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java @@ -8,11 +8,11 @@ import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; -import com.baeldung.reactive.Spring5ReactiveApplication; +import com.baeldung.reactive.Spring6ReactiveApplication; import com.baeldung.reactive.controller.PathPatternController; @RunWith(SpringRunner.class) -@SpringBootTest(classes = Spring5ReactiveApplication.class) +@SpringBootTest(classes = Spring6ReactiveApplication.class) @WithMockUser public class PathPatternsUsingHandlerMethodIntegrationTest { From 183101cd4fb51a0a241bb8202169a35324709bb3 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 21:51:10 +0800 Subject: [PATCH 170/294] Update README.md [skip ci] --- core-java-modules/core-java-numbers-conversions/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-numbers-conversions/README.md b/core-java-modules/core-java-numbers-conversions/README.md index dead88f025..cb272b0029 100644 --- a/core-java-modules/core-java-numbers-conversions/README.md +++ b/core-java-modules/core-java-numbers-conversions/README.md @@ -4,3 +4,4 @@ - [Convert int to Long in Java](https://www.baeldung.com/java-convert-int-long) - [How To Convert Double To Float In Java](https://www.baeldung.com/java-convert-double-float) - [Converting from float to BigDecimal in Java](https://www.baeldung.com/java-convert-float-bigdecimal) +- [Convert Positive Integer to Negative and Vice Versa in Java](https://www.baeldung.com/java-negating-integer) From d8be8b3bb1c2fbc7bd5b32eb53bf390e6e43a55c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 21:54:34 +0800 Subject: [PATCH 171/294] Update README.md [skip ci] --- core-java-modules/core-java-arrays-convert/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-arrays-convert/README.md b/core-java-modules/core-java-arrays-convert/README.md index 2e34829525..118d8e00ed 100644 --- a/core-java-modules/core-java-arrays-convert/README.md +++ b/core-java-modules/core-java-arrays-convert/README.md @@ -11,3 +11,4 @@ This module contains articles about arrays conversion in Java - [Converting an int[] to HashSet in Java](https://www.baeldung.com/java-converting-int-array-to-hashset) - [Convert an ArrayList of String to a String Array in Java](https://www.baeldung.com/java-convert-string-arraylist-array) - [Convert Char Array to Int Array in Java](https://www.baeldung.com/java-convert-char-int-array) +- [How to Convert Byte Array to Char Array](https://www.baeldung.com/java-convert-byte-array-char) From 300b524fdecdcef76aeab7d66a2f94cbb7ed5565 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 21:58:50 +0800 Subject: [PATCH 172/294] Create README.md [skip ci] --- core-java-modules/core-java-numbers-7/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 core-java-modules/core-java-numbers-7/README.md diff --git a/core-java-modules/core-java-numbers-7/README.md b/core-java-modules/core-java-numbers-7/README.md new file mode 100644 index 0000000000..42a43fd1fd --- /dev/null +++ b/core-java-modules/core-java-numbers-7/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Check if a double Is an Integer in Java](https://www.baeldung.com/java-check-double-integer) From 983c7190b954358d160e01c8024314a176bd5db8 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:03:42 +0800 Subject: [PATCH 173/294] Update README.md [skip ci] --- json-modules/gson-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/json-modules/gson-2/README.md b/json-modules/gson-2/README.md index 3deb61f25d..912f8b0a20 100644 --- a/json-modules/gson-2/README.md +++ b/json-modules/gson-2/README.md @@ -5,4 +5,4 @@ This module contains articles about Gson ### Relevant Articles: - [Solving Gson Parsing Errors](https://www.baeldung.com/gson-parsing-errors) - [Difference between Gson @Expose and @SerializedName](https://www.baeldung.com/gson-expose-vs-serializedname) - +- [Resolving Gson’s “Multiple JSON Fields†Exception](https://www.baeldung.com/java-gson-multiple-json-fields-exception) From 9c8c7ff561f2f0a19b1f06687e7c30c5357ea392 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:09:39 +0800 Subject: [PATCH 174/294] Update README.md [skip ci] --- static-analysis/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/static-analysis/README.md b/static-analysis/README.md index 235b79853b..ea0d797407 100644 --- a/static-analysis/README.md +++ b/static-analysis/README.md @@ -6,3 +6,4 @@ This module contains articles about static program analysis - [Introduction to PMD](https://www.baeldung.com/pmd) - [Java Static Analysis Tools in Eclipse and IntelliJ IDEA](https://www.baeldung.com/java-static-analysis-tools) +- [Catch Common Mistakes with Error Prone Library in Java](https://www.baeldung.com/java-error-prone-library) From fa10ea0e21110d80696bbff5333d29cc13e9333d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:12:10 +0800 Subject: [PATCH 175/294] Update README.md [skip ci] --- xml/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/xml/README.md b/xml/README.md index 16942c6836..596ddc14aa 100644 --- a/xml/README.md +++ b/xml/README.md @@ -13,3 +13,4 @@ This module contains articles about eXtensible Markup Language (XML) - [Parsing an XML File Using StAX](https://www.baeldung.com/java-stax) - [Parsing an XML File Using SAX Parser](https://www.baeldung.com/java-sax-parser) - [Remove HTML Tags Using Java](https://www.baeldung.com/java-remove-html-tags) +- [Convert an XML File to CSV File](https://www.baeldung.com/java-convert-xml-csv) From 6b41d74e5fa5e3cfd299dafb15b0e87f13a0a2ba Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:15:31 +0800 Subject: [PATCH 176/294] Create README.md [skip ci] --- persistence-modules/java-harperdb/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 persistence-modules/java-harperdb/README.md diff --git a/persistence-modules/java-harperdb/README.md b/persistence-modules/java-harperdb/README.md new file mode 100644 index 0000000000..99a91e00ed --- /dev/null +++ b/persistence-modules/java-harperdb/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Working With HarperDB and Java](https://www.baeldung.com/java-harperdb) From 5600e16d489cdf80650c648ca562b174cdf10b4b Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:20:24 +0800 Subject: [PATCH 177/294] Update README.md [skip ci] --- json-modules/json/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/json-modules/json/README.md b/json-modules/json/README.md index d643914fc7..d6e1b400f5 100644 --- a/json-modules/json/README.md +++ b/json-modules/json/README.md @@ -12,4 +12,5 @@ This module contains articles about JSON. - [Iterating Over an Instance of org.json.JSONObject](https://www.baeldung.com/jsonobject-iteration) - [Escape JSON String in Java](https://www.baeldung.com/java-json-escaping) - [Reducing JSON Data Size](https://www.baeldung.com/json-reduce-data-size) +- [How to Convert JsonNode to ObjectNode](https://www.baeldung.com/java-jackson-jsonnode-objectnode) - More Articles: [[next -->]](../json-2) From 3adfcb215cd6568caf86d4e007dd704dafad07f5 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:22:56 +0800 Subject: [PATCH 178/294] Update README.md [skip ci] --- core-java-modules/core-java-lang-operators-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-operators-2/README.md b/core-java-modules/core-java-lang-operators-2/README.md index e8b792e634..4b93f8d192 100644 --- a/core-java-modules/core-java-lang-operators-2/README.md +++ b/core-java-modules/core-java-lang-operators-2/README.md @@ -10,3 +10,4 @@ This module contains articles about Java operators - [Check if at Least Two Out of Three Booleans Are True in Java](https://www.baeldung.com/java-check-two-of-three-booleans) - [Alternatives for instanceof Operator in Java](https://www.baeldung.com/java-instanceof-alternatives) - [What Does “––>†Mean in Java?](https://www.baeldung.com/java-minus-minus-greaterthan) +- [All the Ways Java Uses the Colon Character](https://www.baeldung.com/java-colon) From d63b2b5a2ad4b21de2ac2d407cb128526a28642a Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:24:56 +0800 Subject: [PATCH 179/294] Update README.md [skip ci] --- core-java-modules/core-java-numbers-conversions/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-numbers-conversions/README.md b/core-java-modules/core-java-numbers-conversions/README.md index cb272b0029..b5f02a9d47 100644 --- a/core-java-modules/core-java-numbers-conversions/README.md +++ b/core-java-modules/core-java-numbers-conversions/README.md @@ -5,3 +5,4 @@ - [How To Convert Double To Float In Java](https://www.baeldung.com/java-convert-double-float) - [Converting from float to BigDecimal in Java](https://www.baeldung.com/java-convert-float-bigdecimal) - [Convert Positive Integer to Negative and Vice Versa in Java](https://www.baeldung.com/java-negating-integer) +- [Rounding Up a Number to Nearest Multiple of 5 in Java](https://www.baeldung.com/java-round-nearest-multiple-five) From bf1aaf197f9733cfa0e5ccd0c0ada50a8d8b52b4 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Fri, 8 Dec 2023 09:51:11 +0200 Subject: [PATCH 180/294] [JAVA-28504] Clean up --- spring-websockets/pom.xml | 6 +++++- static-analysis/error-prone-project/pom.xml | 11 ++++------- static-analysis/my-bugchecker-plugin/pom.xml | 11 +++-------- static-analysis/pmd/pom.xml | 10 ++-------- tablesaw/pom.xml | 5 ----- testing-modules/cucumber/pom.xml | 2 -- testing-modules/gatling-java/pom.xml | 3 --- testing-modules/gatling/pom.xml | 3 --- testing-modules/jqwik/pom.xml | 6 +++++- testing-modules/junit-5-advanced/pom.xml | 3 ++- testing-modules/junit-5-basics-2/pom.xml | 7 ------- testing-modules/junit-5/pom.xml | 1 - testing-modules/load-testing-comparison/pom.xml | 3 --- testing-modules/mockito-2/pom.xml | 3 --- vavr-modules/java-vavr-stream/pom.xml | 6 +----- vavr-modules/pom.xml | 4 ++++ vavr-modules/vavr-2/pom.xml | 4 ---- vertx-modules/pom.xml | 4 ++++ vertx-modules/vertx-and-rxjava/pom.xml | 4 ---- vertx-modules/vertx/pom.xml | 1 - web-modules/apache-tapestry/pom.xml | 8 -------- web-modules/blade/pom.xml | 1 - web-modules/jakarta-ee/pom.xml | 9 ++------- 23 files changed, 32 insertions(+), 83 deletions(-) diff --git a/spring-websockets/pom.xml b/spring-websockets/pom.xml index a28ef8749a..6ca84c4946 100644 --- a/spring-websockets/pom.xml +++ b/spring-websockets/pom.xml @@ -26,7 +26,7 @@ com.github.javafaker javafaker - 1.0.2 + ${javafaker.version} com.google.code.gson @@ -44,4 +44,8 @@ + + 1.0.2 + + \ No newline at end of file diff --git a/static-analysis/error-prone-project/pom.xml b/static-analysis/error-prone-project/pom.xml index 59f7bb7270..2d5706d0d2 100644 --- a/static-analysis/error-prone-project/pom.xml +++ b/static-analysis/error-prone-project/pom.xml @@ -3,14 +3,14 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + error-prone-project + com.baeldung static-analysis 1.0-SNAPSHOT - error-prone-project - @@ -19,7 +19,6 @@ ${maven-compiler-plugin.version} 17 - UTF-8 true -XDcompilePolicy=simple @@ -44,7 +43,7 @@ com.baeldung my-bugchecker-plugin - 1.0-SNAPSHOT + ${my-bugchecker-plugin.version} @@ -53,9 +52,7 @@ - 17 - 17 - UTF-8 + 1.0-SNAPSHOT diff --git a/static-analysis/my-bugchecker-plugin/pom.xml b/static-analysis/my-bugchecker-plugin/pom.xml index cbe16b0a14..eb11f07b4e 100644 --- a/static-analysis/my-bugchecker-plugin/pom.xml +++ b/static-analysis/my-bugchecker-plugin/pom.xml @@ -3,13 +3,14 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + my-bugchecker-plugin + jar + com.baeldung static-analysis 1.0-SNAPSHOT - jar - my-bugchecker-plugin @@ -47,10 +48,4 @@ - - 17 - 17 - UTF-8 - - diff --git a/static-analysis/pmd/pom.xml b/static-analysis/pmd/pom.xml index 31914fe9f0..372c122776 100644 --- a/static-analysis/pmd/pom.xml +++ b/static-analysis/pmd/pom.xml @@ -3,18 +3,12 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + pmd + com.baeldung static-analysis 1.0-SNAPSHOT - pmd - - - 17 - 17 - UTF-8 - - diff --git a/tablesaw/pom.xml b/tablesaw/pom.xml index f38e4cb8b4..c45931a9e2 100644 --- a/tablesaw/pom.xml +++ b/tablesaw/pom.xml @@ -25,11 +25,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.0 - - 17 - 17 - diff --git a/testing-modules/cucumber/pom.xml b/testing-modules/cucumber/pom.xml index c1d99bb492..088a75a941 100644 --- a/testing-modules/cucumber/pom.xml +++ b/testing-modules/cucumber/pom.xml @@ -121,8 +121,6 @@ - 14 - 14 6.10.3 5.4.0 3.141.59 diff --git a/testing-modules/gatling-java/pom.xml b/testing-modules/gatling-java/pom.xml index abe033f298..54dee1fd88 100644 --- a/testing-modules/gatling-java/pom.xml +++ b/testing-modules/gatling-java/pom.xml @@ -72,9 +72,6 @@ - 1.8 - 1.8 - UTF-8 3.9.5 4.3.0 1.0.2 diff --git a/testing-modules/gatling/pom.xml b/testing-modules/gatling/pom.xml index 82ce988bac..e5b1db2bfb 100644 --- a/testing-modules/gatling/pom.xml +++ b/testing-modules/gatling/pom.xml @@ -105,9 +105,6 @@ - 1.8 - 1.8 - UTF-8 2.12.6 3.3.1 4.3.0 diff --git a/testing-modules/jqwik/pom.xml b/testing-modules/jqwik/pom.xml index 6ef9b61a6a..85c4ba571a 100644 --- a/testing-modules/jqwik/pom.xml +++ b/testing-modules/jqwik/pom.xml @@ -17,7 +17,7 @@ net.jqwik jqwik - 1.7.4 + ${jqwik.version} test @@ -53,5 +53,9 @@ + + 1.7.4 + + diff --git a/testing-modules/junit-5-advanced/pom.xml b/testing-modules/junit-5-advanced/pom.xml index 411f189638..fc0349ff8e 100644 --- a/testing-modules/junit-5-advanced/pom.xml +++ b/testing-modules/junit-5-advanced/pom.xml @@ -18,7 +18,7 @@ com.github.stefanbirkner system-lambda - 1.2.1 + ${system-lambda.version} test @@ -79,6 +79,7 @@ + 1.2.1 1.49 3.24.2 1.10.1 diff --git a/testing-modules/junit-5-basics-2/pom.xml b/testing-modules/junit-5-basics-2/pom.xml index b430161380..f03b74f47a 100644 --- a/testing-modules/junit-5-basics-2/pom.xml +++ b/testing-modules/junit-5-basics-2/pom.xml @@ -36,18 +36,11 @@ org.apache.maven.plugins maven-compiler-plugin - - 11 - 11 - - 11 - 11 - UTF-8 1.5.0 5.10.0 5.5.0 diff --git a/testing-modules/junit-5/pom.xml b/testing-modules/junit-5/pom.xml index 8afaa085b1..cdddf90855 100644 --- a/testing-modules/junit-5/pom.xml +++ b/testing-modules/junit-5/pom.xml @@ -107,7 +107,6 @@ org.codehaus.mojo exec-maven-plugin - ${exec-maven-plugin.version} diff --git a/testing-modules/load-testing-comparison/pom.xml b/testing-modules/load-testing-comparison/pom.xml index d5a389d311..af42523ca9 100644 --- a/testing-modules/load-testing-comparison/pom.xml +++ b/testing-modules/load-testing-comparison/pom.xml @@ -66,9 +66,6 @@ - 1.8 - 1.8 - UTF-8 2.12.12 3.4.0 4.4.0 diff --git a/testing-modules/mockito-2/pom.xml b/testing-modules/mockito-2/pom.xml index 0e0f19b6b3..100c9d7015 100644 --- a/testing-modules/mockito-2/pom.xml +++ b/testing-modules/mockito-2/pom.xml @@ -21,9 +21,6 @@ - 8 - 8 - UTF-8 4.8.1 diff --git a/vavr-modules/java-vavr-stream/pom.xml b/vavr-modules/java-vavr-stream/pom.xml index cda9d1f734..e369fa7cf3 100644 --- a/vavr-modules/java-vavr-stream/pom.xml +++ b/vavr-modules/java-vavr-stream/pom.xml @@ -19,12 +19,8 @@ io.vavr vavr - ${io.vavr.version} + ${vavr.version} - - 0.9.2 - - \ No newline at end of file diff --git a/vavr-modules/pom.xml b/vavr-modules/pom.xml index 416c689511..e9a3b121aa 100644 --- a/vavr-modules/pom.xml +++ b/vavr-modules/pom.xml @@ -30,4 +30,8 @@ + + 0.9.2 + + \ No newline at end of file diff --git a/vavr-modules/vavr-2/pom.xml b/vavr-modules/vavr-2/pom.xml index 0063daa518..54f3cb4d71 100644 --- a/vavr-modules/vavr-2/pom.xml +++ b/vavr-modules/vavr-2/pom.xml @@ -21,8 +21,4 @@ - - 0.9.1 - - \ No newline at end of file diff --git a/vertx-modules/pom.xml b/vertx-modules/pom.xml index 7d9614ad61..00f0bc46f5 100644 --- a/vertx-modules/pom.xml +++ b/vertx-modules/pom.xml @@ -30,4 +30,8 @@ + + 3.9.15 + + \ No newline at end of file diff --git a/vertx-modules/vertx-and-rxjava/pom.xml b/vertx-modules/vertx-and-rxjava/pom.xml index 16eaf8ebaa..b68117ddeb 100644 --- a/vertx-modules/vertx-and-rxjava/pom.xml +++ b/vertx-modules/vertx-and-rxjava/pom.xml @@ -40,8 +40,4 @@ - - 3.9.15 - - \ No newline at end of file diff --git a/vertx-modules/vertx/pom.xml b/vertx-modules/vertx/pom.xml index 75df2fae69..d34deca9d8 100644 --- a/vertx-modules/vertx/pom.xml +++ b/vertx-modules/vertx/pom.xml @@ -65,7 +65,6 @@ - 3.9.15 3.2.1 diff --git a/web-modules/apache-tapestry/pom.xml b/web-modules/apache-tapestry/pom.xml index 562cdff00c..bfc7c22415 100644 --- a/web-modules/apache-tapestry/pom.xml +++ b/web-modules/apache-tapestry/pom.xml @@ -78,17 +78,13 @@ org.apache.maven.plugins maven-compiler-plugin - ${compiler.plugin.version} - ${source.version} - ${target.version} true org.apache.maven.plugins maven-surefire-plugin - ${compiler.surefire.version} Qa @@ -118,7 +114,6 @@ org.apache.maven.plugins maven-war-plugin - 3.3.1 @@ -140,9 +135,6 @@ 6.1.16 3.0.0-M5 - 3.8.1 - 11 - 11 5.8.2 2.5 6.8.21 diff --git a/web-modules/blade/pom.xml b/web-modules/blade/pom.xml index 2748c05663..fb0ca13dbe 100644 --- a/web-modules/blade/pom.xml +++ b/web-modules/blade/pom.xml @@ -62,7 +62,6 @@ org.apache.maven.plugins maven-failsafe-plugin - ${maven-failsafe-plugin.version} true diff --git a/web-modules/jakarta-ee/pom.xml b/web-modules/jakarta-ee/pom.xml index 066bc14766..d90e848323 100644 --- a/web-modules/jakarta-ee/pom.xml +++ b/web-modules/jakarta-ee/pom.xml @@ -2,7 +2,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung jakarta-ee 1.0-SNAPSHOT jakarta-ee @@ -51,7 +50,7 @@ org.glassfish.maven.plugin maven-glassfish-plugin - 2.1 + ${maven-glassfish-plugin.version} ${local.glassfish.home} admin @@ -76,11 +75,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.0 - - 11 - 11 - org.apache.maven.plugins @@ -104,6 +98,7 @@ ${local.glassfish.home}\\domains\\${local.glassfish.domain}\\config\\domain-passwords + 2.1 \ No newline at end of file From 6f9a2c2dfede5a9ca8746f04af2439a9da6ee464 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Fri, 8 Dec 2023 00:05:04 -0800 Subject: [PATCH 181/294] JAVA-26279 Improve aws-modules build time (#15370) --- aws-modules/aws-dynamodb/pom.xml | 16 ---------------- aws-modules/aws-miscellaneous/pom.xml | 16 ---------------- aws-modules/aws-s3/pom.xml | 21 --------------------- 3 files changed, 53 deletions(-) diff --git a/aws-modules/aws-dynamodb/pom.xml b/aws-modules/aws-dynamodb/pom.xml index 155d48c240..199b9a187e 100644 --- a/aws-modules/aws-dynamodb/pom.xml +++ b/aws-modules/aws-dynamodb/pom.xml @@ -40,22 +40,6 @@ - - org.apache.maven.plugins - maven-shade-plugin - ${maven-shade-plugin.version} - - false - - - - package - - shade - - - - org.apache.maven.plugins maven-dependency-plugin diff --git a/aws-modules/aws-miscellaneous/pom.xml b/aws-modules/aws-miscellaneous/pom.xml index b6326b6eb1..f04e84e14f 100644 --- a/aws-modules/aws-miscellaneous/pom.xml +++ b/aws-modules/aws-miscellaneous/pom.xml @@ -34,22 +34,6 @@ - - org.apache.maven.plugins - maven-shade-plugin - ${maven-shade-plugin.version} - - false - - - - package - - shade - - - - org.apache.maven.plugins maven-dependency-plugin diff --git a/aws-modules/aws-s3/pom.xml b/aws-modules/aws-s3/pom.xml index e2bc04964a..9ba436b43f 100644 --- a/aws-modules/aws-s3/pom.xml +++ b/aws-modules/aws-s3/pom.xml @@ -39,27 +39,6 @@ - - - - org.apache.maven.plugins - maven-shade-plugin - ${maven-shade-plugin.version} - - false - - - - package - - shade - - - - - - - 2.20.52 1.10.L001 From 18643bc0a02f50b57fcf6fcfeb53ff61e3484fd1 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Fri, 8 Dec 2023 16:17:08 +0530 Subject: [PATCH 182/294] JAVA-26717:Changes made for Upgrade snakeyaml to latest version (#15284) --- libraries-data-io/pom.xml | 2 +- .../YAMLToJavaDeserialisationUnitTest.java | 28 ++++++++++++------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/libraries-data-io/pom.xml b/libraries-data-io/pom.xml index c8d895b4e5..9fc2814312 100644 --- a/libraries-data-io/pom.xml +++ b/libraries-data-io/pom.xml @@ -98,7 +98,7 @@ - 1.21 + 2.2 4.0.1 1.7.0 5.8 diff --git a/libraries-data-io/src/test/java/com/baeldung/libraries/snakeyaml/YAMLToJavaDeserialisationUnitTest.java b/libraries-data-io/src/test/java/com/baeldung/libraries/snakeyaml/YAMLToJavaDeserialisationUnitTest.java index 6f32f143a9..4c92bf41e1 100644 --- a/libraries-data-io/src/test/java/com/baeldung/libraries/snakeyaml/YAMLToJavaDeserialisationUnitTest.java +++ b/libraries-data-io/src/test/java/com/baeldung/libraries/snakeyaml/YAMLToJavaDeserialisationUnitTest.java @@ -1,15 +1,19 @@ package com.baeldung.libraries.snakeyaml; -import org.junit.Test; -import org.yaml.snakeyaml.TypeDescription; -import org.yaml.snakeyaml.Yaml; -import org.yaml.snakeyaml.constructor.Constructor; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import java.io.InputStream; import java.util.Date; import java.util.Map; -import static org.junit.Assert.*; +import org.junit.Test; +import org.yaml.snakeyaml.LoaderOptions; +import org.yaml.snakeyaml.TypeDescription; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.Constructor; +import org.yaml.snakeyaml.inspector.TagInspector; public class YAMLToJavaDeserialisationUnitTest { @@ -27,7 +31,7 @@ public class YAMLToJavaDeserialisationUnitTest { @Test public void whenLoadYAMLDocumentWithTopLevelClass_thenLoadCorrectJavaObject() { - Yaml yaml = new Yaml(new Constructor(Customer.class)); + Yaml yaml = new Yaml(new Constructor(Customer.class,new LoaderOptions())); InputStream inputStream = this.getClass() .getClassLoader() .getResourceAsStream("yaml/customer.yaml"); @@ -39,7 +43,11 @@ public class YAMLToJavaDeserialisationUnitTest { @Test public void whenLoadYAMLDocumentWithAssumedClass_thenLoadCorrectJavaObject() { - Yaml yaml = new Yaml(); + LoaderOptions loaderoptions = new LoaderOptions(); + TagInspector taginspector = tag -> tag.getClassName() + .equals(Customer.class.getName()); + loaderoptions.setTagInspector(taginspector); + Yaml yaml = new Yaml(new Constructor(Customer.class, loaderoptions)); InputStream inputStream = this.getClass() .getClassLoader() .getResourceAsStream("yaml/customer_with_type.yaml"); @@ -61,7 +69,7 @@ public class YAMLToJavaDeserialisationUnitTest { @Test public void whenLoadYAMLDocumentWithTopLevelClass_thenLoadCorrectJavaObjectWithNestedObjects() { - Yaml yaml = new Yaml(new Constructor(Customer.class)); + Yaml yaml = new Yaml(new Constructor(Customer.class, new LoaderOptions())); InputStream inputStream = this.getClass() .getClassLoader() .getResourceAsStream("yaml/customer_with_contact_details_and_address.yaml"); @@ -91,7 +99,7 @@ public class YAMLToJavaDeserialisationUnitTest { @Test public void whenLoadYAMLDocumentWithTypeDescription_thenLoadCorrectJavaObjectWithCorrectGenericType() { - Constructor constructor = new Constructor(Customer.class); + Constructor constructor = new Constructor(Customer.class, new LoaderOptions()); TypeDescription customTypeDescription = new TypeDescription(Customer.class); customTypeDescription.addPropertyParameters("contactDetails", Contact.class); constructor.addTypeDescription(customTypeDescription); @@ -116,7 +124,7 @@ public class YAMLToJavaDeserialisationUnitTest { @Test public void whenLoadMultipleYAMLDocuments_thenLoadCorrectJavaObjects() { - Yaml yaml = new Yaml(new Constructor(Customer.class)); + Yaml yaml = new Yaml(new Constructor(Customer.class, new LoaderOptions())); InputStream inputStream = this.getClass() .getClassLoader() .getResourceAsStream("yaml/customers.yaml"); From e0b7b8c02011f478b5ec2131b82c7968d7c25cb9 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Fri, 8 Dec 2023 13:45:59 +0100 Subject: [PATCH 183/294] JAVA-26710 | Updating HikariCP library to the latest version - 5.1.0 (#15362) --- jhipster-modules/jhipster-microservice/car-app/pom.xml | 2 +- jhipster-modules/jhipster-microservice/dealer-app/pom.xml | 2 +- jhipster-modules/jhipster-microservice/gateway-app/pom.xml | 2 +- jhipster-modules/jhipster-monolithic/pom.xml | 2 +- libraries-data-db/pom.xml | 2 +- persistence-modules/core-java-persistence/pom.xml | 2 +- spring-4/pom.xml | 2 +- spring-5/pom.xml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/jhipster-modules/jhipster-microservice/car-app/pom.xml b/jhipster-modules/jhipster-microservice/car-app/pom.xml index f345688939..87c289cb46 100644 --- a/jhipster-modules/jhipster-microservice/car-app/pom.xml +++ b/jhipster-modules/jhipster-microservice/car-app/pom.xml @@ -23,7 +23,7 @@ 0.4.13 1.2 5.2.8.Final - 2.6.0 + 5.1.0 0.7.9 1.8 3.21.0-GA diff --git a/jhipster-modules/jhipster-microservice/dealer-app/pom.xml b/jhipster-modules/jhipster-microservice/dealer-app/pom.xml index 056bd60f33..f660463026 100644 --- a/jhipster-modules/jhipster-microservice/dealer-app/pom.xml +++ b/jhipster-modules/jhipster-microservice/dealer-app/pom.xml @@ -23,7 +23,7 @@ 0.4.13 1.2 5.2.8.Final - 2.6.0 + 5.1.0 0.7.9 3.21.0-GA 1.0.0 diff --git a/jhipster-modules/jhipster-microservice/gateway-app/pom.xml b/jhipster-modules/jhipster-microservice/gateway-app/pom.xml index b90f22f009..7c95704da7 100644 --- a/jhipster-modules/jhipster-microservice/gateway-app/pom.xml +++ b/jhipster-modules/jhipster-microservice/gateway-app/pom.xml @@ -26,7 +26,7 @@ 1.3 1.2 5.2.8.Final - 2.6.0 + 5.1.0 0.7.9 3.21.0-GA 1.0.0 diff --git a/jhipster-modules/jhipster-monolithic/pom.xml b/jhipster-modules/jhipster-monolithic/pom.xml index fbcee8f1ff..bb82c819c4 100644 --- a/jhipster-modules/jhipster-monolithic/pom.xml +++ b/jhipster-modules/jhipster-monolithic/pom.xml @@ -892,7 +892,7 @@ 2.2.1 2.2.3 5.2.8.Final - 2.6.0 + 5.1.0 0.7.9 3.21.0-GA 1.0.0 diff --git a/libraries-data-db/pom.xml b/libraries-data-db/pom.xml index 5f1ff489f4..6ee8daa2a5 100644 --- a/libraries-data-db/pom.xml +++ b/libraries-data-db/pom.xml @@ -300,7 +300,7 @@ 6.0.0-release 6.0.1 3.2.1 - 5.0.1 + 5.1.0 13.15.2 2.1.3.Final 2.2.3 diff --git a/persistence-modules/core-java-persistence/pom.xml b/persistence-modules/core-java-persistence/pom.xml index 5d5c36ef01..20553da4e8 100644 --- a/persistence-modules/core-java-persistence/pom.xml +++ b/persistence-modules/core-java-persistence/pom.xml @@ -62,7 +62,7 @@ 2.9.0 - 5.0.1 + 5.1.0 0.9.5.5 3.0.4 6.0.6 diff --git a/spring-4/pom.xml b/spring-4/pom.xml index ad05123543..9a50319d13 100644 --- a/spring-4/pom.xml +++ b/spring-4/pom.xml @@ -121,7 +121,7 @@ 1.0.1 3.6 2.4.0 - 4.0.3 + 5.1.0 2.17.1 diff --git a/spring-5/pom.xml b/spring-5/pom.xml index 1ac696e7bd..65f1b77520 100644 --- a/spring-5/pom.xml +++ b/spring-5/pom.xml @@ -143,7 +143,7 @@ 1.0 1.5.6 ${project.build.directory}/generated-snippets - 4.0.3 + 5.1.0 \ No newline at end of file From cc649a15860027ba89dffebf3f6d56820a4f2a0c Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Fri, 8 Dec 2023 23:27:33 +0530 Subject: [PATCH 184/294] JAVA-27515: Upgraded spring-session-jdbc to spring-boot-parent-3 (#15326) --- .../spring-session/spring-session-jdbc/pom.xml | 4 ++-- .../controller/SpringSessionJdbcController.java | 5 +++-- .../springsessionjdbc/SpringSessionJdbcIntegrationTest.java | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/spring-web-modules/spring-session/spring-session-jdbc/pom.xml b/spring-web-modules/spring-session/spring-session-jdbc/pom.xml index 3cc2b8d18e..24194f5426 100644 --- a/spring-web-modules/spring-session/spring-session-jdbc/pom.xml +++ b/spring-web-modules/spring-session/spring-session-jdbc/pom.xml @@ -11,9 +11,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../../../parent-boot-2 + ../../../parent-boot-3 diff --git a/spring-web-modules/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/controller/SpringSessionJdbcController.java b/spring-web-modules/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/controller/SpringSessionJdbcController.java index 509a5f292b..a173636ed8 100644 --- a/spring-web-modules/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/controller/SpringSessionJdbcController.java +++ b/spring-web-modules/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/controller/SpringSessionJdbcController.java @@ -7,11 +7,12 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; import java.util.ArrayList; import java.util.List; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; + @Controller public class SpringSessionJdbcController { diff --git a/spring-web-modules/spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcIntegrationTest.java b/spring-web-modules/spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcIntegrationTest.java index 2dcc0b3af8..7133111e4c 100644 --- a/spring-web-modules/spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcIntegrationTest.java +++ b/spring-web-modules/spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcIntegrationTest.java @@ -9,7 +9,7 @@ import org.junit.runners.MethodSorters; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; From 8ff0949464193a33fb64a339055f2e92b74e29bc Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Fri, 8 Dec 2023 21:22:40 +0100 Subject: [PATCH 185/294] BAEL-6021: Handling NullPointerException in findFirst() When the First Element It Finds Is Null (#15341) --- ...FindFirstNullPointerExceptionUnitTest.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 core-java-modules/core-java-streams-5/src/test/java/com/baeldung/findfirstnullpointerexception/FindFirstNullPointerExceptionUnitTest.java diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/findfirstnullpointerexception/FindFirstNullPointerExceptionUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/findfirstnullpointerexception/FindFirstNullPointerExceptionUnitTest.java new file mode 100644 index 0000000000..074aec29d6 --- /dev/null +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/findfirstnullpointerexception/FindFirstNullPointerExceptionUnitTest.java @@ -0,0 +1,42 @@ +package com.baeldung.findfirstnullpointerexception; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; + +import org.junit.Test; + +public class FindFirstNullPointerExceptionUnitTest { + + private final List inputs = Arrays.asList(null, "foo", "bar"); + + @Test(expected = NullPointerException.class) + public void givenStream_whenCallingFindFirst_thenThrowNullPointerException() { + Optional firstElement = inputs.stream() + .findFirst(); + } + + @Test + public void givenStream_whenUsingOfNullableBeforeFindFirst_thenCorrect() { + Optional firstElement = inputs.stream() + .map(Optional::ofNullable) + .findFirst() + .flatMap(Function.identity()); + + assertTrue(firstElement.isEmpty()); + } + + @Test + public void givenStream_whenUsingFilterBeforeFindFirst_thenCorrect() { + Optional firstNonNullElement = inputs.stream() + .filter(Objects::nonNull) + .findFirst(); + + assertTrue(firstNonNullElement.isPresent()); + } + +} From c3fe804379cb634d6e32c4e445690ba21b61a6de Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Sat, 9 Dec 2023 00:22:41 +0000 Subject: [PATCH 186/294] https://jira.baeldung.com/browse/BAEL-7169 --- .../java/com/baeldung/{finalstatic => staticfinal}/Bike.java | 2 +- .../com/baeldung/{finalstatic => staticfinal}/BikeUnitTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename core-java-modules/core-java-lang-6/src/main/java/com/baeldung/{finalstatic => staticfinal}/Bike.java (87%) rename core-java-modules/core-java-lang-6/src/test/java/com/baeldung/{finalstatic => staticfinal}/BikeUnitTest.java (95%) diff --git a/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/finalstatic/Bike.java b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/staticfinal/Bike.java similarity index 87% rename from core-java-modules/core-java-lang-6/src/main/java/com/baeldung/finalstatic/Bike.java rename to core-java-modules/core-java-lang-6/src/main/java/com/baeldung/staticfinal/Bike.java index 6467ccc395..bde7b44897 100644 --- a/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/finalstatic/Bike.java +++ b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/staticfinal/Bike.java @@ -1,4 +1,4 @@ -package com.baeldung.finalstatic; +package com.baeldung.staticfinal; import java.util.HashMap; diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/staticfinal/BikeUnitTest.java similarity index 95% rename from core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java rename to core-java-modules/core-java-lang-6/src/test/java/com/baeldung/staticfinal/BikeUnitTest.java index 7b32b0906c..2201dae4d1 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/staticfinal/BikeUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.finalstatic; +package com.baeldung.staticfinal; import org.junit.jupiter.api.Test; From 36cc0c07eb809450f5683af2f478391ca97bc2c8 Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Sat, 9 Dec 2023 12:20:58 -0300 Subject: [PATCH 187/294] fix embedded kafka port (#15296) --- .../ManagingConsumerGroupsIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsIntegrationTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsIntegrationTest.java index 1620add9ca..ddbb105a67 100644 --- a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsIntegrationTest.java +++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsIntegrationTest.java @@ -14,7 +14,7 @@ import java.util.Objects; import static org.junit.jupiter.api.Assertions.assertEquals; @SpringBootTest(classes = ManagingConsumerGroupsApplicationKafkaApp.class) -@EmbeddedKafka(partitions = 2, brokerProperties = {"listeners=PLAINTEXT://localhost:9092", "port=9092"}) +@EmbeddedKafka(partitions = 2, brokerProperties = {"listeners=PLAINTEXT://localhost:9098", "port=9098"}) public class ManagingConsumerGroupsIntegrationTest { private static final String CONSUMER_1_IDENTIFIER = "org.springframework.kafka.KafkaListenerEndpointContainer#1"; From b0be6dbf36e521ed39d4400cda5a8d3fdeaca45e Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Sat, 9 Dec 2023 18:10:51 +0000 Subject: [PATCH 188/294] Failure Threshold Support for @RepeatedTest in Junit --- .../FailureThresholdUnitTest.java | 21 +++++++++++++++++++ .../junit5-annotations/test_file.txt | 1 + 2 files changed, 22 insertions(+) create mode 100644 testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/failurethreshold/FailureThresholdUnitTest.java create mode 100644 testing-modules/junit5-annotations/test_file.txt diff --git a/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/failurethreshold/FailureThresholdUnitTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/failurethreshold/FailureThresholdUnitTest.java new file mode 100644 index 0000000000..8f0043cf51 --- /dev/null +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/failurethreshold/FailureThresholdUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.junit5.failurethreshold; + +import org.junit.jupiter.api.RepeatedTest; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +class FailureThresholdUnitTest { + + @RepeatedTest(value = 5, failureThreshold = 1) + void givenTextFile_whenItIsReadAndContainsSpecifiedWordRepeatedly_thenMatchingLinesFound() throws IOException { + String filePath = "test_file.txt"; + try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { + String line = reader.readLine(); + assertTrue(line.contains("The")); + } + } +} diff --git a/testing-modules/junit5-annotations/test_file.txt b/testing-modules/junit5-annotations/test_file.txt new file mode 100644 index 0000000000..f29ab3685b --- /dev/null +++ b/testing-modules/junit5-annotations/test_file.txt @@ -0,0 +1 @@ +The Efficacy of meta-cognitive therapy on the symptoms of obsessive-compulsive disorder in patients with multiple sclerosis \ No newline at end of file From 40ef28a4497b1c4b02426a108eb0f2cd899db9ef Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Sat, 9 Dec 2023 19:20:16 +0100 Subject: [PATCH 189/294] BAEL-7258: renaming --- .../kafka/consumer/CustomKafkaListener.java | 7 +++--- ....java => CustomKafkaListenerLiveTest.java} | 23 +++++++++---------- 2 files changed, 14 insertions(+), 16 deletions(-) rename apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/{KafkaListenerWithoutSpringLiveTest.java => CustomKafkaListenerLiveTest.java} (84%) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/consumer/CustomKafkaListener.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/consumer/CustomKafkaListener.java index 58987d473b..b432c2ba55 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/consumer/CustomKafkaListener.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/consumer/CustomKafkaListener.java @@ -12,7 +12,7 @@ import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.KafkaConsumer; import org.apache.kafka.common.serialization.StringDeserializer; -public class CustomKafkaListener implements Runnable, Closeable { +public class CustomKafkaListener implements Runnable, AutoCloseable { private static final Logger log = Logger.getLogger(CustomKafkaListener.class.getName()); @@ -43,7 +43,7 @@ public class CustomKafkaListener implements Runnable, Closeable { return new KafkaConsumer<>(props); } - public CustomKafkaListener doForEach(Consumer newConsumer) { + public CustomKafkaListener onEach(Consumer newConsumer) { recordConsumer = recordConsumer.andThen(newConsumer); return this; } @@ -52,10 +52,9 @@ public class CustomKafkaListener implements Runnable, Closeable { public void run() { running.set(true); consumer.subscribe(Arrays.asList(topic)); - while (running.get()) { consumer.poll(Duration.ofMillis(100)) - .forEach(record -> recordConsumer.accept(record.value())); + .forEach(record -> recordConsumer.accept(record.value())); } } diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/KafkaListenerWithoutSpringLiveTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/CustomKafkaListenerLiveTest.java similarity index 84% rename from apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/KafkaListenerWithoutSpringLiveTest.java rename to apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/CustomKafkaListenerLiveTest.java index 213344d0a8..dbe7483dcd 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/KafkaListenerWithoutSpringLiveTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/CustomKafkaListenerLiveTest.java @@ -7,6 +7,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.testcontainers.shaded.org.awaitility.Awaitility.await; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Properties; import java.util.concurrent.CompletableFuture; @@ -23,7 +24,7 @@ import org.testcontainers.shaded.org.awaitility.Awaitility; import org.testcontainers.utility.DockerImageName; @Testcontainers -class KafkaListenerWithoutSpringLiveTest { +class CustomKafkaListenerLiveTest { @Container private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); @@ -34,30 +35,28 @@ class KafkaListenerWithoutSpringLiveTest { } @Test - void test() { + void givenANewCustomKafkaListener_thenConsumesAllMessages() { // given String topic = "baeldung.articles.published"; String bootstrapServers = KAFKA_CONTAINER.getBootstrapServers(); List consumedMessages = new ArrayList<>(); // when - try (CustomKafkaListener listener = new CustomKafkaListener(topic, bootstrapServers)) { - CompletableFuture.runAsync(() -> - listener.doForEach(consumedMessages::add).run() - ); + try (CustomKafkaListener listener = new CustomKafkaListener(topic, bootstrapServers).onEach(consumedMessages::add)) { + CompletableFuture.runAsync(listener); } // and - publishArticles(topic, asList( + publishArticles(topic, "Introduction to Kafka", "Kotlin for Java Developers", "Reactive Spring Boot", "Deploying Spring Boot Applications", "Spring Security" - )); + ); // then - await().untilAsserted(() -> assertThat(consumedMessages) - .containsExactlyInAnyOrder( + await().untilAsserted(() -> + assertThat(consumedMessages).containsExactlyInAnyOrder( "Introduction to Kafka", "Kotlin for Java Developers", "Reactive Spring Boot", @@ -66,9 +65,9 @@ class KafkaListenerWithoutSpringLiveTest { )); } - private void publishArticles(String topic, List articles) { + private void publishArticles(String topic, String... articles) { try (KafkaProducer producer = testKafkaProducer()) { - articles.stream() + Arrays.stream(articles) .map(article -> new ProducerRecord(topic, article)) .forEach(producer::send); } From bb989a8fe3fa15d0977d48df2a3f1f382f6dbec3 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sat, 9 Dec 2023 20:40:53 +0200 Subject: [PATCH 190/294] [JAVA-27235] Moved article "Spring Custom Property Editor" to spring-boot-data-2 (#15381) --- spring-boot-modules/spring-boot-data-2/README.md | 2 +- .../com/baeldung/propertyeditor/PropertyEditorApplication.java | 0 .../baeldung/propertyeditor/PropertyEditorRestController.java | 0 .../java/com/baeldung/propertyeditor/creditcard/CreditCard.java | 0 .../baeldung/propertyeditor/creditcard/CreditCardEditor.java | 0 .../exotictype/editor/CustomExoticTypeEditor.java | 0 .../baeldung/propertyeditor/exotictype/model/ExoticType.java | 0 .../propertyeditor/creditcard/CreditCardEditorUnitTest.java | 0 spring-boot-modules/spring-boot-data/README.md | 1 - 9 files changed, 1 insertion(+), 2 deletions(-) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/propertyeditor/PropertyEditorApplication.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/propertyeditor/PropertyEditorRestController.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCard.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCardEditor.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/propertyeditor/exotictype/editor/CustomExoticTypeEditor.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/propertyeditor/exotictype/model/ExoticType.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/test/java/com/baeldung/propertyeditor/creditcard/CreditCardEditorUnitTest.java (100%) diff --git a/spring-boot-modules/spring-boot-data-2/README.md b/spring-boot-modules/spring-boot-data-2/README.md index 8e6619dce4..b8f0347453 100644 --- a/spring-boot-modules/spring-boot-data-2/README.md +++ b/spring-boot-modules/spring-boot-data-2/README.md @@ -6,4 +6,4 @@ - [Using JaVers for Data Model Auditing in Spring Data](https://www.baeldung.com/spring-data-javers-audit) - [BootstrapMode for JPA Repositories](https://www.baeldung.com/jpa-bootstrap-mode) - [Dynamic DTO Validation Config Retrieved from the Database](https://www.baeldung.com/spring-dynamic-dto-validation) - +- [Spring Custom Property Editor](https://www.baeldung.com/spring-mvc-custom-property-editor) diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/PropertyEditorApplication.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/PropertyEditorApplication.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/PropertyEditorApplication.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/PropertyEditorApplication.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/PropertyEditorRestController.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/PropertyEditorRestController.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/PropertyEditorRestController.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/PropertyEditorRestController.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCard.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCard.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCard.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCard.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCardEditor.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCardEditor.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCardEditor.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCardEditor.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/exotictype/editor/CustomExoticTypeEditor.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/exotictype/editor/CustomExoticTypeEditor.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/exotictype/editor/CustomExoticTypeEditor.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/exotictype/editor/CustomExoticTypeEditor.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/exotictype/model/ExoticType.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/exotictype/model/ExoticType.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/exotictype/model/ExoticType.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/exotictype/model/ExoticType.java diff --git a/spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/propertyeditor/creditcard/CreditCardEditorUnitTest.java b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/propertyeditor/creditcard/CreditCardEditorUnitTest.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/propertyeditor/creditcard/CreditCardEditorUnitTest.java rename to spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/propertyeditor/creditcard/CreditCardEditorUnitTest.java diff --git a/spring-boot-modules/spring-boot-data/README.md b/spring-boot-modules/spring-boot-data/README.md index aa745b77a2..49a6eedbed 100644 --- a/spring-boot-modules/spring-boot-data/README.md +++ b/spring-boot-modules/spring-boot-data/README.md @@ -8,7 +8,6 @@ This module contains articles about Spring Boot with Spring Data - [Rendering Exceptions in JSON with Spring](https://www.baeldung.com/spring-exceptions-json) - [Disable Spring Data Auto Configuration](https://www.baeldung.com/spring-data-disable-auto-config) - [Repositories with Multiple Spring Data Modules](https://www.baeldung.com/spring-multiple-data-modules) -- [Spring Custom Property Editor](https://www.baeldung.com/spring-mvc-custom-property-editor) - [Using @JsonComponent in Spring Boot](https://www.baeldung.com/spring-boot-jsoncomponent) - [Guide To Running Logic on Startup in Spring](https://www.baeldung.com/running-setup-logic-on-startup-in-spring) - [Spring Boot: Customize the Jackson ObjectMapper](https://www.baeldung.com/spring-boot-customize-jackson-objectmapper) From f624403a861b0bdb49fa18ead928c0b689ba92f0 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sat, 9 Dec 2023 21:15:35 +0200 Subject: [PATCH 191/294] [JAVA-28185] (#15367) * [JAVA-28185] Moved code for article(Introduction to HtmlUnit) to spring-mvc-java-2 * [JAVA-28185] Moved code for article(Upload and Display Excel Files with Spring MVC) to spring-mvc-java-2 * [JAVA-28185] Clean up * [JAVA-28185] --- .../spring-mvc-java-2/README.md | 2 + spring-web-modules/spring-mvc-java-2/pom.xml | 56 +++++++++++++++++++ .../com/baeldung/excel}/ExcelController.java | 19 ++++--- .../com/baeldung/excel/ExcelPOIHelper.java | 34 +++++------ .../main/java/com/baeldung/excel/MyCell.java | 0 .../java/com/baeldung/excel/WebConfig.java | 32 +++++++++++ .../htmlunit/HtmlUnitAndJUnitLiveTest.java | 0 .../htmlunit/HtmlUnitAndSpringLiveTest.java | 0 .../htmlunit/HtmlUnitWebScrapingLiveTest.java | 0 .../com/baeldung/htmlunit/TestConfig.java | 4 +- spring-web-modules/spring-mvc-java/README.md | 2 - spring-web-modules/spring-mvc-java/pom.xml | 27 +-------- .../baeldung/spring/web/config/WebConfig.java | 6 -- 13 files changed, 121 insertions(+), 61 deletions(-) rename spring-web-modules/{spring-mvc-java/src/main/java/com/baeldung/web/controller => spring-mvc-java-2/src/main/java/com/baeldung/excel}/ExcelController.java (97%) rename spring-web-modules/{spring-mvc-java => spring-mvc-java-2}/src/main/java/com/baeldung/excel/ExcelPOIHelper.java (100%) rename spring-web-modules/{spring-mvc-java => spring-mvc-java-2}/src/main/java/com/baeldung/excel/MyCell.java (100%) create mode 100644 spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/WebConfig.java rename spring-web-modules/{spring-mvc-java => spring-mvc-java-2}/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitLiveTest.java (100%) rename spring-web-modules/{spring-mvc-java => spring-mvc-java-2}/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringLiveTest.java (100%) rename spring-web-modules/{spring-mvc-java => spring-mvc-java-2}/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScrapingLiveTest.java (100%) rename spring-web-modules/{spring-mvc-java => spring-mvc-java-2}/src/test/java/com/baeldung/htmlunit/TestConfig.java (99%) diff --git a/spring-web-modules/spring-mvc-java-2/README.md b/spring-web-modules/spring-mvc-java-2/README.md index 1f8231bada..61549b539a 100644 --- a/spring-web-modules/spring-mvc-java-2/README.md +++ b/spring-web-modules/spring-mvc-java-2/README.md @@ -5,3 +5,5 @@ - [A Quick Guide to Spring MVC Matrix Variables](https://www.baeldung.com/spring-mvc-matrix-variables) - [Converting a Spring MultipartFile to a File](https://www.baeldung.com/spring-multipartfile-to-file) - [Testing a Spring Multipart POST Request](https://www.baeldung.com/spring-multipart-post-request-test) +- [Introduction to HtmlUnit](https://www.baeldung.com/htmlunit) +- [Upload and Display Excel Files with Spring MVC](https://www.baeldung.com/spring-mvc-excel-files) diff --git a/spring-web-modules/spring-mvc-java-2/pom.xml b/spring-web-modules/spring-mvc-java-2/pom.xml index b1b5a797f8..a4484ed56d 100644 --- a/spring-web-modules/spring-mvc-java-2/pom.xml +++ b/spring-web-modules/spring-mvc-java-2/pom.xml @@ -46,6 +46,57 @@ commons-fileupload ${commons-fileupload.version} + + net.sourceforge.htmlunit + htmlunit + ${htmlunit.version} + + + commons-logging + commons-logging + + + commons-io + commons-io + + + + + + org.apache.poi + poi-ooxml + ${poi.version} + + + org.glassfish + javax.el + ${javax.el.version} + + + javax.servlet.jsp + javax.servlet.jsp-api + ${javax-servlet-api.version} + + + javax.servlet + jstl + + + org.apache.tomcat.embed + tomcat-embed-jasper + provided + + + + org.thymeleaf + thymeleaf-spring4 + ${thymeleaf.version} + + + org.thymeleaf + thymeleaf + ${thymeleaf.version} + @@ -63,6 +114,11 @@ 5.2.2.RELEASE 2.3.5 1.5 + 2.32 + 3.16-beta1 + 3.0.1-b09 + 2.3.3 + 3.0.9.RELEASE \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/web/controller/ExcelController.java b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/ExcelController.java similarity index 97% rename from spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/web/controller/ExcelController.java rename to spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/ExcelController.java index f76f7441a5..5cb5de7124 100644 --- a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/web/controller/ExcelController.java +++ b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/ExcelController.java @@ -1,18 +1,19 @@ -package com.baeldung.web.controller; +package com.baeldung.excel; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.multipart.MultipartFile; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import com.baeldung.excel.*; -import java.util.Map; -import java.util.List; -import javax.annotation.Resource; @Controller public class ExcelController { diff --git a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/excel/ExcelPOIHelper.java b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/ExcelPOIHelper.java similarity index 100% rename from spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/excel/ExcelPOIHelper.java rename to spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/ExcelPOIHelper.java index 0519a8f3c7..7a213d523b 100644 --- a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/excel/ExcelPOIHelper.java +++ b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/ExcelPOIHelper.java @@ -1,13 +1,14 @@ package com.baeldung.excel; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.xssf.usermodel.XSSFCell; -import org.apache.poi.xssf.usermodel.XSSFCellStyle; -import org.apache.poi.xssf.usermodel.XSSFColor; -import org.apache.poi.xssf.usermodel.XSSFFont; -import org.apache.poi.xssf.usermodel.XSSFRow; -import org.apache.poi.xssf.usermodel.XSSFSheet; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.IntStream; + import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; @@ -15,16 +16,15 @@ import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.Map; -import java.util.HashMap; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.IntStream; +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFCellStyle; +import org.apache.poi.xssf.usermodel.XSSFColor; +import org.apache.poi.xssf.usermodel.XSSFFont; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelPOIHelper { diff --git a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/excel/MyCell.java b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/MyCell.java similarity index 100% rename from spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/excel/MyCell.java rename to spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/MyCell.java diff --git a/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/WebConfig.java b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/WebConfig.java new file mode 100644 index 0000000000..f6a4d4dba3 --- /dev/null +++ b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/WebConfig.java @@ -0,0 +1,32 @@ +package com.baeldung.excel; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + + +@EnableWebMvc +@Configuration +@ComponentScan(basePackages = { "com.baeldung.excel" }) +public class WebConfig implements WebMvcConfigurer { + + @Override + public void addViewControllers(final ViewControllerRegistry registry) { + registry.addViewController("/").setViewName("index"); + } + + @Override + public void addResourceHandlers(final ResourceHandlerRegistry registry) { + registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); + } + + + @Bean + public ExcelPOIHelper excelPOIHelper() { + return new ExcelPOIHelper(); + } +} diff --git a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitLiveTest.java b/spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitLiveTest.java similarity index 100% rename from spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitLiveTest.java rename to spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitLiveTest.java diff --git a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringLiveTest.java b/spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringLiveTest.java similarity index 100% rename from spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringLiveTest.java rename to spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringLiveTest.java diff --git a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScrapingLiveTest.java b/spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScrapingLiveTest.java similarity index 100% rename from spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScrapingLiveTest.java rename to spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScrapingLiveTest.java diff --git a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/TestConfig.java b/spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/TestConfig.java similarity index 99% rename from spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/TestConfig.java rename to spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/TestConfig.java index 75efd57ae4..6e55f01454 100644 --- a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/TestConfig.java +++ b/spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/TestConfig.java @@ -20,7 +20,7 @@ public class TestConfig implements WebMvcConfigurer { @Autowired private ServletContext ctx; - + @Bean public ViewResolver thymeleafViewResolver() { final ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); @@ -44,4 +44,4 @@ public class TestConfig implements WebMvcConfigurer { templateEngine.setTemplateResolver(templateResolver()); return templateEngine; } -} +} \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-java/README.md b/spring-web-modules/spring-mvc-java/README.md index 656e415f6a..d89f33fdc1 100644 --- a/spring-web-modules/spring-mvc-java/README.md +++ b/spring-web-modules/spring-mvc-java/README.md @@ -9,8 +9,6 @@ The "REST With Spring" Classes: https://bit.ly/restwithspring ### Relevant Articles: - [Integration Testing in Spring](https://www.baeldung.com/integration-testing-in-spring) - [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) - [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-web-modules/spring-mvc-java/pom.xml b/spring-web-modules/spring-mvc-java/pom.xml index 395b12a278..d4c8f24431 100644 --- a/spring-web-modules/spring-mvc-java/pom.xml +++ b/spring-web-modules/spring-mvc-java/pom.xml @@ -44,21 +44,7 @@ provided - - net.sourceforge.htmlunit - htmlunit - ${htmlunit.version} - - - commons-logging - commons-logging - - - commons-io - commons-io - - - + commons-io commons-io @@ -91,12 +77,7 @@ spring-boot-starter-test test - - - org.apache.poi - poi-ooxml - ${poi.version} - + org.hibernate.validator @@ -221,19 +202,15 @@ 4.4.5 4.5.2 - 2.23 2.7 1.6.1 3.1.0 1.9.1 - - 3.16-beta1 3.0.1-b09 4.0.1 2.3.3 - 2.32 2.8.0 com.baeldung.SpringMVCApplication diff --git a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java b/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java index 768fda1c4a..c135164a95 100644 --- a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java +++ b/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java @@ -27,7 +27,6 @@ import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver; import org.thymeleaf.spring4.view.ThymeleafViewResolver; import org.thymeleaf.templateresolver.ITemplateResolver; -import com.baeldung.excel.ExcelPOIHelper; @EnableWebMvc @Configuration @@ -118,11 +117,6 @@ public class WebConfig implements WebMvcConfigurer { configurer.setUrlPathHelper(urlPathHelper); } - @Bean - public ExcelPOIHelper excelPOIHelper() { - return new ExcelPOIHelper(); - } - @Bean(name = "multipartResolver") public CommonsMultipartResolver multipartResolver() { CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); From 94ddcd153d6431d5aa4b3c84b97c9636f6a3219f Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Sun, 10 Dec 2023 19:40:01 +0200 Subject: [PATCH 192/294] baeldung-articles : BAEL-6892 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Commit to adding two mеthods to convert OutputStream to a byte array. --- .../OutputStreamtoByteArrayUnitTest.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java new file mode 100644 index 0000000000..2e46a5c571 --- /dev/null +++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java @@ -0,0 +1,56 @@ +package com.baeldung.outputstreamtobytearray; + +import org.apache.commons.io.FileUtils; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.io.*; + +public class OutputStreamtoByteArrayUnitTest { + + @Test + public void givenFileOutputStream_whenUsingFileUtilsToReadTheFile_thenReturnByteArray() throws IOException { + String data = "Welcome to Baeldung!"; + String filePath = "file.txt"; + + try (FileOutputStream outputStream = new FileOutputStream(filePath)) { + outputStream.write(data.getBytes()); + } + + byte[] byteArray = FileUtils.readFileToByteArray(new File(filePath)); + String result = new String(byteArray); + + Assertions.assertEquals(data, result); + } + + + @Test + public void givenFileOutputStream_whenUsingDrainableOutputStream_thenReturnByteArray() throws IOException { + String data = "Welcome to Baeldung!"; + String filePath = "file.txt"; + DrainableOutputStream drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath)); + drainableOutputStream.write(data.getBytes()); + byte[] intercepted = drainableOutputStream.toByteArray(); + String result = new String(intercepted); + Assertions.assertEquals(data, result); + } + + public class DrainableOutputStream extends FilterOutputStream { + private final ByteArrayOutputStream buffer; + + public DrainableOutputStream(OutputStream out) { + super(out); + this.buffer = new ByteArrayOutputStream(); + } + + @Override + public void write(byte b[]) throws IOException { + this.buffer.write(b); + super.write(b); + } + + public byte[] toByteArray() { + return this.buffer.toByteArray(); + } + } +} From 2dba12e694d8e84872b6a1796f953ea40cd6cbad Mon Sep 17 00:00:00 2001 From: mikr Date: Sun, 10 Dec 2023 18:58:04 +0100 Subject: [PATCH 193/294] Update readme --- core-java-modules/core-java-lang-6/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-6/README.md b/core-java-modules/core-java-lang-6/README.md index 91c0e5212c..a49564a16a 100644 --- a/core-java-modules/core-java-lang-6/README.md +++ b/core-java-modules/core-java-lang-6/README.md @@ -9,3 +9,4 @@ This module contains articles about core features in the Java language - [Get a Random Element From a Set in Java](https://www.baeldung.com/java-set-draw-sample) - [Stop Executing Further Code in Java](https://www.baeldung.com/java-stop-running-code) - [Using the Apache Commons Lang 3 for Comparing Objects in Java](https://www.baeldung.com/java-apache-commons-lang-3-compare-objects) +- [Static Final Variables in Java](https://www.baeldung.com/java-static-final-variables) From b56eaf9b1b3d2fadead390b2e34f4ec55b1afb53 Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Sun, 10 Dec 2023 20:53:59 +0200 Subject: [PATCH 194/294] Update OutputStreamtoByteArrayUnitTest.java --- .../OutputStreamtoByteArrayUnitTest.java | 46 ++++++++++++------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java index 2e46a5c571..9cbca1ed24 100644 --- a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java +++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java @@ -1,26 +1,30 @@ package com.baeldung.outputstreamtobytearray; -import org.apache.commons.io.FileUtils; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import static org.junit.Assert.assertEquals; public class OutputStreamtoByteArrayUnitTest { @Test - public void givenFileOutputStream_whenUsingFileUtilsToReadTheFile_thenReturnByteArray() throws IOException { + public void givenFileOutputStream_whenUsingFileUtilsToReadTheFile_thenReturnByteArray(@TempDir Path tempDir) throws IOException { String data = "Welcome to Baeldung!"; - String filePath = "file.txt"; + String fileName = "file.txt"; + Path filePath = tempDir.resolve(fileName); - try (FileOutputStream outputStream = new FileOutputStream(filePath)) { - outputStream.write(data.getBytes()); + try (DrainableOutputStream drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath.toFile()))) { + drainableOutputStream.write(data.getBytes()); } - byte[] byteArray = FileUtils.readFileToByteArray(new File(filePath)); - String result = new String(byteArray); - - Assertions.assertEquals(data, result); + byte[] intercepted = Files.readAllBytes(filePath); + String result = new String(intercepted); + assertEquals(data, result); } @@ -28,11 +32,21 @@ public class OutputStreamtoByteArrayUnitTest { public void givenFileOutputStream_whenUsingDrainableOutputStream_thenReturnByteArray() throws IOException { String data = "Welcome to Baeldung!"; String filePath = "file.txt"; - DrainableOutputStream drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath)); - drainableOutputStream.write(data.getBytes()); - byte[] intercepted = drainableOutputStream.toByteArray(); + + DrainableOutputStream drainableOutputStream = null; + + try { + drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath)); + drainableOutputStream.write(data.getBytes()); + } finally { + if (drainableOutputStream != null) { + drainableOutputStream.close(); + } + } + + byte[] intercepted = Files.readAllBytes(Paths.get(filePath)); String result = new String(intercepted); - Assertions.assertEquals(data, result); + assertEquals(data, result); } public class DrainableOutputStream extends FilterOutputStream { @@ -45,12 +59,12 @@ public class OutputStreamtoByteArrayUnitTest { @Override public void write(byte b[]) throws IOException { - this.buffer.write(b); + buffer.write(b); super.write(b); } public byte[] toByteArray() { - return this.buffer.toByteArray(); + return buffer.toByteArray(); } } } From f7205747ffb02543978a778beff21b3cf7ffd016 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Sun, 10 Dec 2023 22:39:11 +0100 Subject: [PATCH 195/294] JAVA-26712 | jjwt update (#15344) * JAVA-26712 | jjwt update * removed unused related article * JAVA-26712 | fix --- jhipster-modules/README.md | 6 ++-- .../jhipster-microservice/car-app/pom.xml | 4 +-- .../car/app/security/jwt/TokenProvider.java | 4 +-- .../jhipster-microservice/dealer-app/pom.xml | 4 +-- .../app/security/jwt/TokenProvider.java | 4 +-- .../jhipster-microservice/gateway-app/pom.xml | 4 +-- .../gateway/security/jwt/TokenProvider.java | 4 +-- jhipster-modules/jhipster-monolithic/pom.xml | 4 +-- .../baeldung/security/jwt/TokenProvider.java | 4 +-- persistence-modules/spring-jpa-2/pom.xml | 4 +-- .../security/AuthenticationService.java | 8 +++-- security-modules/jjwt/pom.xml | 14 ++++++-- .../jjwtfun/config/WebSecurityConfig.java | 2 +- .../controller/DynamicJWTController.java | 4 +-- .../jjwtfun/controller/SecretsController.java | 3 +- .../controller/StaticJWTController.java | 4 +-- .../jjwtfun/service/SecretService.java | 34 +++++++++++-------- .../jjwtfun/util/JWTDecoderUtil.java | 33 ++++++++---------- .../jjwtfun/util/JWTDecoderUtilUnitTest.java | 10 +++--- 19 files changed, 82 insertions(+), 72 deletions(-) diff --git a/jhipster-modules/README.md b/jhipster-modules/README.md index 11c3d5397f..2aae8a5697 100644 --- a/jhipster-modules/README.md +++ b/jhipster-modules/README.md @@ -1,7 +1,5 @@ ## JHipster -This module contains articles about JHipster. - -### Relevant articles: - +This module contains articles about JHipster. +Relevant articles are listed in the nested module folders. diff --git a/jhipster-modules/jhipster-microservice/car-app/pom.xml b/jhipster-modules/jhipster-microservice/car-app/pom.xml index 87c289cb46..069a1f6848 100644 --- a/jhipster-modules/jhipster-microservice/car-app/pom.xml +++ b/jhipster-modules/jhipster-microservice/car-app/pom.xml @@ -29,7 +29,7 @@ 3.21.0-GA 1.0.0 1.1.0 - 0.7.0 + 0.12.3 1.0.0 3.6 2.0.0 @@ -216,7 +216,7 @@ io.jsonwebtoken - jjwt + jjwt-api ${jjwt.version} diff --git a/jhipster-modules/jhipster-microservice/car-app/src/main/java/com/car/app/security/jwt/TokenProvider.java b/jhipster-modules/jhipster-microservice/car-app/src/main/java/com/car/app/security/jwt/TokenProvider.java index 3908bfa8f3..028f34e3f0 100644 --- a/jhipster-modules/jhipster-microservice/car-app/src/main/java/com/car/app/security/jwt/TokenProvider.java +++ b/jhipster-modules/jhipster-microservice/car-app/src/main/java/com/car/app/security/jwt/TokenProvider.java @@ -70,7 +70,7 @@ public class TokenProvider { public Authentication getAuthentication(String token) { Claims claims = Jwts.parser() - .setSigningKey(secretKey) + .setSigningKey(secretKey).build() .parseClaimsJws(token) .getBody(); @@ -86,7 +86,7 @@ public class TokenProvider { public boolean validateToken(String authToken) { try { - Jwts.parser().setSigningKey(secretKey).parseClaimsJws(authToken); + Jwts.parser().setSigningKey(secretKey).build().parseClaimsJws(authToken); return true; } catch (SignatureException e) { log.info("Invalid JWT signature."); diff --git a/jhipster-modules/jhipster-microservice/dealer-app/pom.xml b/jhipster-modules/jhipster-microservice/dealer-app/pom.xml index f660463026..43f9b046c7 100644 --- a/jhipster-modules/jhipster-microservice/dealer-app/pom.xml +++ b/jhipster-modules/jhipster-microservice/dealer-app/pom.xml @@ -28,7 +28,7 @@ 3.21.0-GA 1.0.0 1.1.0 - 0.7.0 + 0.12.3 1.0.0 3.6 2.0.0 @@ -215,7 +215,7 @@ io.jsonwebtoken - jjwt + jjwt-api ${jjwt.version} diff --git a/jhipster-modules/jhipster-microservice/dealer-app/src/main/java/com/dealer/app/security/jwt/TokenProvider.java b/jhipster-modules/jhipster-microservice/dealer-app/src/main/java/com/dealer/app/security/jwt/TokenProvider.java index 47a5bf75af..38cee99e01 100644 --- a/jhipster-modules/jhipster-microservice/dealer-app/src/main/java/com/dealer/app/security/jwt/TokenProvider.java +++ b/jhipster-modules/jhipster-microservice/dealer-app/src/main/java/com/dealer/app/security/jwt/TokenProvider.java @@ -70,7 +70,7 @@ public class TokenProvider { public Authentication getAuthentication(String token) { Claims claims = Jwts.parser() - .setSigningKey(secretKey) + .setSigningKey(secretKey).build() .parseClaimsJws(token) .getBody(); @@ -86,7 +86,7 @@ public class TokenProvider { public boolean validateToken(String authToken) { try { - Jwts.parser().setSigningKey(secretKey).parseClaimsJws(authToken); + Jwts.parser().setSigningKey(secretKey).build().parseClaimsJws(authToken); return true; } catch (SignatureException e) { log.info("Invalid JWT signature."); diff --git a/jhipster-modules/jhipster-microservice/gateway-app/pom.xml b/jhipster-modules/jhipster-microservice/gateway-app/pom.xml index 7c95704da7..90d703b8c7 100644 --- a/jhipster-modules/jhipster-microservice/gateway-app/pom.xml +++ b/jhipster-modules/jhipster-microservice/gateway-app/pom.xml @@ -31,7 +31,7 @@ 3.21.0-GA 1.0.0 1.1.0 - 0.7.0 + 0.12.3 1.0.0 3.6 2.0.0 @@ -243,7 +243,7 @@ io.jsonwebtoken - jjwt + jjwt-api ${jjwt.version} diff --git a/jhipster-modules/jhipster-microservice/gateway-app/src/main/java/com/gateway/security/jwt/TokenProvider.java b/jhipster-modules/jhipster-microservice/gateway-app/src/main/java/com/gateway/security/jwt/TokenProvider.java index 5ffb55f33e..14d343c0d7 100644 --- a/jhipster-modules/jhipster-microservice/gateway-app/src/main/java/com/gateway/security/jwt/TokenProvider.java +++ b/jhipster-modules/jhipster-microservice/gateway-app/src/main/java/com/gateway/security/jwt/TokenProvider.java @@ -70,7 +70,7 @@ public class TokenProvider { public Authentication getAuthentication(String token) { Claims claims = Jwts.parser() - .setSigningKey(secretKey) + .setSigningKey(secretKey).build() .parseClaimsJws(token) .getBody(); @@ -86,7 +86,7 @@ public class TokenProvider { public boolean validateToken(String authToken) { try { - Jwts.parser().setSigningKey(secretKey).parseClaimsJws(authToken); + Jwts.parser().setSigningKey(secretKey).build().parseClaimsJws(authToken); return true; } catch (SignatureException e) { log.info("Invalid JWT signature."); diff --git a/jhipster-modules/jhipster-monolithic/pom.xml b/jhipster-modules/jhipster-monolithic/pom.xml index bb82c819c4..f1ee479756 100644 --- a/jhipster-modules/jhipster-monolithic/pom.xml +++ b/jhipster-modules/jhipster-monolithic/pom.xml @@ -122,7 +122,7 @@ io.jsonwebtoken - jjwt + jjwt-api ${jjwt.version} @@ -897,7 +897,7 @@ 3.21.0-GA 1.0.0 1.1.0 - 0.7.0 + 0.12.3 1.1.3 3.6 2.0.0 diff --git a/jhipster-modules/jhipster-monolithic/src/main/java/com/baeldung/security/jwt/TokenProvider.java b/jhipster-modules/jhipster-monolithic/src/main/java/com/baeldung/security/jwt/TokenProvider.java index 3ba4d7c793..095663065b 100644 --- a/jhipster-modules/jhipster-monolithic/src/main/java/com/baeldung/security/jwt/TokenProvider.java +++ b/jhipster-modules/jhipster-monolithic/src/main/java/com/baeldung/security/jwt/TokenProvider.java @@ -70,7 +70,7 @@ public class TokenProvider { public Authentication getAuthentication(String token) { Claims claims = Jwts.parser() - .setSigningKey(secretKey) + .setSigningKey(secretKey).build() .parseClaimsJws(token) .getBody(); @@ -86,7 +86,7 @@ public class TokenProvider { public boolean validateToken(String authToken) { try { - Jwts.parser().setSigningKey(secretKey).parseClaimsJws(authToken); + Jwts.parser().setSigningKey(secretKey).build().parseClaimsJws(authToken); return true; } catch (SignatureException e) { log.info("Invalid JWT signature."); diff --git a/persistence-modules/spring-jpa-2/pom.xml b/persistence-modules/spring-jpa-2/pom.xml index 9abf888fb2..c20c43912b 100644 --- a/persistence-modules/spring-jpa-2/pom.xml +++ b/persistence-modules/spring-jpa-2/pom.xml @@ -54,8 +54,8 @@ io.jsonwebtoken - jjwt - 0.9.1 + jjwt-api + 0.12.3 diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/AuthenticationService.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/AuthenticationService.java index 00db7eebc4..42eab1d6de 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/AuthenticationService.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/AuthenticationService.java @@ -30,7 +30,7 @@ public class AuthenticationService { if (token != null) { String user = Jwts.parser() .setSigningKey(SIGNINGKEY) - .parseClaimsJws(token.replace(PREFIX, "")) + .build().parseClaimsJws(token.replace(PREFIX, "")) .getBody() .getSubject(); if (user != null) { @@ -48,9 +48,11 @@ public class AuthenticationService { } String tenant = Jwts.parser() .setSigningKey(SIGNINGKEY) - .parseClaimsJws(token.replace(PREFIX, "")) + .build().parseClaimsJws(token.replace(PREFIX, "")) .getBody() - .getAudience(); + .getAudience() + .iterator() + .next(); return tenant; } } diff --git a/security-modules/jjwt/pom.xml b/security-modules/jjwt/pom.xml index 3ea4a46b8a..3693eaf9c4 100644 --- a/security-modules/jjwt/pom.xml +++ b/security-modules/jjwt/pom.xml @@ -35,13 +35,23 @@ io.jsonwebtoken - jjwt + jjwt-api + ${jjwt.version} + + + io.jsonwebtoken + jjwt-impl + ${jjwt.version} + + + io.jsonwebtoken + jjwt-jackson ${jjwt.version} - 0.7.0 + 0.12.3 \ No newline at end of file diff --git a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/config/WebSecurityConfig.java b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/config/WebSecurityConfig.java index e453f33d5e..c0f176034e 100644 --- a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/config/WebSecurityConfig.java +++ b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/config/WebSecurityConfig.java @@ -66,7 +66,7 @@ public class WebSecurityConfig { // CsrfFilter already made sure the token matched. Here, we'll make sure it's not expired try { Jwts.parser() - .setSigningKeyResolver(secretService.getSigningKeyResolver()) + .setSigningKeyResolver(secretService.getSigningKeyResolver()).build() .parseClaimsJws(token.getToken()); } catch (JwtException e) { // most likely an ExpiredJwtException, but this will handle any diff --git a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/DynamicJWTController.java b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/DynamicJWTController.java index 3d157827d1..1c29a753b6 100644 --- a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/DynamicJWTController.java +++ b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/DynamicJWTController.java @@ -4,7 +4,7 @@ import io.jsonwebtoken.JwtBuilder; import io.jsonwebtoken.JwtException; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; -import io.jsonwebtoken.impl.compression.CompressionCodecs; +import io.jsonwebtoken.impl.compression.DeflateCompressionAlgorithm; import io.jsonwebtoken.jjwtfun.model.JwtResponse; import io.jsonwebtoken.jjwtfun.service.SecretService; import org.springframework.beans.factory.annotation.Autowired; @@ -38,7 +38,7 @@ public class DynamicJWTController extends BaseController { public JwtResponse dynamicBuildercompress(@RequestBody Map claims) throws UnsupportedEncodingException { String jws = Jwts.builder() .setClaims(claims) - .compressWith(CompressionCodecs.DEFLATE) + .compressWith(new DeflateCompressionAlgorithm()) .signWith(SignatureAlgorithm.HS256, secretService.getHS256SecretBytes()) .compact(); return new JwtResponse(jws); diff --git a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/SecretsController.java b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/SecretsController.java index 1ca0973c33..4975385398 100644 --- a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/SecretsController.java +++ b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/SecretsController.java @@ -6,6 +6,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.security.NoSuchAlgorithmException; import java.util.Map; import static org.springframework.web.bind.annotation.RequestMethod.GET; @@ -23,7 +24,7 @@ public class SecretsController extends BaseController { } @RequestMapping(value = "/refresh-secrets", method = GET) - public Map refreshSecrets() { + public Map refreshSecrets() throws NoSuchAlgorithmException { return secretService.refreshSecrets(); } diff --git a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/StaticJWTController.java b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/StaticJWTController.java index efafa4b1b7..4ff71a620e 100644 --- a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/StaticJWTController.java +++ b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/StaticJWTController.java @@ -42,7 +42,7 @@ public class StaticJWTController extends BaseController { public JwtResponse parser(@RequestParam String jwt) throws UnsupportedEncodingException { Jws jws = Jwts.parser() - .setSigningKeyResolver(secretService.getSigningKeyResolver()) + .setSigningKeyResolver(secretService.getSigningKeyResolver()).build() .parseClaimsJws(jwt); return new JwtResponse(jws); @@ -53,7 +53,7 @@ public class StaticJWTController extends BaseController { Jws jws = Jwts.parser() .requireIssuer("Stormpath") .require("hasMotorcycle", true) - .setSigningKeyResolver(secretService.getSigningKeyResolver()) + .setSigningKeyResolver(secretService.getSigningKeyResolver()).build() .parseClaimsJws(jwt); return new JwtResponse(jws); diff --git a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/service/SecretService.java b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/service/SecretService.java index 4426a4b9b0..958d6fb48f 100644 --- a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/service/SecretService.java +++ b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/service/SecretService.java @@ -6,12 +6,14 @@ import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.SigningKeyResolver; import io.jsonwebtoken.SigningKeyResolverAdapter; import io.jsonwebtoken.impl.TextCodec; -import io.jsonwebtoken.impl.crypto.MacProvider; import io.jsonwebtoken.lang.Assert; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; +import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; + +import java.security.NoSuchAlgorithmException; import java.util.HashMap; import java.util.Map; @@ -28,7 +30,7 @@ public class SecretService { }; @PostConstruct - public void setup() { + public void setup() throws NoSuchAlgorithmException { refreshSecrets(); } @@ -42,32 +44,34 @@ public class SecretService { public void setSecrets(Map secrets) { Assert.notNull(secrets); - Assert.hasText(secrets.get(SignatureAlgorithm.HS256.getValue())); - Assert.hasText(secrets.get(SignatureAlgorithm.HS384.getValue())); - Assert.hasText(secrets.get(SignatureAlgorithm.HS512.getValue())); + Assert.hasText(secrets.get(SignatureAlgorithm.HS256.getJcaName())); + Assert.hasText(secrets.get(SignatureAlgorithm.HS384.getJcaName())); + Assert.hasText(secrets.get(SignatureAlgorithm.HS512.getJcaName())); this.secrets = secrets; } public byte[] getHS256SecretBytes() { - return TextCodec.BASE64.decode(secrets.get(SignatureAlgorithm.HS256.getValue())); + return TextCodec.BASE64.decode(secrets.get(SignatureAlgorithm.HS256.getJcaName())); } public byte[] getHS384SecretBytes() { - return TextCodec.BASE64.decode(secrets.get(SignatureAlgorithm.HS384.getValue())); + return TextCodec.BASE64.decode(secrets.get(SignatureAlgorithm.HS384.getJcaName())); } public byte[] getHS512SecretBytes() { - return TextCodec.BASE64.decode(secrets.get(SignatureAlgorithm.HS512.getValue())); + return TextCodec.BASE64.decode(secrets.get(SignatureAlgorithm.HS512.getJcaName())); } - public Map refreshSecrets() { - SecretKey key = MacProvider.generateKey(SignatureAlgorithm.HS256); - secrets.put(SignatureAlgorithm.HS256.getValue(), TextCodec.BASE64.encode(key.getEncoded())); - key = MacProvider.generateKey(SignatureAlgorithm.HS384); - secrets.put(SignatureAlgorithm.HS384.getValue(), TextCodec.BASE64.encode(key.getEncoded())); - key = MacProvider.generateKey(SignatureAlgorithm.HS512); - secrets.put(SignatureAlgorithm.HS512.getValue(), TextCodec.BASE64.encode(key.getEncoded())); + public Map refreshSecrets() throws NoSuchAlgorithmException { + SecretKey key = KeyGenerator.getInstance(SignatureAlgorithm.HS256.getJcaName()).generateKey(); + secrets.put(SignatureAlgorithm.HS256.getJcaName(), TextCodec.BASE64.encode(key.getEncoded())); + + key = KeyGenerator.getInstance(SignatureAlgorithm.HS384.getJcaName()).generateKey(); + secrets.put(SignatureAlgorithm.HS384.getJcaName(), TextCodec.BASE64.encode(key.getEncoded())); + + key = KeyGenerator.getInstance(SignatureAlgorithm.HS512.getJcaName()).generateKey(); + secrets.put(SignatureAlgorithm.HS512.getJcaName(), TextCodec.BASE64.encode(key.getEncoded())); return secrets; } } diff --git a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtil.java b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtil.java index 0fbf7637dd..2fc97b0b51 100644 --- a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtil.java +++ b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtil.java @@ -1,12 +1,14 @@ package io.jsonwebtoken.jjwtfun.util; +import io.jsonwebtoken.Jwt; +import io.jsonwebtoken.JwtParser; +import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; -import io.jsonwebtoken.impl.crypto.DefaultJwtSignatureValidator; import javax.crypto.spec.SecretKeySpec; + import java.util.Base64; -import static io.jsonwebtoken.SignatureAlgorithm.HS256; public class JWTDecoderUtil { @@ -21,26 +23,19 @@ public class JWTDecoderUtil { return header + " " + payload; } - public static String decodeJWTToken(String token, String secretKey) throws Exception { - Base64.Decoder decoder = Base64.getUrlDecoder(); + public static boolean isTokenValid(String token, String secretKey) throws Exception { + SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), SignatureAlgorithm.HS256.getJcaName()); - String[] chunks = token.split("\\."); + JwtParser jwtParser = Jwts.parser() + .verifyWith(secretKeySpec) + .build(); - String header = new String(decoder.decode(chunks[0])); - String payload = new String(decoder.decode(chunks[1])); - - String tokenWithoutSignature = chunks[0] + "." + chunks[1]; - String signature = chunks[2]; - - SignatureAlgorithm sa = HS256; - SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), sa.getJcaName()); - - DefaultJwtSignatureValidator validator = new DefaultJwtSignatureValidator(sa, secretKeySpec); - - if (!validator.isValid(tokenWithoutSignature, signature)) { - throw new Exception("Could not verify JWT token integrity!"); + try { + jwtParser.parse(token); + } catch (Exception e) { + throw new Exception("Could not verify JWT token integrity!", e); } - return header + " " + payload; + return true; } } diff --git a/security-modules/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtilUnitTest.java b/security-modules/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtilUnitTest.java index 3103a6c8a3..4cdfdc59ba 100644 --- a/security-modules/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtilUnitTest.java +++ b/security-modules/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtilUnitTest.java @@ -1,16 +1,16 @@ package io.jsonwebtoken.jjwtfun.util; import io.jsonwebtoken.SignatureAlgorithm; -import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertTrue; class JWTDecoderUtilUnitTest { private final static String SIMPLE_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkJhZWxkdW5nIFVzZXIiLCJpYXQiOjE1MTYyMzkwMjJ9"; - private final static String SIGNED_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkJhZWxkdW5nIFVzZXIiLCJpYXQiOjE1MTYyMzkwMjJ9.qH7Zj_m3kY69kxhaQXTa-ivIpytKXXjZc1ZSmapZnGE"; + private final static String SIGNED_TOKEN = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkJhZWxkdW5nIFVzZXIiLCJpYXQiOjE1MTYyMzkwMjJ9.6h_QYBTbyKxfMq3TGiAhVI416rctV0c0SpzWxVm-0-Y"; @Test void givenSimpleToken_whenDecoding_thenStringOfHeaderPayloadAreReturned() { @@ -20,13 +20,13 @@ class JWTDecoderUtilUnitTest { @Test void givenSignedToken_whenDecodingWithInvalidSecret_thenIntegrityIsNotValidated() { - assertThatThrownBy(() -> JWTDecoderUtil.decodeJWTToken(SIGNED_TOKEN, "BAD_SECRET")) + assertThatThrownBy(() -> JWTDecoderUtil. + isTokenValid(SIGNED_TOKEN, "BAD_SECRET")) .hasMessage("Could not verify JWT token integrity!"); } @Test void givenSignedToken_whenDecodingWithValidSecret_thenIntegrityIsValidated() throws Exception { - assertThat(JWTDecoderUtil.decodeJWTToken(SIGNED_TOKEN, "MySecretKey")) - .contains("Baeldung User"); + assertTrue(JWTDecoderUtil.isTokenValid(SIGNED_TOKEN, "randomSecretWithSome!!CharacterS!")); } } From d1661c2bc723d05b272c37b80be4e1acc721cbc0 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Sun, 10 Dec 2023 23:41:16 +0200 Subject: [PATCH 196/294] JAVA-28506 Cleanup un-committed or un-ignored artifacts - Week 49 - 2023 (#15382) Co-authored-by: timis1 --- .../target/classes/org/example/Main.class | Bin 2912 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 core-java-modules/core-java-swing/target/classes/org/example/Main.class diff --git a/core-java-modules/core-java-swing/target/classes/org/example/Main.class b/core-java-modules/core-java-swing/target/classes/org/example/Main.class deleted file mode 100644 index 5914458bc4b1b959f8d4cc18270605acd2f4249e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2912 zcmai0+jA3D82@dXWYe$+6hSHlQxI)RN(2FwVzrb614)at7F#cMn{JbZBpY`(wDo?! z-|yi4ikBH@d`ZEMjx#GmpU?u?9t5JZcLkcMSa+_JMV zV@5BO@ETC z^;yGBSs6XQBsbg{N&T08k8rkH!^K$Rnd&>Cn|XaAZzQauo6rkpes(}F7>1Uj3x)`j1X?Yh>D{cZWZV7L}V80BFqa(sti0-Ol zp>8~3Gq*uZFv$M0<64EVIA=KSO{5UU(IFm&hAGh3I>&JL8&i5Y@Al^{#~3ULATkvM zO=mJf4`%JSGLw00I;GEAWdb6HW??C>p#X}v(2~dEz-c&vx0lw7OpDzkES4^eIi*h+ z`5=gX|8V@)VGc?Q9YK@{La!miUMmSGO^XRI!;~&D0g?<@=-#8@UfjoqU`YRl1`dk{ zs{VEa@eo5=G=t>S5yyK(!=reNEu~LRa=0`cY@sv_qj+IcC_ka$NpUIoN_ytF*mzpQ zGkBIzVPqqwV{#sgM2|&A`0BSNxmuAji^f2?Fk#rkVqP;cc@2!{wkg)tO`n@H*%#zp zaNqRMQbFE3YZuMsYJW*jx}Bx&>c+8MWm7pZI4~^2Sk(Wt+LB5R4UZ>><7rN?#XV0g z!Q?gJ?bk<}P%~=X#V&3DalLUU({v!tF}vV#i7Ss%>-$FflBvFZsra~vaXitNPNqi3 z2l~=+wyl3kAfHo3npxZrR1Wa+GxFR2!I#*p^LKCnFV6OCsh08Z1!vpqt!s0ymqspM zTBPw_6=KVWT;d_Em#Vc44OwM7V~9JE`4S%u+eGrw!B2}Oev|;s-~kcf^Es|!d@FqW zyXK&LL!t@K^C{Rs2ruxdc>;J5FLBj^m+=aBgz^slg`DpU)CFDf(Id2)IZ+q%eRvhG zalb`;+j#m-QBnb#2%Ld-sH=k3GfY|VJG75B&-2l`aSq|3QJ_3Z}ns5rC zF0o1-J$?SC)6mjNw1VL?7@f!XXsbSlOgb8Nc-jHHQ-w%u3GvC}#=v4OP-Q+G49JMbnp;eA|zFK{KkMkmgq3qN8jenB_R zVH Date: Mon, 11 Dec 2023 00:49:27 +0200 Subject: [PATCH 197/294] [JAVA-28184] (#15366) * [JAVA-28184] Moved code for article(Custom Naming Convention with Spring Data JPA) to spring-data-jpa-enterprise-2 * [JAVA-28184] Moved code for article(Working with Lazy Element Collections in JPA) to spring-data-jpa-enterprise-2 --- .../spring-data-jpa-enterprise-2/README.md | 3 ++- .../ElementCollectionApplication.java | 0 .../elementcollection/model/Employee.java | 7 +++++- .../elementcollection/model/Phone.java | 3 ++- .../repository/EmployeeRepository.java | 12 ++++++---- .../com/baeldung/namingstrategy/Person.java | 1 - .../namingstrategy/PersonRepository.java | 0 .../QuotedLowerCaseNamingStrategy.java | 0 .../QuotedUpperCaseNamingStrategy.java | 0 ...ingDataJpaNamingConventionApplication.java | 0 .../UnquotedLowerCaseNamingStrategy.java | 0 .../UnquotedUpperCaseNamingStrategy.java | 0 .../ElementCollectionIntegrationTest.java | 15 ++++++------ ...erCaseNamingStrategyH2IntegrationTest.java | 23 +++++++++--------- ...werCaseNamingStrategyPostgresLiveTest.java | 23 +++++++++--------- ...erCaseNamingStrategyH2IntegrationTest.java | 23 +++++++++--------- ...perCaseNamingStrategyPostgresLiveTest.java | 23 +++++++++--------- ...ysicalNamingStrategyH2IntegrationTest.java | 23 +++++++++--------- ...hysicalNamingStrategyPostgresLiveTest.java | 23 +++++++++--------- ...erCaseNamingStrategyH2IntegrationTest.java | 24 +++++++++---------- ...werCaseNamingStrategyPostgresLiveTest.java | 23 +++++++++--------- ...erCaseNamingStrategyH2IntegrationTest.java | 23 +++++++++--------- ...perCaseNamingStrategyPostgresLiveTest.java | 23 +++++++++--------- ...ase-naming-strategy-on-postgres.properties | 0 ...oted-lower-case-naming-strategy.properties | 0 ...ase-naming-strategy-on-postgres.properties | 0 ...oted-upper-case-naming-strategy.properties | 0 ...cal-naming-strategy-on-postgres.properties | 0 ...spring-physical-naming-strategy.properties | 0 ...ase-naming-strategy-on-postgres.properties | 0 ...oted-lower-case-naming-strategy.properties | 0 ...ase-naming-strategy-on-postgres.properties | 0 ...oted-upper-case-naming-strategy.properties | 0 .../spring-data-jpa-enterprise/README.md | 2 -- 34 files changed, 145 insertions(+), 129 deletions(-) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/elementcollection/ElementCollectionApplication.java (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/elementcollection/model/Employee.java (87%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/elementcollection/model/Phone.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/namingstrategy/Person.java (94%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/namingstrategy/PersonRepository.java (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategy.java (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategy.java (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/namingstrategy/SpringDataJpaNamingConventionApplication.java (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategy.java (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategy.java (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java (98%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy-on-postgres.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy-on-postgres.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy-on-postgres.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy-on-postgres.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy-on-postgres.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy.properties (100%) diff --git a/persistence-modules/spring-data-jpa-enterprise-2/README.md b/persistence-modules/spring-data-jpa-enterprise-2/README.md index 8e154f6b75..0c1e9968bc 100644 --- a/persistence-modules/spring-data-jpa-enterprise-2/README.md +++ b/persistence-modules/spring-data-jpa-enterprise-2/README.md @@ -3,7 +3,8 @@ This module contains articles about Spring Data JPA used in enterprise applications such as transactions, sessions, naming conventions and more ### Relevant Articles: - +- [Custom Naming Convention with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-custom-naming) +- [Working with Lazy Element Collections in JPA](https://www.baeldung.com/java-jpa-lazy-collections) ### Eclipse Config diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/ElementCollectionApplication.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/ElementCollectionApplication.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/ElementCollectionApplication.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/ElementCollectionApplication.java diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/model/Employee.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/model/Employee.java similarity index 87% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/model/Employee.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/model/Employee.java index 8b98164d63..9bc0663016 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/model/Employee.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/model/Employee.java @@ -1,9 +1,14 @@ package com.baeldung.elementcollection.model; -import javax.persistence.*; import java.util.List; import java.util.Objects; +import javax.persistence.CollectionTable; +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.JoinColumn; + @Entity public class Employee { @Id diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/model/Phone.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/model/Phone.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/model/Phone.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/model/Phone.java index d73d30c47a..15d05aea98 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/model/Phone.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/model/Phone.java @@ -1,8 +1,9 @@ package com.baeldung.elementcollection.model; -import javax.persistence.Embeddable; import java.util.Objects; +import javax.persistence.Embeddable; + @Embeddable public class Phone { private String type; diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java index 49180c35eb..996cac7cd9 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java @@ -1,14 +1,16 @@ package com.baeldung.elementcollection.repository; -import com.baeldung.elementcollection.model.Employee; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; +import java.util.HashMap; +import java.util.Map; import javax.persistence.EntityGraph; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; -import java.util.HashMap; -import java.util.Map; + +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import com.baeldung.elementcollection.model.Employee; @Repository public class EmployeeRepository { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/Person.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/Person.java similarity index 94% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/Person.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/Person.java index cfb6e67c2c..35dd2dc226 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/Person.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/Person.java @@ -1,6 +1,5 @@ package com.baeldung.namingstrategy; -import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/PersonRepository.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/PersonRepository.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/PersonRepository.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/PersonRepository.java diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategy.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategy.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategy.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategy.java diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategy.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategy.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategy.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategy.java diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/SpringDataJpaNamingConventionApplication.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/SpringDataJpaNamingConventionApplication.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/SpringDataJpaNamingConventionApplication.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/SpringDataJpaNamingConventionApplication.java diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategy.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategy.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategy.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategy.java diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategy.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategy.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategy.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategy.java diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java index 306798aa68..ed2bb97252 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java @@ -1,8 +1,10 @@ package com.baeldung.elementcollection; -import com.baeldung.elementcollection.model.Employee; -import com.baeldung.elementcollection.model.Phone; -import com.baeldung.elementcollection.repository.EmployeeRepository; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; + +import java.util.Arrays; + import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -12,10 +14,9 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; -import java.util.Arrays; - -import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertThat; +import com.baeldung.elementcollection.model.Employee; +import com.baeldung.elementcollection.model.Phone; +import com.baeldung.elementcollection.repository.EmployeeRepository; @RunWith(SpringRunner.class) @SpringBootTest(classes = ElementCollectionApplication.class) diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java index 71a4dbda3f..b3225175ca 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("quoted-lower-case-naming-strategy.properties") class QuotedLowerCaseNamingStrategyH2IntegrationTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java index 6b1c984600..b21fdf9edd 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("quoted-lower-case-naming-strategy-on-postgres.properties") class QuotedLowerCaseNamingStrategyPostgresLiveTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java index f819327a5c..74f82f0d39 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("quoted-upper-case-naming-strategy.properties") class QuotedUpperCaseNamingStrategyH2IntegrationTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java index bd23b81b4b..6741b09366 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("quoted-upper-case-naming-strategy-on-postgres.properties") class QuotedUpperCaseNamingStrategyPostgresLiveTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java index 1850fea173..dbbccdd61d 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("spring-physical-naming-strategy.properties") class SpringPhysicalNamingStrategyH2IntegrationTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java index e26ebb148d..760dacdaa2 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("spring-physical-naming-strategy-on-postgres.properties") class SpringPhysicalNamingStrategyPostgresLiveTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java similarity index 98% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java index 6311c42e93..d0e86384b8 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,18 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.sql.SQLException; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("unquoted-lower-case-naming-strategy.properties") class UnquotedLowerCaseNamingStrategyH2IntegrationTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java index 033a213cf5..121b184a3c 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("unquoted-lower-case-naming-strategy-on-postgres.properties") class UnquotedLowerCaseNamingStrategyPostgresLiveTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java index 7af8001854..b4f25605bd 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("unquoted-upper-case-naming-strategy.properties") class UnquotedUpperCaseNamingStrategyH2IntegrationTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java index 0151e7ece4..7ecd4cc80e 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("unquoted-upper-case-naming-strategy-on-postgres.properties") class UnquotedUpperCaseNamingStrategyPostgresLiveTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy-on-postgres.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy-on-postgres.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy-on-postgres.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy-on-postgres.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy-on-postgres.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy-on-postgres.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy-on-postgres.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy-on-postgres.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy-on-postgres.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy-on-postgres.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy-on-postgres.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy-on-postgres.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy-on-postgres.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy-on-postgres.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy-on-postgres.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/README.md b/persistence-modules/spring-data-jpa-enterprise/README.md index b563fa46d4..c48a519a87 100644 --- a/persistence-modules/spring-data-jpa-enterprise/README.md +++ b/persistence-modules/spring-data-jpa-enterprise/README.md @@ -7,8 +7,6 @@ This module contains articles about Spring Data JPA used in enterprise applicati - [Spring Data Java 8 Support](https://www.baeldung.com/spring-data-java-8) - [DB Integration Tests with Spring Boot and Testcontainers](https://www.baeldung.com/spring-boot-testcontainers-integration-test) - [A Guide to Spring’s Open Session in View](https://www.baeldung.com/spring-open-session-in-view) -- [Working with Lazy Element Collections in JPA](https://www.baeldung.com/java-jpa-lazy-collections) -- [Custom Naming Convention with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-custom-naming) - [Partial Data Update With Spring Data](https://www.baeldung.com/spring-data-partial-update) - [Spring Data JPA @Modifying Annotation](https://www.baeldung.com/spring-data-jpa-modifying-annotation) - [Spring JPA – Multiple Databases](https://www.baeldung.com/spring-data-jpa-multiple-databases) From 62195e14d45b2d78424ac691b2eb482f1fde334b Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Mon, 11 Dec 2023 06:18:58 +0000 Subject: [PATCH 198/294] Failure Threshold Support for @RepeatedTest in Junit --- .../FailureThresholdUnitTest.java | 17 ++++++----------- .../junit5-annotations/test_file.txt | 1 - 2 files changed, 6 insertions(+), 12 deletions(-) delete mode 100644 testing-modules/junit5-annotations/test_file.txt diff --git a/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/failurethreshold/FailureThresholdUnitTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/failurethreshold/FailureThresholdUnitTest.java index 8f0043cf51..de7651ece6 100644 --- a/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/failurethreshold/FailureThresholdUnitTest.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/failurethreshold/FailureThresholdUnitTest.java @@ -1,21 +1,16 @@ package com.baeldung.junit5.failurethreshold; import org.junit.jupiter.api.RepeatedTest; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; +import java.util.Random; import static org.junit.jupiter.api.Assertions.assertTrue; class FailureThresholdUnitTest { + Random random = new Random(); - @RepeatedTest(value = 5, failureThreshold = 1) - void givenTextFile_whenItIsReadAndContainsSpecifiedWordRepeatedly_thenMatchingLinesFound() throws IOException { - String filePath = "test_file.txt"; - try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { - String line = reader.readLine(); - assertTrue(line.contains("The")); - } + @RepeatedTest(value = 10, failureThreshold = 2) + void givenRandomNumberGenerator_whenGeneratingRandomNumber_thenNumberShouldBeWithinRange() { + int number = random.nextInt(10); + assertTrue(number <= 9); } } diff --git a/testing-modules/junit5-annotations/test_file.txt b/testing-modules/junit5-annotations/test_file.txt deleted file mode 100644 index f29ab3685b..0000000000 --- a/testing-modules/junit5-annotations/test_file.txt +++ /dev/null @@ -1 +0,0 @@ -The Efficacy of meta-cognitive therapy on the symptoms of obsessive-compulsive disorder in patients with multiple sclerosis \ No newline at end of file From d8c3be530b8088598ea79756825c3556be75a9b5 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Mon, 11 Dec 2023 09:58:51 +0200 Subject: [PATCH 199/294] [JAVA-26730] Upgraded io.projectreactor to latest version (#15234) --- aws-modules/aws-reactive/pom.xml | 3 +++ core-java-modules/core-java-streams-4/pom.xml | 4 ++-- docker-modules/docker-containers/pom.xml | 9 ++++++++- .../k8s-admission-controller/pom.xml | 6 ++++++ kubernetes-modules/kubernetes-spring/pom.xml | 5 +++++ libraries-http-2/pom.xml | 2 +- patterns-modules/axon/pom.xml | 3 +++ .../spring-data-cassandra-reactive/pom.xml | 3 +++ .../spring-data-mongodb-reactive/pom.xml | 5 +++-- reactor-core/pom.xml | 5 +++-- .../spring-boot-3-url-matching/pom.xml | 4 ++-- .../spring-cloud-netflix-sidecar-demo/pom.xml | 4 ++++ spring-reactive-modules/pom.xml | 15 +++++++++++++++ .../spring-reactive-client-2/pom.xml | 1 - .../spring-reactive-client/pom.xml | 1 - .../spring-reactive-data-couchbase/pom.xml | 2 -- .../spring-reactive-data/pom.xml | 10 ++++++---- .../spring-reactive-security/pom.xml | 5 +++-- spring-reactive-modules/spring-reactive/pom.xml | 2 +- spring-reactive-modules/spring-reactor/pom.xml | 7 ++++--- spring-websockets/pom.xml | 2 ++ 21 files changed, 74 insertions(+), 24 deletions(-) diff --git a/aws-modules/aws-reactive/pom.xml b/aws-modules/aws-reactive/pom.xml index 22bd62c2ee..965ce8fdcf 100644 --- a/aws-modules/aws-reactive/pom.xml +++ b/aws-modules/aws-reactive/pom.xml @@ -63,6 +63,7 @@ io.projectreactor reactor-test + ${reactor.version} test @@ -93,6 +94,8 @@ 2.2.1.RELEASE 2.17.283 + 1.18.20 + 3.6.0 \ No newline at end of file diff --git a/core-java-modules/core-java-streams-4/pom.xml b/core-java-modules/core-java-streams-4/pom.xml index e832cc1616..383f14d573 100644 --- a/core-java-modules/core-java-streams-4/pom.xml +++ b/core-java-modules/core-java-streams-4/pom.xml @@ -71,7 +71,7 @@ io.projectreactor reactor-core - ${io.reactor3.version} + ${reactor-core.version} org.apache.commons @@ -121,7 +121,7 @@ 2.2.2 3.1.5 1.0.0-alpha-4 - 3.5.1 + 3.6.0 4.4 10.4.1 diff --git a/docker-modules/docker-containers/pom.xml b/docker-modules/docker-containers/pom.xml index 79bf0aee72..f8b903c87d 100644 --- a/docker-modules/docker-containers/pom.xml +++ b/docker-modules/docker-containers/pom.xml @@ -27,6 +27,7 @@ io.projectreactor reactor-test + ${reactor.version} test @@ -45,7 +46,7 @@ com.google.cloud.tools jib-maven-plugin - 2.7.1 + ${jib-maven-plugin.version} docker-demo-jib @@ -55,4 +56,10 @@ + + 3.6.0 + 2.7.1 + + + \ No newline at end of file diff --git a/kubernetes-modules/k8s-admission-controller/pom.xml b/kubernetes-modules/k8s-admission-controller/pom.xml index 4c41bf7ca0..6a1d695f8d 100644 --- a/kubernetes-modules/k8s-admission-controller/pom.xml +++ b/kubernetes-modules/k8s-admission-controller/pom.xml @@ -33,6 +33,7 @@ io.projectreactor reactor-test + ${reactor.version} test @@ -79,4 +80,9 @@ + + 3.6.0 + + + \ No newline at end of file diff --git a/kubernetes-modules/kubernetes-spring/pom.xml b/kubernetes-modules/kubernetes-spring/pom.xml index 64322055d1..a9c780d59d 100644 --- a/kubernetes-modules/kubernetes-spring/pom.xml +++ b/kubernetes-modules/kubernetes-spring/pom.xml @@ -33,6 +33,7 @@ io.projectreactor reactor-test + ${reactor.version} test @@ -46,4 +47,8 @@ + + + 3.6.0 + \ No newline at end of file diff --git a/libraries-http-2/pom.xml b/libraries-http-2/pom.xml index b49e4b9387..5e803cde8a 100644 --- a/libraries-http-2/pom.xml +++ b/libraries-http-2/pom.xml @@ -118,7 +118,7 @@ 2.3.0 5.1.9.RELEASE 1.0.3 - 3.2.12.RELEASE + 3.6.0 1.49 diff --git a/patterns-modules/axon/pom.xml b/patterns-modules/axon/pom.xml index 473a1b0e15..4d83f8f9e6 100644 --- a/patterns-modules/axon/pom.xml +++ b/patterns-modules/axon/pom.xml @@ -51,6 +51,7 @@ io.projectreactor reactor-core + ${reactor.version} com.h2database @@ -70,6 +71,7 @@ io.projectreactor reactor-test + ${reactor.version} test @@ -114,6 +116,7 @@ 4.6.3 3.4.8 + 3.6.0 \ No newline at end of file diff --git a/persistence-modules/spring-data-cassandra-reactive/pom.xml b/persistence-modules/spring-data-cassandra-reactive/pom.xml index cddb62186b..41f184e233 100644 --- a/persistence-modules/spring-data-cassandra-reactive/pom.xml +++ b/persistence-modules/spring-data-cassandra-reactive/pom.xml @@ -23,6 +23,7 @@ io.projectreactor reactor-core + ${reactor.version} org.springframework.boot @@ -45,6 +46,7 @@ io.projectreactor reactor-test + ${reactor.version} test @@ -57,6 +59,7 @@ 4.3.1.0 + 3.6.0 \ No newline at end of file diff --git a/persistence-modules/spring-data-mongodb-reactive/pom.xml b/persistence-modules/spring-data-mongodb-reactive/pom.xml index 46b2e8067f..ca45d4a758 100644 --- a/persistence-modules/spring-data-mongodb-reactive/pom.xml +++ b/persistence-modules/spring-data-mongodb-reactive/pom.xml @@ -18,7 +18,7 @@ io.projectreactor reactor-core - ${reactor-core.version} + ${reactor.version} org.springframework.boot @@ -40,6 +40,7 @@ io.projectreactor reactor-test + ${reactor.version} test @@ -126,7 +127,7 @@ 5.3.15 4.5.2 - 3.3.1.RELEASE + 3.6.0 \ No newline at end of file diff --git a/reactor-core/pom.xml b/reactor-core/pom.xml index dd7533fe73..7bf34c93ad 100644 --- a/reactor-core/pom.xml +++ b/reactor-core/pom.xml @@ -29,7 +29,7 @@ io.projectreactor.addons reactor-extra - ${reactor.version} + ${reactor-extra.version} org.projectlombok @@ -40,7 +40,8 @@ - 3.5.1 + 3.6.0 + 3.5.1 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-url-matching/pom.xml b/spring-boot-modules/spring-boot-3-url-matching/pom.xml index 43f89eab47..42bd8583b3 100644 --- a/spring-boot-modules/spring-boot-3-url-matching/pom.xml +++ b/spring-boot-modules/spring-boot-3-url-matching/pom.xml @@ -96,8 +96,8 @@ 6.0.6 3.1.0 - 3.5.4 - 3.5.4> + 3.6.0 + 3.6.0> 3.0.0-M7 diff --git a/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/pom.xml b/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/pom.xml index f8552aba93..60b68fc4bd 100644 --- a/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/pom.xml +++ b/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/pom.xml @@ -26,6 +26,7 @@ io.projectreactor reactor-core + ${reactor-core.version} org.springframework.boot @@ -53,4 +54,7 @@ + + 3.6.0 + \ No newline at end of file diff --git a/spring-reactive-modules/pom.xml b/spring-reactive-modules/pom.xml index 61a3c3d17d..c349707027 100644 --- a/spring-reactive-modules/pom.xml +++ b/spring-reactive-modules/pom.xml @@ -59,7 +59,22 @@ pom import + + io.projectreactor + reactor-core + ${reactor.version} + + + io.projectreactor + reactor-test + ${reactor.version} + test + + + 3.6.0 + + \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-client-2/pom.xml b/spring-reactive-modules/spring-reactive-client-2/pom.xml index 5d5f3ebc2e..f7d82053bb 100644 --- a/spring-reactive-modules/spring-reactive-client-2/pom.xml +++ b/spring-reactive-modules/spring-reactive-client-2/pom.xml @@ -135,7 +135,6 @@ 1.0.1.RELEASE 1.1.6 - 3.2.10.RELEASE 1.7.1 diff --git a/spring-reactive-modules/spring-reactive-client/pom.xml b/spring-reactive-modules/spring-reactive-client/pom.xml index fe53584cc9..634fef1273 100644 --- a/spring-reactive-modules/spring-reactive-client/pom.xml +++ b/spring-reactive-modules/spring-reactive-client/pom.xml @@ -117,7 +117,6 @@ io.projectreactor reactor-test - ${reactor-test.version} test diff --git a/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml b/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml index e0b21087fa..84515fedeb 100644 --- a/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml +++ b/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml @@ -29,7 +29,6 @@ io.projectreactor reactor-core - ${reactor-core.version} org.springframework.boot @@ -136,7 +135,6 @@ 5.2.2.RELEASE 4.5.2 1.5.23 - 3.3.1.RELEASE 2.2.6.RELEASE 2.17.1 diff --git a/spring-reactive-modules/spring-reactive-data/pom.xml b/spring-reactive-modules/spring-reactive-data/pom.xml index 576a1d9f86..d72072e419 100644 --- a/spring-reactive-modules/spring-reactive-data/pom.xml +++ b/spring-reactive-modules/spring-reactive-data/pom.xml @@ -13,9 +13,6 @@ 1.0.0-SNAPSHOT - - UTF-8 - @@ -63,7 +60,7 @@ javax.validation validation-api - 2.0.1.Final + ${validation-api.version} io.r2dbc @@ -71,4 +68,9 @@ + + UTF-8 + 2.0.1.Final + + \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-security/pom.xml b/spring-reactive-modules/spring-reactive-security/pom.xml index 25b9f4c38f..d501a03c46 100644 --- a/spring-reactive-modules/spring-reactive-security/pom.xml +++ b/spring-reactive-modules/spring-reactive-security/pom.xml @@ -82,7 +82,7 @@ io.projectreactor reactor-test - ${project-reactor-test.version} + ${reactor-test.version} test @@ -115,7 +115,8 @@ 1.1.3 1.0 1.0 - 3.1.6.RELEASE + 3.1.6.RELEASE + 3.4.29 \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive/pom.xml b/spring-reactive-modules/spring-reactive/pom.xml index f19809e302..04bd32d632 100644 --- a/spring-reactive-modules/spring-reactive/pom.xml +++ b/spring-reactive-modules/spring-reactive/pom.xml @@ -104,7 +104,7 @@ - 3.4.16 + 3.6.0 1.3.10 2.2.21 diff --git a/spring-reactive-modules/spring-reactor/pom.xml b/spring-reactive-modules/spring-reactor/pom.xml index c2635765f0..54a97b92de 100644 --- a/spring-reactive-modules/spring-reactor/pom.xml +++ b/spring-reactive-modules/spring-reactor/pom.xml @@ -27,17 +27,18 @@ io.projectreactor reactor-bus - ${reactor.version} + ${reactor-bus.version} io.projectreactor reactor-core - ${reactor.version} + ${reactor-core.version} - 2.0.8.RELEASE + 2.0.8.RELEASE + 2.0.8.RELEASE \ No newline at end of file diff --git a/spring-websockets/pom.xml b/spring-websockets/pom.xml index 6ca84c4946..d6c5fbe561 100644 --- a/spring-websockets/pom.xml +++ b/spring-websockets/pom.xml @@ -22,6 +22,7 @@ io.projectreactor reactor-core + ${reactor-core.version} com.github.javafaker @@ -45,6 +46,7 @@ + 3.6.0 1.0.2 From 4e0e51139b8f11903a218abd0de4250cb5addfdc Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Mon, 11 Dec 2023 17:25:25 +0200 Subject: [PATCH 200/294] Update OutputStreamtoByteArrayUnitTest.java --- .../OutputStreamtoByteArrayUnitTest.java | 38 ++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java index 9cbca1ed24..fa55623973 100644 --- a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java +++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java @@ -1,16 +1,16 @@ package com.baeldung.outputstreamtobytearray; +import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import java.io.*; -import java.nio.file.Files; +import java.nio.charset.StandardCharsets; import java.nio.file.Path; -import java.nio.file.Paths; import static org.junit.Assert.assertEquals; -public class OutputStreamtoByteArrayUnitTest { +public class OutputStreamToByteArrayUnitTest { @Test public void givenFileOutputStream_whenUsingFileUtilsToReadTheFile_thenReturnByteArray(@TempDir Path tempDir) throws IOException { @@ -18,35 +18,29 @@ public class OutputStreamtoByteArrayUnitTest { String fileName = "file.txt"; Path filePath = tempDir.resolve(fileName); - try (DrainableOutputStream drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath.toFile()))) { - drainableOutputStream.write(data.getBytes()); + try (FileOutputStream outputStream = new FileOutputStream(filePath.toFile())) { + outputStream.write(data.getBytes(StandardCharsets.UTF_8)); } - byte[] intercepted = Files.readAllBytes(filePath); - String result = new String(intercepted); + byte[] writtenData = FileUtils.readFileToByteArray(new File(filePath.toUri())); + String result = new String(writtenData, StandardCharsets.UTF_8); assertEquals(data, result); } @Test - public void givenFileOutputStream_whenUsingDrainableOutputStream_thenReturnByteArray() throws IOException { + public void givenFileOutputStream_whenUsingDrainableOutputStream_thenReturnByteArray(@TempDir Path tempDir) throws IOException { String data = "Welcome to Baeldung!"; - String filePath = "file.txt"; + String fileName = "file.txt"; + Path filePath = tempDir.resolve(fileName); - DrainableOutputStream drainableOutputStream = null; - - try { - drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath)); - drainableOutputStream.write(data.getBytes()); - } finally { - if (drainableOutputStream != null) { - drainableOutputStream.close(); - } + try (DrainableOutputStream drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath.toFile()))) { + drainableOutputStream.write(data.getBytes(StandardCharsets.UTF_8)); + byte[] writtenData = drainableOutputStream.toByteArray(); + assertEquals(data, new String(writtenData, StandardCharsets.UTF_8)); + } catch (IOException e) { + e.printStackTrace(); } - - byte[] intercepted = Files.readAllBytes(Paths.get(filePath)); - String result = new String(intercepted); - assertEquals(data, result); } public class DrainableOutputStream extends FilterOutputStream { From 3ca05da8590552d746efbf4d2707be418a6b2b2a Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Mon, 11 Dec 2023 17:42:19 +0200 Subject: [PATCH 201/294] Update and rename OutputStreamtoByteArrayUnitTest.java to OutputStreamToByteArrayUnitTest.java --- ...yteArrayUnitTest.java => OutputStreamToByteArrayUnitTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/{OutputStreamtoByteArrayUnitTest.java => OutputStreamToByteArrayUnitTest.java} (100%) diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java similarity index 100% rename from core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java rename to core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java From 47baa5041bd3cdc55125377024252e98eb3d6c71 Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Mon, 11 Dec 2023 19:36:34 +0200 Subject: [PATCH 202/294] Update OutputStreamToByteArrayUnitTest.java --- .../OutputStreamToByteArrayUnitTest.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java index fa55623973..0082e77cfe 100644 --- a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java +++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java @@ -22,7 +22,7 @@ public class OutputStreamToByteArrayUnitTest { outputStream.write(data.getBytes(StandardCharsets.UTF_8)); } - byte[] writtenData = FileUtils.readFileToByteArray(new File(filePath.toUri())); + byte[] writtenData = FileUtils.readFileToByteArray(filePath.toFile()); String result = new String(writtenData, StandardCharsets.UTF_8); assertEquals(data, result); } @@ -34,15 +34,19 @@ public class OutputStreamToByteArrayUnitTest { String fileName = "file.txt"; Path filePath = tempDir.resolve(fileName); - try (DrainableOutputStream drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath.toFile()))) { + DrainableOutputStream drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath.toFile())); + + try { drainableOutputStream.write(data.getBytes(StandardCharsets.UTF_8)); - byte[] writtenData = drainableOutputStream.toByteArray(); - assertEquals(data, new String(writtenData, StandardCharsets.UTF_8)); - } catch (IOException e) { - e.printStackTrace(); + } finally { + drainableOutputStream.close(); } + + byte[] writtenData = drainableOutputStream.toByteArray(); + assertEquals(data, new String(writtenData, StandardCharsets.UTF_8)); } + public class DrainableOutputStream extends FilterOutputStream { private final ByteArrayOutputStream buffer; From 0235abe7e35412b6fc72e9d68037e46344bfa63e Mon Sep 17 00:00:00 2001 From: Kasra Madadipouya Date: Mon, 11 Dec 2023 18:39:03 +0100 Subject: [PATCH 203/294] JAVA-29186 fix failing integration test (#15400) --- .../logging/WebClientLoggingIntegrationTest.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/spring-reactive-modules/spring-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java b/spring-reactive-modules/spring-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java index e1eefe4d61..27dde13608 100644 --- a/spring-reactive-modules/spring-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java +++ b/spring-reactive-modules/spring-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java @@ -2,6 +2,7 @@ package com.baeldung.reactive.logging; import static com.baeldung.reactive.logging.jetty.RequestLogEnhancer.enhance; import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -136,9 +137,7 @@ public class WebClientLoggingIntegrationTest { public void givenDefaultHttpClientWithFilter_whenEndpointIsConsumed_thenRequestAndResponseLogged() { WebClient .builder() - .filters(exchangeFilterFunctions -> { - exchangeFilterFunctions.addAll(LogFilters.prepareFilters()); - }) + .filters(exchangeFilterFunctions -> exchangeFilterFunctions.addAll(LogFilters.prepareFilters())) .build() .post() .uri(sampleUrl) @@ -146,8 +145,6 @@ public class WebClientLoggingIntegrationTest { .exchange() .block(); - verify(mockAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleUrl))); + verify(mockAppender, atLeast(1)).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleUrl))); } - - } From ec8fe08bb86fdc82222fd6369458de973fa50fed Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Mon, 11 Dec 2023 18:48:24 +0100 Subject: [PATCH 204/294] JAVA-29073 | removing harperDB jar (#15402) --- persistence-modules/java-harperdb/pom.xml | 1 + pom.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/persistence-modules/java-harperdb/pom.xml b/persistence-modules/java-harperdb/pom.xml index 318f4b7460..7340aa4dbc 100644 --- a/persistence-modules/java-harperdb/pom.xml +++ b/persistence-modules/java-harperdb/pom.xml @@ -31,6 +31,7 @@ java-harperdb ${haperdb-driver.version} system + ${project.basedir}/lib/cdata.jdbc.harperdb.jar diff --git a/pom.xml b/pom.xml index ac7d12a5a0..0e8acff1d1 100644 --- a/pom.xml +++ b/pom.xml @@ -817,7 +817,7 @@ pdf performance-tests persistence-modules - persistence-modules/java-harperdb + persistence-modules/spring-data-neo4j protobuffer quarkus-modules From 7f894fe513c9a97dd56e797355a848a8806af918 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Mon, 11 Dec 2023 18:54:21 +0100 Subject: [PATCH 205/294] JAVA-29164 | fixing failing test (#15401) --- apache-kafka/pom.xml | 1 + ...atorIntegrationTest.java => BackupCreatorUnitTest.java} | 2 +- ...erIntegrationTest.java => WordCapitalizerUnitTest.java} | 2 +- .../com/baeldung/kafkastreams/KafkaStreamsLiveTest.java | 7 +++---- 4 files changed, 6 insertions(+), 6 deletions(-) rename apache-kafka/src/test/java/com/baeldung/flink/{BackupCreatorIntegrationTest.java => BackupCreatorUnitTest.java} (99%) rename apache-kafka/src/test/java/com/baeldung/flink/{WordCapitalizerIntegrationTest.java => WordCapitalizerUnitTest.java} (95%) diff --git a/apache-kafka/pom.xml b/apache-kafka/pom.xml index 22be7a83c6..6aa5fb894a 100644 --- a/apache-kafka/pom.xml +++ b/apache-kafka/pom.xml @@ -181,6 +181,7 @@ + 2.13.4 3.4.0 1.19.3 1.15.3 diff --git a/apache-kafka/src/test/java/com/baeldung/flink/BackupCreatorIntegrationTest.java b/apache-kafka/src/test/java/com/baeldung/flink/BackupCreatorUnitTest.java similarity index 99% rename from apache-kafka/src/test/java/com/baeldung/flink/BackupCreatorIntegrationTest.java rename to apache-kafka/src/test/java/com/baeldung/flink/BackupCreatorUnitTest.java index f46fffbb59..046a9bb9ec 100644 --- a/apache-kafka/src/test/java/com/baeldung/flink/BackupCreatorIntegrationTest.java +++ b/apache-kafka/src/test/java/com/baeldung/flink/BackupCreatorUnitTest.java @@ -29,7 +29,7 @@ import java.util.List; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; -public class BackupCreatorIntegrationTest { +public class BackupCreatorUnitTest { public static ObjectMapper mapper; @Before diff --git a/apache-kafka/src/test/java/com/baeldung/flink/WordCapitalizerIntegrationTest.java b/apache-kafka/src/test/java/com/baeldung/flink/WordCapitalizerUnitTest.java similarity index 95% rename from apache-kafka/src/test/java/com/baeldung/flink/WordCapitalizerIntegrationTest.java rename to apache-kafka/src/test/java/com/baeldung/flink/WordCapitalizerUnitTest.java index 8a98dae4b5..c521cfa62e 100644 --- a/apache-kafka/src/test/java/com/baeldung/flink/WordCapitalizerIntegrationTest.java +++ b/apache-kafka/src/test/java/com/baeldung/flink/WordCapitalizerUnitTest.java @@ -10,7 +10,7 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; -public class WordCapitalizerIntegrationTest { +public class WordCapitalizerUnitTest { @Test public void givenDataSet_whenExecuteWordCapitalizer_thenReturnCapitalizedWords() throws Exception { diff --git a/apache-kafka/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java b/apache-kafka/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java index 3b559b619e..c733a4a1f4 100644 --- a/apache-kafka/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java +++ b/apache-kafka/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java @@ -21,8 +21,7 @@ import org.junit.Ignore; import org.junit.Test; public class KafkaStreamsLiveTest { - private String bootstrapServers = "localhost:9092"; - private Path stateDirectory; + private final String bootstrapServers = "localhost:9092"; @Test @Ignore("it needs to have kafka broker running on local") @@ -44,8 +43,8 @@ public class KafkaStreamsLiveTest { // Use a temporary directory for storing state, which will be automatically removed after the test. try { - this.stateDirectory = Files.createTempDirectory("kafka-streams"); - streamsConfiguration.put(StreamsConfig.STATE_DIR_CONFIG, this.stateDirectory.toAbsolutePath() + Path stateDirectory = Files.createTempDirectory("kafka-streams"); + streamsConfiguration.put(StreamsConfig.STATE_DIR_CONFIG, stateDirectory.toAbsolutePath() .toString()); } catch (final IOException e) { throw new UncheckedIOException("Cannot create temporary directory", e); From 84bf4ee9564772a1bbd372994771ae6e3bec4835 Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Mon, 11 Dec 2023 23:08:50 +0200 Subject: [PATCH 206/294] Update core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java Co-authored-by: Liam Williams --- .../OutputStreamToByteArrayUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java index 0082e77cfe..f96926c81c 100644 --- a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java +++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java @@ -8,7 +8,7 @@ import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.Path; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; public class OutputStreamToByteArrayUnitTest { From dc98a1c3020c2407d5f9e9e31dd43ee00ddf32b0 Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Mon, 11 Dec 2023 23:08:59 +0200 Subject: [PATCH 207/294] Update core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java Co-authored-by: Liam Williams --- .../OutputStreamToByteArrayUnitTest.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java index f96926c81c..16dfd68349 100644 --- a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java +++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java @@ -35,11 +35,8 @@ public class OutputStreamToByteArrayUnitTest { Path filePath = tempDir.resolve(fileName); DrainableOutputStream drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath.toFile())); - - try { + try (drainableOutputStream) { drainableOutputStream.write(data.getBytes(StandardCharsets.UTF_8)); - } finally { - drainableOutputStream.close(); } byte[] writtenData = drainableOutputStream.toByteArray(); From d04ea21febfa40c9d63d719d862b397efc8aa69c Mon Sep 17 00:00:00 2001 From: SGWebFreelancer Date: Tue, 12 Dec 2023 09:38:13 +0800 Subject: [PATCH 208/294] BAEL-7278 first draft --- pdf-2/pom.xml | 18 ++ .../exceltopdf/ExcelToPDFConverter.java | 167 ++++++++++++++++++ pdf-2/src/main/resources/excelsample.xlsx | Bin 0 -> 9352 bytes pdf-2/src/main/resources/pdfsample.pdf | Bin 0 -> 1591 bytes 4 files changed, 185 insertions(+) create mode 100644 pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java create mode 100644 pdf-2/src/main/resources/excelsample.xlsx create mode 100644 pdf-2/src/main/resources/pdfsample.pdf diff --git a/pdf-2/pom.xml b/pdf-2/pom.xml index ccbb5c9693..1a4bc226fd 100644 --- a/pdf-2/pom.xml +++ b/pdf-2/pom.xml @@ -35,6 +35,21 @@ pdfbox ${pdfbox.version} + + org.apache.poi + poi-ooxml + ${poi-ooxml.version} + + + org.apache.logging.log4j + log4j-api + ${log4j-api.version} + + + org.apache.logging.log4j + log4j-core + ${log4j-core.version} + @@ -52,6 +67,9 @@ 7.2.3 3.0.1 3.0.0-RC1 + 5.2.5 + 2.20.0 + 2.20.0 \ No newline at end of file diff --git a/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java b/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java new file mode 100644 index 0000000000..38318616aa --- /dev/null +++ b/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java @@ -0,0 +1,167 @@ +package com.baeldung.exceltopdf; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Iterator; + +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFColor; +import org.apache.poi.xssf.usermodel.XSSFFont; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Cell; +import com.itextpdf.text.BaseColor; +import com.itextpdf.text.Document; +import com.itextpdf.text.DocumentException; +import com.itextpdf.text.Element; +import com.itextpdf.text.Font; +import com.itextpdf.text.Paragraph; +import com.itextpdf.text.Phrase; +import com.itextpdf.text.pdf.PdfPCell; +import com.itextpdf.text.pdf.PdfPTable; +import com.itextpdf.text.pdf.PdfWriter; + +public class ExcelToPDFConverter { + + public static XSSFWorkbook readExcelFile(String excelFilePath) throws IOException { + FileInputStream inputStream = new FileInputStream(excelFilePath); + XSSFWorkbook workbook = new XSSFWorkbook(inputStream); + inputStream.close(); + return workbook; + } + private static Document createPDFDocument(String pdfFilePath) throws IOException, DocumentException { + Document document = new Document(); + PdfWriter.getInstance(document, new FileOutputStream(pdfFilePath)); + document.open(); + return document; + } + public static void convertExcelToPDF(String excelFilePath, String pdfFilePath) throws IOException, DocumentException { + XSSFWorkbook workbook = readExcelFile(excelFilePath); + Document document = createPDFDocument(pdfFilePath); + + for (int i = 0; i < workbook.getNumberOfSheets(); i++) { + XSSFSheet worksheet = workbook.getSheetAt(i); + + // Add header with sheet name as title + Paragraph title = new Paragraph(worksheet.getSheetName(), new Font(Font.FontFamily.HELVETICA, 18, Font.BOLD)); + title.setAlignment(Element.ALIGN_CENTER); + document.add(title); + + createAndAddTable(worksheet, document); + // Add a new page for each sheet (except the last one) + if (i < workbook.getNumberOfSheets() - 1) { + document.newPage(); + } + } + + document.close(); + workbook.close(); + } + + private static void createAndAddTable(XSSFSheet worksheet, Document document) throws DocumentException, IOException { + PdfPTable table = new PdfPTable(worksheet.getRow(0).getPhysicalNumberOfCells()); + table.setWidthPercentage(100); + addTableHeader(worksheet, table); + addTableData(worksheet, table); + document.add(table); + } + + private static void addTableHeader(XSSFSheet worksheet, PdfPTable table) throws DocumentException, IOException { + Row headerRow = worksheet.getRow(0); + for (int i = 0; i < headerRow.getPhysicalNumberOfCells(); i++) { + Cell cell = headerRow.getCell(i); + String headerText = cell.getCellType() == CellType.STRING ? cell.getStringCellValue() : String.valueOf(cell.getNumericCellValue()); + PdfPCell headerCell = new PdfPCell(new Phrase(headerText, getCellStyle(cell))); + headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); + table.addCell(headerCell); + } + } + + private static void addTableData(XSSFSheet worksheet, PdfPTable table) throws DocumentException, IOException { + Iterator rowIterator = worksheet.iterator(); + while (rowIterator.hasNext()) { + Row row = rowIterator.next(); + if (row.getRowNum() == 0) { + continue; + } + for (int i = 0; i < row.getPhysicalNumberOfCells(); i++) { + Cell cell = row.getCell(i); + String cellValue; + if (cell != null) { + if (cell.getCellType() == CellType.STRING) { + cellValue = cell.getStringCellValue(); + } else if (cell.getCellType() == CellType.NUMERIC) { + cellValue = String.valueOf(cell.getNumericCellValue()); + } else { + cellValue = ""; + } + } else { + cellValue = ""; + } + PdfPCell cellPdf = new PdfPCell(new Phrase(cellValue, getCellStyle(cell))); + // Set background color + short bgColorIndex = cell.getCellStyle() + .getFillForegroundColor(); + if (bgColorIndex != IndexedColors.AUTOMATIC.getIndex()) { + XSSFColor bgColor = (XSSFColor) cell.getCellStyle() + .getFillForegroundColorColor(); + if (bgColor != null) { + byte[] rgb = bgColor.getRGB(); + if (rgb != null && rgb.length == 3) { + cellPdf.setBackgroundColor(new BaseColor(rgb[0] & 0xFF, rgb[1] & 0xFF, rgb[2] & 0xFF)); + } + } + } + + cellPdf.setHorizontalAlignment(Element.ALIGN_CENTER); + table.addCell(cellPdf); + } + } + } + + private static Font getCellStyle(Cell cell) throws DocumentException, IOException { + Font font = new Font(Font.FontFamily.HELVETICA, 12); + CellStyle cellStyle = cell.getCellStyle(); + org.apache.poi.ss.usermodel.Font cellFont = cell.getSheet().getWorkbook().getFontAt(cellStyle.getFontIndexAsInt()); + + short fontColorIndex = cellFont.getColor(); + if (fontColorIndex != IndexedColors.AUTOMATIC.getIndex() && cellFont instanceof XSSFFont) { + XSSFColor fontColor = ((XSSFFont) cellFont).getXSSFColor(); + if (fontColor != null) { + byte[] rgb = fontColor.getRGB(); + if (rgb != null && rgb.length == 3) { + font.setColor(new BaseColor(rgb[0] & 0xFF, rgb[1] & 0xFF, rgb[2] & 0xFF)); + } + } + } + if (cellFont.getItalic()) { + font.setStyle(Font.ITALIC); + } + + if (cellFont.getStrikeout()) { + font.setStyle(Font.STRIKETHRU); + } + + if (cellFont.getUnderline() == 1) { + font.setStyle(Font.UNDERLINE); + } + + short fontSize = cellFont.getFontHeightInPoints(); + font.setSize(fontSize); + + if (cellFont.getBold()) { + font.setStyle(Font.BOLD); + } + return font; + } + + public static void main(String[] args) throws DocumentException, IOException { + String excelFilePath = "src/main/resources/excelsample.xlsx"; + String pdfFilePath = "src/main/resources/pdfsample.pdf"; + convertExcelToPDF(excelFilePath, pdfFilePath); + } +} diff --git a/pdf-2/src/main/resources/excelsample.xlsx b/pdf-2/src/main/resources/excelsample.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fb83598a71b1b53eed3538c0f6182cd1aca76f48 GIT binary patch literal 9352 zcmeHN1y>x|)@@vZySsak06~I=&}bT$;O_3$5Zv9J0Kp0F8Z;0zI5ZYWu;30~XJ+1- znaq5@;Jxa#>aJQ{=d7x8&%XQIeM(sl4jvDH2tWn^0Mr1Z!)yyZ7yuv+9ss}vAj9fN z+S|F9+PUbfdODaozv1w(wV^72hh@qGz(Vi;-|=4@fr_M2#Xc@9>C0Dll3VP+Xak`|f`_`* z^ho(RKMwBGcM%dNIB9Dg<>8TvJtfxHk2cE$q&YVAfq13X#eo$h7Wf3B0h`&2gX-98 z11)G}+NFX+OFa-p^;K+vk@wSBo0GURR+h}(dZ(N0vha~K-pd4Tdhe8}HC336KrK!; zsdAmpOwByA2F9?fTp@8C7%Sszh;5zx6bif~AKpitm1z&eS+jQe==ykdF~vllDc`g{ z!?)09*U1qBQwL7X1C*^J>j^5k?LPbVzrZh)AN|owwQ@_pj!V|RMrzWU6B}ouNJL}H z26;D_Bc&wB&l2cYGBn&Q(5-Y}Oy*-(Jc+agFMaihcY*z_^|V_8Yq*=5&NuV`GW1Qz zdw*hEC+P4v<(ohE10n$M_y`A3{u?YC)VOHRpt&XwMcor9EcKmCZJaqdexCma$Nyps z{^ivx5)_pBxX?n5UfqQbUCyq=VM)lji@$24R`m;zUB+yPE~Fz}>0%_qQY8t3lkxBH zyBk?r5sv;oM18TrTM>zaCq&!mUKx^l=o|FI4#q*-)Qflc=d!2wK({W?B_@6D^qxD+>H*Zz;D+BABny50E&9)y~B$qA_a|1moCr^n{WQEZ^0h7Bk)T~!M(ig}l z?RRDhp5xX%g*Ry1WaV-cWqcw&Aud#*Lo$^9%n8oh1?g>SN9!&Uwc%5eBC--F=*fC*^zg9*I@nlgV)mI}2=yFvjxUwz9*m}AAB80r9^43?PA z`|L{Ybhpd*PCY2Rm&5Pzz=w8gGYBgd5m5ieL>*WuxpWv2 z!B;PYYyG8n1T+-FLNt=RQb}KEs`0cqV{ss6a{+z3vPBYko0-U{WeY)0dXm3FO$ck) zsw}`yFqO2y!ucKMq)2jTfDYB_qvuXP&3nf$-89$zAljqGMJRU5cx(!i;(&NRD$B zQrCQeBx5C9it}D}qh}KC$m!KBWxJxc>iHK(SE<^P@ExeCJAE7(%Ia0NnQuc`s7}n8 ztBJtsRhjM-n7@8WLa#H`ss4oP1Q`>YLujBO6ZmvP`{@GcqgjC(q_3k&|9m+>q#Ryg zIjzp$i-VYq?FXSna0&sn@2*{GS(M(FcuW5SvGxv6JMh~Ym0C+{7^F{roAO>hXb(aB zmiY)vc^-pSmyh1(Vu~S!k9JACkVjK51imYY+&miPODBH=PS+8}OIvD5mq%^|v!{wa zMhZCmwP7+f_(F-@BMuqcq8N98O?#@BUWU{b)n&f5d@d$9rTddpd@C`mLnz*Qol_o; z7nE|BYkZrF{Op?g)=gQqtr|MJ`L!LJw#?6{dKigRMPiK!Z@HGy%H7*l)l7^w68n}Z zqpDf*qI@cH;U2B6;;*@>1u#HK+PG2-1d6f-*I*g8HAf!qu@hmpY;eMT$h1QcY*Rk} zV$Zq%NP_HUg!@QyKC2m3bHll`5ZyAbNoiAJDm@A6a~iyQj_x0=q_DnQ5HXpW%GU2Q z6G3wVT+;pFC5mEfjG4^@;3-YfbOY;`psbc@wlN%yIbauB@8c$rjEyqJo_Op-0f?QB zonn23*L?J?n?Y4J734O>X5$8h2t|iZrbSvAqA3e&={oJRq4@gw=<;21MM~ElBzSA7 zZ#t@s0;62Cq)%YRwlh~mp2HpYHlaf(bX|DXbM3`_T{mZ5rx_#SP7@>IxTrp7l~Pp4 z2*IWM_4}S<*MxzR!NF6{yGxo|>*d}DLy3cYNGrLGRqV5tE5d(6t0qRqpcoXbvrhm3 z^xx6y?BZ!->ilzI?^oA}%@n}%gJLyk+dV`sfB{?CmLW*>eVewW**jl818#L+@qzS& zs*A46`M9^Qg*xP?nK2D0W4cZkb~X|_DBxu6lDp|`+}dz-c`kxq)CD3>{!yZ)jRmLDaeAw$ zGIiz_5Anl;f6s}W=pm&Ud7~o+KY4VKt-(5p-N!PJE-1hjCDq|qmk3OZfSaX`l8p}G zn#CqLn+!|zGm@#%F4t@Lit6Ay+gMSYJN4$8HFw6GPRx%2ly)V4W^okc#{k;5zUi*G zb%<{OW>CypaVo_0INR0jxq~`V-`yinP>Epgjbxb!i z{}i0Hs!{KrLDtK3eSy%iQBlk0Hh1dcE~BTw%|QBmf?@DI?k!K%vs!Y_OYngjkl(?T z>`6=|dtvF2fGzslShF_oTfVX&_jgg?6KxZ8S|NIrriP7XBNBj(f?!v}+-TPU?S8(r z6DQDc6(G`FYLhI80iNR}J01xCm|GY<&ofW2{NSg_ThDk`q8{3PbXufXj{WVqUrn$l zON)}Bv^g8mIR6#=m$zsaU4iY*RHIjcn!^aSQ%{UKybx0&#ll*&3|^q_sRYn?Z-2ew zTzcx*++IQ@Ih*6yw`DFt!j-w6MOSr0x^&-sCa4A0wX~4CSYFQd`+6n(koe4old7Jf zvTGrT8-r$W=U69m)X-`ao&3`hg`LM$L5G>(!;#skRYM0etv#_#ie7tOcoXoM4rh2Z z|B`JBY60ZtQ48||jy%npnA*0_W5s!Q`mBB-{O&+2Wplx#=qQ4IBF9-@+VY1C4x(NQ zvIM8%@RUw*WIt;n*JAPUR|e)p;>)e{Y;8#B`uwTZ$?zhVxL~4;KDh{QYG9(lO|Zh1 zjMCMPU;7o5`u<6bJ%m`Dibw#!0M$<&;5TA)u`snY<^1jZ^e5oku@~#zgFkrPG~2^g{2of2Qd}BOO>z}NtzOaL+?0?MWL(z zMmfniHcwl*O_yl{)OJIUlzHeVDY?w?^E!1op6W>Rl1Y2gn~p1lCeUOU0CJq0#cGMxaC?Eh9L?^p3{1HuQ z0{KI8B$FVde~Eq?8OJ^Zhrys(l^GqVc2zA3eki7mXyoE9N`7Myu1N~I@G$BhmT$ac z&70+?;>;28e)#e2G_*^^|7`cVPya(p1B;v;61|Gb;cTq_`&*K91~b9VZkoP0|pT=PBOQHmvBTp}Y+`#~LE`=e^z_=q9W5R7qq z4D%wppG%@YK@5A>t@Lno2v$#r>U*zi%|Y)HndSgOyKtBFLM!EQ3tdcl^~+j>W#cF} zBKPNzvW(FmKOA!8R}xQK!rQ_p;;j!kfE9qt9iBXm4bVb#jpY%V`dPye(dJspwq*2&tuPN2r#gnmB+v>hj>sb*W6Iw&) zb8z{Ez26=fwcvQY4-%Am%17QAX|l!byHl zj9ZE~{m&BQoOY*LB8hn7Mcn42m4%%bqiIIivdTze47)KMC$DXfO7EZ~bP249G+h*KoNpKl=Mj2-`aXHFjY!2MYJkYQ zNz_?$!jNZlr)5%u#vqw|A6UUUG_H1@WdLKEP-gvw*(nv7)%5Z>$+pJa-Z9XFfGHe% zt>~IWY6bX4U^`3ID?0{50m28nO}Q00%{+&&%azd9CA$}mtYx0+MR4fz#(~w(zHZP! ze^un56Q0<|ikRx6>0%7)wRNDdVF)rR8sSP{82*EGI@!%pYOmeqp-ws+Mflhz;qD9HJ{g6?Rl4-L zm9fPNW}N0KgD;J3If<5i(~;o?BllwL1e&&_=}LE2g#5Xx2Ma! zsl}*;)QRVNG$yvSG!0`jn1MlMqF>1Fy1@#$iG`Ne`WknasBg{#v4wU z$L`AAFol@#L#R~JbKOM65yYqQY2Hcw?E38f$>_Y3WCgaY8Ua|M+M5|-tdyCKSS~_C z9^5^&mLV%duX7YB!Rsnj4i9A?*T^gA7RY)#D5GOL;GXaBV;5;^aJ1ruTr|5_JgdhZ5C*Kk7G&9ZuMj^l81n|&-8J2FyU{}W-u`prhC z?t+iw5jIu!ZNo^OmaUsruvvo$6MTna;l%!z=fQfFI!EYUD>aj3!aq7_(J>Zh?UeWU zQ5&3^bdas+P5lbBN|BO*LZwZl_j&hJti}f0%)Ta_fJ>{k#>an^GA@Sk80(;w?hpz9 zK=kLn)Y-z+)WwhQdIbuC0XIrZai3^Z;sg>k*SXMPRKo*D}rLwf3 zdcNWvK#j{h#YB!$Q|sILXpzO(uU_|^L8K|WW;8Ts$P!B z?FA#5`<3#=Cq>|qJc0oV4oTwV$fECe&kzl&bjMi=l4a)PlusMgt6pZ+VEpX(ijIj( zVdR}y&| zMcB@Q-pdxesOpLz_|Lo;**bd{UA~=BMMOQM%co3-Q-+SuP%_4Jg{6%5V)`;_DHL#_ zBsjL~-oHE5qOR$+Rh5!VpOlWPVw}nR-1>0M3^B3$+W+B>bf%j<@1>aRQceq~?E=EX zas7&S1)MU}j4z`p{>J=FMauqRsm{XA&%IzY4Du|(OJjEF8q!m2eZrZs^{E>;+a+bl zx&<+1$ukLE^iwPOOx2kDah51?(oIEM_lto*)Or703(f zv}KIIO#sTuH`1pbZ!jKy%OGfyJU%8Ry|D}8!g^aB=mY5f$|*GuvgHV50_9AxP%W-@ zwymOO1_M!);zfu%(^rZz?WgO{`nb~$kB^gu>*HwBUxePG(n#!XX>37}P5k@R__D?4 zT~AP*y+~?~18h_Y$cd;%AseR1iF9Jz>?5iT$GG2%MeBYbT|jr2kB`5_^8@oMd8Km& zHsI$^tm;Fu3aqti+!H(+Af^%d&jGb^Cr`Qyih-!I*Yxz)EnIppt&D(H*kR@sMR6&) z`mme3OAEWHJA|f$=0(LR^FPJLf7aPH0xchrpnow#HA}qTf$nT!=wxc5;^Jg!Xa3vH z)@E`E*e8aC2=VT5C%Ra*0X2ltF>7OEHUw6#Vh+!3^HJf)j zuJpd5*-Kgn;%RXNG(WA}ctfw()Wk>#n!bR7hq}{LBYgaJ9R!?n zDVj7jqly`Bt0nQZIZ$lv!D+0bJ!ws?6V8>3jzHjLsEKvnfrTyqEH?V0RIcRv)SPu< z^3>eB<)*GP8=Vgh{)so-0`@LZUrL$Ln+A+?H}IQiE4Ydt#6Hn3r_X4J3wp?%#}i%1 zepea-d(E3TL{pkzemR)9h=9-sDNJic$&l}BY}H0s<|v$g_Z>;QO@8Ha7Z0}_HN1O708ZR_-Q3*;vHQtX$fou6&s|;f| zu@i3Mrb-;h>Uj3l=_~BdEMFC@_<2veHL1@9rHXy+xZWO%vuV+AJwy4T7Crtt0}BsK z5M6QhOy=`8OQ(4Jsji$JKZ(-}SaNjZjtw^?e4w|`7EMzh90@Bc#2_Ezwn`dOiz}qO zOy83q)NEO?A*y>oK+3UtO~6IJh06Lv*Xgq(X4IIJ6jBi$?v&5G7vL2*9}!_uD2svl z;litC7!|ln zqi88#B_~0wK-}T8xAri(CPVh*dmMzaKPlyHO{9K5Z637I(8SdFubF4^#d|Crnt2RR ze#ZK1<{3IT{4epKA^YRVN>H$0`q_|zyP$+$Ar)LvMgvzAyb?N_D1b?DGgmA&&Tpg( ztBBv9Q)--?S#Vp7rsUKUEhw$Ve8cJ`zZJ;2?ezK;cr|3?+Lt-keT}nIRvfJ}@R;Paj#T*9jpa~2Wn?xVuz*o5SR}&oj?C4^m*QqH&2^XN%GfTe0BJ}6o8VzD zJ6EUuMSE!zI$gzydDb(3mfhR-nHda*J;XbTa`&;d=ye*s;yV7(a_QrDL;AwymgkO; zul&%7`JI7aVA-K;^Y7n${Ac?9GycmLAj)!ockuV_^nVP0j;T<7~9wjQ`Y_e>MG8CHvD98S7s)vtJ$j zTIc`iAQY;A|MB4esQQ2P@@oW?{4)auz77S~FqVgWfGI>6vp+t%Gx3UT?0{)qQvvg4j-rXM*bRR`p?bx)X zh5wS!o{7^w=)66(S?r@@RFnCo-#<#v*%lUw3aA`%n8VEebr1jEa|^?>XFRSd+InP8 zIqPJZce2aE1S<<0Z^_Hdzc2et`jdonXZ^many7O-kAxcM^NVj(RDA!;X=2sSD`)s7 zPj*bT>{$8ym95^wNqeH7th>1(_15$=!9jnN5AJ+;a^|EDFO&Z8Oh4;oAj>&f`=jjk zZ7*(4aJjlEeV+N$6?-#d&2%s8-#Yq8(oXmEvedec8C}axdWI;^T=v93zAJP0-bae( z-9F^lzN(Eq)q4HS>8oD^>pY^Z7cH;PxwUEg?O@r$H#YK|!PeMM#otgH3e%a0q zm-Y5pUeb$Pn?HT}t)ubNRlohLy?l0=?j40Y|Mt9}^>Jh0$)!C*3{Be!NSBSRzE1UIKQ+gIkgy= z#@+JsNIau5m4I9U5;4?wN-RzV3wxyIl%#d6yXFCNQf6Mdet2e{V_tD4 zjBjTLGaTd=k_{)qT#z4-%>{*4G0?xIK>r!)duOH;M}q=1C>G%qGc+yEi6x0S`RU+* zE=CU&bA;l6qWqN7=KI#)d|QMg|t97Di^;1{UfD z2I`vnzWFJ56(BrQQIwj-WuRce1#|)wD43a=8k;JlDZs=mjDevK0t$I>F-s$0u%L+< z7-EPS8W;kT44OJ~Lts)t6*Dw21I7fJn4y6sLad}HF*7H%2vi&gXI7;uSm+1k=a(pe zA|puOGcPS)0Tk3gri((fje%*BaY}M>s->xgMXGU1s##jHX_BRZL6W7hrE!XJnjK*k hpa@q5M~5yfqPU7n5{pW}A!cY~X33?h>gw;t1ps{5SL*-( literal 0 HcmV?d00001 From 82cae6f0d42d4794ecc8b32fd783943afa3a8bdc Mon Sep 17 00:00:00 2001 From: Diegom203 <153622681+Diegom203@users.noreply.github.com> Date: Tue, 12 Dec 2023 15:25:24 +0200 Subject: [PATCH 209/294] Update and rename JsonNodeToJsonObjectUnitTest.java to JsonNodeToObjectNodeUnitTest.java --- ...sonObjectUnitTest.java => JsonNodeToObjectNodeUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/{JsonNodeToJsonObjectUnitTest.java => JsonNodeToObjectNodeUnitTest.java} (89%) diff --git a/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java b/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToObjectNodeUnitTest.java similarity index 89% rename from json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java rename to json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToObjectNodeUnitTest.java index 38d097e5b8..b58c5a3af9 100644 --- a/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java +++ b/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToObjectNodeUnitTest.java @@ -18,7 +18,7 @@ public class JsonNodeToJsonObjectUnitTest { ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonNode = objectMapper.readTree(jsonString); - ObjectNode objectNode = objectMapper.createObjectNode().setAll((ObjectNode) jsonNode); + ObjectNode objectNode = (ObjectNode) jsonNode; assertEquals("John", objectNode.get("name").asText()); assertEquals("male", objectNode.get("gender").asText()); From edea043a7fcedcb6993554526b4535f845458afc Mon Sep 17 00:00:00 2001 From: Diegom203 <153622681+Diegom203@users.noreply.github.com> Date: Tue, 12 Dec 2023 15:26:47 +0200 Subject: [PATCH 210/294] Update JsonNodeToObjectNodeUnitTest.java --- .../jsonnodetojsonobject/JsonNodeToObjectNodeUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToObjectNodeUnitTest.java b/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToObjectNodeUnitTest.java index b58c5a3af9..15927b6008 100644 --- a/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToObjectNodeUnitTest.java +++ b/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToObjectNodeUnitTest.java @@ -9,7 +9,7 @@ import org.junit.Test; import static org.junit.Assert.*; -public class JsonNodeToJsonObjectUnitTest { +public class JsonNodeToObjectNodeUnitTest { public static String jsonString = "{\"name\": \"John\", \"gender\": \"male\", \"company\": \"Baeldung\", \"isEmployee\": true, \"age\": 30}"; From ec0654f175928e49d2767d460ffa73fb65b0c05a Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Tue, 12 Dec 2023 19:25:02 +0100 Subject: [PATCH 211/294] BAEL-7143: remove empty space --- .../src/main/resources/application.yml | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 spring-reactive-modules/spring-reactive-performance/src/main/resources/application.yml diff --git a/spring-reactive-modules/spring-reactive-performance/src/main/resources/application.yml b/spring-reactive-modules/spring-reactive-performance/src/main/resources/application.yml deleted file mode 100644 index 335ae17af1..0000000000 --- a/spring-reactive-modules/spring-reactive-performance/src/main/resources/application.yml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - From 29c0b906b5845bdd935ac20c073b88a8f590c51c Mon Sep 17 00:00:00 2001 From: SGWebFreelancer Date: Wed, 13 Dec 2023 10:33:56 +0800 Subject: [PATCH 212/294] BAEL-7278 Modify the code based on the feedback --- .../exceltopdf/ExcelToPDFConverter.java | 140 ++++++++++++++---- pdf-2/src/main/resources/excelsample.xlsx | Bin 9352 -> 9591 bytes pdf-2/src/main/resources/pdfsample.pdf | Bin 1591 -> 1713 bytes 3 files changed, 111 insertions(+), 29 deletions(-) diff --git a/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java b/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java index 38318616aa..b4013f0d49 100644 --- a/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java +++ b/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java @@ -3,10 +3,13 @@ package com.baeldung.exceltopdf; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.math.BigDecimal; import java.util.Iterator; import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.VerticalAlignment; import org.apache.poi.xssf.usermodel.XSSFColor; import org.apache.poi.xssf.usermodel.XSSFFont; import org.apache.poi.xssf.usermodel.XSSFSheet; @@ -14,31 +17,40 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Cell; + import com.itextpdf.text.BaseColor; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Element; import com.itextpdf.text.Font; +import com.itextpdf.text.FontFactory; import com.itextpdf.text.Paragraph; import com.itextpdf.text.Phrase; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + public class ExcelToPDFConverter { + private static final Logger logger = LogManager.getLogger(ExcelToPDFConverter.class); + public static XSSFWorkbook readExcelFile(String excelFilePath) throws IOException { FileInputStream inputStream = new FileInputStream(excelFilePath); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); inputStream.close(); return workbook; } + private static Document createPDFDocument(String pdfFilePath) throws IOException, DocumentException { Document document = new Document(); PdfWriter.getInstance(document, new FileOutputStream(pdfFilePath)); document.open(); return document; } + public static void convertExcelToPDF(String excelFilePath, String pdfFilePath) throws IOException, DocumentException { XSSFWorkbook workbook = readExcelFile(excelFilePath); Document document = createPDFDocument(pdfFilePath); @@ -48,6 +60,7 @@ public class ExcelToPDFConverter { // Add header with sheet name as title Paragraph title = new Paragraph(worksheet.getSheetName(), new Font(Font.FontFamily.HELVETICA, 18, Font.BOLD)); + title.setSpacingAfter(20f); title.setAlignment(Element.ALIGN_CENTER); document.add(title); @@ -63,7 +76,8 @@ public class ExcelToPDFConverter { } private static void createAndAddTable(XSSFSheet worksheet, Document document) throws DocumentException, IOException { - PdfPTable table = new PdfPTable(worksheet.getRow(0).getPhysicalNumberOfCells()); + PdfPTable table = new PdfPTable(worksheet.getRow(0) + .getPhysicalNumberOfCells()); table.setWidthPercentage(100); addTableHeader(worksheet, table); addTableData(worksheet, table); @@ -74,9 +88,27 @@ public class ExcelToPDFConverter { Row headerRow = worksheet.getRow(0); for (int i = 0; i < headerRow.getPhysicalNumberOfCells(); i++) { Cell cell = headerRow.getCell(i); - String headerText = cell.getCellType() == CellType.STRING ? cell.getStringCellValue() : String.valueOf(cell.getNumericCellValue()); + + String headerText; + switch (cell.getCellType()) { + case STRING: + headerText = cell.getStringCellValue(); + break; + case NUMERIC: + headerText = String.valueOf(BigDecimal.valueOf(cell.getNumericCellValue())); + break; + case BLANK: + headerText = ""; // or null + break; + default: + logger.warn("Unsupported cell type: {}", cell.getCellType()); + headerText = ""; // or throw an exception + break; + } + PdfPCell headerCell = new PdfPCell(new Phrase(headerText, getCellStyle(cell))); - headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); + setBackgroundColor(cell, headerCell); + setCellAlignment(cell, headerCell); table.addCell(headerCell); } } @@ -91,42 +123,81 @@ public class ExcelToPDFConverter { for (int i = 0; i < row.getPhysicalNumberOfCells(); i++) { Cell cell = row.getCell(i); String cellValue; - if (cell != null) { - if (cell.getCellType() == CellType.STRING) { - cellValue = cell.getStringCellValue(); - } else if (cell.getCellType() == CellType.NUMERIC) { - cellValue = String.valueOf(cell.getNumericCellValue()); - } else { - cellValue = ""; - } + if (cell.getCellType() == CellType.STRING) { + cellValue = cell.getStringCellValue(); + } else if (cell.getCellType() == CellType.NUMERIC) { + cellValue = String.valueOf(cell.getNumericCellValue()); } else { cellValue = ""; } PdfPCell cellPdf = new PdfPCell(new Phrase(cellValue, getCellStyle(cell))); - // Set background color - short bgColorIndex = cell.getCellStyle() - .getFillForegroundColor(); - if (bgColorIndex != IndexedColors.AUTOMATIC.getIndex()) { - XSSFColor bgColor = (XSSFColor) cell.getCellStyle() - .getFillForegroundColorColor(); - if (bgColor != null) { - byte[] rgb = bgColor.getRGB(); - if (rgb != null && rgb.length == 3) { - cellPdf.setBackgroundColor(new BaseColor(rgb[0] & 0xFF, rgb[1] & 0xFF, rgb[2] & 0xFF)); - } - } - } - - cellPdf.setHorizontalAlignment(Element.ALIGN_CENTER); + setBackgroundColor(cell, cellPdf); + setCellAlignment(cell, cellPdf); table.addCell(cellPdf); } } } - private static Font getCellStyle(Cell cell) throws DocumentException, IOException { - Font font = new Font(Font.FontFamily.HELVETICA, 12); + private static void setBackgroundColor(Cell cell, PdfPCell cellPdf) { + // Set background color + short bgColorIndex = cell.getCellStyle() + .getFillForegroundColor(); + if (bgColorIndex != IndexedColors.AUTOMATIC.getIndex()) { + XSSFColor bgColor = (XSSFColor) cell.getCellStyle() + .getFillForegroundColorColor(); + if (bgColor != null) { + byte[] rgb = bgColor.getRGB(); + if (rgb != null && rgb.length == 3) { + cellPdf.setBackgroundColor(new BaseColor(rgb[0] & 0xFF, rgb[1] & 0xFF, rgb[2] & 0xFF)); + } + } + } + } + + private static void setCellAlignment(Cell cell, PdfPCell cellPdf) { CellStyle cellStyle = cell.getCellStyle(); - org.apache.poi.ss.usermodel.Font cellFont = cell.getSheet().getWorkbook().getFontAt(cellStyle.getFontIndexAsInt()); + + HorizontalAlignment horizontalAlignment = cellStyle.getAlignment(); + VerticalAlignment verticalAlignment = cellStyle.getVerticalAlignment(); + + switch (horizontalAlignment) { + case LEFT: + cellPdf.setHorizontalAlignment(Element.ALIGN_LEFT); + break; + case CENTER: + cellPdf.setHorizontalAlignment(Element.ALIGN_CENTER); + break; + case JUSTIFY: + case FILL: + cellPdf.setVerticalAlignment(Element.ALIGN_JUSTIFIED); + break; + case RIGHT: + cellPdf.setHorizontalAlignment(Element.ALIGN_RIGHT); + break; + } + + switch (verticalAlignment) { + case TOP: + cellPdf.setVerticalAlignment(Element.ALIGN_TOP); + break; + case CENTER: + cellPdf.setVerticalAlignment(Element.ALIGN_MIDDLE); + break; + case JUSTIFY: + cellPdf.setVerticalAlignment(Element.ALIGN_JUSTIFIED); + break; + case BOTTOM: + cellPdf.setVerticalAlignment(Element.ALIGN_BOTTOM); + break; + } + } + + private static Font getCellStyle(Cell cell) throws DocumentException, IOException { + Font font = new Font(); + CellStyle cellStyle = cell.getCellStyle(); + org.apache.poi.ss.usermodel.Font cellFont = cell.getSheet() + .getWorkbook() + .getFontAt(cellStyle.getFontIndexAsInt()); short fontColorIndex = cellFont.getColor(); if (fontColorIndex != IndexedColors.AUTOMATIC.getIndex() && cellFont instanceof XSSFFont) { @@ -138,6 +209,7 @@ public class ExcelToPDFConverter { } } } + if (cellFont.getItalic()) { font.setStyle(Font.ITALIC); } @@ -156,6 +228,16 @@ public class ExcelToPDFConverter { if (cellFont.getBold()) { font.setStyle(Font.BOLD); } + + String fontName = cellFont.getFontName(); + if (FontFactory.isRegistered(fontName)) { + font.setFamily(fontName); // Use extracted font family if supported by iText + } else { + logger.warn("Unsupported font type: {}", fontName); + // - Use a fallback font (e.g., Helvetica) + font.setFamily("Helvetica"); + } + return font; } diff --git a/pdf-2/src/main/resources/excelsample.xlsx b/pdf-2/src/main/resources/excelsample.xlsx index fb83598a71b1b53eed3538c0f6182cd1aca76f48..771d312ae0146760a9f537e3eb71272b9df79a07 100644 GIT binary patch delta 3732 zcmZ8kS3I2UwjV@~-bRbwdx_pVgGBFL)M1R?Uj`8(+7MkNN_2uCYGibx_lVx3M&}F1 zxA)oQoabg;to2(r|F)i2nwMI&e{cY4xk9IW3=rrF2LvJlfk1&!fdH7dyFCo%&L8Lj ztu*q06-p4_g-`s!?hbGpw!m>~(L!G|ato+{Hn!gyO4=eQzUF#l8&2O{(jt=^b0)cF z+c`fuj2>TQWjPOTezdZperBlAn-do&0G%w*>GheZ-HF&il)zef?Uf14w~|!>P=WmWj1Kbw@wm;=WOE%24-hoA&X(^g8d+$n1%m1+;YU_Ad!^RGEIa3`eeP!xNc zDM(|Cqr^SXkqtpqhnHyD#RF~xXb7Sjf~!=L+lW3~t9vE}`I*(mFC7)TCpZ4lcC#uQ z6y;_%N)=H(jgv&MEl&i{esFiDulO1-5Fezih0fHj1`xwE}9T$)6 zw0TrjmC5r?)glRr;D0K&g7{Nn5c4FkzV6prA~B-LD`jWDVP^_# z2=k11q%M?B+hcJ?Yw)5;socO)P+xOuD`u0CtIpazS#dx*MK5lNGc&hw2pAI_@U<5w;QA+c8rNXUNf3xjJDZ@UmTJ{oK~w zJJWxzX8h{sTs)Zoj(*7g=){WjBNhbbdXd4VA~{X4eQ-ep*(BdQ0VPzOe#pkPZ7w#c zc$?v6*M${!Wld*@TGMYMxnS4*C#J~LDnh#rMZ;0lf}fJ9ClK-rW5`HSh+bfd|F(UZ z%OXR8IySMeRaGK;p*s{V>nxQBhklv!;p4dIHI^Wh;c58OP0Qvgb$*af8jLFIbd9u- zr`1`ew^7lJfuo9q5Bsxez@7nNOqaOg1SGrb-F}I;2tpj{GGUj;vge6Rjd`Cg3Z(s5 zjO3%(sReuT0a^NahtWE+*`_wHebe{bQZtLM^ST+>;KHYVRc8>E8~N&yj;9}1J&MfU zs+1Np&SNdv;hPV?dIUefK<|JJjQr*0)T%HJ5h}$`@^BZ6YPf;#-LTM&lF5g$RiFgq z0^u>GKsM>L;{9&;;cUv2Nz@^{ehx;bbx}=Js9Jd{6CQZ8OxLM&Mj<;X*)Bf`zq|Gi z3Mo0#sS6F&81>6v8d=-DzMJf^zu6YPc91~-@t|I7TAbk`*Q{aR&uz9g`#z)XvvR%Ttu2l-EGZNeGHOe2Uh{qvNipbnGj2mv zCaZ2-EI2AemfH>NXmFqLU;k+;)mK+L42b5$XAGn$%+tRuUN@XiOlxi-3Hi1PVRDS4 z@ZFp#yGUJWn?P!9T~$l_X=zKk5x;#QhE>%4`_vBR{9(~SRXk14Pt>%ZyM8m4kBSrq zeqPlMayCBDDTYng`Pf%FhiheP>cuJj1XZ)dBb+vJ55ECs5)!{sK-W^N0=|~_n){#I zNV&XNgNj;0IpgrUj9$E0`)ZU>;LSd_>CE48YzQFmnhH}(Z`@?;7NbqZltWk=zq!`lTTk88mhn@1v{H3dll0#$%$7N{5G#k)R114TuLj{jR%jka8|kJd>ThZPD$rD;xg|=2}u$5UjUP}V}DInDPWA($XDuf`$5zvyAL9?pRIHhIpip8 zB4v=3r;~qAny{7KbK&27q~yp|-c)_Cbk$`qlmi6aWPPV1d(-Z!Zjg`6-Vn;p#@u`S zVJu`+P)q--K`|Y4QD?DNb;aI%)Hj2L%Qb}Ka4FT?`PyKq0Xh@Y zLj=4qFDFV4mf-l@@2Arr^aJWWr^Kt(ylLKzEye2XFQ-?47RAFB1!DMHSYy}lIYL{b!#I`^JM{HV+u+>nB~hA z7x;Px^toJMU5lIJ?MWu@aG-~!nnUiN_3j`$f@>plp@eB&Xt(rmtl_r9&85HkIK$ou zVs{PT?%gsDm#X?`=}x+NxNVKw;n2Fk%(}J`Y#HcC z3x(WuH1)WQx$e-CfEJVw@qxV#BH3BphvnD?GELi)nl2yTZ`XY6+T+(op>tT#2Kl!qa>D-8-9DUp~LklQ5>_z4?|KGQA~7tdE^x0 z(b$OY^$7RPch^nJ93dxF%yX_ecB%S4j`MLz6#CyjM=E36Nj{<8M+gfoD~9Y z;Vq6(=kv#-2|$2Lzo4!>*es;S(web9HqRfLKXaL8w&!!-O_WU|WvkoPDI~C&&Aenv z_`--CWfFbqQoB0~%S|I!v#^q47}zI2^|;}JP*YJ&c-#fpeaoZ{OtC_%Dc$j4ido0! z0b0JP!J^ryOfOrt8Bs}7&Mu1q#v z<>#?47~W+bmec0U8NIo?=C_00XOi{J+7w`|f@GDnS}rWz+YiL#*7YM)e!zBKU2HFF z`$vvA&tBUePhB2!D9p%yA?(ZLB;Ql@>-Q6=vkT|*q5efp9Mqe>b zi(xC0b9GK|GcGK3xHtA*&^(Q_d6h?U=Y%~z(&TEsQTy2H_Ua1niOJhq+dH~Lkwq&! z%0pt zppHvJ``Nh;FOrqkobb#-5K4{)0@*xZL=HkOvrq!i2^|PZff#G0bp-%lc#64xE@kC1 zCy{rfu)s`G78ZLwKi|S&f8TBqOx&3DLq-5YL~!%WS!W4?JDB(U(rT;n zd^Un9k+f(J%jEvV#!+&9qPLqHD=}0}ns=E4;j)@cQOn38fNRUWnci`5pPlgFwfiN- zTmyti4xYwMm6|FzpxV}Jm_!#!o(|~!BDGj zqhm({Y#=B>@}6bPPUV4+9QGc0d=G5y5N}3_tSidY)~dN8ra1pU7bORk>DMa|#>?E> zp)VO5Lxtsq&uXjPd?PhdKj1XDI2K=G2G3WnS&&PPe%|mae6K(+(ZDMp;BA-b!Yec1 z8*xt2%$eNa@Qr+DrQHrJ4F~mDkwRYtEZ<76$V@Z zY}<`UP+}D$Jg$P)-^PB&OBXFR({{;Sg6a=)+MVrH0kPY|q delta 3489 zcmZ9PbwJZy`^HCy64K2^N+XgYN>4^QVzhuXqZN=EqhsV3kPbmWX#ok@NRd#KZk&K% zA(Eqcd7k$d&-D{oi`Qv5qeMxDFP@=EK%h^QAP^l01PVe*1$z5= zICy(|NCtT#YfQ(y$`qNx9=Kf)Z5#BYKq6pJdR40zg|#xd0fZNRJyd2yF3E0i)7`BQ zef4<*?J}fGS%1pr$hH!JCx6#)p+deW=U1C6KVzX%MbEr?W~YtT`iz#>QN@_Ze0DPn zN+RjK%XDtBWcbBqDF51O6n!c=sM*HR3|6bL@H;V4u34GUW4d=3J{T*?Hk`FoD_G`) zxKWWeKajFINAtC|U4!zg2%AIu8kw%vm_m)IGX0SI%ZPBq_G5)-a&JX^XtGkz=0!D| z$m1z&{r7K2RqATch~AzR`?@_7o(v0<@7t_ zsa%|;fg-a!8+cg(2i=4I$24>`|nqMeu}ZJi3t4cfMf|>Y&e{&=?PGU{(gYhkf$C-l07O zt$KsCgY6-%^)JI39-c#f=B~9`NcCKFh7nD@d3>@MtaY>_Aw3 zD{aKCdWy({dxY6cR8k+Zo=7iVtq$xoF?DoU0s0nsG4-M)n9!PHk_!)%d-{tinz5@VZLV{HJqWdnix3TRx0KUZfn`s zQWjX0b*yRyo(ghM-{NCxmhAr1!ATsphF66))OP%s{1i2#D6Q3>P-&nlE}Y-Sf*v=& zlWXUp4KHY)5dXk{n1P|XuJ&H6!nnkFQ@q(fym|(g5Rl;cvLx#=5*=VyR|v+RWFuFO zso1Ej1fcC&MtE}_Vz%5h(APd)j3_pGT~ss!gOOuo@7Og?(&fmEF#20P3`2t0zk=-GapF;MyL-R_f9 z0^f}Bqbta{Sc)Za@uit)>@-L zVc@+bB1Z{!EM5(H*wL~@*jHgL?}Bq@{i!syq$e@P?w%MJkM9Mf2(htieWC-oN{ZqbO>B4*00R<9rXU!d2# zCv569!YSKkOHJk^YbEvlGx)l{J1pno6++B0xlimW$&l7FLOHda_M z17APB`pQrech#<-c*ob?n2uD7JZ8j5LN}+xEi~{Ocw1m{_6E9O8POb=$JKlN=zt8n zQqw3NFtht85NfM0BgA>@lhC^tj3+nivlsm^ag zPUK!j1wO~1Q9G87H2lhfRIM#5Z4MkDq`p#D%gjjECjYNeEk7xk{W3_UtqPf?M2nu0 z<=P%dcw1bSJbQCi(C9qeT((*Gw9+iDduzAcp!(YPTj32cPej`d?X_IQ*+vx(NvET) z9&|-^wt+_uBh81%8pp3VV1voClT_o|E$r@6|1^%^Lxp@@Ka^Uy;oH_(3D%e@^6gu5 zQRk4(|56}Ocg(qP*0!f)fwp#Y)je2TEDT>iynPPHBc;I2LbY9UQ8KiA?>4rr@<;65 zM`*a;FYtH;9X`W4E1hpS@4B~OMfknhk=eGLB?+xCc`K=edW8kgcIs#N;|mMA0}}2W z4|a&BO<&NG|F?;~=DCE^O^fW+Imhy?M8Qu*{tvX={y-VXZQCi;r3{9~ttyiG#Q^E~ zitTkF5rCbrmRo3vkNYyaYq2vlFRi8oKp$|c$Ucn(?2cpf521#K8{wUYlz$NhhzZa) zZPR;GP#+922{&D$Hb@1yvw=}_Df!Y&v0GyM+~S{`V$&kjwJkCOe!r}n8Q_X!#uzWm znd~oxL_iot#;?7N@O;>hC$R`{uJ05N$D&A9_WPCk{C(N4=CG9ak99U6$+~4O$dj(^BBrF0n6^1aW@js+oBDL6KjWRO1j%iac43N zO>B6U$&PqnPPjBNK+}M5f1vE(qo08=xKAxcv^L4Ho^W*Mv|so3Kz;eiA#X2fdgYhv z^TfDky@YlqOnuECW|VxeusE)F{?Ye6a3bbBS1)@afj4e+l2cTYKLPo9fcE z7hA(SiIzCV&4-&-egwbHdOO7ij0G55T2I?4zP{115nFo|At$q~TkcxV9{^D%Z0`-u zawn^!n4%xT4tvZ6DQa1Fm+6yc*jIvrw*~!H6?>b@>}dzQG=C1~(~DbD^!P^TE#dD% zau#VLS3y)usPCLNf^2Bdi9n!>i_74>xX8@3@rshBkFJjl1$D1WY0knuB_prHi^fI4 z^UJt5%hdTXFe<}z6?RELSmFfCvC@gncr3nMg(ghLiRX~ zh7NA4w>WjnR@5MkjW=GcP`&&a-~owIPRmKQq6;m@FhC+HTaY*a+ITwhFTn7eKul74)*$h7z>GLQQUM zKyXfogwc~PaM;YF@-Zi8aLUk|MvgG#ra?y!!|OW!osOrdrrX83$%$mLLJg_@8^pxb zA5};0R_Rv$7@zR~vc_kgFSd5=A+28dpnzi;Mej$L=_(PL)`5q`E6lC@HPYqhs_*$1 zb0-mMN1+o&KMV)a!LyD&$-Itq)0>|T67hmj`V$ryDEBYKT4SPHk^b&?*<$_O zBiWA^76bJpbtuqZi9}WwP!XlkRK+bsgfi6am!^Na75TYzZCU8Uaq6c4H77$!N;4*J zNbZt^yxYBJOW`3C0j*{;QBPIZu}5D&q#@f8kN2piO_N9O=g~8vS(0n^$Eupp%Gol!f$C0+u;r8yS_276p4squShRR#11W zH(59(mycMa1=py>{#g5c^rgdm(A1T6NngKN z`7+d{S1+#3|20#YVmqNO597HYwCNCkZKv|^@!20)3PRcF^{ z$A5)%*6X;xo7n^g10+=c_tybB`DHo(d#Adj z`+rU$a7Ex2F(o~)Mb8Xa3(#}@|4aaZ*#1}b_Z`Oyc(HK+YnP(`wDLbyKAe}v7UKH* iK`*`j@Y3to{#ggT-~#9cRfzd{0YgDP@*T)u#eV@RY>OZO diff --git a/pdf-2/src/main/resources/pdfsample.pdf b/pdf-2/src/main/resources/pdfsample.pdf index f646f54db7a6a37969462df2da737e4eb4e949c4..320931762ae109d8c8a23e77131b969818f8a054 100644 GIT binary patch delta 1023 zcmdnavypd#V!gSkp}t#YPDyH!zFSUWNvca~a(+sxon3KBQEFl?SH+yE;irRc8;IQf zt^ID2UO?&BEz=z4PYF_(cdq1RCeMDRhl zx;A}Xn-5DkWvcNdc|47%6>!cx8qy}%ruX2^?~gY(oBlb?TRv&Qp9^j#_C11Uz2z?M z*>iH5$~&Pa>Gk14jcT4Ov+7j@GbXtd@=BP4(_$5_-bo(o^0VAetp61Y zR0CGBz*FexSKqC=J6(V*uvV48nEO}WPiRtM@}0zC;;D2&rSs9RWj~S<(kg?2W5x?vG z$)aC8;%{daI9SvlEA3p*yZUp?S=P;}uk!*Qfk7h4*dCC7b(ZAkfnRoSu1&cPY z9}hVH=4be{qxbU<-Ojd^nbDkk>EI%#=T}!fOp`lj`@gIE-^AF-FXJwzBvqVDne}&X z?7H2SJ`!`b)tjgL-OJw9b5pp8HS1u4iuk6==7VlFsLteE)l`^<5Ej(Je76B_{f0YGu6o7V?Lkt%FT`^HwG{CJkdl z17jmoOKk%Sbpr!+O?}_|6c=Cy(QvUcGB7eWG%|!LnEaT(h8AWRVnB-~PhmB8N;66|GE6csPf0Z~F|#l=G&4&w kPcunLv$QlaNU}&Yva=ziVlpqA0++F+A(yJEtG^o;0Fu|Xq5uE@ delta 879 zcmdnUyPao(V!fG>rM_EcPDyH!zFSUWNvca~a(+sxon3KBQEFl?SH+y(u+u@e9R&8g z)_&%}H}B1x>VAiLEfW}4-3i@j;P*#^Wt~X<{7COIo^NX&ck6upwxueq+MEAsWUM5A zVC9PAqOSd#2RzzqzJFt8bY1a&)#UuUJKjDh`t^h5{%lX~FU#uxh4!{R)zS|$P}=+N z`@VJSR=0aC{C3Z{>l&NhdV?P?cuOXGEpOm!;&Nz{x4s~?Yum2q&n7Vi8~e|ce^B2a zop5PGUrk)Ob;6U{I*muoJuK0(f#M%@a_@?Dw=YqxnK11^@0OPI%(%G)?;oY- zYzvD-1yl|>%wcB#x`%)7xrO1`GagqJZ9OuloOQCyJK1Gnf|Z4hx8!B!-P zvwmMyP1L!aM?#JB`NcOXD!zZ_G_mUEl{0*kCp)HEcC38<%2sb-{iHq7PuAVska}zS znc$#5$_IBoJUMgHhnGozc&4BAGLYq*to>1T`?eQ1C%9bQls?aV>WaOYv1YoL^=}=0 zBx$F6dRb~+$BeFJCp|-yXD)kUAm5d_d+#H~^KKtjhMwt`CzcK9#I@VgDBH6Z^W8?|mv~>b286EAFf|qi(%a ziR*vG4$jJl`|Il_+uJ1BMYYRqIJ4)HjM}Exvm@4UPd*09bxUui#(w?JtGyb!7zwvb1tk2BG#BO9@VQOJyHra+%3eJvYH50cm zHc~JE0fjsTE-=Huz|zQc@+wwUdjmsb3^{W{Lv%4i12Yp0F+&5($$V_)P6nn)#wp3k xsg|Y|7OBQ5sb*=(rb(6t21%C2mc}W@X?8Y*R7`GXQ{XZ(v*c1$b@g}S0s!cQhMoWb From 0323a8168c7ecf9f0991c5c0116272ba95734be3 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Wed, 13 Dec 2023 04:38:31 +0100 Subject: [PATCH 213/294] [sum-intarray-recursion] two recursion approaches to summing int-array (#15385) --- core-java-modules/core-java-lang-6/pom.xml | 16 +++++ .../RecursivelySumIntArrayUnitTest.java | 38 ++++++++++++ .../SumArrayBenchmark.java | 61 +++++++++++++++++++ 3 files changed, 115 insertions(+) create mode 100644 core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/RecursivelySumIntArrayUnitTest.java create mode 100644 core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/SumArrayBenchmark.java diff --git a/core-java-modules/core-java-lang-6/pom.xml b/core-java-modules/core-java-lang-6/pom.xml index 54035c1eb0..a47ed459f6 100644 --- a/core-java-modules/core-java-lang-6/pom.xml +++ b/core-java-modules/core-java-lang-6/pom.xml @@ -23,6 +23,16 @@ commons-lang3 ${commons-lang3.version} + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + @@ -39,6 +49,11 @@ mapstruct-processor ${mapstruct.version} + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + @@ -50,6 +65,7 @@ 17 UTF-8 1.6.0.Beta1 + 1.37 \ No newline at end of file diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/RecursivelySumIntArrayUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/RecursivelySumIntArrayUnitTest.java new file mode 100644 index 0000000000..fc61a806e1 --- /dev/null +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/RecursivelySumIntArrayUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.recursivelysumintarray; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class RecursivelySumIntArrayUnitTest { + + private static final int[] INT_ARRAY = { 1, 2, 3, 4, 5 }; + + static int sumIntArray1(int[] array) { + if (array.length == 1) { + return array[0]; + } else { + return array[0] + sumIntArray1(Arrays.copyOfRange(array, 1, array.length)); + } + } + + static int sumIntArray2(int[] array, int index) { + if (index == 0) { + return array[index]; + } else { + return array[index] + sumIntArray2(array, index - 1); + } + } + + @Test + void whenUsingSumIntArray1_thenGetExpectedResult() { + assertEquals(15, sumIntArray1(INT_ARRAY)); + } + + @Test + void whenUsingSumIntArray2_thenGetExpectedResult() { + assertEquals(15, sumIntArray2(INT_ARRAY, INT_ARRAY.length - 1)); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/SumArrayBenchmark.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/SumArrayBenchmark.java new file mode 100644 index 0000000000..7d6a612a8d --- /dev/null +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/SumArrayBenchmark.java @@ -0,0 +1,61 @@ +package com.baeldung.recursivelysumintarray; + +import static com.baeldung.recursivelysumintarray.RecursivelySumIntArrayUnitTest.sumIntArray1; +import static com.baeldung.recursivelysumintarray.RecursivelySumIntArrayUnitTest.sumIntArray2; + +import java.util.Random; +import java.util.concurrent.TimeUnit; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +@BenchmarkMode(Mode.AverageTime) +@State(Scope.Thread) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@Warmup(iterations = 2) +@Fork(1) +@Measurement(iterations = 5) +public class SumArrayBenchmark { + + public static void main(String[] args) throws Exception { + Options options = new OptionsBuilder().include(SumArrayBenchmark.class.getSimpleName()) + .build(); + new Runner(options).run(); + } + + @Param({ "10", "10000" }) + public int size; + int[] array; + + @Setup + public void setup() { + var r = new Random(); + array = new int[size]; + + for (int i = 0; i < size; i++) { + array[i] = r.nextInt(); + } + } + + @Benchmark + public int withArrayCopy() { + return sumIntArray1(array); + } + + @Benchmark + public int withoutArrayCopy() { + return sumIntArray2(array, array.length - 1); + } +} \ No newline at end of file From 8daf19c9ec9595c41120404a4bf22122c4918344 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 13 Dec 2023 09:40:13 +0200 Subject: [PATCH 214/294] [JAVA-22519] Created new module libraries-stream and added 5 articles (#15403) --- asm/README.md | 7 - asm/pom.xml | 54 --- libraries-2/README.md | 3 - libraries-2/pom.xml | 24 -- libraries-3/README.md | 2 - libraries-3/pom.xml | 19 +- libraries-4/README.md | 2 - libraries-4/pom.xml | 36 +- libraries-5/README.md | 2 - libraries-5/pom.xml | 16 - libraries-6/README.md | 1 - libraries-6/pom.xml | 6 - libraries-bytecode/.gitignore | 9 + libraries-bytecode/README.md | 9 + libraries-bytecode/pom.xml | 85 +++++ .../com/baeldung}/asm/CustomClassWriter.java | 320 +++++++++--------- .../asm/instrumentation/Premain.java | 4 +- .../main/java/com/baeldung/bytebuddy/Bar.java | 0 .../main/java/com/baeldung/bytebuddy/Foo.java | 0 .../java/com/baeldung/javasisst/Point.java | 0 .../javasisst/ThreeDimensionalPoint.java | 0 .../src/main/resources/logback.xml | 0 .../baeldung/bytebuddy/ByteBuddyUnitTest.java | 19 +- .../baeldung/javassist/JavasisstUnitTest.java | 0 libraries-cli/.gitignore | 9 + libraries-cli/README.md | 9 + libraries-cli/pom.xml | 69 ++++ .../com/baeldung/airline/CommandLine.java | 0 .../airline/DatabaseSetupCommand.java | 0 .../com/baeldung/airline/LoggingCommand.java | 0 .../jcommander/helloworld/HelloWorldApp.java | 0 .../usagebilling/UsageBasedBillingApp.java | 0 .../cli/FetchCurrentChargesCommand.java | 11 +- .../usagebilling/cli/SubmitUsageCommand.java | 13 +- .../usagebilling/cli/UsageBasedBilling.java | 0 .../converter/ISO8601TimestampConverter.java | 6 +- .../cli/splitter/ColonParameterSplitter.java | 4 +- .../cli/validator/UUIDValidator.java | 4 +- .../model/CurrentChargesRequest.java | 8 +- .../model/CurrentChargesResponse.java | 8 +- .../usagebilling/model/UsageRequest.java | 8 +- .../DefaultFetchCurrentChargesService.java | 16 +- .../service/DefaultSubmitUsageService.java | 4 +- .../service/FetchCurrentChargesService.java | 0 .../service/SubmitUsageService.java | 0 .../com/baeldung/picocli/git/Application.java | 10 +- .../git/commands/declarative/GitCommand.java | 13 +- .../git/commands/methods/GitCommand.java | 4 +- .../commands/programmative/GitCommand.java | 12 +- .../commands/subcommands/GitAddCommand.java | 4 +- .../subcommands/GitCommitCommand.java | 4 +- .../subcommands/GitConfigCommand.java | 7 +- .../picocli/git/model/ConfigElement.java | 0 .../picocli/helloworld/HelloWorldCommand.java | 4 +- libraries-cli/src/main/resources/logback.xml | 13 + .../helloworld/HelloWorldAppUnitTest.java | 5 +- .../FetchCurrentChargesCommandUnitTest.java | 7 +- .../cli/SubmitUsageCommandUnitTest.java | 9 +- libraries-reporting/.gitignore | 9 + libraries-reporting/README.md | 8 + libraries-reporting/pom.xml | 75 ++++ .../java/com/baeldung/jasperreports/Main.java | 0 .../jasperreports/SimpleReportExporter.java | 0 .../jasperreports/SimpleReportFiller.java | 0 .../config/JasperRerportsSimpleConfig.java | 0 .../com/baeldung/yarg/DocumentController.java | 17 +- .../src/main/resources/employee-schema.sql | 0 .../main/resources/employeeEmailReport.jrxml | 0 .../src/main/resources/employeeReport.jrxml | 0 .../src/main/resources/logback.xml | 13 + libraries-stream/.gitignore | 9 + libraries-stream/README.md | 11 + libraries-stream/pom.xml | 59 ++++ .../distinct/DistinctWithJavaFunction.java | 0 .../java/com/baeldung/distinct/Person.java | 0 .../main/java/com/baeldung/streamex/Role.java | 0 .../java/com/baeldung/streamex/StreamEX.java | 1 + .../main/java/com/baeldung/streamex/User.java | 0 .../src/main/resources/logback.xml | 13 + ...istinctWithEclipseCollectionsUnitTest.java | 0 .../DistinctWithJavaFunctionUnitTest.java | 2 +- .../DistinctWithStreamexUnitTest.java | 0 .../distinct/DistinctWithVavrUnitTest.java | 0 .../distinct/PersonDataGenerator.java | 0 .../ParallelCollectorsUnitTest.java | 0 .../protonpack/ProtonpackUnitTest.java | 21 +- .../stream/JoolMergeStreamsUnitTest.java | 0 .../baeldung/stream/MergeStreamsUnitTest.java | 0 .../StreamExMergeStreamsUnitTest.java | 7 +- libraries/README.md | 2 - libraries/pom.xml | 12 - pom.xml | 10 +- 92 files changed, 718 insertions(+), 430 deletions(-) delete mode 100644 asm/README.md delete mode 100644 asm/pom.xml create mode 100644 libraries-bytecode/.gitignore create mode 100644 libraries-bytecode/README.md create mode 100644 libraries-bytecode/pom.xml rename {asm/src/main/java/com/baeldung/examples => libraries-bytecode/src/main/java/com/baeldung}/asm/CustomClassWriter.java (96%) rename {asm/src/main/java/com/baeldung/examples => libraries-bytecode/src/main/java/com/baeldung}/asm/instrumentation/Premain.java (88%) rename {libraries-5 => libraries-bytecode}/src/main/java/com/baeldung/bytebuddy/Bar.java (100%) rename {libraries-5 => libraries-bytecode}/src/main/java/com/baeldung/bytebuddy/Foo.java (100%) rename {libraries => libraries-bytecode}/src/main/java/com/baeldung/javasisst/Point.java (100%) rename {libraries => libraries-bytecode}/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java (100%) rename {asm => libraries-bytecode}/src/main/resources/logback.xml (100%) rename {libraries-5 => libraries-bytecode}/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java (93%) rename {libraries => libraries-bytecode}/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java (100%) create mode 100644 libraries-cli/.gitignore create mode 100644 libraries-cli/README.md create mode 100644 libraries-cli/pom.xml rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/airline/CommandLine.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/airline/DatabaseSetupCommand.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/airline/LoggingCommand.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/helloworld/HelloWorldApp.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/UsageBasedBillingApp.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java (99%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java (99%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/cli/UsageBasedBilling.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java (70%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java (91%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java (89%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/service/FetchCurrentChargesService.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/service/SubmitUsageService.java (100%) rename {libraries-2 => libraries-cli}/src/main/java/com/baeldung/picocli/git/Application.java (99%) rename {libraries-2 => libraries-cli}/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java (99%) rename {libraries-2 => libraries-cli}/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java (100%) rename {libraries-2 => libraries-cli}/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java (99%) rename {libraries-2 => libraries-cli}/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java (100%) rename {libraries-2 => libraries-cli}/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java (100%) rename {libraries-2 => libraries-cli}/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java (99%) rename {libraries-2 => libraries-cli}/src/main/java/com/baeldung/picocli/git/model/ConfigElement.java (100%) rename {libraries-2 => libraries-cli}/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java (100%) create mode 100644 libraries-cli/src/main/resources/logback.xml rename {libraries-3 => libraries-cli}/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java (99%) rename {libraries-3 => libraries-cli}/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java (99%) rename {libraries-3 => libraries-cli}/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java (95%) create mode 100644 libraries-reporting/.gitignore create mode 100644 libraries-reporting/README.md create mode 100644 libraries-reporting/pom.xml rename {libraries-2 => libraries-reporting}/src/main/java/com/baeldung/jasperreports/Main.java (100%) rename {libraries-2 => libraries-reporting}/src/main/java/com/baeldung/jasperreports/SimpleReportExporter.java (100%) rename {libraries-2 => libraries-reporting}/src/main/java/com/baeldung/jasperreports/SimpleReportFiller.java (100%) rename {libraries-2 => libraries-reporting}/src/main/java/com/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java (100%) rename {libraries-4 => libraries-reporting}/src/main/java/com/baeldung/yarg/DocumentController.java (99%) rename {libraries-2 => libraries-reporting}/src/main/resources/employee-schema.sql (100%) rename {libraries-2 => libraries-reporting}/src/main/resources/employeeEmailReport.jrxml (100%) rename {libraries-2 => libraries-reporting}/src/main/resources/employeeReport.jrxml (100%) create mode 100644 libraries-reporting/src/main/resources/logback.xml create mode 100644 libraries-stream/.gitignore create mode 100644 libraries-stream/README.md create mode 100644 libraries-stream/pom.xml rename {libraries-4 => libraries-stream}/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java (100%) rename {libraries-4 => libraries-stream}/src/main/java/com/baeldung/distinct/Person.java (100%) rename {libraries-5 => libraries-stream}/src/main/java/com/baeldung/streamex/Role.java (100%) rename {libraries-5 => libraries-stream}/src/main/java/com/baeldung/streamex/StreamEX.java (99%) rename {libraries-5 => libraries-stream}/src/main/java/com/baeldung/streamex/User.java (100%) create mode 100644 libraries-stream/src/main/resources/logback.xml rename {libraries-4 => libraries-stream}/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java (100%) rename {libraries-4 => libraries-stream}/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java (100%) rename {libraries-4 => libraries-stream}/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java (100%) rename {libraries-4 => libraries-stream}/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java (100%) rename {libraries-4 => libraries-stream}/src/test/java/com/baeldung/distinct/PersonDataGenerator.java (100%) rename {libraries-2 => libraries-stream}/src/test/java/com/baeldung/parallel_collectors/ParallelCollectorsUnitTest.java (100%) rename {libraries-6 => libraries-stream}/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java (99%) rename {libraries => libraries-stream}/src/test/java/com/baeldung/stream/JoolMergeStreamsUnitTest.java (100%) rename {libraries => libraries-stream}/src/test/java/com/baeldung/stream/MergeStreamsUnitTest.java (100%) rename {libraries-5 => libraries-stream}/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java (99%) diff --git a/asm/README.md b/asm/README.md deleted file mode 100644 index e10cdc45bd..0000000000 --- a/asm/README.md +++ /dev/null @@ -1,7 +0,0 @@ -## ASM - -This module contains articles about ASM - -### Relevant Articles: - -- [A Guide to Java Bytecode Manipulation with ASM](https://www.baeldung.com/java-asm) diff --git a/asm/pom.xml b/asm/pom.xml deleted file mode 100644 index 4edfe86ae5..0000000000 --- a/asm/pom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - 4.0.0 - com.baeldung.examples - asm - 1.0 - asm - jar - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - org.ow2.asm - asm - ${asm.version} - - - org.ow2.asm - asm-util - ${asm.version} - - - - - - - org.apache.maven.plugins - maven-jar-plugin - ${maven-jar-plugin.version} - - - - - com.baeldung.examples.asm.instrumentation.Premain - - - - - - - - - - 5.2 - - - \ No newline at end of file diff --git a/libraries-2/README.md b/libraries-2/README.md index 8dae12a1cf..3eb788a34a 100644 --- a/libraries-2/README.md +++ b/libraries-2/README.md @@ -10,13 +10,10 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m ### Relevant articles - [A Guide to jBPM with Java](https://www.baeldung.com/jbpm-java) - [Guide to Classgraph Library](https://www.baeldung.com/classgraph) -- [Create a Java Command Line Program with Picocli](https://www.baeldung.com/java-picocli-create-command-line-program) -- [Guide to Java Parallel Collectors Library](https://www.baeldung.com/java-parallel-collectors) - [Templating with Handlebars](https://www.baeldung.com/handlebars) - [A Guide to Crawler4j](https://www.baeldung.com/crawler4j) - [Key Value Store with Chronicle Map](https://www.baeldung.com/java-chronicle-map) - [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) [[next -->]](/libraries-3) diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml index d9b0545d54..9eff129a63 100644 --- a/libraries-2/pom.xml +++ b/libraries-2/pom.xml @@ -18,11 +18,6 @@ mapdb ${mapdb.version} - - com.pivovarit - parallel-collectors - ${parallel-collectors.version} - io.github.classgraph classgraph @@ -41,11 +36,6 @@ - - info.picocli - picocli - ${picocli.version} - org.springframework.boot spring-boot-starter @@ -83,17 +73,6 @@ mesos ${mesos.library.version} - - net.sf.jasperreports - jasperreports - ${jasperreports.version} - - - commons-logging - commons-logging - - - org.hsqldb hsqldb @@ -133,14 +112,11 @@ 3.0.8 4.8.153 7.20.0.Final - 4.7.0 3.24ea1 4.4.0 2.7.8 1.11.0 - 1.1.0 4.3.1 - 6.20.0 5.3.25 2.7.1 diff --git a/libraries-3/README.md b/libraries-3/README.md index 99b1b60a0a..faef721a22 100644 --- a/libraries-3/README.md +++ b/libraries-3/README.md @@ -8,9 +8,7 @@ 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: -- [Parsing Command-Line Parameters with JCommander](https://www.baeldung.com/jcommander-parsing-command-line-parameters) - [Guide to the Cactoos Library](https://www.baeldung.com/java-cactoos) -- [Parsing Command-Line Parameters with Airline](https://www.baeldung.com/java-airline) - [Introduction to cache2k](https://www.baeldung.com/java-cache2k) - [Introduction to the jcabi-aspects AOP Annotations Library](https://www.baeldung.com/java-jcabi-aspects) - [Introduction to Takes](https://www.baeldung.com/java-takes) diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml index 9923e46267..bff0a654c6 100644 --- a/libraries-3/pom.xml +++ b/libraries-3/pom.xml @@ -13,21 +13,11 @@ - - com.beust - jcommander - ${jcommander.version} - org.projectlombok lombok ${lombok.version} - - com.github.rvesse - airline - ${airline.version} - org.cactoos cactoos @@ -125,7 +115,7 @@ javax.annotation javax.annotation-api - 1.3.2 + ${javax.annotation-api.version} @@ -159,10 +149,6 @@ org.apache.maven.plugins maven-compiler-plugin - - 11 - 11 - @@ -214,9 +200,7 @@ - 1.78 0.43 - 2.7.2 1.2.3.Final 0.22.6 1.9.20.1 @@ -233,6 +217,7 @@ 1.0.0 2.5.6 0.9.6 + 1.3.2 \ No newline at end of file diff --git a/libraries-4/README.md b/libraries-4/README.md index 0dee9f1c1e..102f17acdb 100644 --- a/libraries-4/README.md +++ b/libraries-4/README.md @@ -11,9 +11,7 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m - [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) diff --git a/libraries-4/pom.xml b/libraries-4/pom.xml index 3949d50875..6b818be9c2 100644 --- a/libraries-4/pom.xml +++ b/libraries-4/pom.xml @@ -22,17 +22,6 @@ eclipse-collections ${eclipse-collections.version} - - com.haulmont.yarg - yarg - ${yarg.version} - - - org.olap4j - olap4j - - - org.olap4j olap4j @@ -68,11 +57,6 @@ servlet-api ${javax.servlet.version} - - io.vavr - vavr - ${vavr.version} - org.pcollections pcollections @@ -119,21 +103,33 @@ jackson-annotations ${jackson-annotations.version} + + io.vavr + vavr + ${vavr.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + commons-io + commons-io + ${commons-io.version} + 2.14.2 2.14.2 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 2.1.2 3.0.0 0.6.5 @@ -142,6 +138,8 @@ 1.2.0 19 10.3.0 + 8.2.0 + 0.9.0 \ No newline at end of file diff --git a/libraries-5/README.md b/libraries-5/README.md index f1e749b293..50fb70bd05 100644 --- a/libraries-5/README.md +++ b/libraries-5/README.md @@ -9,10 +9,8 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m ### 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) diff --git a/libraries-5/pom.xml b/libraries-5/pom.xml index a043b4bfa8..85f8896890 100644 --- a/libraries-5/pom.xml +++ b/libraries-5/pom.xml @@ -49,21 +49,6 @@ ${typesafe-akka.version} test - - one.util - streamex - ${streamex.version} - - - net.bytebuddy - byte-buddy - ${byte-buddy.version} - - - net.bytebuddy - byte-buddy-agent - ${byte-buddy.version} - com.github.docker-java @@ -139,7 +124,6 @@ 4.3.8.RELEASE 2.12 2.5.11 - 0.8.1 3.0.14 3.1.8 3.0.2 diff --git a/libraries-6/README.md b/libraries-6/README.md index bbebcbc1e0..4236a65d95 100644 --- a/libraries-6/README.md +++ b/libraries-6/README.md @@ -12,7 +12,6 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m - [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) -- [Introduction to Protonpack](https://www.baeldung.com/java-protonpack) - [Guide to Simple Binary Encoding](https://www.baeldung.com/java-sbe) - [Java-R Integration](https://www.baeldung.com/java-r-integration) - [Using libphonenumber to Validate Phone Numbers](https://www.baeldung.com/java-libphonenumber) diff --git a/libraries-6/pom.xml b/libraries-6/pom.xml index f073ca424c..372c5b1cc7 100644 --- a/libraries-6/pom.xml +++ b/libraries-6/pom.xml @@ -17,11 +17,6 @@ functionaljava-java8 ${functionaljava.version} - - com.codepoetics - protonpack - ${protonpack.version} - io.github.resilience4j resilience4j-circuitbreaker @@ -198,7 +193,6 @@ 2.7.1 4.8.1 2.1.0 - 1.15 3.6 3.5-beta72 3.0 diff --git a/libraries-bytecode/.gitignore b/libraries-bytecode/.gitignore new file mode 100644 index 0000000000..e594daf27a --- /dev/null +++ b/libraries-bytecode/.gitignore @@ -0,0 +1,9 @@ +*.class + +# Folders # +/gensrc +/target + +# Packaged files # +*.jar +/bin/ diff --git a/libraries-bytecode/README.md b/libraries-bytecode/README.md new file mode 100644 index 0000000000..cc30511ad1 --- /dev/null +++ b/libraries-bytecode/README.md @@ -0,0 +1,9 @@ +## Server + +This module contains articles about bytecode libraries. + +### Relevant Articles: + +- [Introduction to Javassist](https://www.baeldung.com/javassist) +- [A Guide to Byte Buddy](https://www.baeldung.com/byte-buddy) +- [A Guide to Java Bytecode Manipulation with ASM](https://www.baeldung.com/java-asm) \ No newline at end of file diff --git a/libraries-bytecode/pom.xml b/libraries-bytecode/pom.xml new file mode 100644 index 0000000000..f21911d77e --- /dev/null +++ b/libraries-bytecode/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + libraries-bytecode + 0.0.1-SNAPSHOT + libraries-bytecode + jar + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.javassist + javassist + ${javaassist.version} + + + net.bytebuddy + byte-buddy + ${byte-buddy.version} + + + net.bytebuddy + byte-buddy-agent + ${byte-buddy.version} + + + org.ow2.asm + asm + ${asm.version} + + + org.ow2.asm + asm-util + ${asm.version} + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + --add-exports=java.base/jdk.internal.ref=ALL-UNNAMED + --add-exports=java.base/sun.nio.ch=ALL-UNNAMED + --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED + --add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac=ALL-UNNAMED + --add-opens=java.base/java.lang=ALL-UNNAMED + --add-opens=java.base/java.lang.reflect=ALL-UNNAMED + --add-opens=java.base/java.io=ALL-UNNAMED + --add-opens=java.base/java.util=ALL-UNNAMED + + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + + + com.baeldung.examples.asm.instrumentation.Premain + + + + + + + + + + 3.29.2-GA + 5.2 + + + \ No newline at end of file diff --git a/asm/src/main/java/com/baeldung/examples/asm/CustomClassWriter.java b/libraries-bytecode/src/main/java/com/baeldung/asm/CustomClassWriter.java similarity index 96% rename from asm/src/main/java/com/baeldung/examples/asm/CustomClassWriter.java rename to libraries-bytecode/src/main/java/com/baeldung/asm/CustomClassWriter.java index d41a1a16a3..f05a753320 100644 --- a/asm/src/main/java/com/baeldung/examples/asm/CustomClassWriter.java +++ b/libraries-bytecode/src/main/java/com/baeldung/asm/CustomClassWriter.java @@ -1,160 +1,160 @@ -package com.baeldung.examples.asm; - -import java.io.IOException; -import java.io.PrintWriter; -import java.util.logging.Level; -import java.util.logging.Logger; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.FieldVisitor; -import org.objectweb.asm.MethodVisitor; -import static org.objectweb.asm.Opcodes.ACC_PUBLIC; -import static org.objectweb.asm.Opcodes.ACC_STATIC; -import static org.objectweb.asm.Opcodes.ASM4; -import static org.objectweb.asm.Opcodes.V1_5; -import org.objectweb.asm.Type; -import org.objectweb.asm.util.TraceClassVisitor; - -/** - * - * @author baeldung - * @param - */ -public class CustomClassWriter { - - ClassReader reader; - ClassWriter writer; - AddFieldAdapter addFieldAdapter; - AddInterfaceAdapter addInterfaceAdapter; - PublicizeMethodAdapter pubMethAdapter; - final static String CLASSNAME = "java.lang.Integer"; - final static String CLONEABLE = "java/lang/Cloneable"; - - public CustomClassWriter() { - - try { - reader = new ClassReader(CLASSNAME); - writer = new ClassWriter(reader, 0); - - } catch (IOException ex) { - Logger.getLogger(CustomClassWriter.class.getName()).log(Level.SEVERE, null, ex); - } - } - - public CustomClassWriter(byte[] contents) { - reader = new ClassReader(contents); - writer = new ClassWriter(reader, 0); - } - - public static void main(String[] args) { - CustomClassWriter ccw = new CustomClassWriter(); - ccw.publicizeMethod(); - } - - public byte[] addField() { - addFieldAdapter = new AddFieldAdapter("aNewBooleanField", org.objectweb.asm.Opcodes.ACC_PUBLIC, writer); - reader.accept(addFieldAdapter, 0); - return writer.toByteArray(); - } - - public byte[] publicizeMethod() { - pubMethAdapter = new PublicizeMethodAdapter(writer); - reader.accept(pubMethAdapter, 0); - return writer.toByteArray(); - } - - public byte[] addInterface() { - addInterfaceAdapter = new AddInterfaceAdapter(writer); - reader.accept(addInterfaceAdapter, 0); - return writer.toByteArray(); - } - - public class AddInterfaceAdapter extends ClassVisitor { - - public AddInterfaceAdapter(ClassVisitor cv) { - super(ASM4, cv); - } - - @Override - public void visit(int version, int access, String name, - String signature, String superName, String[] interfaces) { - String[] holding = new String[interfaces.length + 1]; - holding[holding.length - 1] = CLONEABLE; - System.arraycopy(interfaces, 0, holding, 0, interfaces.length); - - cv.visit(V1_5, access, name, signature, superName, holding); - } - - } - - public class PublicizeMethodAdapter extends ClassVisitor { - - final Logger logger = Logger.getLogger("PublicizeMethodAdapter"); - TraceClassVisitor tracer; - PrintWriter pw = new PrintWriter(System.out); - - public PublicizeMethodAdapter(ClassVisitor cv) { - super(ASM4, cv); - this.cv = cv; - tracer = new TraceClassVisitor(cv, pw); - } - - @Override - public MethodVisitor visitMethod(int access, - String name, - String desc, - String signature, - String[] exceptions) { - - if (name.equals("toUnsignedString0")) { - logger.info("Visiting unsigned method"); - return tracer.visitMethod(ACC_PUBLIC + ACC_STATIC, name, desc, signature, exceptions); - } - return tracer.visitMethod(access, name, desc, signature, exceptions); - - } - - public void visitEnd() { - tracer.visitEnd(); - System.out.println(tracer.p.getText()); - } - - } - - public class AddFieldAdapter extends ClassVisitor { - - String fieldName; - int access; - boolean isFieldPresent; - - public AddFieldAdapter(String fieldName, int access, ClassVisitor cv) { - super(ASM4, cv); - this.cv = cv; - this.access = access; - this.fieldName = fieldName; - } - - @Override - public FieldVisitor visitField(int access, String name, String desc, - String signature, Object value) { - if (name.equals(fieldName)) { - isFieldPresent = true; - } - return cv.visitField(access, name, desc, signature, value); - } - - @Override - public void visitEnd() { - if (!isFieldPresent) { - FieldVisitor fv = cv.visitField(access, fieldName, Type.BOOLEAN_TYPE.toString(), null, null); - if (fv != null) { - fv.visitEnd(); - } - } - cv.visitEnd(); - } - - } - -} +package com.baeldung.asm; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.FieldVisitor; +import org.objectweb.asm.MethodVisitor; +import static org.objectweb.asm.Opcodes.ACC_PUBLIC; +import static org.objectweb.asm.Opcodes.ACC_STATIC; +import static org.objectweb.asm.Opcodes.ASM4; +import static org.objectweb.asm.Opcodes.V1_5; +import org.objectweb.asm.Type; +import org.objectweb.asm.util.TraceClassVisitor; + +/** + * + * @author baeldung + * @param + */ +public class CustomClassWriter { + + ClassReader reader; + ClassWriter writer; + AddFieldAdapter addFieldAdapter; + AddInterfaceAdapter addInterfaceAdapter; + PublicizeMethodAdapter pubMethAdapter; + final static String CLASSNAME = "java.lang.Integer"; + final static String CLONEABLE = "java/lang/Cloneable"; + + public CustomClassWriter() { + + try { + reader = new ClassReader(CLASSNAME); + writer = new ClassWriter(reader, 0); + + } catch (IOException ex) { + Logger.getLogger(CustomClassWriter.class.getName()).log(Level.SEVERE, null, ex); + } + } + + public CustomClassWriter(byte[] contents) { + reader = new ClassReader(contents); + writer = new ClassWriter(reader, 0); + } + + public static void main(String[] args) { + CustomClassWriter ccw = new CustomClassWriter(); + ccw.publicizeMethod(); + } + + public byte[] addField() { + addFieldAdapter = new AddFieldAdapter("aNewBooleanField", org.objectweb.asm.Opcodes.ACC_PUBLIC, writer); + reader.accept(addFieldAdapter, 0); + return writer.toByteArray(); + } + + public byte[] publicizeMethod() { + pubMethAdapter = new PublicizeMethodAdapter(writer); + reader.accept(pubMethAdapter, 0); + return writer.toByteArray(); + } + + public byte[] addInterface() { + addInterfaceAdapter = new AddInterfaceAdapter(writer); + reader.accept(addInterfaceAdapter, 0); + return writer.toByteArray(); + } + + public class AddInterfaceAdapter extends ClassVisitor { + + public AddInterfaceAdapter(ClassVisitor cv) { + super(ASM4, cv); + } + + @Override + public void visit(int version, int access, String name, + String signature, String superName, String[] interfaces) { + String[] holding = new String[interfaces.length + 1]; + holding[holding.length - 1] = CLONEABLE; + System.arraycopy(interfaces, 0, holding, 0, interfaces.length); + + cv.visit(V1_5, access, name, signature, superName, holding); + } + + } + + public class PublicizeMethodAdapter extends ClassVisitor { + + final Logger logger = Logger.getLogger("PublicizeMethodAdapter"); + TraceClassVisitor tracer; + PrintWriter pw = new PrintWriter(System.out); + + public PublicizeMethodAdapter(ClassVisitor cv) { + super(ASM4, cv); + this.cv = cv; + tracer = new TraceClassVisitor(cv, pw); + } + + @Override + public MethodVisitor visitMethod(int access, + String name, + String desc, + String signature, + String[] exceptions) { + + if (name.equals("toUnsignedString0")) { + logger.info("Visiting unsigned method"); + return tracer.visitMethod(ACC_PUBLIC + ACC_STATIC, name, desc, signature, exceptions); + } + return tracer.visitMethod(access, name, desc, signature, exceptions); + + } + + public void visitEnd() { + tracer.visitEnd(); + System.out.println(tracer.p.getText()); + } + + } + + public class AddFieldAdapter extends ClassVisitor { + + String fieldName; + int access; + boolean isFieldPresent; + + public AddFieldAdapter(String fieldName, int access, ClassVisitor cv) { + super(ASM4, cv); + this.cv = cv; + this.access = access; + this.fieldName = fieldName; + } + + @Override + public FieldVisitor visitField(int access, String name, String desc, + String signature, Object value) { + if (name.equals(fieldName)) { + isFieldPresent = true; + } + return cv.visitField(access, name, desc, signature, value); + } + + @Override + public void visitEnd() { + if (!isFieldPresent) { + FieldVisitor fv = cv.visitField(access, fieldName, Type.BOOLEAN_TYPE.toString(), null, null); + if (fv != null) { + fv.visitEnd(); + } + } + cv.visitEnd(); + } + + } + +} diff --git a/asm/src/main/java/com/baeldung/examples/asm/instrumentation/Premain.java b/libraries-bytecode/src/main/java/com/baeldung/asm/instrumentation/Premain.java similarity index 88% rename from asm/src/main/java/com/baeldung/examples/asm/instrumentation/Premain.java rename to libraries-bytecode/src/main/java/com/baeldung/asm/instrumentation/Premain.java index a3e69b6785..502137bd3d 100644 --- a/asm/src/main/java/com/baeldung/examples/asm/instrumentation/Premain.java +++ b/libraries-bytecode/src/main/java/com/baeldung/asm/instrumentation/Premain.java @@ -1,6 +1,6 @@ -package com.baeldung.examples.asm.instrumentation; +package com.baeldung.asm.instrumentation; -import com.baeldung.examples.asm.CustomClassWriter; +import com.baeldung.asm.CustomClassWriter; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; import java.lang.instrument.Instrumentation; diff --git a/libraries-5/src/main/java/com/baeldung/bytebuddy/Bar.java b/libraries-bytecode/src/main/java/com/baeldung/bytebuddy/Bar.java similarity index 100% rename from libraries-5/src/main/java/com/baeldung/bytebuddy/Bar.java rename to libraries-bytecode/src/main/java/com/baeldung/bytebuddy/Bar.java diff --git a/libraries-5/src/main/java/com/baeldung/bytebuddy/Foo.java b/libraries-bytecode/src/main/java/com/baeldung/bytebuddy/Foo.java similarity index 100% rename from libraries-5/src/main/java/com/baeldung/bytebuddy/Foo.java rename to libraries-bytecode/src/main/java/com/baeldung/bytebuddy/Foo.java diff --git a/libraries/src/main/java/com/baeldung/javasisst/Point.java b/libraries-bytecode/src/main/java/com/baeldung/javasisst/Point.java similarity index 100% rename from libraries/src/main/java/com/baeldung/javasisst/Point.java rename to libraries-bytecode/src/main/java/com/baeldung/javasisst/Point.java diff --git a/libraries/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java b/libraries-bytecode/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java similarity index 100% rename from libraries/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java rename to libraries-bytecode/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java diff --git a/asm/src/main/resources/logback.xml b/libraries-bytecode/src/main/resources/logback.xml similarity index 100% rename from asm/src/main/resources/logback.xml rename to libraries-bytecode/src/main/resources/logback.xml diff --git a/libraries-5/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java b/libraries-bytecode/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java similarity index 93% rename from libraries-5/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java rename to libraries-bytecode/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java index 5f721025c3..398e873223 100644 --- a/libraries-5/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java +++ b/libraries-bytecode/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java @@ -1,5 +1,16 @@ package com.baeldung.bytebuddy; +import static net.bytebuddy.matcher.ElementMatchers.isDeclaredBy; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.returns; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; + +import org.junit.Test; + import net.bytebuddy.ByteBuddy; import net.bytebuddy.agent.ByteBuddyAgent; import net.bytebuddy.dynamic.DynamicType; @@ -8,14 +19,6 @@ import net.bytebuddy.dynamic.loading.ClassReloadingStrategy; import net.bytebuddy.implementation.FixedValue; import net.bytebuddy.implementation.MethodDelegation; import net.bytebuddy.matcher.ElementMatchers; -import org.junit.Test; - -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; - -import static net.bytebuddy.matcher.ElementMatchers.*; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; public class ByteBuddyUnitTest { diff --git a/libraries/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java b/libraries-bytecode/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java rename to libraries-bytecode/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java diff --git a/libraries-cli/.gitignore b/libraries-cli/.gitignore new file mode 100644 index 0000000000..e594daf27a --- /dev/null +++ b/libraries-cli/.gitignore @@ -0,0 +1,9 @@ +*.class + +# Folders # +/gensrc +/target + +# Packaged files # +*.jar +/bin/ diff --git a/libraries-cli/README.md b/libraries-cli/README.md new file mode 100644 index 0000000000..b31bb2853d --- /dev/null +++ b/libraries-cli/README.md @@ -0,0 +1,9 @@ +## Server + +This module contains articles about cli libraries. + +### Relevant Articles: + +- [Create a Java Command Line Program with Picocli](https://www.baeldung.com/java-picocli-create-command-line-program) +- [Parsing Command-Line Parameters with JCommander](https://www.baeldung.com/jcommander-parsing-command-line-parameters) +- [Parsing Command-Line Parameters with Airline](https://www.baeldung.com/java-airline) \ No newline at end of file diff --git a/libraries-cli/pom.xml b/libraries-cli/pom.xml new file mode 100644 index 0000000000..d204f3c735 --- /dev/null +++ b/libraries-cli/pom.xml @@ -0,0 +1,69 @@ + + + 4.0.0 + libraries-cli + 0.0.1-SNAPSHOT + libraries-cli + jar + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter + ${spring-boot-starter.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + + + info.picocli + picocli + ${picocli.version} + + + com.beust + jcommander + ${jcommander.version} + + + com.github.rvesse + airline + ${airline.version} + + + org.projectlombok + lombok + ${lombok.version} + + + + + + + + + + + 4.7.0 + 1.78 + 2.7.2 + 2.7.8 + 5.3.25 + + + \ No newline at end of file diff --git a/libraries-3/src/main/java/com/baeldung/airline/CommandLine.java b/libraries-cli/src/main/java/com/baeldung/airline/CommandLine.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/airline/CommandLine.java rename to libraries-cli/src/main/java/com/baeldung/airline/CommandLine.java diff --git a/libraries-3/src/main/java/com/baeldung/airline/DatabaseSetupCommand.java b/libraries-cli/src/main/java/com/baeldung/airline/DatabaseSetupCommand.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/airline/DatabaseSetupCommand.java rename to libraries-cli/src/main/java/com/baeldung/airline/DatabaseSetupCommand.java diff --git a/libraries-3/src/main/java/com/baeldung/airline/LoggingCommand.java b/libraries-cli/src/main/java/com/baeldung/airline/LoggingCommand.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/airline/LoggingCommand.java rename to libraries-cli/src/main/java/com/baeldung/airline/LoggingCommand.java diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/helloworld/HelloWorldApp.java b/libraries-cli/src/main/java/com/baeldung/jcommander/helloworld/HelloWorldApp.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/helloworld/HelloWorldApp.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/helloworld/HelloWorldApp.java diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/UsageBasedBillingApp.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/UsageBasedBillingApp.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/UsageBasedBillingApp.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/UsageBasedBillingApp.java diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java similarity index 99% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java index ea6b18af53..a28066ac3d 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java @@ -1,5 +1,10 @@ package com.baeldung.jcommander.usagebilling.cli; +import static com.baeldung.jcommander.usagebilling.cli.UsageBasedBilling.FETCH_CMD; +import static com.baeldung.jcommander.usagebilling.service.FetchCurrentChargesService.getDefault; + +import java.util.List; + import com.baeldung.jcommander.usagebilling.cli.splitter.ColonParameterSplitter; import com.baeldung.jcommander.usagebilling.cli.validator.UUIDValidator; import com.baeldung.jcommander.usagebilling.model.CurrentChargesRequest; @@ -7,13 +12,9 @@ import com.baeldung.jcommander.usagebilling.model.CurrentChargesResponse; import com.baeldung.jcommander.usagebilling.service.FetchCurrentChargesService; import com.beust.jcommander.Parameter; import com.beust.jcommander.Parameters; + import lombok.Getter; -import java.util.List; - -import static com.baeldung.jcommander.usagebilling.cli.UsageBasedBilling.*; -import static com.baeldung.jcommander.usagebilling.service.FetchCurrentChargesService.getDefault; - @Parameters( commandNames = { FETCH_CMD }, commandDescription = "Fetch charges for a customer in the current month, can be itemized or aggregated" diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java similarity index 99% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java index d3516b19d3..5c12ac665c 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java @@ -1,5 +1,11 @@ package com.baeldung.jcommander.usagebilling.cli; +import static com.baeldung.jcommander.usagebilling.cli.UsageBasedBilling.SUBMIT_CMD; +import static com.baeldung.jcommander.usagebilling.service.SubmitUsageService.getDefault; + +import java.math.BigDecimal; +import java.time.Instant; + import com.baeldung.jcommander.usagebilling.cli.converter.ISO8601TimestampConverter; import com.baeldung.jcommander.usagebilling.cli.validator.UUIDValidator; import com.baeldung.jcommander.usagebilling.model.UsageRequest; @@ -7,14 +13,9 @@ import com.baeldung.jcommander.usagebilling.model.UsageRequest.PricingType; import com.baeldung.jcommander.usagebilling.service.SubmitUsageService; import com.beust.jcommander.Parameter; import com.beust.jcommander.Parameters; + import lombok.Getter; -import java.math.BigDecimal; -import java.time.Instant; - -import static com.baeldung.jcommander.usagebilling.cli.UsageBasedBilling.*; -import static com.baeldung.jcommander.usagebilling.service.SubmitUsageService.getDefault; - @Parameters( commandNames = { SUBMIT_CMD }, commandDescription = "Submit usage for a given customer and subscription, accepts one usage item" diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/UsageBasedBilling.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/UsageBasedBilling.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/UsageBasedBilling.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/UsageBasedBilling.java diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java index e54865a811..c173f62684 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java @@ -1,7 +1,6 @@ package com.baeldung.jcommander.usagebilling.cli.converter; -import com.beust.jcommander.ParameterException; -import com.beust.jcommander.converters.BaseConverter; +import static java.lang.String.format; import java.time.Instant; import java.time.LocalDateTime; @@ -9,7 +8,8 @@ import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; -import static java.lang.String.format; +import com.beust.jcommander.ParameterException; +import com.beust.jcommander.converters.BaseConverter; public class ISO8601TimestampConverter extends BaseConverter { diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java index f24c028123..1e73b54045 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java @@ -1,10 +1,10 @@ package com.baeldung.jcommander.usagebilling.cli.splitter; -import com.beust.jcommander.converters.IParameterSplitter; +import static java.util.Arrays.asList; import java.util.List; -import static java.util.Arrays.asList; +import com.beust.jcommander.converters.IParameterSplitter; public class ColonParameterSplitter implements IParameterSplitter { diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java index a72912f7d0..f8d9f81203 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java @@ -1,10 +1,10 @@ package com.baeldung.jcommander.usagebilling.cli.validator; +import java.util.regex.Pattern; + import com.beust.jcommander.IParameterValidator; import com.beust.jcommander.ParameterException; -import java.util.regex.Pattern; - public class UUIDValidator implements IParameterValidator { private static final String UUID_REGEX = diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java similarity index 70% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java index 93dd7a5732..c57805b784 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java @@ -1,9 +1,13 @@ package com.baeldung.jcommander.usagebilling.model; -import lombok.*; - import java.util.List; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + @NoArgsConstructor(access = AccessLevel.PACKAGE) @AllArgsConstructor(access = AccessLevel.PACKAGE) @Builder diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java similarity index 91% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java index 865a6e4a3d..46fb86ba78 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java @@ -1,11 +1,15 @@ package com.baeldung.jcommander.usagebilling.model; -import lombok.*; - import java.math.BigDecimal; import java.math.RoundingMode; import java.util.List; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + @NoArgsConstructor(access = AccessLevel.PACKAGE) @AllArgsConstructor(access = AccessLevel.PACKAGE) @Builder diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java similarity index 89% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java index 2785474acf..07da8ee4b5 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java @@ -1,10 +1,14 @@ package com.baeldung.jcommander.usagebilling.model; -import lombok.*; - import java.math.BigDecimal; import java.time.Instant; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + @NoArgsConstructor(access = AccessLevel.PACKAGE) @AllArgsConstructor(access = AccessLevel.PACKAGE) @Builder diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java index 6436d49875..e1c5e25856 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java @@ -1,13 +1,5 @@ package com.baeldung.jcommander.usagebilling.service; -import com.baeldung.jcommander.usagebilling.model.CurrentChargesRequest; -import com.baeldung.jcommander.usagebilling.model.CurrentChargesResponse; -import com.baeldung.jcommander.usagebilling.model.CurrentChargesResponse.LineItem; - -import java.math.BigDecimal; -import java.util.List; -import java.util.UUID; - import static java.lang.String.format; import static java.util.Arrays.asList; import static java.util.Arrays.fill; @@ -15,6 +7,14 @@ import static java.util.Collections.emptyList; import static java.util.concurrent.ThreadLocalRandom.current; import static java.util.stream.Collectors.toList; +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; + +import com.baeldung.jcommander.usagebilling.model.CurrentChargesRequest; +import com.baeldung.jcommander.usagebilling.model.CurrentChargesResponse; +import com.baeldung.jcommander.usagebilling.model.CurrentChargesResponse.LineItem; + class DefaultFetchCurrentChargesService implements FetchCurrentChargesService { @Override diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java index 44ac9e9ed7..fb214c9ab9 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java @@ -1,9 +1,9 @@ package com.baeldung.jcommander.usagebilling.service; -import com.baeldung.jcommander.usagebilling.model.UsageRequest; - import java.util.UUID; +import com.baeldung.jcommander.usagebilling.model.UsageRequest; + class DefaultSubmitUsageService implements SubmitUsageService { @Override diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/FetchCurrentChargesService.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/FetchCurrentChargesService.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/FetchCurrentChargesService.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/FetchCurrentChargesService.java diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/SubmitUsageService.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/SubmitUsageService.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/SubmitUsageService.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/SubmitUsageService.java diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/Application.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/Application.java similarity index 99% rename from libraries-2/src/main/java/com/baeldung/picocli/git/Application.java rename to libraries-cli/src/main/java/com/baeldung/picocli/git/Application.java index 04af524e45..80c132d637 100644 --- a/libraries-2/src/main/java/com/baeldung/picocli/git/Application.java +++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/Application.java @@ -1,13 +1,15 @@ package com.baeldung.picocli.git; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + import com.baeldung.picocli.git.commands.programmative.GitCommand; import com.baeldung.picocli.git.commands.subcommands.GitAddCommand; import com.baeldung.picocli.git.commands.subcommands.GitCommitCommand; import com.baeldung.picocli.git.commands.subcommands.GitConfigCommand; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; + import picocli.CommandLine; @SpringBootApplication diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java similarity index 99% rename from libraries-2/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java rename to libraries-cli/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java index f3c690a3e6..fbd7907eb8 100644 --- a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java +++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java @@ -1,14 +1,15 @@ package com.baeldung.picocli.git.commands.declarative; -import com.baeldung.picocli.git.model.ConfigElement; -import com.baeldung.picocli.git.commands.subcommands.GitAddCommand; -import com.baeldung.picocli.git.commands.subcommands.GitCommitCommand; -import com.baeldung.picocli.git.commands.subcommands.GitConfigCommand; -import picocli.CommandLine; - import static picocli.CommandLine.*; import static picocli.CommandLine.Command; +import com.baeldung.picocli.git.commands.subcommands.GitAddCommand; +import com.baeldung.picocli.git.commands.subcommands.GitCommitCommand; +import com.baeldung.picocli.git.commands.subcommands.GitConfigCommand; +import com.baeldung.picocli.git.model.ConfigElement; + +import picocli.CommandLine; + @Command( name = "git", subcommands = { diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java similarity index 100% rename from libraries-2/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java rename to libraries-cli/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java index 2c3e440b8b..74993a50fe 100644 --- a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java +++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java @@ -1,9 +1,9 @@ package com.baeldung.picocli.git.commands.methods; -import picocli.CommandLine; - import static picocli.CommandLine.Command; +import picocli.CommandLine; + @Command(name = "git") public class GitCommand implements Runnable { public static void main(String[] args) { diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java similarity index 99% rename from libraries-2/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java rename to libraries-cli/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java index 81ecfd78be..fabd0e4cc7 100644 --- a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java +++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java @@ -1,13 +1,15 @@ package com.baeldung.picocli.git.commands.programmative; -import com.baeldung.picocli.git.commands.subcommands.GitAddCommand; -import com.baeldung.picocli.git.commands.subcommands.GitCommitCommand; -import org.springframework.stereotype.Component; -import picocli.CommandLine; - import static picocli.CommandLine.Command; import static picocli.CommandLine.RunLast; +import org.springframework.stereotype.Component; + +import com.baeldung.picocli.git.commands.subcommands.GitAddCommand; +import com.baeldung.picocli.git.commands.subcommands.GitCommitCommand; + +import picocli.CommandLine; + @Command(name = "git") @Component public class GitCommand implements Runnable { diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java similarity index 100% rename from libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java rename to libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java index 803cd8dc7d..f87e55a5cc 100644 --- a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java +++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java @@ -1,11 +1,11 @@ package com.baeldung.picocli.git.commands.subcommands; -import org.springframework.stereotype.Component; +import static picocli.CommandLine.*; import java.nio.file.Path; import java.util.List; -import static picocli.CommandLine.*; +import org.springframework.stereotype.Component; @Command( name = "add" diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java similarity index 100% rename from libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java rename to libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java index df4928983c..f2136f9c39 100644 --- a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java +++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java @@ -1,10 +1,10 @@ package com.baeldung.picocli.git.commands.subcommands; -import org.springframework.stereotype.Component; - import static picocli.CommandLine.Command; import static picocli.CommandLine.Option; +import org.springframework.stereotype.Component; + @Command( name = "commit" ) diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java similarity index 99% rename from libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java rename to libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java index 80e14c0121..6ba803140a 100644 --- a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java +++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java @@ -1,11 +1,12 @@ package com.baeldung.picocli.git.commands.subcommands; -import com.baeldung.picocli.git.model.ConfigElement; -import org.springframework.stereotype.Component; - import static picocli.CommandLine.Command; import static picocli.CommandLine.Parameters; +import org.springframework.stereotype.Component; + +import com.baeldung.picocli.git.model.ConfigElement; + @Command( name = "config" ) diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/model/ConfigElement.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/model/ConfigElement.java similarity index 100% rename from libraries-2/src/main/java/com/baeldung/picocli/git/model/ConfigElement.java rename to libraries-cli/src/main/java/com/baeldung/picocli/git/model/ConfigElement.java diff --git a/libraries-2/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java similarity index 100% rename from libraries-2/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java rename to libraries-cli/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java index 97a861e2f0..2df8ac0a5b 100644 --- a/libraries-2/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java +++ b/libraries-cli/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java @@ -1,9 +1,9 @@ package com.baeldung.picocli.helloworld; -import picocli.CommandLine; - import static picocli.CommandLine.Command; +import picocli.CommandLine; + @Command( name = "hello", description = "Says hello" diff --git a/libraries-cli/src/main/resources/logback.xml b/libraries-cli/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/libraries-cli/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/libraries-3/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java b/libraries-cli/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java similarity index 99% rename from libraries-3/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java rename to libraries-cli/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java index 48b3ac2896..c73e8e9d48 100644 --- a/libraries-3/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java +++ b/libraries-cli/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java @@ -1,9 +1,10 @@ package com.baeldung.jcommander.helloworld; -import com.beust.jcommander.JCommander; +import static org.junit.Assert.assertEquals; + import org.junit.Test; -import static org.junit.Assert.assertEquals; +import com.beust.jcommander.JCommander; public class HelloWorldAppUnitTest { diff --git a/libraries-3/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java b/libraries-cli/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java similarity index 99% rename from libraries-3/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java rename to libraries-cli/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java index b639661c39..aba4585f6e 100644 --- a/libraries-3/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java +++ b/libraries-cli/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java @@ -1,11 +1,12 @@ package com.baeldung.jcommander.usagebilling.cli; -import com.beust.jcommander.JCommander; -import org.junit.Test; - import static org.hamcrest.collection.IsIterableContainingInOrder.contains; import static org.junit.Assert.assertThat; +import org.junit.Test; + +import com.beust.jcommander.JCommander; + public class FetchCurrentChargesCommandUnitTest { private JCommander jc = JCommander.newBuilder() diff --git a/libraries-3/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java b/libraries-cli/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java similarity index 95% rename from libraries-3/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java rename to libraries-cli/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java index d6ce132053..a4d8273638 100644 --- a/libraries-3/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java +++ b/libraries-cli/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java @@ -1,12 +1,11 @@ package com.baeldung.jcommander.usagebilling.cli; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.Test; + import com.beust.jcommander.JCommander; import com.beust.jcommander.ParameterException; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; public class SubmitUsageCommandUnitTest { diff --git a/libraries-reporting/.gitignore b/libraries-reporting/.gitignore new file mode 100644 index 0000000000..e594daf27a --- /dev/null +++ b/libraries-reporting/.gitignore @@ -0,0 +1,9 @@ +*.class + +# Folders # +/gensrc +/target + +# Packaged files # +*.jar +/bin/ diff --git a/libraries-reporting/README.md b/libraries-reporting/README.md new file mode 100644 index 0000000000..6d405911ab --- /dev/null +++ b/libraries-reporting/README.md @@ -0,0 +1,8 @@ +## Server + +This module contains articles about reporting libraries. + +### Relevant Articles: + +- [JasperReports with Spring](https://www.baeldung.com/spring-jasper) +- [Spring Yarg Integration](https://www.baeldung.com/spring-yarg) \ No newline at end of file diff --git a/libraries-reporting/pom.xml b/libraries-reporting/pom.xml new file mode 100644 index 0000000000..526f187af8 --- /dev/null +++ b/libraries-reporting/pom.xml @@ -0,0 +1,75 @@ + + + 4.0.0 + libraries-reporting + 0.0.1-SNAPSHOT + libraries-reporting + jar + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter + ${spring-boot-starter.version} + + + org.springframework + spring-web + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + + + javax.servlet + servlet-api + ${javax.servlet.version} + + + net.sf.jasperreports + jasperreports + ${jasperreports.version} + + + commons-logging + commons-logging + + + + + com.haulmont.yarg + yarg + ${yarg.version} + + + org.olap4j + olap4j + + + + + + + 2.7.8 + 5.3.25 + 2.5 + 6.20.0 + 2.0.12 + + + \ No newline at end of file diff --git a/libraries-2/src/main/java/com/baeldung/jasperreports/Main.java b/libraries-reporting/src/main/java/com/baeldung/jasperreports/Main.java similarity index 100% rename from libraries-2/src/main/java/com/baeldung/jasperreports/Main.java rename to libraries-reporting/src/main/java/com/baeldung/jasperreports/Main.java diff --git a/libraries-2/src/main/java/com/baeldung/jasperreports/SimpleReportExporter.java b/libraries-reporting/src/main/java/com/baeldung/jasperreports/SimpleReportExporter.java similarity index 100% rename from libraries-2/src/main/java/com/baeldung/jasperreports/SimpleReportExporter.java rename to libraries-reporting/src/main/java/com/baeldung/jasperreports/SimpleReportExporter.java diff --git a/libraries-2/src/main/java/com/baeldung/jasperreports/SimpleReportFiller.java b/libraries-reporting/src/main/java/com/baeldung/jasperreports/SimpleReportFiller.java similarity index 100% rename from libraries-2/src/main/java/com/baeldung/jasperreports/SimpleReportFiller.java rename to libraries-reporting/src/main/java/com/baeldung/jasperreports/SimpleReportFiller.java diff --git a/libraries-2/src/main/java/com/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java b/libraries-reporting/src/main/java/com/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java similarity index 100% rename from libraries-2/src/main/java/com/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java rename to libraries-reporting/src/main/java/com/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java diff --git a/libraries-4/src/main/java/com/baeldung/yarg/DocumentController.java b/libraries-reporting/src/main/java/com/baeldung/yarg/DocumentController.java similarity index 99% rename from libraries-4/src/main/java/com/baeldung/yarg/DocumentController.java rename to libraries-reporting/src/main/java/com/baeldung/yarg/DocumentController.java index ff0d452108..9ae9b61ad1 100644 --- a/libraries-4/src/main/java/com/baeldung/yarg/DocumentController.java +++ b/libraries-reporting/src/main/java/com/baeldung/yarg/DocumentController.java @@ -5,6 +5,16 @@ */ package com.baeldung.yarg; +import java.io.File; +import java.io.IOException; + +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.FileUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + import com.haulmont.yarg.formatters.factory.DefaultFormatterFactory; import com.haulmont.yarg.loaders.factory.DefaultLoaderFactory; import com.haulmont.yarg.loaders.impl.JsonDataLoader; @@ -16,13 +26,6 @@ import com.haulmont.yarg.structure.ReportOutputType; import com.haulmont.yarg.structure.impl.BandBuilder; import com.haulmont.yarg.structure.impl.ReportBuilder; import com.haulmont.yarg.structure.impl.ReportTemplateBuilder; -import java.io.File; -import java.io.IOException; -import javax.servlet.http.HttpServletResponse; -import org.apache.commons.io.FileUtils; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; @RestController public class DocumentController { diff --git a/libraries-2/src/main/resources/employee-schema.sql b/libraries-reporting/src/main/resources/employee-schema.sql similarity index 100% rename from libraries-2/src/main/resources/employee-schema.sql rename to libraries-reporting/src/main/resources/employee-schema.sql diff --git a/libraries-2/src/main/resources/employeeEmailReport.jrxml b/libraries-reporting/src/main/resources/employeeEmailReport.jrxml similarity index 100% rename from libraries-2/src/main/resources/employeeEmailReport.jrxml rename to libraries-reporting/src/main/resources/employeeEmailReport.jrxml diff --git a/libraries-2/src/main/resources/employeeReport.jrxml b/libraries-reporting/src/main/resources/employeeReport.jrxml similarity index 100% rename from libraries-2/src/main/resources/employeeReport.jrxml rename to libraries-reporting/src/main/resources/employeeReport.jrxml diff --git a/libraries-reporting/src/main/resources/logback.xml b/libraries-reporting/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/libraries-reporting/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/libraries-stream/.gitignore b/libraries-stream/.gitignore new file mode 100644 index 0000000000..e594daf27a --- /dev/null +++ b/libraries-stream/.gitignore @@ -0,0 +1,9 @@ +*.class + +# Folders # +/gensrc +/target + +# Packaged files # +*.jar +/bin/ diff --git a/libraries-stream/README.md b/libraries-stream/README.md new file mode 100644 index 0000000000..6aa5a28cd9 --- /dev/null +++ b/libraries-stream/README.md @@ -0,0 +1,11 @@ +## Server + +This module contains articles about stream libraries. + +### Relevant Articles: + +- [Merging Streams in Java](https://www.baeldung.com/java-merge-streams) +- [Guide to Java Parallel Collectors Library](https://www.baeldung.com/java-parallel-collectors) +- [DistinctBy in the Java Stream API](https://www.baeldung.com/java-streams-distinct-by) +- [Introduction to StreamEx](https://www.baeldung.com/streamex) +- [Introduction to Protonpack](https://www.baeldung.com/java-protonpack) \ No newline at end of file diff --git a/libraries-stream/pom.xml b/libraries-stream/pom.xml new file mode 100644 index 0000000000..8f00be3dab --- /dev/null +++ b/libraries-stream/pom.xml @@ -0,0 +1,59 @@ + + + 4.0.0 + libraries-stream + 0.0.1-SNAPSHOT + libraries-stream + jar + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.jooq + jool + ${jool.version} + + + com.pivovarit + parallel-collectors + ${parallel-collectors.version} + + + io.vavr + vavr + ${vavr.version} + + + org.eclipse.collections + eclipse-collections + ${eclipse-collections.version} + + + one.util + streamex + ${streamex.version} + + + com.codepoetics + protonpack + ${protonpack.version} + + + + + 0.9.12 + 1.1.0 + 0.9.0 + 8.2.0 + 0.8.1 + 1.15 + + + \ No newline at end of file diff --git a/libraries-4/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java b/libraries-stream/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java similarity index 100% rename from libraries-4/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java rename to libraries-stream/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java diff --git a/libraries-4/src/main/java/com/baeldung/distinct/Person.java b/libraries-stream/src/main/java/com/baeldung/distinct/Person.java similarity index 100% rename from libraries-4/src/main/java/com/baeldung/distinct/Person.java rename to libraries-stream/src/main/java/com/baeldung/distinct/Person.java diff --git a/libraries-5/src/main/java/com/baeldung/streamex/Role.java b/libraries-stream/src/main/java/com/baeldung/streamex/Role.java similarity index 100% rename from libraries-5/src/main/java/com/baeldung/streamex/Role.java rename to libraries-stream/src/main/java/com/baeldung/streamex/Role.java diff --git a/libraries-5/src/main/java/com/baeldung/streamex/StreamEX.java b/libraries-stream/src/main/java/com/baeldung/streamex/StreamEX.java similarity index 99% rename from libraries-5/src/main/java/com/baeldung/streamex/StreamEX.java rename to libraries-stream/src/main/java/com/baeldung/streamex/StreamEX.java index 56a3860f05..989b65bef6 100644 --- a/libraries-5/src/main/java/com/baeldung/streamex/StreamEX.java +++ b/libraries-stream/src/main/java/com/baeldung/streamex/StreamEX.java @@ -7,6 +7,7 @@ import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; + import one.util.streamex.DoubleStreamEx; import one.util.streamex.EntryStream; import one.util.streamex.IntStreamEx; diff --git a/libraries-5/src/main/java/com/baeldung/streamex/User.java b/libraries-stream/src/main/java/com/baeldung/streamex/User.java similarity index 100% rename from libraries-5/src/main/java/com/baeldung/streamex/User.java rename to libraries-stream/src/main/java/com/baeldung/streamex/User.java diff --git a/libraries-stream/src/main/resources/logback.xml b/libraries-stream/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/libraries-stream/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java b/libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java rename to libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java diff --git a/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java b/libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java rename to libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java index 936fd3e839..196c6603dd 100644 --- a/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java +++ b/libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java @@ -1,7 +1,7 @@ package com.baeldung.distinct; -import static org.junit.Assert.assertTrue; import static com.baeldung.distinct.DistinctWithJavaFunction.distinctByKey; +import static org.junit.Assert.assertTrue; import java.util.List; import java.util.stream.Collectors; diff --git a/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java b/libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java rename to libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java diff --git a/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java b/libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java rename to libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java diff --git a/libraries-4/src/test/java/com/baeldung/distinct/PersonDataGenerator.java b/libraries-stream/src/test/java/com/baeldung/distinct/PersonDataGenerator.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/distinct/PersonDataGenerator.java rename to libraries-stream/src/test/java/com/baeldung/distinct/PersonDataGenerator.java diff --git a/libraries-2/src/test/java/com/baeldung/parallel_collectors/ParallelCollectorsUnitTest.java b/libraries-stream/src/test/java/com/baeldung/parallel_collectors/ParallelCollectorsUnitTest.java similarity index 100% rename from libraries-2/src/test/java/com/baeldung/parallel_collectors/ParallelCollectorsUnitTest.java rename to libraries-stream/src/test/java/com/baeldung/parallel_collectors/ParallelCollectorsUnitTest.java diff --git a/libraries-6/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java b/libraries-stream/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java similarity index 99% rename from libraries-6/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java rename to libraries-stream/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java index c28248e52c..ed5fec254d 100644 --- a/libraries-6/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java +++ b/libraries-stream/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java @@ -1,11 +1,9 @@ package com.baeldung.protonpack; -import com.codepoetics.protonpack.Indexed; -import com.codepoetics.protonpack.StreamUtils; -import com.codepoetics.protonpack.collectors.CollectorUtils; -import com.codepoetics.protonpack.collectors.NonUniqueValueException; -import com.codepoetics.protonpack.selectors.Selectors; -import org.junit.Test; +import static java.util.Arrays.asList; +import static java.util.Arrays.stream; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import java.util.List; import java.util.Optional; @@ -13,10 +11,13 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; -import static java.util.Arrays.asList; -import static java.util.Arrays.stream; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import org.junit.Test; + +import com.codepoetics.protonpack.Indexed; +import com.codepoetics.protonpack.StreamUtils; +import com.codepoetics.protonpack.collectors.CollectorUtils; +import com.codepoetics.protonpack.collectors.NonUniqueValueException; +import com.codepoetics.protonpack.selectors.Selectors; public class ProtonpackUnitTest { @Test diff --git a/libraries/src/test/java/com/baeldung/stream/JoolMergeStreamsUnitTest.java b/libraries-stream/src/test/java/com/baeldung/stream/JoolMergeStreamsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/stream/JoolMergeStreamsUnitTest.java rename to libraries-stream/src/test/java/com/baeldung/stream/JoolMergeStreamsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/stream/MergeStreamsUnitTest.java b/libraries-stream/src/test/java/com/baeldung/stream/MergeStreamsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/stream/MergeStreamsUnitTest.java rename to libraries-stream/src/test/java/com/baeldung/stream/MergeStreamsUnitTest.java diff --git a/libraries-5/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java b/libraries-stream/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java similarity index 99% rename from libraries-5/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java rename to libraries-stream/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java index b267eaea9b..de474b825c 100644 --- a/libraries-5/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java +++ b/libraries-stream/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java @@ -1,13 +1,14 @@ package com.baeldung.streamex; -import one.util.streamex.StreamEx; -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.util.Arrays; import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.junit.Assert.assertEquals; +import org.junit.Test; + +import one.util.streamex.StreamEx; public class StreamExMergeStreamsUnitTest { diff --git a/libraries/README.md b/libraries/README.md index 33c40ea67c..a8aa34973b 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -10,9 +10,7 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m ### Relevant articles - [Introduction to Javatuples](https://www.baeldung.com/java-tuples) -- [Introduction to Javassist](https://www.baeldung.com/javassist) - [Intro to JaVers](https://www.baeldung.com/javers) -- [Merging Streams in Java](https://www.baeldung.com/java-merge-streams) - [Introduction to Quartz](https://www.baeldung.com/quartz) - [How to Warm Up the JVM](https://www.baeldung.com/java-jvm-warmup) - [Software Transactional Memory in Java Using Multiverse](https://www.baeldung.com/java-multiverse-stm) diff --git a/libraries/pom.xml b/libraries/pom.xml index 07a4853728..756f455f4b 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -40,11 +40,6 @@ javatuples ${javatuples.version} - - org.javassist - javassist - ${javaassist.version} - org.javers javers-core @@ -120,11 +115,6 @@ quartz ${quartz.version} - - org.jooq - jool - ${jool.version} - org.openjdk.jmh jmh-core @@ -289,8 +279,6 @@ 4.3.8.RELEASE 3.0.3 2.3.0 - 3.29.2-GA - 0.9.12 3.6 2.6 diff --git a/pom.xml b/pom.xml index 0e8acff1d1..48da93fea4 100644 --- a/pom.xml +++ b/pom.xml @@ -709,7 +709,6 @@ apache-tika apache-velocity asciidoctor - asm atomix aws-modules azure @@ -777,6 +776,8 @@ libraries-apache-commons-collections libraries-apache-commons-io libraries-apache-commons + libraries-bytecode + libraries-cli libraries-concurrency libraries-data-2 libraries-data-db @@ -788,10 +789,12 @@ libraries-io libraries-llms libraries-primitive + libraries-reporting libraries-rpc libraries-security libraries-server-2 libraries-server + libraries-stream libraries-testing libraries-transform libraries @@ -956,7 +959,6 @@ apache-tika apache-velocity asciidoctor - asm atomix aws-modules azure @@ -1024,6 +1026,8 @@ libraries-apache-commons-collections libraries-apache-commons-io libraries-apache-commons + libraries-bytecode + libraries-cli libraries-concurrency libraries-data-2 libraries-data-db @@ -1035,10 +1039,12 @@ libraries-io libraries-llms libraries-primitive + libraries-reporting libraries-rpc libraries-security libraries-server-2 libraries-server + libraries-stream libraries-testing libraries-transform libraries From 1d9a0246fe93b3cf579d3cd99e4d7f152505168c Mon Sep 17 00:00:00 2001 From: SGWebFreelancer Date: Wed, 13 Dec 2023 17:46:25 +0800 Subject: [PATCH 215/294] BAEL-7278 create getCellText method to reduce duplicated code. --- .../exceltopdf/ExcelToPDFConverter.java | 45 ++++++++----------- pdf-2/src/main/resources/pdfsample.pdf | 4 +- 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java b/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java index b4013f0d49..97d7b36bd6 100644 --- a/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java +++ b/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java @@ -88,24 +88,7 @@ public class ExcelToPDFConverter { Row headerRow = worksheet.getRow(0); for (int i = 0; i < headerRow.getPhysicalNumberOfCells(); i++) { Cell cell = headerRow.getCell(i); - - String headerText; - switch (cell.getCellType()) { - case STRING: - headerText = cell.getStringCellValue(); - break; - case NUMERIC: - headerText = String.valueOf(BigDecimal.valueOf(cell.getNumericCellValue())); - break; - case BLANK: - headerText = ""; // or null - break; - default: - logger.warn("Unsupported cell type: {}", cell.getCellType()); - headerText = ""; // or throw an exception - break; - } - + String headerText = getCellText(cell); PdfPCell headerCell = new PdfPCell(new Phrase(headerText, getCellStyle(cell))); setBackgroundColor(cell, headerCell); setCellAlignment(cell, headerCell); @@ -113,6 +96,23 @@ public class ExcelToPDFConverter { } } + public static String getCellText(Cell cell) { + String cellValue; + switch (cell.getCellType()) { + case STRING: + cellValue = cell.getStringCellValue(); + break; + case NUMERIC: + cellValue = String.valueOf(BigDecimal.valueOf(cell.getNumericCellValue())); + break; + case BLANK: + default: + cellValue = ""; + break; + } + return cellValue; + } + private static void addTableData(XSSFSheet worksheet, PdfPTable table) throws DocumentException, IOException { Iterator rowIterator = worksheet.iterator(); while (rowIterator.hasNext()) { @@ -122,14 +122,7 @@ public class ExcelToPDFConverter { } for (int i = 0; i < row.getPhysicalNumberOfCells(); i++) { Cell cell = row.getCell(i); - String cellValue; - if (cell.getCellType() == CellType.STRING) { - cellValue = cell.getStringCellValue(); - } else if (cell.getCellType() == CellType.NUMERIC) { - cellValue = String.valueOf(cell.getNumericCellValue()); - } else { - cellValue = ""; - } + String cellValue = getCellText(cell); PdfPCell cellPdf = new PdfPCell(new Phrase(cellValue, getCellStyle(cell))); setBackgroundColor(cell, cellPdf); setCellAlignment(cell, cellPdf); diff --git a/pdf-2/src/main/resources/pdfsample.pdf b/pdf-2/src/main/resources/pdfsample.pdf index 320931762a..6a47504513 100644 --- a/pdf-2/src/main/resources/pdfsample.pdf +++ b/pdf-2/src/main/resources/pdfsample.pdf @@ -23,7 +23,7 @@ endobj <> endobj 7 0 obj -<> +<> endobj xref 0 8 @@ -36,7 +36,7 @@ xref 0000001186 00000 n 0000001231 00000 n trailer -<]>> +<<6a28b1036b62f3808f3bfb62a88a5239>]>> %iText-5.5.13.3 startxref 1391 From 9f7ec43036959e659ac17897426f38b3ac90de94 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 13 Dec 2023 12:41:51 +0200 Subject: [PATCH 216/294] [JAVA-27822] Upgrade ddd to Spring Boot 3 (#15399) --- patterns-modules/ddd/pom.xml | 25 ++++--------------- .../com/baeldung/ddd/order/jpa/JpaOrder.java | 12 ++++----- .../baeldung/ddd/order/jpa/JpaOrderLine.java | 4 +-- .../baeldung/ddd/order/jpa/JpaProduct.java | 2 +- .../request/AddProductRequest.java | 2 +- .../request/CreateOrderRequest.java | 2 +- 6 files changed, 16 insertions(+), 31 deletions(-) diff --git a/patterns-modules/ddd/pom.xml b/patterns-modules/ddd/pom.xml index 80147c29c6..1eb1f90741 100644 --- a/patterns-modules/ddd/pom.xml +++ b/patterns-modules/ddd/pom.xml @@ -10,29 +10,11 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-3 - - - - org.junit - junit-bom - ${junit-jupiter.version} - pom - import - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - @@ -88,12 +70,15 @@ de.flapdoodle.embed de.flapdoodle.embed.mongo + ${de.flapdoodle.embed.mongo.version} test + com.baeldung.ddd.PersistingDddAggregatesApplication 1.0.1 + 4.11.1 \ No newline at end of file diff --git a/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java index 81ae3bbd19..e0e7ea9a4e 100644 --- a/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java +++ b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java @@ -4,12 +4,12 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "order_table") diff --git a/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java index a3b50f0502..bf1d7020be 100644 --- a/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java +++ b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java @@ -1,7 +1,7 @@ package com.baeldung.ddd.order.jpa; -import javax.persistence.Embeddable; -import javax.persistence.Embedded; +import jakarta.persistence.Embeddable; +import jakarta.persistence.Embedded; @Embeddable class JpaOrderLine { diff --git a/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java index 1d2ae5230a..30b074b2e4 100644 --- a/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java +++ b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java @@ -2,7 +2,7 @@ package com.baeldung.ddd.order.jpa; import java.math.BigDecimal; -import javax.persistence.Embeddable; +import jakarta.persistence.Embeddable; @Embeddable class JpaProduct { diff --git a/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java index ec107d635b..76dc438b63 100644 --- a/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java +++ b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java @@ -4,7 +4,7 @@ import com.baeldung.dddhexagonalspring.domain.Product; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; public class AddProductRequest { @NotNull private Product product; diff --git a/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java index 8c51fbe479..ff81908811 100644 --- a/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java +++ b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java @@ -4,7 +4,7 @@ import com.baeldung.dddhexagonalspring.domain.Product; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; public class CreateOrderRequest { @NotNull private Product product; From 6e7e41cea4195a0df2325d8bf1b6b9f29ff43fd0 Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Wed, 13 Dec 2023 15:51:01 +0200 Subject: [PATCH 217/294] Update OutputStreamToByteArrayUnitTest.java --- .../OutputStreamToByteArrayUnitTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java index 16dfd68349..0be88b1c07 100644 --- a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java +++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java @@ -29,12 +29,12 @@ public class OutputStreamToByteArrayUnitTest { @Test - public void givenFileOutputStream_whenUsingDrainableOutputStream_thenReturnByteArray(@TempDir Path tempDir) throws IOException { + public void givenByteArrayOutputStream_whenUsingDrainableOutputStream_thenReturnByteArray() throws IOException { String data = "Welcome to Baeldung!"; - String fileName = "file.txt"; - Path filePath = tempDir.resolve(fileName); - DrainableOutputStream drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath.toFile())); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + DrainableOutputStream drainableOutputStream = new DrainableOutputStream(byteArrayOutputStream); + try (drainableOutputStream) { drainableOutputStream.write(data.getBytes(StandardCharsets.UTF_8)); } From 62c172f814477018996c44b06d2d8fa246c410fa Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 13 Dec 2023 21:58:43 +0200 Subject: [PATCH 218/294] =?UTF-8?q?[JAVA-27376]=20Moved=20article=20"Progr?= =?UTF-8?q?ammatically=20Restarting=20a=20Spring=20Boot=E2=80=A6=20(#15412?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [JAVA-27376] Moved article "Programmatically Restarting a Spring Boot Application" to spring-boot-runtime-2 module * [JAVA-27367] --- spring-boot-modules/spring-boot-runtime-2/README.md | 3 +++ spring-boot-modules/spring-boot-runtime-2/pom.xml | 12 ++++++++++++ .../main/java/com/baeldung/restart/Application.java | 0 .../java/com/baeldung/restart/RestartController.java | 0 .../java/com/baeldung/restart/RestartService.java | 2 +- .../src/main/resources/application.properties | 7 +++++++ .../restart/RestartApplicationManualTest.java | 0 spring-boot-modules/spring-boot-runtime/README.md | 3 ++- 8 files changed, 25 insertions(+), 2 deletions(-) rename spring-boot-modules/{spring-boot-runtime => spring-boot-runtime-2}/src/main/java/com/baeldung/restart/Application.java (100%) rename spring-boot-modules/{spring-boot-runtime => spring-boot-runtime-2}/src/main/java/com/baeldung/restart/RestartController.java (100%) rename spring-boot-modules/{spring-boot-runtime => spring-boot-runtime-2}/src/main/java/com/baeldung/restart/RestartService.java (100%) create mode 100644 spring-boot-modules/spring-boot-runtime-2/src/main/resources/application.properties rename spring-boot-modules/{spring-boot-runtime => spring-boot-runtime-2}/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java (100%) diff --git a/spring-boot-modules/spring-boot-runtime-2/README.md b/spring-boot-modules/spring-boot-runtime-2/README.md index 3ee05ccc83..c22f7cbc18 100644 --- a/spring-boot-modules/spring-boot-runtime-2/README.md +++ b/spring-boot-modules/spring-boot-runtime-2/README.md @@ -5,3 +5,6 @@ This module contains articles about administering a Spring Boot runtime ### Relevant Articles: - [Configure the Heap Size When Starting a Spring Boot Application](https://www.baeldung.com/spring-boot-heap-size) - [Max-HTTP-Header-Size in Spring Boot 2](https://www.baeldung.com/spring-boot-max-http-header-size) + - [Programmatically Restarting a Spring Boot Application](https://www.baeldung.com/java-restart-spring-boot-app) + + - More articles: [[<-- prev]](../spring-boot-runtime) diff --git a/spring-boot-modules/spring-boot-runtime-2/pom.xml b/spring-boot-modules/spring-boot-runtime-2/pom.xml index 5174900c79..356880975a 100644 --- a/spring-boot-modules/spring-boot-runtime-2/pom.xml +++ b/spring-boot-modules/spring-boot-runtime-2/pom.xml @@ -28,6 +28,15 @@ org.springframework.security spring-security-test + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.cloud + spring-cloud-starter + ${springcloud.version} + @@ -64,4 +73,7 @@ + + 3.1.3 + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/Application.java b/spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/Application.java similarity index 100% rename from spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/Application.java rename to spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/Application.java diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/RestartController.java b/spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/RestartController.java similarity index 100% rename from spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/RestartController.java rename to spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/RestartController.java diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/RestartService.java b/spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/RestartService.java similarity index 100% rename from spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/RestartService.java rename to spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/RestartService.java index 9883ec653b..f197efb067 100644 --- a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/RestartService.java +++ b/spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/RestartService.java @@ -1,8 +1,8 @@ package com.baeldung.restart; -import org.springframework.stereotype.Service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.context.restart.RestartEndpoint; +import org.springframework.stereotype.Service; @Service public class RestartService { diff --git a/spring-boot-modules/spring-boot-runtime-2/src/main/resources/application.properties b/spring-boot-modules/spring-boot-runtime-2/src/main/resources/application.properties new file mode 100644 index 0000000000..f6bd08e5dd --- /dev/null +++ b/spring-boot-modules/spring-boot-runtime-2/src/main/resources/application.properties @@ -0,0 +1,7 @@ +management.endpoints.web.exposure.include=* +management.metrics.enable.root=true +management.metrics.enable.jvm=true +management.endpoint.restart.enabled=true +spring.datasource.jmx-enabled=false +spring.jmx.enabled=true +management.endpoint.shutdown.enabled=true \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-runtime/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java b/spring-boot-modules/spring-boot-runtime-2/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java similarity index 100% rename from spring-boot-modules/spring-boot-runtime/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java rename to spring-boot-modules/spring-boot-runtime-2/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java diff --git a/spring-boot-modules/spring-boot-runtime/README.md b/spring-boot-modules/spring-boot-runtime/README.md index 6463aaa6c3..44b217ae77 100644 --- a/spring-boot-modules/spring-boot-runtime/README.md +++ b/spring-boot-modules/spring-boot-runtime/README.md @@ -4,10 +4,11 @@ This module contains articles about administering a Spring Boot runtime ### Relevant Articles: - [Shutdown a Spring Boot Application](https://www.baeldung.com/spring-boot-shutdown) - - [Programmatically Restarting a Spring Boot Application](https://www.baeldung.com/java-restart-spring-boot-app) - [Logging HTTP Requests with Spring Boot Actuator HTTP Tracing](https://www.baeldung.com/spring-boot-actuator-http) - [Spring Boot Embedded Tomcat Logs](https://www.baeldung.com/spring-boot-embedded-tomcat-logs) - [Project Configuration with Spring](https://www.baeldung.com/project-configuration-with-spring) - [Spring – Log Incoming Requests](https://www.baeldung.com/spring-http-logging) - [How to Configure Spring Boot Tomcat](https://www.baeldung.com/spring-boot-configure-tomcat) - [CORS with Spring](https://www.baeldung.com/spring-cors) + + - More articles: [[more -->]](../spring-boot-runtime-2) From 3e8f48d06e482515fe0a0acd12c8cc4e315e7eb1 Mon Sep 17 00:00:00 2001 From: Graham Cox Date: Wed, 13 Dec 2023 20:02:49 +0000 Subject: [PATCH 219/294] BAEL-7346: Parse Java Source Code and Extract Methods (#15409) --- .../extractjava/ExtractJavaLiveTest.java | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 core-java-modules/core-java-sun/src/test/java/com/baeldung/extractjava/ExtractJavaLiveTest.java diff --git a/core-java-modules/core-java-sun/src/test/java/com/baeldung/extractjava/ExtractJavaLiveTest.java b/core-java-modules/core-java-sun/src/test/java/com/baeldung/extractjava/ExtractJavaLiveTest.java new file mode 100644 index 0000000000..02904ad2fc --- /dev/null +++ b/core-java-modules/core-java-sun/src/test/java/com/baeldung/extractjava/ExtractJavaLiveTest.java @@ -0,0 +1,94 @@ +package com.baeldung.extractjava; + +import com.sun.source.tree.ClassTree; +import com.sun.source.tree.CompilationUnitTree; +import com.sun.source.tree.MethodTree; +import com.sun.source.tree.Tree; +import com.sun.source.util.JavacTask; +import com.sun.source.util.SimpleTreeVisitor; +import org.junit.Test; + +import javax.tools.JavaCompiler; +import javax.tools.JavaFileObject; +import javax.tools.StandardJavaFileManager; +import javax.tools.ToolProvider; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; + +public class ExtractJavaLiveTest { + @Test + public void visitTypeDeclsForClasses() throws Exception { + CompilationUnitTree compilationUnitTree = parseFile(); + + for (Tree tree : compilationUnitTree.getTypeDecls()) { + tree.accept(new SimpleTreeVisitor() { + @Override + public Object visitClass(ClassTree classTree, Object o) { + System.out.println("Found class: " + classTree.getSimpleName()); + return null; + } + }, null); + } + } + + @Test + public void iterateTypeDeclsForClasses() throws Exception { + CompilationUnitTree compilationUnitTree = parseFile(); + + for (Tree tree : compilationUnitTree.getTypeDecls()) { + if (tree.getKind() == Tree.Kind.CLASS) { + ClassTree classTree = (ClassTree) tree; + System.out.println("Found class: " + classTree.getSimpleName()); + } + } + } + + @Test + public void visitMethodsForClass() throws Exception { + CompilationUnitTree compilationUnitTree = parseFile(); + + for (Tree tree : compilationUnitTree.getTypeDecls()) { + if (tree.getKind() == Tree.Kind.CLASS) { + ClassTree classTree = (ClassTree) tree; + visitClassMethods(classTree); + } + } + + } + + private void visitClassMethods(ClassTree classTree) { + for (Tree member : classTree.getMembers()) { + member.accept(new SimpleTreeVisitor(){ + @Override + public Object visitMethod(MethodTree methodTree, Object o) { + System.out.println("Found method: " + classTree.getSimpleName() + "." + methodTree.getName()); + System.out.println("Return value: " + methodTree.getReturnType()); + System.out.println("Parameters: " + methodTree.getParameters()); + + for (Tree statement : methodTree.getBody().getStatements()) { + System.out.println("Found statement: " + statement); + } + + return null; + } + }, null); + } + } + + private static CompilationUnitTree parseFile() throws IOException { + String filename = "src/test/java/com/baeldung/extractjava/ExtractJavaUnitTest.java"; + + JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + + StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, StandardCharsets.UTF_8); + Iterable compilationUnits = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(new File(filename))); + + JavacTask javacTask = (JavacTask) compiler.getTask(null, fileManager, null, null, null, compilationUnits); + Iterable compilationUnitTrees = javacTask.parse(); + + CompilationUnitTree compilationUnitTree = compilationUnitTrees.iterator().next(); + return compilationUnitTree; + } +} From cd85eb8b0b82c4bbac0cfcd677a346a3d97ebca8 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 13 Dec 2023 22:04:35 +0200 Subject: [PATCH 220/294] [JAVA-27620] (#15396) * [JAVA-27620] * [JAVA-27620] * [JAVA-27620] Comment spring-boot-3-2 module --- spring-boot-modules/pom.xml | 2 +- spring-boot-modules/spring-boot-3-2/README.md | 2 ++ spring-boot-modules/spring-boot-3-2/pom.xml | 1 + .../main/java/com/baeldung/restclient/Article.java | 0 .../com/baeldung/restclient/ArticleController.java | 13 ++++++++++--- .../restclient/ArticleNotFoundException.java | 0 .../InvalidArticleResponseException.java | 0 .../baeldung/restclient/RestClientApplication.java | 0 .../restclient/RestClientIntegrationTest.java | 14 +++++++------- spring-boot-modules/spring-boot-3/README.md | 3 ++- 10 files changed, 23 insertions(+), 12 deletions(-) rename spring-boot-modules/{spring-boot-3 => spring-boot-3-2}/src/main/java/com/baeldung/restclient/Article.java (100%) rename spring-boot-modules/{spring-boot-3 => spring-boot-3-2}/src/main/java/com/baeldung/restclient/ArticleController.java (75%) rename spring-boot-modules/{spring-boot-3 => spring-boot-3-2}/src/main/java/com/baeldung/restclient/ArticleNotFoundException.java (100%) rename spring-boot-modules/{spring-boot-3 => spring-boot-3-2}/src/main/java/com/baeldung/restclient/InvalidArticleResponseException.java (100%) rename spring-boot-modules/{spring-boot-3 => spring-boot-3-2}/src/main/java/com/baeldung/restclient/RestClientApplication.java (100%) rename spring-boot-modules/{spring-boot-3 => spring-boot-3-2}/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java (100%) diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index eaf04cf015..890edd6cc5 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -95,7 +95,7 @@ spring-boot-3-observation spring-boot-3-test-pitfalls spring-boot-3-testcontainers - spring-boot-3-2 + spring-boot-resilience4j spring-boot-properties spring-boot-properties-2 diff --git a/spring-boot-modules/spring-boot-3-2/README.md b/spring-boot-modules/spring-boot-3-2/README.md index 27f9281725..b461cd9913 100644 --- a/spring-boot-modules/spring-boot-3-2/README.md +++ b/spring-boot-modules/spring-boot-3-2/README.md @@ -1,3 +1,5 @@ ## Relevant Articles - [Spring Boot 3.1’s ConnectionDetails Abstraction](https://www.baeldung.com/spring-boot-3-1-connectiondetails-abstraction) - [@ConditionalOnThreading Annotation Spring](https://www.baeldung.com/spring-conditionalonthreading) +- [A Guide to RestClient in Spring Boot](https://www.baeldung.com/spring-boot-restclient) +- More articles: [[<-- prev]](/spring-boot-modules/spring-boot-3) \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-2/pom.xml b/spring-boot-modules/spring-boot-3-2/pom.xml index e48b232a52..8878060a97 100644 --- a/spring-boot-modules/spring-boot-3-2/pom.xml +++ b/spring-boot-modules/spring-boot-3-2/pom.xml @@ -282,6 +282,7 @@ + com.baeldung.restclient.RestClientApplication 1.6.0.Beta1 2.0.0 3.0.0-M7 diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/Article.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/Article.java similarity index 100% rename from spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/Article.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/Article.java diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/ArticleController.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/ArticleController.java similarity index 75% rename from spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/ArticleController.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/ArticleController.java index 5e1dff6fd7..c2d87a558c 100644 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/ArticleController.java +++ b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/ArticleController.java @@ -1,13 +1,20 @@ package com.baeldung.restclient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Objects; +import org.springframework.http.ResponseEntity; +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.RestController; + @RestController @RequestMapping("/articles") public class ArticleController { diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/ArticleNotFoundException.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/ArticleNotFoundException.java similarity index 100% rename from spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/ArticleNotFoundException.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/ArticleNotFoundException.java diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/InvalidArticleResponseException.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/InvalidArticleResponseException.java similarity index 100% rename from spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/InvalidArticleResponseException.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/InvalidArticleResponseException.java diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/RestClientApplication.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/RestClientApplication.java similarity index 100% rename from spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/RestClientApplication.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/RestClientApplication.java diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java index 1a615faf4e..3e12215bcb 100644 --- a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java @@ -1,7 +1,10 @@ package com.baeldung.restclient; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.List; + import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -14,11 +17,8 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestClient; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class RestClientIntegrationTest { diff --git a/spring-boot-modules/spring-boot-3/README.md b/spring-boot-modules/spring-boot-3/README.md index ded5db30e4..ff00a506cf 100644 --- a/spring-boot-modules/spring-boot-3/README.md +++ b/spring-boot-modules/spring-boot-3/README.md @@ -8,4 +8,5 @@ - [HTTP Interface in Spring 6](https://www.baeldung.com/spring-6-http-interface) - [Working with Virtual Threads in Spring 6](https://www.baeldung.com/spring-6-virtual-threads) - [Docker Compose Support in Spring Boot 3](https://www.baeldung.com/ops/docker-compose-support-spring-boot) -- [A Guide to RestClient in Spring Boot](https://www.baeldung.com/spring-boot-restclient) + +- More articles: [[next -->]](/spring-boot-modules/spring-boot-3-2) From 2495d6fd623bdc992dec84dd14c19a53a807b7f1 Mon Sep 17 00:00:00 2001 From: Oscar Mauricio Forero Carrillo Date: Wed, 13 Dec 2023 21:22:10 +0100 Subject: [PATCH 221/294] BAEL-7226: Code for the improvements of the Percentages article. (#15352) * BAEL-7226: Code for the improvements of the Percentages article. * BAEL-7226: Rename Test to follow the convention --- core-java-modules/core-java-lang-math/pom.xml | 8 ++++++ .../BigDecimalPercentageCalculator.java | 20 ++++++++++++++ .../percentage/BigDecimalPercentages.java | 18 +++++++++++++ .../percentage/FastBigDecimalPercentage.java | 16 +++++++++++ .../BigDecimalPercentageUnitTest.java | 27 +++++++++++++++++++ .../FastBigDecimalPercentageUnitTest.java | 27 +++++++++++++++++++ 6 files changed, 116 insertions(+) create mode 100644 core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentageCalculator.java create mode 100644 core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentages.java create mode 100644 core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentage.java create mode 100644 core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/BigDecimalPercentageUnitTest.java create mode 100644 core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentageUnitTest.java diff --git a/core-java-modules/core-java-lang-math/pom.xml b/core-java-modules/core-java-lang-math/pom.xml index 551e5db1d5..a229327415 100644 --- a/core-java-modules/core-java-lang-math/pom.xml +++ b/core-java-modules/core-java-lang-math/pom.xml @@ -5,6 +5,14 @@ 4.0.0 core-java-lang-math core-java-lang-math + + + org.projectlombok + lombok + 1.18.24 + compile + + jar diff --git a/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentageCalculator.java b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentageCalculator.java new file mode 100644 index 0000000000..91fde335e9 --- /dev/null +++ b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentageCalculator.java @@ -0,0 +1,20 @@ +package com.baeldung.algorithms.percentage; + +import lombok.experimental.ExtensionMethod; +import java.math.BigDecimal; +import java.util.Scanner; + +@ExtensionMethod(FastBigDecimalPercentage.class) +public class BigDecimalPercentageCalculator { + public static void main(String[] args) { + + Scanner in = new Scanner(System.in); + System.out.println("Enter obtained marks:"); + BigDecimal obtained = new BigDecimal(in.nextDouble()); + System.out.println("Enter total marks:"); + BigDecimal total = new BigDecimal(in.nextDouble()); + + System.out.println("Percentage obtained :"+ obtained.toPercentageOf(total)); + } + +} diff --git a/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentages.java b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentages.java new file mode 100644 index 0000000000..c91cf0e9d4 --- /dev/null +++ b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentages.java @@ -0,0 +1,18 @@ +package com.baeldung.algorithms.percentage; + + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public class BigDecimalPercentages { + + private static final BigDecimal ONE_HUNDRED = new BigDecimal("100"); + + public BigDecimal toPercentageOf(BigDecimal value, BigDecimal total) { + return value.divide(total, 4, RoundingMode.HALF_UP).multiply(ONE_HUNDRED); + } + + public BigDecimal percentOf(BigDecimal percentage, BigDecimal total) { + return percentage.multiply(total).divide(ONE_HUNDRED, 2, RoundingMode.HALF_UP); + } +} diff --git a/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentage.java b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentage.java new file mode 100644 index 0000000000..f00a9f3e35 --- /dev/null +++ b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentage.java @@ -0,0 +1,16 @@ +package com.baeldung.algorithms.percentage; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public class FastBigDecimalPercentage { + + public static BigDecimal toPercentageOf(BigDecimal value, BigDecimal total) { + return value.divide(total, 4, RoundingMode.HALF_UP).scaleByPowerOfTen(2); + } + + public static BigDecimal percentOf(BigDecimal percentage, BigDecimal total) { + return percentage.multiply(total).scaleByPowerOfTen(-2); + } + +} diff --git a/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/BigDecimalPercentageUnitTest.java b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/BigDecimalPercentageUnitTest.java new file mode 100644 index 0000000000..dac2cb4de6 --- /dev/null +++ b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/BigDecimalPercentageUnitTest.java @@ -0,0 +1,27 @@ +package com.baeldung.algorithms.percentage; + +import org.hamcrest.number.BigDecimalCloseTo; +import org.junit.Assert; +import org.junit.Test; + +import java.math.BigDecimal; + +public class BigDecimalPercentageUnitTest { + private BigDecimalPercentages pc = new BigDecimalPercentages(); + + + @Test + public void shouldConvertToPercentageOfTotal(){ + BigDecimalCloseTo expected = new BigDecimalCloseTo(new BigDecimal(5.05), new BigDecimal(0.001)); + Assert.assertTrue("Result not as expected",expected.matchesSafely( + pc.toPercentageOf(new BigDecimal(50.5),new BigDecimal(1000)))); + } + + @Test + public void shouldCalculatePercentageOfTotal(){ + BigDecimalCloseTo expected = new BigDecimalCloseTo(new BigDecimal(31.40), new BigDecimal(0.001)); + Assert.assertTrue("Result not as expected",expected.matchesSafely( + pc.percentOf(new BigDecimal(3.14),new BigDecimal(1000)))); + } + +} diff --git a/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentageUnitTest.java b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentageUnitTest.java new file mode 100644 index 0000000000..dd97e5881c --- /dev/null +++ b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentageUnitTest.java @@ -0,0 +1,27 @@ +package com.baeldung.algorithms.percentage; + +import org.hamcrest.number.BigDecimalCloseTo; +import org.junit.Assert; +import org.junit.Test; + +import java.math.BigDecimal; + +public class FastBigDecimalPercentageUnitTest { + private FastBigDecimalPercentage pc = new FastBigDecimalPercentage(); + + + @Test + public void shouldConvertToPercentageOfTotal(){ + BigDecimalCloseTo expected = new BigDecimalCloseTo(new BigDecimal(5.05), new BigDecimal(0.001)); + Assert.assertTrue("Result not as expected",expected.matchesSafely( + pc.toPercentageOf(new BigDecimal(50.5),new BigDecimal(1000)))); + } + + @Test + public void shouldCalculatePercentageOfTotal(){ + BigDecimalCloseTo expected = new BigDecimalCloseTo(new BigDecimal(31.40), new BigDecimal(0.001)); + Assert.assertTrue("Result not as expected",expected.matchesSafely( + pc.percentOf(new BigDecimal(3.14),new BigDecimal(1000)))); + } + +} From 99e54378c3b5d5a9414226fd0fdf091eee8954ed Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Thu, 14 Dec 2023 00:34:19 +0200 Subject: [PATCH 222/294] Update OutputStreamToByteArrayUnitTest.java --- .../OutputStreamToByteArrayUnitTest.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java index 0be88b1c07..ed0cab250a 100644 --- a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java +++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java @@ -29,12 +29,10 @@ public class OutputStreamToByteArrayUnitTest { @Test - public void givenByteArrayOutputStream_whenUsingDrainableOutputStream_thenReturnByteArray() throws IOException { - String data = "Welcome to Baeldung!"; - - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - DrainableOutputStream drainableOutputStream = new DrainableOutputStream(byteArrayOutputStream); + public void givenSystemOut_whenUsingDrainableOutputStream_thenReturnByteArray() throws IOException { + String data = "Welcome to Baeldung!\n"; + DrainableOutputStream drainableOutputStream = new DrainableOutputStream(System.out); try (drainableOutputStream) { drainableOutputStream.write(data.getBytes(StandardCharsets.UTF_8)); } @@ -43,7 +41,6 @@ public class OutputStreamToByteArrayUnitTest { assertEquals(data, new String(writtenData, StandardCharsets.UTF_8)); } - public class DrainableOutputStream extends FilterOutputStream { private final ByteArrayOutputStream buffer; From fcc90e03828a1380002740cf85ea681ecdddfcd7 Mon Sep 17 00:00:00 2001 From: Mo Helmy <135069400+BenHelmyBen@users.noreply.github.com> Date: Thu, 14 Dec 2023 01:08:38 +0200 Subject: [PATCH 223/294] This commit is related to BAEL-7341 (#15410) This commit aims to add a test class "StringToCharListUnitTest" that suggests several ways to convert a string into a list of charachters. --- .../StringToCharListUnitTest.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/stringtocharlist/StringToCharListUnitTest.java diff --git a/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/stringtocharlist/StringToCharListUnitTest.java b/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/stringtocharlist/StringToCharListUnitTest.java new file mode 100644 index 0000000000..1cdbfb9df9 --- /dev/null +++ b/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/stringtocharlist/StringToCharListUnitTest.java @@ -0,0 +1,62 @@ +package com.baeldung.stringtocharlist; + +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import com.google.common.collect.Lists; + + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class StringToCharListUnitTest { + public String inputString = "Convert a String to a List of Characters in Java"; + + @Test + public void givenString_whenUsingToCharArray_thenConvertToCharList() { + char[] charArray = inputString.toCharArray(); + + List charList = new ArrayList<>(); + for (char c : charArray) { + charList.add(c); + } + + assertEquals(inputString.length(), charList.size()); + } + + @Test + public void givenString_whenUsingMapToObj_thenConvertToCharList() { + List charList = inputString.chars() + .mapToObj(c -> (char) c) + .toList(); + + assertEquals(inputString.length(), charList.size()); + } + + @Test + public void givenString_whenUsingSplit_thenConvertToStringList() { + String[] charArray = inputString.split(""); + + List charList = Arrays.asList(charArray); + + assertEquals(inputString.length(), charList.size()); + } + + @Test + public void givenString_whenUsingGuavaLists_thenConvertToCharList() { + List charList = Lists.charactersOf(inputString); + + assertEquals(inputString.length(), charList.size()); + } + + @Test + public void givenString_whenUsingCodePoints_thenConvertToCharList() { + List charList = inputString.codePoints() + .mapToObj(c -> (char) c) + .toList(); + + assertEquals(inputString.length(), charList.size()); + } +} From 97b1af3175a7ee5923cfa80b874f356aee0259b1 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Thu, 14 Dec 2023 07:19:58 +0530 Subject: [PATCH 224/294] added the code (#15272) Co-authored-by: Amit Kumatr --- .../CompletableFutureCallbackExample.java | 30 +++++++++++++ .../ListenableFutureCallbackExample.java | 42 +++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/completablefuture/CompletableFutureCallbackExample.java create mode 100644 core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/listenablefuture/ListenableFutureCallbackExample.java diff --git a/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/completablefuture/CompletableFutureCallbackExample.java b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/completablefuture/CompletableFutureCallbackExample.java new file mode 100644 index 0000000000..1c642d4ef7 --- /dev/null +++ b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/completablefuture/CompletableFutureCallbackExample.java @@ -0,0 +1,30 @@ +package com.baeldung.callback.completablefuture; + +import java.util.concurrent.CompletableFuture; + +public class CompletableFutureCallbackExample { + public static void main(String[] args) { + CompletableFuture completableFuture = new CompletableFuture<>(); + Runnable runnable = downloadFile(completableFuture); + completableFuture.whenComplete((res, error) -> { + if (error != null) { + // handle the exception scenario + } else if (res != null) { + // send data to DB + } + }); + new Thread(runnable).start(); + } + + private static Runnable downloadFile(CompletableFuture completableFuture) { + return () -> { + try { + //logic to download file + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + completableFuture.complete("pic.jpg"); + }; + } +} diff --git a/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/listenablefuture/ListenableFutureCallbackExample.java b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/listenablefuture/ListenableFutureCallbackExample.java new file mode 100644 index 0000000000..f3a5e889af --- /dev/null +++ b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/listenablefuture/ListenableFutureCallbackExample.java @@ -0,0 +1,42 @@ +package com.baeldung.callback.listenablefuture; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; + + +public class ListenableFutureCallbackExample { + public static void main(String[] args) { + + ExecutorService executorService = Executors.newFixedThreadPool(1); + ListeningExecutorService pool = MoreExecutors.listeningDecorator(executorService); + ListenableFuture listenableFuture = pool.submit(downloadFile()); + + Futures.addCallback(listenableFuture, new FutureCallback() { + @Override + public void onSuccess(String result) { + // code to push fileName to DB + } + + @Override + public void onFailure(Throwable throwable) { + // code to take appropriate action when there is an error + } + }, executorService); + } + + private static Callable downloadFile() { + return () -> { + // Mimicking the downloading of a file by adding a sleep call + Thread.sleep(5000); + return "pic.jpg"; + }; + } + +} From 6948bc37e283a4b1995465a2d355015a006afeca Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Thu, 14 Dec 2023 19:53:46 +0530 Subject: [PATCH 225/294] Review Comment --- .../firstmatchingelement/FirstMatchingElementUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java index db9415e94b..0820138b3b 100644 --- a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java @@ -34,7 +34,7 @@ public class FirstMatchingElementUnitTest { @Test public void whenUsingIntStream_thenFindFirstMatchingUserIndex() { - int index = IntStream.range(0, userList.size() - 1) + int index = IntStream.range(0, userList.size()) .filter(streamIndex -> searchName.equals(userList.get(streamIndex).getUserName())) .findFirst() .orElse(-1); From fd9618cda623c76d40463c687f0d64db34b6a608 Mon Sep 17 00:00:00 2001 From: Constantin Date: Thu, 14 Dec 2023 17:31:35 +0200 Subject: [PATCH 226/294] BAEL-7199: Dead Letter Queue for Kafka with Spring --- .../spring/kafka/dlt/KafkaConsumerConfig.java | 36 ++++++++ .../spring/kafka/dlt/KafkaDltApplication.java | 13 +++ .../spring/kafka/dlt/KafkaRetryConfig.java | 34 ++++++++ .../baeldung/spring/kafka/dlt/Payment.java | 43 +++++++++ .../PaymentListenerDltFailOnError.java | 29 +++++++ .../PaymentListenerDltRetryOnError.java | 29 +++++++ .../dlt/listener/PaymentListenerNoDlt.java | 29 +++++++ .../KafkaDltFailOnErrorIntegrationTest.java | 87 +++++++++++++++++++ .../KafkaDltRetryOnErrorIntegrationTest.java | 87 +++++++++++++++++++ .../kafka/dlt/KafkaNoDltIntegrationTest.java | 86 ++++++++++++++++++ .../spring/kafka/dlt/PaymentTestUtils.java | 15 ++++ 11 files changed, 488 insertions(+) create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaConsumerConfig.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaDltApplication.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaRetryConfig.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/Payment.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerDltFailOnError.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerDltRetryOnError.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerNoDlt.java create mode 100644 spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaDltFailOnErrorIntegrationTest.java create mode 100644 spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaDltRetryOnErrorIntegrationTest.java create mode 100644 spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaNoDltIntegrationTest.java create mode 100644 spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/PaymentTestUtils.java diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaConsumerConfig.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaConsumerConfig.java new file mode 100644 index 0000000000..557fa11ed3 --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaConsumerConfig.java @@ -0,0 +1,36 @@ +package com.baeldung.spring.kafka.dlt; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; +import org.springframework.kafka.core.ConsumerFactory; +import org.springframework.kafka.core.DefaultKafkaConsumerFactory; +import org.springframework.kafka.support.serializer.JsonDeserializer; + +@Configuration +public class KafkaConsumerConfig { + + @Value(value = "${spring.kafka.bootstrap-servers}") + private String bootstrapServers; + + @Bean + public ConsumerFactory consumerFactory() { + Map config = new HashMap<>(); + config.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + + return new DefaultKafkaConsumerFactory<>(config, new StringDeserializer(), new JsonDeserializer<>(Payment.class)); + } + + @Bean + public ConcurrentKafkaListenerContainerFactory containerFactory() { + ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); + factory.setConsumerFactory(consumerFactory()); + return factory; + } +} \ No newline at end of file diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaDltApplication.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaDltApplication.java new file mode 100644 index 0000000000..7aa2e3cdb8 --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaDltApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.spring.kafka.dlt; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.kafka.annotation.EnableKafka; + +@EnableKafka +@SpringBootApplication +public class KafkaDltApplication { + public static void main(String[] args) { + SpringApplication.run(KafkaDltApplication.class, args); + } +} diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaRetryConfig.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaRetryConfig.java new file mode 100644 index 0000000000..35a2b31168 --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/KafkaRetryConfig.java @@ -0,0 +1,34 @@ +package com.baeldung.spring.kafka.dlt; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.common.serialization.StringSerializer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.core.DefaultKafkaProducerFactory; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.core.ProducerFactory; +import org.springframework.kafka.support.serializer.JsonSerializer; + +@Configuration +public class KafkaRetryConfig { + + @Value(value = "${spring.kafka.bootstrap-servers}") + private String bootstrapServers; + + @Bean + public ProducerFactory producerFactory() { + Map config = new HashMap<>(); + config.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + + return new DefaultKafkaProducerFactory<>(config, new StringSerializer(), new JsonSerializer<>()); + } + + @Bean + public KafkaTemplate retryableTopicKafkaTemplate() { + return new KafkaTemplate<>(producerFactory()); + } +} \ No newline at end of file diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/Payment.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/Payment.java new file mode 100644 index 0000000000..1554c1671b --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/Payment.java @@ -0,0 +1,43 @@ +package com.baeldung.spring.kafka.dlt; + +import java.math.BigDecimal; +import java.util.Currency; +import java.util.StringJoiner; + +public class Payment { + private String reference; + private BigDecimal amount; + private Currency currency; + + public String getReference() { + return reference; + } + + public void setReference(String reference) { + this.reference = reference; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + public Currency getCurrency() { + return currency; + } + + public void setCurrency(Currency currency) { + this.currency = currency; + } + + @Override + public String toString() { + return new StringJoiner(", ", Payment.class.getSimpleName() + "[", "]").add("reference='" + reference + "'") + .add("amount=" + amount) + .add("currency=" + currency) + .toString(); + } +} \ No newline at end of file diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerDltFailOnError.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerDltFailOnError.java new file mode 100644 index 0000000000..c407310074 --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerDltFailOnError.java @@ -0,0 +1,29 @@ +package com.baeldung.spring.kafka.dlt.listener; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.kafka.annotation.DltHandler; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.kafka.annotation.RetryableTopic; +import org.springframework.kafka.retrytopic.DltStrategy; +import org.springframework.kafka.support.KafkaHeaders; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.stereotype.Service; + +import com.baeldung.spring.kafka.dlt.Payment; + +@Service +public class PaymentListenerDltFailOnError { + private final Logger log = LoggerFactory.getLogger(PaymentListenerDltFailOnError.class); + + @RetryableTopic(attempts = "1", kafkaTemplate = "retryableTopicKafkaTemplate", dltStrategy = DltStrategy.FAIL_ON_ERROR) + @KafkaListener(topics = { "payments-fail-on-error-dlt" }, groupId = "payments") + public void handlePayment(Payment payment, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) { + log.info("Event on main topic={}, payload={}", topic, payment); + } + + @DltHandler + public void handleDltPayment(Payment payment, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) { + log.info("Event on dlt topic={}, payload={}", topic, payment); + } +} \ No newline at end of file diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerDltRetryOnError.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerDltRetryOnError.java new file mode 100644 index 0000000000..9c6666c938 --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerDltRetryOnError.java @@ -0,0 +1,29 @@ +package com.baeldung.spring.kafka.dlt.listener; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.kafka.annotation.DltHandler; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.kafka.annotation.RetryableTopic; +import org.springframework.kafka.retrytopic.DltStrategy; +import org.springframework.kafka.support.KafkaHeaders; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.stereotype.Service; + +import com.baeldung.spring.kafka.dlt.Payment; + +@Service +public class PaymentListenerDltRetryOnError { + private final Logger log = LoggerFactory.getLogger(PaymentListenerDltRetryOnError.class); + + @RetryableTopic(attempts = "1", kafkaTemplate = "retryableTopicKafkaTemplate", dltStrategy = DltStrategy.ALWAYS_RETRY_ON_ERROR) + @KafkaListener(topics = { "payments-retry-on-error-dlt" }, groupId = "payments") + public void handlePayment(Payment payment, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) { + log.info("Event on main topic={}, payload={}", topic, payment); + } + + @DltHandler + public void handleDltPayment(Payment payment, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) { + log.info("Event on dlt topic={}, payload={}", topic, payment); + } +} \ No newline at end of file diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerNoDlt.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerNoDlt.java new file mode 100644 index 0000000000..a12d423b30 --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/dlt/listener/PaymentListenerNoDlt.java @@ -0,0 +1,29 @@ +package com.baeldung.spring.kafka.dlt.listener; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.kafka.annotation.DltHandler; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.kafka.annotation.RetryableTopic; +import org.springframework.kafka.retrytopic.DltStrategy; +import org.springframework.kafka.support.KafkaHeaders; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.stereotype.Service; + +import com.baeldung.spring.kafka.dlt.Payment; + +@Service +public class PaymentListenerNoDlt { + private final Logger log = LoggerFactory.getLogger(PaymentListenerNoDlt.class); + + @RetryableTopic(attempts = "1", kafkaTemplate = "retryableTopicKafkaTemplate", dltStrategy = DltStrategy.NO_DLT) + @KafkaListener(topics = { "payments-no-dlt" }, groupId = "payments") + public void handlePayment(Payment payment, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) { + log.info("Event on main topic={}, payload={}", topic, payment); + } + + @DltHandler + public void handleDltPayment(Payment payment, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) { + log.info("Event on dlt topic={}, payload={}", topic, payment); + } +} \ No newline at end of file diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaDltFailOnErrorIntegrationTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaDltFailOnErrorIntegrationTest.java new file mode 100644 index 0000000000..b20ee2ea12 --- /dev/null +++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaDltFailOnErrorIntegrationTest.java @@ -0,0 +1,87 @@ +package com.baeldung.spring.kafka.dlt; + +import static com.baeldung.spring.kafka.dlt.PaymentTestUtils.createPayment; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +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.mock.mockito.SpyBean; +import org.springframework.kafka.config.KafkaListenerEndpointRegistry; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.listener.MessageListenerContainer; +import org.springframework.kafka.test.context.EmbeddedKafka; +import org.springframework.kafka.test.utils.ContainerTestUtils; + +import com.baeldung.spring.kafka.dlt.listener.PaymentListenerDltFailOnError; + +@SpringBootTest(classes = KafkaDltApplication.class) +@EmbeddedKafka(partitions = 1, brokerProperties = { "listeners=PLAINTEXT://localhost:9099", "port=9099" }) +public class KafkaDltFailOnErrorIntegrationTest { + private static final String TOPIC = "payments-fail-on-error-dlt"; + + @Autowired + private KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry; + + @Autowired + private KafkaTemplate kafkaProducer; + + @SpyBean + private PaymentListenerDltFailOnError paymentsConsumer; + + @BeforeEach + void setUp() { + // wait for embedded Kafka + for (MessageListenerContainer messageListenerContainer : kafkaListenerEndpointRegistry.getListenerContainers()) { + ContainerTestUtils.waitForAssignment(messageListenerContainer, 1); + } + } + + @Test + public void whenMainConsumerSucceeds_thenNoDltMessage() throws Exception { + CountDownLatch mainTopicCountDownLatch = new CountDownLatch(1); + + doAnswer(invocation -> { + mainTopicCountDownLatch.countDown(); + return null; + }).when(paymentsConsumer) + .handlePayment(any(), any()); + + kafkaProducer.send(TOPIC, createPayment("dlt-fail-main")); + + assertThat(mainTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isTrue(); + verify(paymentsConsumer, never()).handleDltPayment(any(), any()); + } + + @Test + public void whenDltConsumerFails_thenDltProcessingStops() throws Exception { + CountDownLatch mainTopicCountDownLatch = new CountDownLatch(1); + CountDownLatch dlTTopicCountDownLatch = new CountDownLatch(2); + + doAnswer(invocation -> { + mainTopicCountDownLatch.countDown(); + throw new Exception("Simulating error in main consumer"); + }).when(paymentsConsumer) + .handlePayment(any(), any()); + + doAnswer(invocation -> { + dlTTopicCountDownLatch.countDown(); + throw new Exception("Simulating error in dlt consumer"); + }).when(paymentsConsumer) + .handleDltPayment(any(), any()); + + kafkaProducer.send(TOPIC, createPayment("dlt-fail")); + + assertThat(mainTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isTrue(); + assertThat(dlTTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isFalse(); + assertThat(dlTTopicCountDownLatch.getCount()).isEqualTo(1); + } +} \ No newline at end of file diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaDltRetryOnErrorIntegrationTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaDltRetryOnErrorIntegrationTest.java new file mode 100644 index 0000000000..97e42dac9f --- /dev/null +++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaDltRetryOnErrorIntegrationTest.java @@ -0,0 +1,87 @@ +package com.baeldung.spring.kafka.dlt; + +import static com.baeldung.spring.kafka.dlt.PaymentTestUtils.createPayment; +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +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.mock.mockito.SpyBean; +import org.springframework.kafka.config.KafkaListenerEndpointRegistry; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.listener.MessageListenerContainer; +import org.springframework.kafka.test.context.EmbeddedKafka; +import org.springframework.kafka.test.utils.ContainerTestUtils; + +import com.baeldung.spring.kafka.dlt.listener.PaymentListenerDltRetryOnError; + +@SpringBootTest(classes = KafkaDltApplication.class) +@EmbeddedKafka(partitions = 1, brokerProperties = { "listeners=PLAINTEXT://localhost:9099", "port=9099" }) +public class KafkaDltRetryOnErrorIntegrationTest { + private static final String TOPIC = "payments-retry-on-error-dlt"; + + @Autowired + private KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry; + + @Autowired + private KafkaTemplate kafkaProducer; + + @SpyBean + private PaymentListenerDltRetryOnError paymentsConsumer; + + @BeforeEach + void setUp() { + // wait for embedded Kafka + for (MessageListenerContainer messageListenerContainer : kafkaListenerEndpointRegistry.getListenerContainers()) { + ContainerTestUtils.waitForAssignment(messageListenerContainer, 1); + } + } + + @Test + public void whenMainConsumerSucceeds_thenNoDltMessage() throws Exception { + CountDownLatch mainTopicCountDownLatch = new CountDownLatch(1); + + doAnswer(invocation -> { + mainTopicCountDownLatch.countDown(); + return null; + }).when(paymentsConsumer) + .handlePayment(any(), any()); + + kafkaProducer.send(TOPIC, createPayment("dlt-retry-main")); + + assertThat(mainTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isTrue(); + verify(paymentsConsumer, never()).handleDltPayment(any(), any()); + } + + @Test + public void whenDltConsumerFails_thenDltConsumerRetriesMessage() throws Exception { + CountDownLatch mainTopicCountDownLatch = new CountDownLatch(1); + CountDownLatch dlTTopicCountDownLatch = new CountDownLatch(3); + + doAnswer(invocation -> { + mainTopicCountDownLatch.countDown(); + throw new Exception("Simulating error in main consumer"); + }).when(paymentsConsumer) + .handlePayment(any(), any()); + + doAnswer(invocation -> { + dlTTopicCountDownLatch.countDown(); + throw new Exception("Simulating error in dlt consumer"); + }).when(paymentsConsumer) + .handleDltPayment(any(), any()); + + kafkaProducer.send(TOPIC, createPayment("dlt-retry")); + + assertThat(mainTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isTrue(); + assertThat(dlTTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isTrue(); + } +} \ No newline at end of file diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaNoDltIntegrationTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaNoDltIntegrationTest.java new file mode 100644 index 0000000000..568908d276 --- /dev/null +++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaNoDltIntegrationTest.java @@ -0,0 +1,86 @@ +package com.baeldung.spring.kafka.dlt; + +import static com.baeldung.spring.kafka.dlt.PaymentTestUtils.createPayment; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +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.mock.mockito.SpyBean; +import org.springframework.kafka.config.KafkaListenerEndpointRegistry; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.listener.MessageListenerContainer; +import org.springframework.kafka.test.context.EmbeddedKafka; +import org.springframework.kafka.test.utils.ContainerTestUtils; + +import com.baeldung.spring.kafka.dlt.listener.PaymentListenerNoDlt; + +@SpringBootTest(classes = KafkaDltApplication.class) +@EmbeddedKafka(partitions = 1, brokerProperties = { "listeners=PLAINTEXT://localhost:9099", "port=9099" }) +public class KafkaNoDltIntegrationTest { + private static final String TOPIC = "payments-no-dlt"; + + @Autowired + private KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry; + + @Autowired + private KafkaTemplate kafkaProducer; + + @SpyBean + private PaymentListenerNoDlt paymentsConsumer; + + @BeforeEach + void setUp() { + // wait for embedded Kafka + for (MessageListenerContainer messageListenerContainer : kafkaListenerEndpointRegistry.getListenerContainers()) { + ContainerTestUtils.waitForAssignment(messageListenerContainer, 1); + } + } + + @Test + public void whenMainConsumerSucceeds_thenNoDltMessage() throws Exception { + CountDownLatch mainTopicCountDownLatch = new CountDownLatch(1); + + doAnswer(invocation -> { + mainTopicCountDownLatch.countDown(); + return null; + }).when(paymentsConsumer) + .handlePayment(any(), any()); + + kafkaProducer.send(TOPIC, createPayment("no-dlt-main")); + + assertThat(mainTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isTrue(); + verify(paymentsConsumer, never()).handleDltPayment(any(), any()); + } + + @Test + public void whenMainConsumerFails_thenDltConsumerDoesNotReceiveMessage() throws Exception { + CountDownLatch mainTopicCountDownLatch = new CountDownLatch(1); + CountDownLatch dlTTopicCountDownLatch = new CountDownLatch(1); + + doAnswer(invocation -> { + mainTopicCountDownLatch.countDown(); + throw new Exception("Simulating error in main consumer"); + }).when(paymentsConsumer) + .handlePayment(any(), any()); + + doAnswer(invocation -> { + dlTTopicCountDownLatch.countDown(); + return null; + }).when(paymentsConsumer) + .handleDltPayment(any(), any()); + + kafkaProducer.send(TOPIC, createPayment("no-dlt")); + + assertThat(mainTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isTrue(); + assertThat(dlTTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isFalse(); + } +} \ No newline at end of file diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/PaymentTestUtils.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/PaymentTestUtils.java new file mode 100644 index 0000000000..7b8a574779 --- /dev/null +++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/PaymentTestUtils.java @@ -0,0 +1,15 @@ +package com.baeldung.spring.kafka.dlt; + +import java.math.BigDecimal; +import java.util.Currency; + +class PaymentTestUtils { + + static Payment createPayment(String reference) { + Payment payment = new Payment(); + payment.setAmount(BigDecimal.valueOf(71)); + payment.setCurrency(Currency.getInstance("GBP")); + payment.setReference(reference); + return payment; + } +} \ No newline at end of file From 8ce31b54e94165b562f63ddc8f2b00a3f165a57f Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Fri, 15 Dec 2023 02:46:34 +0200 Subject: [PATCH 227/294] baeldung-articles : BAEL-7071 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Commit for the article "Convert Byte Array to JSON and Vice Versa in Java" which adds the "ByteArrayToJsonAndViseVerseUnitTest" class to convert a byte array to JSON and vicе vеrsa in Java. --- .../ByteArrayToJsonAndViseVerseUnitTest.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviseverse/ByteArrayToJsonAndViseVerseUnitTest.java diff --git a/json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviseverse/ByteArrayToJsonAndViseVerseUnitTest.java b/json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviseverse/ByteArrayToJsonAndViseVerseUnitTest.java new file mode 100644 index 0000000000..1fb6133ee3 --- /dev/null +++ b/json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviseverse/ByteArrayToJsonAndViseVerseUnitTest.java @@ -0,0 +1,51 @@ +package com.baeldung.bytearraytojsonandviseverse; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; +import org.junit.jupiter.api.Test; + +import java.nio.charset.StandardCharsets; +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ByteArrayToJsonAndViseVerseUnitTest { + + byte[] byteArray = {34, 123, 92, 34, 110, 97, 109, 101, 92, 34, 58, 92, 34, 65, 108, 105, 99, 101, 92, 34, 44, 92, 34, 97, 103, 101, 92, 34, 58, 50, 53, 44, 92, 34, 105, 115, 83, 116, 117, 100, 101, 110, 116, 92, 34, 58, 116, 114, 117, 101, 44, 92, 34, 104, 111, 98, 98, 105, 101, 115, 92, 34, 58, 91, 92, 34, 114, 101, 97, 100, 105, 110, 103, 92, 34, 44, 92, 34, 112, 97, 105, 110, 116, 105, 110, 103, 92, 34, 93, 44, 92, 34, 97, 100, 100, 114, 101, 115, 115, 92, 34, 58, 123, 92, 34, 99, 105, 116, 121, 92, 34, 58, 92, 34, 83, 109, 97, 108, 108, 118, 105, 108, 108, 101, 92, 34, 44, 92, 34, 122, 105, 112, 99, 111, 100, 101, 92, 34, 58, 92, 34, 49, 50, 51, 52, 53, 92, 34, 125, 125, 34}; + String jsonString = "{\"name\":\"Alice\",\"age\":25,\"isStudent\":true,\"hobbies\":[\"reading\",\"painting\"],\"address\":{\"city\":\"Smallville\",\"zipcode\":\"12345\"}}"; + + @Test + void givenByteArray_whenConvertingToJsonUsingJackson_thenJsonString() throws Exception { + ObjectMapper objectMapper = new ObjectMapper(); + String actualJsonString = objectMapper.readValue(byteArray, String.class); + + assertEquals(jsonString, actualJsonString); + } + + @Test + void givenByteArray_whenConvertingToJsonUsingGson_thenJsonString() { + Gson gson = new Gson(); + String jsonStringFromByteArray = new String(byteArray, StandardCharsets.UTF_8); + String actualJsonString = gson.fromJson(jsonStringFromByteArray, String.class); + + assertEquals(jsonString, actualJsonString); + } + + @Test + void givenJsonString_whenConvertingToByteArrayUsingJackson_thenByteArray() throws JsonProcessingException { + + ObjectMapper objectMapper = new ObjectMapper(); + byte[] actualByteArray = objectMapper.writeValueAsBytes(jsonString); + + assertEquals(Arrays.toString(byteArray), Arrays.toString(actualByteArray)); + } + + @Test + void givenJsonString_whenConvertingToByteArrayUsingGson_thenByteArray() { + Gson gson = new Gson(); + byte[] actualByteArray = gson.toJson(jsonString).getBytes(); + + assertEquals(Arrays.toString(byteArray), Arrays.toString(actualByteArray)); + } +} From 51f2ed495b909aef4c94f6d4975879dbef2da814 Mon Sep 17 00:00:00 2001 From: vunamtien Date: Fri, 15 Dec 2023 14:29:22 +0700 Subject: [PATCH 228/294] BAEL-7106-compress-and-uncompress-bytes-2 (#15398) --- .../compressbytes/CompressByteArrayUtil.java | 17 ++++++++ .../CompressByteArrayUnitTest.java | 39 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 core-java-modules/core-java-lang-6/src/test/java/com/baeldung/compressbytes/CompressByteArrayUnitTest.java diff --git a/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/compressbytes/CompressByteArrayUtil.java b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/compressbytes/CompressByteArrayUtil.java index 88e2283985..5a7ea2da58 100644 --- a/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/compressbytes/CompressByteArrayUtil.java +++ b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/compressbytes/CompressByteArrayUtil.java @@ -23,6 +23,23 @@ public class CompressByteArrayUtil { return outputStream.toByteArray(); } + public static byte[] compressWithCustomLevel(byte[] input, int level) { + Deflater deflater = new Deflater(); + deflater.setInput(input); + deflater.setLevel(level); + deflater.finish(); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + + while (!deflater.finished()) { + int compressedSize = deflater.deflate(buffer); + outputStream.write(buffer, 0, compressedSize); + } + + return outputStream.toByteArray(); + } + public static byte[] decompress(byte[] input) throws DataFormatException { Inflater inflater = new Inflater(); inflater.setInput(input); diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/compressbytes/CompressByteArrayUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/compressbytes/CompressByteArrayUnitTest.java new file mode 100644 index 0000000000..822ad5063c --- /dev/null +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/compressbytes/CompressByteArrayUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.compressbytes; + +import org.junit.jupiter.api.Test; + +import java.util.zip.DataFormatException; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class CompressByteArrayUnitTest { + + private static final String INPUT_STRING = "Building a REST API is not a trivial task – from the high-level RESTful " + + "constraints down to the nitty-gritty of making everything work and work well." + + "Spring has made REST a first-class citizen and the platform has been maturing in leaps and bounds." + + "With this guide, my aim is to organize the mountains of information that are available on the subject and " + + "guide you through properly building an API." + + "The guide starts with the basics – bootstrapping the REST API, the Spring MVC Configuration, and basic customization."; + + @Test + void givenInputString_whenCompressWithDefaultLevel_thenDecompressWithSameSize() throws DataFormatException { + byte[] input = INPUT_STRING.getBytes(); + byte[] compressedData = CompressByteArrayUtil.compress(input); + byte[] decompressedData = CompressByteArrayUtil.decompress(compressedData); + System.out.println("Original: " + input.length + " bytes"); + System.out.println("Compressed: " + compressedData.length + " bytes"); + System.out.println("Decompressed: " + decompressedData.length + " bytes"); + assertEquals(input.length, decompressedData.length); + } + + @Test + void givenInputString_whenCompressWithCustomLevel_thenDecompressWithSameSize() throws DataFormatException { + byte[] input = INPUT_STRING.getBytes(); + byte[] compressedData = CompressByteArrayUtil.compressWithCustomLevel(input, 1); + byte[] decompressedData = CompressByteArrayUtil.decompress(compressedData); + System.out.println("Original: " + input.length + " bytes"); + System.out.println("Compressed: " + compressedData.length + " bytes"); + System.out.println("Decompressed: " + decompressedData.length + " bytes"); + assertEquals(input.length, decompressedData.length); + } +} From d8bbd3d027274927c44ec3ff5f2b14d003a452b6 Mon Sep 17 00:00:00 2001 From: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Date: Fri, 15 Dec 2023 08:45:42 +0100 Subject: [PATCH 229/294] BAEL-7277: Disable fail_on_empty_beans in Jackson (#15394) --- .../com/baeldung/exceptions/EmptyObject.java | 5 +++++ .../JacksonMappingExceptionUnitTest.java | 22 ++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/EmptyObject.java diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/EmptyObject.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/EmptyObject.java new file mode 100644 index 0000000000..fa62e1c42c --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/EmptyObject.java @@ -0,0 +1,5 @@ +package com.baeldung.exceptions; + +public class EmptyObject { + +} diff --git a/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mappingexception/JacksonMappingExceptionUnitTest.java b/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mappingexception/JacksonMappingExceptionUnitTest.java index 026fd6719f..c680aec703 100644 --- a/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mappingexception/JacksonMappingExceptionUnitTest.java +++ b/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mappingexception/JacksonMappingExceptionUnitTest.java @@ -2,13 +2,15 @@ package com.baeldung.mappingexception; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.notNullValue; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertThrows; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.Arrays; +import com.baeldung.exceptions.EmptyObject; +import com.baeldung.exceptions.Person; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.SerializationFeature; import org.junit.Test; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; @@ -73,4 +75,18 @@ public class JacksonMappingExceptionUnitTest { assertEquals(Arrays.asList("Amsterdam", "Tamassint"), country.getCities()); } + @Test + public void givenEmptyBean_whenSerializing_thenCorrect() throws JsonProcessingException { + // Create an ObjectMapper + ObjectMapper objectMapper = new ObjectMapper(); + // Disable fail_on_empty_beans during serialization + objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + // Create an empty object + EmptyObject emptyObject = new EmptyObject(); + // Serialize the empty object + String json = objectMapper.writeValueAsString(emptyObject); + // Verify that serialization is successful + assertEquals("{}", json); + } + } From 0203ff1f0a4e2b81ea507a636dc1a54d82360fd9 Mon Sep 17 00:00:00 2001 From: "emanuel.trandafir" Date: Fri, 15 Dec 2023 12:44:12 +0100 Subject: [PATCH 230/294] BAEL-7258: increase pom versions --- apache-kafka-2/pom.xml | 4 +- .../kafka/consumer/CustomKafkaListener.java | 15 +----- .../consumer/CustomKafkaListenerLiveTest.java | 53 ++++++++++++------- 3 files changed, 38 insertions(+), 34 deletions(-) diff --git a/apache-kafka-2/pom.xml b/apache-kafka-2/pom.xml index cd21a60e14..53217731c7 100644 --- a/apache-kafka-2/pom.xml +++ b/apache-kafka-2/pom.xml @@ -61,9 +61,9 @@ 5.7.0 - 2.8.0 + 3.6.1 1.19.3 - 1.15.3 + 1.19.3 2.15.2 diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/consumer/CustomKafkaListener.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/consumer/CustomKafkaListener.java index b432c2ba55..f4cefb21eb 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/consumer/CustomKafkaListener.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/consumer/CustomKafkaListener.java @@ -12,14 +12,10 @@ import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.KafkaConsumer; import org.apache.kafka.common.serialization.StringDeserializer; -public class CustomKafkaListener implements Runnable, AutoCloseable { - +public class CustomKafkaListener implements Runnable { private static final Logger log = Logger.getLogger(CustomKafkaListener.class.getName()); - private final String topic; private final KafkaConsumer consumer; - - private final AtomicBoolean running = new AtomicBoolean(false); private Consumer recordConsumer; @@ -50,18 +46,11 @@ public class CustomKafkaListener implements Runnable, AutoCloseable { @Override public void run() { - running.set(true); consumer.subscribe(Arrays.asList(topic)); - while (running.get()) { + while (true) { consumer.poll(Duration.ofMillis(100)) .forEach(record -> recordConsumer.accept(record.value())); } } - @Override - public void close() { - running.set(false); - consumer.close(); - } - } diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/CustomKafkaListenerLiveTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/CustomKafkaListenerLiveTest.java index dbe7483dcd..cba0aacce6 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/CustomKafkaListenerLiveTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/CustomKafkaListenerLiveTest.java @@ -4,18 +4,32 @@ import static java.time.Duration.ofMillis; import static java.time.Duration.ofSeconds; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.testcontainers.shaded.org.awaitility.Awaitility.await; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Properties; +import java.time.Duration; +import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import org.apache.kafka.clients.admin.Admin; +import org.apache.kafka.clients.admin.AdminClientConfig; +import org.apache.kafka.clients.admin.NewTopic; +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.RecordMetadata; +import org.apache.kafka.common.header.Header; +import org.apache.kafka.common.header.Headers; +import org.apache.kafka.common.serialization.StringDeserializer; import org.apache.kafka.common.serialization.StringSerializer; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.testcontainers.containers.KafkaContainer; import org.testcontainers.junit.jupiter.Container; @@ -30,7 +44,7 @@ class CustomKafkaListenerLiveTest { private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); static { - Awaitility.setDefaultTimeout(ofSeconds(1L)); + Awaitility.setDefaultTimeout(ofSeconds(5L)); Awaitility.setDefaultPollInterval(ofMillis(50L)); } @@ -42,33 +56,34 @@ class CustomKafkaListenerLiveTest { List consumedMessages = new ArrayList<>(); // when - try (CustomKafkaListener listener = new CustomKafkaListener(topic, bootstrapServers).onEach(consumedMessages::add)) { - CompletableFuture.runAsync(listener); - } + CustomKafkaListener listener = new CustomKafkaListener(topic, bootstrapServers).onEach(consumedMessages::add); + CompletableFuture.runAsync(listener); + // and publishArticles(topic, + "Introduction to Kafka", + "Kotlin for Java Developers", + "Reactive Spring Boot", + "Deploying Spring Boot Applications", + "Spring Security" + ); + + // then + await().untilAsserted(() -> + assertThat(consumedMessages).containsExactlyInAnyOrder( "Introduction to Kafka", "Kotlin for Java Developers", "Reactive Spring Boot", "Deploying Spring Boot Applications", "Spring Security" - ); + )); - // then - await().untilAsserted(() -> - assertThat(consumedMessages).containsExactlyInAnyOrder( - "Introduction to Kafka", - "Kotlin for Java Developers", - "Reactive Spring Boot", - "Deploying Spring Boot Applications", - "Spring Security" - )); } private void publishArticles(String topic, String... articles) { try (KafkaProducer producer = testKafkaProducer()) { Arrays.stream(articles) - .map(article -> new ProducerRecord(topic, article)) + .map(article -> new ProducerRecord<>(topic, "key-1", article)) .forEach(producer::send); } } From 89817e2cda14014914ebcc34c48ca1b6d25ed085 Mon Sep 17 00:00:00 2001 From: "emanuel.trandafir" Date: Fri, 15 Dec 2023 12:47:19 +0100 Subject: [PATCH 231/294] MKT-7258: optimize imports --- .../consumer/CustomKafkaListenerLiveTest.java | 25 +++---------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/CustomKafkaListenerLiveTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/CustomKafkaListenerLiveTest.java index cba0aacce6..201a72114d 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/CustomKafkaListenerLiveTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/consumer/CustomKafkaListenerLiveTest.java @@ -2,34 +2,19 @@ package com.baeldung.kafka.consumer; import static java.time.Duration.ofMillis; import static java.time.Duration.ofSeconds; -import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.testcontainers.shaded.org.awaitility.Awaitility.await; -import java.time.Duration; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Properties; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import org.apache.kafka.clients.admin.Admin; -import org.apache.kafka.clients.admin.AdminClientConfig; -import org.apache.kafka.clients.admin.NewTopic; -import org.apache.kafka.clients.consumer.ConsumerConfig; -import org.apache.kafka.clients.consumer.ConsumerRecord; -import org.apache.kafka.clients.consumer.ConsumerRecords; -import org.apache.kafka.clients.consumer.KafkaConsumer; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; -import org.apache.kafka.clients.producer.RecordMetadata; -import org.apache.kafka.common.header.Header; -import org.apache.kafka.common.header.Headers; -import org.apache.kafka.common.serialization.StringDeserializer; import org.apache.kafka.common.serialization.StringSerializer; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.testcontainers.containers.KafkaContainer; import org.testcontainers.junit.jupiter.Container; @@ -77,7 +62,6 @@ class CustomKafkaListenerLiveTest { "Deploying Spring Boot Applications", "Spring Security" )); - } private void publishArticles(String topic, String... articles) { @@ -95,5 +79,4 @@ class CustomKafkaListenerLiveTest { props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); return new KafkaProducer<>(props); } - } \ No newline at end of file From 2a835a364a5f33e9c333f80315341ab3b3db5ff4 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Sat, 16 Dec 2023 00:16:22 +0530 Subject: [PATCH 232/294] BAEL-7308, renamed methods --- .../compareany/CompareAnyBenchmark.java | 20 ++--- .../compareany/CompareAnyUnitTest.java | 85 ++++++++++--------- 2 files changed, 54 insertions(+), 51 deletions(-) diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyBenchmark.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyBenchmark.java index 9a4e5e9431..c018cca718 100644 --- a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyBenchmark.java +++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyBenchmark.java @@ -31,52 +31,52 @@ public class CompareAnyBenchmark { private final String fruit = "Apple"; @Benchmark - public boolean compareWithAnyUsingStringUtils() { + public boolean compareWithMultipleStringsUsingStringUtils() { return StringUtils.equalsAny(fruit, groupOfFruits); } @Benchmark - public boolean compareWithAnyCaseInsensitiveUsingStringUtils() { + public boolean compareCaseInsensitiveWithMultipleStringsUsingStringUtils() { return StringUtils.equalsAnyIgnoreCase(fruit, groupOfFruits); } @Benchmark - public boolean compareWithAnyUsingSet() { + public boolean compareWithMultipleStringsUsingSet() { return Set.of(groupOfFruits).contains(fruit); } @Benchmark - public boolean compareWithAnyUsingList() { + public boolean compareWithMultipleStringsUsingList() { return List.of(groupOfFruits).contains(fruit); } @Benchmark - public boolean compareWithAnyUsingRegularExpression() { + public boolean compareWithMultipleStringsUsingRegularExpression() { return fruit.matches(String.join("|", groupOfFruits)); } @Benchmark - public boolean compareWithAnyCaseInsensitiveUsingRegularExpression() { + public boolean compareCaseInsensitiveWithMultipleStringsUsingRegularExpression() { return fruit.matches("(?i)" + String.join("|", groupOfFruits)); } @Benchmark - public boolean compareWithAnyUsingStream() { + public boolean compareWithMultipleStringsUsingStream() { return Arrays.stream(groupOfFruits).anyMatch(fruit::equals); } @Benchmark - public boolean compareWithAnyCaseInsensitiveUsingStream() { + public boolean compareCaseInsensitiveWithMultipleStringsUsingStream() { return Arrays.stream(groupOfFruits).anyMatch(fruit::equalsIgnoreCase); } @Benchmark - public boolean compareWithAnyUsingArrayUtils() { + public boolean compareWithMultipleStringsUsingArrayUtils() { return ArrayUtils.contains(groupOfFruits, fruit); } @Benchmark - public boolean compareWithAnyWithIf() { + public boolean compareWithMultipleStringsUsingIf() { for(String s : groupOfFruits) { if (fruit.equals(s)) { return true; diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyUnitTest.java index 818035971d..b26c05720d 100644 --- a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyUnitTest.java +++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyUnitTest.java @@ -14,96 +14,97 @@ import org.junit.jupiter.api.Test; public class CompareAnyUnitTest { @Test - void givenStrings_whenCompareUsingIf_thenSuccess() { + void givenStrings_whenCompareWithMultipleStringsUsingIf_thenSuccess() { String presentString = "Apple"; String notPresentString = "Avocado"; - assertTrue(compareWithAnyWithIf(presentString, "Mango", "Papaya", "Pineapple", "Apple")); - assertFalse(compareWithAnyWithIf(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertTrue(compareWithMultipleStringsUsingIf(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareWithMultipleStringsUsingIf(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } @Test - void givenStrings_whenCompareUsingArrayUtils_thenSuccess() { + void givenStrings_whenCompareWithMultipleStringsUsingArrayUtils_thenSuccess() { String presentString = "Apple"; String notPresentString = "Avocado"; - assertTrue(compareWithAnyUsingArrayUtils(presentString, "Mango", "Papaya", "Pineapple", "Apple")); - assertFalse(compareWithAnyUsingArrayUtils(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertTrue(compareWithMultipleStringsUsingArrayUtils(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareWithMultipleStringsUsingArrayUtils(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } @Test - void givenStrings_whenCompareUsingStringUtils_thenSuccess() { + void givenStrings_whenCompareWithMultipleStringsUsingStringUtils_thenSuccess() { String presentString = "Apple"; String notPresentString = "Avocado"; - assertTrue(compareWithAnyUsingStringUtils(presentString, "Mango", "Papaya", "Pineapple", "Apple")); - assertFalse(compareWithAnyUsingStringUtils(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertTrue(compareWithMultipleStringsUsingStringUtils(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareWithMultipleStringsUsingStringUtils(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } @Test - void givenStrings_whenCompareCaseInsensitiveUsingStringUtils_thenSuccess() { + void givenStrings_whenCompareCaseInsensitiveWithMultipleStringsUsingStringUtils_thenSuccess() { String presentString = "APPLE"; String notPresentString = "AVOCADO"; - assertTrue(compareWithAnyCaseInsensitiveUsingStringUtils(presentString, "Mango", "Papaya", "Pineapple", "Apple")); - assertFalse(compareWithAnyCaseInsensitiveUsingStringUtils(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertTrue(compareCaseInsensitiveWithMultipleStringsUsingStringUtils(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareCaseInsensitiveWithMultipleStringsUsingStringUtils(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } + @Test - void givenStrings_whenCompareUsingStream_thenSuccess() { + void givenStrings_whenCompareWithMultipleStringsUsingStream_thenSuccess() { String presentString = "Apple"; String notPresentString = "Avocado"; - assertTrue(compareWithAnyUsingStream(presentString, "Mango", "Papaya", "Pineapple", "Apple")); - assertFalse(compareWithAnyUsingStream(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertTrue(compareWithMultipleStringsUsingStream(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareWithMultipleStringsUsingStream(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } @Test - void givenStrings_whenCompareCaseInsensitiveUsingStream_thenSuccess() { + void givenStrings_whenCompareCaseInsensitiveWithMultipleStringsUsingStream_thenSuccess() { String presentString = "APPLE"; String notPresentString = "AVOCADO"; - assertTrue(compareWithAnyCaseInsensitiveUsingStream(presentString, "Mango", "Papaya", "Pineapple", "Apple")); - assertFalse(compareWithAnyCaseInsensitiveUsingStream(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertTrue(compareCaseInsensitiveWithMultipleStringsUsingStream(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareCaseInsensitiveWithMultipleStringsUsingStream(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } @Test - void givenStrings_whenCompareUsingSet_thenSuccess() { + void givenStrings_whenCompareWithMultipleStringsUsingSet_thenSuccess() { String presentString = "Apple"; String notPresentString = "Avocado"; - assertTrue(compareWithAnyUsingSet(presentString, "Mango", "Papaya", "Pineapple", "Apple")); - assertFalse(compareWithAnyUsingSet(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertTrue(compareWithMultipleStringUsingSet(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareWithMultipleStringUsingSet(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } @Test - void givenStrings_whenCompareUsingList_thenSuccess() { + void givenStrings_whenCompareWithMultipleStringsUsingList_thenSuccess() { String presentString = "Apple"; String notPresentString = "Avocado"; - assertTrue(compareWithAnyUsingList(presentString, "Mango", "Papaya", "Pineapple", "Apple")); - assertFalse(compareWithAnyUsingList(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertTrue(compareWithMultipleStringsUsingList(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareWithMultipleStringsUsingList(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } @Test - void givenStrings_whenCompareUsingRegularExpression_thenSuccess() { + void givenStrings_whenCompareWithMultipleStringsUsingRegularExpression_thenSuccess() { String presentString = "Apple"; String notPresentString = "Avocado"; - assertTrue(compareWithAnyUsingRegularExpression(presentString, "Mango", "Papaya", "Pineapple", "Apple")); - assertFalse(compareWithAnyUsingRegularExpression(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertTrue(compareWithMultipleStringsUsingRegularExpression(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareWithMultipleStringsUsingRegularExpression(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } @Test - void givenStrings_whenCompareCaseInsensitiveUsingRegularExpression_thenSuccess() { + void givenStrings_whenCompareCaseInsensitiveWithMultipleStringsUsingRegularExpression_thenSuccess() { String presentString = "APPLE"; String notPresentString = "AVOCADO"; - assertTrue(compareWithAnyCaseInsensitiveUsingRegularExpression(presentString, "Mango", "Papaya", "Pineapple", "Apple")); - assertFalse(compareWithAnyCaseInsensitiveUsingRegularExpression(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertTrue(compareCaseInsensitiveWithMultipleStringsUsingRegularExpression(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareCaseInsensitiveWithMultipleStringsUsingRegularExpression(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } - private boolean compareWithAnyWithIf(String str, String ... strs) { - for(String s : strs) { + private boolean compareWithMultipleStringsUsingIf(String str, String... strs) { + for (String s : strs) { if (str.equals(s)) { return true; } @@ -111,37 +112,39 @@ public class CompareAnyUnitTest { return false; } - private boolean compareWithAnyUsingStringUtils(String str, String ... strs) { + private boolean compareWithMultipleStringsUsingStringUtils(String str, String... strs) { return StringUtils.equalsAny(str, strs); } - private boolean compareWithAnyCaseInsensitiveUsingStringUtils(String str, String ... strs) { + private boolean compareCaseInsensitiveWithMultipleStringsUsingStringUtils(String str, String... strs) { return StringUtils.equalsAnyIgnoreCase(str, strs); } - private boolean compareWithAnyUsingSet(String str, String ... strs) { + private boolean compareWithMultipleStringUsingSet(String str, String... strs) { return Set.of(strs).contains(str); } - private boolean compareWithAnyUsingList(String str, String ... strs) { + private boolean compareWithMultipleStringsUsingList(String str, String... strs) { return List.of(strs).contains(str); } - private boolean compareWithAnyUsingRegularExpression(String str, String ... strs) { + private boolean compareWithMultipleStringsUsingRegularExpression(String str, String... strs) { return str.matches(String.join("|", strs)); } - private boolean compareWithAnyCaseInsensitiveUsingRegularExpression(String str, String ... strs) { + private boolean compareCaseInsensitiveWithMultipleStringsUsingRegularExpression(String str, String... strs) { return str.matches("(?i)" + String.join("|", strs)); } - private boolean compareWithAnyUsingStream(String str, String ... strs) { + private boolean compareWithMultipleStringsUsingStream(String str, String... strs) { return Arrays.stream(strs).anyMatch(str::equals); } - private boolean compareWithAnyCaseInsensitiveUsingStream(String str, String ... strs) { + + private boolean compareCaseInsensitiveWithMultipleStringsUsingStream(String str, String... strs) { return Arrays.stream(strs).anyMatch(str::equalsIgnoreCase); } - private boolean compareWithAnyUsingArrayUtils(String str, String ... strs) { + + private boolean compareWithMultipleStringsUsingArrayUtils(String str, String... strs) { return ArrayUtils.contains(strs, str); } } From 72b6c786461b657b238944c8b9da4b378fbfc552 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sat, 16 Dec 2023 00:47:36 +0100 Subject: [PATCH 233/294] [last-iteration] detect the last iteration (#15414) * [last-iteration] detect the last iteration * [last-iteration] add core-java-loops module --- core-java-modules/core-java-loops/README.md | 1 + core-java-modules/core-java-loops/pom.xml | 16 ++++ .../TheLastIterationInForEachUnitTest.java | 93 +++++++++++++++++++ core-java-modules/pom.xml | 1 + 4 files changed, 111 insertions(+) create mode 100644 core-java-modules/core-java-loops/README.md create mode 100644 core-java-modules/core-java-loops/pom.xml create mode 100644 core-java-modules/core-java-loops/src/test/java/com/baeldung/loops/TheLastIterationInForEachUnitTest.java diff --git a/core-java-modules/core-java-loops/README.md b/core-java-modules/core-java-loops/README.md new file mode 100644 index 0000000000..5616cce48b --- /dev/null +++ b/core-java-modules/core-java-loops/README.md @@ -0,0 +1 @@ +## Relevant Articles diff --git a/core-java-modules/core-java-loops/pom.xml b/core-java-modules/core-java-loops/pom.xml new file mode 100644 index 0000000000..c9ce86f54b --- /dev/null +++ b/core-java-modules/core-java-loops/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + core-java-loops + core-java-loops + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + diff --git a/core-java-modules/core-java-loops/src/test/java/com/baeldung/loops/TheLastIterationInForEachUnitTest.java b/core-java-modules/core-java-loops/src/test/java/com/baeldung/loops/TheLastIterationInForEachUnitTest.java new file mode 100644 index 0000000000..e8e20d4db7 --- /dev/null +++ b/core-java-modules/core-java-loops/src/test/java/com/baeldung/loops/TheLastIterationInForEachUnitTest.java @@ -0,0 +1,93 @@ +package com.baeldung.loops; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.stream.IntStream; + +import org.junit.jupiter.api.Test; + +public class TheLastIterationInForEachUnitTest { + + //@formatter:off + private static final List MOVIES = List.of( + "Titanic", + "The Deer Hunter", + "Lord of the Rings", + "One Flew Over the Cuckoo's Nest", + "No Country For Old Men"); + //@formatter:on + + @Test + void whenUsingForEach_thenGetTheLastElementAfterTheLoop() { + String myLastMovie = ""; + for (String movie : MOVIES) { + // ... work with movie + myLastMovie = movie; + } + assertEquals("No Country For Old Men", myLastMovie); + } + + @Test + void whenLoopingWithIndexes_thenGetExpectedResult() { + int size = MOVIES.size(); + String myLastMovie = null; + for (int i = 0; i < size; i++) { + String movie = MOVIES.get(i); + // ... work with movie + if (i == size - 1) { + myLastMovie = movie; + } + } + assertEquals("No Country For Old Men", myLastMovie); + } + + @Test + void whenUsingIntStream_thenGetExpectedResult() { + int size = MOVIES.size(); + final Map myLastMovie = new HashMap<>(); + IntStream.range(0, size) + .forEach(idx -> { + String movie = MOVIES.get(idx); + // ... work with movie + if (idx == size - 1) { + myLastMovie.put(idx, movie); + } + }); + assertEquals(1, myLastMovie.size()); + assertTrue(myLastMovie.containsKey(size - 1)); + assertTrue(myLastMovie.containsValue("No Country For Old Men")); + } + + @Test + void whenUsingCounter_thenGetExpectedResult() { + int size = MOVIES.size(); + String myLastMovie = null; + int cnt = 0; + for (String movie : MOVIES) { + // ... work with movie + if (++cnt == size) { + myLastMovie = movie; + } + } + assertEquals("No Country For Old Men", myLastMovie); + } + + @Test + void whenUsingIterator_thenGetExpectedResult() { + String movie; + String myLastMovie = null; + for (Iterator it = MOVIES.iterator(); it.hasNext(); ) { + movie = it.next(); + // ... work with movie + if (!it.hasNext()) { // the last element + myLastMovie = movie; + } + } + assertEquals("No Country For Old Men", myLastMovie); + } +} \ No newline at end of file diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index d20a1650b9..f16cff3987 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -155,6 +155,7 @@ core-java-lang-syntax core-java-lang-syntax-2 core-java-locale + core-java-loops core-java-networking core-java-networking-2 core-java-networking-4 From b89c49b834eb7593f289ba0739f07e5a1cef98cb Mon Sep 17 00:00:00 2001 From: Bhaskar Ghosh Dastidar Date: Sat, 16 Dec 2023 09:16:10 +0530 Subject: [PATCH 234/294] [BAEL-6535] hydration of object examples (#15421) Co-authored-by: Bhaskar --- libraries-data/pom.xml | 15 ++++ .../com/baeldung/objecthydration/User.java | 75 +++++++++++++++++++ .../UserSerialisationDeserialisation.java | 34 +++++++++ .../baeldung/objecthydration/entity/Book.java | 71 ++++++++++++++++++ .../repository/BookRepository.java | 7 ++ .../objecthydration/HydrationUnitTest.java | 40 ++++++++++ 6 files changed, 242 insertions(+) create mode 100644 libraries-data/src/main/java/com/baeldung/objecthydration/User.java create mode 100644 libraries-data/src/main/java/com/baeldung/objecthydration/UserSerialisationDeserialisation.java create mode 100644 libraries-data/src/main/java/com/baeldung/objecthydration/entity/Book.java create mode 100644 libraries-data/src/main/java/com/baeldung/objecthydration/repository/BookRepository.java create mode 100644 libraries-data/src/test/java/com/baeldung/objecthydration/HydrationUnitTest.java diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml index 85ef01e704..bab544e203 100644 --- a/libraries-data/pom.xml +++ b/libraries-data/pom.xml @@ -97,6 +97,11 @@ + + com.h2database + h2 + 1.3.170 + com.fasterxml.jackson.core jackson-databind @@ -150,6 +155,16 @@ xstream 1.4.16 + + org.springframework.data + spring-data-jpa + 2.1.5.RELEASE + + + javax.persistence + javax.persistence-api + 2.2 + diff --git a/libraries-data/src/main/java/com/baeldung/objecthydration/User.java b/libraries-data/src/main/java/com/baeldung/objecthydration/User.java new file mode 100644 index 0000000000..9d879d62c4 --- /dev/null +++ b/libraries-data/src/main/java/com/baeldung/objecthydration/User.java @@ -0,0 +1,75 @@ +package com.baeldung.objecthydration; + +import java.io.Serializable; +import java.util.Objects; + +public class User implements Serializable { + private String uId; + private String firstName; + private String lastName; + private String alias; + + public User() { + } + + public User(String firstName, String uId, String lastName, String alias) { + this.firstName = firstName; + this.uId = uId; + this.lastName = lastName; + this.alias = alias; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + User user = (User) o; + return Objects.equals(firstName, user.firstName) && Objects.equals(uId, user.uId) && Objects.equals(lastName, user.lastName) && Objects.equals(alias, user.alias); + } + + public String getuId() { + return uId; + } + + public void setuId(String uId) { + this.uId = uId; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getAlias() { + return alias; + } + + public void setAlias(String alias) { + this.alias = alias; + } + + public void generateMyUser() { + this.setAlias("007"); + this.setFirstName("James"); + this.setLastName("Bond"); + this.setuId("JB"); + } + + @Override + public int hashCode() { + return Objects.hash(firstName, uId, lastName, alias); + } +} diff --git a/libraries-data/src/main/java/com/baeldung/objecthydration/UserSerialisationDeserialisation.java b/libraries-data/src/main/java/com/baeldung/objecthydration/UserSerialisationDeserialisation.java new file mode 100644 index 0000000000..c9d8c5773f --- /dev/null +++ b/libraries-data/src/main/java/com/baeldung/objecthydration/UserSerialisationDeserialisation.java @@ -0,0 +1,34 @@ +package com.baeldung.objecthydration; + +import java.io.*; + +public class UserSerialisationDeserialisation { + public void serialisedUser(User user, String outputName) { + try { + FileOutputStream fileOut = new FileOutputStream(outputName); + ObjectOutputStream out = new ObjectOutputStream(fileOut); + out.writeObject(user); + out.close(); + fileOut.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public User deserialiseUser(String serialisedFile) { + User deserializedUser = null; + try { + FileInputStream fileIn = new FileInputStream(serialisedFile); + ObjectInputStream in = new ObjectInputStream(fileIn); + deserializedUser = (User) in.readObject(); + in.close(); + fileIn.close(); + } catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + } finally { + File f = new File(serialisedFile); + f.delete(); + } + return deserializedUser; + } +} diff --git a/libraries-data/src/main/java/com/baeldung/objecthydration/entity/Book.java b/libraries-data/src/main/java/com/baeldung/objecthydration/entity/Book.java new file mode 100644 index 0000000000..3ae22cee88 --- /dev/null +++ b/libraries-data/src/main/java/com/baeldung/objecthydration/entity/Book.java @@ -0,0 +1,71 @@ +package com.baeldung.objecthydration.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 = "books") +public class Book { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "name") + private String name; + + @Column(name = "author") + private String author; + + @Column(name = "isbn") + private String isbn; + + // Constructors, getters, and setters + + public Book() { + // Default constructor required by Hibernate + } + + public Book(String name, String author, String isbn) { + this.name = name; + this.author = author; + this.isbn = isbn; + } + + // Getters and setters for all attributes + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getIsbn() { + return isbn; + } + + public void setIsbn(String isbn) { + this.isbn = isbn; + } +} \ No newline at end of file diff --git a/libraries-data/src/main/java/com/baeldung/objecthydration/repository/BookRepository.java b/libraries-data/src/main/java/com/baeldung/objecthydration/repository/BookRepository.java new file mode 100644 index 0000000000..a8e92eab8e --- /dev/null +++ b/libraries-data/src/main/java/com/baeldung/objecthydration/repository/BookRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.objecthydration.repository; + +import com.baeldung.objecthydration.entity.Book; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface BookRepository extends JpaRepository { +} diff --git a/libraries-data/src/test/java/com/baeldung/objecthydration/HydrationUnitTest.java b/libraries-data/src/test/java/com/baeldung/objecthydration/HydrationUnitTest.java new file mode 100644 index 0000000000..317827346f --- /dev/null +++ b/libraries-data/src/test/java/com/baeldung/objecthydration/HydrationUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.objecthydration; + +import org.junit.Assert; +import org.junit.Test; + +public class HydrationUnitTest { + + @Test + public void givenEmptyClass_whenLazilyinitialised_thenGiveNullOnGet() { + User iamUser = new User(); + Assert.assertNull(iamUser.getuId()); + } + + @Test + public void givenInitialisedClass_withLazilyInitialised_thenDoesNotGiveNullOnGet() { + User iamUser = new User(); + iamUser.setAlias("007"); + Assert.assertNotNull(iamUser.getAlias()); + } + + @Test + public void givenEmptyClass_withHydration_thenShouldHaveAllAttributesSet() { + User jamesBond = new User(); + Assert.assertNull(jamesBond.getAlias()); + + jamesBond.generateMyUser(); + Assert.assertEquals("007", jamesBond.getAlias()); + } + + @Test + public void givenUser_thenShouldPerformUserSerialisationDeserialisation() { + User iamUser = new User(); + iamUser.setAlias("007"); + UserSerialisationDeserialisation usd = new UserSerialisationDeserialisation(); + usd.serialisedUser(iamUser, "bond.ser"); + User deserialisedUser = usd.deserialiseUser("bond.ser"); + Assert.assertEquals(iamUser.getAlias(), deserialisedUser.getAlias()); + + } +} From 1934b9f9440509fe3d456dfb0cafb43dd99e3d33 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Sat, 16 Dec 2023 11:03:41 +0200 Subject: [PATCH 235/294] JAVA-27019 Simplify spring-di modules' poms (#15330) --- spring-di-2/pom.xml | 34 ++---------- spring-di-3/pom.xml | 30 +--------- .../java/com/baeldung/autowiring/App.java | 1 - spring-di/pom.xml | 55 +------------------ 4 files changed, 9 insertions(+), 111 deletions(-) diff --git a/spring-di-2/pom.xml b/spring-di-2/pom.xml index 898dd182f1..6b4ecc6039 100644 --- a/spring-di-2/pom.xml +++ b/spring-di-2/pom.xml @@ -9,46 +9,21 @@ com.baeldung - parent-spring-6 + parent-boot-3 0.0.1-SNAPSHOT - ../parent-spring-6 + ../parent-boot-3 - - - - org.apache.logging.log4j - log4j-bom - ${log4j2.version} - import - pom - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - org.springframework.boot spring-boot-starter-web + ${spring-boot.version} org.springframework.boot spring-boot-starter-data-jpa - - - org.springframework - spring-aspects - - - org.springframework.boot - spring-boot-starter-test + ${spring-boot.version} @@ -79,7 +54,6 @@ - 3.1.2 1.13.1 2.17.1 diff --git a/spring-di-3/pom.xml b/spring-di-3/pom.xml index ba1a18ae8c..818ecc509c 100644 --- a/spring-di-3/pom.xml +++ b/spring-di-3/pom.xml @@ -9,44 +9,20 @@ com.baeldung - parent-spring-6 + parent-boot-3 0.0.1-SNAPSHOT - ../parent-spring-6 + ../parent-boot-3 - - - - org.apache.logging.log4j - log4j-bom - ${log4j2.version} - import - pom - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - - - org.springframework.boot - spring-boot-starter-web - org.springframework.boot spring-boot-starter-test + ${spring-boot.version} - 3.1.2 - 2.17.1 2.0.9 1.4.11 diff --git a/spring-di-3/src/main/java/com/baeldung/autowiring/App.java b/spring-di-3/src/main/java/com/baeldung/autowiring/App.java index d2d0db7a60..873b152da1 100644 --- a/spring-di-3/src/main/java/com/baeldung/autowiring/App.java +++ b/spring-di-3/src/main/java/com/baeldung/autowiring/App.java @@ -2,7 +2,6 @@ package com.baeldung.autowiring; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; @SpringBootApplication public class App { diff --git a/spring-di/pom.xml b/spring-di/pom.xml index d073f5359d..a1be835af7 100644 --- a/spring-di/pom.xml +++ b/spring-di/pom.xml @@ -10,44 +10,12 @@ com.baeldung - parent-spring-6 + parent-boot-3 0.0.1-SNAPSHOT - ../parent-spring-6 + ../parent-boot-3 - - - - org.springframework - spring-framework-bom - ${spring.version} - pom - import - - - org.springframework - spring-core - ${spring.version} - - - - - - org.springframework - spring-test - ${spring.version} - - - org.springframework - spring-beans - ${spring.version} - - - org.springframework - spring-context - ${spring.version} - com.google.guava guava @@ -63,12 +31,6 @@ spring-boot-starter ${spring-boot.version} - - org.springframework.boot - spring-boot-test - ${spring-boot.version} - test - commons-io commons-io @@ -79,17 +41,6 @@ aspectjweaver ${aspectjweaver.version} - - - - - - - - - - - @@ -132,8 +83,6 @@ org.baeldung.org.baeldung.sample.App - - 3.1.2 1.9.20.1 From b75927789902ee4741ca190eb356ddad3132b9a1 Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Sat, 16 Dec 2023 14:40:56 +0200 Subject: [PATCH 236/294] Update ByteArrayToJsonAndViseVerseUnitTest.java --- .../ByteArrayToJsonAndViseVerseUnitTest.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviseverse/ByteArrayToJsonAndViseVerseUnitTest.java b/json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviseverse/ByteArrayToJsonAndViseVerseUnitTest.java index 1fb6133ee3..b86d6e0187 100644 --- a/json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviseverse/ByteArrayToJsonAndViseVerseUnitTest.java +++ b/json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviseverse/ByteArrayToJsonAndViseVerseUnitTest.java @@ -12,7 +12,13 @@ import static org.junit.jupiter.api.Assertions.assertEquals; public class ByteArrayToJsonAndViseVerseUnitTest { - byte[] byteArray = {34, 123, 92, 34, 110, 97, 109, 101, 92, 34, 58, 92, 34, 65, 108, 105, 99, 101, 92, 34, 44, 92, 34, 97, 103, 101, 92, 34, 58, 50, 53, 44, 92, 34, 105, 115, 83, 116, 117, 100, 101, 110, 116, 92, 34, 58, 116, 114, 117, 101, 44, 92, 34, 104, 111, 98, 98, 105, 101, 115, 92, 34, 58, 91, 92, 34, 114, 101, 97, 100, 105, 110, 103, 92, 34, 44, 92, 34, 112, 97, 105, 110, 116, 105, 110, 103, 92, 34, 93, 44, 92, 34, 97, 100, 100, 114, 101, 115, 115, 92, 34, 58, 123, 92, 34, 99, 105, 116, 121, 92, 34, 58, 92, 34, 83, 109, 97, 108, 108, 118, 105, 108, 108, 101, 92, 34, 44, 92, 34, 122, 105, 112, 99, 111, 100, 101, 92, 34, 58, 92, 34, 49, 50, 51, 52, 53, 92, 34, 125, 125, 34}; + byte[] byteArray = {34, 123, 92, 34, 110, 97, 109, 101, 92, 34, 58, 92, 34, 65, 108, 105, 99, 101, 92, 34, 44, 92, 34, 97, 103, 101, 92, + 34, 58, 50, 53, 44, 92, 34, 105, 115, 83, 116, 117, 100, 101, 110, 116, 92, 34, 58, 116, 114, 117, 101, 44, 92, 34, + 104, 111, 98, 98, 105, 101, 115, 92, 34, 58, 91, 92, 34, 114, 101, 97, 100, 105, 110, 103, 92, 34, 44, 92, 34, 112, + 97, 105, 110, 116, 105, 110, 103, 92, 34, 93, 44, 92, 34, 97, 100, 100, 114, 101, 115, 115, 92, 34, 58, 123, 92, 34, + 99, 105, 116, 121, 92, 34, 58, 92, 34, 83, 109, 97, 108, 108, 118, 105, 108, 108, 101, 92, 34, 44, 92, 34, 122, 105, + 112, 99, 111, 100, 101, 92, 34, 58, 92, 34, 49, 50, 51, 52, 53, 92, 34, 125, 125, 34}; + String jsonString = "{\"name\":\"Alice\",\"age\":25,\"isStudent\":true,\"hobbies\":[\"reading\",\"painting\"],\"address\":{\"city\":\"Smallville\",\"zipcode\":\"12345\"}}"; @Test @@ -34,7 +40,6 @@ public class ByteArrayToJsonAndViseVerseUnitTest { @Test void givenJsonString_whenConvertingToByteArrayUsingJackson_thenByteArray() throws JsonProcessingException { - ObjectMapper objectMapper = new ObjectMapper(); byte[] actualByteArray = objectMapper.writeValueAsBytes(jsonString); From 841599a57974ed8a1a12fe5a6bdbe9e28c2f2666 Mon Sep 17 00:00:00 2001 From: Azhwani Date: Sun, 10 Dec 2023 18:54:05 +0100 Subject: [PATCH 237/294] BAEL-7280: How to get last record ordered by date in Spring Data --- .../jpa/listrepositories/lastrecord/Post.java | 40 +++++++++++++++++++ .../lastrecord/PostRepository.java | 15 +++++++ .../src/main/resources/data.sql | 8 +++- .../src/main/resources/schema.sql | 7 ++++ .../PostRepositoryIntegrationTest.java | 40 +++++++++++++++++++ 5 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/lastrecord/Post.java create mode 100644 persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/lastrecord/PostRepository.java create mode 100644 persistence-modules/spring-data-jpa-repo-3/src/test/java/com/baeldung/spring/data/jpa/listrepositories/lastrecord/PostRepositoryIntegrationTest.java diff --git a/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/lastrecord/Post.java b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/lastrecord/Post.java new file mode 100644 index 0000000000..c797a6378f --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/lastrecord/Post.java @@ -0,0 +1,40 @@ +package com.baeldung.spring.data.jpa.listrepositories.lastrecord; + +import java.time.LocalDate; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; + +@Entity +public class Post { + + @Id + private Long id; + private String title; + private LocalDate publicationDate; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public LocalDate getPublicationDate() { + return publicationDate; + } + + public void setPublicationDate(LocalDate publicationDate) { + this.publicationDate = publicationDate; + } + +} diff --git a/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/lastrecord/PostRepository.java b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/lastrecord/PostRepository.java new file mode 100644 index 0000000000..50d9e399c3 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/lastrecord/PostRepository.java @@ -0,0 +1,15 @@ +package com.baeldung.spring.data.jpa.listrepositories.lastrecord; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +public interface PostRepository extends JpaRepository { + + Post findFirstByOrderByPublicationDateDesc(); + + Post findTopByOrderByPublicationDateDesc(); + + @Query("SELECT p FROM Post p ORDER BY p.publicationDate DESC LIMIT 1") + Post findLastPost(); + +} diff --git a/persistence-modules/spring-data-jpa-repo-3/src/main/resources/data.sql b/persistence-modules/spring-data-jpa-repo-3/src/main/resources/data.sql index 50bd326155..8f114f1aa5 100644 --- a/persistence-modules/spring-data-jpa-repo-3/src/main/resources/data.sql +++ b/persistence-modules/spring-data-jpa-repo-3/src/main/resources/data.sql @@ -1,4 +1,10 @@ INSERT INTO person (id, first_name, last_name) VALUES(1, 'Azhrioun', 'Abderrahim'); INSERT INTO person (id, first_name, last_name) VALUES(2, 'Brian', 'Wheeler'); INSERT INTO person (id, first_name, last_name) VALUES(3, 'Stella', 'Anderson'); -INSERT INTO person (id, first_name, last_name) VALUES(4, 'Stella', 'Wheeler'); \ No newline at end of file +INSERT INTO person (id, first_name, last_name) VALUES(4, 'Stella', 'Wheeler'); + +INSERT INTO post (id, title, publication_date) VALUES(1, 'Facebook post', '2020-11-10'); +INSERT INTO post (id, title, publication_date) VALUES(2, 'Instagram post', '2020-12-24'); +INSERT INTO post (id, title, publication_date) VALUES(3, 'Twitter post', '2023-01-10'); +INSERT INTO post (id, title, publication_date) VALUES(4, 'tiktok post', '2023-03-18'); +INSERT INTO post (id, title, publication_date) VALUES(5, 'Pinterest post', '2023-09-09'); \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo-3/src/main/resources/schema.sql b/persistence-modules/spring-data-jpa-repo-3/src/main/resources/schema.sql index c8be0eb781..c991c04900 100644 --- a/persistence-modules/spring-data-jpa-repo-3/src/main/resources/schema.sql +++ b/persistence-modules/spring-data-jpa-repo-3/src/main/resources/schema.sql @@ -3,4 +3,11 @@ CREATE TABLE person( id INT PRIMARY KEY, first_name VARCHAR(200), last_name VARCHAR(200) +); + +DROP TABLE IF EXISTS post; +CREATE TABLE post( + id INT PRIMARY KEY, + title VARCHAR(200), + publication_date DATE ) \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo-3/src/test/java/com/baeldung/spring/data/jpa/listrepositories/lastrecord/PostRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-repo-3/src/test/java/com/baeldung/spring/data/jpa/listrepositories/lastrecord/PostRepositoryIntegrationTest.java new file mode 100644 index 0000000000..ecfb28574e --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-3/src/test/java/com/baeldung/spring/data/jpa/listrepositories/lastrecord/PostRepositoryIntegrationTest.java @@ -0,0 +1,40 @@ +package com.baeldung.spring.data.jpa.listrepositories.lastrecord; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +@DataJpaTest +class PostRepositoryIntegrationTest { + + @Autowired + private PostRepository postRepository; + + @Test + void givenPosts_whenUsingFindFirstDerivedQuery_thenReturnLastPost() { + Post post = postRepository.findFirstByOrderByPublicationDateDesc(); + + assertNotNull(post); + assertEquals(5, post.getId()); + } + + @Test + void givenPosts_whenUsingFindTopDerivedQuery_thenReturnLastPost() { + Post post = postRepository.findTopByOrderByPublicationDateDesc(); + + assertNotNull(post); + assertEquals(5, post.getId()); + } + + @Test + void givenPosts_whenUsingQueryAnnotation_thenReturnLastPost() { + Post post = postRepository.findLastPost(); + + assertNotNull(post); + assertEquals(5, post.getId()); + } + +} From b7a4a1100d7f2634ac431532f35ef1a77127dbb5 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 17 Dec 2023 06:59:52 +0800 Subject: [PATCH 238/294] Create README.md [skip ci] --- core-java-modules/core-java-ipc/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 core-java-modules/core-java-ipc/README.md diff --git a/core-java-modules/core-java-ipc/README.md b/core-java-modules/core-java-ipc/README.md new file mode 100644 index 0000000000..bbfbf6d070 --- /dev/null +++ b/core-java-modules/core-java-ipc/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Inter-Process Communication Methods in Java](https://www.baeldung.com/java-ipc) From 43e0367cc70075465cb857222e98205f520875f0 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 17 Dec 2023 07:05:43 +0800 Subject: [PATCH 239/294] Update README.md [skip ci] --- core-java-modules/core-java-concurrency-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-concurrency-2/README.md b/core-java-modules/core-java-concurrency-2/README.md index 3badd36d5e..5d05c900b8 100644 --- a/core-java-modules/core-java-concurrency-2/README.md +++ b/core-java-modules/core-java-concurrency-2/README.md @@ -7,3 +7,4 @@ - [Testing Multi-Threaded Code in Java](https://www.baeldung.com/java-testing-multithreaded) - [How to Check if All Runnables Are Done](https://www.baeldung.com/java-runnables-check-status) - [Parallelize for Loop in Java](https://www.baeldung.com/java-for-loop-parallel) +- [How to Effectively Unit Test CompletableFuture](https://www.baeldung.com/java-completablefuture-unit-test) From c925e39c5ff2819f731ce03e443ca5de8fb078e0 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 17 Dec 2023 07:09:44 +0800 Subject: [PATCH 240/294] Update README.md [skip ci] --- core-java-modules/core-java-streams-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-streams-5/README.md b/core-java-modules/core-java-streams-5/README.md index dfd5a649b5..eecef8de6b 100644 --- a/core-java-modules/core-java-streams-5/README.md +++ b/core-java-modules/core-java-streams-5/README.md @@ -8,3 +8,4 @@ - [Modifying Objects Within Stream While Iterating](https://www.baeldung.com/java-stream-modify-objects-during-iteration) - [Convert a Stream into a Map or Multimap in Java](https://www.baeldung.com/java-convert-stream-map-multimap) - [How to Avoid NoSuchElementException in Stream API](https://www.baeldung.com/java-streams-api-avoid-nosuchelementexception) +- [Get Index of First Element Matching Boolean Using Java Streams](https://www.baeldung.com/java-streams-find-first-match-index) From b746b1f0b0f267cb33285aed6ec8c0d36bfc0cf0 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 17 Dec 2023 07:55:53 +0800 Subject: [PATCH 241/294] Update README.md [skip ci] --- core-java-modules/core-java-string-operations-7/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-operations-7/README.md b/core-java-modules/core-java-string-operations-7/README.md index a05485ccb9..a0460f26d2 100644 --- a/core-java-modules/core-java-string-operations-7/README.md +++ b/core-java-modules/core-java-string-operations-7/README.md @@ -6,3 +6,4 @@ - [Create a Mutable String in Java](https://www.baeldung.com/java-mutable-string) - [Check if a String Contains a Number Value in Java](https://www.baeldung.com/java-string-number-presence) - [Difference Between String isEmpty() and isBlank()](https://www.baeldung.com/java-string-isempty-vs-isblank) +- [String’s Maximum Length in Java](https://www.baeldung.com/java-strings-maximum-length) From 00faeda0d61a707cf65a30b8c9226ac8ff291c71 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 17 Dec 2023 08:03:37 +0800 Subject: [PATCH 242/294] Create README.md [skip ci] --- spring-kafka-3/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 spring-kafka-3/README.md diff --git a/spring-kafka-3/README.md b/spring-kafka-3/README.md new file mode 100644 index 0000000000..f9c0036ce3 --- /dev/null +++ b/spring-kafka-3/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Spring Kafka Trusted Packages Feature](https://www.baeldung.com/spring-kafka-trusted-packages-feature) From 110cf95773ce25ee6aa1e60e640c46ae555ba828 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 17 Dec 2023 08:07:58 +0800 Subject: [PATCH 243/294] Update README.md [skip ci] --- testing-modules/mockito-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/testing-modules/mockito-2/README.md b/testing-modules/mockito-2/README.md index da8f339e56..5eb4395fa9 100644 --- a/testing-modules/mockito-2/README.md +++ b/testing-modules/mockito-2/README.md @@ -9,3 +9,4 @@ This module contains articles about Mockito - [Mock Same Method with Different Parameters](https://www.baeldung.com/java-mock-same-method-other-parameters) - [How to Mock Constructors for Unit Testing using Mockito](https://www.baeldung.com/java-mockito-constructors-unit-testing) - [Overview of Mockito MockedConstruction](https://www.baeldung.com/java-mockito-mockedconstruction) +- [Verify That Lambda Expression Was Called Using Mockito](https://www.baeldung.com/java-mockito-verify-lambda-expression) From 8b40ff0af48b9511272749b74c9eabfa4988ad81 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 17 Dec 2023 08:12:24 +0800 Subject: [PATCH 244/294] Update README.md [skip ci] --- core-java-modules/core-java-20/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-20/README.md b/core-java-modules/core-java-20/README.md index f859bf9e23..994fbccdbd 100644 --- a/core-java-modules/core-java-20/README.md +++ b/core-java-modules/core-java-20/README.md @@ -1,3 +1,4 @@ ## Relevant Articles - [Scoped Values in Java 20](https://www.baeldung.com/java-20-scoped-values) - [How to Read Zip Files Entries With Java](https://www.baeldung.com/java-read-zip-files) +- [Deserializing JSON to Java Record using Gson](https://www.baeldung.com/java-json-deserialize-record-gson) From 27a1df02bb180dbd205763257cccdfc3f09fb147 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 17 Dec 2023 08:21:43 +0800 Subject: [PATCH 245/294] Update README.md [skip ci] --- core-java-modules/core-java-strings/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-strings/README.md b/core-java-modules/core-java-strings/README.md index e782793fea..82dfcca884 100644 --- a/core-java-modules/core-java-strings/README.md +++ b/core-java-modules/core-java-strings/README.md @@ -16,3 +16,4 @@ Listed here there are only those articles that does not fit into other core-java - [Reuse StringBuilder for Efficiency](https://www.baeldung.com/java-reuse-stringbuilder-for-efficiency) - [How to Iterate Over the String Characters in Java](https://www.baeldung.com/java-iterate-string-characters) - [Passing Strings by Reference in Java](https://www.baeldung.com/java-method-pass-string-reference) +- [String vs StringBuffer Comparison in Java](https://www.baeldung.com/java-string-vs-stringbuffer) From 4bf82e88ea0868a7e8ea2dafe21c136bea01a581 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 17 Dec 2023 08:27:59 +0800 Subject: [PATCH 246/294] Update README.md [skip ci] --- spring-boot-modules/spring-boot-crud/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-crud/README.md b/spring-boot-modules/spring-boot-crud/README.md index 6b0032deb3..09c5d9ba3a 100644 --- a/spring-boot-modules/spring-boot-crud/README.md +++ b/spring-boot-modules/spring-boot-crud/README.md @@ -5,3 +5,4 @@ This module contains articles about Spring Boot CRUD Operations ### Relevant Articles: - [Spring Boot CRUD Application with Thymeleaf](https://www.baeldung.com/spring-boot-crud-thymeleaf) - [Using a Spring Boot Application as a Dependency](https://www.baeldung.com/spring-boot-dependency) +- [Differences Between Entities and DTOs](https://www.baeldung.com/java-entity-vs-dto) From 312d3b20c6a6ae5dc11176387286309d2f4ff89e Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 17 Dec 2023 08:31:28 +0800 Subject: [PATCH 247/294] Update README.md [skip ci] --- core-java-modules/core-java-streams-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-streams-5/README.md b/core-java-modules/core-java-streams-5/README.md index eecef8de6b..41fcb129df 100644 --- a/core-java-modules/core-java-streams-5/README.md +++ b/core-java-modules/core-java-streams-5/README.md @@ -9,3 +9,4 @@ - [Convert a Stream into a Map or Multimap in Java](https://www.baeldung.com/java-convert-stream-map-multimap) - [How to Avoid NoSuchElementException in Stream API](https://www.baeldung.com/java-streams-api-avoid-nosuchelementexception) - [Get Index of First Element Matching Boolean Using Java Streams](https://www.baeldung.com/java-streams-find-first-match-index) +- [Handling NullPointerException in findFirst() When the First Element Is Null](https://www.baeldung.com/java-handle-nullpointerexception-findfirst-first-null) From 4fc122ab961a105cc5048846b517fd6cdfc7261a Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 17 Dec 2023 08:35:30 +0800 Subject: [PATCH 248/294] Update README.md [skip ci] --- core-java-modules/core-java-streams/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-streams/README.md b/core-java-modules/core-java-streams/README.md index adb4c1dda1..158ae84591 100644 --- a/core-java-modules/core-java-streams/README.md +++ b/core-java-modules/core-java-streams/README.md @@ -12,4 +12,5 @@ This module contains articles about the Stream API in Java. - [Counting Matches on a Stream Filter](https://www.baeldung.com/java-stream-filter-count) - [Summing Numbers with Java Streams](https://www.baeldung.com/java-stream-sum) - [How to Find All Getters Returning Null](https://www.baeldung.com/java-getters-returning-null) +- [Skip Bytes in InputStream in Java](https://www.baeldung.com/java-inputstream-skip-bytes) - More articles: [[next -->]](/../core-java-streams-2) From 0b8873f03ef1693777d269b5f44ef734c4cc45d0 Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Sun, 17 Dec 2023 11:48:28 +0100 Subject: [PATCH 249/294] BAEL-7283: Convert a page of objects to list in Spring Data (#15347) --- .../data/jpa/paging/CustomerService.java | 8 ++++ .../jpa/paging/CustomerServiceUnitTest.java | 38 +++++++++++++++---- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/paging/CustomerService.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/paging/CustomerService.java index 73affeb1a1..2fc29e097b 100644 --- a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/paging/CustomerService.java +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/paging/CustomerService.java @@ -1,5 +1,6 @@ package com.baeldung.spring.data.jpa.paging; +import java.util.Collections; import java.util.List; import org.springframework.data.domain.Page; @@ -29,6 +30,13 @@ public class CustomerService { return new PageImpl<>(pageContent, pageRequest, allCustomers.size()); } + public List getCustomerListFromPage(int page, int size) { + Pageable pageRequest = createPageRequestUsing(page, size); + Page allCustomers = customerRepository.findAll(pageRequest); + + return allCustomers.hasContent() ? allCustomers.getContent() : Collections.emptyList(); + } + private Pageable createPageRequestUsing(int page, int size) { return PageRequest.of(page, size); } diff --git a/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/paging/CustomerServiceUnitTest.java b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/paging/CustomerServiceUnitTest.java index 1a34822527..cd5cbdcd60 100644 --- a/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/paging/CustomerServiceUnitTest.java +++ b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/paging/CustomerServiceUnitTest.java @@ -1,14 +1,17 @@ package com.baeldung.spring.data.jpa.paging; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; -import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -16,6 +19,8 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; @ExtendWith(MockitoExtension.class) public class CustomerServiceUnitTest { @@ -46,12 +51,7 @@ public class CustomerServiceUnitTest { private static final List PAGE_4_CONTENTS = Arrays.asList("Penny", "Queen", "Rob", "Sue", "Tammy"); - private static final List EMPTY_PAGE = Arrays.asList(); - - @BeforeEach - void setup() { - when(customerRepository.findAll()).thenReturn(ALL_CUSTOMERS); - } + private static final List EMPTY_PAGE = Collections.emptyList(); private static Collection testIO() { return Arrays.asList(new Object[][] { @@ -66,6 +66,7 @@ public class CustomerServiceUnitTest { @ParameterizedTest @MethodSource("testIO") void givenAListOfCustomers_whenGetCustomers_thenReturnsDesiredDataAlongWithPagingInformation(int page, int size, List expectedNames, long expectedTotalElements, long expectedTotalPages) { + when(customerRepository.findAll()).thenReturn(ALL_CUSTOMERS); Page customers = customerService.getCustomers(page, size); List names = customers.getContent() .stream() @@ -77,4 +78,27 @@ public class CustomerServiceUnitTest { assertEquals(expectedTotalElements, customers.getTotalElements()); assertEquals(expectedTotalPages, customers.getTotalPages()); } + + @Test + void givenAPageOfCustomers_whenGetCustomerList_thenReturnsList() { + Page pagedResponse = new PageImpl(ALL_CUSTOMERS.subList(0, 5)); + when(customerRepository.findAll(any(Pageable.class))).thenReturn(pagedResponse); + + List customers = customerService.getCustomerListFromPage(0, 5); + List customerNames = customers.stream() + .map(Customer::getName) + .collect(Collectors.toList()); + + assertEquals(PAGE_1_CONTENTS.size(), customers.size()); + assertEquals(PAGE_1_CONTENTS, customerNames); + } + + @Test + void givenAnEmptyPageOfCustomers_whenGetCustomerList_thenReturnsEmptyList() { + Page emptyPage = Page.empty(); + when(customerRepository.findAll(any(Pageable.class))).thenReturn(emptyPage); + List customers = customerService.getCustomerListFromPage(0, 5); + + assertThat(customers).isEmpty(); + } } From 3b2d6c5335cb32e781c7b9dbcf0fc0fb89163256 Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Sun, 17 Dec 2023 07:50:31 -0300 Subject: [PATCH 250/294] BAEL 7277 - Find Files by Extension in Specified Directory in Java (#15356) * new module: libraries-7 * ready for review --- libraries-6/README.md | 2 +- libraries-7/README.md | 11 +++ libraries-7/pom.xml | 22 ++++++ .../findfiles/FindFileApacheUtils.java | 29 +++++++ .../findfiles/FindFileJava2Utils.java | 34 ++++++++ .../findfiles/FindFileJava7Utils.java | 44 +++++++++++ .../findfiles/FindFileJava8Utils.java | 21 +++++ .../findfiles/MatchExtensionPredicate.java | 26 ++++++ .../findfiles/SimpleFileConsumerVisitor.java | 33 ++++++++ .../FindFileUtilsIntegrationTest.java | 79 +++++++++++++++++++ pom.xml | 2 + 11 files changed, 302 insertions(+), 1 deletion(-) create mode 100644 libraries-7/README.md create mode 100644 libraries-7/pom.xml create mode 100644 libraries-7/src/main/java/com/baeldung/findfiles/FindFileApacheUtils.java create mode 100644 libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava2Utils.java create mode 100644 libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava7Utils.java create mode 100644 libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava8Utils.java create mode 100644 libraries-7/src/main/java/com/baeldung/findfiles/MatchExtensionPredicate.java create mode 100644 libraries-7/src/main/java/com/baeldung/findfiles/SimpleFileConsumerVisitor.java create mode 100644 libraries-7/src/test/java/com/baeldung/findfiles/FindFileUtilsIntegrationTest.java diff --git a/libraries-6/README.md b/libraries-6/README.md index 4236a65d95..5f8a608010 100644 --- a/libraries-6/README.md +++ b/libraries-6/README.md @@ -17,4 +17,4 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m - [Using libphonenumber to Validate Phone Numbers](https://www.baeldung.com/java-libphonenumber) - [Apache Commons Collections vs Google Guava](https://www.baeldung.com/apache-commons-collections-vs-guava) - [Guide to Using ModelMapper](https://www.baeldung.com/java-modelmapper) -- More articles [[<-- prev]](/libraries-5) +- More articles [[<-- prev]](/libraries-5) [[next -->]](/libraries-7) diff --git a/libraries-7/README.md b/libraries-7/README.md new file mode 100644 index 0000000000..105a2ef16d --- /dev/null +++ b/libraries-7/README.md @@ -0,0 +1,11 @@ +## Libraries-7 + +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 +- More articles [[<-- prev]](/libraries-6) diff --git a/libraries-7/pom.xml b/libraries-7/pom.xml new file mode 100644 index 0000000000..40c4785d40 --- /dev/null +++ b/libraries-7/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + libraries-7 + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + + + + commons-io + commons-io + ${commons-io.version} + + + + \ No newline at end of file diff --git a/libraries-7/src/main/java/com/baeldung/findfiles/FindFileApacheUtils.java b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileApacheUtils.java new file mode 100644 index 0000000000..408d2dcf36 --- /dev/null +++ b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileApacheUtils.java @@ -0,0 +1,29 @@ +package com.baeldung.findfiles; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Iterator; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.TrueFileFilter; +import org.apache.commons.io.filefilter.WildcardFileFilter; + +public class FindFileApacheUtils { + + private FindFileApacheUtils() { + } + + public static Iterator find(Path startPath, String extension) { + if (!Files.isDirectory(startPath)) { + throw new IllegalArgumentException("Provided path is not a directory: " + startPath); + } + + if (!extension.startsWith(".")) + extension = "." + extension; + + return FileUtils.iterateFiles(startPath.toFile(), WildcardFileFilter.builder() + .setWildcards("*" + extension) + .get(), TrueFileFilter.INSTANCE); + } +} diff --git a/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava2Utils.java b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava2Utils.java new file mode 100644 index 0000000000..8982f918f5 --- /dev/null +++ b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava2Utils.java @@ -0,0 +1,34 @@ +package com.baeldung.findfiles; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class FindFileJava2Utils { + + private FindFileJava2Utils() { + } + + public static List find(File startPath, String extension) { + if (!startPath.isDirectory()) { + throw new IllegalArgumentException("Provided path is not a directory: " + startPath); + } + + List matches = new ArrayList<>(); + + File[] files = startPath.listFiles(); + if (files == null) + return matches; + + MatchExtensionPredicate filter = new MatchExtensionPredicate(extension); + for (File file : files) { + if (file.isDirectory()) { + matches.addAll(find(file, extension)); + } else if (filter.test(file.toPath())) { + matches.add(file); + } + } + + return matches; + } +} diff --git a/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava7Utils.java b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava7Utils.java new file mode 100644 index 0000000000..6d2cc4f946 --- /dev/null +++ b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava7Utils.java @@ -0,0 +1,44 @@ +package com.baeldung.findfiles; + +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.ArrayList; +import java.util.List; + +public class FindFileJava7Utils { + + private FindFileJava7Utils() { + } + + public static List find(Path startPath, String extension) throws IOException { + if (!Files.isDirectory(startPath)) { + throw new IllegalArgumentException("Provided path is not a directory: " + startPath); + } + + final List matches = new ArrayList<>(); + MatchExtensionPredicate filter = new MatchExtensionPredicate(extension); + + Files.walkFileTree(startPath, new SimpleFileVisitor() { + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) { + if (filter.test(file)) { + matches.add(file); + } + + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFileFailed(Path file, IOException exc) { + return FileVisitResult.CONTINUE; + } + }); + + return matches; + } +} diff --git a/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava8Utils.java b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava8Utils.java new file mode 100644 index 0000000000..b265bebe7d --- /dev/null +++ b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava8Utils.java @@ -0,0 +1,21 @@ +package com.baeldung.findfiles; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.function.Consumer; + +public class FindFileJava8Utils { + + private FindFileJava8Utils() { + } + + public static void find(Path startPath, String extension, Consumer consumer) throws IOException { + if (!Files.isDirectory(startPath)) { + throw new IllegalArgumentException("Provided path is not a directory: " + startPath); + } + + MatchExtensionPredicate filter = new MatchExtensionPredicate(extension); + Files.walkFileTree(startPath, new SimpleFileConsumerVisitor(filter, consumer)); + } +} diff --git a/libraries-7/src/main/java/com/baeldung/findfiles/MatchExtensionPredicate.java b/libraries-7/src/main/java/com/baeldung/findfiles/MatchExtensionPredicate.java new file mode 100644 index 0000000000..351cdd0590 --- /dev/null +++ b/libraries-7/src/main/java/com/baeldung/findfiles/MatchExtensionPredicate.java @@ -0,0 +1,26 @@ +package com.baeldung.findfiles; + +import java.nio.file.Path; +import java.util.function.Predicate; + +public class MatchExtensionPredicate implements Predicate { + + private final String extension; + + public MatchExtensionPredicate(String extension) { + if (!extension.startsWith(".")) + extension = "." + extension; + this.extension = extension.toLowerCase(); + } + + @Override + public boolean test(Path path) { + if (path == null) + return false; + + return path.getFileName() + .toString() + .toLowerCase() + .endsWith(extension); + } +} diff --git a/libraries-7/src/main/java/com/baeldung/findfiles/SimpleFileConsumerVisitor.java b/libraries-7/src/main/java/com/baeldung/findfiles/SimpleFileConsumerVisitor.java new file mode 100644 index 0000000000..632499d279 --- /dev/null +++ b/libraries-7/src/main/java/com/baeldung/findfiles/SimpleFileConsumerVisitor.java @@ -0,0 +1,33 @@ +package com.baeldung.findfiles; + +import java.io.IOException; +import java.nio.file.FileVisitResult; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.function.Consumer; +import java.util.function.Predicate; + +public class SimpleFileConsumerVisitor extends SimpleFileVisitor { + + private final Predicate filter; + private final Consumer consumer; + + public SimpleFileConsumerVisitor(MatchExtensionPredicate filter, Consumer consumer) { + this.filter = filter; + this.consumer = consumer; + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) { + if (filter.test(file)) + consumer.accept(file); + + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { + return FileVisitResult.CONTINUE; + } +} diff --git a/libraries-7/src/test/java/com/baeldung/findfiles/FindFileUtilsIntegrationTest.java b/libraries-7/src/test/java/com/baeldung/findfiles/FindFileUtilsIntegrationTest.java new file mode 100644 index 0000000000..ddd7b7e155 --- /dev/null +++ b/libraries-7/src/test/java/com/baeldung/findfiles/FindFileUtilsIntegrationTest.java @@ -0,0 +1,79 @@ +package com.baeldung.findfiles; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +import org.apache.commons.io.FileUtils; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +public class FindFileUtilsIntegrationTest { + + private static final String TEST_EXTENSION = ".test"; + private static final String OTHER_EXTENSION = ".other"; + + private static final List TEST_FILES = new ArrayList<>(); + private static final List OTHER_FILES = new ArrayList<>(); + + private static Path TEST_DIR; + + @BeforeAll + static void setup() throws IOException { + TEST_DIR = Files.createTempDirectory(null); + + final Path nestedDir = TEST_DIR.resolve("sub-dir"); + Files.createDirectories(nestedDir); + + TEST_FILES.add(Files.createFile(TEST_DIR.resolve("a" + TEST_EXTENSION))); + OTHER_FILES.add(Files.createFile(TEST_DIR.resolve("a" + OTHER_EXTENSION))); + + TEST_FILES.add(Files.createFile(nestedDir.resolve("b" + TEST_EXTENSION))); + OTHER_FILES.add(Files.createFile(nestedDir.resolve("b" + OTHER_EXTENSION))); + } + + @AfterAll + static void cleanUp() { + FileUtils.deleteQuietly(TEST_DIR.toFile()); + } + + @Test + void whenFindFilesWithJava2_thenOnlyMatchingFilesFound() { + List matches = FindFileJava2Utils.find(TEST_DIR.toFile(), TEST_EXTENSION); + + assertEquals(TEST_FILES.size(), matches.size()); + } + + @Test + void whenFindFilesWithJava7_thenOnlyMatchingFilesFound() throws IOException { + List matches = FindFileJava7Utils.find(TEST_DIR, TEST_EXTENSION); + + assertEquals(TEST_FILES.size(), matches.size()); + } + + @Test + void whenFindFilesWithJava8_thenOnlyMatchingFilesFound() throws IOException { + final AtomicInteger matches = new AtomicInteger(0); + FindFileJava8Utils.find(TEST_DIR, TEST_EXTENSION, path -> matches.incrementAndGet()); + + assertEquals(TEST_FILES.size(), matches.get()); + } + + @Test + void whenFindFilesWithApache_thenOnlyMatchingFilesFound() { + final AtomicInteger matches = new AtomicInteger(0); + Iterator iterator = FindFileApacheUtils.find(TEST_DIR, TEST_EXTENSION); + + iterator.forEachRemaining(file -> matches.incrementAndGet()); + + assertEquals(TEST_FILES.size(), matches.get()); + } +} diff --git a/pom.xml b/pom.xml index 48da93fea4..39bf6453ac 100644 --- a/pom.xml +++ b/pom.xml @@ -771,6 +771,7 @@ libraries-4 libraries-5 libraries-6 + libraries-7 libraries-ai libraries-apache-commons-2 libraries-apache-commons-collections @@ -1021,6 +1022,7 @@ libraries-4 libraries-5 libraries-6 + libraries-7 libraries-ai libraries-apache-commons-2 libraries-apache-commons-collections From d6c236a31b1bae25579d4f3ff05de2abde63746e Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Sun, 17 Dec 2023 15:05:43 +0100 Subject: [PATCH 251/294] JAVA-29222 | lib update (#15418) --- persistence-modules/jooq/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/jooq/pom.xml b/persistence-modules/jooq/pom.xml index b9229377ab..c6de8e3d40 100644 --- a/persistence-modules/jooq/pom.xml +++ b/persistence-modules/jooq/pom.xml @@ -44,7 +44,7 @@ - 3.13.4 + 3.18.7 \ No newline at end of file From bbd286ee110c745d51697720505b5336d31fef13 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sun, 17 Dec 2023 18:29:54 +0200 Subject: [PATCH 252/294] Java 26656 (#15413) * [JAVA-26656] * [JAVA-26656] --- persistence-modules/flyway-repair/pom.xml | 2 ++ persistence-modules/flyway/pom.xml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/persistence-modules/flyway-repair/pom.xml b/persistence-modules/flyway-repair/pom.xml index 1a5384a916..2cae31c8a6 100644 --- a/persistence-modules/flyway-repair/pom.xml +++ b/persistence-modules/flyway-repair/pom.xml @@ -31,6 +31,7 @@ org.flywaydb flyway-maven-plugin + ${flyway-maven-plugin.version} org.springframework.boot @@ -73,6 +74,7 @@ src/main/resources/application-${spring-boot.run.profiles}.properties + 10.2.0 \ No newline at end of file diff --git a/persistence-modules/flyway/pom.xml b/persistence-modules/flyway/pom.xml index df35f85bfb..07a2925356 100644 --- a/persistence-modules/flyway/pom.xml +++ b/persistence-modules/flyway/pom.xml @@ -63,7 +63,7 @@ - 8.5.13 + 10.2.0 \ No newline at end of file From efb004602538fd3d9bd1240855a764c479a53adc Mon Sep 17 00:00:00 2001 From: uzma Date: Sun, 17 Dec 2023 16:41:12 +0000 Subject: [PATCH 253/294] [BAEL-7073] change location of code --- .../executorservice/ExecuteExample.java | 24 ++++++++++++++ .../executorservice/SubmitExample.java | 31 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/executorservice/ExecuteExample.java create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/executorservice/SubmitExample.java diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/executorservice/ExecuteExample.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/executorservice/ExecuteExample.java new file mode 100644 index 0000000000..6b6d6e3e8a --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/executorservice/ExecuteExample.java @@ -0,0 +1,24 @@ +package com.baeldung.concurrent.executorservice; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class ExecuteExample { + public static void main(String[] args) { + ExecutorService executorService = Executors.newFixedThreadPool(2); + // Task using Runnable + Runnable task = () -> { + int[] numbers = { 1, 2, 3, 4, 5 }; + int sum = 0; + for (int num : numbers) { + sum += num; + } + System.out.println("Sum calculated using execute:" + sum); + }; + // Submit the task using execute + executorService.execute(task); + executorService.shutdown(); + + } + +} diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/executorservice/SubmitExample.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/executorservice/SubmitExample.java new file mode 100644 index 0000000000..cd715edcc0 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/executorservice/SubmitExample.java @@ -0,0 +1,31 @@ +package com.baeldung.concurrent.executorservice; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +public class SubmitExample { + public static void main(String[] args) { + ExecutorService executorService = Executors.newFixedThreadPool(2); + Callable task = () -> { + int[] numbers = { 1, 2, 3, 4, 5 }; + int sum = 0; + for (int num : numbers) { + sum += num; + } + return sum; + }; + // Submit the task and obtain a Future + Future result = executorService.submit(task); + try { + // Get the result + int sum = result.get(); + System.out.println("Sum calculated using submit:" + sum); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + executorService.shutdown(); + } +} \ No newline at end of file From ee4679456f5936a1cbab06bff7f0394fe3884c98 Mon Sep 17 00:00:00 2001 From: uzma Date: Sun, 17 Dec 2023 16:44:23 +0000 Subject: [PATCH 254/294] [BAEL-7073] delete code from old module --- .../executorservice/ExecuteExample.java | 24 -------------- .../executorservice/SubmitExample.java | 31 ------------------- 2 files changed, 55 deletions(-) delete mode 100644 core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/ExecuteExample.java delete mode 100644 core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/SubmitExample.java diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/ExecuteExample.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/ExecuteExample.java deleted file mode 100644 index 6b6d6e3e8a..0000000000 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/ExecuteExample.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.concurrent.executorservice; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class ExecuteExample { - public static void main(String[] args) { - ExecutorService executorService = Executors.newFixedThreadPool(2); - // Task using Runnable - Runnable task = () -> { - int[] numbers = { 1, 2, 3, 4, 5 }; - int sum = 0; - for (int num : numbers) { - sum += num; - } - System.out.println("Sum calculated using execute:" + sum); - }; - // Submit the task using execute - executorService.execute(task); - executorService.shutdown(); - - } - -} diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/SubmitExample.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/SubmitExample.java deleted file mode 100644 index cd715edcc0..0000000000 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/SubmitExample.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.baeldung.concurrent.executorservice; - -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - -public class SubmitExample { - public static void main(String[] args) { - ExecutorService executorService = Executors.newFixedThreadPool(2); - Callable task = () -> { - int[] numbers = { 1, 2, 3, 4, 5 }; - int sum = 0; - for (int num : numbers) { - sum += num; - } - return sum; - }; - // Submit the task and obtain a Future - Future result = executorService.submit(task); - try { - // Get the result - int sum = result.get(); - System.out.println("Sum calculated using submit:" + sum); - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - executorService.shutdown(); - } -} \ No newline at end of file From c35c13d5d8890cacd04cf7009d3673f7d98e8c5f Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Mon, 18 Dec 2023 04:59:42 +0000 Subject: [PATCH 255/294] https://jira.baeldung.com/browse/BAEL-7333 --- .../MonthInterval.java | 37 ++++++++ .../MonthIntervalUnitTest.java | 93 +++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/monthintervalbetweentwodates/MonthInterval.java create mode 100644 core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/monthintervalbetweentwodates/MonthIntervalUnitTest.java diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/monthintervalbetweentwodates/MonthInterval.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/monthintervalbetweentwodates/MonthInterval.java new file mode 100644 index 0000000000..f32549730d --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/monthintervalbetweentwodates/MonthInterval.java @@ -0,0 +1,37 @@ +package com.baeldung.monthintervalbetweentwodates; + +import java.util.Calendar; +import java.util.Date; + +public class MonthInterval { + + public int monthsBetween(Date startDate, Date endDate) { + if (startDate == null || endDate == null) { + throw new IllegalArgumentException("Both startDate and endDate must be provided"); + } + Calendar startCalendar = Calendar.getInstance(); + startCalendar.setTime(startDate); + int startDateTotalMonths = 12 * startCalendar.get(Calendar.YEAR) + startCalendar.get(Calendar.MONTH); + Calendar endCalendar = Calendar.getInstance(); + endCalendar.setTime(endDate); + int endDateTotalMonths = 12 * endCalendar.get(Calendar.YEAR) + endCalendar.get(Calendar.MONTH); + return endDateTotalMonths - startDateTotalMonths; + } + + public int monthsBetweenWithDayValue(Date startDate, Date endDate) { + if (startDate == null || endDate == null) { + throw new IllegalArgumentException("Both startDate and endDate must be provided"); + } + Calendar startCalendar = Calendar.getInstance(); + startCalendar.setTime(startDate); + int startDayOfMonth = startCalendar.get(Calendar.DAY_OF_MONTH); + int startDateTotalMonths = 12 * startCalendar.get(Calendar.YEAR) + startCalendar.get(Calendar.MONTH); + Calendar endCalendar = Calendar.getInstance(); + endCalendar.setTime(endDate); + int endDayOfMonth = endCalendar.get(Calendar.DAY_OF_MONTH); + int endDateTotalMonths = 12 * endCalendar.get(Calendar.YEAR) + endCalendar.get(Calendar.MONTH); + + return (startDayOfMonth > endDayOfMonth) ? (endDateTotalMonths - startDateTotalMonths) - 1 : (endDateTotalMonths - startDateTotalMonths); + } + +} diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/monthintervalbetweentwodates/MonthIntervalUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/monthintervalbetweentwodates/MonthIntervalUnitTest.java new file mode 100644 index 0000000000..2cd5638cc8 --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/monthintervalbetweentwodates/MonthIntervalUnitTest.java @@ -0,0 +1,93 @@ +package com.baeldung.monthintervalbetweentwodates; + +import org.joda.time.DateTime; +import org.joda.time.Months; +import org.junit.jupiter.api.Test; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.Period; +import java.time.YearMonth; +import java.time.temporal.ChronoUnit; +import java.util.Date; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class MonthIntervalUnitTest { + + @Test + void givenTwoDates_whenCalculatingMonthsBetweenUsingJodaTime_thenReturnMonthsDifference() { + DateTime firstDate = new DateTime(2023, 5, 25, 0, 0); + DateTime secondDate = new DateTime(2023, 11, 23, 0, 0); + + int monthsBetween = Months.monthsBetween(firstDate, secondDate) + .getMonths(); + assertEquals(5, monthsBetween); + } + + @Test + void givenTwoDates_whenCalculatingMonthsBetweenUsingJodaTimeSetTimeToFirstDayOfMonth_thenReturnMonthsDifference() { + DateTime firstDate = new DateTime(2023, 5, 25, 0, 0).withDayOfMonth(1); + DateTime secondDate = new DateTime(2023, 11, 23, 0, 0).withDayOfMonth(1); + + int monthsBetween = Months.monthsBetween(firstDate, secondDate) + .getMonths(); + assertEquals(6, monthsBetween); + } + + @Test + void givenTwoDates_whenCalculatingMonthsBetweenUsingPeriodClass_thenReturnMonthsDifference() { + Period diff = Period.between(LocalDate.parse("2023-05-25"), LocalDate.parse("2023-11-23")); + assertEquals(5, diff.getMonths()); + } + + @Test + void givenTwoDates_whenCalculatingMonthsBetweenUsingPeriodClassAndAdjsutingDatesToFirstDayOfTheMonth_thenReturnMonthsDifference() { + Period diff = Period.between(LocalDate.parse("2023-05-25") + .withDayOfMonth(1), LocalDate.parse("2023-11-23") + .withDayOfMonth(1)); + assertEquals(6, diff.getMonths()); + } + + @Test + void givenTwoDates_whenCalculatingMonthsBetweenUsingChronoUnitAndYearMonth_thenReturnMonthsDifference() { + long diff = ChronoUnit.MONTHS.between(YearMonth.from(LocalDate.parse("2023-05-25")), LocalDate.parse("2023-11-23")); + assertEquals(6, diff); + } + + @Test + void givenTwoDates_whenCalculatingMonthsBetweenUsingChronoUnitEnum_thenReturnMonthsDifference() { + long monthsBetween = ChronoUnit.MONTHS.between(LocalDate.parse("2023-05-25"), LocalDate.parse("2023-11-23")); + assertEquals(5, monthsBetween); + } + + @Test + void givenTwoDates_whenCalculatingMonthsBetweenUsingChronoUnitEnumdSetTimeToFirstDayOfMonth_thenReturnMonthsDifference() { + long monthsBetween = ChronoUnit.MONTHS.between(LocalDate.parse("2023-05-25") + .withDayOfMonth(1), LocalDate.parse("2023-11-23") + .withDayOfMonth(1)); + assertEquals(6, monthsBetween); + } + + @Test + void givenTwoDates_whenCalculatingMonthsBetweenUsingLegacyDateApi_thenReturnMonthsDifference() throws ParseException { + MonthInterval monthDifference = new MonthInterval(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date startDate = sdf.parse("2016-05-31"); + Date endDate = sdf.parse("2016-11-30"); + int monthsBetween = monthDifference.monthsBetween(startDate, endDate); + assertEquals(6, monthsBetween); + + } + + @Test + void givenTwoDates_whenCalculatingMonthsBetweenUsingLegacyDateApiDayValueConsidered_thenReturnMonthsDifference() throws ParseException { + MonthInterval monthDifference = new MonthInterval(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date startDate = sdf.parse("2016-05-31"); + Date endDate = sdf.parse("2016-11-28"); + int monthsBetween = monthDifference.monthsBetweenWithDayValue(startDate, endDate); + assertEquals(5, monthsBetween); + } +} From 576236e2fd202f897769368c9e92cca0be347830 Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Mon, 18 Dec 2023 15:37:26 +0200 Subject: [PATCH 256/294] Delete json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviseverse directory --- .../ByteArrayToJsonAndViseVerseUnitTest.java | 56 ------------------- 1 file changed, 56 deletions(-) delete mode 100644 json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviseverse/ByteArrayToJsonAndViseVerseUnitTest.java diff --git a/json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviseverse/ByteArrayToJsonAndViseVerseUnitTest.java b/json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviseverse/ByteArrayToJsonAndViseVerseUnitTest.java deleted file mode 100644 index b86d6e0187..0000000000 --- a/json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviseverse/ByteArrayToJsonAndViseVerseUnitTest.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.baeldung.bytearraytojsonandviseverse; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.gson.Gson; -import org.junit.jupiter.api.Test; - -import java.nio.charset.StandardCharsets; -import java.util.Arrays; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class ByteArrayToJsonAndViseVerseUnitTest { - - byte[] byteArray = {34, 123, 92, 34, 110, 97, 109, 101, 92, 34, 58, 92, 34, 65, 108, 105, 99, 101, 92, 34, 44, 92, 34, 97, 103, 101, 92, - 34, 58, 50, 53, 44, 92, 34, 105, 115, 83, 116, 117, 100, 101, 110, 116, 92, 34, 58, 116, 114, 117, 101, 44, 92, 34, - 104, 111, 98, 98, 105, 101, 115, 92, 34, 58, 91, 92, 34, 114, 101, 97, 100, 105, 110, 103, 92, 34, 44, 92, 34, 112, - 97, 105, 110, 116, 105, 110, 103, 92, 34, 93, 44, 92, 34, 97, 100, 100, 114, 101, 115, 115, 92, 34, 58, 123, 92, 34, - 99, 105, 116, 121, 92, 34, 58, 92, 34, 83, 109, 97, 108, 108, 118, 105, 108, 108, 101, 92, 34, 44, 92, 34, 122, 105, - 112, 99, 111, 100, 101, 92, 34, 58, 92, 34, 49, 50, 51, 52, 53, 92, 34, 125, 125, 34}; - - String jsonString = "{\"name\":\"Alice\",\"age\":25,\"isStudent\":true,\"hobbies\":[\"reading\",\"painting\"],\"address\":{\"city\":\"Smallville\",\"zipcode\":\"12345\"}}"; - - @Test - void givenByteArray_whenConvertingToJsonUsingJackson_thenJsonString() throws Exception { - ObjectMapper objectMapper = new ObjectMapper(); - String actualJsonString = objectMapper.readValue(byteArray, String.class); - - assertEquals(jsonString, actualJsonString); - } - - @Test - void givenByteArray_whenConvertingToJsonUsingGson_thenJsonString() { - Gson gson = new Gson(); - String jsonStringFromByteArray = new String(byteArray, StandardCharsets.UTF_8); - String actualJsonString = gson.fromJson(jsonStringFromByteArray, String.class); - - assertEquals(jsonString, actualJsonString); - } - - @Test - void givenJsonString_whenConvertingToByteArrayUsingJackson_thenByteArray() throws JsonProcessingException { - ObjectMapper objectMapper = new ObjectMapper(); - byte[] actualByteArray = objectMapper.writeValueAsBytes(jsonString); - - assertEquals(Arrays.toString(byteArray), Arrays.toString(actualByteArray)); - } - - @Test - void givenJsonString_whenConvertingToByteArrayUsingGson_thenByteArray() { - Gson gson = new Gson(); - byte[] actualByteArray = gson.toJson(jsonString).getBytes(); - - assertEquals(Arrays.toString(byteArray), Arrays.toString(actualByteArray)); - } -} From f3c579ffbe4f43c0c6425a27d558f150ee6cd72e Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Mon, 18 Dec 2023 15:38:39 +0200 Subject: [PATCH 257/294] baeldung-articles : BAEL-7071 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Commit for the article "Convert Byte Array to JSON and Vice Versa in Java" which adds the "ByteArrayToJsonAndViceVersaUnitTest" class to convert a byte array to JSON and vicе vеrsa in Java. --- .../ByteArrayToJsonAndViceVersaUnitTest.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviceversa/ByteArrayToJsonAndViceVersaUnitTest.java diff --git a/json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviceversa/ByteArrayToJsonAndViceVersaUnitTest.java b/json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviceversa/ByteArrayToJsonAndViceVersaUnitTest.java new file mode 100644 index 0000000000..5e33a645b2 --- /dev/null +++ b/json-modules/json-conversion/src/test/java/com/baeldung/bytearraytojsonandviceversa/ByteArrayToJsonAndViceVersaUnitTest.java @@ -0,0 +1,50 @@ +package com.baeldung.bytearraytojsonandviceversa; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; +import org.junit.jupiter.api.Test; + +import java.nio.charset.StandardCharsets; +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ByteArrayToJsonAndViceVersaUnitTest { + + byte[] byteArray = {34, 123, 92, 34, 110, 97, 109, 101, 92, 34, 58, 92, 34, 65, 108, 105, 99, 101, 92, 34, 44, 92, 34, 97, 103, 101, 92, 34, 58, 50, 53, 44, 92, 34, 105, 115, 83, 116, 117, 100, 101, 110, 116, 92, 34, 58, 116, 114, 117, 101, 44, 92, 34, 104, 111, 98, 98, 105, 101, 115, 92, 34, 58, 91, 92, 34, 114, 101, 97, 100, 105, 110, 103, 92, 34, 44, 92, 34, 112, 97, 105, 110, 116, 105, 110, 103, 92, 34, 93, 44, 92, 34, 97, 100, 100, 114, 101, 115, 115, 92, 34, 58, 123, 92, 34, 99, 105, 116, 121, 92, 34, 58, 92, 34, 83, 109, 97, 108, 108, 118, 105, 108, 108, 101, 92, 34, 44, 92, 34, 122, 105, 112, 99, 111, 100, 101, 92, 34, 58, 92, 34, 49, 50, 51, 52, 53, 92, 34, 125, 125, 34}; + String jsonString = "{\"name\":\"Alice\",\"age\":25,\"isStudent\":true,\"hobbies\":[\"reading\",\"painting\"],\"address\":{\"city\":\"Smallville\",\"zipcode\":\"12345\"}}"; + + @Test + void givenByteArray_whenConvertingToJsonUsingJackson_thenJsonString() throws Exception { + ObjectMapper objectMapper = new ObjectMapper(); + String actualJsonString = objectMapper.readValue(byteArray, String.class); + + assertEquals(jsonString, actualJsonString); + } + + @Test + void givenByteArray_whenConvertingToJsonUsingGson_thenJsonString() { + Gson gson = new Gson(); + String jsonStringFromByteArray = new String(byteArray, StandardCharsets.UTF_8); + String actualJsonString = gson.fromJson(jsonStringFromByteArray, String.class); + + assertEquals(jsonString, actualJsonString); + } + + @Test + void givenJsonString_whenConvertingToByteArrayUsingJackson_thenByteArray() throws JsonProcessingException { + ObjectMapper objectMapper = new ObjectMapper(); + byte[] actualByteArray = objectMapper.writeValueAsBytes(jsonString); + + assertEquals(Arrays.toString(byteArray), Arrays.toString(actualByteArray)); + } + + @Test + void givenJsonString_whenConvertingToByteArrayUsingGson_thenByteArray() { + Gson gson = new Gson(); + byte[] actualByteArray = gson.toJson(jsonString).getBytes(); + + assertEquals(Arrays.toString(byteArray), Arrays.toString(actualByteArray)); + } +} From 357494e56f48a5d6433e99d7978e559be2c3acbd Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Mon, 18 Dec 2023 22:11:10 +0100 Subject: [PATCH 258/294] JAVA-29238 | fixing tests (#15434) --- .../spring-data-jpa-repo/README.md | 2 +- .../com/baeldung/boot/BootApplication.java | 21 +++++ .../JpaApplication.java} | 12 +-- .../{ => jpa}/config/JpaPopulators.java | 70 ++++++++-------- .../config}/PersistenceConfig.java | 14 +--- .../{repository => jpa/domain}/Foo.java | 2 +- .../{entity => jpa/domain}/Fruit.java | 80 +++++++++---------- .../{entity => jpa/domain}/Passenger.java | 2 +- .../baeldung/{entity => jpa/domain}/Song.java | 2 +- .../{ => jpa}/repository/FruitRepository.java | 54 ++++++------- .../{ => jpa}/repository/IFooDAO.java | 5 +- .../repository/PassengerRepository.java | 6 +- .../{ => jpa}/repository/SongRepository.java | 4 +- .../service}/FooService.java | 6 +- .../com/baeldung/jpa/service/IFooService.java | 7 ++ .../com/baeldung/repository/IFooService.java | 5 -- .../src/main/resources/fruit-data.json | 4 +- .../src/main/resources/springDataConfig.xml | 2 +- ...endedStudentRepositoryIntegrationTest.java | 4 +- .../InventoryRepositoryIntegrationTest.java | 4 +- .../FooServiceIntegrationTest.java | 9 ++- .../FruitPopulatorIntegrationTest.java | 77 +++++++++--------- .../PassengerRepositoryIntegrationTest.java | 14 +++- .../SongRepositoryIntegrationTest.java | 12 +-- 24 files changed, 226 insertions(+), 192 deletions(-) create mode 100644 persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/boot/BootApplication.java rename persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/{Application.java => jpa/JpaApplication.java} (51%) rename persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/{ => jpa}/config/JpaPopulators.java (93%) rename persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/{repository => jpa/config}/PersistenceConfig.java (87%) rename persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/{repository => jpa/domain}/Foo.java (98%) rename persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/{entity => jpa/domain}/Fruit.java (90%) rename persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/{entity => jpa/domain}/Passenger.java (98%) rename persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/{entity => jpa/domain}/Song.java (97%) rename persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/{ => jpa}/repository/FruitRepository.java (88%) rename persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/{ => jpa}/repository/IFooDAO.java (82%) rename persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/{ => jpa}/repository/PassengerRepository.java (58%) rename persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/{ => jpa}/repository/SongRepository.java (86%) rename persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/{repository => jpa/service}/FooService.java (71%) create mode 100644 persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/service/IFooService.java delete mode 100644 persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooService.java rename persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/{repository => jpa}/FooServiceIntegrationTest.java (73%) rename persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/{repository => jpa}/FruitPopulatorIntegrationTest.java (86%) rename persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/{repository => jpa}/PassengerRepositoryIntegrationTest.java (81%) rename persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/{repository => jpa}/SongRepositoryIntegrationTest.java (84%) diff --git a/persistence-modules/spring-data-jpa-repo/README.md b/persistence-modules/spring-data-jpa-repo/README.md index 9587f544f9..ef3442929e 100644 --- a/persistence-modules/spring-data-jpa-repo/README.md +++ b/persistence-modules/spring-data-jpa-repo/README.md @@ -20,6 +20,6 @@ After importing the project into Eclipse, you may see the following error: "No persistence xml file found in project" This can be ignored: -- Project -> Properties -> Java Persistance -> JPA -> Error/Warnings -> Select Ignore on "No persistence xml file found in project" +- Project -> Properties -> Java Persistence -> JPA -> Error/Warnings -> Select Ignore on "No persistence xml file found in project" Or: - Eclipse -> Preferences - Validation - disable the "Build" execution of the JPA Validator diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/boot/BootApplication.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/boot/BootApplication.java new file mode 100644 index 0000000000..9275d9f449 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/boot/BootApplication.java @@ -0,0 +1,21 @@ +package com.baeldung.boot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +import com.baeldung.jpa.JpaApplication; +import com.baeldung.boot.daos.impl.ExtendedRepositoryImpl; + +@SpringBootApplication +@EnableJpaRepositories(repositoryBaseClass = ExtendedRepositoryImpl.class, basePackages = "com.baeldung.boot.daos") +@EntityScan({"com.baeldung.boot.domain"}) +@ComponentScan("com.baeldung.boot.daos") +public class BootApplication { + public static void main(String[] args) { + SpringApplication.run(JpaApplication.class, args); + } + +} diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/Application.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/JpaApplication.java similarity index 51% rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/Application.java rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/JpaApplication.java index 47a18b557f..eab5a741a3 100644 --- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/Application.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/JpaApplication.java @@ -1,17 +1,17 @@ -package com.baeldung; +package com.baeldung.jpa; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import com.baeldung.boot.daos.impl.ExtendedRepositoryImpl; - @SpringBootApplication -@EnableJpaRepositories(repositoryBaseClass = ExtendedRepositoryImpl.class) -public class Application { +@ComponentScan("com.baeldung.jpa") +@EnableJpaRepositories("com.baeldung.jpa.repository") +public class JpaApplication { public static void main(String[] args) { - SpringApplication.run(Application.class, args); + SpringApplication.run(JpaApplication.class, args); } } diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/config/JpaPopulators.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/config/JpaPopulators.java similarity index 93% rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/config/JpaPopulators.java rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/config/JpaPopulators.java index 24348d31c5..c21bb48c83 100644 --- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/config/JpaPopulators.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/config/JpaPopulators.java @@ -1,35 +1,35 @@ -package com.baeldung.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; -import org.springframework.data.repository.init.Jackson2RepositoryPopulatorFactoryBean; -import org.springframework.data.repository.init.UnmarshallerRepositoryPopulatorFactoryBean; -import org.springframework.oxm.jaxb.Jaxb2Marshaller; - -import com.baeldung.entity.Fruit; - -@Configuration -public class JpaPopulators { - - @Bean - public Jackson2RepositoryPopulatorFactoryBean getRespositoryPopulator() throws Exception { - Jackson2RepositoryPopulatorFactoryBean factory = new Jackson2RepositoryPopulatorFactoryBean(); - factory.setResources(new Resource[] { new ClassPathResource("fruit-data.json") }); - return factory; - } - - @Bean - public UnmarshallerRepositoryPopulatorFactoryBean repositoryPopulator() { - - Jaxb2Marshaller unmarshaller = new Jaxb2Marshaller(); - unmarshaller.setClassesToBeBound(Fruit.class); - - UnmarshallerRepositoryPopulatorFactoryBean factory = new UnmarshallerRepositoryPopulatorFactoryBean(); - factory.setUnmarshaller(unmarshaller); - factory.setResources(new Resource[] { new ClassPathResource("apple-fruit-data.xml"), new ClassPathResource("guava-fruit-data.xml") }); - return factory; - } - -} +package com.baeldung.jpa.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.data.repository.init.Jackson2RepositoryPopulatorFactoryBean; +import org.springframework.data.repository.init.UnmarshallerRepositoryPopulatorFactoryBean; +import org.springframework.oxm.jaxb.Jaxb2Marshaller; + +import com.baeldung.jpa.domain.Fruit; + +@Configuration +public class JpaPopulators { + + @Bean + public Jackson2RepositoryPopulatorFactoryBean getRespositoryPopulator() throws Exception { + Jackson2RepositoryPopulatorFactoryBean factory = new Jackson2RepositoryPopulatorFactoryBean(); + factory.setResources(new Resource[] { new ClassPathResource("fruit-data.json") }); + return factory; + } + + @Bean + public UnmarshallerRepositoryPopulatorFactoryBean repositoryPopulator() { + + Jaxb2Marshaller unmarshaller = new Jaxb2Marshaller(); + unmarshaller.setClassesToBeBound(Fruit.class); + + UnmarshallerRepositoryPopulatorFactoryBean factory = new UnmarshallerRepositoryPopulatorFactoryBean(); + factory.setUnmarshaller(unmarshaller); + factory.setResources(new Resource[] { new ClassPathResource("apple-fruit-data.xml"), new ClassPathResource("guava-fruit-data.xml") }); + return factory; + } + +} diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/PersistenceConfig.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/config/PersistenceConfig.java similarity index 87% rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/PersistenceConfig.java rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/config/PersistenceConfig.java index f3c9301bcf..0c47351104 100644 --- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/PersistenceConfig.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/config/PersistenceConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.repository; +package com.baeldung.jpa.config; import java.util.Properties; @@ -6,12 +6,10 @@ import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; 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.LocalContainerEntityManagerFactoryBean; @@ -23,24 +21,18 @@ import com.google.common.base.Preconditions; @Configuration @PropertySource("classpath:persistence.properties") -@ComponentScan("com.baeldung.repository") -//@ImportResource("classpath*:*springDataConfig.xml") @EnableTransactionManagement -@EnableJpaRepositories(basePackages = "com.baeldung.repository") +//@ImportResource("classpath*:*springDataConfig.xml") public class PersistenceConfig { @Autowired private Environment env; - public PersistenceConfig() { - super(); - } - @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource()); - em.setPackagesToScan("com.baeldung.spring.data.persistence.repository"); + em.setPackagesToScan("com.baeldung.jpa.domain"); final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/Foo.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Foo.java similarity index 98% rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/Foo.java rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Foo.java index 27ebcf5875..f799635eae 100644 --- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/Foo.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Foo.java @@ -1,4 +1,4 @@ -package com.baeldung.repository; +package com.baeldung.jpa.domain; import java.io.Serializable; diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/entity/Fruit.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Fruit.java similarity index 90% rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/entity/Fruit.java rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Fruit.java index d45ac33db8..6314c58da3 100644 --- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/entity/Fruit.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Fruit.java @@ -1,40 +1,40 @@ -package com.baeldung.entity; - -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement -@Entity -public class Fruit { - - @Id - private long id; - private String name; - private String color; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getColor() { - return color; - } - - public void setColor(String color) { - this.color = color; - } - -} +package com.baeldung.jpa.domain; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement +@Entity +public class Fruit { + + @Id + private long id; + private String name; + private String color; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + +} diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/entity/Passenger.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Passenger.java similarity index 98% rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/entity/Passenger.java rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Passenger.java index 3aafbe9afa..acfb7947c0 100644 --- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/entity/Passenger.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Passenger.java @@ -1,4 +1,4 @@ -package com.baeldung.entity; +package com.baeldung.jpa.domain; import javax.persistence.Basic; import javax.persistence.Column; diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/entity/Song.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Song.java similarity index 97% rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/entity/Song.java rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Song.java index 395527c1eb..9dcde0bea4 100644 --- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/entity/Song.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/domain/Song.java @@ -1,4 +1,4 @@ -package com.baeldung.entity; +package com.baeldung.jpa.domain; import javax.persistence.Column; import javax.persistence.Entity; diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/FruitRepository.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/FruitRepository.java similarity index 88% rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/FruitRepository.java rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/FruitRepository.java index 5055252adf..dfbb4a5102 100644 --- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/FruitRepository.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/FruitRepository.java @@ -1,27 +1,27 @@ -package com.baeldung.repository; - -import java.util.List; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -import com.baeldung.entity.Fruit; - -@Repository -public interface FruitRepository extends JpaRepository { - - Long deleteByName(String name); - - List deleteByColor(String color); - - Long removeByName(String name); - - List removeByColor(String color); - - @Modifying - @Query("delete from Fruit f where f.name=:name or f.color=:color") - int deleteFruits(@Param("name") String name, @Param("color") String color); -} +package com.baeldung.jpa.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import com.baeldung.jpa.domain.Fruit; + +@Repository +public interface FruitRepository extends JpaRepository { + + Long deleteByName(String name); + + List deleteByColor(String color); + + Long removeByName(String name); + + List removeByColor(String color); + + @Modifying + @Query("delete from Fruit f where f.name=:name or f.color=:color") + int deleteFruits(@Param("name") String name, @Param("color") String color); +} diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooDAO.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/IFooDAO.java similarity index 82% rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooDAO.java rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/IFooDAO.java index 6ee74fe26c..4834e2f68c 100644 --- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooDAO.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/IFooDAO.java @@ -1,9 +1,10 @@ -package com.baeldung.repository; +package com.baeldung.jpa.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; + +import com.baeldung.jpa.domain.Foo; public interface IFooDAO extends JpaRepository { diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/PassengerRepository.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/PassengerRepository.java similarity index 58% rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/PassengerRepository.java rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/PassengerRepository.java index a295a74f1b..c7aa56f830 100644 --- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/PassengerRepository.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/PassengerRepository.java @@ -1,13 +1,13 @@ -package com.baeldung.repository; +package com.baeldung.jpa.repository; -import com.baeldung.entity.Passenger; +import com.baeldung.jpa.domain.Passenger; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.List; @Repository -interface PassengerRepository extends JpaRepository { +public interface PassengerRepository extends JpaRepository { List findByFirstNameIgnoreCase(String firstName); diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/SongRepository.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/SongRepository.java similarity index 86% rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/SongRepository.java rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/SongRepository.java index 6faed411d3..c7a8647f5a 100644 --- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/SongRepository.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/repository/SongRepository.java @@ -1,11 +1,11 @@ -package com.baeldung.repository; +package com.baeldung.jpa.repository; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import com.baeldung.entity.Song; +import com.baeldung.jpa.domain.Song; @Repository public interface SongRepository extends JpaRepository { diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/FooService.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/service/FooService.java similarity index 71% rename from persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/FooService.java rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/service/FooService.java index 98084240ac..d449bc11a8 100644 --- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/FooService.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/service/FooService.java @@ -1,10 +1,14 @@ -package com.baeldung.repository; +package com.baeldung.jpa.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import com.baeldung.jpa.domain.Foo; +import com.baeldung.jpa.repository.IFooDAO; + @Service public class FooService implements IFooService { + @Autowired private IFooDAO dao; diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/service/IFooService.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/service/IFooService.java new file mode 100644 index 0000000000..f75f33ba38 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/jpa/service/IFooService.java @@ -0,0 +1,7 @@ +package com.baeldung.jpa.service; + +import com.baeldung.jpa.domain.Foo; + +public interface IFooService { + Foo create(Foo foo); +} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooService.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooService.java deleted file mode 100644 index 6c4d36710c..0000000000 --- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooService.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.baeldung.repository; - -public interface IFooService { - Foo create(Foo foo); -} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo/src/main/resources/fruit-data.json b/persistence-modules/spring-data-jpa-repo/src/main/resources/fruit-data.json index 6dc44e2586..b605352dc9 100644 --- a/persistence-modules/spring-data-jpa-repo/src/main/resources/fruit-data.json +++ b/persistence-modules/spring-data-jpa-repo/src/main/resources/fruit-data.json @@ -1,12 +1,12 @@ [ { - "_class": "com.baeldung.entity.Fruit", + "_class": "com.baeldung.jpa.domain.Fruit", "name": "apple", "color": "red", "id": 1 }, { - "_class": "com.baeldung.entity.Fruit", + "_class": "com.baeldung.jpa.domain.Fruit", "name": "guava", "color": "green", "id": 2 diff --git a/persistence-modules/spring-data-jpa-repo/src/main/resources/springDataConfig.xml b/persistence-modules/spring-data-jpa-repo/src/main/resources/springDataConfig.xml index e581d514a4..7746814290 100644 --- a/persistence-modules/spring-data-jpa-repo/src/main/resources/springDataConfig.xml +++ b/persistence-modules/spring-data-jpa-repo/src/main/resources/springDataConfig.xml @@ -7,5 +7,5 @@ http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd" > - + \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/boot/daos/ExtendedStudentRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/boot/daos/ExtendedStudentRepositoryIntegrationTest.java index b367b5fdca..51874e2bbe 100644 --- a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/boot/daos/ExtendedStudentRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/boot/daos/ExtendedStudentRepositoryIntegrationTest.java @@ -13,11 +13,11 @@ import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; -import com.baeldung.Application; +import com.baeldung.boot.BootApplication; import com.baeldung.boot.domain.Student; @RunWith(SpringRunner.class) -@ContextConfiguration(classes = {Application.class}) +@ContextConfiguration(classes = { BootApplication.class}) @DirtiesContext public class ExtendedStudentRepositoryIntegrationTest { @Resource diff --git a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/boot/daos/InventoryRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/boot/daos/InventoryRepositoryIntegrationTest.java index e4bd3dabff..af454379c8 100644 --- a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/boot/daos/InventoryRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/boot/daos/InventoryRepositoryIntegrationTest.java @@ -15,11 +15,11 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; -import com.baeldung.Application; +import com.baeldung.boot.BootApplication; import com.baeldung.boot.domain.MerchandiseEntity; @RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class) +@SpringBootTest(classes = BootApplication.class) public class InventoryRepositoryIntegrationTest { private static final String ORIGINAL_TITLE = "Pair of Pants"; diff --git a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/FooServiceIntegrationTest.java b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/FooServiceIntegrationTest.java similarity index 73% rename from persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/FooServiceIntegrationTest.java rename to persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/FooServiceIntegrationTest.java index 9362b4c338..4c0fc99eb5 100644 --- a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/FooServiceIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/FooServiceIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.repository; +package com.baeldung.jpa; import javax.sql.DataSource; @@ -6,11 +6,16 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; +import com.baeldung.jpa.domain.Foo; +import com.baeldung.jpa.service.IFooService; + @RunWith(SpringRunner.class) -@ContextConfiguration(classes = PersistenceConfig.class) +@ContextConfiguration(classes = { JpaApplication.class}) +@DirtiesContext public class FooServiceIntegrationTest { @Autowired diff --git a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/FruitPopulatorIntegrationTest.java b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/FruitPopulatorIntegrationTest.java similarity index 86% rename from persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/FruitPopulatorIntegrationTest.java rename to persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/FruitPopulatorIntegrationTest.java index 4d3661e717..e321b1271e 100644 --- a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/FruitPopulatorIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/FruitPopulatorIntegrationTest.java @@ -1,38 +1,39 @@ -package com.baeldung.repository; - -import static org.junit.Assert.assertEquals; - -import java.util.List; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import com.baeldung.entity.Fruit; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class FruitPopulatorIntegrationTest { - - @Autowired - private FruitRepository fruitRepository; - - @Test - public void givenFruitJsonPopulatorThenShouldInsertRecordOnStart() { - - List fruits = fruitRepository.findAll(); - assertEquals("record count is not matching", 2, fruits.size()); - - fruits.forEach(fruit -> { - if (1 == fruit.getId()) { - assertEquals("apple", fruit.getName()); - assertEquals("red", fruit.getColor()); - } else if (2 == fruit.getId()) { - assertEquals("guava", fruit.getName()); - assertEquals("green", fruit.getColor()); - } - }); - } -} +package com.baeldung.jpa; + +import static org.junit.Assert.assertEquals; + +import java.util.List; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.jpa.domain.Fruit; +import com.baeldung.jpa.repository.FruitRepository; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = JpaApplication.class) +public class FruitPopulatorIntegrationTest { + + @Autowired + private FruitRepository fruitRepository; + + @Test + public void givenFruitJsonPopulatorThenShouldInsertRecordOnStart() { + + List fruits = fruitRepository.findAll(); + assertEquals("record count is not matching", 2, fruits.size()); + + fruits.forEach(fruit -> { + if (1 == fruit.getId()) { + assertEquals("apple", fruit.getName()); + assertEquals("red", fruit.getColor()); + } else if (2 == fruit.getId()) { + assertEquals("guava", fruit.getName()); + assertEquals("green", fruit.getColor()); + } + }); + } +} diff --git a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/PassengerRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/PassengerRepositoryIntegrationTest.java similarity index 81% rename from persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/PassengerRepositoryIntegrationTest.java rename to persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/PassengerRepositoryIntegrationTest.java index fd06710084..1676cd6406 100644 --- a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/PassengerRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/PassengerRepositoryIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.repository; +package com.baeldung.jpa; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; @@ -8,18 +8,22 @@ import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; -import com.baeldung.entity.Passenger; +import com.baeldung.jpa.domain.Passenger; +import com.baeldung.jpa.repository.PassengerRepository; -@DataJpaTest(showSql = false) @RunWith(SpringRunner.class) +@ContextConfiguration(classes = { JpaApplication.class}) +@DirtiesContext public class PassengerRepositoryIntegrationTest { @PersistenceContext @@ -28,6 +32,7 @@ public class PassengerRepositoryIntegrationTest { private PassengerRepository repository; @Before + @Transactional public void before() { entityManager.persist(Passenger.from("Jill", "Smith")); entityManager.persist(Passenger.from("Eve", "Jackson")); @@ -36,6 +41,7 @@ public class PassengerRepositoryIntegrationTest { entityManager.persist(Passenger.from("Siya", "Kolisi")); } + @Transactional @Test public void givenPassengers_whenMatchingIgnoreCase_thenExpectedReturned() { Passenger jill = Passenger.from("Jill", "Smith"); diff --git a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/SongRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/SongRepositoryIntegrationTest.java similarity index 84% rename from persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/SongRepositoryIntegrationTest.java rename to persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/SongRepositoryIntegrationTest.java index 19362acd44..f5861ec120 100644 --- a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/SongRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/jpa/SongRepositoryIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.repository; +package com.baeldung.jpa; import static org.junit.Assert.assertEquals; @@ -7,17 +7,19 @@ import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; -import com.baeldung.entity.Song; -import com.baeldung.repository.SongRepository; +import com.baeldung.jpa.domain.Song; +import com.baeldung.jpa.repository.SongRepository; @RunWith(SpringRunner.class) -@SpringBootTest +@ContextConfiguration(classes = { JpaApplication.class }) @Sql(scripts = { "/test-song-data.sql" }) +@DirtiesContext public class SongRepositoryIntegrationTest { @Autowired private SongRepository songRepository; From 089f715d8dea4a5f2b99842579ff478555f6cbb6 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Tue, 19 Dec 2023 21:23:38 +0530 Subject: [PATCH 259/294] BAEL-7308, renamed methods --- .../java/com/baeldung/compareany/CompareAnyUnitTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyUnitTest.java index b26c05720d..052be2fe58 100644 --- a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyUnitTest.java +++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/compareany/CompareAnyUnitTest.java @@ -72,8 +72,8 @@ public class CompareAnyUnitTest { String presentString = "Apple"; String notPresentString = "Avocado"; - assertTrue(compareWithMultipleStringUsingSet(presentString, "Mango", "Papaya", "Pineapple", "Apple")); - assertFalse(compareWithMultipleStringUsingSet(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertTrue(compareWithMultipleStringsUsingSet(presentString, "Mango", "Papaya", "Pineapple", "Apple")); + assertFalse(compareWithMultipleStringsUsingSet(notPresentString, "Mango", "Papaya", "Pineapple", "Apple")); } @Test @@ -120,7 +120,7 @@ public class CompareAnyUnitTest { return StringUtils.equalsAnyIgnoreCase(str, strs); } - private boolean compareWithMultipleStringUsingSet(String str, String... strs) { + private boolean compareWithMultipleStringsUsingSet(String str, String... strs) { return Set.of(strs).contains(str); } From c143ccdf78b83765432155a1fe12f0054df563b6 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Tue, 19 Dec 2023 21:47:41 +0200 Subject: [PATCH 260/294] JAVA-29334 Upgrade spring-security-web-x509 (#15447) Co-authored-by: timis1 --- spring-security-modules/spring-security-web-x509/pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-security-modules/spring-security-web-x509/pom.xml b/spring-security-modules/spring-security-web-x509/pom.xml index ec0331fd53..6a4ca78484 100644 --- a/spring-security-modules/spring-security-web-x509/pom.xml +++ b/spring-security-modules/spring-security-web-x509/pom.xml @@ -10,8 +10,9 @@ com.baeldung - spring-security-modules + parent-boot-3 0.0.1-SNAPSHOT + ../../parent-boot-3 From 6bc1391e1fbd2779d37a38297701b0a8a028fcbe Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 19 Dec 2023 21:19:34 +0100 Subject: [PATCH 261/294] JAVA-29067: [FIX] spring-boot-persistence-3 migration to jdk17 (#15433) * JAVA-29067: [FIX] spring-boot-persistence-3 migration to jdk17 * JAVA-29067: [FIX] Migrate from javax to jakarta. * [FIX]: logback error. --- persistence-modules/pom.xml | 2 +- .../spring-boot-persistence-3/pom.xml | 5 ++++- .../com/baeldung/countrows/entity/Account.java | 15 ++++++++++----- .../com/baeldung/countrows/entity/Permission.java | 7 ++++++- .../countrows/repository/AccountRepository.java | 4 ---- .../countrows/service/AccountStatsLogic.java | 14 ++++++++------ .../com/baeldung/dsrouting/ClientDatabase.java | 2 -- .../largeresultset/LargeResultSetApplication.java | 1 - .../java/com/baeldung/largeresultset/Student.java | 7 ++++--- .../largeresultset/service/StudentService.java | 4 ++-- .../accountstatslogic/AccountStatsUnitTest.java | 2 -- 11 files changed, 35 insertions(+), 28 deletions(-) diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 41ff596ccf..5ebc5b2cd4 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -60,7 +60,7 @@ solr spring-boot-persistence-2 - + spring-boot-persistence-3 spring-boot-persistence spring-boot-persistence-h2 diff --git a/persistence-modules/spring-boot-persistence-3/pom.xml b/persistence-modules/spring-boot-persistence-3/pom.xml index 5e8ad64a7a..eb0507ca56 100644 --- a/persistence-modules/spring-boot-persistence-3/pom.xml +++ b/persistence-modules/spring-boot-persistence-3/pom.xml @@ -59,8 +59,11 @@ + - 2.1.8.RELEASE + 3.2.0 + 2.0.9 + 1.4.14 \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/entity/Account.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/entity/Account.java index d422c30a0e..2d3bdc6f9a 100644 --- a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/entity/Account.java +++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/entity/Account.java @@ -1,11 +1,16 @@ package com.baeldung.countrows.entity; -import javax.persistence.*; - -import java.security.PrivateKey; import java.sql.Timestamp; -import java.time.Instant; -import java.util.Date; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; @Entity @Table(name = "ACCOUNTS") diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/entity/Permission.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/entity/Permission.java index 9acedf0558..4f45fb47a6 100644 --- a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/entity/Permission.java +++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/entity/Permission.java @@ -1,6 +1,11 @@ package com.baeldung.countrows.entity; -import javax.persistence.*; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; @Entity @Table(name = "PERMISSIONS") diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/repository/AccountRepository.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/repository/AccountRepository.java index 422962ce45..b293cecce7 100644 --- a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/repository/AccountRepository.java +++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/repository/AccountRepository.java @@ -4,13 +4,9 @@ import com.baeldung.countrows.entity.Account; import com.baeldung.countrows.entity.Permission; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.sql.Timestamp; -import java.util.Date; -import java.util.List; @Repository public interface AccountRepository extends JpaRepository { diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/service/AccountStatsLogic.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/service/AccountStatsLogic.java index e4e716b4ce..cc5d69f848 100644 --- a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/service/AccountStatsLogic.java +++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/countrows/service/AccountStatsLogic.java @@ -2,16 +2,10 @@ package com.baeldung.countrows.service; import java.sql.Timestamp; import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.criteria.*; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -20,6 +14,14 @@ import com.baeldung.countrows.entity.Permission; import com.baeldung.countrows.repository.AccountRepository; import com.baeldung.countrows.repository.PermissionRepository; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; + @Service public class AccountStatsLogic { @Autowired diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/dsrouting/ClientDatabase.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/dsrouting/ClientDatabase.java index d8d178a4d5..e5bef58d8d 100644 --- a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/dsrouting/ClientDatabase.java +++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/dsrouting/ClientDatabase.java @@ -1,7 +1,5 @@ package com.baeldung.dsrouting; public enum ClientDatabase { - CLIENT_A, CLIENT_B - } diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/LargeResultSetApplication.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/LargeResultSetApplication.java index d592894226..c2a94b8fce 100644 --- a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/LargeResultSetApplication.java +++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/LargeResultSetApplication.java @@ -5,7 +5,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class LargeResultSetApplication { - public static void main(String[] args) { SpringApplication.run(LargeResultSetApplication.class, args); } diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/Student.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/Student.java index 283d0f032d..753cff02cb 100644 --- a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/Student.java +++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/Student.java @@ -1,8 +1,9 @@ package com.baeldung.largeresultset; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; @Entity public class Student { diff --git a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/service/StudentService.java b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/service/StudentService.java index e65fc34849..403054f6bd 100644 --- a/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/service/StudentService.java +++ b/persistence-modules/spring-boot-persistence-3/src/main/java/com/baeldung/largeresultset/service/StudentService.java @@ -3,8 +3,6 @@ package com.baeldung.largeresultset.service; import java.util.List; import java.util.stream.Stream; -import javax.persistence.EntityManager; - import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Slice; @@ -14,6 +12,8 @@ import org.springframework.transaction.annotation.Transactional; import com.baeldung.largeresultset.Student; import com.baeldung.largeresultset.StudentRepository; +import jakarta.persistence.EntityManager; + @Service public class StudentService { private static final int BATCH_SIZE = 5; diff --git a/persistence-modules/spring-boot-persistence-3/src/test/java/com/baeldung/boot/countrows/accountstatslogic/AccountStatsUnitTest.java b/persistence-modules/spring-boot-persistence-3/src/test/java/com/baeldung/boot/countrows/accountstatslogic/AccountStatsUnitTest.java index af825601aa..e3a4cbf816 100644 --- a/persistence-modules/spring-boot-persistence-3/src/test/java/com/baeldung/boot/countrows/accountstatslogic/AccountStatsUnitTest.java +++ b/persistence-modules/spring-boot-persistence-3/src/test/java/com/baeldung/boot/countrows/accountstatslogic/AccountStatsUnitTest.java @@ -4,9 +4,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import java.sql.Timestamp; import java.text.ParseException; -import java.text.SimpleDateFormat; import java.time.Instant; -import java.util.Date; import java.util.UUID; import org.junit.jupiter.api.AfterEach; From 65e23af90e50fc5a7b653ff38805c083bea58c1d Mon Sep 17 00:00:00 2001 From: Maiklins Date: Tue, 19 Dec 2023 22:26:33 +0100 Subject: [PATCH 262/294] Align formatting with article --- .../monthintervalbetweentwodates/MonthInterval.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/monthintervalbetweentwodates/MonthInterval.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/monthintervalbetweentwodates/MonthInterval.java index f32549730d..7ad10ab253 100644 --- a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/monthintervalbetweentwodates/MonthInterval.java +++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/monthintervalbetweentwodates/MonthInterval.java @@ -9,12 +9,15 @@ public class MonthInterval { if (startDate == null || endDate == null) { throw new IllegalArgumentException("Both startDate and endDate must be provided"); } + Calendar startCalendar = Calendar.getInstance(); startCalendar.setTime(startDate); int startDateTotalMonths = 12 * startCalendar.get(Calendar.YEAR) + startCalendar.get(Calendar.MONTH); + Calendar endCalendar = Calendar.getInstance(); endCalendar.setTime(endDate); int endDateTotalMonths = 12 * endCalendar.get(Calendar.YEAR) + endCalendar.get(Calendar.MONTH); + return endDateTotalMonths - startDateTotalMonths; } @@ -22,16 +25,20 @@ public class MonthInterval { if (startDate == null || endDate == null) { throw new IllegalArgumentException("Both startDate and endDate must be provided"); } + Calendar startCalendar = Calendar.getInstance(); startCalendar.setTime(startDate); - int startDayOfMonth = startCalendar.get(Calendar.DAY_OF_MONTH); + + int startDateDayOfMonth = startCalendar.get(Calendar.DAY_OF_MONTH); int startDateTotalMonths = 12 * startCalendar.get(Calendar.YEAR) + startCalendar.get(Calendar.MONTH); + Calendar endCalendar = Calendar.getInstance(); endCalendar.setTime(endDate); - int endDayOfMonth = endCalendar.get(Calendar.DAY_OF_MONTH); + + int endDateDayOfMonth = endCalendar.get(Calendar.DAY_OF_MONTH); int endDateTotalMonths = 12 * endCalendar.get(Calendar.YEAR) + endCalendar.get(Calendar.MONTH); - return (startDayOfMonth > endDayOfMonth) ? (endDateTotalMonths - startDateTotalMonths) - 1 : (endDateTotalMonths - startDateTotalMonths); + return (startDateDayOfMonth > endDateDayOfMonth) ? (endDateTotalMonths - startDateTotalMonths) - 1 : (endDateTotalMonths - startDateTotalMonths); } } From 64a66af3fc5199a752852ff1d5e964f999cf9e44 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Tue, 19 Dec 2023 22:44:05 +0100 Subject: [PATCH 263/294] JAVA-29239 | using jdk 11 (#15446) --- .../spring-reactive-data-couchbase/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml b/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml index 84515fedeb..7dbee7d93d 100644 --- a/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml +++ b/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml @@ -138,6 +138,10 @@ 2.2.6.RELEASE 2.17.1 + + 11 + 11 + 11 \ No newline at end of file From b19a80d569f7f662d121138e0ab007817c44c2b6 Mon Sep 17 00:00:00 2001 From: sachin <56427366+sachin071287@users.noreply.github.com> Date: Wed, 20 Dec 2023 07:04:54 +0530 Subject: [PATCH 264/294] feature/BAEL-6712-split large file (#15262) * feature/BAEL-6712-split lareg file * feature/BAEL-6712-split lareg file * bael-6712 review comment fix --------- Co-authored-by: Sachin kumar --- .../splitlargefile/SplitLargeFile.java | 59 +++++++++++++++++++ .../SplitLargeFileUnitTest.java | 41 +++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 core-java-modules/core-java-io-5/src/main/java/com/baeldung/splitlargefile/SplitLargeFile.java create mode 100644 core-java-modules/core-java-io-5/src/test/java/com/baeldung/splitlargefile/SplitLargeFileUnitTest.java diff --git a/core-java-modules/core-java-io-5/src/main/java/com/baeldung/splitlargefile/SplitLargeFile.java b/core-java-modules/core-java-io-5/src/main/java/com/baeldung/splitlargefile/SplitLargeFile.java new file mode 100644 index 0000000000..59b7a86602 --- /dev/null +++ b/core-java-modules/core-java-io-5/src/main/java/com/baeldung/splitlargefile/SplitLargeFile.java @@ -0,0 +1,59 @@ +package com.baeldung.splitlargefile; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.io.FilenameUtils; + +class SplitLargeFile { + + public List splitByFileSize(File largeFile, int maxSizeOfSplitFiles, + String splitedFileDirPath) throws IOException { + List listOfSplitFiles = new ArrayList<>(); + try (InputStream in = Files.newInputStream(largeFile.toPath())) { + final byte[] buffer = new byte[maxSizeOfSplitFiles]; + int dataRead = in.read(buffer); + while (dataRead > -1) { + File splitFile = getSplitFile(FilenameUtils.removeExtension(largeFile.getName()), + buffer, dataRead, splitedFileDirPath); + listOfSplitFiles.add(splitFile); + dataRead = in.read(buffer); + } + } + return listOfSplitFiles; + } + + private File getSplitFile(String largeFileName, byte[] buffer, int length, + String splitedFileDirPath) throws IOException { + File splitFile = File.createTempFile(largeFileName + "-", "-split", + new File(splitedFileDirPath)); + try (FileOutputStream fos = new FileOutputStream(splitFile)) { + fos.write(buffer, 0, length); + } + return splitFile; + } + + public List splitByNumberOfFiles(File largeFile, int noOfFiles, String splitedFileDirPath) + throws IOException { + return splitByFileSize(largeFile, getSizeInBytes(largeFile.length(), noOfFiles), + splitedFileDirPath); + } + + private int getSizeInBytes(long largefileSizeInBytes, int numberOfFilesforSplit) { + if (largefileSizeInBytes % numberOfFilesforSplit != 0) { + largefileSizeInBytes = ((largefileSizeInBytes / numberOfFilesforSplit) + 1) + * numberOfFilesforSplit; + } + long x = largefileSizeInBytes / numberOfFilesforSplit; + if (x > Integer.MAX_VALUE) { + throw new NumberFormatException("size too large"); + + } + return (int) x; + } +} diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/splitlargefile/SplitLargeFileUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/splitlargefile/SplitLargeFileUnitTest.java new file mode 100644 index 0000000000..d31cbd67ad --- /dev/null +++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/splitlargefile/SplitLargeFileUnitTest.java @@ -0,0 +1,41 @@ +package com.baeldung.splitlargefile; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.junit.BeforeClass; + +public class SplitLargeFileUnitTest { + + @BeforeClass + public static void prepareData() throws IOException { + Files.createDirectories(Paths.get("target/split")); + } + + private String splitedFileDirPath() throws Exception { + return Paths.get("target").toString() + "/split"; + } + + private Path largeFilePath() throws Exception { + return Paths.get(this.getClass().getClassLoader().getResource("large-file.txt").toURI()); + } + + + @org.junit.Test + public void givenLargeFile_whenSplitLargeFile_thenSplitBySize() throws Exception { + File input = largeFilePath().toFile(); + SplitLargeFile slf = new SplitLargeFile(); + slf.splitByFileSize(input, 1024_000, splitedFileDirPath()); + } + + @org.junit.Test + public void givenLargeFile_whenSplitLargeFile_thenSplitByNumberOfFiles() throws Exception { + File input = largeFilePath().toFile(); + SplitLargeFile slf = new SplitLargeFile(); + slf.splitByNumberOfFiles(input, 3, splitedFileDirPath()); + } + +} From f7d5d62a57416e852219433f8cd10276623d6847 Mon Sep 17 00:00:00 2001 From: Amit Pandey Date: Wed, 20 Dec 2023 13:16:34 +0530 Subject: [PATCH 265/294] JAVA-28935 Upgrade to Spring Boot 3 for Mysql (#15436) --- persistence-modules/spring-boot-mysql/pom.xml | 5 ++--- .../main/java/com/baeldung/boot/Application.java | 2 +- .../src/main/java/com/baeldung/boot/User.java | 3 ++- .../main/java/com/baeldung/boot/jpa/Employee.java | 2 +- .../src/main/resources/application.yml | 13 +++++++++---- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/persistence-modules/spring-boot-mysql/pom.xml b/persistence-modules/spring-boot-mysql/pom.xml index 6c19b92314..182babc6c5 100644 --- a/persistence-modules/spring-boot-mysql/pom.xml +++ b/persistence-modules/spring-boot-mysql/pom.xml @@ -9,9 +9,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-3 @@ -43,7 +43,6 @@ org.springframework.boot spring-boot-maven-plugin - 2.1.5.RELEASE diff --git a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/Application.java b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/Application.java index d69f66fc7a..e3df121b24 100644 --- a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/Application.java +++ b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/Application.java @@ -1,9 +1,9 @@ package com.baeldung.boot; +import jakarta.annotation.PostConstruct; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import javax.annotation.PostConstruct; import java.util.TimeZone; @SpringBootApplication diff --git a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/User.java b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/User.java index 55cb97dec2..f20fdc46e8 100644 --- a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/User.java +++ b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/User.java @@ -1,9 +1,10 @@ package com.baeldung.boot; + import org.springframework.data.annotation.CreatedDate; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.Date; @Entity diff --git a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/Employee.java b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/Employee.java index 28869d0ac1..d397b0b7e9 100644 --- a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/Employee.java +++ b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/Employee.java @@ -1,7 +1,7 @@ package com.baeldung.boot.jpa; -import javax.persistence.*; +import jakarta.persistence.*; import java.io.Serializable; import java.time.LocalDate; import java.util.Date; diff --git a/persistence-modules/spring-boot-mysql/src/main/resources/application.yml b/persistence-modules/spring-boot-mysql/src/main/resources/application.yml index d70c21aad2..b1586f91d5 100644 --- a/persistence-modules/spring-boot-mysql/src/main/resources/application.yml +++ b/persistence-modules/spring-boot-mysql/src/main/resources/application.yml @@ -1,6 +1,7 @@ spring: - profiles: - active: "dev2" + config: + activate: + on-profile: "dev2" main: banner-mode: "off" jpa: @@ -14,7 +15,9 @@ spring: --- spring: - profiles: "dev1" + config: + activate: + on-profile: "dev1" datasource: url: jdbc:mysql://localhost:3306/test? username: root @@ -23,7 +26,9 @@ spring: --- spring: - profiles: "dev2" + config: + activate: + on-profile: "dev2" datasource: url: >- jdbc:mysql://localhost:3306/test_db?sslMode=VERIFY_CA& From 63312fbcf91de0a1266250e8b8cba62758eea499 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Wed, 20 Dec 2023 11:52:23 +0200 Subject: [PATCH 266/294] JAVA-27775 Fix failing module xml-2 (#15430) --- pom.xml | 4 ++-- .../xml/json2xml/JsonToXmlUnitTest.java | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 39bf6453ac..29c7816b87 100644 --- a/pom.xml +++ b/pom.xml @@ -905,7 +905,7 @@ vertx-modules web-modules webrtc - + xml-2 xml xstream @@ -1154,7 +1154,7 @@ vertx-modules web-modules webrtc - + xml-2 xml xstream diff --git a/xml-2/src/test/java/com/baeldung/xml/json2xml/JsonToXmlUnitTest.java b/xml-2/src/test/java/com/baeldung/xml/json2xml/JsonToXmlUnitTest.java index 6c8486f14b..275a734b28 100644 --- a/xml-2/src/test/java/com/baeldung/xml/json2xml/JsonToXmlUnitTest.java +++ b/xml-2/src/test/java/com/baeldung/xml/json2xml/JsonToXmlUnitTest.java @@ -41,15 +41,15 @@ public class JsonToXmlUnitTest { xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true); xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_1_1, true); String xmlString = xmlMapper.writer().withRootName("root").withDefaultPrettyPrinter().writeValueAsString(jsonNode); - Assertions.assertEquals("\n" + - "\n" + - " John\n" + - " 20\n" + - "

\n" + - " Wall Street\n" + - " New York\n" + - "
\n" + - "\n", xmlString); + Assertions.assertEquals("" + System.lineSeparator() + + "" + System.lineSeparator() + + " John" + System.lineSeparator() + + " 20" + System.lineSeparator() + + "
" + System.lineSeparator() + + " Wall Street" + System.lineSeparator() + + " New York" + System.lineSeparator() + + "
" + System.lineSeparator() + + "
" + System.lineSeparator(), xmlString); } @Test From d49c309ff4cf06dc9d562148e735e6f1860cf4f5 Mon Sep 17 00:00:00 2001 From: Kasra Madadipouya Date: Wed, 20 Dec 2023 18:55:48 +0100 Subject: [PATCH 267/294] JAVA-29378 reduce loop size from 10M to 1M (#15452) --- .../java/com/baeldung/branchprediction/CombiningUnitTest.java | 2 +- .../src/test/java/com/baeldung/branchprediction/IfUnitTest.java | 2 +- .../java/com/baeldung/branchprediction/SortingUnitTest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/CombiningUnitTest.java b/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/CombiningUnitTest.java index c98eef5ed1..bef910024d 100644 --- a/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/CombiningUnitTest.java +++ b/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/CombiningUnitTest.java @@ -9,7 +9,7 @@ import org.slf4j.LoggerFactory; public class CombiningUnitTest { private static final Logger LOG = LoggerFactory.getLogger(CombiningUnitTest.class); - public static final int TOP = 10000000; + public static final int TOP = 1000000; public static final double FRACTION = 0.1; @Test diff --git a/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/IfUnitTest.java b/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/IfUnitTest.java index 6f80624502..3a434d942b 100644 --- a/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/IfUnitTest.java +++ b/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/IfUnitTest.java @@ -12,7 +12,7 @@ import org.slf4j.LoggerFactory; public class IfUnitTest { private static final Logger LOG = LoggerFactory.getLogger(IfUnitTest.class); - public static final int TOP = 10000000; + public static final int TOP = 1000000; @Test public void majorBranchSorted() { diff --git a/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/SortingUnitTest.java b/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/SortingUnitTest.java index 6af40bd57a..0def407e73 100644 --- a/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/SortingUnitTest.java +++ b/core-java-modules/core-java-perf/src/test/java/com/baeldung/branchprediction/SortingUnitTest.java @@ -11,7 +11,7 @@ import org.slf4j.LoggerFactory; public class SortingUnitTest { private static final Logger LOG = LoggerFactory.getLogger(SortingUnitTest.class); - public static final int BIG = 10000000; + public static final int BIG = 1000000; public static final int SMALL = 100000; @Test From 390b2324bb9b301ff6eff42c891ffb36470d8f4a Mon Sep 17 00:00:00 2001 From: Alexandru Borza Date: Thu, 21 Dec 2023 06:34:12 +0200 Subject: [PATCH 268/294] BAEL-7286 Print a double value without scientific notation in Java (#15427) * BAEL-7051 - Catch Common Mistakes with Error-Prone Library in Java * BAEL-7286 Print a double value without scientific notation in Java * BAEL-7286 Print a double value without scientific notation in Java * BAEL-7286 Print a double value without scientific notation in Java * rename package * format code --- ...ubleWithoutScientificNotationUnitTest.java | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/withoutscientificnotation/PrintDoubleWithoutScientificNotationUnitTest.java diff --git a/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/withoutscientificnotation/PrintDoubleWithoutScientificNotationUnitTest.java b/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/withoutscientificnotation/PrintDoubleWithoutScientificNotationUnitTest.java new file mode 100644 index 0000000000..a9e78c76a0 --- /dev/null +++ b/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/withoutscientificnotation/PrintDoubleWithoutScientificNotationUnitTest.java @@ -0,0 +1,113 @@ +package com.baeldung.withoutscientificnotation; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.util.Locale; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class PrintDoubleWithoutScientificNotationUnitTest { + + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + + @BeforeEach + public void setUp() { + System.setOut(new PrintStream(outputStreamCaptor)); + Locale.setDefault(Locale.US); + } + + @AfterEach + public void tearDown() { + System.setOut(standardOut); + } + + @Test + void givenLargeNumber_whenPrintWithDecimalFormat_thenOutputIsWithoutScientificNotation() { + + DecimalFormat df = new DecimalFormat("#.###########"); + double largeNumber = 256450000d; + System.out.println("Large Number: " + df.format(largeNumber)); + + Assertions.assertEquals("Large Number: 256450000", outputStreamCaptor.toString() + .trim()); + } + + @Test + void givenSmallNumber_whenPrintWithDecimalFormat_thenOutputIsWithoutScientificNotation() { + + DecimalFormat df = new DecimalFormat("#.###########"); + double smallNumber = 0.0000046d; + System.out.println("Small Number: " + df.format(smallNumber)); + + Assertions.assertEquals("Small Number: 0.0000046", outputStreamCaptor.toString() + .trim()); + } + + @Test + void givenLargeNumber_whenPrintWithPrintf_thenOutputIsWithoutScientificNotation() { + + double largeNumber = 256450000d; + System.out.printf("Large Number: %.7f", largeNumber); + + Assertions.assertEquals("Large Number: 256450000.0000000", outputStreamCaptor.toString() + .trim()); + } + + @Test + void givenSmallNumber_whenPrintWithPrintf_thenOutputIsWithoutScientificNotation() { + + double smallNumber = 0.0000046d; + System.out.printf("Small Number: %.7f", smallNumber); + + Assertions.assertEquals("Small Number: 0.0000046", outputStreamCaptor.toString() + .trim()); + } + + @Test + void givenLargeNumber_whenPrintWithBigDecimal_thenOutputIsWithoutScientificNotation() { + + double largeNumber = 256450000d; + System.out.println("Large Number: " + BigDecimal.valueOf(largeNumber).toPlainString()); + + Assertions.assertEquals("Large Number: 256450000", outputStreamCaptor.toString() + .trim()); + } + + @Test + void givenSmallNumber_whenPrintWithBigDecimal_thenOutputIsWithoutScientificNotation() { + + double smallNumber = 0.0000046d; + System.out.println("Small Number: " + BigDecimal.valueOf(smallNumber).toPlainString()); + + Assertions.assertEquals("Small Number: 0.0000046", outputStreamCaptor.toString() + .trim()); + } + + @Test + void givenLargeNumber_whenPrintWithStringFormat_thenOutputIsWithoutScientificNotation() { + + double largeNumber = 256450000d; + String formattedLargeNumber = String.format("%.7f", largeNumber); + System.out.println("Large Number: " + formattedLargeNumber); + + Assertions.assertEquals("Large Number: 256450000.0000000", outputStreamCaptor.toString() + .trim()); + } + + @Test + void givenSmallNumber_whenPrintWithStringFormat_thenOutputIsWithoutScientificNotation() { + + double smallNumber = 0.0000046d; + String formattedSmallNumber = String.format("%.7f", smallNumber); + System.out.println("Small Number: " + formattedSmallNumber); + + Assertions.assertEquals("Small Number: 0.0000046", outputStreamCaptor.toString() + .trim()); + } +} From 22c187747e65563092959a88fff88ca9a3de417b Mon Sep 17 00:00:00 2001 From: Eugene Kovko <37694937+eukovko@users.noreply.github.com> Date: Thu, 21 Dec 2023 05:53:57 +0100 Subject: [PATCH 269/294] BAEL-6129: SpEL in @Query (#15449) * BAEL-6129: SpEL in @Query * BAEL-6129: Fix Naming * BAEL-6129: Test Cleanup --- .../spring-data-jpa-query-3/pom.xml | 20 ++- .../spring/data/jpa/spel/NewsApplication.java | 23 +++ .../data/jpa/spel/config/WebMvcConfig.java | 17 +++ .../spel/controller/ArticleController.java | 26 ++++ .../spring/data/jpa/spel/entity/Article.java | 111 ++++++++++++++ .../data/jpa/spel/entity/ArticleWrapper.java | 14 ++ .../spring/data/jpa/spel/entity/Language.java | 56 +++++++ .../LocaleContextHolderExtension.java | 20 +++ .../spel/repository/ArticleRepository.java | 78 ++++++++++ .../BaseNewsApplicationRepository.java | 17 +++ .../ArticleControllerIntegrationTest.java | 47 ++++++ .../ArticleRepositoryIntegrationTest.java | 141 ++++++++++++++++++ .../src/test/resources/articles-dml.sql | 15 ++ 13 files changed, 583 insertions(+), 2 deletions(-) create mode 100644 persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/NewsApplication.java create mode 100644 persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/config/WebMvcConfig.java create mode 100644 persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/controller/ArticleController.java create mode 100644 persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/Article.java create mode 100644 persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/ArticleWrapper.java create mode 100644 persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/Language.java create mode 100644 persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/extension/LocaleContextHolderExtension.java create mode 100644 persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/repository/ArticleRepository.java create mode 100644 persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/repository/BaseNewsApplicationRepository.java create mode 100644 persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/spel/controller/ArticleControllerIntegrationTest.java create mode 100644 persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/spel/repository/ArticleRepositoryIntegrationTest.java create mode 100644 persistence-modules/spring-data-jpa-query-3/src/test/resources/articles-dml.sql diff --git a/persistence-modules/spring-data-jpa-query-3/pom.xml b/persistence-modules/spring-data-jpa-query-3/pom.xml index 1dff3024f6..5ea69791af 100644 --- a/persistence-modules/spring-data-jpa-query-3/pom.xml +++ b/persistence-modules/spring-data-jpa-query-3/pom.xml @@ -8,8 +8,20 @@ 0.15 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 9 + 9 + + + + - + com.baeldung parent-boot-2 0.0.1-SNAPSHOT @@ -34,12 +46,16 @@ org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-starter-test test + + org.springframework.boot + spring-boot-starter-webflux + test +
\ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/NewsApplication.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/NewsApplication.java new file mode 100644 index 0000000000..04dca159c7 --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/NewsApplication.java @@ -0,0 +1,23 @@ +package com.baeldung.spring.data.jpa.spel; + +import java.util.Locale; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.web.servlet.LocaleResolver; +import org.springframework.web.servlet.i18n.SessionLocaleResolver; + +@SpringBootApplication +public class NewsApplication { + + public static void main(String[] args) { + SpringApplication.run(NewsApplication.class, args); + } + + @Bean + public LocaleResolver localeResolver() { + SessionLocaleResolver slr = new SessionLocaleResolver(); + slr.setDefaultLocale(Locale.US); + return slr; + } +} diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/config/WebMvcConfig.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/config/WebMvcConfig.java new file mode 100644 index 0000000000..6569e31af4 --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/config/WebMvcConfig.java @@ -0,0 +1,17 @@ +package com.baeldung.spring.data.jpa.spel.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; + +@Configuration +public class WebMvcConfig implements WebMvcConfigurer { + + @Override + public void addInterceptors(InterceptorRegistry registry) { + LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); + localeChangeInterceptor.setParamName("locale"); + registry.addInterceptor(localeChangeInterceptor); + } +} diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/controller/ArticleController.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/controller/ArticleController.java new file mode 100644 index 0000000000..4e092fe150 --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/controller/ArticleController.java @@ -0,0 +1,26 @@ +package com.baeldung.spring.data.jpa.spel.controller; + +import com.baeldung.spring.data.jpa.spel.entity.Article; +import com.baeldung.spring.data.jpa.spel.repository.ArticleRepository; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/articles") +public class ArticleController { + + private final ArticleRepository articleRepository; + + @Autowired + public ArticleController(final ArticleRepository articleRepository) { + this.articleRepository = articleRepository; + } + + @GetMapping + List
getAllArticlesWithNativeQuery() { + return articleRepository.findAllArticlesUsingLocaleWithNativeQuery(); + } +} diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/Article.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/Article.java new file mode 100644 index 0000000000..93a0e3b9a9 --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/Article.java @@ -0,0 +1,111 @@ +package com.baeldung.spring.data.jpa.spel.entity; + +import java.util.Objects; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + + +@Entity(name = "articles") +@Table(name = "articles") +public class Article { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + private String title; + private String content; + private String language; + + public Article() { + } + + public Article(final String title, final String content, final String language) { + this.title = title; + this.content = content; + this.language = language; + } + + public Article(final Long id, final String title, final String content, final String language) { + this.id = id; + this.title = title; + this.content = content; + this.language = language; + } + + public Long getId() { + return id; + } + + public void setId(final Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(final String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(final String content) { + this.content = content; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(final String language) { + this.language = language; + } + + @Override + public String toString() { + return "News{" + + "id=" + id + + ", title='" + title + '\'' + + ", content='" + content + '\'' + + ", language=" + language + + '}'; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + final Article article = (Article) o; + + if (!Objects.equals(id, article.id)) { + return false; + } + if (!Objects.equals(title, article.title)) { + return false; + } + if (!Objects.equals(content, article.content)) { + return false; + } + return Objects.equals(language, article.language); + } + + @Override + public int hashCode() { + int result = id != null ? id.hashCode() : 0; + result = 31 * result + (title != null ? title.hashCode() : 0); + result = 31 * result + (content != null ? content.hashCode() : 0); + result = 31 * result + (language != null ? language.hashCode() : 0); + return result; + } +} diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/ArticleWrapper.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/ArticleWrapper.java new file mode 100644 index 0000000000..046a9c558a --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/ArticleWrapper.java @@ -0,0 +1,14 @@ +package com.baeldung.spring.data.jpa.spel.entity; + +public class ArticleWrapper { + + private final Article article; + + public ArticleWrapper(Article article) { + this.article = article; + } + + public Article getArticle() { + return article; + } +} diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/Language.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/Language.java new file mode 100644 index 0000000000..6fea0e06f4 --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/entity/Language.java @@ -0,0 +1,56 @@ +package com.baeldung.spring.data.jpa.spel.entity; + +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class Language { + + @Id + @Column(name = "iso_code") + private String isoCode; + + public Language() { + } + + public Language(final String isoCode) { + this.isoCode = isoCode; + } + + public String getIsoCode() { + return isoCode; + } + + public void setIsoCode(final String isoCode) { + this.isoCode = isoCode; + } + + @Override + public String toString() { + return "Language{" + + "isoCode='" + isoCode + '\'' + + '}'; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + final Language language = (Language) o; + + return Objects.equals(isoCode, language.isoCode); + } + + @Override + public int hashCode() { + return isoCode != null ? isoCode.hashCode() : 0; + } +} + diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/extension/LocaleContextHolderExtension.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/extension/LocaleContextHolderExtension.java new file mode 100644 index 0000000000..c0a334440f --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/extension/LocaleContextHolderExtension.java @@ -0,0 +1,20 @@ +package com.baeldung.spring.data.jpa.spel.extension; + +import java.util.Locale; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.data.spel.spi.EvaluationContextExtension; +import org.springframework.stereotype.Component; + +@Component +public class LocaleContextHolderExtension implements EvaluationContextExtension { + + @Override + public String getExtensionId() { + return "locale"; + } + + @Override + public Locale getRootObject() { + return LocaleContextHolder.getLocale(); + } +} diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/repository/ArticleRepository.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/repository/ArticleRepository.java new file mode 100644 index 0000000000..26549f67f5 --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/repository/ArticleRepository.java @@ -0,0 +1,78 @@ +package com.baeldung.spring.data.jpa.spel.repository; + +import com.baeldung.spring.data.jpa.spel.entity.Article; +import com.baeldung.spring.data.jpa.spel.entity.ArticleWrapper; +import java.util.List; +import javax.transaction.Transactional; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +public interface ArticleRepository extends BaseNewsApplicationRepository { + + + @Modifying + @Transactional + @Query(value = "INSERT INTO articles (id, title, content, language) " + + "VALUES (?1, ?2, ?3, ?4)", + nativeQuery = true) + void saveWithPositionalArguments(Long id, String title, String content, String language); + + + @Modifying + @Transactional + @Query(value = "INSERT INTO articles (id, title, content, language) " + + "VALUES (?#{[0]}, ?#{[1]}, ?#{[2]}, ?#{[3]})", + nativeQuery = true) + void saveWithPositionalSpELArguments(long id, String title, String content, String language); + + @Modifying + @Transactional + @Query(value = "INSERT INTO articles (id, title, content, language) " + + "VALUES (?#{[0]}, ?#{[1]}, ?#{[2] ?: 'Empty Article'}, ?#{[3]})", + nativeQuery = true) + void saveWithPositionalSpELArgumentsWithEmptyCheck(long id, String title, String content, String language); + + @Modifying + @Transactional + @Query(value = "INSERT INTO articles (id, title, content, language) " + + "VALUES (:id, :title, :content, :language)", + nativeQuery = true) + void saveWithNamedArguments(@Param("id") long id, @Param("title") String title, + @Param("content") String content, @Param("language") String language); + + @Modifying + @Transactional + @Query(value = "INSERT INTO articles (id, title, content, language) " + + "VALUES (:#{#id}, :#{#title}, :#{#content}, :#{#language})", + nativeQuery = true) + void saveWithNamedSpELArguments(@Param("id") long id, @Param("title") String title, + @Param("content") String content, @Param("language") String language); + + @Modifying + @Transactional + @Query(value = "INSERT INTO articles (id, title, content, language) " + + "VALUES (:#{#id}, :#{#title}, :#{#content}, :#{#language.toLowerCase()})", + nativeQuery = true) + void saveWithNamedSpELArgumentsAndLowerCaseLanguage(@Param("id") long id, @Param("title") String title, + @Param("content") String content, @Param("language") String language); + + @Modifying + @Transactional + @Query(value = "INSERT INTO articles (id, title, content, language) " + + "VALUES (:#{#article.id}, :#{#article.title}, :#{#article.content}, :#{#article.language})", + nativeQuery = true) + void saveWithSingleObjectSpELArgument(@Param("article") Article article); + + @Modifying + @Transactional + @Query(value = "INSERT INTO articles (id, title, content, language) " + + "VALUES (:#{#wrapper.article.id}, :#{#wrapper.article.title}, :#{#wrapper.article.content}, :#{#wrapper.article.language})", + nativeQuery = true) + void saveWithSingleWrappedObjectSpELArgument(@Param("wrapper") ArticleWrapper articleWrapper); + + + @Query(value = "SELECT * FROM articles WHERE language = :#{locale.language}", + nativeQuery = true) + List
findAllArticlesUsingLocaleWithNativeQuery(); +} diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/repository/BaseNewsApplicationRepository.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/repository/BaseNewsApplicationRepository.java new file mode 100644 index 0000000000..e76995eaa3 --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/spel/repository/BaseNewsApplicationRepository.java @@ -0,0 +1,17 @@ +package com.baeldung.spring.data.jpa.spel.repository; + +import com.baeldung.spring.data.jpa.spel.entity.Article; +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.NoRepositoryBean; + +@NoRepositoryBean +public interface BaseNewsApplicationRepository extends JpaRepository { + + @Query(value = "select e from #{#entityName} e") + List
findAllEntitiesUsingEntityPlaceholder(); + + @Query(value = "SELECT * FROM #{#entityName}", nativeQuery = true) + List
findAllEntitiesUsingEntityPlaceholderWithNativeQuery(); +} diff --git a/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/spel/controller/ArticleControllerIntegrationTest.java b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/spel/controller/ArticleControllerIntegrationTest.java new file mode 100644 index 0000000000..7d3af20fae --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/spel/controller/ArticleControllerIntegrationTest.java @@ -0,0 +1,47 @@ +package com.baeldung.spring.data.jpa.spel.controller; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import com.baeldung.spring.data.jpa.spel.NewsApplication; +import com.baeldung.spring.data.jpa.spel.entity.Article; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +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.test.web.reactive.server.WebTestClient; + +@SpringBootTest(classes = NewsApplication.class, + webEnvironment = WebEnvironment.RANDOM_PORT, + properties = { + "spring.jpa.show-sql=true", + "spring.jpa.generate-ddl=true", + "spring.jpa.defer-datasource-initialization=true", + "spring.sql.init.data-locations=classpath:articles-dml.sql" + }) +class ArticleControllerIntegrationTest { + + @Autowired + private ArticleController articleController; + @Autowired + private WebTestClient webTestClient; + + @Test + void whenApplicationStartBeansArePresent() { + assertNotNull(articleController); + assertNotNull(webTestClient); + } + + @ParameterizedTest + @CsvSource({"eng,2", "fr,2", "esp,2", "deu, 2", "jp,0"}) + void whenAskForNewsGetAllNewsInSpecificLanguageBasedOnLocale(String language, int expectedResultSize) { + webTestClient.get().uri("/articles?locale=" + language) + .exchange() + .expectStatus().isOk() + .expectBodyList(Article.class) + .hasSize(expectedResultSize); + } + + +} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/spel/repository/ArticleRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/spel/repository/ArticleRepositoryIntegrationTest.java new file mode 100644 index 0000000000..f7f9cb996e --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/spel/repository/ArticleRepositoryIntegrationTest.java @@ -0,0 +1,141 @@ +package com.baeldung.spring.data.jpa.spel.repository; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import com.baeldung.spring.data.jpa.spel.NewsApplication; +import com.baeldung.spring.data.jpa.spel.entity.Article; +import com.baeldung.spring.data.jpa.spel.entity.ArticleWrapper; +import com.baeldung.spring.data.jpa.spel.extension.LocaleContextHolderExtension; +import java.util.List; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest(classes = NewsApplication.class, + properties = { + "spring.jpa.show-sql=true", + "spring.jpa.generate-ddl=true", + }) +class ArticleRepositoryIntegrationTest { + + @Autowired + private ArticleRepository articleRepository; + + private static final String ENGLISH = "eng"; + private static final Article SPORTS_ARTICLE + = new Article(1L, "Sports Update", + "The local team won their game last night...", ENGLISH); + + @Autowired + private LocaleContextHolderExtension localeContextHolderExtension; + + @Test + void whenContextStartRepositoryIsPresent() { + assertNotNull(articleRepository, "Repository should be present"); + } + + @Test + void whenContextStartContextHolderIsPresent() { + assertNotNull(localeContextHolderExtension, "Context holder should be present"); + assertNotNull(localeContextHolderExtension.getRootObject()); + } + + @AfterEach + void tearDown() { + articleRepository.deleteAll(); + } + + @Test + void givenArticleWhenCreateWithPositionalArgumentsPlaceholdersShouldBePersisted() { + articleRepository.saveWithPositionalArguments(1L, SPORTS_ARTICLE.getTitle(), + SPORTS_ARTICLE.getContent(), + SPORTS_ARTICLE.getLanguage()); + final List
articles = articleRepository.findAll(); + assertEquals(1, articles.size()); + } + + @Test + void givenArticleWhenCreateWithPositionalSpELArgumentsPlaceholdersShouldBePersisted() { + articleRepository.saveWithPositionalSpELArguments(1L, SPORTS_ARTICLE.getTitle(), + SPORTS_ARTICLE.getContent(), + SPORTS_ARTICLE.getLanguage()); + final List
articles = articleRepository.findAll(); + assertEquals(1, articles.size()); + } + + @Test + void givenArticleWhenCreateWithPositionalSpELArgumentsPlaceholdersWithEmptyCheckShouldStoreDefaultValue() { + articleRepository.saveWithPositionalSpELArgumentsWithEmptyCheck(1L, + SPORTS_ARTICLE.getTitle(), null, SPORTS_ARTICLE.getLanguage()); + final List
articles = articleRepository.findAll(); + assertEquals(1, articles.size()); + assertEquals("Empty Article", articles.get(0).getContent()); + } + + @Test + void givenArticleWhenCreateWithPositionalSpELArgumentsPlaceholdersWithEmptyCheckShouldStoreTheOriginalContent() { + articleRepository.saveWithPositionalSpELArgumentsWithEmptyCheck(1L, + SPORTS_ARTICLE.getTitle(), SPORTS_ARTICLE.getContent(), SPORTS_ARTICLE.getLanguage()); + final List
articles = articleRepository.findAll(); + assertEquals(1, articles.size()); + assertEquals(SPORTS_ARTICLE, articles.get(0)); + } + + @Test + void givenArticleWhenCreateWithNamedArgumentsPlaceholdersShouldBePersisted() { + articleRepository.saveWithNamedArguments(1L, SPORTS_ARTICLE.getTitle(), + SPORTS_ARTICLE.getContent(), SPORTS_ARTICLE.getLanguage()); + final List
articles = articleRepository.findAll(); + assertEquals(1, articles.size()); + } + + @Test + void givenArticleWhenCreateWithNamedSpELArgumentsPlaceholdersShouldBePersisted() { + articleRepository.saveWithNamedSpELArguments(1L, SPORTS_ARTICLE.getTitle(), + SPORTS_ARTICLE.getContent(), SPORTS_ARTICLE.getLanguage()); + final List
articles = articleRepository.findAll(); + assertEquals(1, articles.size()); + } + + @Test + void givenArticleWhenCreateWithNamedSpELArgumentsAndLowerCaseLanguagePlaceholdersConvertLanguageToLowerCase() { + final String language = "ENG"; + articleRepository.saveWithNamedSpELArgumentsAndLowerCaseLanguage(1L, + SPORTS_ARTICLE.getTitle(), SPORTS_ARTICLE.getContent(), + language); + final List
articles = articleRepository.findAll(); + assertEquals(1, articles.size()); + assertEquals(language.toLowerCase(), articles.get(0).getLanguage()); + } + + @Test + void givenArticleWhenCreateWithSingleObjectArgumentPlaceholdersShouldBePersisted() { + articleRepository.saveWithSingleObjectSpELArgument(SPORTS_ARTICLE); + final List
articles = articleRepository.findAll(); + assertEquals(1, articles.size()); + } + + @Test + void givenArticleWhenCreateWithSingleWrappedObjectArgumentPlaceholdersShouldBePersisted() { + articleRepository.saveWithSingleWrappedObjectSpELArgument(new ArticleWrapper(SPORTS_ARTICLE)); + final List
articles = articleRepository.findAll(); + assertEquals(1, articles.size()); + } + + @Test + void givenInheritedQueryWhenSearchForArticlesWillReturnThem() { + articleRepository.save(SPORTS_ARTICLE); + final List
articles = articleRepository.findAllEntitiesUsingEntityPlaceholder(); + assertEquals(1, articles.size()); + } + + @Test + void givenInheritedNativeQueryWhenSearchForArticlesWillReturnThem() { + articleRepository.save(SPORTS_ARTICLE); + final List
articles = articleRepository.findAllEntitiesUsingEntityPlaceholderWithNativeQuery(); + assertEquals(1, articles.size()); + } + +} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-query-3/src/test/resources/articles-dml.sql b/persistence-modules/spring-data-jpa-query-3/src/test/resources/articles-dml.sql new file mode 100644 index 0000000000..c6e00ee7cc --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/test/resources/articles-dml.sql @@ -0,0 +1,15 @@ +-- English +INSERT INTO articles (id, title, content, language) VALUES (11, 'Sports Update', 'The local team won their game last night...', 'eng'); +INSERT INTO articles (id, title, content, language) VALUES (17, 'Health News', 'New advancements in medical research were revealed...', 'eng'); + +-- French +INSERT INTO articles (id, title, content, language) VALUES (18, 'Nouvelles de la santé', 'De nouvelles avancées dans la recherche médicale ont été révélées...', 'fr'); +INSERT INTO articles (id, title, content, language) VALUES (12, 'Actualité sportive', 'L''équipe locale a gagné son match hier soir...', 'fr'); + +-- Spanish +INSERT INTO articles (id, title, content, language) VALUES (13, 'Actualización Deportiva', 'El equipo local ganó su partido anoche...', 'esp'); +INSERT INTO articles (id, title, content, language) VALUES (14, 'Innovación Tecnológica', 'Se ha anunciado un avance en la investigación de IA...', 'esp'); + +-- German +INSERT INTO articles (id, title, content, language) VALUES (15, 'Sportaktualisierung', 'Die lokale Mannschaft hat ihr Spiel gestern Abend gewonnen...', 'deu'); +INSERT INTO articles (id, title, content, language) VALUES (16, 'Technologie Durchbruch', 'Ein Durchbruch in der KI-Forschung wurde bekannt gegeben...', 'deu'); From a87d4fbdb3544eea261b3c3df2ec0449bcf7b6ab Mon Sep 17 00:00:00 2001 From: MohamedHelmyKassab <137485958+MohamedHelmyKassab@users.noreply.github.com> Date: Thu, 21 Dec 2023 06:58:07 +0200 Subject: [PATCH 270/294] This commit is related to BAEL-7342 (#15460) This commit aims to add a test class "CheckIfStringBuilderContainsCharUnitTest" that suggests several ways to check if a StringBuilder has a char or not. --- ...ckIfStringBuilderContainsCharUnitTest.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/stringbuilderhaschar/CheckIfStringBuilderContainsCharUnitTest.java diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/stringbuilderhaschar/CheckIfStringBuilderContainsCharUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/stringbuilderhaschar/CheckIfStringBuilderContainsCharUnitTest.java new file mode 100644 index 0000000000..8d95b5533a --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/stringbuilderhaschar/CheckIfStringBuilderContainsCharUnitTest.java @@ -0,0 +1,44 @@ +package com.baeldung.stringbuilderhaschar; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class CheckIfStringBuilderContainsCharUnitTest { + + StringBuilder stringBuilder = new StringBuilder("Welcome to Baeldung Java Tutorial!"); + char targetChar = 'o'; + + @Test + public void givenStringBuilder_whenUsingIndexOfMethod_thenCheckIfSCharExists() { + int index = stringBuilder.indexOf(String.valueOf(targetChar)); + assertTrue(index != -1); + } + + @Test + public void givenStringBuilder_whenUsingContainsMethod_thenCheckIfSCharExists() { + boolean containsChar = stringBuilder.toString().contains(String.valueOf(targetChar)); + assertTrue(containsChar); + } + + @Test + public void givenStringBuilder_whenUsingJavaStream_thenCheckIfSCharExists() { + boolean charFound = stringBuilder.chars().anyMatch(c -> c == targetChar); + + assertTrue(charFound); + } + + @Test + public void givenStringBuilder_whenUsingIterations_thenCheckIfSCharExists() { + boolean charFound = false; + + for (int i = 0; i < stringBuilder.length(); i++) { + if (stringBuilder.charAt(i) == targetChar) { + charFound = true; + break; + } + } + + assertTrue(charFound); + } +} From 288178f87bcbc6ee68598c6aa7c9c301e1da5a82 Mon Sep 17 00:00:00 2001 From: Rajat Garg Date: Thu, 21 Dec 2023 10:34:32 +0530 Subject: [PATCH 271/294] [BAEL-7306] Add methods for sorting a list (#15462) Co-authored-by: rajatgarg --- .../core-java-collections-list-6/pom.xml | 16 +++++ .../sorting/SortingBasedOnAnotherList.java | 52 ++++++++++++++ .../SortingBasedOnAnotherListUnitTest.java | 70 +++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 core-java-modules/core-java-collections-list-6/src/main/java/com/baeldung/sorting/SortingBasedOnAnotherList.java create mode 100644 core-java-modules/core-java-collections-list-6/src/test/java/com/baeldung/sorting/SortingBasedOnAnotherListUnitTest.java diff --git a/core-java-modules/core-java-collections-list-6/pom.xml b/core-java-modules/core-java-collections-list-6/pom.xml index 46ef4ff4c9..18a153ff06 100644 --- a/core-java-modules/core-java-collections-list-6/pom.xml +++ b/core-java-modules/core-java-collections-list-6/pom.xml @@ -13,4 +13,20 @@ 0.0.1-SNAPSHOT + + + com.google.guava + guava + ${guava.version} + + + io.vavr + vavr + ${vavr.version} + + + + + 0.10.4 + \ No newline at end of file diff --git a/core-java-modules/core-java-collections-list-6/src/main/java/com/baeldung/sorting/SortingBasedOnAnotherList.java b/core-java-modules/core-java-collections-list-6/src/main/java/com/baeldung/sorting/SortingBasedOnAnotherList.java new file mode 100644 index 0000000000..b53b3a946a --- /dev/null +++ b/core-java-modules/core-java-collections-list-6/src/main/java/com/baeldung/sorting/SortingBasedOnAnotherList.java @@ -0,0 +1,52 @@ +package com.baeldung.sorting; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import com.google.common.collect.Ordering; + +public class SortingBasedOnAnotherList { + static List sortUsingForLoop(List listToSort, List listWithOrder) { + List sortedList = new ArrayList<>(); + for(String element: listWithOrder) { + if(listToSort.contains(element)) { + sortedList.add(element); + } + } + return sortedList; + } + + static void sortUsingComparator(List listToSort, List listWithOrder) { + listToSort.sort(Comparator.comparingInt(listWithOrder::indexOf)); + } + + static void sortUsingStreamAPI(List listToSort, List listWithOrder) { + Map indicesMap = listWithOrder.stream().collect(Collectors.toMap(e->e, listWithOrder::indexOf)); + listToSort.sort(Comparator.comparingInt(indicesMap::get)); + } + + static void sortUsingMap(List listToSort, List listWithOrder) { + Map orderedIndicesMap = new HashMap<>(); + for(int i = 0; i < listWithOrder.size(); i++) { + orderedIndicesMap.put(listWithOrder.get(i), i); + } + listToSort.sort(Comparator.comparingInt(orderedIndicesMap::get)); + } + + static List sortUsingGuava(List listToSort, List listWithOrder) { + Ordering explicitOrdering = Ordering.explicit(listWithOrder); + List sortedList = explicitOrdering.sortedCopy(listToSort); + return sortedList; + } + + static List sortUsingVavr(List listToSort, List listWithOrder) { + io.vavr.collection.List listWithOrderedElements = io.vavr.collection.List.ofAll(listWithOrder); + io.vavr.collection.List listToSortElements = io.vavr.collection.List.ofAll(listToSort); + io.vavr.collection.List sortedList = listToSortElements.sortBy(listWithOrderedElements::indexOf); + return sortedList.asJava(); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-list-6/src/test/java/com/baeldung/sorting/SortingBasedOnAnotherListUnitTest.java b/core-java-modules/core-java-collections-list-6/src/test/java/com/baeldung/sorting/SortingBasedOnAnotherListUnitTest.java new file mode 100644 index 0000000000..2ed7d52eee --- /dev/null +++ b/core-java-modules/core-java-collections-list-6/src/test/java/com/baeldung/sorting/SortingBasedOnAnotherListUnitTest.java @@ -0,0 +1,70 @@ +package com.baeldung.sorting; + +import static com.baeldung.sorting.SortingBasedOnAnotherList.sortUsingComparator; +import static com.baeldung.sorting.SortingBasedOnAnotherList.sortUsingForLoop; +import static com.baeldung.sorting.SortingBasedOnAnotherList.sortUsingGuava; +import static com.baeldung.sorting.SortingBasedOnAnotherList.sortUsingMap; +import static com.baeldung.sorting.SortingBasedOnAnotherList.sortUsingStreamAPI; +import static com.baeldung.sorting.SortingBasedOnAnotherList.sortUsingVavr; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.Test; + +public class SortingBasedOnAnotherListUnitTest { + @Test + public void givenTwoList_whenUsingForLoop_thenSort() { + List listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + List listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke"); + sortUsingForLoop(listToSort, listWithOrder); + List expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + assertEquals(expectedSortedList, listWithOrder); + } + + @Test + public void givenTwoList_whenUsingComparator_thenSort() { + List listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + List listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke"); + sortUsingComparator(listToSort, listWithOrder); + List expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + assertEquals(expectedSortedList, listToSort); + } + + @Test + public void givenTwoList_whenUsingStreamAPI_thenSort() { + List listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + List listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke"); + sortUsingStreamAPI(listToSort, listWithOrder); + List expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + assertEquals(expectedSortedList, listToSort); + } + + @Test + public void givenTwoList_whenUsingMap_thenSort() { + List listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + List listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke"); + sortUsingMap(listToSort, listWithOrder); + List expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + assertEquals(expectedSortedList, listToSort); + } + + @Test + public void givenTwoList_whenUsingGuavaExplicit_thenSort() { + List listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + List listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke"); + sortUsingGuava(listToSort, listWithOrder); + List expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + assertEquals(expectedSortedList, listWithOrder); + } + + @Test + public void givenTwoList_whenUsingVavr_thenSort() { + List listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + List listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke"); + sortUsingVavr(listToSort, listWithOrder); + List expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + assertEquals(expectedSortedList, listWithOrder); + } +} \ No newline at end of file From 51e9f6cf37c59947d0a76dd48aa5f13cd7ac06a8 Mon Sep 17 00:00:00 2001 From: Amit Pandey Date: Thu, 21 Dec 2023 13:29:11 +0530 Subject: [PATCH 272/294] Made changes to upgrade the module spring-resttemplate-3 to Spring Boot 3. (#15455) --- spring-web-modules/spring-resttemplate-3/pom.xml | 14 ++++++++++++-- .../custom/CustomRestTemplateConfiguration.java | 16 +++++++++++----- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/spring-web-modules/spring-resttemplate-3/pom.xml b/spring-web-modules/spring-resttemplate-3/pom.xml index 5ce7d348a2..7353ed38d7 100644 --- a/spring-web-modules/spring-resttemplate-3/pom.xml +++ b/spring-web-modules/spring-resttemplate-3/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-3 @@ -24,6 +24,16 @@ org.springframework.boot spring-boot-starter-test + + org.apache.httpcomponents.client5 + httpclient5 + ${httpclient5.version} + + + com.baeldung.resttemplate.methods.RestTemplateMethodsApplication + 5.2.1 + + diff --git a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/custom/CustomRestTemplateConfiguration.java b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/custom/CustomRestTemplateConfiguration.java index 9383b584c4..d29960789e 100644 --- a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/custom/CustomRestTemplateConfiguration.java +++ b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/custom/CustomRestTemplateConfiguration.java @@ -9,10 +9,12 @@ import java.security.cert.CertificateException; import javax.net.ssl.SSLContext; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContextBuilder; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder; +import org.apache.hc.client5.http.io.HttpClientConnectionManager; +import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory; +import org.apache.hc.core5.ssl.SSLContextBuilder; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -38,7 +40,11 @@ public class CustomRestTemplateConfiguration { .loadTrustMaterial(trustStore.getURL(), trustStorePassword.toCharArray()).build(); SSLConnectionSocketFactory sslConFactory = new SSLConnectionSocketFactory(sslContext); - CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslConFactory).build(); + final HttpClientConnectionManager cm = PoolingHttpClientConnectionManagerBuilder.create() + .setSSLSocketFactory(sslConFactory) + .build(); + + CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build(); ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); return new RestTemplate(requestFactory); } From 5e4ca88972887c9531e8eda65a785c3c973a5d1f Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 21 Dec 2023 10:30:26 +0200 Subject: [PATCH 273/294] [JAVA-22519] Move articles from generic libraries module to specific library modules (#15416) --- akka-modules/akka-actors/README.md | 7 + akka-modules/akka-actors/pom.xml | 33 +++ .../com/baeldung/akkaactors}/FirstActor.java | 2 +- .../com/baeldung/akkaactors}/MyActor.java | 2 +- .../baeldung/akkaactors}/PrinterActor.java | 2 +- .../baeldung/akkaactors}/ReadingActor.java | 2 +- .../akkaactors}/WordCounterActor.java | 2 +- .../akkaactors}/AkkaActorsUnitTest.java | 2 +- akka-modules/pom.xml | 1 + jmh/README.md | 1 + .../main/java/com/baeldung/jmh/BenchMark.java | 0 .../main/java/com/baeldung/jmh/JmhDemo.java | 0 .../baeldung/jmh/warmup/MainApplication.java | 0 .../jmh/warmup/ManualClassLoader.java | 0 .../com/baeldung/jmh/warmup/dummy/Dummy.java | 0 libraries-2/README.md | 3 +- libraries-2/pom.xml | 26 +- .../baeldung/mapdb/CollectionsUnitTest.java | 8 +- .../com/baeldung/mapdb/HTreeMapUnitTest.java | 12 +- .../baeldung/mapdb/HelloBaeldungUnitTest.java | 20 +- .../baeldung/mapdb/InMemoryModesUnitTest.java | 6 +- .../mapdb/SortedTableMapUnitTest.java | 6 +- .../baeldung/mapdb/TransactionsUnitTest.java | 10 +- libraries-3/README.md | 3 - libraries-3/pom.xml | 70 ----- libraries-4/README.md | 4 - libraries-4/pom.xml | 23 -- libraries-5/README.md | 4 - libraries-5/pom.xml | 78 +----- libraries-6/README.md | 2 - libraries-6/pom.xml | 19 -- libraries-ai/README.md | 1 + libraries-ai/pom.xml | 6 + .../src/main/java}/neuroph/NeurophXOR.java | 2 +- .../baeldung/neuroph/XORIntegrationTest.java | 4 +- libraries-apache-commons-2/README.md | 1 + libraries-apache-commons-2/pom.xml | 13 + .../com/baeldung/commons}/ftp/FtpClient.java | 16 +- .../ftp/FtpClientIntegrationTest.java | 16 +- .../ftp/JdkFtpClientIntegrationTest.java | 23 +- .../src/test/resources/ftp/baz.txt | 0 libraries-concurrency/README.md | 1 + libraries-concurrency/pom.xml | 11 + .../com/baeldung/jctools/MpmcBenchmark.java | 23 +- .../main/java/com/baeldung/jctools/README.md | 0 .../com/baeldung/jctools/JCToolsUnitTest.java | 13 +- libraries-data-3/README.md | 15 + libraries-data-3/pom.xml | 101 +++++++ .../com/baeldung/cache2k/ProductHelper.java | 0 .../cache2k/ProductHelperUsingLoader.java | 0 .../ProductHelperWithEventListener.java | 0 .../cache2k/ProductHelperWithExpiry.java | 0 .../cactoos/CactoosCollectionUtils.java | 0 .../baeldung/cactoos/CactoosStringUtils.java | 0 .../com/baeldung/caffeine/DataObject.java | 0 .../ConvertContainerToAnother.java | 0 .../baeldung/eclipsecollections/Student.java | 0 .../com/baeldung/modelmapper/domain/Game.java | 0 .../baeldung/modelmapper/domain/GameMode.java | 0 .../modelmapper/domain/GameSettings.java | 0 .../baeldung/modelmapper/domain/Player.java | 0 .../com/baeldung/modelmapper/dto/GameDTO.java | 3 +- .../baeldung/modelmapper/dto/PlayerDTO.java | 0 .../repository/GameRepository.java | 3 +- .../main/java/com/baeldung/stm/Account.java | 0 .../cache2k/ProductHelperUnitTest.java | 0 .../ProductHelperUsingLoaderUnitTest.java | 0 ...roductHelperWithEventListenerUnitTest.java | 0 .../ProductHelperWithExpiryUnitTest.java | 0 .../CactoosCollectionUtilsUnitTest.java | 2 +- .../cactoos/CactoosStringUtilsUnitTest.java | 0 .../baeldung/caffeine/CaffeineUnitTest.java | 10 +- .../chroniclemap/ChronicleMapUnitTest.java | 264 +++++++++--------- .../AllSatisfyPatternUnitTest.java | 0 .../AnySatisfyPatternUnitTest.java | 0 .../CollectPatternUnitTest.java | 3 +- .../ConvertContainerToAnotherUnitTest.java | 0 .../DetectPatternUnitTest.java | 0 .../FlatCollectUnitTest.java | 7 +- .../ForEachPatternUnitTest.java | 2 - .../InjectIntoPatternUnitTest.java | 0 .../LazyIterationUnitTest.java | 0 .../PartitionPatternUnitTest.java | 0 .../RejectPatternUnitTest.java | 0 .../SelectPatternUnitTest.java | 0 .../eclipsecollections/ZipUnitTest.java | 3 +- .../ZipWithIndexUnitTest.java | 0 .../javatuples/JavaTuplesUnitTest.java | 0 .../modelmapper/ModelMapperUnitTest.java | 16 +- .../pcollections/PCollectionsUnitTest.java | 18 +- .../com/baeldung/stm/AccountUnitTest.java | 6 +- libraries-data-db/pom.xml | 1 + libraries-io/README.md | 1 + libraries-io/pom.xml | 39 ++- .../java}/io/JavaDirectoryDeleteUnitTest.java | 2 +- libraries-testing-2/README.md | 8 + libraries-testing-2/pom.xml | 56 ++++ .../baeldung/pact/config/MainApplication.java | 0 .../pact/web/controller/PactController.java | 0 .../com/baeldung/pact/web/dto/PactDto.java | 0 .../PactConsumerDrivenContractUnitTest.java | 0 .../baeldung/pact/PactProviderLiveTest.java | 0 libraries-testing/README.md | 1 + libraries/README.md | 5 - libraries/pom.xml | 24 -- pom.xml | 4 + web-modules/java-takes/README.md | 7 + web-modules/java-takes/pom.xml | 81 ++++++ .../java/com/baeldung/takes/TakesApp.java | 0 .../java/com/baeldung/takes/TakesContact.java | 0 .../com/baeldung/takes/TakesHelloWorld.java | 0 .../java/com/baeldung/takes/TakesIndex.java | 0 .../java-takes/src/main/resources/logback.xml | 13 + .../src/main/webapp/templates/index.vm | 0 .../takes/TakesAppIntegrationTest.java | 0 .../baeldung/takes/TakesContactUnitTest.java | 0 web-modules/pom.xml | 3 + web-modules/rome/README.md | 8 + web-modules/rome/pom.xml | 31 ++ .../com/baeldung/rome/RSSRomeExample.java | 19 +- .../rome/src/main/resources/logback.xml | 13 + 121 files changed, 729 insertions(+), 518 deletions(-) create mode 100644 akka-modules/akka-actors/README.md create mode 100644 akka-modules/akka-actors/pom.xml rename {libraries-5/src/main/java/com/baeldung/akka => akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors}/FirstActor.java (95%) rename {libraries-5/src/main/java/com/baeldung/akka => akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors}/MyActor.java (95%) rename {libraries-5/src/main/java/com/baeldung/akka => akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors}/PrinterActor.java (97%) rename {libraries-5/src/main/java/com/baeldung/akka => akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors}/ReadingActor.java (98%) rename {libraries-5/src/main/java/com/baeldung/akka => akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors}/WordCounterActor.java (97%) rename {libraries-5/src/test/java/com/baeldung/akka => akka-modules/akka-actors/src/test/java/com/baeldung/akkaactors}/AkkaActorsUnitTest.java (99%) rename {libraries => jmh}/src/main/java/com/baeldung/jmh/BenchMark.java (100%) rename {libraries => jmh}/src/main/java/com/baeldung/jmh/JmhDemo.java (100%) rename {libraries => jmh}/src/main/java/com/baeldung/jmh/warmup/MainApplication.java (100%) rename {libraries => jmh}/src/main/java/com/baeldung/jmh/warmup/ManualClassLoader.java (100%) rename {libraries => jmh}/src/main/java/com/baeldung/jmh/warmup/dummy/Dummy.java (100%) rename {libraries/src/main/java/com/baeldung => libraries-ai/src/main/java}/neuroph/NeurophXOR.java (98%) rename {libraries => libraries-ai}/src/test/java/com/baeldung/neuroph/XORIntegrationTest.java (94%) rename {libraries-6/src/main/java/com/baeldung => libraries-apache-commons-2/src/main/java/com/baeldung/commons}/ftp/FtpClient.java (90%) rename {libraries-6/src/test/java/com/baeldung => libraries-apache-commons-2/src/test/java/com/baeldung/commons}/ftp/FtpClientIntegrationTest.java (98%) rename {libraries-6/src/test/java/com/baeldung => libraries-apache-commons-2/src/test/java/com/baeldung/commons}/ftp/JdkFtpClientIntegrationTest.java (93%) rename {libraries-6 => libraries-apache-commons-2}/src/test/resources/ftp/baz.txt (100%) rename {libraries-5 => libraries-concurrency}/src/main/java/com/baeldung/jctools/MpmcBenchmark.java (77%) rename {libraries-5 => libraries-concurrency}/src/main/java/com/baeldung/jctools/README.md (100%) rename {libraries-5 => libraries-concurrency}/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java (98%) create mode 100644 libraries-data-3/README.md create mode 100644 libraries-data-3/pom.xml rename {libraries-3 => libraries-data-3}/src/main/java/com/baeldung/cache2k/ProductHelper.java (100%) rename {libraries-3 => libraries-data-3}/src/main/java/com/baeldung/cache2k/ProductHelperUsingLoader.java (100%) rename {libraries-3 => libraries-data-3}/src/main/java/com/baeldung/cache2k/ProductHelperWithEventListener.java (100%) rename {libraries-3 => libraries-data-3}/src/main/java/com/baeldung/cache2k/ProductHelperWithExpiry.java (100%) rename {libraries-3 => libraries-data-3}/src/main/java/com/baeldung/cactoos/CactoosCollectionUtils.java (100%) rename {libraries-3 => libraries-data-3}/src/main/java/com/baeldung/cactoos/CactoosStringUtils.java (100%) rename {libraries-5 => libraries-data-3}/src/main/java/com/baeldung/caffeine/DataObject.java (100%) rename {libraries-4 => libraries-data-3}/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java (100%) rename {libraries-4 => libraries-data-3}/src/main/java/com/baeldung/eclipsecollections/Student.java (100%) rename {libraries-6 => libraries-data-3}/src/main/java/com/baeldung/modelmapper/domain/Game.java (100%) rename {libraries-6 => libraries-data-3}/src/main/java/com/baeldung/modelmapper/domain/GameMode.java (100%) rename {libraries-6 => libraries-data-3}/src/main/java/com/baeldung/modelmapper/domain/GameSettings.java (100%) rename {libraries-6 => libraries-data-3}/src/main/java/com/baeldung/modelmapper/domain/Player.java (100%) rename {libraries-6 => libraries-data-3}/src/main/java/com/baeldung/modelmapper/dto/GameDTO.java (99%) rename {libraries-6 => libraries-data-3}/src/main/java/com/baeldung/modelmapper/dto/PlayerDTO.java (100%) rename {libraries-6 => libraries-data-3}/src/main/java/com/baeldung/modelmapper/repository/GameRepository.java (99%) rename {libraries => libraries-data-3}/src/main/java/com/baeldung/stm/Account.java (100%) rename {libraries-3 => libraries-data-3}/src/test/java/com/baeldung/cache2k/ProductHelperUnitTest.java (100%) rename {libraries-3 => libraries-data-3}/src/test/java/com/baeldung/cache2k/ProductHelperUsingLoaderUnitTest.java (100%) rename {libraries-3 => libraries-data-3}/src/test/java/com/baeldung/cache2k/ProductHelperWithEventListenerUnitTest.java (100%) rename {libraries-3 => libraries-data-3}/src/test/java/com/baeldung/cache2k/ProductHelperWithExpiryUnitTest.java (100%) rename {libraries-3 => libraries-data-3}/src/test/java/com/baeldung/cactoos/CactoosCollectionUtilsUnitTest.java (100%) rename {libraries-3 => libraries-data-3}/src/test/java/com/baeldung/cactoos/CactoosStringUtilsUnitTest.java (100%) rename {libraries-5 => libraries-data-3}/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java (92%) rename {libraries-2 => libraries-data-3}/src/test/java/com/baeldung/chroniclemap/ChronicleMapUnitTest.java (97%) rename {libraries-4 => libraries-data-3}/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternUnitTest.java (100%) rename {libraries-4 => libraries-data-3}/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternUnitTest.java (100%) rename {libraries-4 => libraries-data-3}/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java (99%) rename {libraries-4 => libraries-data-3}/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherUnitTest.java (100%) rename {libraries-4 => libraries-data-3}/src/test/java/com/baeldung/eclipsecollections/DetectPatternUnitTest.java (100%) rename {libraries-4 => libraries-data-3}/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java (99%) rename {libraries-4 => libraries-data-3}/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java (95%) rename {libraries-4 => libraries-data-3}/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternUnitTest.java (100%) rename {libraries-4 => libraries-data-3}/src/test/java/com/baeldung/eclipsecollections/LazyIterationUnitTest.java (100%) rename {libraries-4 => libraries-data-3}/src/test/java/com/baeldung/eclipsecollections/PartitionPatternUnitTest.java (100%) rename {libraries-4 => libraries-data-3}/src/test/java/com/baeldung/eclipsecollections/RejectPatternUnitTest.java (100%) rename {libraries-4 => libraries-data-3}/src/test/java/com/baeldung/eclipsecollections/SelectPatternUnitTest.java (100%) rename {libraries-4 => libraries-data-3}/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java (99%) rename {libraries-4 => libraries-data-3}/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexUnitTest.java (100%) rename {libraries => libraries-data-3}/src/test/java/com/baeldung/javatuples/JavaTuplesUnitTest.java (100%) rename {libraries-6 => libraries-data-3}/src/test/java/com/baeldung/modelmapper/ModelMapperUnitTest.java (99%) rename {libraries-4 => libraries-data-3}/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java (96%) rename {libraries => libraries-data-3}/src/test/java/com/baeldung/stm/AccountUnitTest.java (100%) rename {libraries-4/src/test/java/com/baeldung => libraries-io/src/test/java/com/baeldung/java}/io/JavaDirectoryDeleteUnitTest.java (99%) create mode 100644 libraries-testing-2/README.md create mode 100644 libraries-testing-2/pom.xml rename {libraries-5 => libraries-testing-2}/src/main/java/com/baeldung/pact/config/MainApplication.java (100%) rename {libraries-5 => libraries-testing-2}/src/main/java/com/baeldung/pact/web/controller/PactController.java (100%) rename {libraries-5 => libraries-testing-2}/src/main/java/com/baeldung/pact/web/dto/PactDto.java (100%) rename {libraries-5 => libraries-testing-2}/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java (100%) rename {libraries-5 => libraries-testing-2}/src/test/java/com/baeldung/pact/PactProviderLiveTest.java (100%) create mode 100644 web-modules/java-takes/README.md create mode 100644 web-modules/java-takes/pom.xml rename {libraries-3 => web-modules/java-takes}/src/main/java/com/baeldung/takes/TakesApp.java (100%) rename {libraries-3 => web-modules/java-takes}/src/main/java/com/baeldung/takes/TakesContact.java (100%) rename {libraries-3 => web-modules/java-takes}/src/main/java/com/baeldung/takes/TakesHelloWorld.java (100%) rename {libraries-3 => web-modules/java-takes}/src/main/java/com/baeldung/takes/TakesIndex.java (100%) create mode 100644 web-modules/java-takes/src/main/resources/logback.xml rename {libraries-3 => web-modules/java-takes}/src/main/webapp/templates/index.vm (100%) rename {libraries-3 => web-modules/java-takes}/src/test/java/com/baeldung/takes/TakesAppIntegrationTest.java (100%) rename {libraries-3 => web-modules/java-takes}/src/test/java/com/baeldung/takes/TakesContactUnitTest.java (100%) create mode 100644 web-modules/rome/README.md create mode 100644 web-modules/rome/pom.xml rename {libraries-4 => web-modules/rome}/src/main/java/com/baeldung/rome/RSSRomeExample.java (85%) create mode 100644 web-modules/rome/src/main/resources/logback.xml diff --git a/akka-modules/akka-actors/README.md b/akka-modules/akka-actors/README.md new file mode 100644 index 0000000000..20611aee6a --- /dev/null +++ b/akka-modules/akka-actors/README.md @@ -0,0 +1,7 @@ +## Akka HTTP + +This module contains articles about Akka actors. + +### Relevant articles: + +- [Introduction to Akka Actors in Java](https://www.baeldung.com/akka-actors-java) diff --git a/akka-modules/akka-actors/pom.xml b/akka-modules/akka-actors/pom.xml new file mode 100644 index 0000000000..f354b13bd9 --- /dev/null +++ b/akka-modules/akka-actors/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + akka-actors + akka-actors + + + com.baeldung + akka-modules + 1.0.0-SNAPSHOT + + + + + com.typesafe.akka + akka-actor_${scala.version} + ${typesafe-akka.version} + + + com.typesafe.akka + akka-testkit_${scala.version} + ${typesafe-akka.version} + test + + + + + 2.5.11 + + + \ No newline at end of file diff --git a/libraries-5/src/main/java/com/baeldung/akka/FirstActor.java b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/FirstActor.java similarity index 95% rename from libraries-5/src/main/java/com/baeldung/akka/FirstActor.java rename to akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/FirstActor.java index 9680429fb1..1d166604ee 100644 --- a/libraries-5/src/main/java/com/baeldung/akka/FirstActor.java +++ b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/FirstActor.java @@ -1,4 +1,4 @@ -package com.baeldung.akka; +package com.baeldung.akkaactors; import akka.actor.AbstractActor; import akka.actor.Props; diff --git a/libraries-5/src/main/java/com/baeldung/akka/MyActor.java b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/MyActor.java similarity index 95% rename from libraries-5/src/main/java/com/baeldung/akka/MyActor.java rename to akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/MyActor.java index 99ee3158b6..2149242c19 100644 --- a/libraries-5/src/main/java/com/baeldung/akka/MyActor.java +++ b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/MyActor.java @@ -1,4 +1,4 @@ -package com.baeldung.akka; +package com.baeldung.akkaactors; import akka.actor.AbstractActor; import akka.event.Logging; diff --git a/libraries-5/src/main/java/com/baeldung/akka/PrinterActor.java b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/PrinterActor.java similarity index 97% rename from libraries-5/src/main/java/com/baeldung/akka/PrinterActor.java rename to akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/PrinterActor.java index 55b6e4e0f4..85a4fcc7ad 100644 --- a/libraries-5/src/main/java/com/baeldung/akka/PrinterActor.java +++ b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/PrinterActor.java @@ -1,4 +1,4 @@ -package com.baeldung.akka; +package com.baeldung.akkaactors; import akka.actor.AbstractActor; import akka.actor.Props; diff --git a/libraries-5/src/main/java/com/baeldung/akka/ReadingActor.java b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/ReadingActor.java similarity index 98% rename from libraries-5/src/main/java/com/baeldung/akka/ReadingActor.java rename to akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/ReadingActor.java index f1a21c8e28..bc68754364 100644 --- a/libraries-5/src/main/java/com/baeldung/akka/ReadingActor.java +++ b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/ReadingActor.java @@ -1,4 +1,4 @@ -package com.baeldung.akka; +package com.baeldung.akkaactors; import akka.actor.AbstractActor; import akka.actor.ActorRef; diff --git a/libraries-5/src/main/java/com/baeldung/akka/WordCounterActor.java b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/WordCounterActor.java similarity index 97% rename from libraries-5/src/main/java/com/baeldung/akka/WordCounterActor.java rename to akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/WordCounterActor.java index 3e23683971..07eb6f4aa2 100644 --- a/libraries-5/src/main/java/com/baeldung/akka/WordCounterActor.java +++ b/akka-modules/akka-actors/src/main/java/com/baeldung/akkaactors/WordCounterActor.java @@ -1,4 +1,4 @@ -package com.baeldung.akka; +package com.baeldung.akkaactors; import akka.actor.AbstractActor; import akka.event.Logging; diff --git a/libraries-5/src/test/java/com/baeldung/akka/AkkaActorsUnitTest.java b/akka-modules/akka-actors/src/test/java/com/baeldung/akkaactors/AkkaActorsUnitTest.java similarity index 99% rename from libraries-5/src/test/java/com/baeldung/akka/AkkaActorsUnitTest.java rename to akka-modules/akka-actors/src/test/java/com/baeldung/akkaactors/AkkaActorsUnitTest.java index adaff86565..362aef4600 100644 --- a/libraries-5/src/test/java/com/baeldung/akka/AkkaActorsUnitTest.java +++ b/akka-modules/akka-actors/src/test/java/com/baeldung/akkaactors/AkkaActorsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.akka; +package com.baeldung.akkaactors; import akka.actor.ActorRef; import akka.actor.ActorSystem; diff --git a/akka-modules/pom.xml b/akka-modules/pom.xml index 3a9d5e41ff..60432c4eea 100644 --- a/akka-modules/pom.xml +++ b/akka-modules/pom.xml @@ -14,6 +14,7 @@ + akka-actors akka-http akka-streams spring-akka diff --git a/jmh/README.md b/jmh/README.md index 3cfe847a3c..2e249c779c 100644 --- a/jmh/README.md +++ b/jmh/README.md @@ -7,3 +7,4 @@ This module contains articles about the Java Microbenchmark Harness (JMH). - [Microbenchmarking with Java](https://www.baeldung.com/java-microbenchmark-harness) - [A Guide to False Sharing and @Contended](https://www.baeldung.com/java-false-sharing-contended) - [Performance Comparison of boolean[] vs BitSet](https://www.baeldung.com/java-boolean-array-bitset-performance) +- [How to Warm Up the JVM](https://www.baeldung.com/java-jvm-warmup) diff --git a/libraries/src/main/java/com/baeldung/jmh/BenchMark.java b/jmh/src/main/java/com/baeldung/jmh/BenchMark.java similarity index 100% rename from libraries/src/main/java/com/baeldung/jmh/BenchMark.java rename to jmh/src/main/java/com/baeldung/jmh/BenchMark.java diff --git a/libraries/src/main/java/com/baeldung/jmh/JmhDemo.java b/jmh/src/main/java/com/baeldung/jmh/JmhDemo.java similarity index 100% rename from libraries/src/main/java/com/baeldung/jmh/JmhDemo.java rename to jmh/src/main/java/com/baeldung/jmh/JmhDemo.java diff --git a/libraries/src/main/java/com/baeldung/jmh/warmup/MainApplication.java b/jmh/src/main/java/com/baeldung/jmh/warmup/MainApplication.java similarity index 100% rename from libraries/src/main/java/com/baeldung/jmh/warmup/MainApplication.java rename to jmh/src/main/java/com/baeldung/jmh/warmup/MainApplication.java diff --git a/libraries/src/main/java/com/baeldung/jmh/warmup/ManualClassLoader.java b/jmh/src/main/java/com/baeldung/jmh/warmup/ManualClassLoader.java similarity index 100% rename from libraries/src/main/java/com/baeldung/jmh/warmup/ManualClassLoader.java rename to jmh/src/main/java/com/baeldung/jmh/warmup/ManualClassLoader.java diff --git a/libraries/src/main/java/com/baeldung/jmh/warmup/dummy/Dummy.java b/jmh/src/main/java/com/baeldung/jmh/warmup/dummy/Dummy.java similarity index 100% rename from libraries/src/main/java/com/baeldung/jmh/warmup/dummy/Dummy.java rename to jmh/src/main/java/com/baeldung/jmh/warmup/dummy/Dummy.java diff --git a/libraries-2/README.md b/libraries-2/README.md index 3eb788a34a..16c04cb7ad 100644 --- a/libraries-2/README.md +++ b/libraries-2/README.md @@ -12,8 +12,7 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m - [Guide to Classgraph Library](https://www.baeldung.com/classgraph) - [Templating with Handlebars](https://www.baeldung.com/handlebars) - [A Guide to Crawler4j](https://www.baeldung.com/crawler4j) -- [Key Value Store with Chronicle Map](https://www.baeldung.com/java-chronicle-map) -- [Guide to MapDB](https://www.baeldung.com/mapdb) - [A Guide to Apache Mesos](https://www.baeldung.com/apache-mesos) +- [Guide to MapDB](https://www.baeldung.com/mapdb) - More articles [[<-- prev]](/libraries) [[next -->]](/libraries-3) diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml index 9eff129a63..e472628c2b 100644 --- a/libraries-2/pom.xml +++ b/libraries-2/pom.xml @@ -13,11 +13,6 @@ - - org.mapdb - mapdb - ${mapdb.version} - io.github.classgraph classgraph @@ -41,17 +36,6 @@ spring-boot-starter ${spring-boot-starter.version} - - net.openhft - chronicle-map - ${chronicle.map.version} - - - com.sun.java - tools - - - edu.uci.ics crawler4j @@ -93,6 +77,11 @@ je 18.3.12 + + org.mapdb + mapdb + ${mapdb.version} + @@ -100,10 +89,6 @@ org.apache.maven.plugins maven-surefire-plugin - ${maven-surefire-plugin.version} - - --add-exports=java.base/jdk.internal.ref=ALL-UNNAMED --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED --add-opens=jdk.compiler/com.sun.tools.javac=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED - @@ -112,7 +97,6 @@ 3.0.8 4.8.153 7.20.0.Final - 3.24ea1 4.4.0 2.7.8 1.11.0 diff --git a/libraries-2/src/test/java/com/baeldung/mapdb/CollectionsUnitTest.java b/libraries-2/src/test/java/com/baeldung/mapdb/CollectionsUnitTest.java index 6f5141b054..a286ed7ea8 100644 --- a/libraries-2/src/test/java/com/baeldung/mapdb/CollectionsUnitTest.java +++ b/libraries-2/src/test/java/com/baeldung/mapdb/CollectionsUnitTest.java @@ -1,14 +1,14 @@ package com.baeldung.mapdb; +import static junit.framework.Assert.assertEquals; + +import java.util.NavigableSet; + import org.junit.Test; import org.mapdb.DB; import org.mapdb.DBMaker; import org.mapdb.Serializer; -import java.util.NavigableSet; - -import static junit.framework.Assert.assertEquals; - public class CollectionsUnitTest { @Test diff --git a/libraries-2/src/test/java/com/baeldung/mapdb/HTreeMapUnitTest.java b/libraries-2/src/test/java/com/baeldung/mapdb/HTreeMapUnitTest.java index 3b7cac04fb..80d5375445 100644 --- a/libraries-2/src/test/java/com/baeldung/mapdb/HTreeMapUnitTest.java +++ b/libraries-2/src/test/java/com/baeldung/mapdb/HTreeMapUnitTest.java @@ -1,12 +1,12 @@ package com.baeldung.mapdb; -import org.jetbrains.annotations.NotNull; -import org.junit.Test; -import org.mapdb.*; +import static org.junit.jupiter.api.Assertions.assertEquals; -import java.io.IOException; - -import static junit.framework.Assert.assertEquals; +import org.junit.jupiter.api.Test; +import org.mapdb.DB; +import org.mapdb.DBMaker; +import org.mapdb.HTreeMap; +import org.mapdb.Serializer; public class HTreeMapUnitTest { diff --git a/libraries-2/src/test/java/com/baeldung/mapdb/HelloBaeldungUnitTest.java b/libraries-2/src/test/java/com/baeldung/mapdb/HelloBaeldungUnitTest.java index 952efd0639..89c40fe625 100644 --- a/libraries-2/src/test/java/com/baeldung/mapdb/HelloBaeldungUnitTest.java +++ b/libraries-2/src/test/java/com/baeldung/mapdb/HelloBaeldungUnitTest.java @@ -1,25 +1,25 @@ package com.baeldung.mapdb; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; import org.mapdb.DB; import org.mapdb.DBMaker; import org.mapdb.HTreeMap; -import java.util.concurrent.ConcurrentMap; - -import static junit.framework.Assert.assertEquals; - public class HelloBaeldungUnitTest { @Test public void givenInMemoryDBInstantiateCorrectly_whenDataSavedAndRetrieved_checkRetrievalCorrect() { - DB db = DBMaker.memoryDB().make(); + DB db = DBMaker.memoryDB() + .make(); String welcomeMessageKey = "Welcome Message"; String welcomeMessageString = "Hello Baeldung!"; - HTreeMap myMap = db.hashMap("myMap").createOrOpen(); + HTreeMap myMap = db.hashMap("myMap") + .createOrOpen(); myMap.put(welcomeMessageKey, welcomeMessageString); String welcomeMessageFromDB = (String) myMap.get(welcomeMessageKey); @@ -32,12 +32,14 @@ public class HelloBaeldungUnitTest { @Test public void givenInFileDBInstantiateCorrectly_whenDataSavedAndRetrieved_checkRetrievalCorrect() { - DB db = DBMaker.fileDB("file.db").make(); + DB db = DBMaker.fileDB("file.db") + .make(); String welcomeMessageKey = "Welcome Message"; String welcomeMessageString = "Hello Baeldung!"; - HTreeMap myMap = db.hashMap("myMap").createOrOpen(); + HTreeMap myMap = db.hashMap("myMap") + .createOrOpen(); myMap.put(welcomeMessageKey, welcomeMessageString); String welcomeMessageFromDB = (String) myMap.get(welcomeMessageKey); diff --git a/libraries-2/src/test/java/com/baeldung/mapdb/InMemoryModesUnitTest.java b/libraries-2/src/test/java/com/baeldung/mapdb/InMemoryModesUnitTest.java index 9c53f9c792..c761f877ab 100644 --- a/libraries-2/src/test/java/com/baeldung/mapdb/InMemoryModesUnitTest.java +++ b/libraries-2/src/test/java/com/baeldung/mapdb/InMemoryModesUnitTest.java @@ -1,13 +1,13 @@ package com.baeldung.mapdb; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; import org.mapdb.DB; import org.mapdb.DBMaker; import org.mapdb.HTreeMap; import org.mapdb.Serializer; -import static junit.framework.Assert.assertEquals; - public class InMemoryModesUnitTest { @Test diff --git a/libraries-2/src/test/java/com/baeldung/mapdb/SortedTableMapUnitTest.java b/libraries-2/src/test/java/com/baeldung/mapdb/SortedTableMapUnitTest.java index 83ba917393..6b6b3942d2 100644 --- a/libraries-2/src/test/java/com/baeldung/mapdb/SortedTableMapUnitTest.java +++ b/libraries-2/src/test/java/com/baeldung/mapdb/SortedTableMapUnitTest.java @@ -1,13 +1,13 @@ package com.baeldung.mapdb; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; import org.mapdb.Serializer; import org.mapdb.SortedTableMap; import org.mapdb.volume.MappedFileVol; import org.mapdb.volume.Volume; -import static junit.framework.Assert.assertEquals; - public class SortedTableMapUnitTest { private static final String VOLUME_LOCATION = "sortedTableMapVol.db"; diff --git a/libraries-2/src/test/java/com/baeldung/mapdb/TransactionsUnitTest.java b/libraries-2/src/test/java/com/baeldung/mapdb/TransactionsUnitTest.java index 4de9db10e8..5a053b4422 100644 --- a/libraries-2/src/test/java/com/baeldung/mapdb/TransactionsUnitTest.java +++ b/libraries-2/src/test/java/com/baeldung/mapdb/TransactionsUnitTest.java @@ -1,13 +1,13 @@ package com.baeldung.mapdb; -import org.junit.Test; -import org.mapdb.DB; -import org.mapdb.DBMaker; -import org.mapdb.Serializer; +import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.NavigableSet; -import static junit.framework.Assert.assertEquals; +import org.junit.jupiter.api.Test; +import org.mapdb.DB; +import org.mapdb.DBMaker; +import org.mapdb.Serializer; public class TransactionsUnitTest { diff --git a/libraries-3/README.md b/libraries-3/README.md index faef721a22..3416805ad1 100644 --- a/libraries-3/README.md +++ b/libraries-3/README.md @@ -8,10 +8,7 @@ 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: -- [Guide to the Cactoos Library](https://www.baeldung.com/java-cactoos) -- [Introduction to cache2k](https://www.baeldung.com/java-cache2k) - [Introduction to the jcabi-aspects AOP Annotations Library](https://www.baeldung.com/java-jcabi-aspects) -- [Introduction to Takes](https://www.baeldung.com/java-takes) - [Using NullAway to Avoid NullPointerExceptions](https://www.baeldung.com/java-nullaway) - [Introduction to Alibaba Arthas](https://www.baeldung.com/java-alibaba-arthas-intro) - [Intro to Structurizr](https://www.baeldung.com/structurizr) diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml index bff0a654c6..ae8ebb43f3 100644 --- a/libraries-3/pom.xml +++ b/libraries-3/pom.xml @@ -18,17 +18,6 @@ lombok ${lombok.version} - - org.cactoos - cactoos - ${cactoos.version} - - - org.cache2k - cache2k-base-bom - ${cache2k.version} - pom - com.jcabi jcabi-aspects @@ -40,21 +29,6 @@ ${aspectjrt.version} runtime - - org.takes - takes - ${takes.version} - - - org.apache.httpcomponents - httpcore - ${httpcore.version} - - - org.apache.httpcomponents - httpclient - ${httpclient.version} - org.apache.velocity velocity-engine-core @@ -159,57 +133,13 @@ - - - reload - - - - src/main/resources - true - - - src/main/webapp - true - - - - - org.codehaus.mojo - exec-maven-plugin - - - start-server - pre-integration-test - - java - - - - - com.baeldung.takes.TakesApp - false - - --port=${port} - - - - - - - - 0.43 - 1.2.3.Final 0.22.6 1.9.20.1 0.14.1 1.9.20.1 1.9.20.1 - 1.19 - 4.4.13 - 4.5.12 2.2 0.3.0 2.8 diff --git a/libraries-4/README.md b/libraries-4/README.md index 102f17acdb..03ea3d7a77 100644 --- a/libraries-4/README.md +++ b/libraries-4/README.md @@ -8,11 +8,7 @@ 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) - [Introduction to NoException](https://www.baeldung.com/no-exception) -- [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) diff --git a/libraries-4/pom.xml b/libraries-4/pom.xml index 6b818be9c2..165f017d89 100644 --- a/libraries-4/pom.xml +++ b/libraries-4/pom.xml @@ -17,11 +17,6 @@ jdeferred-core ${jdeferred.version} - - org.eclipse.collections - eclipse-collections - ${eclipse-collections.version} - org.olap4j olap4j @@ -37,11 +32,6 @@ noexception ${noexception.version} - - rome - rome - ${rome.version} - org.springframework spring-web @@ -57,11 +47,6 @@ servlet-api ${javax.servlet.version} - - org.pcollections - pcollections - ${pcollections.version} - org.awaitility awaitility @@ -113,11 +98,6 @@ commons-lang3 ${commons-lang3.version} - - commons-io - commons-io - ${commons-io.version} - @@ -126,11 +106,9 @@ 1.2.6 1.1.0 1.3.1 - 1.0 4.3.8.RELEASE 2.5 3.2.0-m7 - 2.1.2 3.0.0 0.6.5 3.0.0 @@ -138,7 +116,6 @@ 1.2.0 19 10.3.0 - 8.2.0 0.9.0 diff --git a/libraries-5/README.md b/libraries-5/README.md index 50fb70bd05..6b61a7a43c 100644 --- a/libraries-5/README.md +++ b/libraries-5/README.md @@ -8,12 +8,8 @@ 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) - [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) - [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 index 85f8896890..a15679502d 100644 --- a/libraries-5/pom.xml +++ b/libraries-5/pom.xml @@ -6,49 +6,17 @@ libraries-5 + parent-modules com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../parent-boot-2 + 1.0.0-SNAPSHOT - - org.springframework - spring-web - org.jooq jool ${jool.version} - - au.com.dius - pact-jvm-provider-junit5_2.12 - ${pact.version} - - - au.com.dius - pact-jvm-consumer-junit5_2.12 - ${pact.version} - test - - - org.springframework.boot - spring-boot-starter-web - - - - com.typesafe.akka - akka-actor_${scala.version} - ${typesafe-akka.version} - - - com.typesafe.akka - akka-testkit_${scala.version} - ${typesafe-akka.version} - test - com.github.docker-java @@ -69,18 +37,6 @@ - - - com.github.ben-manes.caffeine - caffeine - ${caffeine.version} - - - com.google.code.findbugs - jsr305 - ${findbugs.version} - test - io.atlassian.fugue @@ -92,44 +48,14 @@ jnats ${jnats.version} - - org.jctools - jctools-core - ${jctools.version} - - - org.openjdk.jmh - jmh-core - ${jmh-core.version} - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - target/mypacts - - - - - - - 3.6.3 0.9.12 - 4.3.8.RELEASE 2.12 - 2.5.11 3.0.14 - 3.1.8 - 3.0.2 4.5.1 1.0 - 2.1.2 \ No newline at end of file diff --git a/libraries-6/README.md b/libraries-6/README.md index 5f8a608010..4be655f850 100644 --- a/libraries-6/README.md +++ b/libraries-6/README.md @@ -10,11 +10,9 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m ### 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) - [Guide to Simple Binary Encoding](https://www.baeldung.com/java-sbe) - [Java-R Integration](https://www.baeldung.com/java-r-integration) - [Using libphonenumber to Validate Phone Numbers](https://www.baeldung.com/java-libphonenumber) - [Apache Commons Collections vs Google Guava](https://www.baeldung.com/apache-commons-collections-vs-guava) -- [Guide to Using ModelMapper](https://www.baeldung.com/java-modelmapper) - More articles [[<-- prev]](/libraries-5) [[next -->]](/libraries-7) diff --git a/libraries-6/pom.xml b/libraries-6/pom.xml index 372c5b1cc7..e9b90fa597 100644 --- a/libraries-6/pom.xml +++ b/libraries-6/pom.xml @@ -42,12 +42,6 @@ javapoet ${javapoet.version} - - org.mockftpserver - MockFtpServer - ${mockftpserver.version} - test - org.apache.commons commons-lang3 @@ -63,11 +57,6 @@ guava ${guava.version} - - commons-net - commons-net - ${commons-net.version} - commons-io commons-io @@ -95,11 +84,6 @@ libphonenumber ${libphonenumber.version} - - org.modelmapper - modelmapper - ${org.modelmapper.version} - org.agrona agrona @@ -190,15 +174,12 @@ 1.10.0 - 2.7.1 4.8.1 2.1.0 - 3.6 3.5-beta72 3.0 1.8.1 8.12.9 - 3.2.0 1.17.1 1.6.0 1.27.0 diff --git a/libraries-ai/README.md b/libraries-ai/README.md index 01ec9b1d68..8c211ea1a2 100644 --- a/libraries-ai/README.md +++ b/libraries-ai/README.md @@ -1,2 +1,3 @@ ## Relevant Articles - [Overview of NLP Libraries in Java](https://www.baeldung.com/java-nlp-libraries) +- [Introduction to Neuroph](https://www.baeldung.com/neuroph) diff --git a/libraries-ai/pom.xml b/libraries-ai/pom.xml index 48b26e5a31..aa2ef19b45 100644 --- a/libraries-ai/pom.xml +++ b/libraries-ai/pom.xml @@ -23,11 +23,17 @@ opennlp-tools ${opennlp-tools.version} + + org.beykery + neuroph + ${neuroph.version} + 4.5.3 2.1.1 + 2.92 \ No newline at end of file diff --git a/libraries/src/main/java/com/baeldung/neuroph/NeurophXOR.java b/libraries-ai/src/main/java/neuroph/NeurophXOR.java similarity index 98% rename from libraries/src/main/java/com/baeldung/neuroph/NeurophXOR.java rename to libraries-ai/src/main/java/neuroph/NeurophXOR.java index 4cb11c3c05..63ce1c6e16 100644 --- a/libraries/src/main/java/com/baeldung/neuroph/NeurophXOR.java +++ b/libraries-ai/src/main/java/neuroph/NeurophXOR.java @@ -1,4 +1,4 @@ -package com.baeldung.neuroph; +package neuroph; import org.neuroph.core.Layer; import org.neuroph.core.NeuralNetwork; diff --git a/libraries/src/test/java/com/baeldung/neuroph/XORIntegrationTest.java b/libraries-ai/src/test/java/com/baeldung/neuroph/XORIntegrationTest.java similarity index 94% rename from libraries/src/test/java/com/baeldung/neuroph/XORIntegrationTest.java rename to libraries-ai/src/test/java/com/baeldung/neuroph/XORIntegrationTest.java index ea5c09a4d8..6e6bad8142 100644 --- a/libraries/src/test/java/com/baeldung/neuroph/XORIntegrationTest.java +++ b/libraries-ai/src/test/java/com/baeldung/neuroph/XORIntegrationTest.java @@ -1,11 +1,13 @@ package com.baeldung.neuroph; +import static org.junit.jupiter.api.Assertions.assertEquals; + import org.junit.After; import org.junit.Before; import org.junit.Test; import org.neuroph.core.NeuralNetwork; -import static org.junit.Assert.*; +import neuroph.NeurophXOR; public class XORIntegrationTest { private NeuralNetwork ann = null; diff --git a/libraries-apache-commons-2/README.md b/libraries-apache-commons-2/README.md index 180c84b31c..70a872dea4 100644 --- a/libraries-apache-commons-2/README.md +++ b/libraries-apache-commons-2/README.md @@ -5,4 +5,5 @@ This module contains articles about Apache Commons libraries. ### Relevant articles - [Extracting a Tar File in Java](https://www.baeldung.com/java-extract-tar-file) - [Convert a String with Unicode Encoding to a String of Letters](https://www.baeldung.com/java-convert-string-unicode-encoding) +- - More articles: [[<--prev]](../libraries-apache-commons) diff --git a/libraries-apache-commons-2/pom.xml b/libraries-apache-commons-2/pom.xml index ee9b51e6cc..c555b83273 100644 --- a/libraries-apache-commons-2/pom.xml +++ b/libraries-apache-commons-2/pom.xml @@ -33,6 +33,17 @@ commons-text ${apache-commons-text.version} + + commons-net + commons-net + ${commons-net.version} + + + org.mockftpserver + MockFtpServer + ${mockftpserver.version} + test + @@ -40,6 +51,8 @@ 1.10.13 2.9.0 1.10.0 + 3.6 + 2.7.1 \ No newline at end of file diff --git a/libraries-6/src/main/java/com/baeldung/ftp/FtpClient.java b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/ftp/FtpClient.java similarity index 90% rename from libraries-6/src/main/java/com/baeldung/ftp/FtpClient.java rename to libraries-apache-commons-2/src/main/java/com/baeldung/commons/ftp/FtpClient.java index f885ff13b3..412f0726a7 100644 --- a/libraries-6/src/main/java/com/baeldung/ftp/FtpClient.java +++ b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/ftp/FtpClient.java @@ -1,15 +1,19 @@ -package com.baeldung.ftp; +package com.baeldung.commons.ftp; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Collection; +import java.util.stream.Collectors; import org.apache.commons.net.PrintCommandListener; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; -import java.io.*; -import java.util.Arrays; -import java.util.Collection; -import java.util.stream.Collectors; - class FtpClient { private final String server; diff --git a/libraries-6/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/ftp/FtpClientIntegrationTest.java similarity index 98% rename from libraries-6/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java rename to libraries-apache-commons-2/src/test/java/com/baeldung/commons/ftp/FtpClientIntegrationTest.java index 43da69f96d..4bbebc0ea1 100644 --- a/libraries-6/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java +++ b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/ftp/FtpClientIntegrationTest.java @@ -1,4 +1,11 @@ -package com.baeldung.ftp; +package com.baeldung.commons.ftp; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.util.Collection; import org.junit.After; import org.junit.Before; @@ -10,13 +17,6 @@ import org.mockftpserver.fake.filesystem.FileEntry; import org.mockftpserver.fake.filesystem.FileSystem; import org.mockftpserver.fake.filesystem.UnixFakeFileSystem; -import java.io.File; -import java.io.IOException; -import java.net.URISyntaxException; -import java.util.Collection; - -import static org.assertj.core.api.Assertions.assertThat; - public class FtpClientIntegrationTest { private FakeFtpServer fakeFtpServer; diff --git a/libraries-6/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/ftp/JdkFtpClientIntegrationTest.java similarity index 93% rename from libraries-6/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java rename to libraries-apache-commons-2/src/test/java/com/baeldung/commons/ftp/JdkFtpClientIntegrationTest.java index ef6809b02d..905bc4906a 100644 --- a/libraries-6/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java +++ b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/ftp/JdkFtpClientIntegrationTest.java @@ -1,4 +1,13 @@ -package com.baeldung.ftp; +package com.baeldung.commons.ftp; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.nio.file.Files; import org.junit.After; import org.junit.Before; @@ -10,18 +19,6 @@ import org.mockftpserver.fake.filesystem.FileEntry; import org.mockftpserver.fake.filesystem.FileSystem; import org.mockftpserver.fake.filesystem.UnixFakeFileSystem; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLConnection; -import java.nio.file.Files; -import java.util.Collection; - -import static org.assertj.core.api.Assertions.assertThat; - public class JdkFtpClientIntegrationTest { private FakeFtpServer fakeFtpServer; diff --git a/libraries-6/src/test/resources/ftp/baz.txt b/libraries-apache-commons-2/src/test/resources/ftp/baz.txt similarity index 100% rename from libraries-6/src/test/resources/ftp/baz.txt rename to libraries-apache-commons-2/src/test/resources/ftp/baz.txt diff --git a/libraries-concurrency/README.md b/libraries-concurrency/README.md index d1ffe81fa8..8808335a5b 100644 --- a/libraries-concurrency/README.md +++ b/libraries-concurrency/README.md @@ -1,3 +1,4 @@ ### Relevant Articles: - [Intro to Coroutines with Quasar](https://www.baeldung.com/java-quasar-coroutines) +- [Java Concurrency Utility with JCTools](https://www.baeldung.com/java-concurrency-jc-tools) diff --git a/libraries-concurrency/pom.xml b/libraries-concurrency/pom.xml index 8b0ccdd5ec..31bce1a982 100644 --- a/libraries-concurrency/pom.xml +++ b/libraries-concurrency/pom.xml @@ -28,6 +28,16 @@ quasar-reactive-streams ${quasar.version} + + org.jctools + jctools-core + ${jctools.version} + + + org.openjdk.jmh + jmh-core + ${jmh-core.version} + @@ -77,6 +87,7 @@ 0.8.0 + 2.1.2 \ No newline at end of file diff --git a/libraries-5/src/main/java/com/baeldung/jctools/MpmcBenchmark.java b/libraries-concurrency/src/main/java/com/baeldung/jctools/MpmcBenchmark.java similarity index 77% rename from libraries-5/src/main/java/com/baeldung/jctools/MpmcBenchmark.java rename to libraries-concurrency/src/main/java/com/baeldung/jctools/MpmcBenchmark.java index 7b754bf709..d448bb74b6 100644 --- a/libraries-5/src/main/java/com/baeldung/jctools/MpmcBenchmark.java +++ b/libraries-concurrency/src/main/java/com/baeldung/jctools/MpmcBenchmark.java @@ -1,14 +1,27 @@ package com.baeldung.jctools; -import org.jctools.queues.MpmcArrayQueue; -import org.jctools.queues.atomic.MpmcAtomicArrayQueue; -import org.openjdk.jmh.annotations.*; -import org.openjdk.jmh.infra.Control; - import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.TimeUnit; +import org.jctools.queues.MpmcArrayQueue; +import org.jctools.queues.atomic.MpmcAtomicArrayQueue; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Group; +import org.openjdk.jmh.annotations.GroupThreads; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Control; + @BenchmarkMode(Mode.SampleTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) @Fork(1) diff --git a/libraries-5/src/main/java/com/baeldung/jctools/README.md b/libraries-concurrency/src/main/java/com/baeldung/jctools/README.md similarity index 100% rename from libraries-5/src/main/java/com/baeldung/jctools/README.md rename to libraries-concurrency/src/main/java/com/baeldung/jctools/README.md diff --git a/libraries-5/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java b/libraries-concurrency/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java similarity index 98% rename from libraries-5/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java rename to libraries-concurrency/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java index a5dacdbdac..28f42650e9 100644 --- a/libraries-5/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java +++ b/libraries-concurrency/src/test/java/com/baeldung/jctools/JCToolsUnitTest.java @@ -1,20 +1,19 @@ package com.baeldung.jctools; -import org.assertj.core.api.Assertions; -import org.jctools.queues.SpscArrayQueue; -import org.jctools.queues.SpscChunkedArrayQueue; -import org.junit.Test; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; import java.util.HashSet; import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicReference; -import java.util.function.IntConsumer; import java.util.stream.Collectors; import java.util.stream.IntStream; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; +import org.assertj.core.api.Assertions; +import org.jctools.queues.SpscArrayQueue; +import org.jctools.queues.SpscChunkedArrayQueue; +import org.junit.Test; public class JCToolsUnitTest { diff --git a/libraries-data-3/README.md b/libraries-data-3/README.md new file mode 100644 index 0000000000..e6f02bf2aa --- /dev/null +++ b/libraries-data-3/README.md @@ -0,0 +1,15 @@ +## Data Libraries + +This module contains articles about libraries for data processing in Java. + +### Relevant articles +- [Introduction to Javatuples](https://www.baeldung.com/java-tuples) +- [Software Transactional Memory in Java Using Multiverse](https://www.baeldung.com/java-multiverse-stm) +- [Key Value Store with Chronicle Map](https://www.baeldung.com/java-chronicle-map) +- [Guide to the Cactoos Library](https://www.baeldung.com/java-cactoos) +- [Introduction to cache2k](https://www.baeldung.com/java-cache2k) +- [Introduction to PCollections](https://www.baeldung.com/java-pcollections) +- [Introduction to Eclipse Collections](https://www.baeldung.com/eclipse-collections) +- [Introduction to Caffeine](https://www.baeldung.com/java-caching-caffeine) +- [Guide to Using ModelMapper](https://www.baeldung.com/java-modelmapper) +- More articles: [[<-- prev]](/../libraries-data-2) diff --git a/libraries-data-3/pom.xml b/libraries-data-3/pom.xml new file mode 100644 index 0000000000..536939d435 --- /dev/null +++ b/libraries-data-3/pom.xml @@ -0,0 +1,101 @@ + + + 4.0.0 + libraries-data-3 + libraries-data-3 + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.javatuples + javatuples + ${javatuples.version} + + + org.multiverse + multiverse-core + ${multiverse.version} + + + net.openhft + chronicle-map + ${chronicle.map.version} + + + com.sun.java + tools + + + + + org.cactoos + cactoos + ${cactoos.version} + + + org.cache2k + cache2k-base-bom + ${cache2k.version} + pom + + + org.pcollections + pcollections + ${pcollections.version} + + + org.eclipse.collections + eclipse-collections + ${eclipse-collections.version} + + + com.github.ben-manes.caffeine + caffeine + ${caffeine.version} + + + com.google.code.findbugs + jsr305 + ${findbugs.version} + test + + + org.modelmapper + modelmapper + ${org.modelmapper.version} + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + --add-exports=java.base/jdk.internal.ref=ALL-UNNAMED --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED --add-opens=jdk.compiler/com.sun.tools.javac=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED + + + + + + + 1.2 + 0.7.0 + 3.24ea1 + 0.43 + 1.2.3.Final + 2.1.2 + 8.2.0 + 3.1.8 + 3.0.2 + 3.2.0 + + + diff --git a/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelper.java b/libraries-data-3/src/main/java/com/baeldung/cache2k/ProductHelper.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/cache2k/ProductHelper.java rename to libraries-data-3/src/main/java/com/baeldung/cache2k/ProductHelper.java diff --git a/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperUsingLoader.java b/libraries-data-3/src/main/java/com/baeldung/cache2k/ProductHelperUsingLoader.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperUsingLoader.java rename to libraries-data-3/src/main/java/com/baeldung/cache2k/ProductHelperUsingLoader.java diff --git a/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperWithEventListener.java b/libraries-data-3/src/main/java/com/baeldung/cache2k/ProductHelperWithEventListener.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperWithEventListener.java rename to libraries-data-3/src/main/java/com/baeldung/cache2k/ProductHelperWithEventListener.java diff --git a/libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperWithExpiry.java b/libraries-data-3/src/main/java/com/baeldung/cache2k/ProductHelperWithExpiry.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/cache2k/ProductHelperWithExpiry.java rename to libraries-data-3/src/main/java/com/baeldung/cache2k/ProductHelperWithExpiry.java diff --git a/libraries-3/src/main/java/com/baeldung/cactoos/CactoosCollectionUtils.java b/libraries-data-3/src/main/java/com/baeldung/cactoos/CactoosCollectionUtils.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/cactoos/CactoosCollectionUtils.java rename to libraries-data-3/src/main/java/com/baeldung/cactoos/CactoosCollectionUtils.java diff --git a/libraries-3/src/main/java/com/baeldung/cactoos/CactoosStringUtils.java b/libraries-data-3/src/main/java/com/baeldung/cactoos/CactoosStringUtils.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/cactoos/CactoosStringUtils.java rename to libraries-data-3/src/main/java/com/baeldung/cactoos/CactoosStringUtils.java diff --git a/libraries-5/src/main/java/com/baeldung/caffeine/DataObject.java b/libraries-data-3/src/main/java/com/baeldung/caffeine/DataObject.java similarity index 100% rename from libraries-5/src/main/java/com/baeldung/caffeine/DataObject.java rename to libraries-data-3/src/main/java/com/baeldung/caffeine/DataObject.java diff --git a/libraries-4/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java b/libraries-data-3/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java similarity index 100% rename from libraries-4/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java rename to libraries-data-3/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java diff --git a/libraries-4/src/main/java/com/baeldung/eclipsecollections/Student.java b/libraries-data-3/src/main/java/com/baeldung/eclipsecollections/Student.java similarity index 100% rename from libraries-4/src/main/java/com/baeldung/eclipsecollections/Student.java rename to libraries-data-3/src/main/java/com/baeldung/eclipsecollections/Student.java diff --git a/libraries-6/src/main/java/com/baeldung/modelmapper/domain/Game.java b/libraries-data-3/src/main/java/com/baeldung/modelmapper/domain/Game.java similarity index 100% rename from libraries-6/src/main/java/com/baeldung/modelmapper/domain/Game.java rename to libraries-data-3/src/main/java/com/baeldung/modelmapper/domain/Game.java diff --git a/libraries-6/src/main/java/com/baeldung/modelmapper/domain/GameMode.java b/libraries-data-3/src/main/java/com/baeldung/modelmapper/domain/GameMode.java similarity index 100% rename from libraries-6/src/main/java/com/baeldung/modelmapper/domain/GameMode.java rename to libraries-data-3/src/main/java/com/baeldung/modelmapper/domain/GameMode.java diff --git a/libraries-6/src/main/java/com/baeldung/modelmapper/domain/GameSettings.java b/libraries-data-3/src/main/java/com/baeldung/modelmapper/domain/GameSettings.java similarity index 100% rename from libraries-6/src/main/java/com/baeldung/modelmapper/domain/GameSettings.java rename to libraries-data-3/src/main/java/com/baeldung/modelmapper/domain/GameSettings.java diff --git a/libraries-6/src/main/java/com/baeldung/modelmapper/domain/Player.java b/libraries-data-3/src/main/java/com/baeldung/modelmapper/domain/Player.java similarity index 100% rename from libraries-6/src/main/java/com/baeldung/modelmapper/domain/Player.java rename to libraries-data-3/src/main/java/com/baeldung/modelmapper/domain/Player.java diff --git a/libraries-6/src/main/java/com/baeldung/modelmapper/dto/GameDTO.java b/libraries-data-3/src/main/java/com/baeldung/modelmapper/dto/GameDTO.java similarity index 99% rename from libraries-6/src/main/java/com/baeldung/modelmapper/dto/GameDTO.java rename to libraries-data-3/src/main/java/com/baeldung/modelmapper/dto/GameDTO.java index 1c8111809c..07e3ba4903 100644 --- a/libraries-6/src/main/java/com/baeldung/modelmapper/dto/GameDTO.java +++ b/libraries-data-3/src/main/java/com/baeldung/modelmapper/dto/GameDTO.java @@ -1,8 +1,9 @@ package com.baeldung.modelmapper.dto; -import com.baeldung.modelmapper.domain.GameMode; import java.util.List; +import com.baeldung.modelmapper.domain.GameMode; + public class GameDTO { private Long id; diff --git a/libraries-6/src/main/java/com/baeldung/modelmapper/dto/PlayerDTO.java b/libraries-data-3/src/main/java/com/baeldung/modelmapper/dto/PlayerDTO.java similarity index 100% rename from libraries-6/src/main/java/com/baeldung/modelmapper/dto/PlayerDTO.java rename to libraries-data-3/src/main/java/com/baeldung/modelmapper/dto/PlayerDTO.java diff --git a/libraries-6/src/main/java/com/baeldung/modelmapper/repository/GameRepository.java b/libraries-data-3/src/main/java/com/baeldung/modelmapper/repository/GameRepository.java similarity index 99% rename from libraries-6/src/main/java/com/baeldung/modelmapper/repository/GameRepository.java rename to libraries-data-3/src/main/java/com/baeldung/modelmapper/repository/GameRepository.java index 80b861c981..2b33e8fba6 100644 --- a/libraries-6/src/main/java/com/baeldung/modelmapper/repository/GameRepository.java +++ b/libraries-data-3/src/main/java/com/baeldung/modelmapper/repository/GameRepository.java @@ -1,9 +1,10 @@ package com.baeldung.modelmapper.repository; -import com.baeldung.modelmapper.domain.Game; import java.util.ArrayList; import java.util.List; +import com.baeldung.modelmapper.domain.Game; + /** * Sample in-memory Game Repository */ diff --git a/libraries/src/main/java/com/baeldung/stm/Account.java b/libraries-data-3/src/main/java/com/baeldung/stm/Account.java similarity index 100% rename from libraries/src/main/java/com/baeldung/stm/Account.java rename to libraries-data-3/src/main/java/com/baeldung/stm/Account.java diff --git a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/cache2k/ProductHelperUnitTest.java similarity index 100% rename from libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/cache2k/ProductHelperUnitTest.java diff --git a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUsingLoaderUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/cache2k/ProductHelperUsingLoaderUnitTest.java similarity index 100% rename from libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUsingLoaderUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/cache2k/ProductHelperUsingLoaderUnitTest.java diff --git a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithEventListenerUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/cache2k/ProductHelperWithEventListenerUnitTest.java similarity index 100% rename from libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithEventListenerUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/cache2k/ProductHelperWithEventListenerUnitTest.java diff --git a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithExpiryUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/cache2k/ProductHelperWithExpiryUnitTest.java similarity index 100% rename from libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithExpiryUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/cache2k/ProductHelperWithExpiryUnitTest.java diff --git a/libraries-3/src/test/java/com/baeldung/cactoos/CactoosCollectionUtilsUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/cactoos/CactoosCollectionUtilsUnitTest.java similarity index 100% rename from libraries-3/src/test/java/com/baeldung/cactoos/CactoosCollectionUtilsUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/cactoos/CactoosCollectionUtilsUnitTest.java index c6bcbd7df7..a57c5def6e 100644 --- a/libraries-3/src/test/java/com/baeldung/cactoos/CactoosCollectionUtilsUnitTest.java +++ b/libraries-data-3/src/test/java/com/baeldung/cactoos/CactoosCollectionUtilsUnitTest.java @@ -3,8 +3,8 @@ package com.baeldung.cactoos; import static org.junit.jupiter.api.Assertions.assertEquals; import java.io.IOException; -import java.util.List; import java.util.ArrayList; +import java.util.List; import org.junit.Test; diff --git a/libraries-3/src/test/java/com/baeldung/cactoos/CactoosStringUtilsUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/cactoos/CactoosStringUtilsUnitTest.java similarity index 100% rename from libraries-3/src/test/java/com/baeldung/cactoos/CactoosStringUtilsUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/cactoos/CactoosStringUtilsUnitTest.java diff --git a/libraries-5/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java similarity index 92% rename from libraries-5/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java index 65c441c50d..db7e12d78c 100644 --- a/libraries-5/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java +++ b/libraries-data-3/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java @@ -1,6 +1,8 @@ package com.baeldung.caffeine; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import java.util.Arrays; import java.util.Map; @@ -11,7 +13,11 @@ import javax.annotation.Nonnull; import org.junit.Assert; import org.junit.Test; -import com.github.benmanes.caffeine.cache.*; +import com.github.benmanes.caffeine.cache.AsyncLoadingCache; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.Expiry; +import com.github.benmanes.caffeine.cache.LoadingCache; public class CaffeineUnitTest { diff --git a/libraries-2/src/test/java/com/baeldung/chroniclemap/ChronicleMapUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/chroniclemap/ChronicleMapUnitTest.java similarity index 97% rename from libraries-2/src/test/java/com/baeldung/chroniclemap/ChronicleMapUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/chroniclemap/ChronicleMapUnitTest.java index 7f36a9abdb..6b3898419a 100644 --- a/libraries-2/src/test/java/com/baeldung/chroniclemap/ChronicleMapUnitTest.java +++ b/libraries-data-3/src/test/java/com/baeldung/chroniclemap/ChronicleMapUnitTest.java @@ -1,132 +1,132 @@ -package com.baeldung.chroniclemap; - -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; - -import java.io.File; -import java.util.HashSet; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; - -import net.openhft.chronicle.core.values.LongValue; -import net.openhft.chronicle.map.ChronicleMap; -import net.openhft.chronicle.map.ExternalMapQueryContext; -import net.openhft.chronicle.map.MapEntry; -import net.openhft.chronicle.values.Values; - -public class ChronicleMapUnitTest { - - static ChronicleMap persistedCountryMap = null; - - static ChronicleMap inMemoryCountryMap = null; - - static ChronicleMap> multiMap = null; - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @BeforeClass - public static void init() { - try { - inMemoryCountryMap = ChronicleMap.of(LongValue.class, CharSequence.class) - .name("country-map") - .entries(50) - .averageValue("America") - .create(); - - persistedCountryMap = ChronicleMap.of(LongValue.class, CharSequence.class) - .name("country-map") - .entries(50) - .averageValue("America") - .createPersistedTo(new File(System.getProperty("user.home") + "/country-details.dat")); - - Set averageValue = IntStream.of(1, 2) - .boxed() - .collect(Collectors.toSet()); - multiMap = ChronicleMap.of(Integer.class, (Class>) (Class) Set.class) - .name("multi-map") - .entries(50) - .averageValue(averageValue) - .create(); - - LongValue qatarKey = Values.newHeapInstance(LongValue.class); - qatarKey.setValue(1); - inMemoryCountryMap.put(qatarKey, "Qatar"); - - LongValue key = Values.newHeapInstance(LongValue.class); - key.setValue(1); - persistedCountryMap.put(key, "Romania"); - key.setValue(2); - persistedCountryMap.put(key, "India"); - - Set set1 = new HashSet<>(); - set1.add(1); - set1.add(2); - multiMap.put(1, set1); - - Set set2 = new HashSet<>(); - set2.add(3); - multiMap.put(2, set2); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Test - public void givenGetQuery_whenCalled_shouldReturnResult() { - LongValue key = Values.newHeapInstance(LongValue.class); - key.setValue(1); - CharSequence country = inMemoryCountryMap.get(key); - assertThat(country.toString(), is(equalTo("Qatar"))); - } - - @Test - public void givenGetUsingQuery_whenCalled_shouldReturnResult() { - LongValue key = Values.newHeapInstance(LongValue.class); - StringBuilder country = new StringBuilder(); - key.setValue(1); - persistedCountryMap.getUsing(key, country); - assertThat(country.toString(), is(equalTo("Romania"))); - key.setValue(2); - persistedCountryMap.getUsing(key, country); - assertThat(country.toString(), is(equalTo("India"))); - } - - @Test - public void givenMultipleKeyQuery_whenProcessed_shouldChangeTheValue() { - try (ExternalMapQueryContext, ?> fistContext = multiMap.queryContext(1)) { - try (ExternalMapQueryContext, ?> secondContext = multiMap.queryContext(2)) { - fistContext.updateLock() - .lock(); - secondContext.updateLock() - .lock(); - MapEntry> firstEntry = fistContext.entry(); - Set firstSet = firstEntry.value() - .get(); - firstSet.remove(2); - MapEntry> secondEntry = secondContext.entry(); - Set secondSet = secondEntry.value() - .get(); - secondSet.add(4); - firstEntry.doReplaceValue(fistContext.wrapValueAsData(firstSet)); - secondEntry.doReplaceValue(secondContext.wrapValueAsData(secondSet)); - } - } finally { - assertThat(multiMap.get(1) - .size(), is(equalTo(1))); - assertThat(multiMap.get(2) - .size(), is(equalTo(2))); - } - } - - @AfterClass - public static void finish() { - persistedCountryMap.close(); - inMemoryCountryMap.close(); - multiMap.close(); - } -} +package com.baeldung.chroniclemap; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +import java.io.File; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import net.openhft.chronicle.core.values.LongValue; +import net.openhft.chronicle.map.ChronicleMap; +import net.openhft.chronicle.map.ExternalMapQueryContext; +import net.openhft.chronicle.map.MapEntry; +import net.openhft.chronicle.values.Values; + +public class ChronicleMapUnitTest { + + static ChronicleMap persistedCountryMap = null; + + static ChronicleMap inMemoryCountryMap = null; + + static ChronicleMap> multiMap = null; + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @BeforeClass + public static void init() { + try { + inMemoryCountryMap = ChronicleMap.of(LongValue.class, CharSequence.class) + .name("country-map") + .entries(50) + .averageValue("America") + .create(); + + persistedCountryMap = ChronicleMap.of(LongValue.class, CharSequence.class) + .name("country-map") + .entries(50) + .averageValue("America") + .createPersistedTo(new File(System.getProperty("user.home") + "/country-details.dat")); + + Set averageValue = IntStream.of(1, 2) + .boxed() + .collect(Collectors.toSet()); + multiMap = ChronicleMap.of(Integer.class, (Class>) (Class) Set.class) + .name("multi-map") + .entries(50) + .averageValue(averageValue) + .create(); + + LongValue qatarKey = Values.newHeapInstance(LongValue.class); + qatarKey.setValue(1); + inMemoryCountryMap.put(qatarKey, "Qatar"); + + LongValue key = Values.newHeapInstance(LongValue.class); + key.setValue(1); + persistedCountryMap.put(key, "Romania"); + key.setValue(2); + persistedCountryMap.put(key, "India"); + + Set set1 = new HashSet<>(); + set1.add(1); + set1.add(2); + multiMap.put(1, set1); + + Set set2 = new HashSet<>(); + set2.add(3); + multiMap.put(2, set2); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Test + public void givenGetQuery_whenCalled_shouldReturnResult() { + LongValue key = Values.newHeapInstance(LongValue.class); + key.setValue(1); + CharSequence country = inMemoryCountryMap.get(key); + assertThat(country.toString(), is(equalTo("Qatar"))); + } + + @Test + public void givenGetUsingQuery_whenCalled_shouldReturnResult() { + LongValue key = Values.newHeapInstance(LongValue.class); + StringBuilder country = new StringBuilder(); + key.setValue(1); + persistedCountryMap.getUsing(key, country); + assertThat(country.toString(), is(equalTo("Romania"))); + key.setValue(2); + persistedCountryMap.getUsing(key, country); + assertThat(country.toString(), is(equalTo("India"))); + } + + @Test + public void givenMultipleKeyQuery_whenProcessed_shouldChangeTheValue() { + try (ExternalMapQueryContext, ?> fistContext = multiMap.queryContext(1)) { + try (ExternalMapQueryContext, ?> secondContext = multiMap.queryContext(2)) { + fistContext.updateLock() + .lock(); + secondContext.updateLock() + .lock(); + MapEntry> firstEntry = fistContext.entry(); + Set firstSet = firstEntry.value() + .get(); + firstSet.remove(2); + MapEntry> secondEntry = secondContext.entry(); + Set secondSet = secondEntry.value() + .get(); + secondSet.add(4); + firstEntry.doReplaceValue(fistContext.wrapValueAsData(firstSet)); + secondEntry.doReplaceValue(secondContext.wrapValueAsData(secondSet)); + } + } finally { + assertThat(multiMap.get(1) + .size(), is(equalTo(1))); + assertThat(multiMap.get(2) + .size(), is(equalTo(2))); + } + } + + @AfterClass + public static void finish() { + persistedCountryMap.close(); + inMemoryCountryMap.close(); + multiMap.close(); + } +} diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternUnitTest.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/AllSatisfyPatternUnitTest.java diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternUnitTest.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/AnySatisfyPatternUnitTest.java diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java similarity index 99% rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java index ff111a6d72..878964a25f 100644 --- a/libraries-4/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java +++ b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/CollectPatternUnitTest.java @@ -1,9 +1,8 @@ package com.baeldung.eclipsecollections; +import org.assertj.core.api.Assertions; import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.list.mutable.FastList; - -import org.assertj.core.api.Assertions; import org.junit.Test; public class CollectPatternUnitTest { diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherUnitTest.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherUnitTest.java diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/DetectPatternUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/DetectPatternUnitTest.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/DetectPatternUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/DetectPatternUnitTest.java diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java similarity index 99% rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java index b0735267ae..3f57576e5d 100644 --- a/libraries-4/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java +++ b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/FlatCollectUnitTest.java @@ -1,12 +1,11 @@ package com.baeldung.eclipsecollections; -import org.assertj.core.api.Assertions; -import org.eclipse.collections.api.list.MutableList; -import org.eclipse.collections.impl.list.mutable.FastList; - import java.util.ArrayList; import java.util.List; +import org.assertj.core.api.Assertions; +import org.eclipse.collections.api.list.MutableList; +import org.eclipse.collections.impl.list.mutable.FastList; import org.junit.Before; import org.junit.Test; diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java similarity index 95% rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java index a1bd280658..3f395324c2 100644 --- a/libraries-4/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java +++ b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ForEachPatternUnitTest.java @@ -1,7 +1,5 @@ package com.baeldung.eclipsecollections; -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; diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternUnitTest.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternUnitTest.java diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/LazyIterationUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/LazyIterationUnitTest.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/LazyIterationUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/LazyIterationUnitTest.java diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/PartitionPatternUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/PartitionPatternUnitTest.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/PartitionPatternUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/PartitionPatternUnitTest.java diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/RejectPatternUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/RejectPatternUnitTest.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/RejectPatternUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/RejectPatternUnitTest.java diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/SelectPatternUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/SelectPatternUnitTest.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/SelectPatternUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/SelectPatternUnitTest.java diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java similarity index 99% rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java index 942cdf4595..31b91c663e 100644 --- a/libraries-4/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java +++ b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ZipUnitTest.java @@ -1,11 +1,10 @@ package com.baeldung.eclipsecollections; +import org.assertj.core.api.Assertions; import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.api.tuple.Pair; import org.eclipse.collections.impl.factory.Lists; import org.eclipse.collections.impl.tuple.Tuples; - -import org.assertj.core.api.Assertions; import org.junit.Before; import org.junit.Test; diff --git a/libraries-4/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexUnitTest.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/javatuples/JavaTuplesUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/javatuples/JavaTuplesUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/javatuples/JavaTuplesUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/javatuples/JavaTuplesUnitTest.java diff --git a/libraries-6/src/test/java/com/baeldung/modelmapper/ModelMapperUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/modelmapper/ModelMapperUnitTest.java similarity index 99% rename from libraries-6/src/test/java/com/baeldung/modelmapper/ModelMapperUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/modelmapper/ModelMapperUnitTest.java index 69bc4059b0..c24e3c1f96 100644 --- a/libraries-6/src/test/java/com/baeldung/modelmapper/ModelMapperUnitTest.java +++ b/libraries-data-3/src/test/java/com/baeldung/modelmapper/ModelMapperUnitTest.java @@ -5,15 +5,9 @@ import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import com.baeldung.modelmapper.domain.Game; -import com.baeldung.modelmapper.domain.GameMode; -import com.baeldung.modelmapper.domain.GameSettings; -import com.baeldung.modelmapper.domain.Player; -import com.baeldung.modelmapper.dto.GameDTO; -import com.baeldung.modelmapper.dto.PlayerDTO; -import com.baeldung.modelmapper.repository.GameRepository; import java.time.Instant; import java.util.Collection; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.modelmapper.Condition; @@ -24,6 +18,14 @@ import org.modelmapper.Provider; import org.modelmapper.TypeMap; import org.modelmapper.convention.MatchingStrategies; +import com.baeldung.modelmapper.domain.Game; +import com.baeldung.modelmapper.domain.GameMode; +import com.baeldung.modelmapper.domain.GameSettings; +import com.baeldung.modelmapper.domain.Player; +import com.baeldung.modelmapper.dto.GameDTO; +import com.baeldung.modelmapper.dto.PlayerDTO; +import com.baeldung.modelmapper.repository.GameRepository; + public class ModelMapperUnitTest { ModelMapper mapper; diff --git a/libraries-4/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java similarity index 96% rename from libraries-4/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java index 1a75624439..48bf232294 100644 --- a/libraries-4/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java +++ b/libraries-data-3/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java @@ -1,6 +1,14 @@ package com.baeldung.pcollections; -import org.junit.Test; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.Test; import org.pcollections.HashPMap; import org.pcollections.HashTreePMap; import org.pcollections.HashTreePSet; @@ -8,14 +16,6 @@ import org.pcollections.MapPSet; import org.pcollections.PVector; import org.pcollections.TreePVector; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - public class PCollectionsUnitTest { @Test diff --git a/libraries/src/test/java/com/baeldung/stm/AccountUnitTest.java b/libraries-data-3/src/test/java/com/baeldung/stm/AccountUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/stm/AccountUnitTest.java rename to libraries-data-3/src/test/java/com/baeldung/stm/AccountUnitTest.java index aa872ab622..c5c78f7af3 100644 --- a/libraries/src/test/java/com/baeldung/stm/AccountUnitTest.java +++ b/libraries-data-3/src/test/java/com/baeldung/stm/AccountUnitTest.java @@ -1,6 +1,7 @@ package com.baeldung.stm; -import org.junit.Test; +import static org.assertj.core.api.Java6Assertions.assertThat; +import static org.junit.Assert.assertTrue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; @@ -8,8 +9,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; -import static org.assertj.core.api.Java6Assertions.assertThat; -import static org.junit.Assert.assertTrue; +import org.junit.Test; public class AccountUnitTest { diff --git a/libraries-data-db/pom.xml b/libraries-data-db/pom.xml index 6ee8daa2a5..7f77d40667 100644 --- a/libraries-data-db/pom.xml +++ b/libraries-data-db/pom.xml @@ -305,6 +305,7 @@ 2.1.3.Final 2.2.3 1.17.6 + 3.0.8 \ No newline at end of file diff --git a/libraries-io/README.md b/libraries-io/README.md index a9ca5df3d6..1f439b954b 100644 --- a/libraries-io/README.md +++ b/libraries-io/README.md @@ -4,3 +4,4 @@ - [Transferring a File Through SFTP in Java](https://www.baeldung.com/java-file-sftp) - [How to Create Password-Protected Zip Files and Unzip Them in Java](https://www.baeldung.com/java-password-protected-zip-unzip) - [How to Create CSV File from POJO with Custom Column Headers and Positions](https://www.baeldung.com/java-create-csv-pojo-customize-columns) +- [Delete a Directory Recursively in Java](https://www.baeldung.com/java-delete-directory) diff --git a/libraries-io/pom.xml b/libraries-io/pom.xml index 7464b9a507..eb8b8a24c6 100644 --- a/libraries-io/pom.xml +++ b/libraries-io/pom.xml @@ -5,18 +5,6 @@ 4.0.0 libraries-io libraries-io - - - - org.apache.maven.plugins - maven-compiler-plugin - - 17 - 17 - - - - com.baeldung @@ -51,8 +39,31 @@ opencsv ${opencsv.version} + + commons-io + commons-io + ${commons-io.version} + + + org.springframework + spring-web + ${spring.version} + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 17 + 17 + + + + + 0.1.55 @@ -60,9 +71,7 @@ 2.4 2.9.0 5.8 - 17 - 17 - UTF-8 + 4.3.8.RELEASE \ No newline at end of file diff --git a/libraries-4/src/test/java/com/baeldung/io/JavaDirectoryDeleteUnitTest.java b/libraries-io/src/test/java/com/baeldung/java/io/JavaDirectoryDeleteUnitTest.java similarity index 99% rename from libraries-4/src/test/java/com/baeldung/io/JavaDirectoryDeleteUnitTest.java rename to libraries-io/src/test/java/com/baeldung/java/io/JavaDirectoryDeleteUnitTest.java index c9c8242cd5..bf6c4d9e40 100644 --- a/libraries-4/src/test/java/com/baeldung/io/JavaDirectoryDeleteUnitTest.java +++ b/libraries-io/src/test/java/com/baeldung/java/io/JavaDirectoryDeleteUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.io; +package com.baeldung.java.io; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; diff --git a/libraries-testing-2/README.md b/libraries-testing-2/README.md new file mode 100644 index 0000000000..e8fc854a13 --- /dev/null +++ b/libraries-testing-2/README.md @@ -0,0 +1,8 @@ +## Testing + +This module contains articles about test libraries. + +### Relevant articles + +- [Consumer Driven Contracts with Pact](https://www.baeldung.com/pact-junit-consumer-driven-contracts) +- - More articles: [[<-- prev]](../libraries-testing) diff --git a/libraries-testing-2/pom.xml b/libraries-testing-2/pom.xml new file mode 100644 index 0000000000..6e75df172f --- /dev/null +++ b/libraries-testing-2/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + libraries-testing-2 + libraries-testing-2 + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + au.com.dius + pact-jvm-provider-junit5_2.12 + ${pact.version} + + + au.com.dius + pact-jvm-consumer-junit5_2.12 + ${pact.version} + test + + + org.springframework + spring-web + + + org.springframework.boot + spring-boot-starter-web + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + target/mypacts + + + + + + + + 3.6.3 + + + \ No newline at end of file diff --git a/libraries-5/src/main/java/com/baeldung/pact/config/MainApplication.java b/libraries-testing-2/src/main/java/com/baeldung/pact/config/MainApplication.java similarity index 100% rename from libraries-5/src/main/java/com/baeldung/pact/config/MainApplication.java rename to libraries-testing-2/src/main/java/com/baeldung/pact/config/MainApplication.java diff --git a/libraries-5/src/main/java/com/baeldung/pact/web/controller/PactController.java b/libraries-testing-2/src/main/java/com/baeldung/pact/web/controller/PactController.java similarity index 100% rename from libraries-5/src/main/java/com/baeldung/pact/web/controller/PactController.java rename to libraries-testing-2/src/main/java/com/baeldung/pact/web/controller/PactController.java diff --git a/libraries-5/src/main/java/com/baeldung/pact/web/dto/PactDto.java b/libraries-testing-2/src/main/java/com/baeldung/pact/web/dto/PactDto.java similarity index 100% rename from libraries-5/src/main/java/com/baeldung/pact/web/dto/PactDto.java rename to libraries-testing-2/src/main/java/com/baeldung/pact/web/dto/PactDto.java diff --git a/libraries-5/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java b/libraries-testing-2/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java similarity index 100% rename from libraries-5/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java rename to libraries-testing-2/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java diff --git a/libraries-5/src/test/java/com/baeldung/pact/PactProviderLiveTest.java b/libraries-testing-2/src/test/java/com/baeldung/pact/PactProviderLiveTest.java similarity index 100% rename from libraries-5/src/test/java/com/baeldung/pact/PactProviderLiveTest.java rename to libraries-testing-2/src/test/java/com/baeldung/pact/PactProviderLiveTest.java diff --git a/libraries-testing/README.md b/libraries-testing/README.md index 2c473e8aa6..d3f6bc7ea0 100644 --- a/libraries-testing/README.md +++ b/libraries-testing/README.md @@ -14,3 +14,4 @@ This module contains articles about test libraries. - [Introduction to DBUnit](https://www.baeldung.com/java-dbunit) - [Introduction to ArchUnit](https://www.baeldung.com/java-archunit-intro) - [Guide to the ModelAssert Library for JSON](https://www.baeldung.com/json-modelassert) +- More articles: [[more -->]](../libraries-testing-2) diff --git a/libraries/README.md b/libraries/README.md index a8aa34973b..7e72292f45 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -8,12 +8,7 @@ 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 Javatuples](https://www.baeldung.com/java-tuples) - [Intro to JaVers](https://www.baeldung.com/javers) - [Introduction to Quartz](https://www.baeldung.com/quartz) -- [How to Warm Up the JVM](https://www.baeldung.com/java-jvm-warmup) -- [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) - More articles [[next -->]](/libraries-2) diff --git a/libraries/pom.xml b/libraries/pom.xml index 756f455f4b..3ff912cae3 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -13,12 +13,6 @@ - - - org.beykery - neuroph - ${neuroph.version} - cglib @@ -35,11 +29,6 @@ commons-net ${commons-net.version} - - org.javatuples - javatuples - ${javatuples.version} - org.javers javers-core @@ -99,11 +88,6 @@ ${spring-mock-mvc.version} test - - org.multiverse - multiverse-core - ${multiverse.version} - pl.pragmatists JUnitParams @@ -115,11 +99,6 @@ quartz ${quartz.version} - - org.openjdk.jmh - jmh-core - ${jmh-core.version} - info.debatty java-lsh @@ -254,11 +233,8 @@ 2.2 - 0.7.0 3.2.7 - 1.2 3.1.0 - 2.92 1.9.26 1.41.0 1.9.0 diff --git a/pom.xml b/pom.xml index 29c7816b87..4d0b9c0bc8 100644 --- a/pom.xml +++ b/pom.xml @@ -781,6 +781,7 @@ libraries-cli libraries-concurrency libraries-data-2 + libraries-data-3 libraries-data-db libraries-data-io libraries-data @@ -797,6 +798,7 @@ libraries-server libraries-stream libraries-testing + libraries-testing-2 libraries-transform libraries lightrun @@ -1032,6 +1034,7 @@ libraries-cli libraries-concurrency libraries-data-2 + libraries-data-3 libraries-data-db libraries-data-io libraries-data @@ -1048,6 +1051,7 @@ libraries-server libraries-stream libraries-testing + libraries-testing-2 libraries-transform libraries lightrun diff --git a/web-modules/java-takes/README.md b/web-modules/java-takes/README.md new file mode 100644 index 0000000000..0db4361d6f --- /dev/null +++ b/web-modules/java-takes/README.md @@ -0,0 +1,7 @@ +## Java takes + +This module contains articles about Takes. + +### Relevant Articles: +- [Introduction to Takes](https://www.baeldung.com/java-takes) + diff --git a/web-modules/java-takes/pom.xml b/web-modules/java-takes/pom.xml new file mode 100644 index 0000000000..e28f75b536 --- /dev/null +++ b/web-modules/java-takes/pom.xml @@ -0,0 +1,81 @@ + + + 4.0.0 + com.baeldung.spring-boot-modules + java-takes + + + com.baeldung + web-modules + 1.0.0-SNAPSHOT + + + + + + + org.takes + takes + ${takes.version} + + + org.apache.httpcomponents + httpcore + ${httpcore.version} + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + + + + + + reload + + + + src/main/resources + true + + + src/main/webapp + true + + + + + org.codehaus.mojo + exec-maven-plugin + + + start-server + pre-integration-test + + java + + + + + com.baeldung.com.baeldung.takes.TakesApp + false + + --port=${port} + + + + + + + + + + 1.19 + 4.4.13 + 4.5.12 + + + \ No newline at end of file diff --git a/libraries-3/src/main/java/com/baeldung/takes/TakesApp.java b/web-modules/java-takes/src/main/java/com/baeldung/takes/TakesApp.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/takes/TakesApp.java rename to web-modules/java-takes/src/main/java/com/baeldung/takes/TakesApp.java diff --git a/libraries-3/src/main/java/com/baeldung/takes/TakesContact.java b/web-modules/java-takes/src/main/java/com/baeldung/takes/TakesContact.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/takes/TakesContact.java rename to web-modules/java-takes/src/main/java/com/baeldung/takes/TakesContact.java diff --git a/libraries-3/src/main/java/com/baeldung/takes/TakesHelloWorld.java b/web-modules/java-takes/src/main/java/com/baeldung/takes/TakesHelloWorld.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/takes/TakesHelloWorld.java rename to web-modules/java-takes/src/main/java/com/baeldung/takes/TakesHelloWorld.java diff --git a/libraries-3/src/main/java/com/baeldung/takes/TakesIndex.java b/web-modules/java-takes/src/main/java/com/baeldung/takes/TakesIndex.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/takes/TakesIndex.java rename to web-modules/java-takes/src/main/java/com/baeldung/takes/TakesIndex.java diff --git a/web-modules/java-takes/src/main/resources/logback.xml b/web-modules/java-takes/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/web-modules/java-takes/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/libraries-3/src/main/webapp/templates/index.vm b/web-modules/java-takes/src/main/webapp/templates/index.vm similarity index 100% rename from libraries-3/src/main/webapp/templates/index.vm rename to web-modules/java-takes/src/main/webapp/templates/index.vm diff --git a/libraries-3/src/test/java/com/baeldung/takes/TakesAppIntegrationTest.java b/web-modules/java-takes/src/test/java/com/baeldung/takes/TakesAppIntegrationTest.java similarity index 100% rename from libraries-3/src/test/java/com/baeldung/takes/TakesAppIntegrationTest.java rename to web-modules/java-takes/src/test/java/com/baeldung/takes/TakesAppIntegrationTest.java diff --git a/libraries-3/src/test/java/com/baeldung/takes/TakesContactUnitTest.java b/web-modules/java-takes/src/test/java/com/baeldung/takes/TakesContactUnitTest.java similarity index 100% rename from libraries-3/src/test/java/com/baeldung/takes/TakesContactUnitTest.java rename to web-modules/java-takes/src/test/java/com/baeldung/takes/TakesContactUnitTest.java diff --git a/web-modules/pom.xml b/web-modules/pom.xml index 57810f90de..b0792b3653 100644 --- a/web-modules/pom.xml +++ b/web-modules/pom.xml @@ -22,6 +22,7 @@ jakarta-ee + java-takes javax-servlets javax-servlets-2 jee-7 @@ -33,10 +34,12 @@ ratpack resteasy restx + rome spark-java struts-2 vraptor wicket + diff --git a/web-modules/rome/README.md b/web-modules/rome/README.md new file mode 100644 index 0000000000..e5cbbbb373 --- /dev/null +++ b/web-modules/rome/README.md @@ -0,0 +1,8 @@ +## RSS ROME + +This module contains articles about Rss with Rome. + +### Relevant Articles + +- [Quick Guide to RSS with Rome](https://www.baeldung.com/rome-rss) + diff --git a/web-modules/rome/pom.xml b/web-modules/rome/pom.xml new file mode 100644 index 0000000000..cfcdf4721c --- /dev/null +++ b/web-modules/rome/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + rome + 0.1-SNAPSHOT + rome + + + com.baeldung + web-modules + 1.0.0-SNAPSHOT + + + + + + + rome + rome + ${rome.version} + + + + + + 1.0 + + + \ No newline at end of file diff --git a/libraries-4/src/main/java/com/baeldung/rome/RSSRomeExample.java b/web-modules/rome/src/main/java/com/baeldung/rome/RSSRomeExample.java similarity index 85% rename from libraries-4/src/main/java/com/baeldung/rome/RSSRomeExample.java rename to web-modules/rome/src/main/java/com/baeldung/rome/RSSRomeExample.java index 66a9e0ebce..b5e4569270 100644 --- a/libraries-4/src/main/java/com/baeldung/rome/RSSRomeExample.java +++ b/web-modules/rome/src/main/java/com/baeldung/rome/RSSRomeExample.java @@ -1,11 +1,5 @@ package com.baeldung.rome; -import com.sun.syndication.feed.synd.*; -import com.sun.syndication.io.FeedException; -import com.sun.syndication.io.SyndFeedInput; -import com.sun.syndication.io.SyndFeedOutput; -import com.sun.syndication.io.XmlReader; - import java.io.FileWriter; import java.io.IOException; import java.io.Writer; @@ -14,6 +8,19 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import com.sun.syndication.feed.synd.SyndCategory; +import com.sun.syndication.feed.synd.SyndCategoryImpl; +import com.sun.syndication.feed.synd.SyndContent; +import com.sun.syndication.feed.synd.SyndContentImpl; +import com.sun.syndication.feed.synd.SyndEntry; +import com.sun.syndication.feed.synd.SyndEntryImpl; +import com.sun.syndication.feed.synd.SyndFeed; +import com.sun.syndication.feed.synd.SyndFeedImpl; +import com.sun.syndication.io.FeedException; +import com.sun.syndication.io.SyndFeedInput; +import com.sun.syndication.io.SyndFeedOutput; +import com.sun.syndication.io.XmlReader; + public class RSSRomeExample { public static void main(String[] args) throws IOException, FeedException { diff --git a/web-modules/rome/src/main/resources/logback.xml b/web-modules/rome/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/web-modules/rome/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file From aea8adcfda13c6bdbc940086792758c2a550e4cd Mon Sep 17 00:00:00 2001 From: Amit Pandey Date: Thu, 21 Dec 2023 17:44:23 +0530 Subject: [PATCH 274/294] Updated ScyllaDB package to use Spring Boot 3 (#15461) --- persistence-modules/scylladb/pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/persistence-modules/scylladb/pom.xml b/persistence-modules/scylladb/pom.xml index 66dd89afa9..2ce777edaa 100644 --- a/persistence-modules/scylladb/pom.xml +++ b/persistence-modules/scylladb/pom.xml @@ -10,12 +10,13 @@ Sample ScyllaDB Project 1.17.6 + true com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-3 From b8a6e4f89fe0408f3ffa98acb5d79fbbf75c5fb3 Mon Sep 17 00:00:00 2001 From: Constantin Date: Thu, 21 Dec 2023 16:57:31 +0200 Subject: [PATCH 275/294] BAEL-7199: Include feedback --- .../spring/kafka/dlt/KafkaDltRetryOnErrorIntegrationTest.java | 1 + .../com/baeldung/spring/kafka/dlt/KafkaNoDltIntegrationTest.java | 1 + 2 files changed, 2 insertions(+) diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaDltRetryOnErrorIntegrationTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaDltRetryOnErrorIntegrationTest.java index 97e42dac9f..393eb2ae46 100644 --- a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaDltRetryOnErrorIntegrationTest.java +++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaDltRetryOnErrorIntegrationTest.java @@ -83,5 +83,6 @@ public class KafkaDltRetryOnErrorIntegrationTest { assertThat(mainTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isTrue(); assertThat(dlTTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isTrue(); + assertThat(dlTTopicCountDownLatch.getCount()).isEqualTo(0); } } \ No newline at end of file diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaNoDltIntegrationTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaNoDltIntegrationTest.java index 568908d276..81cca9fec3 100644 --- a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaNoDltIntegrationTest.java +++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/dlt/KafkaNoDltIntegrationTest.java @@ -82,5 +82,6 @@ public class KafkaNoDltIntegrationTest { assertThat(mainTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isTrue(); assertThat(dlTTopicCountDownLatch.await(5, TimeUnit.SECONDS)).isFalse(); + assertThat(dlTTopicCountDownLatch.getCount()).isEqualTo(1); } } \ No newline at end of file From ca584307b25c3238a55de33d5bdcb4df8d8fed2b Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Fri, 22 Dec 2023 02:57:56 +0100 Subject: [PATCH 276/294] [shift-char-in-string] rotate a string (#15441) --- .../core-java-string-algorithms-4/README.md | 5 + .../core-java-string-algorithms-4/pom.xml | 14 +++ .../shiftchar/ShiftCharInStringUnitTest.java | 100 ++++++++++++++++++ core-java-modules/pom.xml | 3 +- 4 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 core-java-modules/core-java-string-algorithms-4/README.md create mode 100644 core-java-modules/core-java-string-algorithms-4/pom.xml create mode 100644 core-java-modules/core-java-string-algorithms-4/src/test/java/com/baeldung/string/shiftchar/ShiftCharInStringUnitTest.java diff --git a/core-java-modules/core-java-string-algorithms-4/README.md b/core-java-modules/core-java-string-algorithms-4/README.md new file mode 100644 index 0000000000..0651448493 --- /dev/null +++ b/core-java-modules/core-java-string-algorithms-4/README.md @@ -0,0 +1,5 @@ +## Java String Algorithms + +This module contains articles about string-related algorithms. + +### Relevant Articles: \ No newline at end of file diff --git a/core-java-modules/core-java-string-algorithms-4/pom.xml b/core-java-modules/core-java-string-algorithms-4/pom.xml new file mode 100644 index 0000000000..b374b48743 --- /dev/null +++ b/core-java-modules/core-java-string-algorithms-4/pom.xml @@ -0,0 +1,14 @@ + + 4.0.0 + core-java-string-algorithms-4 + core-java-string-algorithms-4 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + \ No newline at end of file diff --git a/core-java-modules/core-java-string-algorithms-4/src/test/java/com/baeldung/string/shiftchar/ShiftCharInStringUnitTest.java b/core-java-modules/core-java-string-algorithms-4/src/test/java/com/baeldung/string/shiftchar/ShiftCharInStringUnitTest.java new file mode 100644 index 0000000000..92bbc48c98 --- /dev/null +++ b/core-java-modules/core-java-string-algorithms-4/src/test/java/com/baeldung/string/shiftchar/ShiftCharInStringUnitTest.java @@ -0,0 +1,100 @@ +package com.baeldung.string.shiftchar; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +public class ShiftCharInStringUnitTest { + + private final static String STRING = "abcdefg"; + + private final static String EXPECT_1X = "gabcdef"; + private final static String EXPECT_2X = "fgabcde"; + private final static String EXPECT_3X = "efgabcd"; + private final static String EXPECT_6X = "bcdefga"; + private final static String EXPECT_7X = "abcdefg"; + private final static String EXPECT_24X = "efgabcd"; + + private final static String B_EXPECT_1X = "bcdefga"; + private final static String B_EXPECT_2X = "cdefgab"; + private final static String B_EXPECT_3X = "defgabc"; + private final static String B_EXPECT_6X = "gabcdef"; + private final static String B_EXPECT_7X = "abcdefg"; + private final static String B_EXPECT_24X = "defgabc"; + + static String rotateString1(String s, int c, boolean forward) { + if (c < 0) { + throw new IllegalArgumentException("Rotation character count cannot be negative!"); + } + int len = s.length(); + int n = c % len; + if (n == 0) { + return s; + } + n = forward ? n : len - n; + return s.substring(len - n, len) + s.substring(0, len - n); + } + + static String rotateString2(String s, int c, boolean forward) { + if (c < 0) { + throw new IllegalArgumentException("Rotation character count cannot be negative!"); + } + int len = s.length(); + int n = c % len; + if (n == 0) { + return s; + } + String ss = s + s; + n = forward ? n : len - n; + return ss.substring(len - n, 2 * len - n); + } + + static boolean rotatedFrom(String rotated, String rotateFrom) { + return rotateFrom.length() == rotated.length() && (rotateFrom + rotateFrom).contains(rotated); + } + + @Test + void whenUsingRotateString1_thenGetExpectedResults() { + assertEquals(EXPECT_1X, rotateString1(STRING, 1, true)); + assertEquals(EXPECT_2X, rotateString1(STRING, 2, true)); + assertEquals(EXPECT_3X, rotateString1(STRING, 3, true)); + assertEquals(EXPECT_6X, rotateString1(STRING, 6, true)); + assertEquals(EXPECT_7X, rotateString1(STRING, 7, true)); + assertEquals(EXPECT_24X, rotateString1(STRING, 24, true)); + + //backward + assertEquals(B_EXPECT_1X, rotateString1(STRING, 1, false)); + assertEquals(B_EXPECT_2X, rotateString1(STRING, 2, false)); + assertEquals(B_EXPECT_3X, rotateString1(STRING, 3, false)); + assertEquals(B_EXPECT_6X, rotateString1(STRING, 6, false)); + assertEquals(B_EXPECT_7X, rotateString1(STRING, 7, false)); + assertEquals(B_EXPECT_24X, rotateString1(STRING, 24, false)); + } + + @Test + void whenUsingShiftString2_thenGetExpectedResults() { + assertEquals(EXPECT_1X, rotateString2(STRING, 1, true)); + assertEquals(EXPECT_2X, rotateString2(STRING, 2, true)); + assertEquals(EXPECT_3X, rotateString2(STRING, 3, true)); + assertEquals(EXPECT_6X, rotateString2(STRING, 6, true)); + assertEquals(EXPECT_7X, rotateString2(STRING, 7, true)); + assertEquals(EXPECT_24X, rotateString2(STRING, 24, true)); + + //backward + assertEquals(B_EXPECT_1X, rotateString2(STRING, 1, false)); + assertEquals(B_EXPECT_2X, rotateString2(STRING, 2, false)); + assertEquals(B_EXPECT_3X, rotateString2(STRING, 3, false)); + assertEquals(B_EXPECT_6X, rotateString2(STRING, 6, false)); + assertEquals(B_EXPECT_7X, rotateString2(STRING, 7, false)); + assertEquals(B_EXPECT_24X, rotateString2(STRING, 24, false)); + } + + @Test + void whenUsingRotateFrom_thenGetExpectedResults() { + assertTrue(rotatedFrom(EXPECT_7X, STRING)); + assertTrue(rotatedFrom(B_EXPECT_3X, STRING)); + assertFalse(rotatedFrom("abcefgd", STRING)); + } +} \ No newline at end of file diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index f16cff3987..639a02a8cf 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -65,7 +65,6 @@ core-java-streams-5 core-java-streams-collect core-java-streams-maps - core-java-string-algorithms-3 core-java-string-operations-4 @@ -185,6 +184,8 @@ core-java-streams-3 core-java-string-algorithms core-java-string-algorithms-2 + core-java-string-algorithms-3 + core-java-string-algorithms-4 core-java-string-apis core-java-swing From 56a4afe86626399a201ef84c997faf14ebcb3bab Mon Sep 17 00:00:00 2001 From: Manfred <77407079+manfred106@users.noreply.github.com> Date: Fri, 22 Dec 2023 02:07:48 +0000 Subject: [PATCH 277/294] BAEL-7175: UTF-8 Validation in Java (#15428) --- .../core-java-string-operations-7/pom.xml | 17 +++ .../UTF8ValidationUnitTest.java | 108 ++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/utf8validation/UTF8ValidationUnitTest.java diff --git a/core-java-modules/core-java-string-operations-7/pom.xml b/core-java-modules/core-java-string-operations-7/pom.xml index 33a74365bc..cea3e32f2f 100644 --- a/core-java-modules/core-java-string-operations-7/pom.xml +++ b/core-java-modules/core-java-string-operations-7/pom.xml @@ -24,6 +24,21 @@ commons-text ${commons-text.version} + + org.apache.tika + tika-core + ${apache.tika.version} + + + org.apache.tika + tika-parsers-standard-package + ${apache.tika.version} + + + com.ibm.icu + icu4j + ${icu4j.version} + org.junit.jupiter junit-jupiter @@ -60,7 +75,9 @@ 11 11 3.13.0 + 2.9.1 1.10.0 + 74.1 4.25.0 diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/utf8validation/UTF8ValidationUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/utf8validation/UTF8ValidationUnitTest.java new file mode 100644 index 0000000000..7e737bad1d --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/utf8validation/UTF8ValidationUnitTest.java @@ -0,0 +1,108 @@ +package com.baeldung.utf8validation; + +import com.ibm.icu.text.CharsetDetector; +import com.ibm.icu.text.CharsetMatch; +import org.apache.tika.detect.EncodingDetector; +import org.apache.tika.metadata.Metadata; +import org.apache.tika.parser.txt.UniversalEncodingDetector; +import org.junit.jupiter.api.Test; + +import java.io.*; +import java.nio.CharBuffer; +import java.nio.charset.*; + +import static org.junit.jupiter.api.Assertions.*; + +class UTF8ValidationUnitTest { + + private static final String UTF8_STRING = "Hello 你好"; + + private static final byte[] UTF8_BYTES = UTF8_STRING.getBytes(StandardCharsets.UTF_8); + + private static final byte[] INVALID_UTF8_BYTES = {(byte) 0xF0, (byte) 0xC1, (byte) 0x8C, (byte) 0xBC, (byte) 0xD1}; + + private static final InputStream ENGLISH_INPUTSTREAM = new ByteArrayInputStream("Hello".getBytes(StandardCharsets.UTF_8)); + + private static final InputStream UTF8_INPUTSTREAM = new ByteArrayInputStream(UTF8_BYTES); + + private static final InputStream INVALID_UTF8_INPUTSTREAM = new ByteArrayInputStream(INVALID_UTF8_BYTES); + + @Test + void whenConvertValidUTF8BytesToString_thenReturnExpectedString() { + String decodedStr = new String(UTF8_BYTES, StandardCharsets.UTF_8); + assertEquals(UTF8_STRING, decodedStr); + } + + @Test + void whenConvertInvalidUTF8BytesToString_thenReturnReplacementCharacters() { + String decodedStr = new String(INVALID_UTF8_BYTES, StandardCharsets.UTF_8); + assertEquals("�����", decodedStr); + } + + @Test + void whenDecodeValidUTF8Bytes_thenSucceeds() throws CharacterCodingException { + + CharsetDecoder charsetDecoder = StandardCharsets.UTF_8.newDecoder(); + CharBuffer decodedCharBuffer = charsetDecoder.decode(java.nio.ByteBuffer.wrap(UTF8_BYTES)); + assertEquals(UTF8_STRING, decodedCharBuffer.toString()); + } + + @Test + void whenDecodeInvalidUTF8Bytes_thenThrowsMalformedInputException() { + + CharsetDecoder charsetDecoder = StandardCharsets.UTF_8.newDecoder(); + assertThrows(MalformedInputException.class,() -> {charsetDecoder.decode(java.nio.ByteBuffer.wrap(INVALID_UTF8_BYTES));}); + } + + @Test + void whenValidateValidInputStreamByTika_thenReturnsUTF8() throws IOException { + + EncodingDetector encodingDetector = new UniversalEncodingDetector(); + Charset detectedCharset = encodingDetector.detect(UTF8_INPUTSTREAM, new Metadata()); + assertEquals(StandardCharsets.UTF_8, detectedCharset); + } + + @Test + void whenValidateValidEnglishInputStreamByTika_thenReturnsISO_88591_1() throws IOException { + + EncodingDetector encodingDetector = new UniversalEncodingDetector(); + Charset detectedCharset = encodingDetector.detect(ENGLISH_INPUTSTREAM, new Metadata()); + assertEquals(StandardCharsets.ISO_8859_1, detectedCharset); + } + + @Test + void whenValidateInvalidInputStreamByTika_thenReturnsNull() throws IOException { + + EncodingDetector encodingDetector = new UniversalEncodingDetector(); + Charset detectedCharset = encodingDetector.detect(INVALID_UTF8_INPUTSTREAM, new Metadata()); + assertNull(detectedCharset); + } + + @Test + void whenValidateValidInputStreamByICU4J_thenReturnsUTF8() throws IOException { + + CharsetDetector detector = new CharsetDetector(); + detector.setText(UTF8_INPUTSTREAM); + CharsetMatch charsetMatch = detector.detect(); + assertEquals(StandardCharsets.UTF_8.name(), charsetMatch.getName()); + } + + @Test + void whenValidateValidEnglishInputStreamByICU4J_thenReturnsISO_8859_1() throws IOException { + + CharsetDetector detector = new CharsetDetector(); + detector.setText(ENGLISH_INPUTSTREAM); + CharsetMatch charsetMatch = detector.detect(); + assertEquals(StandardCharsets.ISO_8859_1.name(), charsetMatch.getName()); + } + + @Test + void whenValidateValidInputStreamByICU4J_thenReturnsNotEqualToUTF_8() throws IOException { + + CharsetDetector detector = new CharsetDetector(); + detector.setText(INVALID_UTF8_INPUTSTREAM); + CharsetMatch charsetMatch = detector.detect(); + assertNotEquals(StandardCharsets.UTF_8.name(), charsetMatch.getName()); + } + +} \ No newline at end of file From a24cf067a91352fb85002f8cbdd2ac7bcd419aed Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Fri, 22 Dec 2023 21:38:55 +0530 Subject: [PATCH 278/294] JAVA-28508: Fix formatting of POMs Modules D to Q (#15360) --- jsf/pom.xml | 1 - kubernetes-modules/jkube-demo/pom.xml | 12 +++++----- microservices-modules/rest-express/pom.xml | 22 +++++++++---------- .../core-java-persistence-3/pom.xml | 9 ++++++-- persistence-modules/pom.xml | 2 +- .../spring-data-jpa-query-2/pom.xml | 4 ++-- .../spring-data-jpa-repo-3/pom.xml | 9 ++++---- persistence-modules/spring-jdbc-2/pom.xml | 5 ++--- quarkus-modules/quarkus-funqy/pom.xml | 5 +++++ 9 files changed, 40 insertions(+), 29 deletions(-) diff --git a/jsf/pom.xml b/jsf/pom.xml index 09dea98f65..ec014540a0 100644 --- a/jsf/pom.xml +++ b/jsf/pom.xml @@ -14,7 +14,6 @@ - javax.annotation javax.annotation-api diff --git a/kubernetes-modules/jkube-demo/pom.xml b/kubernetes-modules/jkube-demo/pom.xml index 6fedc0f24a..fe75a0cc14 100644 --- a/kubernetes-modules/jkube-demo/pom.xml +++ b/kubernetes-modules/jkube-demo/pom.xml @@ -3,17 +3,19 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + com.baeldung + jkube-demo + 0.0.1-SNAPSHOT + jkube-demo + jkube-demo + com.baeldung parent-boot-2 0.0.1-SNAPSHOT ../../parent-boot-2 - com.baeldung - jkube-demo - 0.0.1-SNAPSHOT - jkube-demo - jkube-demo + org.springframework.boot diff --git a/microservices-modules/rest-express/pom.xml b/microservices-modules/rest-express/pom.xml index 1b22bb8117..be1c142a94 100644 --- a/microservices-modules/rest-express/pom.xml +++ b/microservices-modules/rest-express/pom.xml @@ -2,14 +2,13 @@ - - microservices-modules - com.baeldung - 1.0.0-SNAPSHOT - 4.0.0 - + rest-express + 1.0.0-SNAPSHOT rest-express + jar + A Basic, MongoDB-backed Service Suite + https://github.com/RestExpress/RestExpress-Scaffold - A Basic, MongoDB-backed Service Suite - https://github.com/RestExpress/RestExpress-Scaffold - 1.0.0-SNAPSHOT - rest-express - jar + + + microservices-modules + com.baeldung + 1.0.0-SNAPSHOT + diff --git a/persistence-modules/core-java-persistence-3/pom.xml b/persistence-modules/core-java-persistence-3/pom.xml index 26ac2a5218..60562859a7 100644 --- a/persistence-modules/core-java-persistence-3/pom.xml +++ b/persistence-modules/core-java-persistence-3/pom.xml @@ -1,15 +1,19 @@ - + 4.0.0 com.baeldung.core-java-persistence-3 core-java-persistence-3 - core-java-persistence-3 0.1.0-SNAPSHOT + core-java-persistence-3 jar + com.baeldung persistence-modules 1.0.0-SNAPSHOT + com.h2database @@ -22,6 +26,7 @@ ${commons-dbutils.version} + 2.1.214 1.8.1 diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 5ebc5b2cd4..6caedb3273 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -108,7 +108,7 @@ spring-jpa spring-jpa-2 spring-jdbc - spring-jdbc-2 + spring-jdbc-2 spring-mybatis spring-persistence-simple diff --git a/persistence-modules/spring-data-jpa-query-2/pom.xml b/persistence-modules/spring-data-jpa-query-2/pom.xml index 62bf7f0314..6ef1adad14 100644 --- a/persistence-modules/spring-data-jpa-query-2/pom.xml +++ b/persistence-modules/spring-data-jpa-query-2/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-data-jpa-query-2 spring-data-jpa-query-2 diff --git a/persistence-modules/spring-data-jpa-repo-3/pom.xml b/persistence-modules/spring-data-jpa-repo-3/pom.xml index 211e8a2d96..5c57606d31 100644 --- a/persistence-modules/spring-data-jpa-repo-3/pom.xml +++ b/persistence-modules/spring-data-jpa-repo-3/pom.xml @@ -3,16 +3,17 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + spring-data-jpa-repo-3 + 0.0.1-SNAPSHOT + spring-data-jpa-repo-3 + spring-data-jpa-repo-3 + com.baeldung parent-boot-3 0.0.1-SNAPSHOT ../../parent-boot-3 - spring-data-jpa-repo-3 - 0.0.1-SNAPSHOT - spring-data-jpa-repo-3 - spring-data-jpa-repo-3 diff --git a/persistence-modules/spring-jdbc-2/pom.xml b/persistence-modules/spring-jdbc-2/pom.xml index ce79c1c615..7942e7675d 100644 --- a/persistence-modules/spring-jdbc-2/pom.xml +++ b/persistence-modules/spring-jdbc-2/pom.xml @@ -1,9 +1,8 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.example spring-jdbc-2 1.0-SNAPSHOT diff --git a/quarkus-modules/quarkus-funqy/pom.xml b/quarkus-modules/quarkus-funqy/pom.xml index f5ba9d08d8..dbccc5e987 100644 --- a/quarkus-modules/quarkus-funqy/pom.xml +++ b/quarkus-modules/quarkus-funqy/pom.xml @@ -13,6 +13,7 @@ quarkus-modules 1.0.0-SNAPSHOT + @@ -24,6 +25,7 @@ + io.quarkus @@ -48,6 +50,7 @@ test + @@ -86,6 +89,7 @@ + native @@ -134,4 +138,5 @@ 2.16.0.Final 3.0.0-M7 + From 9386fe77e0a03e4e4cf5f80b628a9f30fce44b24 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Fri, 22 Dec 2023 08:17:11 -0800 Subject: [PATCH 279/294] JAVA-29269 Upgrade parent-spring-6 to the latest version (#15466) --- parent-spring-6/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parent-spring-6/pom.xml b/parent-spring-6/pom.xml index 7aaffb5483..7418c019c4 100644 --- a/parent-spring-6/pom.xml +++ b/parent-spring-6/pom.xml @@ -35,7 +35,7 @@ - 6.0.12 + 6.1.2 From 616b9b9eb3dfba120cd37c6cfb53686a3906cd67 Mon Sep 17 00:00:00 2001 From: Amit Pandey Date: Fri, 22 Dec 2023 23:21:54 +0530 Subject: [PATCH 280/294] Upgrade to MyBatis to Spring Boot 3 (#15456) --- persistence-modules/spring-mybatis/pom.xml | 11 ++++++----- .../mybatis/spring/ArticleMapperCommonUnitTest.java | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/persistence-modules/spring-mybatis/pom.xml b/persistence-modules/spring-mybatis/pom.xml index 1b2223653b..6de7cef347 100644 --- a/persistence-modules/spring-mybatis/pom.xml +++ b/persistence-modules/spring-mybatis/pom.xml @@ -9,9 +9,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-3 @@ -78,11 +78,12 @@ - 5.3.15 + 6.0.13 - 2.0.6 + 3.0.3 3.5.2 - 2.2.0 + 3.0.3 + true \ No newline at end of file diff --git a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonUnitTest.java b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonUnitTest.java index 2a93ca3d61..ab1cdce2aa 100644 --- a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonUnitTest.java +++ b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonUnitTest.java @@ -5,7 +5,7 @@ import org.springframework.beans.factory.annotation.Autowired; import static org.assertj.core.api.Assertions.assertThat; -class ArticleMapperCommonUnitTest { +abstract class ArticleMapperCommonUnitTest { @Autowired ArticleMapper articleMapper; From fcb652319b4c2beade53b07dec1f237399b2c57c Mon Sep 17 00:00:00 2001 From: Amit Pandey Date: Fri, 22 Dec 2023 23:39:09 +0530 Subject: [PATCH 281/294] Upgrade Spring-mvc-basics-4 module to Spring Boot 3 (#15458) --- spring-web-modules/spring-mvc-basics-4/pom.xml | 5 +++-- .../main/java/com/baeldung/config/WebConfig.java | 14 ++------------ .../baeldung/contexts/services/GreeterService.java | 2 +- .../constraint/MaxSizeConstraint.java | 6 +++--- .../constraint/MaxSizeConstraintValidator.java | 5 ++--- .../listvalidation/controller/MovieController.java | 14 ++++++-------- .../ConstraintViolationExceptionHandler.java | 9 ++++----- .../validation/listvalidation/model/Movie.java | 3 ++- .../ControllerAnnotationIntegrationTest.java | 2 +- .../controller/ControllerIntegrationTest.java | 2 +- 10 files changed, 25 insertions(+), 37 deletions(-) diff --git a/spring-web-modules/spring-mvc-basics-4/pom.xml b/spring-web-modules/spring-mvc-basics-4/pom.xml index 455e4e488c..7e8ef257c7 100644 --- a/spring-web-modules/spring-mvc-basics-4/pom.xml +++ b/spring-web-modules/spring-mvc-basics-4/pom.xml @@ -9,9 +9,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-3 @@ -31,6 +31,7 @@ javax.servlet jstl + 1.2 org.springframework.boot diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/config/WebConfig.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/config/WebConfig.java index e9b59a2b23..7ccbbd6410 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/config/WebConfig.java +++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/config/WebConfig.java @@ -1,22 +1,12 @@ package com.baeldung.config; +import com.baeldung.contexts.Greeting; +import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.view.InternalResourceViewResolver; -import org.springframework.web.servlet.view.JstlView; -import org.thymeleaf.spring5.SpringTemplateEngine; -import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver; -import org.thymeleaf.spring5.view.ThymeleafViewResolver; -import org.thymeleaf.templatemode.TemplateMode; -import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver; -import org.thymeleaf.templateresolver.ITemplateResolver; - -import com.baeldung.contexts.Greeting; -import com.fasterxml.jackson.databind.ObjectMapper; /** * Web Configuration for the entire app diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/services/GreeterService.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/services/GreeterService.java index f68b2fe5af..dfff103d7e 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/services/GreeterService.java +++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/services/GreeterService.java @@ -1,7 +1,7 @@ package com.baeldung.contexts.services; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import com.baeldung.contexts.Greeting; diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/constraint/MaxSizeConstraint.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/constraint/MaxSizeConstraint.java index b5adab5d86..d96607e1e9 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/constraint/MaxSizeConstraint.java +++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/constraint/MaxSizeConstraint.java @@ -1,11 +1,11 @@ package com.baeldung.validation.listvalidation.constraint; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import javax.validation.Constraint; -import javax.validation.Payload; - @Constraint(validatedBy = MaxSizeConstraintValidator.class) @Retention(RetentionPolicy.RUNTIME) public @interface MaxSizeConstraint { diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/constraint/MaxSizeConstraintValidator.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/constraint/MaxSizeConstraintValidator.java index 409b6e1ab5..edf140c6b1 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/constraint/MaxSizeConstraintValidator.java +++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/constraint/MaxSizeConstraintValidator.java @@ -2,10 +2,9 @@ package com.baeldung.validation.listvalidation.constraint; import java.util.List; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; - import com.baeldung.validation.listvalidation.model.Movie; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; public class MaxSizeConstraintValidator implements ConstraintValidator> { diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/controller/MovieController.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/controller/MovieController.java index 45639cf303..f29818a393 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/controller/MovieController.java +++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/controller/MovieController.java @@ -1,10 +1,10 @@ package com.baeldung.validation.listvalidation.controller; -import java.util.List; - -import javax.validation.Valid; -import javax.validation.constraints.NotEmpty; - +import com.baeldung.validation.listvalidation.constraint.MaxSizeConstraint; +import com.baeldung.validation.listvalidation.model.Movie; +import com.baeldung.validation.listvalidation.service.MovieService; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; @@ -12,9 +12,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.baeldung.validation.listvalidation.constraint.MaxSizeConstraint; -import com.baeldung.validation.listvalidation.model.Movie; -import com.baeldung.validation.listvalidation.service.MovieService; +import java.util.List; @Validated @RestController diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/exception/ConstraintViolationExceptionHandler.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/exception/ConstraintViolationExceptionHandler.java index 742be27f61..38a9b558a9 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/exception/ConstraintViolationExceptionHandler.java +++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/exception/ConstraintViolationExceptionHandler.java @@ -1,10 +1,7 @@ package com.baeldung.validation.listvalidation.exception; -import java.util.Set; - -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; - +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; @@ -12,6 +9,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import java.util.Set; + @RestControllerAdvice public class ConstraintViolationExceptionHandler { diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/model/Movie.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/model/Movie.java index f5a49877bf..5302ea4a5a 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/model/Movie.java +++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/model/Movie.java @@ -1,8 +1,9 @@ package com.baeldung.validation.listvalidation.model; +import jakarta.validation.constraints.NotEmpty; + import java.util.UUID; -import javax.validation.constraints.NotEmpty; public class Movie { diff --git a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerAnnotationIntegrationTest.java b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerAnnotationIntegrationTest.java index 7fd8f0c97f..cb70f80afe 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerAnnotationIntegrationTest.java +++ b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerAnnotationIntegrationTest.java @@ -40,7 +40,7 @@ public class ControllerAnnotationIntegrationTest { @Test public void testTestController() throws Exception { - ModelAndView mv = this.mockMvc.perform(MockMvcRequestBuilders.get("/test/")).andReturn().getModelAndView(); + ModelAndView mv = this.mockMvc.perform(MockMvcRequestBuilders.get("/test")).andReturn().getModelAndView(); // validate modal data Assert.assertSame(mv.getModelMap().get("data").toString(), "Welcome home man"); diff --git a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerIntegrationTest.java b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerIntegrationTest.java index a7e6bd6c4b..3431d74997 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerIntegrationTest.java +++ b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerIntegrationTest.java @@ -40,7 +40,7 @@ public class ControllerIntegrationTest { @Test public void testTestController() throws Exception { - ModelAndView mv = this.mockMvc.perform(MockMvcRequestBuilders.get("/test/")).andReturn().getModelAndView(); + ModelAndView mv = this.mockMvc.perform(MockMvcRequestBuilders.get("/test")).andReturn().getModelAndView(); // validate modal data Assert.assertSame(mv.getModelMap().get("data").toString(), "Welcome home man"); From 4b6c1c6e05c3b0357b6cf64143fb23bd707569e3 Mon Sep 17 00:00:00 2001 From: Wynn Teo <49014791+wynnteo@users.noreply.github.com> Date: Sat, 23 Dec 2023 10:27:39 +0800 Subject: [PATCH 282/294] First version of Iterator vs For Loop unit testing (#15365) * First version of Iterator vs For Loop unit testing * Add a new line after package * Update the method name --- .../IteratorForLoopUnitTest.java | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 core-java-modules/core-java-collections-5/src/test/java/com/baeldung/iteratorvsforloop/IteratorForLoopUnitTest.java diff --git a/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/iteratorvsforloop/IteratorForLoopUnitTest.java b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/iteratorvsforloop/IteratorForLoopUnitTest.java new file mode 100644 index 0000000000..a7655c68eb --- /dev/null +++ b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/iteratorvsforloop/IteratorForLoopUnitTest.java @@ -0,0 +1,129 @@ +package com.baeldung.iteratorvsforloop; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.ConcurrentModificationException; +import java.util.List; +import java.util.Iterator; +import java.util.Collections; +import java.util.ListIterator; + +public class IteratorForLoopUnitTest { + + @Test + public void givenEmptyCollection_whenUsingForLoop_thenNoElementsAreIterated() { + List names = Collections.emptyList(); + StringBuilder stringBuilder = new StringBuilder(); + + for (int i = 0; i < names.size(); i++) { + stringBuilder.append(names.get(i)); + } + + assertEquals("", stringBuilder.toString()); + } + + @Test + public void givenEmptyCollection_whenUsingIterator_thenNoElementsAreIterated() { + List names = Collections.emptyList(); + StringBuilder stringBuilder = new StringBuilder(); + + Iterator iterator = names.iterator(); + while (iterator.hasNext()) { + stringBuilder.append(iterator.next()); + } + + assertEquals("", stringBuilder.toString()); + } + + + @Test + public void givenCollectionWithElements_whenUsingForLoop_thenAllElementsAreIterated() { + List names = Arrays.asList("Alice", "Bob", "Charlie"); + StringBuilder stringBuilder = new StringBuilder(); + + for (int i = 0; i < names.size(); i++) { + stringBuilder.append(names.get(i)); + } + + assertEquals("AliceBobCharlie", stringBuilder.toString()); + } + + @Test + public void givenCollectionWithElements_whenUsingIterator_thenAllElementsAreIterated() { + List names = Arrays.asList("Alice", "Bob", "Charlie"); + StringBuilder stringBuilder = new StringBuilder(); + + Iterator iterator = names.iterator(); + while (iterator.hasNext()) { + stringBuilder.append(iterator.next()); + } + + assertEquals("AliceBobCharlie", stringBuilder.toString()); + } + + @Test + public void givenCollectionWithElements_whenUsingForLoop_thenAllElementsAreIteratedReverseOrder() { + List names = Arrays.asList("Alice", "Bob", "Charlie"); + StringBuilder stringBuilder = new StringBuilder(); + + for (int i = names.size() - 1; i >= 0; i--) { + stringBuilder.append(names.get(i)); + } + + assertEquals("CharlieBobAlice", stringBuilder.toString()); + } + + @Test + public void givenCollectionWithElements_whenUsingListIterator_thenAllElementsAreIteratedInReverseOrder() { + List names = Arrays.asList("Alice", "Bob", "Charlie"); + StringBuilder stringBuilder = new StringBuilder(); + + ListIterator listIterator = names.listIterator(names.size()); + while (listIterator.hasPrevious()) { + stringBuilder.append(listIterator.previous()); + } + + assertEquals("CharlieBobAlice", stringBuilder.toString()); + } + + @Test + public void givenCollectionWithElements_whenRemovingElementDuringForLoopIteration_thenConcurrentModificationExceptionIsThrown() { + List names = new ArrayList<>(List.of("Alice", "Bob", "Charlie")); + + assertThrows(ConcurrentModificationException.class, () -> { + for (String name : names) { + names.remove("Bob"); + } + }); + } + + @Test + public void givenCollectionWithElements_whenRemovingElementUsingIterator_thenElementIsRemovedSafely() { + List names = new ArrayList<>(Arrays.asList("Alice", "Bob", "Charlie")); + Iterator iterator = names.iterator(); + + while (iterator.hasNext()) { + String name = iterator.next(); + if (name.equals("Bob")) { + iterator.remove(); + } + } + List expected = Arrays.asList("Alice", "Charlie"); + assertIterableEquals(expected, names); + } + + @Test + public void givenCollectionWithElements_whenModifyingElementToLowerCaseDuringForLoopIteration_thenElementsAreModifiedToLowerCase() { + List names = new ArrayList<>(List.of("Alice", "Bob", "Charlie")); + + for (int i = 0; i < names.size(); i++) { + names.set(i, names.get(i).toLowerCase()); + } + + List expected = Arrays.asList("alice","bob", "charlie"); + assertIterableEquals(expected, names); + } +} From 3838bab244f6809bd6a3740104e02bfa84db45e5 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 23 Dec 2023 22:06:16 -0500 Subject: [PATCH 283/294] BAEL-7115 implementation (#15101) * implementing BAEL-6833 * implementation for BAEL-7115 * feedback fixes * Moving code folder as per feedback * renaming logic class folder name * adding more methods --------- Co-authored-by: technoddy --- web-modules/javax-servlets-2/pom.xml | 13 +++++++ .../com/baeldung/servlets/AccountServlet.java | 26 ++++++++++++++ .../servlets/clientinfo/AccountLogic.java | 32 +++++++++++++++++ .../clientinfo/ClientInformationUnitTest.java | 35 +++++++++++++++++++ 4 files changed, 106 insertions(+) create mode 100644 web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/AccountServlet.java create mode 100644 web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/clientinfo/AccountLogic.java create mode 100644 web-modules/javax-servlets-2/src/test/java/com/baeldung/servlets/clientinfo/ClientInformationUnitTest.java diff --git a/web-modules/javax-servlets-2/pom.xml b/web-modules/javax-servlets-2/pom.xml index 9ba12352fd..a6bfc6b473 100644 --- a/web-modules/javax-servlets-2/pom.xml +++ b/web-modules/javax-servlets-2/pom.xml @@ -68,6 +68,17 @@ + + org.mockito + mockito-core + ${mockito.version} + test + + + com.github.ua-parser + uap-java + ${uap.version} + @@ -101,6 +112,8 @@ 2.22.2 10.0.4 1.10.0 + 5.6.0 + 1.5.4 \ No newline at end of file diff --git a/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/AccountServlet.java b/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/AccountServlet.java new file mode 100644 index 0000000000..3533bf500b --- /dev/null +++ b/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/AccountServlet.java @@ -0,0 +1,26 @@ +package com.baeldung.servlets; + +import java.io.IOException; +import java.util.Map; + +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.*; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.servlets.clientinfo.AccountLogic; + +@WebServlet(name = "AccountServlet", urlPatterns = "/account") +public class AccountServlet extends HttpServlet { + public static final Logger log = LoggerFactory.getLogger(AccountServlet.class); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + AccountLogic accountLogic = new AccountLogic(); + Map clientInfo = accountLogic.getClientInfo(request); + log.info("Request client info: {}, " + clientInfo); + + response.setStatus(HttpServletResponse.SC_OK); + } +} diff --git a/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/clientinfo/AccountLogic.java b/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/clientinfo/AccountLogic.java new file mode 100644 index 0000000000..00f3a5ca39 --- /dev/null +++ b/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/clientinfo/AccountLogic.java @@ -0,0 +1,32 @@ +package com.baeldung.servlets.clientinfo; + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import ua_parser.Client; +import ua_parser.Parser; + +public class AccountLogic { + public Map getClientInfo(HttpServletRequest request) { + String remoteAddr = request.getRemoteAddr(); + String remoteHost = request.getRemoteHost(); + String remoteUser = request.getRemoteUser(); + String contentType = request.getHeader("content-type"); + String userAgent = request.getHeader("user-agent"); + + Parser uaParser = new Parser(); + Client client = uaParser.parse(userAgent); + + Map clientInfo = new HashMap<>(); + clientInfo.put("os_family", client.os.family); + clientInfo.put("device_family", client.device.family); + clientInfo.put("userAgent_family", client.userAgent.family); + clientInfo.put("remote_address", remoteAddr); + clientInfo.put("remote_host", remoteHost); + clientInfo.put("remote_user", remoteUser); + clientInfo.put("content_type", contentType); + return clientInfo; + } +} diff --git a/web-modules/javax-servlets-2/src/test/java/com/baeldung/servlets/clientinfo/ClientInformationUnitTest.java b/web-modules/javax-servlets-2/src/test/java/com/baeldung/servlets/clientinfo/ClientInformationUnitTest.java new file mode 100644 index 0000000000..4ff5256f37 --- /dev/null +++ b/web-modules/javax-servlets-2/src/test/java/com/baeldung/servlets/clientinfo/ClientInformationUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.servlets.clientinfo; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.mockito.Mockito.when; + +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +public class ClientInformationUnitTest { + + @Test + void givenMockHttpServletRequestWithHeaders_whenGetClientInfo_thenReturnsUserAGentInfo() { + HttpServletRequest request = Mockito.mock(HttpServletRequest.class); + + when(request.getHeader("user-agent")).thenReturn("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36, acceptLanguage:en-US,en;q=0.9"); + when(request.getHeader("content-type")).thenReturn("application/json"); + when(request.getRemoteAddr()).thenReturn("198.167.0.1"); + when(request.getRemoteHost()).thenReturn("baeldung.com"); + when(request.getRemoteUser()).thenReturn("baeldung"); + + AccountLogic accountLogic = new AccountLogic(); + Map clientInfo = accountLogic.getClientInfo(request); + assertThat(clientInfo.get("os_family")).isEqualTo("Mac OS X"); + assertThat(clientInfo.get("device_family")).isEqualTo("Mac"); + assertThat(clientInfo.get("userAgent_family")).isEqualTo("Chrome"); + assertThat(clientInfo.get("content_type")).isEqualTo("application/json"); + assertThat(clientInfo.get("remote_user")).isEqualTo("baeldung"); + assertThat(clientInfo.get("remote_address")).isEqualTo("198.167.0.1"); + assertThat(clientInfo.get("remote_host")).isEqualTo("baeldung.com"); + } +} \ No newline at end of file From 37bddcdfced3c7ea09c45ec3287c68ff6462ada7 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Sun, 24 Dec 2023 15:06:05 +0200 Subject: [PATCH 284/294] JAVA-29331 Upgrade spring-security-web-sockets (#15468) Co-authored-by: timis1 --- .../spring-security-web-sockets/pom.xml | 61 ++++++++----------- .../config/AppConfig.java | 5 +- .../config/DataStoreConfig.java | 2 +- .../config/SecurityConfig.java | 51 ++++++---------- .../config/SocketBrokerConfig.java | 4 +- .../config/WebAppInitializer.java | 6 +- .../controllers/CsrfTokenController.java | 2 +- .../controllers/SocketController.java | 3 +- .../springsecuredsockets/domain/Role.java | 2 +- .../springsecuredsockets/domain/User.java | 4 +- .../security/CustomAccessDeniedHandler.java | 6 +- .../security/CustomLoginSuccessHandler.java | 4 +- .../security/CustomLogoutSuccessHandler.java | 7 +-- .../security/CustomUserDetailsService.java | 2 +- 14 files changed, 70 insertions(+), 89 deletions(-) diff --git a/spring-security-modules/spring-security-web-sockets/pom.xml b/spring-security-modules/spring-security-web-sockets/pom.xml index 513ee28c85..5f11bc9580 100644 --- a/spring-security-modules/spring-security-web-sockets/pom.xml +++ b/spring-security-modules/spring-security-web-sockets/pom.xml @@ -11,9 +11,9 @@ com.baeldung - parent-spring-5 + parent-spring-6 0.0.1-SNAPSHOT - ../../parent-spring-5 + ../../parent-spring-6 @@ -73,6 +73,16 @@ hibernate-core ${hibernate-core.version} + + org.hibernate + hibernate-validator + ${hibernate-validator.version} + + + org.glassfish.expressly + expressly + ${expressly.version} + com.h2database h2 @@ -92,7 +102,7 @@ org.springframework.security spring-security-messaging - ${spring-security.version} + ${spring-security-messaging.version} @@ -107,24 +117,9 @@ - javax.servlet - javax.servlet-api - ${javax.servlet-api.version} - - - javax.servlet.jsp.jstl - jstl-api - ${jstl-api.version} - - - javax.servlet.jsp - javax.servlet.jsp-api - ${javax.servlet.jsp-api.version} - - - javax.servlet - jstl - ${jstl.version} + jakarta.platform + jakarta.jakartaee-api + ${jakartaee-api.version} @@ -144,17 +139,11 @@ - org.springframework.boot - spring-boot-starter-test - ${spring-boot-starter-test.version} + org.springframework + spring-test + ${spring.version} test - - - javax.xml.bind - jaxb-api - ${jaxb-api.version} - @@ -194,11 +183,15 @@ - 5.2.10.Final - 1.11.3.RELEASE - 1.5.10.RELEASE + 6.1.5 + 6.0.2 + 6.1.7.Final + 8.0.1.Final + 5.0.0 + 3.1.0 + 3.1.0 + 10.0.0 1.7.6 - 2.3.1 \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/AppConfig.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/AppConfig.java index afb1970b25..0329f91373 100644 --- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/AppConfig.java +++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/AppConfig.java @@ -9,7 +9,7 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.resource.PathResourceResolver; import org.springframework.web.servlet.view.JstlView; import org.springframework.web.servlet.view.UrlBasedViewResolver; @@ -20,8 +20,9 @@ import java.sql.SQLException; @EnableJpaRepositories @ComponentScan("com.baeldung.springsecuredsockets") @Import({ SecurityConfig.class, DataStoreConfig.class, SocketBrokerConfig.class, SocketSecurityConfig.class }) -public class AppConfig extends WebMvcConfigurerAdapter { +public class AppConfig implements WebMvcConfigurer { + @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("index"); registry.addViewController("/login").setViewName("login"); diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/DataStoreConfig.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/DataStoreConfig.java index 2246c0055b..16ace5ed88 100644 --- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/DataStoreConfig.java +++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/DataStoreConfig.java @@ -13,7 +13,7 @@ import org.springframework.orm.jpa.vendor.Database; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.annotation.EnableTransactionManagement; -import javax.persistence.EntityManagerFactory; +import jakarta.persistence.EntityManagerFactory; import javax.sql.DataSource; import java.util.Properties; diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/SecurityConfig.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/SecurityConfig.java index 64f5169d2d..24687e6f21 100644 --- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/SecurityConfig.java +++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/SecurityConfig.java @@ -6,11 +6,14 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; @@ -86,43 +89,30 @@ public class SecurityConfig { */ @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http.authorizeRequests() - .antMatchers("/", "/index", "/authenticate") - .permitAll() - .antMatchers("/secured/**/**", "/secured/**/**/**", "/secured/socket", "/secured/success") - .authenticated() - .anyRequest() - .authenticated() - .and() - .formLogin() - .loginPage("/login") - .permitAll() - .usernameParameter("username") - .passwordParameter("password") - .loginProcessingUrl("/authenticate") - .successHandler(loginSuccessHandler()) - .failureUrl("/denied") - .permitAll() - .and() - .logout() - .logoutSuccessHandler(logoutSuccessHandler()) - .and() + http.authorizeHttpRequests(authorizationManagerRequestMatcherRegistry -> + authorizationManagerRequestMatcherRegistry + .requestMatchers("/", "/index", "/authenticate").permitAll() + .requestMatchers("/secured/**/**", "/secured/**/**/**", "/secured/socket", "/secured/success").authenticated() + .anyRequest().authenticated()) + .formLogin(httpSecurityFormLoginConfigurer -> httpSecurityFormLoginConfigurer.loginPage("/login").permitAll() + .usernameParameter("username") + .passwordParameter("password") + .loginProcessingUrl("/authenticate") + .successHandler(loginSuccessHandler()) + .failureUrl("/denied").permitAll()) + .logout(httpSecurityLogoutConfigurer -> httpSecurityLogoutConfigurer.logoutSuccessHandler(logoutSuccessHandler())) /** * Applies to User Roles - not to login failures or unauthenticated access attempts. */ - .exceptionHandling() - .accessDeniedHandler(accessDeniedHandler()) - .and() + .exceptionHandling(httpSecurityExceptionHandlingConfigurer -> httpSecurityExceptionHandlingConfigurer.accessDeniedHandler(accessDeniedHandler())) .authenticationProvider(authenticationProvider()); /** Disabled for local testing */ - http.csrf() - .disable(); + http.csrf(AbstractHttpConfigurer::disable); /** This is solely required to support H2 console viewing in Spring MVC with Spring Security */ - http.headers() - .frameOptions() - .disable(); + http.headers(httpSecurityHeadersConfigurer -> httpSecurityHeadersConfigurer.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) + .authorizeHttpRequests(Customizer.withDefaults()); return http.build(); } @@ -135,8 +125,7 @@ public class SecurityConfig { @Bean public WebSecurityCustomizer webSecurityCustomizer() { - return (web) -> web.ignoring() - .antMatchers("/resources/**"); + return (web) -> web.ignoring().requestMatchers("/resources/**"); } } diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/SocketBrokerConfig.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/SocketBrokerConfig.java index 9b19de7b5a..4e641980e5 100644 --- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/SocketBrokerConfig.java +++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/SocketBrokerConfig.java @@ -8,14 +8,14 @@ import static com.baeldung.springsecuredsockets.Constants.SECURED_CHAT_SPECIFIC_ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; -import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; @Configuration @EnableWebSocketMessageBroker @ComponentScan("com.baeldung.springsecuredsockets.controllers") -public class SocketBrokerConfig extends AbstractWebSocketMessageBrokerConfigurer { +public class SocketBrokerConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/WebAppInitializer.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/WebAppInitializer.java index 84c045a75a..244d5dd93b 100644 --- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/WebAppInitializer.java +++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/WebAppInitializer.java @@ -4,9 +4,9 @@ import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletRegistration; +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRegistration; public class WebAppInitializer implements WebApplicationInitializer { diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/controllers/CsrfTokenController.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/controllers/CsrfTokenController.java index 3d10dad391..97fe6ff1ee 100644 --- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/controllers/CsrfTokenController.java +++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/controllers/CsrfTokenController.java @@ -5,7 +5,7 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; @Controller public class CsrfTokenController { diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/controllers/SocketController.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/controllers/SocketController.java index 6a74009c16..570d603fad 100644 --- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/controllers/SocketController.java +++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/controllers/SocketController.java @@ -30,8 +30,7 @@ public class SocketController { @MessageMapping(SECURED_CHAT) @SendTo(SECURED_CHAT_HISTORY) public OutputMessage sendAll(Message msg) throws Exception { - OutputMessage out = new OutputMessage(msg.getFrom(), msg.getText(), new SimpleDateFormat("HH:mm").format(new Date())); - return out; + return new OutputMessage(msg.getFrom(), msg.getText(), new SimpleDateFormat("HH:mm").format(new Date())); } /** diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/domain/Role.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/domain/Role.java index 09fee9a31b..1f3ba3b283 100644 --- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/domain/Role.java +++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/domain/Role.java @@ -1,6 +1,6 @@ package com.baeldung.springsecuredsockets.domain; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.Set; @Entity diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/domain/User.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/domain/User.java index 8f84b2246d..96daff8427 100644 --- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/domain/User.java +++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/domain/User.java @@ -1,12 +1,12 @@ package com.baeldung.springsecuredsockets.domain; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.Set; //Custom User Model @Entity -@Table(name = "user") +@Table(name = "users") public class User { @Id diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomAccessDeniedHandler.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomAccessDeniedHandler.java index 0ab31a9c86..54d3f60232 100644 --- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomAccessDeniedHandler.java +++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomAccessDeniedHandler.java @@ -4,9 +4,9 @@ import org.springframework.http.HttpStatus; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.web.access.AccessDeniedHandler; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /** diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomLoginSuccessHandler.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomLoginSuccessHandler.java index 281fd0f163..c78aa20690 100644 --- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomLoginSuccessHandler.java +++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomLoginSuccessHandler.java @@ -7,8 +7,8 @@ import org.springframework.http.HttpStatus; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; public class CustomLoginSuccessHandler implements AuthenticationSuccessHandler { diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomLogoutSuccessHandler.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomLogoutSuccessHandler.java index 620e75fb39..3f8e43f590 100644 --- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomLogoutSuccessHandler.java +++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomLogoutSuccessHandler.java @@ -5,15 +5,14 @@ import org.springframework.http.HttpStatus; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; public class CustomLogoutSuccessHandler implements LogoutSuccessHandler { @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) - throws IOException, ServletException { + throws IOException { response.setStatus(HttpStatus.OK.value()); response.sendRedirect(request.getContextPath() + "/index"); diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomUserDetailsService.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomUserDetailsService.java index a0eb4d4bde..52f8fe315b 100644 --- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomUserDetailsService.java +++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomUserDetailsService.java @@ -17,7 +17,7 @@ import org.springframework.stereotype.Service; import java.util.Collection; import java.util.HashSet; -@Service() +@Service public class CustomUserDetailsService implements UserDetailsService { Logger log = LoggerFactory.getLogger(CustomUserDetailsService.class); From 750cc9b7486e32350e8bfe14da15cc888cc7c461 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Sun, 24 Dec 2023 15:02:39 +0100 Subject: [PATCH 285/294] JAVA-29283 | added missing code for article (#15459) --- persistence-modules/jooq/pom.xml | 16 +++- .../jooq/CodeGenerationIntegrationTest.java | 75 +++++++++++++++++++ ...LiveTest.java => CrudIntegrationTest.java} | 2 +- .../jooq/src/test/resources/jooq-config.xml | 26 +++++++ 4 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 persistence-modules/jooq/src/test/java/com/baeldung/jooq/CodeGenerationIntegrationTest.java rename persistence-modules/jooq/src/test/java/com/baeldung/jooq/{CrudLiveTest.java => CrudIntegrationTest.java} (99%) create mode 100644 persistence-modules/jooq/src/test/resources/jooq-config.xml diff --git a/persistence-modules/jooq/pom.xml b/persistence-modules/jooq/pom.xml index c6de8e3d40..d0f1b733a4 100644 --- a/persistence-modules/jooq/pom.xml +++ b/persistence-modules/jooq/pom.xml @@ -31,20 +31,34 @@ jooq-codegen ${jooq.version} + + + + commons-io + commons-io + 2.15.1 + test + + org.postgresql postgresql ${postgresql.version} + runtime com.h2database h2 ${h2.version} + runtime - 3.18.7 + 17 + 17 + 17 + 3.19.0 \ No newline at end of file diff --git a/persistence-modules/jooq/src/test/java/com/baeldung/jooq/CodeGenerationIntegrationTest.java b/persistence-modules/jooq/src/test/java/com/baeldung/jooq/CodeGenerationIntegrationTest.java new file mode 100644 index 0000000000..3ca0919eaa --- /dev/null +++ b/persistence-modules/jooq/src/test/java/com/baeldung/jooq/CodeGenerationIntegrationTest.java @@ -0,0 +1,75 @@ +package com.baeldung.jooq; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.nio.file.Files; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +import org.jooq.DSLContext; +import org.jooq.SQLDialect; +import org.jooq.codegen.GenerationTool; +import org.jooq.impl.DSL; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.baeldung.jooq.model.tables.Article; +import com.baeldung.jooq.model.tables.Author; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import org.apache.commons.io.FileUtils; + +public class CodeGenerationIntegrationTest { + + static DSLContext context; + + @BeforeClass + public static void setup() throws SQLException { + Connection conn = DriverManager.getConnection("jdbc:h2:mem:tes;INIT=CREATE SCHEMA IF NOT EXISTS \"public\""); + context = DSL.using(conn, SQLDialect.H2); + + context.createTable(Author.AUTHOR) + .columns( + Author.AUTHOR.ID, + Author.AUTHOR.FIRST_NAME, + Author.AUTHOR.LAST_NAME, + Author.AUTHOR.AGE + ) + .execute(); + context.createTable(Article.ARTICLE) + .columns( + Article.ARTICLE.ID, + Article.ARTICLE.TITLE, + Article.ARTICLE.DESCRIPTION, + Article.ARTICLE.AUTHOR_ID + ) + .execute(); + } + + @AfterClass + public static void cleanup() throws IOException { + File generatedDirectory = new File("src/main/java/com/baeldung/jooq/generated"); + FileUtils.deleteDirectory(generatedDirectory); + } + + @Test + public void testClassGenerationFromExistingDatabase() throws Exception { + + File generatedDirectory = new File("src/main/java/com/baeldung/jooq/generated"); + + assertFalse(generatedDirectory.exists()); + + URL jooqConfigURL = getClass().getClassLoader().getResource("jooq-config.xml"); + assertNotNull(jooqConfigURL); + File file = new File(jooqConfigURL.getFile()); + GenerationTool.generate(Files.readString(file.toPath())); + + assertTrue(generatedDirectory.exists()); + } +} diff --git a/persistence-modules/jooq/src/test/java/com/baeldung/jooq/CrudLiveTest.java b/persistence-modules/jooq/src/test/java/com/baeldung/jooq/CrudIntegrationTest.java similarity index 99% rename from persistence-modules/jooq/src/test/java/com/baeldung/jooq/CrudLiveTest.java rename to persistence-modules/jooq/src/test/java/com/baeldung/jooq/CrudIntegrationTest.java index d41344c08e..0d8df27ccc 100644 --- a/persistence-modules/jooq/src/test/java/com/baeldung/jooq/CrudLiveTest.java +++ b/persistence-modules/jooq/src/test/java/com/baeldung/jooq/CrudIntegrationTest.java @@ -28,7 +28,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -public class CrudLiveTest { +public class CrudIntegrationTest { static DSLContext context; diff --git a/persistence-modules/jooq/src/test/resources/jooq-config.xml b/persistence-modules/jooq/src/test/resources/jooq-config.xml new file mode 100644 index 0000000000..2eed2fbe80 --- /dev/null +++ b/persistence-modules/jooq/src/test/resources/jooq-config.xml @@ -0,0 +1,26 @@ + + + + + org.h2.Driver + jdbc:h2:mem:tes + + + + + + org.jooq.codegen.JavaGenerator + + + org.jooq.meta.h2.H2Database + public + .* + + + + + com.baeldung.jooq.generated + src/main/java + + + \ No newline at end of file From a5b9e8fde25e6025d74daa19e58a0a434f9399f7 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Sun, 24 Dec 2023 17:07:57 +0200 Subject: [PATCH 286/294] JAVA-29329 Upgrade spring-security-web-rest-basic-auth (#15457) Co-authored-by: timis1 --- .../pom.xml | 27 ++++++------------- .../MyBasicAuthenticationEntryPoint.java | 5 ++-- ...entsClientHttpRequestFactoryBasicAuth.java | 14 +++++----- .../baeldung/client/RestTemplateFactory.java | 4 +-- .../com/baeldung/filter/CustomFilter.java | 8 +++--- .../CustomWebSecurityConfigurerAdapter.java | 12 +++------ .../InMemoryAuthWebSecurityConfigurer.java | 13 +++++---- ...InMemoryNoOpAuthWebSecurityConfigurer.java | 11 +++----- .../PasswordStorageWebSecurityConfigurer.java | 2 +- ...uestAwareAuthenticationSuccessHandler.java | 6 ++--- .../RestAuthenticationEntryPoint.java | 7 +++-- .../web/controller/BarController.java | 5 ++-- .../main/java/com/baeldung/web/dto/Bar.java | 2 +- .../main/java/com/baeldung/web/dto/Foo.java | 2 +- .../src/main/resources/webSecurityConfig.xml | 3 ++- 15 files changed, 51 insertions(+), 70 deletions(-) diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/pom.xml b/spring-security-modules/spring-security-web-rest-basic-auth/pom.xml index 9a3b21af92..1b63860b92 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/pom.xml +++ b/spring-security-modules/spring-security-web-rest-basic-auth/pom.xml @@ -10,8 +10,9 @@ com.baeldung - spring-security-modules + parent-boot-3 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -92,8 +93,8 @@ - org.apache.httpcomponents - httpclient + org.apache.httpcomponents.client5 + httpclient5 commons-logging @@ -101,19 +102,6 @@ - - - javax.servlet - javax.servlet-api - ${javax.servlet-api.version} - provided - - - javax.servlet - jstl - ${jstl.version} - runtime - com.google.guava @@ -127,9 +115,9 @@ test - javax.xml.bind - jaxb-api - ${jaxb-api.version} + jakarta.xml.bind + jakarta.xml.bind-api + 4.0.1 @@ -230,6 +218,7 @@ 4.5.8 1.6.1 + com.baeldung.inmemory.InMemoryAuthApplication \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java index 07344819c0..01d0c83bb5 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java +++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java @@ -4,9 +4,8 @@ import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint; import org.springframework.stereotype.Component; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java index 81f82a2c1c..c903fe12bb 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java +++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java @@ -2,13 +2,13 @@ package com.baeldung.client; import java.net.URI; -import org.apache.http.HttpHost; -import org.apache.http.client.AuthCache; -import org.apache.http.client.protocol.HttpClientContext; -import org.apache.http.impl.auth.BasicScheme; -import org.apache.http.impl.client.BasicAuthCache; -import org.apache.http.protocol.BasicHttpContext; -import org.apache.http.protocol.HttpContext; +import org.apache.hc.client5.http.auth.AuthCache; +import org.apache.hc.client5.http.impl.auth.BasicAuthCache; +import org.apache.hc.client5.http.impl.auth.BasicScheme; +import org.apache.hc.client5.http.protocol.HttpClientContext; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.protocol.BasicHttpContext; +import org.apache.hc.core5.http.protocol.HttpContext; import org.springframework.http.HttpMethod; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/client/RestTemplateFactory.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/client/RestTemplateFactory.java index aac4f8cebd..425708abc8 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/client/RestTemplateFactory.java +++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/client/RestTemplateFactory.java @@ -1,6 +1,6 @@ package com.baeldung.client; -import org.apache.http.HttpHost; +import org.apache.hc.core5.http.HttpHost; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.http.client.ClientHttpRequestFactory; @@ -35,7 +35,7 @@ public class RestTemplateFactory implements FactoryBean, Initializ @Override public void afterPropertiesSet() { - HttpHost host = new HttpHost("localhost", 8082, "http"); + HttpHost host = new HttpHost( "http", "localhost", 8082); final ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactoryBasicAuth(host); restTemplate = new RestTemplate(requestFactory); restTemplate.getInterceptors().add(new BasicAuthenticationInterceptor("user1", "user1Pass")); diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomFilter.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomFilter.java index 6bb12610fa..a9509ddafa 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomFilter.java +++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomFilter.java @@ -2,10 +2,10 @@ package com.baeldung.filter; import org.springframework.web.filter.GenericFilterBean; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import java.io.IOException; public class CustomFilter extends GenericFilterBean { diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java index 5714b2fb3e..ce50448605 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java +++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java @@ -30,14 +30,10 @@ public class CustomWebSecurityConfigurerAdapter { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http.authorizeRequests() - .antMatchers("/securityNone") - .permitAll() - .anyRequest() - .authenticated() - .and() - .httpBasic() - .authenticationEntryPoint(authenticationEntryPoint); + http.authorizeHttpRequests(expressionInterceptUrlRegistry -> + expressionInterceptUrlRegistry.requestMatchers("/securityNone").permitAll() + .anyRequest().authenticated()) + .httpBasic(httpSecurityHttpBasicConfigurer -> httpSecurityHttpBasicConfigurer.authenticationEntryPoint(authenticationEntryPoint)); http.addFilterAfter(new CustomFilter(), BasicAuthenticationFilter.class); return http.build(); } diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/inmemory/InMemoryAuthWebSecurityConfigurer.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/inmemory/InMemoryAuthWebSecurityConfigurer.java index 839fa15734..5af2a68ac3 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/inmemory/InMemoryAuthWebSecurityConfigurer.java +++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/inmemory/InMemoryAuthWebSecurityConfigurer.java @@ -2,6 +2,7 @@ package com.baeldung.inmemory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; @@ -25,13 +26,11 @@ public class InMemoryAuthWebSecurityConfigurer { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http.authorizeRequests() - .antMatchers("/private/**") - .authenticated() - .antMatchers("/public/**") - .permitAll() - .and() - .httpBasic(); + http.authorizeHttpRequests(authorizationManagerRequestMatcherRegistry -> + authorizationManagerRequestMatcherRegistry.requestMatchers("/private/**").authenticated() + .requestMatchers("/public/**").permitAll() + ) + .httpBasic(Customizer.withDefaults()); return http.build(); } diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/inmemory/InMemoryNoOpAuthWebSecurityConfigurer.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/inmemory/InMemoryNoOpAuthWebSecurityConfigurer.java index 72d3ef79d7..ba86d14aa5 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/inmemory/InMemoryNoOpAuthWebSecurityConfigurer.java +++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/inmemory/InMemoryNoOpAuthWebSecurityConfigurer.java @@ -1,6 +1,7 @@ package com.baeldung.inmemory; import org.springframework.context.annotation.Bean; +import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; @@ -21,13 +22,9 @@ public class InMemoryNoOpAuthWebSecurityConfigurer { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http.authorizeRequests() - .antMatchers("/private/**") - .authenticated() - .antMatchers("/public/**") - .permitAll() - .and() - .httpBasic(); + http.authorizeHttpRequests(authorizationManagerRequestMatcherRegistry -> authorizationManagerRequestMatcherRegistry.requestMatchers("/private/**").authenticated() + .requestMatchers("/public/**").permitAll()) + .httpBasic(Customizer.withDefaults()); return http.build(); } } diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/passwordstorage/PasswordStorageWebSecurityConfigurer.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/passwordstorage/PasswordStorageWebSecurityConfigurer.java index a1c6e1ee76..5892762ac9 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/passwordstorage/PasswordStorageWebSecurityConfigurer.java +++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/passwordstorage/PasswordStorageWebSecurityConfigurer.java @@ -46,7 +46,7 @@ public class PasswordStorageWebSecurityConfigurer { PasswordEncoder defaultEncoder = new StandardPasswordEncoder(); Map encoders = new HashMap<>(); encoders.put("bcrypt", new BCryptPasswordEncoder()); - encoders.put("scrypt", new SCryptPasswordEncoder()); + encoders.put("scrypt", new SCryptPasswordEncoder(1, 1, 1, 1, 10)); encoders.put("noop", NoOpPasswordEncoder.getInstance()); DelegatingPasswordEncoder passwordEncoder = new DelegatingPasswordEncoder("bcrypt", encoders); diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java index 7dc53e3e1e..d53aa5bdfe 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java +++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java @@ -2,9 +2,9 @@ package com.baeldung.security; import java.io.IOException; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java index 1ae89adb89..cf7e9ee212 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java +++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java @@ -2,8 +2,8 @@ package com.baeldung.security; import java.io.IOException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; @@ -16,8 +16,7 @@ import org.springframework.stereotype.Component; public final class RestAuthenticationEntryPoint implements AuthenticationEntryPoint { @Override - public void commence(final HttpServletRequest request, final HttpServletResponse response, final AuthenticationException authException) throws IOException { + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException { response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); } - } \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/controller/BarController.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/controller/BarController.java index 6f7dc91e7e..0fd0bdac4f 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/controller/BarController.java +++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/controller/BarController.java @@ -2,8 +2,9 @@ package com.baeldung.web.controller; import java.nio.charset.Charset; -import org.apache.commons.codec.binary.Base64; import com.baeldung.web.dto.Bar; + +import org.apache.hc.client5.http.utils.Base64; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.http.HttpHeaders; @@ -35,7 +36,7 @@ public class BarController { public HttpHeaders createHeaders(String username, String password){ return new HttpHeaders() {{ String auth = username + ":" + password; - byte[] encodedAuth = Base64.encodeBase64( + byte[] encodedAuth = Base64.encodeBase64( auth.getBytes(Charset.forName("US-ASCII")) ); String authHeader = "Basic " + new String( encodedAuth ); set( "Authorization", authHeader ); diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/dto/Bar.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/dto/Bar.java index eb139b0ec1..1bb7476669 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/dto/Bar.java +++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/dto/Bar.java @@ -2,7 +2,7 @@ package com.baeldung.web.dto; import java.io.Serializable; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Bar implements Serializable { diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/dto/Foo.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/dto/Foo.java index 23cfab132d..f904be0ad9 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/dto/Foo.java +++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/dto/Foo.java @@ -2,7 +2,7 @@ package com.baeldung.web.dto; import java.io.Serializable; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Foo implements Serializable { diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/resources/webSecurityConfig.xml b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/resources/webSecurityConfig.xml index 2ff9a1de15..d3d47579de 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/resources/webSecurityConfig.xml +++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/resources/webSecurityConfig.xml @@ -11,6 +11,7 @@ + @@ -22,7 +23,7 @@ - + \ No newline at end of file From 11417d3c0d9873a46248ed4a399d1178f352650a Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Sun, 24 Dec 2023 22:14:02 +0200 Subject: [PATCH 287/294] JAVA-27537 Upgrade spring-soap to Spring Boot 3 (#15438) --- spring-soap/pom.xml | 16 ++++++---------- .../baeldung/springsoap/CountryRepository.java | 2 +- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/spring-soap/pom.xml b/spring-soap/pom.xml index c796b08e9a..d1dff51a3e 100644 --- a/spring-soap/pom.xml +++ b/spring-soap/pom.xml @@ -9,9 +9,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-3 @@ -42,10 +42,6 @@ jaxb-runtime - - javax.xml.bind - jaxb-api - @@ -77,9 +73,9 @@ - org.jvnet.jaxb2.maven2 - maven-jaxb2-plugin - ${maven-jaxb2-plugin.version} + org.jvnet.jaxb + jaxb-maven-plugin + ${jaxb-maven-plugin.version} @@ -103,7 +99,7 @@ 4.0.0 + 4.0.0 3.1.0 - 0.15.3 \ No newline at end of file diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/CountryRepository.java b/spring-soap/src/main/java/com/baeldung/springsoap/CountryRepository.java index 183027cdb6..3688854f98 100644 --- a/spring-soap/src/main/java/com/baeldung/springsoap/CountryRepository.java +++ b/spring-soap/src/main/java/com/baeldung/springsoap/CountryRepository.java @@ -3,7 +3,7 @@ package com.baeldung.springsoap; import java.util.HashMap; import java.util.Map; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.springframework.stereotype.Component; import org.springframework.util.Assert; From 8fcec3fcdafbb65bedb48c699a30d40935cacb0d Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Mon, 25 Dec 2023 13:08:42 +0200 Subject: [PATCH 288/294] [JAVA-28936] Upgraded spring-data-jdbc to spring-boot-3 (#15437) * [JAVA-28936] --- persistence-modules/spring-data-jdbc/pom.xml | 8 ++++++-- .../springdatajdbcintro/repository/PersonRepository.java | 1 - .../baeldung/springmultipledatasources/todos/Todo.java | 8 ++++---- .../baeldung/springmultipledatasources/topics/Topic.java | 8 ++++---- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/persistence-modules/spring-data-jdbc/pom.xml b/persistence-modules/spring-data-jdbc/pom.xml index 630fe141b3..9128c70b98 100644 --- a/persistence-modules/spring-data-jdbc/pom.xml +++ b/persistence-modules/spring-data-jdbc/pom.xml @@ -7,9 +7,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-3 @@ -36,4 +36,8 @@ + + true + + \ No newline at end of file diff --git a/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springdatajdbcintro/repository/PersonRepository.java b/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springdatajdbcintro/repository/PersonRepository.java index ceb7a968a4..b2f026fa0c 100644 --- a/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springdatajdbcintro/repository/PersonRepository.java +++ b/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springdatajdbcintro/repository/PersonRepository.java @@ -3,7 +3,6 @@ package com.baeldung.springdatajdbcintro.repository; import com.baeldung.springdatajdbcintro.entity.Person; import org.springframework.data.jdbc.repository.query.Modifying; import org.springframework.data.jdbc.repository.query.Query; -import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; diff --git a/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springmultipledatasources/todos/Todo.java b/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springmultipledatasources/todos/Todo.java index 56f513027b..1dbe75d91f 100644 --- a/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springmultipledatasources/todos/Todo.java +++ b/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springmultipledatasources/todos/Todo.java @@ -1,9 +1,9 @@ package com.baeldung.springmultipledatasources.todos; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; @Entity public class Todo { diff --git a/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springmultipledatasources/topics/Topic.java b/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springmultipledatasources/topics/Topic.java index 390300ff1a..49b33d9b96 100644 --- a/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springmultipledatasources/topics/Topic.java +++ b/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springmultipledatasources/topics/Topic.java @@ -1,9 +1,9 @@ package com.baeldung.springmultipledatasources.topics; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; @Entity public class Topic { From 0e41d622ada85b73aa2220cf162f50ecba1e5db9 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Mon, 25 Dec 2023 17:10:07 +0100 Subject: [PATCH 289/294] JAVA-28932 Upgrade flyway-repair to Spring boot3 migration --- persistence-modules/flyway-repair/pom.xml | 9 +++-- .../test/java/FlywayAppIntegrationTest.java | 38 +++++++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 persistence-modules/flyway-repair/src/test/java/FlywayAppIntegrationTest.java diff --git a/persistence-modules/flyway-repair/pom.xml b/persistence-modules/flyway-repair/pom.xml index 2cae31c8a6..f7fa4f4d5e 100644 --- a/persistence-modules/flyway-repair/pom.xml +++ b/persistence-modules/flyway-repair/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-3 @@ -74,7 +74,10 @@ src/main/resources/application-${spring-boot.run.profiles}.properties - 10.2.0 + 10.4.0 + 17 + 17 + 17 \ No newline at end of file diff --git a/persistence-modules/flyway-repair/src/test/java/FlywayAppIntegrationTest.java b/persistence-modules/flyway-repair/src/test/java/FlywayAppIntegrationTest.java new file mode 100644 index 0000000000..e2280ac2e4 --- /dev/null +++ b/persistence-modules/flyway-repair/src/test/java/FlywayAppIntegrationTest.java @@ -0,0 +1,38 @@ +import java.sql.DatabaseMetaData; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Set; + +import javax.sql.DataSource; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.flywaycallbacks.FlywayApplication; + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = { FlywayApplication.class }) +public class FlywayAppIntegrationTest { + + @Autowired + private DataSource dataSource; + + @Test + public void testAllMigrationsExecuted() throws SQLException { + DatabaseMetaData metadata = dataSource.getConnection() + .getMetaData(); + ResultSet resultSet = metadata.getTables(null, null, null, new String[] { "TABLE" }); + Set tables = Set.of("TABLE_ONE", "TABLE_TWO", "TABLE_THREE", "TABLE_FOUR"); + int migrations = 0; + while (resultSet.next()) { + if (tables.contains(resultSet.getString("TABLE_NAME"))) { + migrations++; + } + } + Assert.assertEquals(migrations, 4); + } +} From c75c95205d14ffb75560402e2b1ee18555dfcbfe Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Tue, 26 Dec 2023 01:56:04 +0200 Subject: [PATCH 290/294] JAVA-26077 Build default-jdk9-and-above and integration-jdk9-and-above profiles on JDK 21 (#15425) Co-authored-by: timis1 --- aws-modules/aws-reactive/pom.xml | 1 - testing-modules/gatling-java/pom.xml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/aws-modules/aws-reactive/pom.xml b/aws-modules/aws-reactive/pom.xml index 965ce8fdcf..e36a2d1a46 100644 --- a/aws-modules/aws-reactive/pom.xml +++ b/aws-modules/aws-reactive/pom.xml @@ -94,7 +94,6 @@ 2.2.1.RELEASE 2.17.283 - 1.18.20 3.6.0 diff --git a/testing-modules/gatling-java/pom.xml b/testing-modules/gatling-java/pom.xml index 54dee1fd88..d28876b42c 100644 --- a/testing-modules/gatling-java/pom.xml +++ b/testing-modules/gatling-java/pom.xml @@ -33,7 +33,7 @@ org.projectlombok lombok - 1.18.24 + ${lombok.version} provided From b83af82bce57cd26b85080c7464ca43320e981b1 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 26 Dec 2023 06:42:20 +0200 Subject: [PATCH 291/294] [JAVA-29410] (#15485) * [JAVA-29410] * [JAVA-29410] --- xml-2/README.md | 2 ++ .../src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java | 0 {xml => xml-2}/src/main/resources/xml2csv/data.xml | 0 {xml => xml-2}/src/main/resources/xml2csv/style.xsl | 0 .../java/com/baeldung/xml/xml2csv/Xml2CsvExampleUnitTest.java | 0 xml/README.md | 2 +- 6 files changed, 3 insertions(+), 1 deletion(-) rename {xml => xml-2}/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java (100%) rename {xml => xml-2}/src/main/resources/xml2csv/data.xml (100%) rename {xml => xml-2}/src/main/resources/xml2csv/style.xsl (100%) rename {xml => xml-2}/src/test/java/com/baeldung/xml/xml2csv/Xml2CsvExampleUnitTest.java (100%) diff --git a/xml-2/README.md b/xml-2/README.md index a6762f2840..1075f34e1f 100644 --- a/xml-2/README.md +++ b/xml-2/README.md @@ -10,3 +10,5 @@ This module contains articles about eXtensible Markup Language (XML) - [Convert an XML Object to a String in Java](https://www.baeldung.com/java-convert-xml-object-string) - [Convert String Containing XML to org.w3c.dom.Document](https://www.baeldung.com/java-convert-string-xml-dom) - [How to Parse XML to HashMap in Java](https://www.baeldung.com/java-xml-read-into-hashmap) +- [Convert an XML File to CSV File](https://www.baeldung.com/java-convert-xml-csv) +- - More articles: [[prev -->]](../xml) \ No newline at end of file diff --git a/xml/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java b/xml-2/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java similarity index 100% rename from xml/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java rename to xml-2/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java diff --git a/xml/src/main/resources/xml2csv/data.xml b/xml-2/src/main/resources/xml2csv/data.xml similarity index 100% rename from xml/src/main/resources/xml2csv/data.xml rename to xml-2/src/main/resources/xml2csv/data.xml diff --git a/xml/src/main/resources/xml2csv/style.xsl b/xml-2/src/main/resources/xml2csv/style.xsl similarity index 100% rename from xml/src/main/resources/xml2csv/style.xsl rename to xml-2/src/main/resources/xml2csv/style.xsl diff --git a/xml/src/test/java/com/baeldung/xml/xml2csv/Xml2CsvExampleUnitTest.java b/xml-2/src/test/java/com/baeldung/xml/xml2csv/Xml2CsvExampleUnitTest.java similarity index 100% rename from xml/src/test/java/com/baeldung/xml/xml2csv/Xml2CsvExampleUnitTest.java rename to xml-2/src/test/java/com/baeldung/xml/xml2csv/Xml2CsvExampleUnitTest.java diff --git a/xml/README.md b/xml/README.md index 596ddc14aa..be12640252 100644 --- a/xml/README.md +++ b/xml/README.md @@ -13,4 +13,4 @@ This module contains articles about eXtensible Markup Language (XML) - [Parsing an XML File Using StAX](https://www.baeldung.com/java-stax) - [Parsing an XML File Using SAX Parser](https://www.baeldung.com/java-sax-parser) - [Remove HTML Tags Using Java](https://www.baeldung.com/java-remove-html-tags) -- [Convert an XML File to CSV File](https://www.baeldung.com/java-convert-xml-csv) +- More articles: [[next -->]](../xml-2) From 21347e6cf2c2a944f49bffc181aec76ba762975d Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 26 Dec 2023 06:47:23 +0200 Subject: [PATCH 292/294] [JAVA-29409] (#15483) --- .../core-java-streams-3/README.md | 2 +- .../core-java-streams-4/README.md | 1 + .../core-java-streams-5/README.md | 2 +- .../core-java-streams-maps/README.md | 1 + .../StreamToMapAndMultiMapUnitTest.java | 107 ++++++++++++++++++ 5 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 core-java-modules/core-java-streams-maps/src/test/java/com/baeldung/streams/streamtomapandmultimap/StreamToMapAndMultiMapUnitTest.java diff --git a/core-java-modules/core-java-streams-3/README.md b/core-java-modules/core-java-streams-3/README.md index 70d9e68a5e..45da963eb3 100644 --- a/core-java-modules/core-java-streams-3/README.md +++ b/core-java-modules/core-java-streams-3/README.md @@ -11,4 +11,4 @@ This module contains articles about the Stream API in Java. - [Should We Close a Java Stream?](https://www.baeldung.com/java-stream-close) - [Returning Stream vs. Collection](https://www.baeldung.com/java-return-stream-collection) - [Convert a Java Enumeration Into a Stream](https://www.baeldung.com/java-enumeration-to-stream) -- More articles: [[<-- prev>]](/../core-java-streams-2) +- More articles: [[<-- prev>]](/../core-java-streams-2) [[next -->]](/../core-java-streams-4) diff --git a/core-java-modules/core-java-streams-4/README.md b/core-java-modules/core-java-streams-4/README.md index c6717ec5fe..554649fdaa 100644 --- a/core-java-modules/core-java-streams-4/README.md +++ b/core-java-modules/core-java-streams-4/README.md @@ -10,3 +10,4 @@ - [Understanding the Difference Between Stream.of() and IntStream.range()](https://www.baeldung.com/java-stream-of-and-intstream-range) - [Check if Object Is an Array in Java](https://www.baeldung.com/java-check-if-object-is-an-array) - [Mapping an Array of Integers to Strings Using Java Streams](https://www.baeldung.com/java-stream-integer-array-to-strings) +- More articles: [[<-- prev>]](/../core-java-streams-3) [[next -->]](/../core-java-streams-5) diff --git a/core-java-modules/core-java-streams-5/README.md b/core-java-modules/core-java-streams-5/README.md index 41fcb129df..6e160e68ad 100644 --- a/core-java-modules/core-java-streams-5/README.md +++ b/core-java-modules/core-java-streams-5/README.md @@ -6,7 +6,7 @@ - [Partition a Stream in Java](https://www.baeldung.com/java-partition-stream) - [Taking Every N-th Element from Finite and Infinite Streams in Java](https://www.baeldung.com/java-nth-element-finite-infinite-streams) - [Modifying Objects Within Stream While Iterating](https://www.baeldung.com/java-stream-modify-objects-during-iteration) -- [Convert a Stream into a Map or Multimap in Java](https://www.baeldung.com/java-convert-stream-map-multimap) - [How to Avoid NoSuchElementException in Stream API](https://www.baeldung.com/java-streams-api-avoid-nosuchelementexception) - [Get Index of First Element Matching Boolean Using Java Streams](https://www.baeldung.com/java-streams-find-first-match-index) - [Handling NullPointerException in findFirst() When the First Element Is Null](https://www.baeldung.com/java-handle-nullpointerexception-findfirst-first-null) +- More articles: [[<-- prev>]](/../core-java-streams-4) diff --git a/core-java-modules/core-java-streams-maps/README.md b/core-java-modules/core-java-streams-maps/README.md index f9f7dffad9..8f311d91a5 100644 --- a/core-java-modules/core-java-streams-maps/README.md +++ b/core-java-modules/core-java-streams-maps/README.md @@ -1,2 +1,3 @@ ## Relevant Articles: - [Handle Duplicate Keys When Producing Map Using Java Stream](https://www.baeldung.com/java-duplicate-keys-when-producing-map-using-stream) +- [Convert a Stream into a Map or Multimap in Java](https://www.baeldung.com/java-convert-stream-map-multimap) \ No newline at end of file diff --git a/core-java-modules/core-java-streams-maps/src/test/java/com/baeldung/streams/streamtomapandmultimap/StreamToMapAndMultiMapUnitTest.java b/core-java-modules/core-java-streams-maps/src/test/java/com/baeldung/streams/streamtomapandmultimap/StreamToMapAndMultiMapUnitTest.java new file mode 100644 index 0000000000..6e8c26a76e --- /dev/null +++ b/core-java-modules/core-java-streams-maps/src/test/java/com/baeldung/streams/streamtomapandmultimap/StreamToMapAndMultiMapUnitTest.java @@ -0,0 +1,107 @@ +package com.baeldung.streams.streamtomapandmultimap; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.junit.Test; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ListMultimap; + +public class StreamToMapAndMultiMapUnitTest { + @Test + public void givenStringStream_whenConvertingToMapWithMerge_thenExpectedMapIsGenerated() { + Stream stringStream = Stream.of("one", "two", "three", "two"); + + Map mergedMap = stringStream.collect( + Collectors.toMap(s -> s, s -> s, (s1, s2) -> s1 + ", " + s2) + ); + + // Define the expected map + Map expectedMap = Map.of( + "one", "one", + "two", "two, two", + "three", "three" + ); + + assertEquals(expectedMap, mergedMap); + } + + @Test + public void givenStringStream_whenConvertingToMultimap_thenExpectedMultimapIsGenerated() { + Stream stringStream = Stream.of("one", "two", "three", "two"); + + ListMultimap multimap = stringStream.collect( + ArrayListMultimap::create, + (map, element) -> map.put(element, element), + ArrayListMultimap::putAll + ); + + ListMultimap expectedMultimap = ArrayListMultimap.create(); + expectedMultimap.put("one", "one"); + expectedMultimap.put("two", "two"); + expectedMultimap.put("two", "two"); + expectedMultimap.put("three", "three"); + + assertEquals(expectedMultimap, multimap); + } + + @Test + public void givenStringStream_whenConvertingToMultimapWithStreamReduce_thenExpectedMultimapIsGenerated() { + Stream stringStream = Stream.of("one", "two", "three", "two"); + + Map> multimap = stringStream.reduce( + new HashMap<>(), + (map, element) -> { + map.computeIfAbsent(element, k -> new ArrayList<>()).add(element); + return map; + }, + (map1, map2) -> { + map2.forEach((key, value) -> map1.merge(key, value, (list1, list2) -> { + list1.addAll(list2); + return list1; + })); + return map1; + } + ); + + Map> expectedMultimap = new HashMap<>(); + expectedMultimap.put("one", Collections.singletonList("one")); + expectedMultimap.put("two", Arrays.asList("two", "two")); + expectedMultimap.put("three", Collections.singletonList("three")); + + assertEquals(expectedMultimap, multimap); + } + + @Test + public void givenStringStream_whenConvertingToMapWithStreamReduce_thenExpectedMapIsGenerated() { + Stream stringStream = Stream.of("one", "two", "three", "two"); + + Map resultMap = stringStream.reduce( + new HashMap<>(), + (map, element) -> { + map.put(element, element); + return map; + }, + (map1, map2) -> { + map1.putAll(map2); + return map1; + } + ); + + Map expectedMap = new HashMap<>(); + expectedMap.put("one", "one"); + expectedMap.put("two", "two"); + expectedMap.put("three", "three"); + + assertEquals(expectedMap, resultMap); + } +} From 49606ff3a4bbd08c51a11f062150569b210c88a9 Mon Sep 17 00:00:00 2001 From: Amit Pandey Date: Tue, 26 Dec 2023 23:34:31 +0530 Subject: [PATCH 293/294] Upgrade Spring-Data-YugabyteDB to boot 3 (#15453) --- persistence-modules/spring-data-yugabytedb/pom.xml | 8 ++++++-- .../src/main/java/com/baeldung/User.java | 12 ++++++------ .../src/main/resources/application.properties | 2 ++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/persistence-modules/spring-data-yugabytedb/pom.xml b/persistence-modules/spring-data-yugabytedb/pom.xml index d7f7576cfe..ec10275da4 100644 --- a/persistence-modules/spring-data-yugabytedb/pom.xml +++ b/persistence-modules/spring-data-yugabytedb/pom.xml @@ -10,11 +10,15 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-3 + + com.baeldung.Main + + org.springframework.boot diff --git a/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/User.java b/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/User.java index 54bbf2617c..c6c40c6953 100644 --- a/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/User.java +++ b/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/User.java @@ -1,11 +1,11 @@ package com.baeldung; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "users") diff --git a/persistence-modules/spring-data-yugabytedb/src/main/resources/application.properties b/persistence-modules/spring-data-yugabytedb/src/main/resources/application.properties index fdb3d50ec8..19c539ec9d 100644 --- a/persistence-modules/spring-data-yugabytedb/src/main/resources/application.properties +++ b/persistence-modules/spring-data-yugabytedb/src/main/resources/application.properties @@ -2,3 +2,5 @@ spring.datasource.url=jdbc:postgresql://localhost:5433/yugabyte spring.datasource.username=yugabyte spring.datasource.password=yugabyte spring.jpa.hibernate.ddl-auto=create +spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect + From 5ead3608acac00c427c94e4cec00e8c68e9c448f Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 26 Dec 2023 21:15:47 +0200 Subject: [PATCH 294/294] [JAVA-27621] Moved article "Remove Duplicate Values From HashMap in Java" to core-java-collections-maps-3 (#15464) --- core-java-modules/core-java-collections-maps-3/README.md | 3 ++- .../map/removeduplicate/RemoveDuplicateValuesUnitTest.java | 2 +- core-java-modules/core-java-collections-maps-4/README.md | 1 + core-java-modules/core-java-collections-maps-5/README.md | 3 ++- core-java-modules/core-java-collections-maps-6/README.md | 3 ++- 5 files changed, 8 insertions(+), 4 deletions(-) rename core-java-modules/{core-java-collections-maps-6 => core-java-collections-maps-3}/src/test/java/com/baeldung/map/removeduplicate/RemoveDuplicateValuesUnitTest.java (98%) 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 0d07bde8c1..d7b0153a69 100644 --- a/core-java-modules/core-java-collections-maps-3/README.md +++ b/core-java-modules/core-java-collections-maps-3/README.md @@ -10,4 +10,5 @@ This module contains articles about Map data structures in Java. - [Java HashMap Load Factor](https://www.baeldung.com/java-hashmap-load-factor) - [Converting Java Properties to HashMap](https://www.baeldung.com/java-convert-properties-to-hashmap) - [Get Values and Keys as ArrayList From a HashMap](https://www.baeldung.com/java-values-keys-arraylists-hashmap) -- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-2) +- [Remove Duplicate Values From HashMap in Java](https://www.baeldung.com/java-hashmap-delete-duplicates) +- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-2)[[next -->]](/core-java-modules/core-java-collections-maps-4) diff --git a/core-java-modules/core-java-collections-maps-6/src/test/java/com/baeldung/map/removeduplicate/RemoveDuplicateValuesUnitTest.java b/core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/removeduplicate/RemoveDuplicateValuesUnitTest.java similarity index 98% rename from core-java-modules/core-java-collections-maps-6/src/test/java/com/baeldung/map/removeduplicate/RemoveDuplicateValuesUnitTest.java rename to core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/removeduplicate/RemoveDuplicateValuesUnitTest.java index 080bc46289..e1fca2b93a 100644 --- a/core-java-modules/core-java-collections-maps-6/src/test/java/com/baeldung/map/removeduplicate/RemoveDuplicateValuesUnitTest.java +++ b/core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/removeduplicate/RemoveDuplicateValuesUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.map.removeuplicate; +package com.baeldung.map.removeduplicate; import static java.util.stream.Collectors.toMap; import static org.assertj.core.api.Assertions.assertThat; diff --git a/core-java-modules/core-java-collections-maps-4/README.md b/core-java-modules/core-java-collections-maps-4/README.md index 9dd9cbe0d9..cc7c9b77e0 100644 --- a/core-java-modules/core-java-collections-maps-4/README.md +++ b/core-java-modules/core-java-collections-maps-4/README.md @@ -9,3 +9,4 @@ This module contains articles about Map data structures in Java. - [Difference Between Map and HashMap in Java](https://www.baeldung.com/java-map-vs-hashmap) - [How to Create a New Entry in a Map](https://www.baeldung.com/java-map-new-entry) - [Difference Between Map and MultivaluedMap in Java](https://www.baeldung.com/java-map-vs-multivaluedmap) +- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-3)[[next -->]](/core-java-modules/core-java-collections-maps-5) diff --git a/core-java-modules/core-java-collections-maps-5/README.md b/core-java-modules/core-java-collections-maps-5/README.md index e1817c7ba4..b952bbeb2d 100644 --- a/core-java-modules/core-java-collections-maps-5/README.md +++ b/core-java-modules/core-java-collections-maps-5/README.md @@ -10,4 +10,5 @@ - [How to Invert a Map in Java](https://www.baeldung.com/java-invert-map) - [Implementing a Map with Multiple Keys in Java](https://www.baeldung.com/java-multiple-keys-map) - [Difference Between Map.ofEntries() and Map.of()](https://www.baeldung.com/map-ofentries-and-map-of) -- More articles: [[<-- prev]](../core-java-collections-maps-4) +- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-4)[[next -->]](/core-java-modules/core-java-collections-maps-6) + diff --git a/core-java-modules/core-java-collections-maps-6/README.md b/core-java-modules/core-java-collections-maps-6/README.md index f116d0315e..4e03cdee36 100644 --- a/core-java-modules/core-java-collections-maps-6/README.md +++ b/core-java-modules/core-java-collections-maps-6/README.md @@ -7,6 +7,7 @@ - [Converting JsonNode Object to Map](https://www.baeldung.com/jackson-jsonnode-map) - [How to Modify a Key in a HashMap?](https://www.baeldung.com/java-hashmap-modify-key) - [Converting String or String Array to Map in Java](https://www.baeldung.com/java-convert-string-to-map) -- [Remove Duplicate Values From HashMap in Java](https://www.baeldung.com/java-hashmap-delete-duplicates) - [Sorting Java Map in Descending Order](https://www.baeldung.com/java-sort-map-descending) - [Convert HashMap.toString() to HashMap in Java](https://www.baeldung.com/hashmap-from-tostring) +- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-5)[[next -->]](/core-java-modules/core-java-collections-maps-7) +