From d0a56cfbe7d564a539c733b3a0f86fee7e11b580 Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Sun, 29 Jan 2023 01:53:53 +0200 Subject: [PATCH 001/170] initialize arraylist with null or zeros --- .../pom.xml | 32 ++++++++ .../InitializeArrayListWithNullOrZeros.java | 14 ++++ ...alizeArrayListWithNullOrZerosUnitTest.java | 75 +++++++++++++++++++ pom.xml | 1 + 4 files changed, 122 insertions(+) create mode 100644 core-java-modules/core-java-collections-array-list-2/pom.xml create mode 100644 core-java-modules/core-java-collections-array-list-2/src/main/java/com/baeldung/InitializeArrayListWithNullOrZeros.java create mode 100644 core-java-modules/core-java-collections-array-list-2/src/test/java/com/baeldung/InitializeArrayListWithNullOrZerosUnitTest.java diff --git a/core-java-modules/core-java-collections-array-list-2/pom.xml b/core-java-modules/core-java-collections-array-list-2/pom.xml new file mode 100644 index 0000000000..ca29a0d14b --- /dev/null +++ b/core-java-modules/core-java-collections-array-list-2/pom.xml @@ -0,0 +1,32 @@ + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + ../../pom.xml + + 4.0.0 + + core-java-collections-array-list-2 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 9 + 9 + + + + + + + 17 + 17 + + + diff --git a/core-java-modules/core-java-collections-array-list-2/src/main/java/com/baeldung/InitializeArrayListWithNullOrZeros.java b/core-java-modules/core-java-collections-array-list-2/src/main/java/com/baeldung/InitializeArrayListWithNullOrZeros.java new file mode 100644 index 0000000000..60cd18af98 --- /dev/null +++ b/core-java-modules/core-java-collections-array-list-2/src/main/java/com/baeldung/InitializeArrayListWithNullOrZeros.java @@ -0,0 +1,14 @@ +package com.baeldung; + +import java.util.ArrayList; + +public class InitializeArrayListWithNullOrZeros { + + public static void main(String[] args) { + + ArrayList arrayList = new ArrayList<>(); + for (int i = 0; i< 10; i++) { + arrayList.add(null); + } + } +} diff --git a/core-java-modules/core-java-collections-array-list-2/src/test/java/com/baeldung/InitializeArrayListWithNullOrZerosUnitTest.java b/core-java-modules/core-java-collections-array-list-2/src/test/java/com/baeldung/InitializeArrayListWithNullOrZerosUnitTest.java new file mode 100644 index 0000000000..71f8a23690 --- /dev/null +++ b/core-java-modules/core-java-collections-array-list-2/src/test/java/com/baeldung/InitializeArrayListWithNullOrZerosUnitTest.java @@ -0,0 +1,75 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.jupiter.api.Assertions; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + + +public class InitializeArrayListWithNullOrZerosUnitTest { + + @Test + public void whenInitializingListWithNCopies_thenListIsCorrectlyPopulated() { + // when + ArrayList list = IntStream.of(new int[10]) + .boxed() + .collect(Collectors.toCollection(ArrayList::new)); + + // then + Assertions.assertEquals(10, list.size()); + Assertions.assertTrue(list.stream().allMatch(elem -> elem == 0)); + } + + @Test + public void whenInitializingListWithStream_thenListIsCorrectlyPopulated() { + + // when + ArrayList listWithZeros = Stream.generate(() -> 0) + .limit(10).collect(Collectors.toCollection(ArrayList::new)); + + ArrayList listWithNulls = Stream.generate(() -> null) + .limit(10).collect(Collectors.toCollection(ArrayList::new)); + + // then + Assertions.assertEquals(10, listWithZeros.size()); + Assertions.assertTrue(listWithZeros.stream().allMatch(elem -> elem == 0)); + + Assertions.assertEquals(10, listWithNulls.size()); + Assertions.assertTrue(listWithNulls.stream().allMatch(Objects::isNull)); + } + + @Test public void whenInitializingListWithIntStream_thenListIsCorrectlyPopulated() { + // when + ArrayList list = IntStream.of(new int[10]) + .boxed() + .collect(Collectors.toCollection(ArrayList::new)); + + // then + Assertions.assertEquals(10, list.size()); + Assertions.assertTrue(list.stream().allMatch(elem -> elem == 0)); } + + @Test + public void whenInitializingListWithAsList_thenListIsCorrectlyPopulated() { + // when + Integer[] integers = new Integer[10]; + Arrays.fill(integers, 0); + List integerList = new ArrayList<>(Arrays.asList(integers)); + + // then + Assertions.assertEquals(10, integerList.size()); + Assertions.assertTrue(integerList.stream().allMatch(elem -> elem == 0)); + } + + @Test + public void whenInitializingListWithVector_thenListIsCorrectlyPopulated() { + // when + List integerList = new Vector<>() {{setSize(10);}}; + + // then + Assertions.assertEquals(10, integerList.size()); + Assertions.assertTrue(integerList.stream().allMatch(Objects::isNull)); + } +} diff --git a/pom.xml b/pom.xml index 0b19c6eee6..cd3ae35b15 100644 --- a/pom.xml +++ b/pom.xml @@ -1134,6 +1134,7 @@ core-java-modules/core-java-collections-set core-java-modules/core-java-collections-list-4 core-java-modules/core-java-collections-array-list + core-java-modules/core-java-collections-array-list-2 core-java-modules/core-java-collections-maps-4 core-java-modules/core-java-collections-maps-5 core-java-modules/core-java-concurrency-simple From 88f56c6281bc42b1fae5bef3fb8031fa7829f5d4 Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Sun, 29 Jan 2023 19:46:23 +0200 Subject: [PATCH 002/170] configure pom parent --- .../core-java-collections-array-list-2/pom.xml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/core-java-modules/core-java-collections-array-list-2/pom.xml b/core-java-modules/core-java-collections-array-list-2/pom.xml index ca29a0d14b..cc15ba7c6e 100644 --- a/core-java-modules/core-java-collections-array-list-2/pom.xml +++ b/core-java-modules/core-java-collections-array-list-2/pom.xml @@ -2,15 +2,18 @@ - - parent-modules - com.baeldung - 1.0.0-SNAPSHOT - ../../pom.xml - 4.0.0 - core-java-collections-array-list-2 + 0.1.0-SNAPSHOT + core-java-collections-array-list-2 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + From cb3f667a4e7a3da1f28684e51c62c22d5d448a3b Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Sun, 29 Jan 2023 20:34:59 +0200 Subject: [PATCH 003/170] move code --- .../pom.xml | 35 ------------------- .../InitializeArrayListWithNullOrZeros.java | 14 -------- .../InitializeArrayListWithNullOrZeros.java | 15 ++++++++ ...alizeArrayListWithNullOrZerosUnitTest.java | 3 +- 4 files changed, 16 insertions(+), 51 deletions(-) delete mode 100644 core-java-modules/core-java-collections-array-list-2/pom.xml delete mode 100644 core-java-modules/core-java-collections-array-list-2/src/main/java/com/baeldung/InitializeArrayListWithNullOrZeros.java create mode 100644 core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/initializearraylistwithnullorzeros/InitializeArrayListWithNullOrZeros.java rename core-java-modules/{core-java-collections-array-list-2/src/test/java/com/baeldung => core-java-collections-array-list/src/test/java/com/baeldung/initializearraylistwithnullorzeros}/InitializeArrayListWithNullOrZerosUnitTest.java (97%) diff --git a/core-java-modules/core-java-collections-array-list-2/pom.xml b/core-java-modules/core-java-collections-array-list-2/pom.xml deleted file mode 100644 index cc15ba7c6e..0000000000 --- a/core-java-modules/core-java-collections-array-list-2/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - 4.0.0 - core-java-collections-array-list-2 - 0.1.0-SNAPSHOT - core-java-collections-array-list-2 - jar - - - com.baeldung.core-java-modules - core-java-modules - 0.0.1-SNAPSHOT - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 9 - 9 - - - - - - - 17 - 17 - - - diff --git a/core-java-modules/core-java-collections-array-list-2/src/main/java/com/baeldung/InitializeArrayListWithNullOrZeros.java b/core-java-modules/core-java-collections-array-list-2/src/main/java/com/baeldung/InitializeArrayListWithNullOrZeros.java deleted file mode 100644 index 60cd18af98..0000000000 --- a/core-java-modules/core-java-collections-array-list-2/src/main/java/com/baeldung/InitializeArrayListWithNullOrZeros.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung; - -import java.util.ArrayList; - -public class InitializeArrayListWithNullOrZeros { - - public static void main(String[] args) { - - ArrayList arrayList = new ArrayList<>(); - for (int i = 0; i< 10; i++) { - arrayList.add(null); - } - } -} diff --git a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/initializearraylistwithnullorzeros/InitializeArrayListWithNullOrZeros.java b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/initializearraylistwithnullorzeros/InitializeArrayListWithNullOrZeros.java new file mode 100644 index 0000000000..66862791aa --- /dev/null +++ b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/initializearraylistwithnullorzeros/InitializeArrayListWithNullOrZeros.java @@ -0,0 +1,15 @@ +package com.baeldung.initializearraylistwithnullorzeros; + +import java.util.ArrayList; + +public class InitializeArrayListWithNullOrZeros { + + public static void main(String[] args) { + + ArrayList arrayList = new ArrayList<>(); + for (int i = 0; i< 10; i++) { + arrayList.add(null); + } + } +} + diff --git a/core-java-modules/core-java-collections-array-list-2/src/test/java/com/baeldung/InitializeArrayListWithNullOrZerosUnitTest.java b/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/initializearraylistwithnullorzeros/InitializeArrayListWithNullOrZerosUnitTest.java similarity index 97% rename from core-java-modules/core-java-collections-array-list-2/src/test/java/com/baeldung/InitializeArrayListWithNullOrZerosUnitTest.java rename to core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/initializearraylistwithnullorzeros/InitializeArrayListWithNullOrZerosUnitTest.java index 71f8a23690..00987fa198 100644 --- a/core-java-modules/core-java-collections-array-list-2/src/test/java/com/baeldung/InitializeArrayListWithNullOrZerosUnitTest.java +++ b/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/initializearraylistwithnullorzeros/InitializeArrayListWithNullOrZerosUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.initializearraylistwithnullorzeros; import org.junit.Test; import org.junit.jupiter.api.Assertions; @@ -8,7 +8,6 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; - public class InitializeArrayListWithNullOrZerosUnitTest { @Test From 1ba6c00773a5c95a454d380c713eaaf6f57dbb7d Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Sun, 29 Jan 2023 20:38:26 +0200 Subject: [PATCH 004/170] delete module --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index cd3ae35b15..0b19c6eee6 100644 --- a/pom.xml +++ b/pom.xml @@ -1134,7 +1134,6 @@ core-java-modules/core-java-collections-set core-java-modules/core-java-collections-list-4 core-java-modules/core-java-collections-array-list - core-java-modules/core-java-collections-array-list-2 core-java-modules/core-java-collections-maps-4 core-java-modules/core-java-collections-maps-5 core-java-modules/core-java-concurrency-simple From a7e626c07c45b10e9dd129d406a0ab596a8e25d9 Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Mon, 6 Feb 2023 23:24:32 +0200 Subject: [PATCH 005/170] BAEL-6195 --- .../FirstOccurrenceOfAnInteger.java | 16 +++++++ .../FirstOccurrenceOfAnIntegerTests.java | 47 +++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 core-java-modules/core-java-regex-2/src/main/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnInteger.java create mode 100644 core-java-modules/core-java-regex-2/src/test/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnIntegerTests.java diff --git a/core-java-modules/core-java-regex-2/src/main/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnInteger.java b/core-java-modules/core-java-regex-2/src/main/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnInteger.java new file mode 100644 index 0000000000..a8fde1dc16 --- /dev/null +++ b/core-java-modules/core-java-regex-2/src/main/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnInteger.java @@ -0,0 +1,16 @@ +package com.baeldung.firstoccurrenceofaninteger; + +public class FirstOccurrenceOfAnInteger { + + public static Integer findFirstInteger(String s) { + int i = 0; + while (i < s.length() && !Character.isDigit(s.charAt(i))) { + i++; + } + int j = i; + while (j < s.length() && Character.isDigit(s.charAt(j))) { + j++; + } + return Integer.parseInt(s.substring(i, j)); + } +} diff --git a/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnIntegerTests.java b/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnIntegerTests.java new file mode 100644 index 0000000000..54779bab9a --- /dev/null +++ b/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnIntegerTests.java @@ -0,0 +1,47 @@ +package com.baeldung.firstoccurrenceofaninteger; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Assertions; + + +class FirstOccurrenceOfAnIntegerTests { + + @Test + public void whenUsingPatternMatcher_findFirstInteger() { + String s = "ba31dung123"; + Matcher matcher = Pattern.compile("\\d+").matcher(s); + matcher.find(); + int i = Integer.parseInt(matcher.group()); + Assertions.assertEquals(31, i); + } + + @Test + public void whenUsingScanner_findFirstInteger() { + int i = new Scanner("ba31dung123").useDelimiter("\\D+").nextInt(); + Assertions.assertEquals(31, i); + } + + @Test + public void whenUsingSplit_findFirstInteger() { + String str = "ba31dung123"; + List tokens = Arrays.stream(str.split("\\D+")) + .filter(s -> s.length() > 0).collect(Collectors.toList()); + Assertions.assertEquals(31, Integer.parseInt(tokens.get(0))); + } + + @Test + public void whenUsingCustomFunction_findFirstInteger() { + String str = "ba31dung123"; + Integer i = FirstOccurrenceOfAnInteger.findFirstInteger(str); + Assertions.assertEquals(31, i); + } + + +} From e14feb5351d23b9df5f476e0352a4e0383c10bf5 Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Fri, 17 Mar 2023 19:58:29 +0200 Subject: [PATCH 006/170] time-based UUIDs --- core-java-modules/core-java-uuid/pom.xml | 17 +++++++- .../timebaseduuid/JavaUUIDCreator.java | 42 +++++++++++++++++++ .../baeldung/timebaseduuid/UUIDCreator.java | 41 ++++++++++++++++++ 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreator.java create mode 100644 core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreator.java diff --git a/core-java-modules/core-java-uuid/pom.xml b/core-java-modules/core-java-uuid/pom.xml index 7d851292f5..442a266dab 100644 --- a/core-java-modules/core-java-uuid/pom.xml +++ b/core-java-modules/core-java-uuid/pom.xml @@ -25,6 +25,21 @@ log4j-over-slf4j ${org.slf4j.version} + + com.github.f4b6a3 + uuid-creator + 5.2.0 + + + com.fasterxml.uuid + java-uuid-generator + 4.1.0 + + + com.github.f4b6a3 + tsid-creator + 5.2.3 + @@ -143,4 +158,4 @@ 3.0.0-M1 - \ No newline at end of file + diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreator.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreator.java new file mode 100644 index 0000000000..39308c8982 --- /dev/null +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreator.java @@ -0,0 +1,42 @@ +package com.baeldung.timebaseduuid; + +import com.fasterxml.uuid.Generators; +import com.github.f4b6a3.uuid.UuidCreator; + +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + +public class JavaUUIDCreator { + + public static void main(String[] args) throws InterruptedException { + + int threadCount = 128; + int iterationCount = 100_000; + ConcurrentMap uuidMap = new ConcurrentHashMap<>(); + AtomicLong collisionCount = new AtomicLong(); + long startNanos = System.nanoTime(); + CountDownLatch endLatch = new CountDownLatch(threadCount); + + for (long i = 0; i < threadCount; i++) { + final long threadId = i; + new Thread(() -> { + for (long j = 0; j < iterationCount; j++) { + UUID uuid = Generators.timeBasedGenerator().generate(); + Long existingUUID = uuidMap.put(uuid, (threadId * iterationCount) + j); + if(existingUUID != null) { + collisionCount.incrementAndGet(); + } + } + endLatch.countDown(); + }).start(); + } + + endLatch.await(); + System.out.println(threadCount * iterationCount + " UUIDs generated, " + collisionCount + " collisions in " + + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos) + "ms"); + } +} diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreator.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreator.java new file mode 100644 index 0000000000..8695a54bae --- /dev/null +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreator.java @@ -0,0 +1,41 @@ +package com.baeldung.timebaseduuid; + +import com.github.f4b6a3.uuid.UuidCreator; + +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + +public class UUIDCreator { + + public static void main(String[] args) throws InterruptedException { + + int threadCount = 128; + int iterationCount = 100_000; + ConcurrentMap uuidMap = new ConcurrentHashMap<>(); + AtomicLong collisionCount = new AtomicLong(); + long startNanos = System.nanoTime(); + CountDownLatch endLatch = new CountDownLatch(threadCount); + + for (long i = 0; i < threadCount; i++) { + final long threadId = i; + new Thread(() -> { + for (long j = 0; j < iterationCount; j++) { + UUID uuid = UuidCreator.getTimeBased(); + Long existingUUID = uuidMap.put(uuid, (threadId * iterationCount) + j); + if(existingUUID != null) { + collisionCount.incrementAndGet(); + } + } + endLatch.countDown(); + }).start(); + } + + endLatch.await(); + System.out.println(threadCount * iterationCount + " UUIDs generated, " + collisionCount + " collisions in " + + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos) + "ms"); + } +} From a93d82d800d4919c98dd52e19d757114fa5125cd Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Fri, 24 Mar 2023 22:44:22 +0200 Subject: [PATCH 007/170] review --- .../timebaseduuid/JavaUUIDCreator.java | 42 ------------------- .../JavaUUIDCreatorBenchmark.java | 42 +++++++++++++++++++ .../timebaseduuid/JavaUUIDCreatorExample.java | 13 ++++++ ...Creator.java => UUIDCreatorBenchmark.java} | 2 +- .../timebaseduuid/UUIDCreatorExample.java | 13 ++++++ 5 files changed, 69 insertions(+), 43 deletions(-) delete mode 100644 core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreator.java create mode 100644 core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorBenchmark.java create mode 100644 core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorExample.java rename core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/{UUIDCreator.java => UUIDCreatorBenchmark.java} (97%) create mode 100644 core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorExample.java diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreator.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreator.java deleted file mode 100644 index 39308c8982..0000000000 --- a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreator.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.baeldung.timebaseduuid; - -import com.fasterxml.uuid.Generators; -import com.github.f4b6a3.uuid.UuidCreator; - -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicLong; - -public class JavaUUIDCreator { - - public static void main(String[] args) throws InterruptedException { - - int threadCount = 128; - int iterationCount = 100_000; - ConcurrentMap uuidMap = new ConcurrentHashMap<>(); - AtomicLong collisionCount = new AtomicLong(); - long startNanos = System.nanoTime(); - CountDownLatch endLatch = new CountDownLatch(threadCount); - - for (long i = 0; i < threadCount; i++) { - final long threadId = i; - new Thread(() -> { - for (long j = 0; j < iterationCount; j++) { - UUID uuid = Generators.timeBasedGenerator().generate(); - Long existingUUID = uuidMap.put(uuid, (threadId * iterationCount) + j); - if(existingUUID != null) { - collisionCount.incrementAndGet(); - } - } - endLatch.countDown(); - }).start(); - } - - endLatch.await(); - System.out.println(threadCount * iterationCount + " UUIDs generated, " + collisionCount + " collisions in " - + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos) + "ms"); - } -} diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorBenchmark.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorBenchmark.java new file mode 100644 index 0000000000..20b2c127bd --- /dev/null +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorBenchmark.java @@ -0,0 +1,42 @@ +package com.baeldung.timebaseduuid; + +import com.fasterxml.uuid.Generators; + +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + +public class JavaUUIDCreatorBenchmark { + +public static void main(String[] args) throws InterruptedException { + + int threadCount = 128; + int iterationCount = 100_000; + Map uuidMap = new ConcurrentHashMap<>(); + AtomicLong collisionCount = new AtomicLong(); + long startNanos = System.nanoTime(); + CountDownLatch endLatch = new CountDownLatch(threadCount); + + for (long i = 0; i < threadCount; i++) { + long threadId = i; + new Thread(() -> { + for (long j = 0; j < iterationCount; j++) { + UUID uuid = Generators.timeBasedGenerator().generate(); + Long existingUUID = uuidMap.put(uuid, (threadId * iterationCount) + j); + if(existingUUID != null) { + collisionCount.incrementAndGet(); + } + } + endLatch.countDown(); + }).start(); + } + + endLatch.await(); + System.out.println(threadCount * iterationCount + " UUIDs generated, " + collisionCount + " collisions in " + + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos) + "ms"); +} +} + diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorExample.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorExample.java new file mode 100644 index 0000000000..b59d7e236a --- /dev/null +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreatorExample.java @@ -0,0 +1,13 @@ +package com.baeldung.timebaseduuid; + +import com.fasterxml.uuid.Generators; + +public class JavaUUIDCreatorExample { + + public static void main(String[] args) { + System.out.println("UUID Version 1: " + Generators.timeBasedGenerator().generate()); + System.out.println("UUID Version 6: " + Generators.timeBasedReorderedGenerator().generate()); + System.out.println("UUID Version 7: " + Generators.timeBasedEpochGenerator().generate()); + + } +} diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreator.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java similarity index 97% rename from core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreator.java rename to core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java index 8695a54bae..04779c3590 100644 --- a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreator.java +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java @@ -9,7 +9,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; -public class UUIDCreator { +public class UUIDCreatorBenchmark { public static void main(String[] args) throws InterruptedException { diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorExample.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorExample.java new file mode 100644 index 0000000000..fad2f55c93 --- /dev/null +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorExample.java @@ -0,0 +1,13 @@ +package com.baeldung.timebaseduuid; + +import com.github.f4b6a3.uuid.UuidCreator; + +public class UUIDCreatorExample { + + public static void main(String[] args) { + System.out.println("UUID Version 1: " + UuidCreator.getTimeBased()); + System.out.println("UUID Version 6: " + UuidCreator.getTimeOrdered()); + System.out.println("UUID Version 7: " + UuidCreator.getTimeOrderedEpoch()); + } +} + From 63b455ed471157e916997497e38a8f9bf047fa2d Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Fri, 24 Mar 2023 22:46:29 +0200 Subject: [PATCH 008/170] review --- .../com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java index 04779c3590..d93cd73a25 100644 --- a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java @@ -2,6 +2,7 @@ package com.baeldung.timebaseduuid; import com.github.f4b6a3.uuid.UuidCreator; +import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -15,13 +16,13 @@ public class UUIDCreatorBenchmark { int threadCount = 128; int iterationCount = 100_000; - ConcurrentMap uuidMap = new ConcurrentHashMap<>(); + Map uuidMap = new ConcurrentHashMap<>(); AtomicLong collisionCount = new AtomicLong(); long startNanos = System.nanoTime(); CountDownLatch endLatch = new CountDownLatch(threadCount); for (long i = 0; i < threadCount; i++) { - final long threadId = i; + long threadId = i; new Thread(() -> { for (long j = 0; j < iterationCount; j++) { UUID uuid = UuidCreator.getTimeBased(); From 492ff5b88816f5c852e5c41ec1b081b16181c982 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 31 May 2023 23:38:48 +0530 Subject: [PATCH 009/170] JAVA-13721 Removed mockmaker file, not needed with mockito v5+ --- .../mockito/mockfinal/MockFinalsUnitTest.java | 12 ------------ .../mockito-extensions/org.mockito.plugins.MockMaker | 1 - 2 files changed, 13 deletions(-) delete mode 100644 testing-modules/mockito-simple/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/mockfinal/MockFinalsUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/mockfinal/MockFinalsUnitTest.java index 6041ee1a9b..705f2ac7ad 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/mockfinal/MockFinalsUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/mockfinal/MockFinalsUnitTest.java @@ -3,10 +3,8 @@ package com.baeldung.mockito.mockfinal; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static org.mockito.Mockito.withSettings; import org.junit.jupiter.api.Test; -import org.mockito.MockMakers; import com.baeldung.mockito.FinalList; import com.baeldung.mockito.MyList; @@ -30,14 +28,4 @@ class MockFinalsUnitTest { assertThat(mock.size()).isNotEqualTo(1); } - - @Test - public void whenMockFinalMethodMockWorks_withInlineMockMaker() { - MyList myList = new MyList(); - - MyList mock = mock(MyList.class, withSettings().mockMaker(MockMakers.INLINE)); - when(mock.finalMethod()).thenReturn(1); - - assertThat(mock.finalMethod()).isNotEqualTo(myList.finalMethod()); - } } diff --git a/testing-modules/mockito-simple/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/testing-modules/mockito-simple/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker deleted file mode 100644 index ca6ee9cea8..0000000000 --- a/testing-modules/mockito-simple/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker +++ /dev/null @@ -1 +0,0 @@ -mock-maker-inline \ No newline at end of file From c5146ab2c1ad45040dee0b86afb72c8d8c667723 Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Wed, 31 May 2023 22:56:50 +0300 Subject: [PATCH 010/170] BAEL-6024 - Guide to YugabyteDB --- persistence-modules/pom.xml | 1 + .../spring-data-yugabytedb/pom.xml | 55 +++++++++++++++++++ .../src/main/java/com/baeldung/Main.java | 32 +++++++++++ .../src/main/java/com/baeldung/User.java | 44 +++++++++++++++ .../java/com/baeldung/UserRepository.java | 6 ++ .../src/main/resources/application.properties | 4 ++ 6 files changed, 142 insertions(+) create mode 100644 persistence-modules/spring-data-yugabytedb/pom.xml create mode 100644 persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/Main.java create mode 100644 persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/User.java create mode 100644 persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/UserRepository.java create mode 100644 persistence-modules/spring-data-yugabytedb/src/main/resources/application.properties diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index b92fb45e6f..3b2af84cf4 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -109,6 +109,7 @@ spring-mybatis spring-persistence-simple + spring-data-yugabytedb diff --git a/persistence-modules/spring-data-yugabytedb/pom.xml b/persistence-modules/spring-data-yugabytedb/pom.xml new file mode 100644 index 0000000000..a14f0e7114 --- /dev/null +++ b/persistence-modules/spring-data-yugabytedb/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + spring-data-yugabytedb + 1.0 + spring-data-yugabytedb + jar + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.projectlombok + lombok + + + org.springframework + spring-test + + + org.springframework.boot + spring-boot-starter-test + test + + + org.postgresql + postgresql + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + + + diff --git a/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/Main.java b/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/Main.java new file mode 100644 index 0000000000..27b087790a --- /dev/null +++ b/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/Main.java @@ -0,0 +1,32 @@ +package com.baeldung; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Main implements CommandLineRunner { + + @Autowired + private UserRepository userRepository; + + public static void main(String[] args) { + SpringApplication.run(Main.class, args); + } + + @Override + public void run(String... args) throws InterruptedException { + + int iterationCount = 1_000; + int elementsPerIteration = 100; + + for (int i = 0; i < iterationCount; i++) { + for (long j = 0; j < elementsPerIteration; j++) { + User user = new User(); + userRepository.save(user); + } + Thread.sleep(1000); + } + } +} 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 new file mode 100644 index 0000000000..278bc6c9ae --- /dev/null +++ b/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/User.java @@ -0,0 +1,44 @@ +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; + +@Entity +@Table(name = "users") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column + private String name; + + Long getId() { + return id; + } + + void setId(Long id) { + this.id = id; + } + + String getName() { + return name; + } + + void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + '}'; + } +} diff --git a/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/UserRepository.java b/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/UserRepository.java new file mode 100644 index 0000000000..d04047d416 --- /dev/null +++ b/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/UserRepository.java @@ -0,0 +1,6 @@ +package com.baeldung; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserRepository extends JpaRepository { +} diff --git a/persistence-modules/spring-data-yugabytedb/src/main/resources/application.properties b/persistence-modules/spring-data-yugabytedb/src/main/resources/application.properties new file mode 100644 index 0000000000..fdb3d50ec8 --- /dev/null +++ b/persistence-modules/spring-data-yugabytedb/src/main/resources/application.properties @@ -0,0 +1,4 @@ +spring.datasource.url=jdbc:postgresql://localhost:5433/yugabyte +spring.datasource.username=yugabyte +spring.datasource.password=yugabyte +spring.jpa.hibernate.ddl-auto=create From 3229890606aa3ca74e388e254199b35caccda4a4 Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Wed, 31 May 2023 23:00:07 +0300 Subject: [PATCH 011/170] BAEL-6024 - Guide to YugabyteDB --- .../FirstOccurrenceOfAnInteger.java | 16 ------- .../FirstOccurrenceOfAnIntegerTests.java | 47 ------------------- 2 files changed, 63 deletions(-) delete mode 100644 core-java-modules/core-java-regex-2/src/main/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnInteger.java delete mode 100644 core-java-modules/core-java-regex-2/src/test/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnIntegerTests.java diff --git a/core-java-modules/core-java-regex-2/src/main/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnInteger.java b/core-java-modules/core-java-regex-2/src/main/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnInteger.java deleted file mode 100644 index a8fde1dc16..0000000000 --- a/core-java-modules/core-java-regex-2/src/main/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnInteger.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.firstoccurrenceofaninteger; - -public class FirstOccurrenceOfAnInteger { - - public static Integer findFirstInteger(String s) { - int i = 0; - while (i < s.length() && !Character.isDigit(s.charAt(i))) { - i++; - } - int j = i; - while (j < s.length() && Character.isDigit(s.charAt(j))) { - j++; - } - return Integer.parseInt(s.substring(i, j)); - } -} diff --git a/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnIntegerTests.java b/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnIntegerTests.java deleted file mode 100644 index 54779bab9a..0000000000 --- a/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnIntegerTests.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.baeldung.firstoccurrenceofaninteger; - -import java.util.Arrays; -import java.util.List; -import java.util.Scanner; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.Assertions; - - -class FirstOccurrenceOfAnIntegerTests { - - @Test - public void whenUsingPatternMatcher_findFirstInteger() { - String s = "ba31dung123"; - Matcher matcher = Pattern.compile("\\d+").matcher(s); - matcher.find(); - int i = Integer.parseInt(matcher.group()); - Assertions.assertEquals(31, i); - } - - @Test - public void whenUsingScanner_findFirstInteger() { - int i = new Scanner("ba31dung123").useDelimiter("\\D+").nextInt(); - Assertions.assertEquals(31, i); - } - - @Test - public void whenUsingSplit_findFirstInteger() { - String str = "ba31dung123"; - List tokens = Arrays.stream(str.split("\\D+")) - .filter(s -> s.length() > 0).collect(Collectors.toList()); - Assertions.assertEquals(31, Integer.parseInt(tokens.get(0))); - } - - @Test - public void whenUsingCustomFunction_findFirstInteger() { - String str = "ba31dung123"; - Integer i = FirstOccurrenceOfAnInteger.findFirstInteger(str); - Assertions.assertEquals(31, i); - } - - -} From 3ec153f15fbf3f0f94bdca6663d58e3463aa5b32 Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Sun, 29 Jan 2023 01:53:53 +0200 Subject: [PATCH 012/170] initialize arraylist with null or zeros --- .../pom.xml | 32 ++++++++ .../InitializeArrayListWithNullOrZeros.java | 14 ++++ ...alizeArrayListWithNullOrZerosUnitTest.java | 75 +++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 core-java-modules/core-java-collections-array-list-2/pom.xml create mode 100644 core-java-modules/core-java-collections-array-list-2/src/main/java/com/baeldung/InitializeArrayListWithNullOrZeros.java create mode 100644 core-java-modules/core-java-collections-array-list-2/src/test/java/com/baeldung/InitializeArrayListWithNullOrZerosUnitTest.java diff --git a/core-java-modules/core-java-collections-array-list-2/pom.xml b/core-java-modules/core-java-collections-array-list-2/pom.xml new file mode 100644 index 0000000000..ca29a0d14b --- /dev/null +++ b/core-java-modules/core-java-collections-array-list-2/pom.xml @@ -0,0 +1,32 @@ + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + ../../pom.xml + + 4.0.0 + + core-java-collections-array-list-2 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 9 + 9 + + + + + + + 17 + 17 + + + diff --git a/core-java-modules/core-java-collections-array-list-2/src/main/java/com/baeldung/InitializeArrayListWithNullOrZeros.java b/core-java-modules/core-java-collections-array-list-2/src/main/java/com/baeldung/InitializeArrayListWithNullOrZeros.java new file mode 100644 index 0000000000..60cd18af98 --- /dev/null +++ b/core-java-modules/core-java-collections-array-list-2/src/main/java/com/baeldung/InitializeArrayListWithNullOrZeros.java @@ -0,0 +1,14 @@ +package com.baeldung; + +import java.util.ArrayList; + +public class InitializeArrayListWithNullOrZeros { + + public static void main(String[] args) { + + ArrayList arrayList = new ArrayList<>(); + for (int i = 0; i< 10; i++) { + arrayList.add(null); + } + } +} diff --git a/core-java-modules/core-java-collections-array-list-2/src/test/java/com/baeldung/InitializeArrayListWithNullOrZerosUnitTest.java b/core-java-modules/core-java-collections-array-list-2/src/test/java/com/baeldung/InitializeArrayListWithNullOrZerosUnitTest.java new file mode 100644 index 0000000000..71f8a23690 --- /dev/null +++ b/core-java-modules/core-java-collections-array-list-2/src/test/java/com/baeldung/InitializeArrayListWithNullOrZerosUnitTest.java @@ -0,0 +1,75 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.jupiter.api.Assertions; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + + +public class InitializeArrayListWithNullOrZerosUnitTest { + + @Test + public void whenInitializingListWithNCopies_thenListIsCorrectlyPopulated() { + // when + ArrayList list = IntStream.of(new int[10]) + .boxed() + .collect(Collectors.toCollection(ArrayList::new)); + + // then + Assertions.assertEquals(10, list.size()); + Assertions.assertTrue(list.stream().allMatch(elem -> elem == 0)); + } + + @Test + public void whenInitializingListWithStream_thenListIsCorrectlyPopulated() { + + // when + ArrayList listWithZeros = Stream.generate(() -> 0) + .limit(10).collect(Collectors.toCollection(ArrayList::new)); + + ArrayList listWithNulls = Stream.generate(() -> null) + .limit(10).collect(Collectors.toCollection(ArrayList::new)); + + // then + Assertions.assertEquals(10, listWithZeros.size()); + Assertions.assertTrue(listWithZeros.stream().allMatch(elem -> elem == 0)); + + Assertions.assertEquals(10, listWithNulls.size()); + Assertions.assertTrue(listWithNulls.stream().allMatch(Objects::isNull)); + } + + @Test public void whenInitializingListWithIntStream_thenListIsCorrectlyPopulated() { + // when + ArrayList list = IntStream.of(new int[10]) + .boxed() + .collect(Collectors.toCollection(ArrayList::new)); + + // then + Assertions.assertEquals(10, list.size()); + Assertions.assertTrue(list.stream().allMatch(elem -> elem == 0)); } + + @Test + public void whenInitializingListWithAsList_thenListIsCorrectlyPopulated() { + // when + Integer[] integers = new Integer[10]; + Arrays.fill(integers, 0); + List integerList = new ArrayList<>(Arrays.asList(integers)); + + // then + Assertions.assertEquals(10, integerList.size()); + Assertions.assertTrue(integerList.stream().allMatch(elem -> elem == 0)); + } + + @Test + public void whenInitializingListWithVector_thenListIsCorrectlyPopulated() { + // when + List integerList = new Vector<>() {{setSize(10);}}; + + // then + Assertions.assertEquals(10, integerList.size()); + Assertions.assertTrue(integerList.stream().allMatch(Objects::isNull)); + } +} From a38ec313aa4bfd5ce08f3da3c4da9e23c8f495b6 Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Sun, 29 Jan 2023 19:46:23 +0200 Subject: [PATCH 013/170] configure pom parent --- .../core-java-collections-array-list-2/pom.xml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/core-java-modules/core-java-collections-array-list-2/pom.xml b/core-java-modules/core-java-collections-array-list-2/pom.xml index ca29a0d14b..cc15ba7c6e 100644 --- a/core-java-modules/core-java-collections-array-list-2/pom.xml +++ b/core-java-modules/core-java-collections-array-list-2/pom.xml @@ -2,15 +2,18 @@ - - parent-modules - com.baeldung - 1.0.0-SNAPSHOT - ../../pom.xml - 4.0.0 - core-java-collections-array-list-2 + 0.1.0-SNAPSHOT + core-java-collections-array-list-2 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + From 537df5bfdc30b6f930dac3e3d3acf52b274c5752 Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Sun, 29 Jan 2023 20:34:59 +0200 Subject: [PATCH 014/170] move code --- .../pom.xml | 35 --------- .../InitializeArrayListWithNullOrZeros.java | 14 ---- ...alizeArrayListWithNullOrZerosUnitTest.java | 75 ------------------- 3 files changed, 124 deletions(-) delete mode 100644 core-java-modules/core-java-collections-array-list-2/pom.xml delete mode 100644 core-java-modules/core-java-collections-array-list-2/src/main/java/com/baeldung/InitializeArrayListWithNullOrZeros.java delete mode 100644 core-java-modules/core-java-collections-array-list-2/src/test/java/com/baeldung/InitializeArrayListWithNullOrZerosUnitTest.java diff --git a/core-java-modules/core-java-collections-array-list-2/pom.xml b/core-java-modules/core-java-collections-array-list-2/pom.xml deleted file mode 100644 index cc15ba7c6e..0000000000 --- a/core-java-modules/core-java-collections-array-list-2/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - 4.0.0 - core-java-collections-array-list-2 - 0.1.0-SNAPSHOT - core-java-collections-array-list-2 - jar - - - com.baeldung.core-java-modules - core-java-modules - 0.0.1-SNAPSHOT - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 9 - 9 - - - - - - - 17 - 17 - - - diff --git a/core-java-modules/core-java-collections-array-list-2/src/main/java/com/baeldung/InitializeArrayListWithNullOrZeros.java b/core-java-modules/core-java-collections-array-list-2/src/main/java/com/baeldung/InitializeArrayListWithNullOrZeros.java deleted file mode 100644 index 60cd18af98..0000000000 --- a/core-java-modules/core-java-collections-array-list-2/src/main/java/com/baeldung/InitializeArrayListWithNullOrZeros.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung; - -import java.util.ArrayList; - -public class InitializeArrayListWithNullOrZeros { - - public static void main(String[] args) { - - ArrayList arrayList = new ArrayList<>(); - for (int i = 0; i< 10; i++) { - arrayList.add(null); - } - } -} diff --git a/core-java-modules/core-java-collections-array-list-2/src/test/java/com/baeldung/InitializeArrayListWithNullOrZerosUnitTest.java b/core-java-modules/core-java-collections-array-list-2/src/test/java/com/baeldung/InitializeArrayListWithNullOrZerosUnitTest.java deleted file mode 100644 index 71f8a23690..0000000000 --- a/core-java-modules/core-java-collections-array-list-2/src/test/java/com/baeldung/InitializeArrayListWithNullOrZerosUnitTest.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.baeldung; - -import org.junit.Test; -import org.junit.jupiter.api.Assertions; - -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.IntStream; -import java.util.stream.Stream; - - -public class InitializeArrayListWithNullOrZerosUnitTest { - - @Test - public void whenInitializingListWithNCopies_thenListIsCorrectlyPopulated() { - // when - ArrayList list = IntStream.of(new int[10]) - .boxed() - .collect(Collectors.toCollection(ArrayList::new)); - - // then - Assertions.assertEquals(10, list.size()); - Assertions.assertTrue(list.stream().allMatch(elem -> elem == 0)); - } - - @Test - public void whenInitializingListWithStream_thenListIsCorrectlyPopulated() { - - // when - ArrayList listWithZeros = Stream.generate(() -> 0) - .limit(10).collect(Collectors.toCollection(ArrayList::new)); - - ArrayList listWithNulls = Stream.generate(() -> null) - .limit(10).collect(Collectors.toCollection(ArrayList::new)); - - // then - Assertions.assertEquals(10, listWithZeros.size()); - Assertions.assertTrue(listWithZeros.stream().allMatch(elem -> elem == 0)); - - Assertions.assertEquals(10, listWithNulls.size()); - Assertions.assertTrue(listWithNulls.stream().allMatch(Objects::isNull)); - } - - @Test public void whenInitializingListWithIntStream_thenListIsCorrectlyPopulated() { - // when - ArrayList list = IntStream.of(new int[10]) - .boxed() - .collect(Collectors.toCollection(ArrayList::new)); - - // then - Assertions.assertEquals(10, list.size()); - Assertions.assertTrue(list.stream().allMatch(elem -> elem == 0)); } - - @Test - public void whenInitializingListWithAsList_thenListIsCorrectlyPopulated() { - // when - Integer[] integers = new Integer[10]; - Arrays.fill(integers, 0); - List integerList = new ArrayList<>(Arrays.asList(integers)); - - // then - Assertions.assertEquals(10, integerList.size()); - Assertions.assertTrue(integerList.stream().allMatch(elem -> elem == 0)); - } - - @Test - public void whenInitializingListWithVector_thenListIsCorrectlyPopulated() { - // when - List integerList = new Vector<>() {{setSize(10);}}; - - // then - Assertions.assertEquals(10, integerList.size()); - Assertions.assertTrue(integerList.stream().allMatch(Objects::isNull)); - } -} From 04d697ecb2d6b594a2742d788109769d766bfa00 Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Mon, 6 Feb 2023 23:24:32 +0200 Subject: [PATCH 015/170] BAEL-6195 --- .../FirstOccurrenceOfAnInteger.java | 16 +++++++ .../FirstOccurrenceOfAnIntegerTests.java | 47 +++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 core-java-modules/core-java-regex-2/src/main/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnInteger.java create mode 100644 core-java-modules/core-java-regex-2/src/test/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnIntegerTests.java diff --git a/core-java-modules/core-java-regex-2/src/main/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnInteger.java b/core-java-modules/core-java-regex-2/src/main/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnInteger.java new file mode 100644 index 0000000000..a8fde1dc16 --- /dev/null +++ b/core-java-modules/core-java-regex-2/src/main/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnInteger.java @@ -0,0 +1,16 @@ +package com.baeldung.firstoccurrenceofaninteger; + +public class FirstOccurrenceOfAnInteger { + + public static Integer findFirstInteger(String s) { + int i = 0; + while (i < s.length() && !Character.isDigit(s.charAt(i))) { + i++; + } + int j = i; + while (j < s.length() && Character.isDigit(s.charAt(j))) { + j++; + } + return Integer.parseInt(s.substring(i, j)); + } +} diff --git a/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnIntegerTests.java b/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnIntegerTests.java new file mode 100644 index 0000000000..54779bab9a --- /dev/null +++ b/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnIntegerTests.java @@ -0,0 +1,47 @@ +package com.baeldung.firstoccurrenceofaninteger; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Assertions; + + +class FirstOccurrenceOfAnIntegerTests { + + @Test + public void whenUsingPatternMatcher_findFirstInteger() { + String s = "ba31dung123"; + Matcher matcher = Pattern.compile("\\d+").matcher(s); + matcher.find(); + int i = Integer.parseInt(matcher.group()); + Assertions.assertEquals(31, i); + } + + @Test + public void whenUsingScanner_findFirstInteger() { + int i = new Scanner("ba31dung123").useDelimiter("\\D+").nextInt(); + Assertions.assertEquals(31, i); + } + + @Test + public void whenUsingSplit_findFirstInteger() { + String str = "ba31dung123"; + List tokens = Arrays.stream(str.split("\\D+")) + .filter(s -> s.length() > 0).collect(Collectors.toList()); + Assertions.assertEquals(31, Integer.parseInt(tokens.get(0))); + } + + @Test + public void whenUsingCustomFunction_findFirstInteger() { + String str = "ba31dung123"; + Integer i = FirstOccurrenceOfAnInteger.findFirstInteger(str); + Assertions.assertEquals(31, i); + } + + +} From a3e8cddc8fde668b7789b4dfeeedba6cb32e1c02 Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Fri, 17 Mar 2023 19:58:29 +0200 Subject: [PATCH 016/170] time-based UUIDs --- .../timebaseduuid/JavaUUIDCreator.java | 42 +++++++++++++++++++ .../baeldung/timebaseduuid/UUIDCreator.java | 41 ++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreator.java create mode 100644 core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreator.java diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreator.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreator.java new file mode 100644 index 0000000000..39308c8982 --- /dev/null +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreator.java @@ -0,0 +1,42 @@ +package com.baeldung.timebaseduuid; + +import com.fasterxml.uuid.Generators; +import com.github.f4b6a3.uuid.UuidCreator; + +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + +public class JavaUUIDCreator { + + public static void main(String[] args) throws InterruptedException { + + int threadCount = 128; + int iterationCount = 100_000; + ConcurrentMap uuidMap = new ConcurrentHashMap<>(); + AtomicLong collisionCount = new AtomicLong(); + long startNanos = System.nanoTime(); + CountDownLatch endLatch = new CountDownLatch(threadCount); + + for (long i = 0; i < threadCount; i++) { + final long threadId = i; + new Thread(() -> { + for (long j = 0; j < iterationCount; j++) { + UUID uuid = Generators.timeBasedGenerator().generate(); + Long existingUUID = uuidMap.put(uuid, (threadId * iterationCount) + j); + if(existingUUID != null) { + collisionCount.incrementAndGet(); + } + } + endLatch.countDown(); + }).start(); + } + + endLatch.await(); + System.out.println(threadCount * iterationCount + " UUIDs generated, " + collisionCount + " collisions in " + + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos) + "ms"); + } +} diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreator.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreator.java new file mode 100644 index 0000000000..8695a54bae --- /dev/null +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreator.java @@ -0,0 +1,41 @@ +package com.baeldung.timebaseduuid; + +import com.github.f4b6a3.uuid.UuidCreator; + +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + +public class UUIDCreator { + + public static void main(String[] args) throws InterruptedException { + + int threadCount = 128; + int iterationCount = 100_000; + ConcurrentMap uuidMap = new ConcurrentHashMap<>(); + AtomicLong collisionCount = new AtomicLong(); + long startNanos = System.nanoTime(); + CountDownLatch endLatch = new CountDownLatch(threadCount); + + for (long i = 0; i < threadCount; i++) { + final long threadId = i; + new Thread(() -> { + for (long j = 0; j < iterationCount; j++) { + UUID uuid = UuidCreator.getTimeBased(); + Long existingUUID = uuidMap.put(uuid, (threadId * iterationCount) + j); + if(existingUUID != null) { + collisionCount.incrementAndGet(); + } + } + endLatch.countDown(); + }).start(); + } + + endLatch.await(); + System.out.println(threadCount * iterationCount + " UUIDs generated, " + collisionCount + " collisions in " + + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos) + "ms"); + } +} From 6dcdba8b3f0e7e04a539a0352bb2cf6d0b90ab04 Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Fri, 24 Mar 2023 22:44:22 +0200 Subject: [PATCH 017/170] review --- .../timebaseduuid/JavaUUIDCreator.java | 42 ------------------- .../baeldung/timebaseduuid/UUIDCreator.java | 41 ------------------ .../timebaseduuid/UUIDCreatorBenchmark.java | 2 +- 3 files changed, 1 insertion(+), 84 deletions(-) delete mode 100644 core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreator.java delete mode 100644 core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreator.java diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreator.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreator.java deleted file mode 100644 index 39308c8982..0000000000 --- a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/JavaUUIDCreator.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.baeldung.timebaseduuid; - -import com.fasterxml.uuid.Generators; -import com.github.f4b6a3.uuid.UuidCreator; - -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicLong; - -public class JavaUUIDCreator { - - public static void main(String[] args) throws InterruptedException { - - int threadCount = 128; - int iterationCount = 100_000; - ConcurrentMap uuidMap = new ConcurrentHashMap<>(); - AtomicLong collisionCount = new AtomicLong(); - long startNanos = System.nanoTime(); - CountDownLatch endLatch = new CountDownLatch(threadCount); - - for (long i = 0; i < threadCount; i++) { - final long threadId = i; - new Thread(() -> { - for (long j = 0; j < iterationCount; j++) { - UUID uuid = Generators.timeBasedGenerator().generate(); - Long existingUUID = uuidMap.put(uuid, (threadId * iterationCount) + j); - if(existingUUID != null) { - collisionCount.incrementAndGet(); - } - } - endLatch.countDown(); - }).start(); - } - - endLatch.await(); - System.out.println(threadCount * iterationCount + " UUIDs generated, " + collisionCount + " collisions in " - + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos) + "ms"); - } -} diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreator.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreator.java deleted file mode 100644 index 8695a54bae..0000000000 --- a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreator.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.timebaseduuid; - -import com.github.f4b6a3.uuid.UuidCreator; - -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicLong; - -public class UUIDCreator { - - public static void main(String[] args) throws InterruptedException { - - int threadCount = 128; - int iterationCount = 100_000; - ConcurrentMap uuidMap = new ConcurrentHashMap<>(); - AtomicLong collisionCount = new AtomicLong(); - long startNanos = System.nanoTime(); - CountDownLatch endLatch = new CountDownLatch(threadCount); - - for (long i = 0; i < threadCount; i++) { - final long threadId = i; - new Thread(() -> { - for (long j = 0; j < iterationCount; j++) { - UUID uuid = UuidCreator.getTimeBased(); - Long existingUUID = uuidMap.put(uuid, (threadId * iterationCount) + j); - if(existingUUID != null) { - collisionCount.incrementAndGet(); - } - } - endLatch.countDown(); - }).start(); - } - - endLatch.await(); - System.out.println(threadCount * iterationCount + " UUIDs generated, " + collisionCount + " collisions in " - + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos) + "ms"); - } -} diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java index d93cd73a25..952c6cdb54 100644 --- a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java @@ -22,7 +22,7 @@ public class UUIDCreatorBenchmark { CountDownLatch endLatch = new CountDownLatch(threadCount); for (long i = 0; i < threadCount; i++) { - long threadId = i; + final long threadId = i; new Thread(() -> { for (long j = 0; j < iterationCount; j++) { UUID uuid = UuidCreator.getTimeBased(); From e931369a3edf6c188b2608ed056ac03242dc5373 Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Fri, 24 Mar 2023 22:46:29 +0200 Subject: [PATCH 018/170] review --- .../java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java index 952c6cdb54..d93cd73a25 100644 --- a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/timebaseduuid/UUIDCreatorBenchmark.java @@ -22,7 +22,7 @@ public class UUIDCreatorBenchmark { CountDownLatch endLatch = new CountDownLatch(threadCount); for (long i = 0; i < threadCount; i++) { - final long threadId = i; + long threadId = i; new Thread(() -> { for (long j = 0; j < iterationCount; j++) { UUID uuid = UuidCreator.getTimeBased(); From e647b112da7e3b18f0e688671d6a787e579d0a81 Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Wed, 31 May 2023 22:56:50 +0300 Subject: [PATCH 019/170] BAEL-6024 - Guide to YugabyteDB --- persistence-modules/pom.xml | 1 + .../spring-data-yugabytedb/pom.xml | 55 +++++++++++++++++++ .../src/main/java/com/baeldung/Main.java | 32 +++++++++++ .../src/main/java/com/baeldung/User.java | 44 +++++++++++++++ .../java/com/baeldung/UserRepository.java | 6 ++ .../src/main/resources/application.properties | 4 ++ 6 files changed, 142 insertions(+) create mode 100644 persistence-modules/spring-data-yugabytedb/pom.xml create mode 100644 persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/Main.java create mode 100644 persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/User.java create mode 100644 persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/UserRepository.java create mode 100644 persistence-modules/spring-data-yugabytedb/src/main/resources/application.properties diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 9361e26d7d..0046165d7c 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -108,6 +108,7 @@ spring-jooq spring-mybatis spring-persistence-simple + spring-data-yugabytedb fauna spring-data-rest diff --git a/persistence-modules/spring-data-yugabytedb/pom.xml b/persistence-modules/spring-data-yugabytedb/pom.xml new file mode 100644 index 0000000000..a14f0e7114 --- /dev/null +++ b/persistence-modules/spring-data-yugabytedb/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + spring-data-yugabytedb + 1.0 + spring-data-yugabytedb + jar + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.projectlombok + lombok + + + org.springframework + spring-test + + + org.springframework.boot + spring-boot-starter-test + test + + + org.postgresql + postgresql + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + + + diff --git a/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/Main.java b/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/Main.java new file mode 100644 index 0000000000..27b087790a --- /dev/null +++ b/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/Main.java @@ -0,0 +1,32 @@ +package com.baeldung; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Main implements CommandLineRunner { + + @Autowired + private UserRepository userRepository; + + public static void main(String[] args) { + SpringApplication.run(Main.class, args); + } + + @Override + public void run(String... args) throws InterruptedException { + + int iterationCount = 1_000; + int elementsPerIteration = 100; + + for (int i = 0; i < iterationCount; i++) { + for (long j = 0; j < elementsPerIteration; j++) { + User user = new User(); + userRepository.save(user); + } + Thread.sleep(1000); + } + } +} 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 new file mode 100644 index 0000000000..278bc6c9ae --- /dev/null +++ b/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/User.java @@ -0,0 +1,44 @@ +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; + +@Entity +@Table(name = "users") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column + private String name; + + Long getId() { + return id; + } + + void setId(Long id) { + this.id = id; + } + + String getName() { + return name; + } + + void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + '}'; + } +} diff --git a/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/UserRepository.java b/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/UserRepository.java new file mode 100644 index 0000000000..d04047d416 --- /dev/null +++ b/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/UserRepository.java @@ -0,0 +1,6 @@ +package com.baeldung; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserRepository extends JpaRepository { +} diff --git a/persistence-modules/spring-data-yugabytedb/src/main/resources/application.properties b/persistence-modules/spring-data-yugabytedb/src/main/resources/application.properties new file mode 100644 index 0000000000..fdb3d50ec8 --- /dev/null +++ b/persistence-modules/spring-data-yugabytedb/src/main/resources/application.properties @@ -0,0 +1,4 @@ +spring.datasource.url=jdbc:postgresql://localhost:5433/yugabyte +spring.datasource.username=yugabyte +spring.datasource.password=yugabyte +spring.jpa.hibernate.ddl-auto=create From 62d4a6e4de61359264f596dbb4b7a72b696ddc9c Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Wed, 31 May 2023 23:00:07 +0300 Subject: [PATCH 020/170] BAEL-6024 - Guide to YugabyteDB --- .../FirstOccurrenceOfAnInteger.java | 16 ------- .../FirstOccurrenceOfAnIntegerTests.java | 47 ------------------- 2 files changed, 63 deletions(-) delete mode 100644 core-java-modules/core-java-regex-2/src/main/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnInteger.java delete mode 100644 core-java-modules/core-java-regex-2/src/test/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnIntegerTests.java diff --git a/core-java-modules/core-java-regex-2/src/main/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnInteger.java b/core-java-modules/core-java-regex-2/src/main/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnInteger.java deleted file mode 100644 index a8fde1dc16..0000000000 --- a/core-java-modules/core-java-regex-2/src/main/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnInteger.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.firstoccurrenceofaninteger; - -public class FirstOccurrenceOfAnInteger { - - public static Integer findFirstInteger(String s) { - int i = 0; - while (i < s.length() && !Character.isDigit(s.charAt(i))) { - i++; - } - int j = i; - while (j < s.length() && Character.isDigit(s.charAt(j))) { - j++; - } - return Integer.parseInt(s.substring(i, j)); - } -} diff --git a/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnIntegerTests.java b/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnIntegerTests.java deleted file mode 100644 index 54779bab9a..0000000000 --- a/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/firstoccurrenceofaninteger/FirstOccurrenceOfAnIntegerTests.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.baeldung.firstoccurrenceofaninteger; - -import java.util.Arrays; -import java.util.List; -import java.util.Scanner; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.Assertions; - - -class FirstOccurrenceOfAnIntegerTests { - - @Test - public void whenUsingPatternMatcher_findFirstInteger() { - String s = "ba31dung123"; - Matcher matcher = Pattern.compile("\\d+").matcher(s); - matcher.find(); - int i = Integer.parseInt(matcher.group()); - Assertions.assertEquals(31, i); - } - - @Test - public void whenUsingScanner_findFirstInteger() { - int i = new Scanner("ba31dung123").useDelimiter("\\D+").nextInt(); - Assertions.assertEquals(31, i); - } - - @Test - public void whenUsingSplit_findFirstInteger() { - String str = "ba31dung123"; - List tokens = Arrays.stream(str.split("\\D+")) - .filter(s -> s.length() > 0).collect(Collectors.toList()); - Assertions.assertEquals(31, Integer.parseInt(tokens.get(0))); - } - - @Test - public void whenUsingCustomFunction_findFirstInteger() { - String str = "ba31dung123"; - Integer i = FirstOccurrenceOfAnInteger.findFirstInteger(str); - Assertions.assertEquals(31, i); - } - - -} From f9d0db614cde9bdf375c40c6a3cd0b4f7048e9ef Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Wed, 31 May 2023 23:12:55 +0300 Subject: [PATCH 021/170] BAEL-6024 - Guide to YugabyteDB --- persistence-modules/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 0f0ad0c00f..0046165d7c 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -109,7 +109,6 @@ spring-mybatis spring-persistence-simple spring-data-yugabytedb - spring-data-yugabytedb fauna spring-data-rest From bef4c757daec2957feff3b0f861f254ff00e77fd Mon Sep 17 00:00:00 2001 From: timis1 Date: Thu, 1 Jun 2023 23:10:53 +0300 Subject: [PATCH 022/170] JAVA-20167 Migrate spring-data-mongodb to JDK 17 --- persistence-modules/spring-data-mongodb/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/persistence-modules/spring-data-mongodb/pom.xml b/persistence-modules/spring-data-mongodb/pom.xml index afb5e8b9c1..87cf1acaf8 100644 --- a/persistence-modules/spring-data-mongodb/pom.xml +++ b/persistence-modules/spring-data-mongodb/pom.xml @@ -103,13 +103,13 @@ - 3.0.3.RELEASE - 4.3.1 + 3.4.7 + 5.0.0 1.1.3 4.1.0 - 3.2.0.RELEASE - 4.0.5 - 3.2.6 + 3.5.4 + 4.6.1 + 4.6.3 \ No newline at end of file From 1e4c42c6d11fb9f277433acfcc49e202cac0d6a3 Mon Sep 17 00:00:00 2001 From: "thibault.faure" Date: Mon, 5 Jun 2023 12:57:33 +0200 Subject: [PATCH 023/170] BAEL-6587 Code for the Mockito Exception article --- testing-modules/mockito-2/pom.xml | 6 +-- .../baeldung/wantedbutnotinvocked/Helper.java | 9 +++++ .../baeldung/wantedbutnotinvocked/Main.java | 14 +++++++ .../wantedbutnotinvocked/MainUnitTest.java | 38 +++++++++++++++++++ 4 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 testing-modules/mockito-2/src/main/java/com/baeldung/wantedbutnotinvocked/Helper.java create mode 100644 testing-modules/mockito-2/src/main/java/com/baeldung/wantedbutnotinvocked/Main.java create mode 100644 testing-modules/mockito-2/src/test/java/com/baeldung/wantedbutnotinvocked/MainUnitTest.java diff --git a/testing-modules/mockito-2/pom.xml b/testing-modules/mockito-2/pom.xml index 25e9fd51a2..fe7ec0fe7a 100644 --- a/testing-modules/mockito-2/pom.xml +++ b/testing-modules/mockito-2/pom.xml @@ -1,7 +1,7 @@ - + 4.0.0 mockito-2 diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/wantedbutnotinvocked/Helper.java b/testing-modules/mockito-2/src/main/java/com/baeldung/wantedbutnotinvocked/Helper.java new file mode 100644 index 0000000000..dd8e04065b --- /dev/null +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/wantedbutnotinvocked/Helper.java @@ -0,0 +1,9 @@ +package com.baeldung.wantedbutnotinvocked; + +class Helper { + + String getBaeldungString() { + return "Baeldung"; + } + +} diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/wantedbutnotinvocked/Main.java b/testing-modules/mockito-2/src/main/java/com/baeldung/wantedbutnotinvocked/Main.java new file mode 100644 index 0000000000..31134000d2 --- /dev/null +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/wantedbutnotinvocked/Main.java @@ -0,0 +1,14 @@ +package com.baeldung.wantedbutnotinvocked; + +class Main { + + Helper helper = new Helper(); + + String methodUnderTest(int i) { + if (i > 5) { + return helper.getBaeldungString(); + } + return "Hello"; + } + +} diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/wantedbutnotinvocked/MainUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/wantedbutnotinvocked/MainUnitTest.java new file mode 100644 index 0000000000..6927b13a06 --- /dev/null +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/wantedbutnotinvocked/MainUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.wantedbutnotinvocked; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +class MainUnitTest { + + @Mock + Helper helper; + + @InjectMocks + Main main = new Main(); + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + void givenValueUpperThan5_WhenMethodUnderTest_ThenDelegatesToHelperClass() { + main.methodUnderTest(7); + Mockito.verify(helper) + .getBaeldungString(); + } + + // Uncomment the next line to see the error + // @Test + void givenValueLowerThan5_WhenMethodUnderTest_ThenDelegatesToGetBaeldungString() { + main.methodUnderTest(3); + Mockito.verify(helper) + .getBaeldungString(); + } + +} From d928abe03328a971c6af09db70fa32a8aab89b7c Mon Sep 17 00:00:00 2001 From: "thibault.faure" Date: Tue, 6 Jun 2023 23:00:55 +0200 Subject: [PATCH 024/170] BAEL-6482 Code for the Matching Null With Mockito article --- .../java/com/baeldung/nullmatcher/Helper.java | 9 +++++ .../java/com/baeldung/nullmatcher/Main.java | 11 +++++ .../baeldung/nullmatcher/MainUnitTest.java | 40 +++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 testing-modules/mockito-2/src/main/java/com/baeldung/nullmatcher/Helper.java create mode 100644 testing-modules/mockito-2/src/main/java/com/baeldung/nullmatcher/Main.java create mode 100644 testing-modules/mockito-2/src/test/java/com/baeldung/nullmatcher/MainUnitTest.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/nullmatcher/Helper.java b/testing-modules/mockito-2/src/main/java/com/baeldung/nullmatcher/Helper.java new file mode 100644 index 0000000000..d15196faa5 --- /dev/null +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/nullmatcher/Helper.java @@ -0,0 +1,9 @@ +package com.baeldung.nullmatcher; + +class Helper { + + String concat(String a, String b) { + return a + b; + } + +} diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/nullmatcher/Main.java b/testing-modules/mockito-2/src/main/java/com/baeldung/nullmatcher/Main.java new file mode 100644 index 0000000000..e3c73f9d8a --- /dev/null +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/nullmatcher/Main.java @@ -0,0 +1,11 @@ +package com.baeldung.nullmatcher; + +class Main { + + Helper helper = new Helper(); + + String methodUnderTest() { + return helper.concat("Baeldung", null); + } + +} diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/nullmatcher/MainUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/nullmatcher/MainUnitTest.java new file mode 100644 index 0000000000..a0245977e0 --- /dev/null +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/nullmatcher/MainUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.nullmatcher; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.isNull; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +class MainUnitTest { + + @Mock + Helper helper; + + @InjectMocks + Main main; + + @BeforeEach + void openMocks() { + MockitoAnnotations.openMocks(this); + } + + @Test + void whenMethodUnderTest_thenSecondParameterNull() { + main.methodUnderTest(); + Mockito.verify(helper) + .concat("Baeldung", null); + } + + @Test + void whenMethodUnderTest_thenSecondParameterNullWithMatchers() { + main.methodUnderTest(); + Mockito.verify(helper) + .concat(any(), isNull()); + } + +} From 2fd4c39a21cea9c62d313475b3df6fc1a3f3b087 Mon Sep 17 00:00:00 2001 From: timis1 Date: Mon, 12 Jun 2023 01:51:42 +0300 Subject: [PATCH 025/170] JAVA-20167 Migrating spring-data-neo4j --- persistence-modules/pom.xml | 6 +- persistence-modules/spring-data-neo4j/pom.xml | 59 +++++--- .../MovieDatabaseNeo4jTestConfiguration.java | 22 ++- .../spring/data/neo4j/domain/Car.java | 4 +- .../spring/data/neo4j/domain/Movie.java | 5 +- .../neo4j/repository/MovieRepository.java | 4 +- .../java/com/baeldung/SpringContextTest.java | 9 +- .../com/baeldung/TestContainersTestBase.java | 132 ++++++++++++++++++ .../baeldung/neo4j/Neo4JServerLiveTest.java | 56 +++++--- .../com/baeldung/neo4j/Neo4jLiveTest.java | 69 +++++---- .../com/baeldung/neo4j/Neo4jOgmLiveTest.java | 31 ++-- .../neo4j/MovieRepositoryIntegrationTest.java | 6 +- 12 files changed, 295 insertions(+), 108 deletions(-) create mode 100644 persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/TestContainersTestBase.java diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 9361e26d7d..1501d81985 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -40,8 +40,6 @@ java-jpa java-jpa-2 java-jpa-3 - - java-mongodb-2 java-mongodb-3 java-mongodb-queries @@ -90,10 +88,10 @@ spring-data-jpa-repo-2 spring-data-jdbc spring-data-keyvalue - + spring-data-mongodb spring-data-mongodb-2 spring-data-mongodb-reactive - + spring-data-neo4j spring-data-redis diff --git a/persistence-modules/spring-data-neo4j/pom.xml b/persistence-modules/spring-data-neo4j/pom.xml index 8c5030779b..705fe35d3c 100644 --- a/persistence-modules/spring-data-neo4j/pom.xml +++ b/persistence-modules/spring-data-neo4j/pom.xml @@ -27,6 +27,11 @@ org.neo4j neo4j-ogm-embedded-driver + ${neo4j-ogm-embedded-driver.version} + + + org.neo4j + neo4j-ogm-bolt-driver ${neo4j-ogm.version} @@ -34,6 +39,12 @@ neo4j-java-driver ${neo4j-java-driver.version} + + org.neo4j + neo4j-jdbc-driver + ${neo4j-jdbc.version} + runtime + org.springframework.data spring-data-neo4j @@ -69,33 +80,43 @@ - - org.neo4j - neo4j-ogm-test - ${neo4j-ogm.version} - test - - - org.neo4j.test - neo4j-harness - ${neo4j.version} - test - org.springframework spring-test ${spring-test.version} + + org.testcontainers + neo4j + ${testcontainers.version} + test + + + org.jetbrains + annotations + + + org.apache.commons + commons-compress + + + javax.xml.bind + jaxb-api + + + - 1.6.2 - 3.4.6 - 5.0.1.RELEASE - 1.1 - 2.0.1.RELEASE - 5.0.1.RELEASE - 3.1.2 + 5.6.0 + 5.8.0 + 7.0.3 + 1.1.2 + 3.1.0 + 6.0.8 + 4.0.4 + 4.0.9 + 3.2.39 \ No newline at end of file diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java index a4cbe4b809..f3c89c1bbe 100644 --- a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java +++ b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java @@ -1,13 +1,16 @@ package com.baeldung.spring.data.neo4j.config; -import org.neo4j.ogm.config.Configuration.Builder; +import org.neo4j.driver.Driver; import org.neo4j.ogm.session.SessionFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; +import org.springframework.data.neo4j.core.DatabaseSelectionProvider; +import org.springframework.data.neo4j.core.UserSelectionProvider; +import org.springframework.data.neo4j.core.transaction.Neo4jTransactionManager; import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories; -import org.springframework.data.neo4j.transaction.Neo4jTransactionManager; +import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @@ -19,18 +22,23 @@ public class MovieDatabaseNeo4jTestConfiguration { @Bean public org.neo4j.ogm.config.Configuration getConfiguration() { - org.neo4j.ogm.config.Configuration config = new Builder().build(); - return config; + return new org.neo4j.ogm.config.Configuration.Builder().build(); } @Bean public SessionFactory getSessionFactory() { return new SessionFactory(getConfiguration(), "com.baeldung.spring.data.neo4j.domain"); } - + @Bean - public Neo4jTransactionManager transactionManager() { - return new Neo4jTransactionManager(getSessionFactory()); + public PlatformTransactionManager transactionManager(Driver driver, + DatabaseSelectionProvider databaseSelectionProvider, UserSelectionProvider userSelectionProvider) { + + return Neo4jTransactionManager + .with(driver) + .withDatabaseSelectionProvider(databaseSelectionProvider) + .withUserSelectionProvider(userSelectionProvider) + .build(); } } diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Car.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Car.java index 455407a92b..0f516d3758 100644 --- a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Car.java +++ b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Car.java @@ -1,5 +1,7 @@ package com.baeldung.spring.data.neo4j.domain; +import static org.neo4j.ogm.annotation.Relationship.Direction.INCOMING; + import org.neo4j.ogm.annotation.GeneratedValue; import org.neo4j.ogm.annotation.Id; import org.neo4j.ogm.annotation.NodeEntity; @@ -12,7 +14,7 @@ public class Car { private String make; - @Relationship(direction = "INCOMING") + @Relationship(direction = INCOMING) private Company company; public Car(String make, String model) { diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Movie.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Movie.java index 996a661b07..bea9f996aa 100644 --- a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Movie.java +++ b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Movie.java @@ -1,5 +1,7 @@ package com.baeldung.spring.data.neo4j.domain; +import static org.neo4j.ogm.annotation.Relationship.Direction.INCOMING; + import com.fasterxml.jackson.annotation.JsonIdentityInfo; import com.voodoodyne.jackson.jsog.JSOGGenerator; @@ -12,7 +14,6 @@ import java.util.Collection; import java.util.List; @JsonIdentityInfo(generator = JSOGGenerator.class) - @NodeEntity public class Movie { @Id @GeneratedValue @@ -23,7 +24,7 @@ public class Movie { private int released; private String tagline; - @Relationship(type = "ACTED_IN", direction = Relationship.INCOMING) + @Relationship(type = "ACTED_IN", direction = INCOMING) private List roles; public Movie() { diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/MovieRepository.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/MovieRepository.java index dde946ea73..732970c0b5 100644 --- a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/MovieRepository.java +++ b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/MovieRepository.java @@ -1,8 +1,8 @@ package com.baeldung.spring.data.neo4j.repository; import com.baeldung.spring.data.neo4j.domain.Movie; -import org.springframework.data.neo4j.annotation.Query; import org.springframework.data.neo4j.repository.Neo4jRepository; +import org.springframework.data.neo4j.repository.query.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -13,7 +13,7 @@ import java.util.Map; @Repository public interface MovieRepository extends Neo4jRepository { - Movie findByTitle(@Param("title") String title); + Movie findByTitle(String title); @Query("MATCH (m:Movie) WHERE m.title =~ ('(?i).*'+{title}+'.*') RETURN m") Collection findByTitleContaining(@Param("title") String title); diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/SpringContextTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/SpringContextTest.java index 7029905c49..9c96a98ff2 100644 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/SpringContextTest.java +++ b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/SpringContextTest.java @@ -1,19 +1,16 @@ package com.baeldung; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.baeldung.spring.data.neo4j.config.MovieDatabaseNeo4jTestConfiguration; -@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MovieDatabaseNeo4jTestConfiguration.class) @ActiveProfiles(profiles = "test") -public class SpringContextTest { +class SpringContextTest { @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { + void whenSpringContextIsBootstrapped_thenNoExceptions() { } } diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/TestContainersTestBase.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/TestContainersTestBase.java new file mode 100644 index 0000000000..e2bd022d12 --- /dev/null +++ b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/TestContainersTestBase.java @@ -0,0 +1,132 @@ +package com.baeldung; + +import static org.neo4j.ogm.drivers.bolt.driver.BoltDriver.CONFIG_PARAMETER_BOLT_LOGGING; + +import java.util.Locale; +import java.util.Optional; + +import org.neo4j.driver.AccessMode; +import org.neo4j.driver.AuthTokens; +import org.neo4j.driver.GraphDatabase; +import org.neo4j.driver.Logging; +import org.neo4j.driver.Session; +import org.neo4j.driver.SessionConfig; +import org.neo4j.ogm.config.Configuration; +import org.neo4j.ogm.driver.Driver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.containers.Neo4jContainer; +import org.testcontainers.utility.TestcontainersConfiguration; + +/** + * Reference: https://github.com/neo4j/neo4j-ogm/blob/master/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/testutil/TestContainersTestBase.java + */ +public class TestContainersTestBase { + + public static final Logger LOGGER = LoggerFactory.getLogger(TestContainersTestBase.class); + + public static final Driver driver; + + public static final String version; + + public static final String DEFAULT_IMAGE = "neo4j:5"; + + public static final String SYS_PROPERTY_ACCEPT_AND_USE_COMMERCIAL_EDITION = "NEO4J_OGM_NEO4J_ACCEPT_AND_USE_COMMERCIAL_EDITION"; + + public static final String SYS_PROPERTY_IMAGE_NAME = "NEO4J_OGM_NEO4J_IMAGE_NAME"; + + public static final String SYS_PROPERTY_NEO4J_URL = "NEO4J_OGM_NEO4J_URL"; + + public static final String SYS_PROPERTY_NEO4J_PASSWORD = "NEO4J_OGM_NEO4J_PASSWORD"; + + public static final String DEFAULT_PASSWORD = "verysecret"; + + public static Neo4jContainer neo4jServer; + + public static Configuration.Builder baseConfigurationBuilder; + + public static final String NEO4J_URL = Optional.ofNullable(System.getenv(SYS_PROPERTY_NEO4J_URL)).orElse(""); + + public static final String NEO4J_PASSWORD = Optional.ofNullable(System.getenv(SYS_PROPERTY_NEO4J_PASSWORD)).orElse("").trim(); + + static { + + boolean acceptAndUseCommercialEdition = hasAcceptedAndWantsToUseCommercialEdition(); + + if (!(NEO4J_URL.isEmpty() || NEO4J_PASSWORD.isEmpty())) { + LOGGER.info("Using Neo4j instance at {}.", NEO4J_URL); + driver = new org.neo4j.ogm.drivers.bolt.driver.BoltDriver(); + baseConfigurationBuilder = new Configuration.Builder() + .uri(NEO4J_URL) + .verifyConnection(true) + .withCustomProperty(CONFIG_PARAMETER_BOLT_LOGGING, Logging.slf4j()) + .credentials("neo4j", NEO4J_PASSWORD); + driver.configure(baseConfigurationBuilder.build()); + version = extractVersionFromBolt(); + } else { + LOGGER.info("Using Neo4j test container."); + String imageName = Optional.ofNullable(System.getenv(SYS_PROPERTY_IMAGE_NAME)) + .orElse(DEFAULT_IMAGE + (acceptAndUseCommercialEdition ? "-enterprise" : "")); + + version = extractVersionFromDockerImage(imageName); + + boolean containerReuseSupported = TestcontainersConfiguration + .getInstance().environmentSupportsReuse(); + neo4jServer = new Neo4jContainer<>(imageName) + .withReuse(containerReuseSupported); + + if (acceptAndUseCommercialEdition) { + neo4jServer.withEnv("NEO4J_ACCEPT_LICENSE_AGREEMENT", "yes"); + } + neo4jServer.withAdminPassword(DEFAULT_PASSWORD).start(); + + driver = new org.neo4j.ogm.drivers.bolt.driver.BoltDriver(); + + baseConfigurationBuilder = new Configuration.Builder() + .uri(neo4jServer.getBoltUrl()) + .credentials("neo4j", DEFAULT_PASSWORD) + .verifyConnection(true) + .withCustomProperty(CONFIG_PARAMETER_BOLT_LOGGING, Logging.slf4j()); + + driver.configure(baseConfigurationBuilder.build()); + + Runtime.getRuntime().addShutdownHook(new Thread(neo4jServer::stop)); + } + } + + public static org.neo4j.driver.Driver getNewBoltConnection() { + + if (neo4jServer != null) { + return GraphDatabase.driver(neo4jServer.getBoltUrl(), AuthTokens.basic("neo4j", DEFAULT_PASSWORD)); + } else { + return GraphDatabase.driver(NEO4J_URL, AuthTokens.basic("neo4j", NEO4J_PASSWORD)); + } + } + + public static boolean hasAcceptedAndWantsToUseCommercialEdition() { + return Optional.ofNullable( + System.getenv(TestContainersTestBase.SYS_PROPERTY_ACCEPT_AND_USE_COMMERCIAL_EDITION)) + .orElse("no").toLowerCase(Locale.ENGLISH).equals("yes"); + } + + public static Driver getDriver() { + return driver; + } + + private static String extractVersionFromDockerImage(String imageName) { + return imageName.replace("neo4j:", "").replace("neo4j/neo4j-experimental:", "").replace("-enterprise", ""); + } + + private static String extractVersionFromBolt() { + + org.neo4j.driver.Driver driver = getDriver().unwrap(org.neo4j.driver.Driver.class); + + String version; + SessionConfig sessionConfig = SessionConfig.builder().withDefaultAccessMode(AccessMode.READ).build(); + try (Session session = driver.session(sessionConfig)) { + version = (String) session.run("CALL dbms.components() YIELD versions").single().get("versions").asList().get(0); + } + return version.toLowerCase(Locale.ENGLISH); + } + +} \ No newline at end of file diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java index bf187ccb2d..3356d90291 100644 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java +++ b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java @@ -1,45 +1,59 @@ package com.baeldung.neo4j; +import static com.baeldung.TestContainersTestBase.DEFAULT_PASSWORD; +import static com.baeldung.TestContainersTestBase.getNewBoltConnection; +import static com.baeldung.TestContainersTestBase.neo4jServer; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; -import org.junit.Assert; -import org.junit.Ignore; -import org.junit.Test; -import org.neo4j.driver.v1.AuthTokens; -import org.neo4j.driver.v1.Driver; -import org.neo4j.driver.v1.GraphDatabase; -import org.neo4j.driver.v1.Session; -import org.neo4j.driver.v1.StatementResult; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.neo4j.driver.Driver; +import org.neo4j.driver.Result; +import org.neo4j.driver.Session; -@Ignore -public class Neo4JServerLiveTest { +class Neo4JServerLiveTest { + + private static Session session; + private static Driver driver; + + @BeforeAll + public static void setup() { + driver = getNewBoltConnection(); + } + + @AfterAll + public static void tearDown() { + driver.close(); + } @Test - public void standAloneDriver() { - Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "12345")); - Session session = driver.session(); - + void standAloneDriver() { + session = driver.session(); session.run("CREATE (baeldung:Company {name:\"Baeldung\"}) " + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + "RETURN baeldung, tesla"); - StatementResult result = session.run("MATCH (company:Company)-[:owns]-> (car:Car)" + + Result result = session.run("MATCH (company:Company)-[:owns]-> (car:Car)" + "WHERE car.make='tesla' and car.model='modelX'" + "RETURN company.name"); - Assert.assertTrue(result.hasNext()); - Assert.assertEquals(result.next().get("company.name").asString(), "Baeldung"); + assertTrue(result.hasNext()); + assertEquals("Baeldung", result.next().get("company.name").asString()); session.close(); - driver.close(); } @Test - public void standAloneJdbc() throws Exception { - Connection con = DriverManager.getConnection("jdbc:neo4j:bolt://localhost/?user=neo4j,password=12345,scheme=basic"); + void standAloneJdbc() throws Exception { + String uri = "jdbc:neo4j:" + neo4jServer.getBoltUrl() + "/?user=neo4j,password=" + DEFAULT_PASSWORD + ",scheme=basic"; + Connection con = DriverManager.getConnection(uri); // Querying try (Statement stmt = con.createStatement()) { @@ -52,7 +66,7 @@ public class Neo4JServerLiveTest { "RETURN company.name"); while (rs.next()) { - Assert.assertEquals(rs.getString("company.name"), "Baeldung"); + assertEquals("Baeldung", rs.getString("company.name")); } } con.close(); diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java index 1ff01b93a1..840f4536ca 100644 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java +++ b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java @@ -1,7 +1,10 @@ package com.baeldung.neo4j; +import static org.neo4j.configuration.GraphDatabaseSettings.DEFAULT_DATABASE_NAME; + import java.io.File; +import java.time.Duration; import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -10,101 +13,107 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.neo4j.configuration.GraphDatabaseSettings; +import org.neo4j.dbms.api.DatabaseManagementService; +import org.neo4j.dbms.api.DatabaseManagementServiceBuilder; import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.Label; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.NotFoundException; import org.neo4j.graphdb.RelationshipType; import org.neo4j.graphdb.Result; -import org.neo4j.graphdb.factory.GraphDatabaseFactory; +import org.neo4j.graphdb.Transaction; public class Neo4jLiveTest { private static GraphDatabaseService graphDb; + private static Transaction transaction; + private static DatabaseManagementService managementService; @Before public void setUp() { - GraphDatabaseFactory graphDbFactory = new GraphDatabaseFactory(); - graphDb = graphDbFactory.newEmbeddedDatabase(new File("data/cars")); + managementService = new DatabaseManagementServiceBuilder(new File("data/cars").toPath()) + .setConfig( GraphDatabaseSettings.transaction_timeout, Duration.ofSeconds( 60 ) ) + .setConfig( GraphDatabaseSettings.preallocate_logical_logs, false ).build(); + graphDb = managementService.database( DEFAULT_DATABASE_NAME ); } @After public void tearDown() { - graphDb.shutdown(); + managementService.shutdown(); } @Test public void testPersonCar() { - graphDb.beginTx(); - Node car = graphDb.createNode(Label.label("Car")); + transaction = graphDb.beginTx(); + Node car = transaction.createNode(Label.label("Car")); car.setProperty("make", "tesla"); car.setProperty("model", "model3"); - Node owner = graphDb.createNode(Label.label("Person")); + Node owner = transaction.createNode(Label.label("Person")); owner.setProperty("firstName", "baeldung"); owner.setProperty("lastName", "baeldung"); owner.createRelationshipTo(car, RelationshipType.withName("owner")); - Result result = graphDb.execute("MATCH (c:Car) <-[owner]- (p:Person) " + + Result result = transaction.execute("MATCH (c:Car) <-[owner]- (p:Person) " + "WHERE c.make = 'tesla'" + "RETURN p.firstName, p.lastName"); Map firstResult = result.next(); + Assert.assertEquals("baeldung", firstResult.get("p.firstName")); } @Test public void testCreateNode() { - - graphDb.beginTx(); - - Result result = graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"})" + + transaction = graphDb.beginTx(); + Result result = transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"})" + "RETURN baeldung"); Map firstResult = result.next(); Node firstNode = (Node) firstResult.get("baeldung"); + Assert.assertEquals(firstNode.getProperty("name"), "Baeldung"); } @Test public void testCreateNodeAndLink() { - graphDb.beginTx(); - - Result result = graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + transaction = graphDb.beginTx(); + Result result = transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + "RETURN baeldung, tesla"); Map firstResult = result.next(); + Assert.assertTrue(firstResult.containsKey("baeldung")); Assert.assertTrue(firstResult.containsKey("tesla")); } @Test public void testFindAndReturn() { - graphDb.beginTx(); - - graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + transaction = graphDb.beginTx(); + transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + "RETURN baeldung, tesla"); - Result result = graphDb.execute("MATCH (company:Company)-[:owns]-> (car:Car)" + + Result result = transaction.execute("MATCH (company:Company)-[:owns]-> (car:Car)" + "WHERE car.make='tesla' and car.model='modelX'" + "RETURN company.name"); Map firstResult = result.next(); + Assert.assertEquals(firstResult.get("company.name"), "Baeldung"); } @Test public void testUpdate() { - graphDb.beginTx(); - - graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + transaction = graphDb.beginTx(); + transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + "RETURN baeldung, tesla"); - Result result = graphDb.execute("MATCH (car:Car)" + + Result result = transaction.execute("MATCH (car:Car)" + "WHERE car.make='tesla'" + " SET car.milage=120" + " SET car :Car:Electro" + @@ -127,17 +136,16 @@ public class Neo4jLiveTest { @Test public void testDelete() { - graphDb.beginTx(); - - graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + transaction = graphDb.beginTx(); + transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + "RETURN baeldung, tesla"); - graphDb.execute("MATCH (company:Company)" + + transaction.execute("MATCH (company:Company)" + " WHERE company.name='Baeldung'" + " DELETE company"); - Result result = graphDb.execute("MATCH (company:Company)" + + Result result = transaction.execute("MATCH (company:Company)" + " WHERE company.name='Baeldung'" + " RETURN company"); @@ -146,14 +154,13 @@ public class Neo4jLiveTest { @Test public void testBindings() { - graphDb.beginTx(); - + transaction = graphDb.beginTx(); Map params = new HashMap<>(); params.put("name", "baeldung"); params.put("make", "tesla"); params.put("model", "modelS"); - Result result = graphDb.execute("CREATE (baeldung:Company {name:$name}) " + + Result result = transaction.execute("CREATE (baeldung:Company {name:$name}) " + "-[:owns]-> (tesla:Car {make: $make, model: $model})" + "RETURN baeldung, tesla", params); diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java index 96e5e76402..e824873c32 100644 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java +++ b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java @@ -1,11 +1,13 @@ package com.baeldung.neo4j; +import static com.baeldung.TestContainersTestBase.getDriver; +import static org.junit.jupiter.api.Assertions.assertEquals; + import java.util.HashMap; import java.util.Map; -import org.junit.Assert; -import org.junit.Test; -import org.neo4j.ogm.config.Configuration; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.neo4j.ogm.model.Result; import org.neo4j.ogm.session.Session; import org.neo4j.ogm.session.SessionFactory; @@ -15,13 +17,18 @@ import com.baeldung.spring.data.neo4j.domain.Company; public class Neo4jOgmLiveTest { + private static SessionFactory sessionFactory; + private static Session session; + + @BeforeAll + public static void oneTimeSetUp() { + sessionFactory = new SessionFactory(getDriver(), "com.baeldung.spring.data.neo4j.domain"); + session = sessionFactory.openSession(); + session.purgeDatabase(); + } + @Test - public void testOgm() { - Configuration conf = new Configuration.Builder().build(); - - SessionFactory factory = new SessionFactory(conf, "com.baeldung.spring.data.neo4j.domain"); - Session session = factory.openSession(); - + void testOgm() { Car tesla = new Car("tesla", "modelS"); Company baeldung = new Company("baeldung"); @@ -29,7 +36,7 @@ public class Neo4jOgmLiveTest { session.save(baeldung); - Assert.assertEquals(1, session.countEntitiesOfType(Company.class)); + assertEquals(1, session.countEntitiesOfType(Company.class)); Map params = new HashMap<>(); params.put("make", "tesla"); @@ -39,9 +46,9 @@ public class Neo4jOgmLiveTest { Map firstResult = result.iterator().next(); - Assert.assertEquals(firstResult.size(), 1); + assertEquals(1, firstResult.size()); Company actual = (Company) firstResult.get("company"); - Assert.assertEquals(actual.getName(), baeldung.getName()); + assertEquals(actual.getName(), baeldung.getName()); } } diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java index 3d9215f32f..f91fa2303c 100644 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java @@ -75,7 +75,7 @@ public class MovieRepositoryIntegrationTest { public void testCount() { System.out.println("count"); long movieCount = movieRepository.count(); - assertNotNull(movieCount); + assertEquals(1, movieCount); } @@ -83,7 +83,7 @@ public class MovieRepositoryIntegrationTest { @DirtiesContext public void testFindAll() { System.out.println("findAll"); - Collection result = (Collection) movieRepository.findAll(); + Collection result = movieRepository.findAll(); assertNotNull(result); assertEquals(1, result.size()); } @@ -125,7 +125,7 @@ public class MovieRepositoryIntegrationTest { public void testDeleteAll() { System.out.println("deleteAll"); movieRepository.deleteAll(); - Collection result = (Collection) movieRepository.findAll(); + Collection result = movieRepository.findAll(); assertEquals(0, result.size()); } } From 229a616c059ac2d8905e86a3b14304bc72d9df6e Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Mon, 12 Jun 2023 23:05:26 +0300 Subject: [PATCH 026/170] fix intendation --- .../spring-data-yugabytedb/pom.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/persistence-modules/spring-data-yugabytedb/pom.xml b/persistence-modules/spring-data-yugabytedb/pom.xml index a14f0e7114..c1095a20ca 100644 --- a/persistence-modules/spring-data-yugabytedb/pom.xml +++ b/persistence-modules/spring-data-yugabytedb/pom.xml @@ -33,14 +33,14 @@ spring-boot-starter-test test - - org.postgresql - postgresql - - - org.springframework.boot - spring-boot-starter-data-jpa - + + org.postgresql + postgresql + + + org.springframework.boot + spring-boot-starter-data-jpa + From b50712ae429aafe125f207fd1417b0052fa85a89 Mon Sep 17 00:00:00 2001 From: timis1 Date: Tue, 13 Jun 2023 00:42:12 +0300 Subject: [PATCH 027/170] JAVA-20167 Changes in MovieRepositoryIntegrationTest --- persistence-modules/spring-data-neo4j/pom.xml | 12 ++++ .../neo4j/MovieRepositoryIntegrationTest.java | 67 +++++++++++++------ 2 files changed, 58 insertions(+), 21 deletions(-) diff --git a/persistence-modules/spring-data-neo4j/pom.xml b/persistence-modules/spring-data-neo4j/pom.xml index 705fe35d3c..a2fa29e753 100644 --- a/persistence-modules/spring-data-neo4j/pom.xml +++ b/persistence-modules/spring-data-neo4j/pom.xml @@ -105,6 +105,18 @@ + + org.neo4j.test + neo4j-harness + 5.5.0 + test + + + org.slf4j + slf4j-nop + + + diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java index f91fa2303c..1878eb12b6 100644 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java @@ -1,5 +1,9 @@ package com.baeldung.spring.data.neo4j; +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 com.baeldung.spring.data.neo4j.config.MovieDatabaseNeo4jTestConfiguration; import com.baeldung.spring.data.neo4j.domain.Movie; import com.baeldung.spring.data.neo4j.domain.Person; @@ -7,37 +11,44 @@ import com.baeldung.spring.data.neo4j.domain.Role; import com.baeldung.spring.data.neo4j.repository.MovieRepository; import com.baeldung.spring.data.neo4j.repository.PersonRepository; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.neo4j.harness.Neo4j; +import org.neo4j.harness.Neo4jBuilders; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.neo4j.DataNeo4jTest; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; import java.util.*; -import static junit.framework.TestCase.assertNull; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MovieDatabaseNeo4jTestConfiguration.class) @ActiveProfiles(profiles = "test") -public class MovieRepositoryIntegrationTest { +@DataNeo4jTest +class MovieRepositoryIntegrationTest { @Autowired - private MovieRepository movieRepository; + private static MovieRepository movieRepository; @Autowired - private PersonRepository personRepository; + private static PersonRepository personRepository; public MovieRepositoryIntegrationTest() { } - @Before - public void initializeDatabase() { + private static Neo4j embeddedDatabaseServer; + + @BeforeAll + static void initializeNeo4j() { + + embeddedDatabaseServer = Neo4jBuilders.newInProcessBuilder() + .withDisabledServer() + .build(); + System.out.println("seeding embedded database"); Movie italianJob = new Movie(); italianJob.setTitle("The Italian Job"); @@ -60,9 +71,23 @@ public class MovieRepositoryIntegrationTest { movieRepository.save(italianJob); } + @DynamicPropertySource + static void neo4jProperties(DynamicPropertyRegistry registry) { + + registry.add("spring.neo4j.uri", embeddedDatabaseServer::boltURI); + registry.add("spring.neo4j.authentication.username", () -> "neo4j"); + registry.add("spring.neo4j.authentication.password", () -> null); + } + + @AfterAll + static void stopNeo4j() { + + embeddedDatabaseServer.close(); + } + @Test @DirtiesContext - public void testFindByTitle() { + void testFindByTitle() { System.out.println("findByTitle"); String title = "The Italian Job"; Movie result = movieRepository.findByTitle(title); @@ -72,7 +97,7 @@ public class MovieRepositoryIntegrationTest { @Test @DirtiesContext - public void testCount() { + void testCount() { System.out.println("count"); long movieCount = movieRepository.count(); @@ -81,7 +106,7 @@ public class MovieRepositoryIntegrationTest { @Test @DirtiesContext - public void testFindAll() { + void testFindAll() { System.out.println("findAll"); Collection result = movieRepository.findAll(); assertNotNull(result); @@ -90,7 +115,7 @@ public class MovieRepositoryIntegrationTest { @Test @DirtiesContext - public void testFindByTitleContaining() { + void testFindByTitleContaining() { System.out.println("findByTitleContaining"); String title = "Italian"; Collection result = movieRepository.findByTitleContaining(title); @@ -100,7 +125,7 @@ public class MovieRepositoryIntegrationTest { @Test @DirtiesContext - public void testGraph() { + void testGraph() { System.out.println("graph"); List> graph = movieRepository.graph(5); assertEquals(1, graph.size()); @@ -114,7 +139,7 @@ public class MovieRepositoryIntegrationTest { @Test @DirtiesContext - public void testDeleteMovie() { + void testDeleteMovie() { System.out.println("deleteMovie"); movieRepository.delete(movieRepository.findByTitle("The Italian Job")); assertNull(movieRepository.findByTitle("The Italian Job")); @@ -122,7 +147,7 @@ public class MovieRepositoryIntegrationTest { @Test @DirtiesContext - public void testDeleteAll() { + void testDeleteAll() { System.out.println("deleteAll"); movieRepository.deleteAll(); Collection result = movieRepository.findAll(); From d902e26e85dacb383ac1135746e524f90f9a7681 Mon Sep 17 00:00:00 2001 From: "tudor.marc" Date: Tue, 13 Jun 2023 01:00:38 +0300 Subject: [PATCH 028/170] BAEL-6310 - guide to JacksonJr --- jackson-jr/pom.xml | 38 ++++++++ .../jacksonjr/CustomDateDeserializer.java | 22 +++++ .../jacksonjr/CustomDateSerializer.java | 20 ++++ .../baeldung/jacksonjr/JacksonJrFeatures.java | 96 +++++++++++++++++++ .../baeldung/jacksonjr/MyHandlerProvider.java | 28 ++++++ .../java/com/baeldung/jacksonjr/Person.java | 19 ++++ .../jacksonjr/JacksonJrFeaturesUnitTest.java | 64 +++++++++++++ pom.xml | 1 + 8 files changed, 288 insertions(+) create mode 100644 jackson-jr/pom.xml create mode 100644 jackson-jr/src/main/java/com/baeldung/jacksonjr/CustomDateDeserializer.java create mode 100644 jackson-jr/src/main/java/com/baeldung/jacksonjr/CustomDateSerializer.java create mode 100644 jackson-jr/src/main/java/com/baeldung/jacksonjr/JacksonJrFeatures.java create mode 100644 jackson-jr/src/main/java/com/baeldung/jacksonjr/MyHandlerProvider.java create mode 100644 jackson-jr/src/main/java/com/baeldung/jacksonjr/Person.java create mode 100644 jackson-jr/src/test/java/com/baeldung/jacksonjr/JacksonJrFeaturesUnitTest.java diff --git a/jackson-jr/pom.xml b/jackson-jr/pom.xml new file mode 100644 index 0000000000..0dcb62fdae --- /dev/null +++ b/jackson-jr/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + jackson-jr + jackson-jr + pom + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + + + com.fasterxml.jackson.jr + jackson-jr-all + 2.15.2 + + + com.fasterxml.jackson.jr + jackson-jr-annotation-support + 2.15.2 + + + org.projectlombok + lombok + RELEASE + compile + + + + + \ No newline at end of file diff --git a/jackson-jr/src/main/java/com/baeldung/jacksonjr/CustomDateDeserializer.java b/jackson-jr/src/main/java/com/baeldung/jacksonjr/CustomDateDeserializer.java new file mode 100644 index 0000000000..df977de966 --- /dev/null +++ b/jackson-jr/src/main/java/com/baeldung/jacksonjr/CustomDateDeserializer.java @@ -0,0 +1,22 @@ +package com.baeldung.jacksonjr; + +import com.fasterxml.jackson.jr.ob.api.ValueReader; +import com.fasterxml.jackson.jr.ob.impl.JSONReader; +import com.fasterxml.jackson.jr.private_.JsonParser; + +import java.io.IOException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +public class CustomDateDeserializer extends ValueReader { + private final static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + public CustomDateDeserializer () { + super(LocalDate.class); + } + + @Override + public Object read (JSONReader jsonReader, JsonParser jsonParser) throws IOException { + return LocalDate.parse(jsonParser.getText(), dtf); + } +} diff --git a/jackson-jr/src/main/java/com/baeldung/jacksonjr/CustomDateSerializer.java b/jackson-jr/src/main/java/com/baeldung/jacksonjr/CustomDateSerializer.java new file mode 100644 index 0000000000..9b2596cd2c --- /dev/null +++ b/jackson-jr/src/main/java/com/baeldung/jacksonjr/CustomDateSerializer.java @@ -0,0 +1,20 @@ +package com.baeldung.jacksonjr; + +import com.fasterxml.jackson.jr.ob.api.ValueWriter; +import com.fasterxml.jackson.jr.ob.impl.JSONWriter; +import com.fasterxml.jackson.jr.private_.JsonGenerator; + +import java.io.IOException; +import java.time.LocalDate; + +public class CustomDateSerializer implements ValueWriter { + @Override + public void writeValue (JSONWriter jsonWriter, JsonGenerator jsonGenerator, Object o) throws IOException { + jsonGenerator.writeString(o.toString()); + } + + @Override + public Class valueType () { + return LocalDate.class; + } +} diff --git a/jackson-jr/src/main/java/com/baeldung/jacksonjr/JacksonJrFeatures.java b/jackson-jr/src/main/java/com/baeldung/jacksonjr/JacksonJrFeatures.java new file mode 100644 index 0000000000..26adbf12d2 --- /dev/null +++ b/jackson-jr/src/main/java/com/baeldung/jacksonjr/JacksonJrFeatures.java @@ -0,0 +1,96 @@ +package com.baeldung.jacksonjr; + +import com.fasterxml.jackson.jr.annotationsupport.JacksonAnnotationExtension; +import com.fasterxml.jackson.jr.ob.JSON; +import com.fasterxml.jackson.jr.ob.JacksonJrExtension; +import com.fasterxml.jackson.jr.ob.api.ExtensionContext; + +import java.io.IOException; +import java.util.LinkedHashMap; + +public class JacksonJrFeatures { + + public static String jsonObject() throws IOException { + return JSON.std + .with(JSON.Feature.PRETTY_PRINT_OUTPUT) + .asString(new LinkedHashMap() {{ + put("name", "John Doe"); + put("age", 30); + }}); + } + + public static String jsonComposer() throws IOException { + return JSON.std + .with(JSON.Feature.PRETTY_PRINT_OUTPUT) + .composeString() + .startObject() + .startArrayField("objectArray") + .startObject() + .put("name", "name1") + .put("age", 11) + .end() + .startObject() + .put("name", "name2") + .put("age", 12) + .end() + .end() + .startArrayField("array") + .add(1) + .add(2) + .add(3) + .end() + .startObjectField("object") + .put("name", "name3") + .put("age", 13) + .end() + .put("last", true) + .end() + .finish(); + } + + public static String objectSerialization(Person person) throws IOException { + return JSON.std + .with(JSON.Feature.PRETTY_PRINT_OUTPUT) + .asString(person); + } + + public static String objectAnnotationSerialization(Person person) throws IOException { + return JSON.builder() + .register(JacksonAnnotationExtension.std) + .build() + .with(JSON.Feature.PRETTY_PRINT_OUTPUT) + .asString(person); + } + + public static String customObjectSerialization(Person person) throws IOException { + return JSON.builder() + .register(new JacksonJrExtension() { + @Override + protected void register (ExtensionContext extensionContext) { + extensionContext.insertProvider(new MyHandlerProvider()); + } + }) + .build() + .with(JSON.Feature.PRETTY_PRINT_OUTPUT) + .asString(person); + } + + public static Person objectDeserialization(String json) throws IOException { + return JSON.std + .with(JSON.Feature.PRETTY_PRINT_OUTPUT) + .beanFrom(Person.class, json); + } + + public static Person customObjectDeserialization(String json) throws IOException { + return JSON.builder() + .register(new JacksonJrExtension() { + @Override + protected void register (ExtensionContext extensionContext) { + extensionContext.insertProvider(new MyHandlerProvider()); + } + }) + .build() + .with(JSON.Feature.PRETTY_PRINT_OUTPUT) + .beanFrom(Person.class, json); + } +} diff --git a/jackson-jr/src/main/java/com/baeldung/jacksonjr/MyHandlerProvider.java b/jackson-jr/src/main/java/com/baeldung/jacksonjr/MyHandlerProvider.java new file mode 100644 index 0000000000..0b76187592 --- /dev/null +++ b/jackson-jr/src/main/java/com/baeldung/jacksonjr/MyHandlerProvider.java @@ -0,0 +1,28 @@ +package com.baeldung.jacksonjr; + +import com.fasterxml.jackson.jr.ob.api.ReaderWriterProvider; +import com.fasterxml.jackson.jr.ob.api.ValueReader; +import com.fasterxml.jackson.jr.ob.api.ValueWriter; +import com.fasterxml.jackson.jr.ob.impl.JSONReader; +import com.fasterxml.jackson.jr.ob.impl.JSONWriter; + +import java.time.LocalDate; + +public class MyHandlerProvider extends ReaderWriterProvider { + + public ValueWriter findValueWriter (JSONWriter writeContext, + Class type) { + if (type == LocalDate.class) { + return new CustomDateSerializer(); + } + return null; + } + + @Override + public ValueReader findValueReader (JSONReader readContext, Class type) { + if (type.equals(LocalDate.class)) { + return new CustomDateDeserializer(); + } + return null; + } +} diff --git a/jackson-jr/src/main/java/com/baeldung/jacksonjr/Person.java b/jackson-jr/src/main/java/com/baeldung/jacksonjr/Person.java new file mode 100644 index 0000000000..8effc64cd9 --- /dev/null +++ b/jackson-jr/src/main/java/com/baeldung/jacksonjr/Person.java @@ -0,0 +1,19 @@ +package com.baeldung.jacksonjr; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Person { + @JsonProperty("person_name") + private String name; + private int age; + private LocalDate birthDate; +} diff --git a/jackson-jr/src/test/java/com/baeldung/jacksonjr/JacksonJrFeaturesUnitTest.java b/jackson-jr/src/test/java/com/baeldung/jacksonjr/JacksonJrFeaturesUnitTest.java new file mode 100644 index 0000000000..db17d2e175 --- /dev/null +++ b/jackson-jr/src/test/java/com/baeldung/jacksonjr/JacksonJrFeaturesUnitTest.java @@ -0,0 +1,64 @@ +package com.baeldung.jacksonjr; + +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.*; + +public class JacksonJrFeaturesUnitTest { + + @Test + public void whenSerializingObject_thenReturnJson() throws IOException { + String json = JacksonJrFeatures.jsonObject(); + assertTrue(json.contains("name")); + assertTrue(json.contains("age")); + } + + @Test + public void whenSerializingComposer_thenReturnJson() throws IOException { + String json = JacksonJrFeatures.jsonComposer(); + assertTrue(json.contains("objectArray")); + assertTrue(json.contains("object")); + } + + @Test + public void whenSerializingSimpleObject_thenAnnotationIsNotConsidered() throws IOException { + Person person = new Person("John Doe", 30, null); + String json = JacksonJrFeatures.objectSerialization(person); + assertTrue(json.contains("name")); + assertFalse(json.contains("person_name")); + } + + @Test + public void whenDeserializingJsonObject_thenObjectsAreEqual() throws IOException { + Person person = new Person("John Doe", 30, null); + String json = JacksonJrFeatures.objectSerialization(person); + Person deserializedPerson = JacksonJrFeatures.objectDeserialization(json); + assertEquals(person, deserializedPerson); + } + + @Test + public void whenSerializingWithAnnotations_thenAnnotationIsConsidered() throws IOException { + Person person = new Person("John Doe", 30, null); + String json = JacksonJrFeatures.objectAnnotationSerialization(person); + assertTrue(json.contains("person_name")); + } + + @Test + public void whenSerializingCustomObject_thenLocalDateIsSerializedAsString() throws IOException { + Person person = new Person("John Doe", 30, LocalDate.now()); + String json = JacksonJrFeatures.customObjectSerialization(person); + System.out.println(json); + assertTrue(json.contains("birthDate")); + } + + @Test + public void whenDeserializingCustomObject_thenLocalDateIsDeserialized() throws IOException { + Person person = new Person("John Doe", 30, LocalDate.now()); + String json = JacksonJrFeatures.customObjectSerialization(person); + Person deserializedPerson = JacksonJrFeatures.customObjectDeserialization(json); + assertEquals(person, deserializedPerson); + } +} diff --git a/pom.xml b/pom.xml index 7c726c1015..36c7091880 100644 --- a/pom.xml +++ b/pom.xml @@ -780,6 +780,7 @@ custom-pmd data-structures ddd-contexts + jackson-jr jackson-modules jmh deeplearning4j From 17f65411bde86e55b7c6d06e1954c81b49de1dc7 Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Tue, 13 Jun 2023 08:41:20 -0300 Subject: [PATCH 029/170] BAEL-6046 MongoDB - Field Level Encryption (#14229) * bael-6046 - first draft * review 1 * review 2 * null checks and lambda * review 3 * removing converter * debug * auto encryption config * createKeyUniqueIndex() and updated dependencies. * Review 5. --- .../com/baeldung/boot/csfle/data/Citizen.java | 6 ++-- .../boot/csfle/data/EncryptedCitizen.java | 4 +-- .../boot/csfle/service/CitizenService.java | 31 +++++++++++-------- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/Citizen.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/Citizen.java index 11e776123a..fb38ae4018 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/Citizen.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/Citizen.java @@ -12,10 +12,8 @@ public class Citizen { public Citizen() { } - public Citizen(EncryptedCitizen encryptedCitizen) { - if (encryptedCitizen != null) { - this.name = encryptedCitizen.getName(); - } + public Citizen(String name) { + this.name = name; } public String getName() { diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/EncryptedCitizen.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/EncryptedCitizen.java index c7ca5566a9..b8d7f413ce 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/EncryptedCitizen.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/EncryptedCitizen.java @@ -13,8 +13,8 @@ public class EncryptedCitizen { public EncryptedCitizen() { } - public EncryptedCitizen(Citizen citizen) { - this.name = citizen.getName(); + public EncryptedCitizen(String name) { + this.name = name; } public String getName() { diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java index c93b00f3f8..094483bbdf 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java @@ -39,7 +39,7 @@ public class CitizenService { if (encryptionConfig.isAutoEncryption()) { return mongo.save(citizen); } else { - EncryptedCitizen encryptedCitizen = new EncryptedCitizen(citizen); + EncryptedCitizen encryptedCitizen = new EncryptedCitizen(citizen.getName()); encryptedCitizen.setEmail(encrypt(citizen.getEmail(), DETERMINISTIC_ALGORITHM)); encryptedCitizen.setBirthYear(encrypt(citizen.getBirthYear(), RANDOM_ALGORITHM)); @@ -77,19 +77,10 @@ public class CitizenService { } } - public Binary encrypt(Object value, String algorithm) { - if (value == null) + public Binary encrypt(BsonValue bsonValue, String algorithm) { + if (bsonValue == null) return null; - BsonValue bsonValue; - if (value instanceof Integer) { - bsonValue = new BsonInt32((Integer) value); - } else if (value instanceof String) { - bsonValue = new BsonString((String) value); - } else { - throw new IllegalArgumentException("unsupported type: " + value.getClass()); - } - EncryptOptions options = new EncryptOptions(algorithm); options.keyId(encryptionConfig.getDataKeyId()); @@ -97,6 +88,20 @@ public class CitizenService { return new Binary(encryptedValue.getType(), encryptedValue.getData()); } + public Binary encrypt(String value, String algorithm) { + if (value == null) + return null; + + return encrypt(new BsonString(value), algorithm); + } + + public Binary encrypt(Integer value, String algorithm) { + if (value == null) + return null; + + return encrypt(new BsonInt32(value), algorithm); + } + public BsonValue decryptProperty(Binary value) { if (value == null) return null; @@ -108,7 +113,7 @@ public class CitizenService { if (encrypted == null) return null; - Citizen citizen = new Citizen(encrypted); + Citizen citizen = new Citizen(encrypted.getName()); BsonValue decryptedBirthYear = decryptProperty(encrypted.getBirthYear()); if (decryptedBirthYear != null) { From 2a4950a9d74ae6334e6059d3dca4c6535315f99b Mon Sep 17 00:00:00 2001 From: timis1 Date: Tue, 13 Jun 2023 20:40:31 +0300 Subject: [PATCH 030/170] JAVA-20167 Additional changes for test MovieRepositoryIntegrationTest --- .gitignore | 5 ++++- persistence-modules/spring-data-neo4j/pom.xml | 4 +++- .../data/neo4j/MovieRepositoryIntegrationTest.java | 12 ++++++++---- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 7725bf202e..f124a385d4 100644 --- a/.gitignore +++ b/.gitignore @@ -120,4 +120,7 @@ libraries-2/src/test/resources/crawler4j/** devDb*.db #jaxb -*.xjb \ No newline at end of file +*.xjb + +#spring-data-neo4j +persistence-modules/spring-data-neo4j/data/** \ No newline at end of file diff --git a/persistence-modules/spring-data-neo4j/pom.xml b/persistence-modules/spring-data-neo4j/pom.xml index a2fa29e753..75d0aefc23 100644 --- a/persistence-modules/spring-data-neo4j/pom.xml +++ b/persistence-modules/spring-data-neo4j/pom.xml @@ -108,7 +108,7 @@ org.neo4j.test neo4j-harness - 5.5.0 + ${neo4j.version} test @@ -129,6 +129,8 @@ 4.0.4 4.0.9 3.2.39 + 2.0.7 + 1.4.7 \ No newline at end of file diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java index 1878eb12b6..5af501c900 100644 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java @@ -13,6 +13,7 @@ import com.baeldung.spring.data.neo4j.repository.PersonRepository; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.neo4j.harness.Neo4j; import org.neo4j.harness.Neo4jBuilders; @@ -32,10 +33,10 @@ import java.util.*; class MovieRepositoryIntegrationTest { @Autowired - private static MovieRepository movieRepository; + private MovieRepository movieRepository; @Autowired - private static PersonRepository personRepository; + private PersonRepository personRepository; public MovieRepositoryIntegrationTest() { } @@ -43,11 +44,14 @@ class MovieRepositoryIntegrationTest { private static Neo4j embeddedDatabaseServer; @BeforeAll - static void initializeNeo4j() { - + static void setup() { embeddedDatabaseServer = Neo4jBuilders.newInProcessBuilder() .withDisabledServer() .build(); + } + + @BeforeEach + void initializeNeo4j() { System.out.println("seeding embedded database"); Movie italianJob = new Movie(); From 880803be2165aa6e2363a4d807057617debc50a0 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Wed, 14 Jun 2023 05:40:37 +0200 Subject: [PATCH 031/170] [str-all-upper] Check if a String is All Uppercase or Lowercase in Java (#14227) --- .../core-java-string-operations-6/pom.xml | 13 ++- .../StringAllUpperOrLowercaseUnitTest.java | 104 ++++++++++++++++++ 2 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/checkcase/StringAllUpperOrLowercaseUnitTest.java diff --git a/core-java-modules/core-java-string-operations-6/pom.xml b/core-java-modules/core-java-string-operations-6/pom.xml index 8b9eabbc63..ddbb5d0e40 100644 --- a/core-java-modules/core-java-string-operations-6/pom.xml +++ b/core-java-modules/core-java-string-operations-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 core-java-string-operations-6 core-java-string-operations-6 @@ -12,6 +12,14 @@ core-java-modules 0.0.1-SNAPSHOT + + + org.apache.commons + commons-lang3 + ${apache.commons-lang.version} + + + @@ -29,6 +37,7 @@ 11 11 + 3.12.0 \ No newline at end of file diff --git a/core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/checkcase/StringAllUpperOrLowercaseUnitTest.java b/core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/checkcase/StringAllUpperOrLowercaseUnitTest.java new file mode 100644 index 0000000000..6dec5af29a --- /dev/null +++ b/core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/checkcase/StringAllUpperOrLowercaseUnitTest.java @@ -0,0 +1,104 @@ +package com.baeldung.checkcase; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.Test; + +class CaseChecker { + + static boolean allUpper1(String input) { + return input.equals(input.toUpperCase()); + } + + static boolean allLower1(String input) { + return input.equals(input.toLowerCase()); + } + + static boolean allUpper2(String input) { + for (char c : input.toCharArray()) { + // don't write in this way: if (!Character.isUpperCase(c)) + if (Character.isLowerCase(c)) { + return false; + } + } + return true; + } + + static boolean allLower2(String input) { + for (char c : input.toCharArray()) { + // don't write in this way: if (!Character.isLowerCase(c)) + if (Character.isUpperCase(c)) { + return false; + } + } + return true; + } + + static boolean allUpper3(String input) { + return input.chars() + .noneMatch(Character::isLowerCase); + } + + static boolean allLower3(String input) { + return input.chars() + .noneMatch(Character::isUpperCase); + } +} + +public class StringAllUpperOrLowercaseUnitTest { + private static final String UPPER_INPUT = "1: COOL!"; + private static final String LOWER_INPUT = "2: cool!"; + private static final String MIXED_INPUT = "3: Cool!"; + + @Test + void whenComparingToConvertedString_thenGetExpectedResult() { + assertTrue(CaseChecker.allLower1(LOWER_INPUT)); + assertFalse(CaseChecker.allLower1(UPPER_INPUT)); + assertFalse(CaseChecker.allLower1(MIXED_INPUT)); + + assertFalse(CaseChecker.allUpper1(LOWER_INPUT)); + assertTrue(CaseChecker.allUpper1(UPPER_INPUT)); + assertFalse(CaseChecker.allUpper1(MIXED_INPUT)); + } + + @Test + void whenCheckCharInArray_thenGetExpectedResult() { + assertTrue(CaseChecker.allLower2(LOWER_INPUT)); + assertFalse(CaseChecker.allLower2(UPPER_INPUT)); + assertFalse(CaseChecker.allLower2(MIXED_INPUT)); + + assertFalse(CaseChecker.allUpper2(LOWER_INPUT)); + assertTrue(CaseChecker.allUpper2(UPPER_INPUT)); + assertFalse(CaseChecker.allUpper2(MIXED_INPUT)); + } + + @Test + void whenUsingStream_thenGetExpectedResult() { + assertTrue(CaseChecker.allLower3(LOWER_INPUT)); + assertFalse(CaseChecker.allLower3(UPPER_INPUT)); + assertFalse(CaseChecker.allLower3(MIXED_INPUT)); + + assertFalse(CaseChecker.allUpper3(LOWER_INPUT)); + assertTrue(CaseChecker.allUpper3(UPPER_INPUT)); + assertFalse(CaseChecker.allUpper3(MIXED_INPUT)); + } + + @Test + void whenUsingApacheCommons_thenGetExpectedResult() { + assertFalse(StringUtils.isAllLowerCase(LOWER_INPUT)); + assertFalse(StringUtils.isAllLowerCase(UPPER_INPUT)); + assertFalse(StringUtils.isAllLowerCase(MIXED_INPUT)); + + assertFalse(StringUtils.isAllLowerCase("a b")); + assertTrue(StringUtils.isAllLowerCase("ab")); + + assertFalse(StringUtils.isAllUpperCase(LOWER_INPUT)); + assertFalse(StringUtils.isAllUpperCase(UPPER_INPUT)); + assertFalse(StringUtils.isAllUpperCase(MIXED_INPUT)); + + assertFalse(StringUtils.isAllUpperCase("A B")); + assertTrue(StringUtils.isAllUpperCase("AB")); + } +} \ No newline at end of file From 3a078d7c9ccf958bc82f3551e84a0e3db67de94d Mon Sep 17 00:00:00 2001 From: "thibault.faure" Date: Tue, 6 Jun 2023 23:02:22 +0200 Subject: [PATCH 032/170] BAEL-5977 Code for the Throw Exception for Unexpected Input for Enum with Mapstruct article --- mapstruct/pom.xml | 2 +- .../java/com/baeldung/enums/InputLevel.java | 7 +++++ .../java/com/baeldung/enums/LevelMapper.java | 13 +++++++++ .../java/com/baeldung/enums/OutputLevel.java | 7 +++++ .../baeldung/enums/LevelMapperUnitTest.java | 28 +++++++++++++++++++ 5 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 mapstruct/src/main/java/com/baeldung/enums/InputLevel.java create mode 100644 mapstruct/src/main/java/com/baeldung/enums/LevelMapper.java create mode 100644 mapstruct/src/main/java/com/baeldung/enums/OutputLevel.java create mode 100644 mapstruct/src/test/java/com/baeldung/enums/LevelMapperUnitTest.java diff --git a/mapstruct/pom.xml b/mapstruct/pom.xml index 62c9ca5870..7c279acb7b 100644 --- a/mapstruct/pom.xml +++ b/mapstruct/pom.xml @@ -73,7 +73,7 @@ - 1.5.3.Final + 1.5.5.Final 4.3.4.RELEASE 0.2.0 diff --git a/mapstruct/src/main/java/com/baeldung/enums/InputLevel.java b/mapstruct/src/main/java/com/baeldung/enums/InputLevel.java new file mode 100644 index 0000000000..ba7e6735be --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/enums/InputLevel.java @@ -0,0 +1,7 @@ +package com.baeldung.enums; + +enum InputLevel { + + LOW, MEDIUM, HIGH + +} diff --git a/mapstruct/src/main/java/com/baeldung/enums/LevelMapper.java b/mapstruct/src/main/java/com/baeldung/enums/LevelMapper.java new file mode 100644 index 0000000000..d45d98b075 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/enums/LevelMapper.java @@ -0,0 +1,13 @@ +package com.baeldung.enums; + +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ValueMapping; + +@Mapper +interface LevelMapper { + + @ValueMapping(source = MappingConstants.ANY_REMAINING, target = MappingConstants.THROW_EXCEPTION) + OutputLevel inputLevelToOutputLevel(InputLevel inputLevel); + +} diff --git a/mapstruct/src/main/java/com/baeldung/enums/OutputLevel.java b/mapstruct/src/main/java/com/baeldung/enums/OutputLevel.java new file mode 100644 index 0000000000..c1554ec9b4 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/enums/OutputLevel.java @@ -0,0 +1,7 @@ +package com.baeldung.enums; + +enum OutputLevel { + + LOW, HIGH + +} diff --git a/mapstruct/src/test/java/com/baeldung/enums/LevelMapperUnitTest.java b/mapstruct/src/test/java/com/baeldung/enums/LevelMapperUnitTest.java new file mode 100644 index 0000000000..a933ad7e83 --- /dev/null +++ b/mapstruct/src/test/java/com/baeldung/enums/LevelMapperUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.enums; + +import org.junit.jupiter.api.Test; +import org.mapstruct.factory.Mappers; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class LevelMapperUnitTest { + + LevelMapper levelMapper = Mappers.getMapper(LevelMapper.class); + + @Test + void givenHighInputLevel_WhenInputLevelToOutputLevel_ThenHighOutputLevel() { + assertEquals(OutputLevel.HIGH, levelMapper.inputLevelToOutputLevel(InputLevel.HIGH)); + } + + @Test + void givenMediumInputLevel_WhenInputLevelToOutputLevel_ThenThrows() { + assertThrows(IllegalArgumentException.class, () -> levelMapper.inputLevelToOutputLevel(InputLevel.MEDIUM)); + } + + @Test + void givenLowInputLevel_WhenInputLevelToOutputLevel_ThenLowOutputLevel() { + assertEquals(OutputLevel.LOW, levelMapper.inputLevelToOutputLevel(InputLevel.LOW)); + } + +} From 4c825d631189378bb8c443337ca9e56b0b5a22fb Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Thu, 15 Jun 2023 06:09:55 +0200 Subject: [PATCH 033/170] JAVA-22180 | fixed test with simple annotations. (#14225) --- .../springbootredis/config/RedisConfiguration.java | 1 - .../springbootredis/controller/SessionController.java | 1 - .../com/baelding/springbootredis/model/Session.java | 10 ++++++++-- .../SpringBootRedisApplicationIntegrationTest.java | 2 ++ 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/spring-boot-modules/spring-boot-redis/src/main/java/com/baelding/springbootredis/config/RedisConfiguration.java b/spring-boot-modules/spring-boot-redis/src/main/java/com/baelding/springbootredis/config/RedisConfiguration.java index 2c050af8af..896339646b 100644 --- a/spring-boot-modules/spring-boot-redis/src/main/java/com/baelding/springbootredis/config/RedisConfiguration.java +++ b/spring-boot-modules/spring-boot-redis/src/main/java/com/baelding/springbootredis/config/RedisConfiguration.java @@ -2,7 +2,6 @@ package com.baelding.springbootredis.config; import com.baelding.springbootredis.model.Session; import lombok.extern.slf4j.Slf4j; -import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.event.EventListener; diff --git a/spring-boot-modules/spring-boot-redis/src/main/java/com/baelding/springbootredis/controller/SessionController.java b/spring-boot-modules/spring-boot-redis/src/main/java/com/baelding/springbootredis/controller/SessionController.java index 156ca0195f..020de31019 100644 --- a/spring-boot-modules/spring-boot-redis/src/main/java/com/baelding/springbootredis/controller/SessionController.java +++ b/spring-boot-modules/spring-boot-redis/src/main/java/com/baelding/springbootredis/controller/SessionController.java @@ -6,7 +6,6 @@ import com.baelding.springbootredis.service.cache.session.SessionCache; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; diff --git a/spring-boot-modules/spring-boot-redis/src/main/java/com/baelding/springbootredis/model/Session.java b/spring-boot-modules/spring-boot-redis/src/main/java/com/baelding/springbootredis/model/Session.java index 5c9d26147e..b9c8668104 100644 --- a/spring-boot-modules/spring-boot-redis/src/main/java/com/baelding/springbootredis/model/Session.java +++ b/spring-boot-modules/spring-boot-redis/src/main/java/com/baelding/springbootredis/model/Session.java @@ -1,19 +1,25 @@ package com.baelding.springbootredis.model; import lombok.Builder; -import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Data; +import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; import org.springframework.data.redis.core.RedisHash; import org.springframework.data.redis.core.TimeToLive; -@Data @Builder @EqualsAndHashCode @RedisHash(timeToLive = 60L) +@Data +@NoArgsConstructor public class Session { @Id private String id; @TimeToLive private Long expirationInSeconds; + public Session(String id, Long expirationInSeconds) { + this.id = id; + this.expirationInSeconds = expirationInSeconds; + } } diff --git a/spring-boot-modules/spring-boot-redis/src/test/java/com/baelding/springbootredis/SpringBootRedisApplicationIntegrationTest.java b/spring-boot-modules/spring-boot-redis/src/test/java/com/baelding/springbootredis/SpringBootRedisApplicationIntegrationTest.java index 69c88706e4..d1ee5ad68a 100644 --- a/spring-boot-modules/spring-boot-redis/src/test/java/com/baelding/springbootredis/SpringBootRedisApplicationIntegrationTest.java +++ b/spring-boot-modules/spring-boot-redis/src/test/java/com/baelding/springbootredis/SpringBootRedisApplicationIntegrationTest.java @@ -8,6 +8,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; 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.HttpHeaders; import org.springframework.test.web.reactive.server.WebTestClient; @@ -19,6 +20,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = RedisTestConfiguration.class) +@AutoConfigureMockMvc class SpringBootRedisApplicationIntegrationTest { private static final String V1_SESSIONS_ENDPOINT = "/v1/sessions"; From b249bedad75150b8e040aba14a870cec6bcf7670 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Thu, 15 Jun 2023 11:04:30 +0530 Subject: [PATCH 034/170] Java 19673 01 (#14224) * JAVA-19673_01: Changes made for upgraing image-processing module to jdk-17 * JAVA-19673_01: Changes made for upgraing image-processing module to jdk-17 --- image-processing/pom.xml | 8 +++++++- pom.xml | 6 ++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/image-processing/pom.xml b/image-processing/pom.xml index 2a2b92ca48..5c59a53337 100644 --- a/image-processing/pom.xml +++ b/image-processing/pom.xml @@ -91,10 +91,15 @@ webcam-capture ${webcam-capture.version} + + org.openjfx + javafx-graphics + ${javafx-graphics.version} + - 1.3.5 + 1.3.10 1.51h 3.3.2 4.5.1 @@ -105,6 +110,7 @@ 4.2 0.4.11 1.5.5 + 11 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 7c726c1015..e5311ec25f 100644 --- a/pom.xml +++ b/pom.xml @@ -473,8 +473,6 @@ apache-spark - image-processing - jenkins-modules jhipster-modules @@ -635,8 +633,6 @@ apache-spark - image-processing - jenkins-modules jhipster-modules @@ -936,6 +932,7 @@ web-modules xml xml-2 + image-processing @@ -1202,6 +1199,7 @@ web-modules xml xml-2 + image-processing From d72d41c3b7274647f78d95af1af350ab461ae41a Mon Sep 17 00:00:00 2001 From: Balamurugan Date: Thu, 15 Jun 2023 06:58:50 +0100 Subject: [PATCH 035/170] BAEL-6086: removed unnecessary dependency(probably conflict which fails test) (#14235) * BAEL-6086: Added code for webflux default and custom exception along with Unit Tests * BAEL-6086: added missing import * BAEL-6086: reformatting * BAEL-6086: reformatted code * BAEL-6086: removed unnecessary dependency(probably conflict which fails test) --------- Co-authored-by: balasr3 --- spring-reactive-modules/spring-reactive-exceptions/pom.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/spring-reactive-modules/spring-reactive-exceptions/pom.xml b/spring-reactive-modules/spring-reactive-exceptions/pom.xml index 0dca81c529..a9fdb675f5 100644 --- a/spring-reactive-modules/spring-reactive-exceptions/pom.xml +++ b/spring-reactive-modules/spring-reactive-exceptions/pom.xml @@ -20,10 +20,6 @@ org.springframework.boot spring-boot-starter-webflux - - org.springframework.boot - spring-boot-starter-web - org.projectlombok lombok From 0e52c2fbff53b9d22a5044c03201f2da4d9913da Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Jun 2023 21:57:03 +0800 Subject: [PATCH 036/170] Update README.md [skip ci] --- core-java-modules/core-java-arrays-operations-advanced/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-arrays-operations-advanced/README.md b/core-java-modules/core-java-arrays-operations-advanced/README.md index 1f55338644..e3465c9fa3 100644 --- a/core-java-modules/core-java-arrays-operations-advanced/README.md +++ b/core-java-modules/core-java-arrays-operations-advanced/README.md @@ -12,3 +12,4 @@ This module contains articles about advanced operations on arrays in Java. They - [Concatenate Two Arrays in Java](https://www.baeldung.com/java-concatenate-arrays) - [Performance of System.arraycopy() vs. Arrays.copyOf()](https://www.baeldung.com/java-system-arraycopy-arrays-copyof-performance) - [Slicing Arrays in Java](https://www.baeldung.com/java-slicing-arrays) +- [Combining Two or More Byte Arrays](https://www.baeldung.com/java-concatenate-byte-arrays) From cefb2e7ad89445312615f9d4f0fe2804ce083859 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Jun 2023 22:01:03 +0800 Subject: [PATCH 037/170] Update README.md [skip ci] --- gradle-modules/gradle-7/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/gradle-modules/gradle-7/README.md b/gradle-modules/gradle-7/README.md index 6e29e3db30..98fb968e82 100644 --- a/gradle-modules/gradle-7/README.md +++ b/gradle-modules/gradle-7/README.md @@ -5,3 +5,4 @@ - [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) From bc279c62a48ab05b57f075bb18552bd41472b031 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Jun 2023 22:06:30 +0800 Subject: [PATCH 038/170] Update README.md [skip ci] --- jmeter/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/jmeter/README.md b/jmeter/README.md index f01fa4eca5..fe6dd2c539 100644 --- a/jmeter/README.md +++ b/jmeter/README.md @@ -56,3 +56,4 @@ Enjoy it :) - [Basic Authentication in JMeter](https://www.baeldung.com/jmeter-basic-auth) - [JMeter: Latency vs. Load Time](https://www.baeldung.com/java-jmeter-latency-vs-load-time) - [How Do I Generate a Dashboard Report in JMeter?](https://www.baeldung.com/jmeter-dashboard-report) +- [Run JMeter .jmx File From the Command Line and Configure the Report File](https://www.baeldung.com/java-jmeter-command-line) From c75bfdaf29e86605dcbee2ec91e4bb787a7658e0 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Jun 2023 22:09:26 +0800 Subject: [PATCH 039/170] Update README.md [skip ci] --- 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 56f66c10fb..b61937371f 100644 --- a/core-java-modules/core-java-8-datetime-2/README.md +++ b/core-java-modules/core-java-8-datetime-2/README.md @@ -3,4 +3,5 @@ - [Generating Random Dates in Java](https://www.baeldung.com/java-random-dates) - [Creating a LocalDate with Values in Java](https://www.baeldung.com/java-creating-localdate-with-values) - [Parsing Date Strings with Varying Formats](https://www.baeldung.com/java-parsing-dates-many-formats) +- [How Many Days Are There in a Particular Month of a Given Year?](https://www.baeldung.com/days-particular-month-given-year) - [[<-- Prev]](/core-java-modules/core-java-datetime-java8-1) From 553b496565923885477961e8a394756a90765f70 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Jun 2023 22:15:04 +0800 Subject: [PATCH 040/170] Update README.md [skip ci] --- libraries-http-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries-http-2/README.md b/libraries-http-2/README.md index 2b94896ab9..f1215a0b11 100644 --- a/libraries-http-2/README.md +++ b/libraries-http-2/README.md @@ -12,5 +12,6 @@ This module contains articles about HTTP libraries. - [Download a Binary File Using OkHttp](https://www.baeldung.com/java-okhttp-download-binary-file) - [Trusting a Self-Signed Certificate in OkHttp](https://www.baeldung.com/okhttp-self-signed-cert) - [Trusting All Certificates in OkHttp](https://www.baeldung.com/okhttp-client-trust-all-certificates) +- [Mock a URL Connection in Java](https://www.baeldung.com/java-simulate-url-connection) - More articles [[<-- prev]](/libraries-http) From e8b2cccd4f5a3c9ea4dc47c041a4d442ecd65c3f Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Jun 2023 22:23:23 +0800 Subject: [PATCH 041/170] Update README.md [skip ci] --- jackson-modules/jackson-annotations/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/jackson-modules/jackson-annotations/README.md b/jackson-modules/jackson-annotations/README.md index 8b405ec778..e3cb6e6b7f 100644 --- a/jackson-modules/jackson-annotations/README.md +++ b/jackson-modules/jackson-annotations/README.md @@ -9,3 +9,4 @@ This module contains articles about Jackson annotations. - [Jackson JSON Views](https://www.baeldung.com/jackson-json-view-annotation) - [Deduction-Based Polymorphism in Jackson 2.12](https://www.baeldung.com/jackson-deduction-based-polymorphism) - [@JsonIgnore vs @Transient](https://www.baeldung.com/java-jsonignore-vs-transient) +- [@JsonMerge Annotation in Jackson](https://www.baeldung.com/java-jsonmerge-annotation-jackson) From 314b39e97a46eaf5c5a928dc51538617b9b9ecb2 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Jun 2023 22:27:05 +0800 Subject: [PATCH 042/170] Update README.md [skip ci] --- image-compressing/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/image-compressing/README.md b/image-compressing/README.md index b2556062b8..d90bb53344 100644 --- a/image-compressing/README.md +++ b/image-compressing/README.md @@ -1 +1,4 @@ -This module contains tutorials related to the image compression in Java. \ No newline at end of file +This module contains tutorials related to the image compression in Java. + +## Relevant Articles +- [Lossy and Lossless Image Compression Using Java](https://www.baeldung.com/java-image-compression-lossy-lossless) From cf0b7af0c148a0b73636434f7d43e89b7440c5e9 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Jun 2023 22:32:42 +0800 Subject: [PATCH 043/170] Update README.md [skip ci] --- core-java-modules/core-java-datetime-string-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-datetime-string-2/README.md b/core-java-modules/core-java-datetime-string-2/README.md index d59f3b3fca..6ff19a44ab 100644 --- a/core-java-modules/core-java-datetime-string-2/README.md +++ b/core-java-modules/core-java-datetime-string-2/README.md @@ -4,3 +4,4 @@ This module contains articles about parsing and formatting Java date and time ob ### Relevant Articles: - [Convert String to Instant](https://www.baeldung.com/java-string-to-instant) +- [Sort Date Strings in Java](https://www.baeldung.com/java-sort-date-strings) From 058dccb88f6a4fb13538ba3a243b688aa52384b8 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Jun 2023 22:39:06 +0800 Subject: [PATCH 044/170] Update README.md [skip ci] --- spring-web-modules/spring-thymeleaf/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-web-modules/spring-thymeleaf/README.md b/spring-web-modules/spring-thymeleaf/README.md index 653e6df5b9..2d1bc848d8 100644 --- a/spring-web-modules/spring-thymeleaf/README.md +++ b/spring-web-modules/spring-thymeleaf/README.md @@ -10,6 +10,7 @@ This module contains articles about Spring with Thymeleaf - [How to Work with Dates in Thymeleaf](https://www.baeldung.com/dates-in-thymeleaf) - [Working with Fragments in Thymeleaf](https://www.baeldung.com/spring-thymeleaf-fragments) - [JavaScript Function Call with Thymeleaf](https://www.baeldung.com/thymeleaf-js-function-call) +- [Add a Checked Attribute to Input Conditionally in Thymeleaf](https://www.baeldung.com/thymeleaf-conditional-checked-attribute) - [[next -->]](/spring-thymeleaf-2) ### Build the Project From d75e74270c9215c6677a3860215f5c82195317a3 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Jun 2023 22:44:37 +0800 Subject: [PATCH 045/170] Update README.md [skip ci] --- spring-web-modules/spring-mvc-java-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-web-modules/spring-mvc-java-3/README.md b/spring-web-modules/spring-mvc-java-3/README.md index 7d843af9ea..f61e004bb5 100644 --- a/spring-web-modules/spring-mvc-java-3/README.md +++ b/spring-web-modules/spring-mvc-java-3/README.md @@ -1 +1,2 @@ ### Relevant Articles: +- [Java IllegalStateException: “getInputStream() has already been called for this request”](https://www.baeldung.com/java-servletrequest-illegalstateexception) From feb26e3bb027fc772aed5ecc0c29d3d22a0926b5 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Jun 2023 22:59:15 +0800 Subject: [PATCH 046/170] Update README.md [skip ci] --- core-java-modules/core-java-string-operations-6/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-operations-6/README.md b/core-java-modules/core-java-string-operations-6/README.md index 190880a5dd..a6e5380424 100644 --- a/core-java-modules/core-java-string-operations-6/README.md +++ b/core-java-modules/core-java-string-operations-6/README.md @@ -2,3 +2,4 @@ ### Relevant Articles: - [Find the Longest Word in a Given String in Java](https://www.baeldung.com/java-longest-word-string) +- [Check if a String Is All Uppercase or Lowercase in Java](https://www.baeldung.com/java-check-string-uppercase-lowercase) From 7bf3991066d823493077a774be962f8bc5c48de0 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Jun 2023 23:04:52 +0800 Subject: [PATCH 047/170] 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 3bb2b1543e..73b88a9885 100644 --- a/testing-modules/mockito-2/README.md +++ b/testing-modules/mockito-2/README.md @@ -4,3 +4,4 @@ This module contains articles about Mockito ### Relevant Articles: - [Mocking a Singleton With Mockito](https://www.baeldung.com/java-mockito-singleton) +- [Resolving Mockito Exception: Wanted But Not Invoked](https://www.baeldung.com/mockito-exception-wanted-but-not-invoked) From 57a59c457a75ae9ace20e7cf9032eb77a0690978 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Jun 2023 23:14:25 +0800 Subject: [PATCH 048/170] Update README.md [skip ci] --- persistence-modules/spring-data-elasticsearch/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-data-elasticsearch/README.md b/persistence-modules/spring-data-elasticsearch/README.md index 22126c2f00..dfa581a59a 100644 --- a/persistence-modules/spring-data-elasticsearch/README.md +++ b/persistence-modules/spring-data-elasticsearch/README.md @@ -6,6 +6,7 @@ - [Guide to Elasticsearch in Java](https://www.baeldung.com/elasticsearch-java) - [Geospatial Support in ElasticSearch](https://www.baeldung.com/elasticsearch-geo-spatial) - [A Simple Tagging Implementation with Elasticsearch](https://www.baeldung.com/elasticsearch-tagging) +- [What Is Elasticsearch?](https://www.baeldung.com/java-elasticsearch) ### Build the Project with Tests Running ``` From dc80d66ef03cd5423bf460f5f8701413d694dd31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=20Peterli=C4=87?= Date: Thu, 15 Jun 2023 17:43:10 +0200 Subject: [PATCH 049/170] BAEL-6432 - Asserting Equality on Two Classes without an Equals Method (#14193) --- testing-modules/testing-assertions/pom.xml | 16 ++++ .../com/baeldung/assertequals/Address.java | 61 ++++++++++++ .../com/baeldung/assertequals/Person.java | 60 ++++++++++++ .../assertequals/EqualityUnitTest.java | 96 +++++++++++++++++++ 4 files changed, 233 insertions(+) create mode 100644 testing-modules/testing-assertions/src/main/java/com/baeldung/assertequals/Address.java create mode 100644 testing-modules/testing-assertions/src/main/java/com/baeldung/assertequals/Person.java create mode 100644 testing-modules/testing-assertions/src/test/java/com/baeldung/assertequals/EqualityUnitTest.java diff --git a/testing-modules/testing-assertions/pom.xml b/testing-modules/testing-assertions/pom.xml index 09f4291b78..1da53bd77e 100644 --- a/testing-modules/testing-assertions/pom.xml +++ b/testing-modules/testing-assertions/pom.xml @@ -24,6 +24,22 @@ ${commons-collections4.version} test + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + test + + + org.hamcrest + hamcrest + ${hamcrest.version} + test + + + 2.2 + + \ No newline at end of file diff --git a/testing-modules/testing-assertions/src/main/java/com/baeldung/assertequals/Address.java b/testing-modules/testing-assertions/src/main/java/com/baeldung/assertequals/Address.java new file mode 100644 index 0000000000..905dd44af9 --- /dev/null +++ b/testing-modules/testing-assertions/src/main/java/com/baeldung/assertequals/Address.java @@ -0,0 +1,61 @@ +package com.baeldung.assertequals; + +public class Address { + + private Long id; + + private String city; + + private String street; + + private String country; + + public Address(final Long id, final String city, final String street, final String country) { + this.id = id; + this.city = city; + this.street = street; + this.country = country; + } + + public Long getId() { + return id; + } + + public void setId(final Long id) { + this.id = id; + } + + public String getCity() { + return city; + } + + public void setCity(final String city) { + this.city = city; + } + + public String getStreet() { + return street; + } + + public void setStreet(final String street) { + this.street = street; + } + + public String getCountry() { + return country; + } + + public void setCountry(final String country) { + this.country = country; + } + + @Override + public String toString() { + return "Address{" + + "id=" + id + + ", city='" + city + '\'' + + ", street='" + street + '\'' + + ", country='" + country + '\'' + + '}'; + } +} diff --git a/testing-modules/testing-assertions/src/main/java/com/baeldung/assertequals/Person.java b/testing-modules/testing-assertions/src/main/java/com/baeldung/assertequals/Person.java new file mode 100644 index 0000000000..8ea64357ec --- /dev/null +++ b/testing-modules/testing-assertions/src/main/java/com/baeldung/assertequals/Person.java @@ -0,0 +1,60 @@ +package com.baeldung.assertequals; + +public class Person { + + private Long id; + + private String firstName; + + private String lastName; + + private Address address; + + public Person(final Long id, final String firstName, final String lastName) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + } + + public Address getAddress() { + return address; + } + + public void setAddress(final Address address) { + this.address = address; + } + + public Long getId() { + return id; + } + + public void setId(final Long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(final String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(final String lastName) { + this.lastName = lastName; + } + + @Override + public String toString() { + return "Person{" + + "id=" + id + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", address=" + address + + '}'; + } +} diff --git a/testing-modules/testing-assertions/src/test/java/com/baeldung/assertequals/EqualityUnitTest.java b/testing-modules/testing-assertions/src/test/java/com/baeldung/assertequals/EqualityUnitTest.java new file mode 100644 index 0000000000..bf20e02a1d --- /dev/null +++ b/testing-modules/testing-assertions/src/test/java/com/baeldung/assertequals/EqualityUnitTest.java @@ -0,0 +1,96 @@ +package com.baeldung.assertequals; + +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.ReflectionToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.hamcrest.MatcherAssert; +import org.junit.jupiter.api.Test; +import org.mockito.internal.matchers.apachecommons.ReflectionEquals; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.samePropertyValuesAs; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class EqualityUnitTest { + + @Test + void givenPersons_whenUseRecursiveComparison_thenOk() { + Person expected = new Person(1L, "Jane", "Doe"); + Address address1 = new Address(1L, "New York", "Sesame Street", "United States"); + expected.setAddress(address1); + + Person actual = new Person(1L, "Jane", "Doe"); + Address address2 = new Address(1L, "New York", "Sesame Street", "United States"); + actual.setAddress(address2); + + assertThat(actual).usingRecursiveComparison().isEqualTo(expected); + } + + @Test + void givenPersons_whenUseRecursiveComparisonIgnoringField_thenOk() { + Person expected = new Person(1L, "Jane", "Doe"); + Person actual = new Person(2L, "Jane", "Doe"); + + assertThat(actual) + .usingRecursiveComparison() + .ignoringFields("id") + .isEqualTo(expected); + } + + @Test + void givenPersons_whenCheckForSamePropertyValues_thenReturnOk() { + Person expected = new Person(1L, "Jane", "Doe"); + Address address1 = new Address(1L, "New York", "Sesame Street", "United States"); + expected.setAddress(address1); + + Person actual = new Person(1L, "Jane", "Doe"); + Address address2 = new Address(1L, "New York", "Sesame Street", "United States"); + actual.setAddress(address2); + + MatcherAssert.assertThat(actual, samePropertyValuesAs(expected, "address")); + MatcherAssert.assertThat(actual.getAddress(), samePropertyValuesAs(expected.getAddress())); + } + + @Test + void givenPerson_whenReflectionToStringBuilder_thenReturnOk() { + Person expected = new Person(1L, "Jane", "Doe"); + Address address1 = new Address(1L, "New York", "Sesame Street", "United States"); + expected.setAddress(address1); + + Person actual = new Person(1L, "Jane", "Doe"); + Address address2 = new Address(1L, "New York", "Sesame Street", "United States"); + actual.setAddress(address2); + + assertThat(ReflectionToStringBuilder.toString(actual, ToStringStyle.SHORT_PREFIX_STYLE)) + .isEqualTo(ReflectionToStringBuilder.toString(expected, ToStringStyle.SHORT_PREFIX_STYLE)); + } + + @Test + void givenPersons_whenEqualsBuilder_thenReturnTrue() { + Person expected = new Person(1L, "Jane", "Doe"); + Address address1 = new Address(1L, "New York", "Sesame Street", "United States"); + expected.setAddress(address1); + + Person actual = new Person(1L, "Jane", "Doe"); + Address address2 = new Address(1L, "New York", "Sesame Street", "United States"); + actual.setAddress(address2); + + assertTrue(EqualsBuilder.reflectionEquals(expected, actual, "address")); + assertTrue(EqualsBuilder.reflectionEquals(expected.getAddress(), actual.getAddress())); + } + + @Test + void givenPersons_whenReflectionEquals_thenReturnOk() { + Person expected = new Person(1L, "Jane", "Doe"); + Address address1 = new Address(1L, "New York", "Sesame Street", "United States"); + expected.setAddress(address1); + + Person actual = new Person(1L, "Jane", "Doe"); + Address address2 = new Address(1L, "New York", "Sesame Street", "United States"); + actual.setAddress(address2); + + assertTrue(new ReflectionEquals(expected, "address").matches(actual)); + assertTrue(new ReflectionEquals(expected.getAddress()).matches(actual.getAddress())); + } + +} From 19039a3d2e80b983b54f41ec6dc275d4b0b21d9a Mon Sep 17 00:00:00 2001 From: n Date: Thu, 15 Jun 2023 20:37:20 +0300 Subject: [PATCH 050/170] Revert "JAVA-20167 Additional changes for test MovieRepositoryIntegrationTest" This reverts commit 2a4950a9d74ae6334e6059d3dca4c6535315f99b. --- .gitignore | 5 +---- persistence-modules/spring-data-neo4j/pom.xml | 4 +--- .../data/neo4j/MovieRepositoryIntegrationTest.java | 12 ++++-------- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index f124a385d4..7725bf202e 100644 --- a/.gitignore +++ b/.gitignore @@ -120,7 +120,4 @@ libraries-2/src/test/resources/crawler4j/** devDb*.db #jaxb -*.xjb - -#spring-data-neo4j -persistence-modules/spring-data-neo4j/data/** \ No newline at end of file +*.xjb \ No newline at end of file diff --git a/persistence-modules/spring-data-neo4j/pom.xml b/persistence-modules/spring-data-neo4j/pom.xml index 75d0aefc23..a2fa29e753 100644 --- a/persistence-modules/spring-data-neo4j/pom.xml +++ b/persistence-modules/spring-data-neo4j/pom.xml @@ -108,7 +108,7 @@ org.neo4j.test neo4j-harness - ${neo4j.version} + 5.5.0 test @@ -129,8 +129,6 @@ 4.0.4 4.0.9 3.2.39 - 2.0.7 - 1.4.7 \ No newline at end of file diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java index 5af501c900..1878eb12b6 100644 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java @@ -13,7 +13,6 @@ import com.baeldung.spring.data.neo4j.repository.PersonRepository; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.neo4j.harness.Neo4j; import org.neo4j.harness.Neo4jBuilders; @@ -33,10 +32,10 @@ import java.util.*; class MovieRepositoryIntegrationTest { @Autowired - private MovieRepository movieRepository; + private static MovieRepository movieRepository; @Autowired - private PersonRepository personRepository; + private static PersonRepository personRepository; public MovieRepositoryIntegrationTest() { } @@ -44,14 +43,11 @@ class MovieRepositoryIntegrationTest { private static Neo4j embeddedDatabaseServer; @BeforeAll - static void setup() { + static void initializeNeo4j() { + embeddedDatabaseServer = Neo4jBuilders.newInProcessBuilder() .withDisabledServer() .build(); - } - - @BeforeEach - void initializeNeo4j() { System.out.println("seeding embedded database"); Movie italianJob = new Movie(); From 17d635bd0dd6da2ffd2bfbd65e67ea8003d705e1 Mon Sep 17 00:00:00 2001 From: n Date: Thu, 15 Jun 2023 20:37:24 +0300 Subject: [PATCH 051/170] Revert "JAVA-20167 Changes in MovieRepositoryIntegrationTest" This reverts commit b50712ae429aafe125f207fd1417b0052fa85a89. --- persistence-modules/spring-data-neo4j/pom.xml | 12 ---- .../neo4j/MovieRepositoryIntegrationTest.java | 67 ++++++------------- 2 files changed, 21 insertions(+), 58 deletions(-) diff --git a/persistence-modules/spring-data-neo4j/pom.xml b/persistence-modules/spring-data-neo4j/pom.xml index a2fa29e753..705fe35d3c 100644 --- a/persistence-modules/spring-data-neo4j/pom.xml +++ b/persistence-modules/spring-data-neo4j/pom.xml @@ -105,18 +105,6 @@ - - org.neo4j.test - neo4j-harness - 5.5.0 - test - - - org.slf4j - slf4j-nop - - - diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java index 1878eb12b6..f91fa2303c 100644 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java @@ -1,9 +1,5 @@ package com.baeldung.spring.data.neo4j; -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 com.baeldung.spring.data.neo4j.config.MovieDatabaseNeo4jTestConfiguration; import com.baeldung.spring.data.neo4j.domain.Movie; import com.baeldung.spring.data.neo4j.domain.Person; @@ -11,44 +7,37 @@ import com.baeldung.spring.data.neo4j.domain.Role; import com.baeldung.spring.data.neo4j.repository.MovieRepository; import com.baeldung.spring.data.neo4j.repository.PersonRepository; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.neo4j.harness.Neo4j; -import org.neo4j.harness.Neo4jBuilders; +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.data.neo4j.DataNeo4jTest; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.DynamicPropertyRegistry; -import org.springframework.test.context.DynamicPropertySource; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.*; +import static junit.framework.TestCase.assertNull; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MovieDatabaseNeo4jTestConfiguration.class) @ActiveProfiles(profiles = "test") -@DataNeo4jTest -class MovieRepositoryIntegrationTest { +public class MovieRepositoryIntegrationTest { @Autowired - private static MovieRepository movieRepository; + private MovieRepository movieRepository; @Autowired - private static PersonRepository personRepository; + private PersonRepository personRepository; public MovieRepositoryIntegrationTest() { } - private static Neo4j embeddedDatabaseServer; - - @BeforeAll - static void initializeNeo4j() { - - embeddedDatabaseServer = Neo4jBuilders.newInProcessBuilder() - .withDisabledServer() - .build(); - + @Before + public void initializeDatabase() { System.out.println("seeding embedded database"); Movie italianJob = new Movie(); italianJob.setTitle("The Italian Job"); @@ -71,23 +60,9 @@ class MovieRepositoryIntegrationTest { movieRepository.save(italianJob); } - @DynamicPropertySource - static void neo4jProperties(DynamicPropertyRegistry registry) { - - registry.add("spring.neo4j.uri", embeddedDatabaseServer::boltURI); - registry.add("spring.neo4j.authentication.username", () -> "neo4j"); - registry.add("spring.neo4j.authentication.password", () -> null); - } - - @AfterAll - static void stopNeo4j() { - - embeddedDatabaseServer.close(); - } - @Test @DirtiesContext - void testFindByTitle() { + public void testFindByTitle() { System.out.println("findByTitle"); String title = "The Italian Job"; Movie result = movieRepository.findByTitle(title); @@ -97,7 +72,7 @@ class MovieRepositoryIntegrationTest { @Test @DirtiesContext - void testCount() { + public void testCount() { System.out.println("count"); long movieCount = movieRepository.count(); @@ -106,7 +81,7 @@ class MovieRepositoryIntegrationTest { @Test @DirtiesContext - void testFindAll() { + public void testFindAll() { System.out.println("findAll"); Collection result = movieRepository.findAll(); assertNotNull(result); @@ -115,7 +90,7 @@ class MovieRepositoryIntegrationTest { @Test @DirtiesContext - void testFindByTitleContaining() { + public void testFindByTitleContaining() { System.out.println("findByTitleContaining"); String title = "Italian"; Collection result = movieRepository.findByTitleContaining(title); @@ -125,7 +100,7 @@ class MovieRepositoryIntegrationTest { @Test @DirtiesContext - void testGraph() { + public void testGraph() { System.out.println("graph"); List> graph = movieRepository.graph(5); assertEquals(1, graph.size()); @@ -139,7 +114,7 @@ class MovieRepositoryIntegrationTest { @Test @DirtiesContext - void testDeleteMovie() { + public void testDeleteMovie() { System.out.println("deleteMovie"); movieRepository.delete(movieRepository.findByTitle("The Italian Job")); assertNull(movieRepository.findByTitle("The Italian Job")); @@ -147,7 +122,7 @@ class MovieRepositoryIntegrationTest { @Test @DirtiesContext - void testDeleteAll() { + public void testDeleteAll() { System.out.println("deleteAll"); movieRepository.deleteAll(); Collection result = movieRepository.findAll(); From a0bf12b9d4edee1c831d8b8568381bc807e6a34e Mon Sep 17 00:00:00 2001 From: n Date: Thu, 15 Jun 2023 20:37:30 +0300 Subject: [PATCH 052/170] Revert "JAVA-20167 Migrating spring-data-neo4j" This reverts commit 2fd4c39a21cea9c62d313475b3df6fc1a3f3b087. --- persistence-modules/pom.xml | 6 +- persistence-modules/spring-data-neo4j/pom.xml | 59 +++----- .../MovieDatabaseNeo4jTestConfiguration.java | 22 +-- .../spring/data/neo4j/domain/Car.java | 4 +- .../spring/data/neo4j/domain/Movie.java | 5 +- .../neo4j/repository/MovieRepository.java | 4 +- .../java/com/baeldung/SpringContextTest.java | 9 +- .../com/baeldung/TestContainersTestBase.java | 132 ------------------ .../baeldung/neo4j/Neo4JServerLiveTest.java | 56 +++----- .../com/baeldung/neo4j/Neo4jLiveTest.java | 69 ++++----- .../com/baeldung/neo4j/Neo4jOgmLiveTest.java | 31 ++-- .../neo4j/MovieRepositoryIntegrationTest.java | 6 +- 12 files changed, 108 insertions(+), 295 deletions(-) delete mode 100644 persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/TestContainersTestBase.java diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 1501d81985..9361e26d7d 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -40,6 +40,8 @@ java-jpa java-jpa-2 java-jpa-3 + + java-mongodb-2 java-mongodb-3 java-mongodb-queries @@ -88,10 +90,10 @@ spring-data-jpa-repo-2 spring-data-jdbc spring-data-keyvalue - spring-data-mongodb + spring-data-mongodb-2 spring-data-mongodb-reactive - spring-data-neo4j + spring-data-redis diff --git a/persistence-modules/spring-data-neo4j/pom.xml b/persistence-modules/spring-data-neo4j/pom.xml index 705fe35d3c..8c5030779b 100644 --- a/persistence-modules/spring-data-neo4j/pom.xml +++ b/persistence-modules/spring-data-neo4j/pom.xml @@ -27,11 +27,6 @@ org.neo4j neo4j-ogm-embedded-driver - ${neo4j-ogm-embedded-driver.version} - - - org.neo4j - neo4j-ogm-bolt-driver ${neo4j-ogm.version} @@ -39,12 +34,6 @@ neo4j-java-driver ${neo4j-java-driver.version} - - org.neo4j - neo4j-jdbc-driver - ${neo4j-jdbc.version} - runtime - org.springframework.data spring-data-neo4j @@ -80,43 +69,33 @@ + + org.neo4j + neo4j-ogm-test + ${neo4j-ogm.version} + test + + + org.neo4j.test + neo4j-harness + ${neo4j.version} + test + org.springframework spring-test ${spring-test.version} - - org.testcontainers - neo4j - ${testcontainers.version} - test - - - org.jetbrains - annotations - - - org.apache.commons - commons-compress - - - javax.xml.bind - jaxb-api - - - - 5.6.0 - 5.8.0 - 7.0.3 - 1.1.2 - 3.1.0 - 6.0.8 - 4.0.4 - 4.0.9 - 3.2.39 + 1.6.2 + 3.4.6 + 5.0.1.RELEASE + 1.1 + 2.0.1.RELEASE + 5.0.1.RELEASE + 3.1.2 \ No newline at end of file diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java index f3c89c1bbe..a4cbe4b809 100644 --- a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java +++ b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java @@ -1,16 +1,13 @@ package com.baeldung.spring.data.neo4j.config; -import org.neo4j.driver.Driver; +import org.neo4j.ogm.config.Configuration.Builder; import org.neo4j.ogm.session.SessionFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; -import org.springframework.data.neo4j.core.DatabaseSelectionProvider; -import org.springframework.data.neo4j.core.UserSelectionProvider; -import org.springframework.data.neo4j.core.transaction.Neo4jTransactionManager; import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories; -import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.data.neo4j.transaction.Neo4jTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @@ -22,23 +19,18 @@ public class MovieDatabaseNeo4jTestConfiguration { @Bean public org.neo4j.ogm.config.Configuration getConfiguration() { - return new org.neo4j.ogm.config.Configuration.Builder().build(); + org.neo4j.ogm.config.Configuration config = new Builder().build(); + return config; } @Bean public SessionFactory getSessionFactory() { return new SessionFactory(getConfiguration(), "com.baeldung.spring.data.neo4j.domain"); } - + @Bean - public PlatformTransactionManager transactionManager(Driver driver, - DatabaseSelectionProvider databaseSelectionProvider, UserSelectionProvider userSelectionProvider) { - - return Neo4jTransactionManager - .with(driver) - .withDatabaseSelectionProvider(databaseSelectionProvider) - .withUserSelectionProvider(userSelectionProvider) - .build(); + public Neo4jTransactionManager transactionManager() { + return new Neo4jTransactionManager(getSessionFactory()); } } diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Car.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Car.java index 0f516d3758..455407a92b 100644 --- a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Car.java +++ b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Car.java @@ -1,7 +1,5 @@ package com.baeldung.spring.data.neo4j.domain; -import static org.neo4j.ogm.annotation.Relationship.Direction.INCOMING; - import org.neo4j.ogm.annotation.GeneratedValue; import org.neo4j.ogm.annotation.Id; import org.neo4j.ogm.annotation.NodeEntity; @@ -14,7 +12,7 @@ public class Car { private String make; - @Relationship(direction = INCOMING) + @Relationship(direction = "INCOMING") private Company company; public Car(String make, String model) { diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Movie.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Movie.java index bea9f996aa..996a661b07 100644 --- a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Movie.java +++ b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Movie.java @@ -1,7 +1,5 @@ package com.baeldung.spring.data.neo4j.domain; -import static org.neo4j.ogm.annotation.Relationship.Direction.INCOMING; - import com.fasterxml.jackson.annotation.JsonIdentityInfo; import com.voodoodyne.jackson.jsog.JSOGGenerator; @@ -14,6 +12,7 @@ import java.util.Collection; import java.util.List; @JsonIdentityInfo(generator = JSOGGenerator.class) + @NodeEntity public class Movie { @Id @GeneratedValue @@ -24,7 +23,7 @@ public class Movie { private int released; private String tagline; - @Relationship(type = "ACTED_IN", direction = INCOMING) + @Relationship(type = "ACTED_IN", direction = Relationship.INCOMING) private List roles; public Movie() { diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/MovieRepository.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/MovieRepository.java index 732970c0b5..dde946ea73 100644 --- a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/MovieRepository.java +++ b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/MovieRepository.java @@ -1,8 +1,8 @@ package com.baeldung.spring.data.neo4j.repository; import com.baeldung.spring.data.neo4j.domain.Movie; +import org.springframework.data.neo4j.annotation.Query; import org.springframework.data.neo4j.repository.Neo4jRepository; -import org.springframework.data.neo4j.repository.query.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -13,7 +13,7 @@ import java.util.Map; @Repository public interface MovieRepository extends Neo4jRepository { - Movie findByTitle(String title); + Movie findByTitle(@Param("title") String title); @Query("MATCH (m:Movie) WHERE m.title =~ ('(?i).*'+{title}+'.*') RETURN m") Collection findByTitleContaining(@Param("title") String title); diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/SpringContextTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/SpringContextTest.java index 9c96a98ff2..7029905c49 100644 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/SpringContextTest.java +++ b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/SpringContextTest.java @@ -1,16 +1,19 @@ package com.baeldung; -import org.junit.jupiter.api.Test; +import org.junit.Test; +import org.junit.runner.RunWith; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.baeldung.spring.data.neo4j.config.MovieDatabaseNeo4jTestConfiguration; +@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MovieDatabaseNeo4jTestConfiguration.class) @ActiveProfiles(profiles = "test") -class SpringContextTest { +public class SpringContextTest { @Test - void whenSpringContextIsBootstrapped_thenNoExceptions() { + public void whenSpringContextIsBootstrapped_thenNoExceptions() { } } diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/TestContainersTestBase.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/TestContainersTestBase.java deleted file mode 100644 index e2bd022d12..0000000000 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/TestContainersTestBase.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.baeldung; - -import static org.neo4j.ogm.drivers.bolt.driver.BoltDriver.CONFIG_PARAMETER_BOLT_LOGGING; - -import java.util.Locale; -import java.util.Optional; - -import org.neo4j.driver.AccessMode; -import org.neo4j.driver.AuthTokens; -import org.neo4j.driver.GraphDatabase; -import org.neo4j.driver.Logging; -import org.neo4j.driver.Session; -import org.neo4j.driver.SessionConfig; -import org.neo4j.ogm.config.Configuration; -import org.neo4j.ogm.driver.Driver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testcontainers.containers.Neo4jContainer; -import org.testcontainers.utility.TestcontainersConfiguration; - -/** - * Reference: https://github.com/neo4j/neo4j-ogm/blob/master/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/testutil/TestContainersTestBase.java - */ -public class TestContainersTestBase { - - public static final Logger LOGGER = LoggerFactory.getLogger(TestContainersTestBase.class); - - public static final Driver driver; - - public static final String version; - - public static final String DEFAULT_IMAGE = "neo4j:5"; - - public static final String SYS_PROPERTY_ACCEPT_AND_USE_COMMERCIAL_EDITION = "NEO4J_OGM_NEO4J_ACCEPT_AND_USE_COMMERCIAL_EDITION"; - - public static final String SYS_PROPERTY_IMAGE_NAME = "NEO4J_OGM_NEO4J_IMAGE_NAME"; - - public static final String SYS_PROPERTY_NEO4J_URL = "NEO4J_OGM_NEO4J_URL"; - - public static final String SYS_PROPERTY_NEO4J_PASSWORD = "NEO4J_OGM_NEO4J_PASSWORD"; - - public static final String DEFAULT_PASSWORD = "verysecret"; - - public static Neo4jContainer neo4jServer; - - public static Configuration.Builder baseConfigurationBuilder; - - public static final String NEO4J_URL = Optional.ofNullable(System.getenv(SYS_PROPERTY_NEO4J_URL)).orElse(""); - - public static final String NEO4J_PASSWORD = Optional.ofNullable(System.getenv(SYS_PROPERTY_NEO4J_PASSWORD)).orElse("").trim(); - - static { - - boolean acceptAndUseCommercialEdition = hasAcceptedAndWantsToUseCommercialEdition(); - - if (!(NEO4J_URL.isEmpty() || NEO4J_PASSWORD.isEmpty())) { - LOGGER.info("Using Neo4j instance at {}.", NEO4J_URL); - driver = new org.neo4j.ogm.drivers.bolt.driver.BoltDriver(); - baseConfigurationBuilder = new Configuration.Builder() - .uri(NEO4J_URL) - .verifyConnection(true) - .withCustomProperty(CONFIG_PARAMETER_BOLT_LOGGING, Logging.slf4j()) - .credentials("neo4j", NEO4J_PASSWORD); - driver.configure(baseConfigurationBuilder.build()); - version = extractVersionFromBolt(); - } else { - LOGGER.info("Using Neo4j test container."); - String imageName = Optional.ofNullable(System.getenv(SYS_PROPERTY_IMAGE_NAME)) - .orElse(DEFAULT_IMAGE + (acceptAndUseCommercialEdition ? "-enterprise" : "")); - - version = extractVersionFromDockerImage(imageName); - - boolean containerReuseSupported = TestcontainersConfiguration - .getInstance().environmentSupportsReuse(); - neo4jServer = new Neo4jContainer<>(imageName) - .withReuse(containerReuseSupported); - - if (acceptAndUseCommercialEdition) { - neo4jServer.withEnv("NEO4J_ACCEPT_LICENSE_AGREEMENT", "yes"); - } - neo4jServer.withAdminPassword(DEFAULT_PASSWORD).start(); - - driver = new org.neo4j.ogm.drivers.bolt.driver.BoltDriver(); - - baseConfigurationBuilder = new Configuration.Builder() - .uri(neo4jServer.getBoltUrl()) - .credentials("neo4j", DEFAULT_PASSWORD) - .verifyConnection(true) - .withCustomProperty(CONFIG_PARAMETER_BOLT_LOGGING, Logging.slf4j()); - - driver.configure(baseConfigurationBuilder.build()); - - Runtime.getRuntime().addShutdownHook(new Thread(neo4jServer::stop)); - } - } - - public static org.neo4j.driver.Driver getNewBoltConnection() { - - if (neo4jServer != null) { - return GraphDatabase.driver(neo4jServer.getBoltUrl(), AuthTokens.basic("neo4j", DEFAULT_PASSWORD)); - } else { - return GraphDatabase.driver(NEO4J_URL, AuthTokens.basic("neo4j", NEO4J_PASSWORD)); - } - } - - public static boolean hasAcceptedAndWantsToUseCommercialEdition() { - return Optional.ofNullable( - System.getenv(TestContainersTestBase.SYS_PROPERTY_ACCEPT_AND_USE_COMMERCIAL_EDITION)) - .orElse("no").toLowerCase(Locale.ENGLISH).equals("yes"); - } - - public static Driver getDriver() { - return driver; - } - - private static String extractVersionFromDockerImage(String imageName) { - return imageName.replace("neo4j:", "").replace("neo4j/neo4j-experimental:", "").replace("-enterprise", ""); - } - - private static String extractVersionFromBolt() { - - org.neo4j.driver.Driver driver = getDriver().unwrap(org.neo4j.driver.Driver.class); - - String version; - SessionConfig sessionConfig = SessionConfig.builder().withDefaultAccessMode(AccessMode.READ).build(); - try (Session session = driver.session(sessionConfig)) { - version = (String) session.run("CALL dbms.components() YIELD versions").single().get("versions").asList().get(0); - } - return version.toLowerCase(Locale.ENGLISH); - } - -} \ No newline at end of file diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java index 3356d90291..bf187ccb2d 100644 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java +++ b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java @@ -1,59 +1,45 @@ package com.baeldung.neo4j; -import static com.baeldung.TestContainersTestBase.DEFAULT_PASSWORD; -import static com.baeldung.TestContainersTestBase.getNewBoltConnection; -import static com.baeldung.TestContainersTestBase.neo4jServer; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.neo4j.driver.Driver; -import org.neo4j.driver.Result; -import org.neo4j.driver.Session; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; +import org.neo4j.driver.v1.AuthTokens; +import org.neo4j.driver.v1.Driver; +import org.neo4j.driver.v1.GraphDatabase; +import org.neo4j.driver.v1.Session; +import org.neo4j.driver.v1.StatementResult; -class Neo4JServerLiveTest { - - private static Session session; - private static Driver driver; - - @BeforeAll - public static void setup() { - driver = getNewBoltConnection(); - } - - @AfterAll - public static void tearDown() { - driver.close(); - } +@Ignore +public class Neo4JServerLiveTest { @Test - void standAloneDriver() { - session = driver.session(); + public void standAloneDriver() { + Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "12345")); + Session session = driver.session(); + session.run("CREATE (baeldung:Company {name:\"Baeldung\"}) " + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + "RETURN baeldung, tesla"); - Result result = session.run("MATCH (company:Company)-[:owns]-> (car:Car)" + + StatementResult result = session.run("MATCH (company:Company)-[:owns]-> (car:Car)" + "WHERE car.make='tesla' and car.model='modelX'" + "RETURN company.name"); - assertTrue(result.hasNext()); - assertEquals("Baeldung", result.next().get("company.name").asString()); + Assert.assertTrue(result.hasNext()); + Assert.assertEquals(result.next().get("company.name").asString(), "Baeldung"); session.close(); + driver.close(); } @Test - void standAloneJdbc() throws Exception { - String uri = "jdbc:neo4j:" + neo4jServer.getBoltUrl() + "/?user=neo4j,password=" + DEFAULT_PASSWORD + ",scheme=basic"; - Connection con = DriverManager.getConnection(uri); + public void standAloneJdbc() throws Exception { + Connection con = DriverManager.getConnection("jdbc:neo4j:bolt://localhost/?user=neo4j,password=12345,scheme=basic"); // Querying try (Statement stmt = con.createStatement()) { @@ -66,7 +52,7 @@ class Neo4JServerLiveTest { "RETURN company.name"); while (rs.next()) { - assertEquals("Baeldung", rs.getString("company.name")); + Assert.assertEquals(rs.getString("company.name"), "Baeldung"); } } con.close(); diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java index 840f4536ca..1ff01b93a1 100644 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java +++ b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java @@ -1,10 +1,7 @@ package com.baeldung.neo4j; -import static org.neo4j.configuration.GraphDatabaseSettings.DEFAULT_DATABASE_NAME; - import java.io.File; -import java.time.Duration; import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -13,107 +10,101 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.neo4j.configuration.GraphDatabaseSettings; -import org.neo4j.dbms.api.DatabaseManagementService; -import org.neo4j.dbms.api.DatabaseManagementServiceBuilder; import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.Label; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.NotFoundException; import org.neo4j.graphdb.RelationshipType; import org.neo4j.graphdb.Result; -import org.neo4j.graphdb.Transaction; +import org.neo4j.graphdb.factory.GraphDatabaseFactory; public class Neo4jLiveTest { private static GraphDatabaseService graphDb; - private static Transaction transaction; - private static DatabaseManagementService managementService; @Before public void setUp() { - managementService = new DatabaseManagementServiceBuilder(new File("data/cars").toPath()) - .setConfig( GraphDatabaseSettings.transaction_timeout, Duration.ofSeconds( 60 ) ) - .setConfig( GraphDatabaseSettings.preallocate_logical_logs, false ).build(); - graphDb = managementService.database( DEFAULT_DATABASE_NAME ); + GraphDatabaseFactory graphDbFactory = new GraphDatabaseFactory(); + graphDb = graphDbFactory.newEmbeddedDatabase(new File("data/cars")); } @After public void tearDown() { - managementService.shutdown(); + graphDb.shutdown(); } @Test public void testPersonCar() { - transaction = graphDb.beginTx(); - Node car = transaction.createNode(Label.label("Car")); + graphDb.beginTx(); + Node car = graphDb.createNode(Label.label("Car")); car.setProperty("make", "tesla"); car.setProperty("model", "model3"); - Node owner = transaction.createNode(Label.label("Person")); + Node owner = graphDb.createNode(Label.label("Person")); owner.setProperty("firstName", "baeldung"); owner.setProperty("lastName", "baeldung"); owner.createRelationshipTo(car, RelationshipType.withName("owner")); - Result result = transaction.execute("MATCH (c:Car) <-[owner]- (p:Person) " + + Result result = graphDb.execute("MATCH (c:Car) <-[owner]- (p:Person) " + "WHERE c.make = 'tesla'" + "RETURN p.firstName, p.lastName"); Map firstResult = result.next(); - Assert.assertEquals("baeldung", firstResult.get("p.firstName")); } @Test public void testCreateNode() { - transaction = graphDb.beginTx(); - Result result = transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"})" + + + graphDb.beginTx(); + + Result result = graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"})" + "RETURN baeldung"); Map firstResult = result.next(); Node firstNode = (Node) firstResult.get("baeldung"); - Assert.assertEquals(firstNode.getProperty("name"), "Baeldung"); } @Test public void testCreateNodeAndLink() { - transaction = graphDb.beginTx(); - Result result = transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + graphDb.beginTx(); + + Result result = graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + "RETURN baeldung, tesla"); Map firstResult = result.next(); - Assert.assertTrue(firstResult.containsKey("baeldung")); Assert.assertTrue(firstResult.containsKey("tesla")); } @Test public void testFindAndReturn() { - transaction = graphDb.beginTx(); - transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + graphDb.beginTx(); + + graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + "RETURN baeldung, tesla"); - Result result = transaction.execute("MATCH (company:Company)-[:owns]-> (car:Car)" + + Result result = graphDb.execute("MATCH (company:Company)-[:owns]-> (car:Car)" + "WHERE car.make='tesla' and car.model='modelX'" + "RETURN company.name"); Map firstResult = result.next(); - Assert.assertEquals(firstResult.get("company.name"), "Baeldung"); } @Test public void testUpdate() { - transaction = graphDb.beginTx(); - transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + graphDb.beginTx(); + + graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + "RETURN baeldung, tesla"); - Result result = transaction.execute("MATCH (car:Car)" + + Result result = graphDb.execute("MATCH (car:Car)" + "WHERE car.make='tesla'" + " SET car.milage=120" + " SET car :Car:Electro" + @@ -136,16 +127,17 @@ public class Neo4jLiveTest { @Test public void testDelete() { - transaction = graphDb.beginTx(); - transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + graphDb.beginTx(); + + graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + "RETURN baeldung, tesla"); - transaction.execute("MATCH (company:Company)" + + graphDb.execute("MATCH (company:Company)" + " WHERE company.name='Baeldung'" + " DELETE company"); - Result result = transaction.execute("MATCH (company:Company)" + + Result result = graphDb.execute("MATCH (company:Company)" + " WHERE company.name='Baeldung'" + " RETURN company"); @@ -154,13 +146,14 @@ public class Neo4jLiveTest { @Test public void testBindings() { - transaction = graphDb.beginTx(); + graphDb.beginTx(); + Map params = new HashMap<>(); params.put("name", "baeldung"); params.put("make", "tesla"); params.put("model", "modelS"); - Result result = transaction.execute("CREATE (baeldung:Company {name:$name}) " + + Result result = graphDb.execute("CREATE (baeldung:Company {name:$name}) " + "-[:owns]-> (tesla:Car {make: $make, model: $model})" + "RETURN baeldung, tesla", params); diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java index e824873c32..96e5e76402 100644 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java +++ b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java @@ -1,13 +1,11 @@ package com.baeldung.neo4j; -import static com.baeldung.TestContainersTestBase.getDriver; -import static org.junit.jupiter.api.Assertions.assertEquals; - import java.util.HashMap; import java.util.Map; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; +import org.junit.Assert; +import org.junit.Test; +import org.neo4j.ogm.config.Configuration; import org.neo4j.ogm.model.Result; import org.neo4j.ogm.session.Session; import org.neo4j.ogm.session.SessionFactory; @@ -17,18 +15,13 @@ import com.baeldung.spring.data.neo4j.domain.Company; public class Neo4jOgmLiveTest { - private static SessionFactory sessionFactory; - private static Session session; - - @BeforeAll - public static void oneTimeSetUp() { - sessionFactory = new SessionFactory(getDriver(), "com.baeldung.spring.data.neo4j.domain"); - session = sessionFactory.openSession(); - session.purgeDatabase(); - } - @Test - void testOgm() { + public void testOgm() { + Configuration conf = new Configuration.Builder().build(); + + SessionFactory factory = new SessionFactory(conf, "com.baeldung.spring.data.neo4j.domain"); + Session session = factory.openSession(); + Car tesla = new Car("tesla", "modelS"); Company baeldung = new Company("baeldung"); @@ -36,7 +29,7 @@ public class Neo4jOgmLiveTest { session.save(baeldung); - assertEquals(1, session.countEntitiesOfType(Company.class)); + Assert.assertEquals(1, session.countEntitiesOfType(Company.class)); Map params = new HashMap<>(); params.put("make", "tesla"); @@ -46,9 +39,9 @@ public class Neo4jOgmLiveTest { Map firstResult = result.iterator().next(); - assertEquals(1, firstResult.size()); + Assert.assertEquals(firstResult.size(), 1); Company actual = (Company) firstResult.get("company"); - assertEquals(actual.getName(), baeldung.getName()); + Assert.assertEquals(actual.getName(), baeldung.getName()); } } diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java index f91fa2303c..3d9215f32f 100644 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java @@ -75,7 +75,7 @@ public class MovieRepositoryIntegrationTest { public void testCount() { System.out.println("count"); long movieCount = movieRepository.count(); - + assertNotNull(movieCount); assertEquals(1, movieCount); } @@ -83,7 +83,7 @@ public class MovieRepositoryIntegrationTest { @DirtiesContext public void testFindAll() { System.out.println("findAll"); - Collection result = movieRepository.findAll(); + Collection result = (Collection) movieRepository.findAll(); assertNotNull(result); assertEquals(1, result.size()); } @@ -125,7 +125,7 @@ public class MovieRepositoryIntegrationTest { public void testDeleteAll() { System.out.println("deleteAll"); movieRepository.deleteAll(); - Collection result = movieRepository.findAll(); + Collection result = (Collection) movieRepository.findAll(); assertEquals(0, result.size()); } } From caf72a58b28e20479715812caad5f535c6926ea0 Mon Sep 17 00:00:00 2001 From: n Date: Thu, 15 Jun 2023 20:42:58 +0300 Subject: [PATCH 053/170] JAVA-20167 Add the spring-date-neo4j to the jdk8 profile --- persistence-modules/pom.xml | 5 +---- pom.xml | 2 ++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 9361e26d7d..a0246e0dfd 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -40,8 +40,6 @@ java-jpa java-jpa-2 java-jpa-3 - - java-mongodb-2 java-mongodb-3 java-mongodb-queries @@ -90,10 +88,9 @@ spring-data-jpa-repo-2 spring-data-jdbc spring-data-keyvalue - + spring-data-mongodb spring-data-mongodb-2 spring-data-mongodb-reactive - spring-data-redis diff --git a/pom.xml b/pom.xml index 7c726c1015..b6552706b5 100644 --- a/pom.xml +++ b/pom.xml @@ -369,6 +369,7 @@ persistence-modules/hibernate-ogm persistence-modules/java-cassandra persistence-modules/spring-data-cassandra-reactive + persistence-modules/spring-data-neo4j @@ -547,6 +548,7 @@ persistence-modules/hibernate-ogm persistence-modules/java-cassandra persistence-modules/spring-data-cassandra-reactive + persistence-modules/spring-data-neo4j From 64dd4ce8d3ae5b8bb71375a1001607efed62c3d0 Mon Sep 17 00:00:00 2001 From: timis1 Date: Thu, 15 Jun 2023 20:59:56 +0300 Subject: [PATCH 054/170] JAVA-20167 Adding additional example for Spring data derived query --- .../derivedquery/repository/UserRepository.java | 4 ++++ .../repository/UserRepositoryIntegrationTest.java | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/derivedquery/repository/UserRepository.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/derivedquery/repository/UserRepository.java index 8f86e8ce49..4b2d6c11af 100644 --- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/derivedquery/repository/UserRepository.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/derivedquery/repository/UserRepository.java @@ -58,6 +58,10 @@ public interface UserRepository extends JpaRepository { List findByNameOrBirthDateAndActive(@Param(value = "nameParam") String nameParam, @Param(value = "birthDateParam") ZonedDateTime birthDateParam, @Param(value = "activeParam") Boolean activeParam); + List findByNameOrAge(String name, Integer age); + + List findByNameOrAgeAndActive(String name, Integer age, Boolean active); + List findByNameOrderByName(String name); List findByNameOrderByNameDesc(String name); diff --git a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/derivedquery/repository/UserRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/derivedquery/repository/UserRepositoryIntegrationTest.java index 75e0db253f..719f56e3cd 100644 --- a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/derivedquery/repository/UserRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/derivedquery/repository/UserRepositoryIntegrationTest.java @@ -164,6 +164,18 @@ public class UserRepositoryIntegrationTest { assertEquals(2, userRepository.findByNameOrBirthDateAndActive(USER_NAME_ADAM, BIRTHDATE, false).size()); } + @Test + public void whenByNameOrAge() { + + assertEquals(2, userRepository.findByNameOrAge(USER_NAME_ADAM, 20).size()); + } + + @Test + public void whenByNameOrAgeAndActive() { + + assertEquals(3, userRepository.findByNameOrAgeAndActive(USER_NAME_ADAM, 20, false).size()); + } + @Test public void whenByNameOrderByName() { From 05519f22965929e2f109dfae51bb789a60749956 Mon Sep 17 00:00:00 2001 From: timis1 Date: Fri, 16 Jun 2023 00:24:33 +0300 Subject: [PATCH 055/170] JAVA-22364 Split spring-data-neo4j module --- .gitignore | 5 +- persistence-modules/neo4j/README.md | 15 ++ persistence-modules/neo4j/pom.xml | 117 ++++++++++++ .../java/com/baeldung/neo4j/domain/Car.java | 50 +++++ .../com/baeldung/neo4j/domain/Company.java | 42 +++++ .../java/com/baeldung/neo4j/domain/Movie.java | 66 +++++++ .../com/baeldung/neo4j/domain/Person.java | 52 ++++++ .../java/com/baeldung/neo4j/domain/Role.java | 50 +++++ .../baeldung/neo4j/Neo4JServerLiveTest.java | 74 ++++++++ .../com/baeldung/neo4j/Neo4jLiveTest.java | 174 ++++++++++++++++++ .../com/baeldung/neo4j/Neo4jOgmLiveTest.java | 54 ++++++ .../neo4j/TestContainersTestBase.java | 132 +++++++++++++ persistence-modules/pom.xml | 1 + 13 files changed, 831 insertions(+), 1 deletion(-) create mode 100644 persistence-modules/neo4j/README.md create mode 100644 persistence-modules/neo4j/pom.xml create mode 100644 persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Car.java create mode 100644 persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Company.java create mode 100644 persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Movie.java create mode 100644 persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Person.java create mode 100644 persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Role.java create mode 100644 persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java create mode 100644 persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java create mode 100644 persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java create mode 100644 persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/TestContainersTestBase.java diff --git a/.gitignore b/.gitignore index 7725bf202e..b731787052 100644 --- a/.gitignore +++ b/.gitignore @@ -120,4 +120,7 @@ libraries-2/src/test/resources/crawler4j/** devDb*.db #jaxb -*.xjb \ No newline at end of file +*.xjb + +#neo4j +persistence-modules/neo4j/data/** \ No newline at end of file diff --git a/persistence-modules/neo4j/README.md b/persistence-modules/neo4j/README.md new file mode 100644 index 0000000000..354d9605db --- /dev/null +++ b/persistence-modules/neo4j/README.md @@ -0,0 +1,15 @@ +## Spring Data Neo4j + +### Relevant Articles: +- [A Guide to Neo4J with Java](https://www.baeldung.com/java-neo4j) + +### Build the Project with Tests Running +``` +mvn clean install +``` + +### Run Tests Directly +``` +mvn test +``` + diff --git a/persistence-modules/neo4j/pom.xml b/persistence-modules/neo4j/pom.xml new file mode 100644 index 0000000000..91a488637a --- /dev/null +++ b/persistence-modules/neo4j/pom.xml @@ -0,0 +1,117 @@ + + + 4.0.0 + neo4j + 1.0 + neo4j + + + com.baeldung + persistence-modules + 1.0.0-SNAPSHOT + + + + + org.neo4j + neo4j + ${neo4j.version} + + + org.neo4j + neo4j-ogm-core + ${neo4j-ogm-core.version} + + + org.neo4j + neo4j-ogm-embedded-driver + ${neo4j-ogm-embedded.version} + + + org.neo4j + neo4j-ogm-bolt-driver + ${neo4j-ogm-bolt-driver.version} + + + org.neo4j.driver + neo4j-java-driver + ${neo4j-java-driver.version} + + + org.neo4j + neo4j-jdbc-driver + ${neo4j-jdbc.version} + runtime + + + com.voodoodyne.jackson.jsog + jackson-jsog + ${jackson-jsog.version} + compile + + + org.neo4j + neo4j-kernel + ${neo4j.version} + test-jar + + + org.neo4j.app + neo4j-server + ${neo4j.version} + test-jar + + + commons-logging + commons-logging + + + + + org.neo4j + neo4j-ogm-test + ${neo4j-ogm.version} + test + + + org.neo4j.test + neo4j-harness + ${neo4j.version} + test + + + org.testcontainers + neo4j + ${testcontainers.version} + test + + + org.jetbrains + annotations + + + org.apache.commons + commons-compress + + + javax.xml.bind + jaxb-api + + + + + + + 5.6.0 + 5.8.0 + 1.1.2 + 3.1.22 + 4.0.5 + 3.2.39 + 4.0.9 + 4.0.5 + + + \ No newline at end of file diff --git a/persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Car.java b/persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Car.java new file mode 100644 index 0000000000..d396cc94e7 --- /dev/null +++ b/persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Car.java @@ -0,0 +1,50 @@ +package com.baeldung.neo4j.domain; + +import static org.neo4j.ogm.annotation.Relationship.Direction.INCOMING; + +import org.neo4j.ogm.annotation.GeneratedValue; +import org.neo4j.ogm.annotation.Id; +import org.neo4j.ogm.annotation.NodeEntity; +import org.neo4j.ogm.annotation.Relationship; + +@NodeEntity +public class Car { + @Id @GeneratedValue + private Long id; + + private String make; + + @Relationship(direction = INCOMING) + private Company company; + + public Car(String make, String model) { + this.make = make; + this.model = model; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getMake() { + return make; + } + + public void setMake(String make) { + this.make = make; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + private String model; +} diff --git a/persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Company.java b/persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Company.java new file mode 100644 index 0000000000..7749db9d74 --- /dev/null +++ b/persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Company.java @@ -0,0 +1,42 @@ +package com.baeldung.neo4j.domain; + +import org.neo4j.ogm.annotation.NodeEntity; +import org.neo4j.ogm.annotation.Relationship; + +@NodeEntity +public class Company { + private Long id; + + private String name; + + @Relationship(type="owns") + private Car car; + + public Company(String name) { + this.name = name; + } + + 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 Car getCar() { + return car; + } + + public void setCar(Car car) { + this.car = car; + } +} diff --git a/persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Movie.java b/persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Movie.java new file mode 100644 index 0000000000..c6a0a9a529 --- /dev/null +++ b/persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Movie.java @@ -0,0 +1,66 @@ +package com.baeldung.neo4j.domain; + +import static org.neo4j.ogm.annotation.Relationship.Direction.INCOMING; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.voodoodyne.jackson.jsog.JSOGGenerator; + +import org.neo4j.ogm.annotation.GeneratedValue; +import org.neo4j.ogm.annotation.Id; +import org.neo4j.ogm.annotation.NodeEntity; +import org.neo4j.ogm.annotation.Relationship; + +import java.util.Collection; +import java.util.List; + +@JsonIdentityInfo(generator = JSOGGenerator.class) + +@NodeEntity +public class Movie { + @Id @GeneratedValue + Long id; + + private String title; + + private int released; + private String tagline; + + @Relationship(type = "ACTED_IN", direction = INCOMING) + private List roles; + + public Movie() { + } + + public String getTitle() { + return title; + } + + public int getReleased() { + return released; + } + + public String getTagline() { + return tagline; + } + + public Collection getRoles() { + return roles; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setReleased(int released) { + this.released = released; + } + + public void setTagline(String tagline) { + this.tagline = tagline; + } + + public void setRoles(List roles) { + this.roles = roles; + } + +} diff --git a/persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Person.java b/persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Person.java new file mode 100644 index 0000000000..a9491ee876 --- /dev/null +++ b/persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Person.java @@ -0,0 +1,52 @@ +package com.baeldung.neo4j.domain; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.voodoodyne.jackson.jsog.JSOGGenerator; + +import org.neo4j.ogm.annotation.GeneratedValue; +import org.neo4j.ogm.annotation.Id; +import org.neo4j.ogm.annotation.NodeEntity; +import org.neo4j.ogm.annotation.Relationship; + +import java.util.List; + +@JsonIdentityInfo(generator = JSOGGenerator.class) +@NodeEntity +public class Person { + @Id @GeneratedValue + Long id; + + private String name; + private int born; + + @Relationship(type = "ACTED_IN") + private List movies; + + public Person() { + } + + public String getName() { + return name; + } + + public int getBorn() { + return born; + } + + public List getMovies() { + return movies; + } + + public void setName(String name) { + this.name = name; + } + + public void setBorn(int born) { + this.born = born; + } + + public void setMovies(List movies) { + this.movies = movies; + } + +} diff --git a/persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Role.java b/persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Role.java new file mode 100644 index 0000000000..0c91e67f0c --- /dev/null +++ b/persistence-modules/neo4j/src/main/java/com/baeldung/neo4j/domain/Role.java @@ -0,0 +1,50 @@ +package com.baeldung.neo4j.domain; + +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.voodoodyne.jackson.jsog.JSOGGenerator; +import org.neo4j.ogm.annotation.EndNode; +import org.neo4j.ogm.annotation.GeneratedValue; +import org.neo4j.ogm.annotation.Id; +import org.neo4j.ogm.annotation.RelationshipEntity; +import org.neo4j.ogm.annotation.StartNode; + +import java.util.Collection; + +@JsonIdentityInfo(generator = JSOGGenerator.class) +@RelationshipEntity(type = "ACTED_IN") +public class Role { + @Id @GeneratedValue + Long id; + private Collection roles; + @StartNode + private Person person; + @EndNode + private Movie movie; + + public Role() { + } + + public Collection getRoles() { + return roles; + } + + public Person getPerson() { + return person; + } + + public Movie getMovie() { + return movie; + } + + public void setRoles(Collection roles) { + this.roles = roles; + } + + public void setPerson(Person person) { + this.person = person; + } + + public void setMovie(Movie movie) { + this.movie = movie; + } +} diff --git a/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java b/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java new file mode 100644 index 0000000000..e9bb7e05b8 --- /dev/null +++ b/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java @@ -0,0 +1,74 @@ +package com.baeldung.neo4j; + +import static com.baeldung.neo4j.TestContainersTestBase.DEFAULT_PASSWORD; +import static com.baeldung.neo4j.TestContainersTestBase.getNewBoltConnection; +import static com.baeldung.neo4j.TestContainersTestBase.neo4jServer; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.neo4j.driver.Driver; +import org.neo4j.driver.Result; +import org.neo4j.driver.Session; + +class Neo4JServerLiveTest { + + private static Session session; + private static Driver driver; + + @BeforeAll + public static void setup() { + driver = getNewBoltConnection(); + } + + @AfterAll + public static void tearDown() { + driver.close(); + } + + @Test + void standAloneDriver() { + session = driver.session(); + session.run("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + + "RETURN baeldung, tesla"); + + Result result = session.run("MATCH (company:Company)-[:owns]-> (car:Car)" + + "WHERE car.make='tesla' and car.model='modelX'" + + "RETURN company.name"); + + assertTrue(result.hasNext()); + assertEquals("Baeldung", result.next().get("company.name").asString()); + + session.close(); + } + + @Test + void standAloneJdbc() throws Exception { + String uri = "jdbc:neo4j:" + neo4jServer.getBoltUrl() + "/?user=neo4j,password=" + DEFAULT_PASSWORD + ",scheme=basic"; + Connection con = DriverManager.getConnection(uri); + + // Querying + try (Statement stmt = con.createStatement()) { + stmt.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + + "RETURN baeldung, tesla"); + + ResultSet rs = stmt.executeQuery("MATCH (company:Company)-[:owns]-> (car:Car)" + + "WHERE car.make='tesla' and car.model='modelX'" + + "RETURN company.name"); + + while (rs.next()) { + assertEquals("Baeldung", rs.getString("company.name")); + } + } + con.close(); + } +} diff --git a/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java b/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java new file mode 100644 index 0000000000..840f4536ca --- /dev/null +++ b/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java @@ -0,0 +1,174 @@ +package com.baeldung.neo4j; + + +import static org.neo4j.configuration.GraphDatabaseSettings.DEFAULT_DATABASE_NAME; + +import java.io.File; +import java.time.Duration; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.neo4j.configuration.GraphDatabaseSettings; +import org.neo4j.dbms.api.DatabaseManagementService; +import org.neo4j.dbms.api.DatabaseManagementServiceBuilder; +import org.neo4j.graphdb.GraphDatabaseService; +import org.neo4j.graphdb.Label; +import org.neo4j.graphdb.Node; +import org.neo4j.graphdb.NotFoundException; +import org.neo4j.graphdb.RelationshipType; +import org.neo4j.graphdb.Result; +import org.neo4j.graphdb.Transaction; + +public class Neo4jLiveTest { + + private static GraphDatabaseService graphDb; + private static Transaction transaction; + private static DatabaseManagementService managementService; + + @Before + public void setUp() { + managementService = new DatabaseManagementServiceBuilder(new File("data/cars").toPath()) + .setConfig( GraphDatabaseSettings.transaction_timeout, Duration.ofSeconds( 60 ) ) + .setConfig( GraphDatabaseSettings.preallocate_logical_logs, false ).build(); + graphDb = managementService.database( DEFAULT_DATABASE_NAME ); + } + + @After + public void tearDown() { + managementService.shutdown(); + } + + @Test + public void testPersonCar() { + transaction = graphDb.beginTx(); + Node car = transaction.createNode(Label.label("Car")); + car.setProperty("make", "tesla"); + car.setProperty("model", "model3"); + + Node owner = transaction.createNode(Label.label("Person")); + owner.setProperty("firstName", "baeldung"); + owner.setProperty("lastName", "baeldung"); + + owner.createRelationshipTo(car, RelationshipType.withName("owner")); + + Result result = transaction.execute("MATCH (c:Car) <-[owner]- (p:Person) " + + "WHERE c.make = 'tesla'" + + "RETURN p.firstName, p.lastName"); + + Map firstResult = result.next(); + + Assert.assertEquals("baeldung", firstResult.get("p.firstName")); + } + + @Test + public void testCreateNode() { + transaction = graphDb.beginTx(); + Result result = transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"})" + + "RETURN baeldung"); + + Map firstResult = result.next(); + Node firstNode = (Node) firstResult.get("baeldung"); + + Assert.assertEquals(firstNode.getProperty("name"), "Baeldung"); + } + + @Test + public void testCreateNodeAndLink() { + transaction = graphDb.beginTx(); + Result result = transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + + "RETURN baeldung, tesla"); + + Map firstResult = result.next(); + + Assert.assertTrue(firstResult.containsKey("baeldung")); + Assert.assertTrue(firstResult.containsKey("tesla")); + } + + @Test + public void testFindAndReturn() { + transaction = graphDb.beginTx(); + transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + + "RETURN baeldung, tesla"); + + Result result = transaction.execute("MATCH (company:Company)-[:owns]-> (car:Car)" + + "WHERE car.make='tesla' and car.model='modelX'" + + "RETURN company.name"); + + Map firstResult = result.next(); + + Assert.assertEquals(firstResult.get("company.name"), "Baeldung"); + } + + @Test + public void testUpdate() { + transaction = graphDb.beginTx(); + transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + + "RETURN baeldung, tesla"); + + Result result = transaction.execute("MATCH (car:Car)" + + "WHERE car.make='tesla'" + + " SET car.milage=120" + + " SET car :Car:Electro" + + " SET car.model=NULL" + + " RETURN car"); + + Map firstResult = result.next(); + Node car = (Node) firstResult.get("car"); + + Assert.assertEquals(car.getProperty("milage"), 120L); + Assert.assertEquals(car.getLabels(), Arrays.asList(Label.label("Car"), Label.label("Electro"))); + + try { + car.getProperty("model"); + Assert.fail(); + } catch (NotFoundException e) { + // expected + } + } + + @Test + public void testDelete() { + transaction = graphDb.beginTx(); + transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + + "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + + "RETURN baeldung, tesla"); + + transaction.execute("MATCH (company:Company)" + + " WHERE company.name='Baeldung'" + + " DELETE company"); + + Result result = transaction.execute("MATCH (company:Company)" + + " WHERE company.name='Baeldung'" + + " RETURN company"); + + Assert.assertFalse(result.hasNext()); + } + + @Test + public void testBindings() { + transaction = graphDb.beginTx(); + Map params = new HashMap<>(); + params.put("name", "baeldung"); + params.put("make", "tesla"); + params.put("model", "modelS"); + + Result result = transaction.execute("CREATE (baeldung:Company {name:$name}) " + + "-[:owns]-> (tesla:Car {make: $make, model: $model})" + + "RETURN baeldung, tesla", params); + + Map firstResult = result.next(); + Assert.assertTrue(firstResult.containsKey("baeldung")); + Assert.assertTrue(firstResult.containsKey("tesla")); + + Node car = (Node) firstResult.get("tesla"); + Assert.assertEquals(car.getProperty("model"), "modelS"); + } +} diff --git a/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java b/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java new file mode 100644 index 0000000000..761ae1697a --- /dev/null +++ b/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java @@ -0,0 +1,54 @@ +package com.baeldung.neo4j; + +import static com.baeldung.neo4j.TestContainersTestBase.getDriver; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.neo4j.ogm.model.Result; +import org.neo4j.ogm.session.Session; +import org.neo4j.ogm.session.SessionFactory; + +import com.baeldung.neo4j.domain.Car; +import com.baeldung.neo4j.domain.Company; + +public class Neo4jOgmLiveTest { + + private static SessionFactory sessionFactory; + private static Session session; + + @BeforeAll + public static void oneTimeSetUp() { + sessionFactory = new SessionFactory(getDriver(), "com.baeldung.neo4j.domain"); + session = sessionFactory.openSession(); + session.purgeDatabase(); + } + + @Test + void testOgm() { + Car tesla = new Car("tesla", "modelS"); + Company baeldung = new Company("baeldung"); + + baeldung.setCar(tesla); + + session.save(baeldung); + + assertEquals(1, session.countEntitiesOfType(Company.class)); + + Map params = new HashMap<>(); + params.put("make", "tesla"); + Result result = session.query("MATCH (car:Car) <-[:owns]- (company:Company)" + + " WHERE car.make=$make" + + " RETURN company", params); + + Map firstResult = result.iterator().next(); + + assertEquals(1, firstResult.size()); + + Company actual = (Company) firstResult.get("company"); + assertEquals(actual.getName(), baeldung.getName()); + } +} diff --git a/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/TestContainersTestBase.java b/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/TestContainersTestBase.java new file mode 100644 index 0000000000..fd525d6b05 --- /dev/null +++ b/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/TestContainersTestBase.java @@ -0,0 +1,132 @@ +package com.baeldung.neo4j; + +import static org.neo4j.ogm.drivers.bolt.driver.BoltDriver.CONFIG_PARAMETER_BOLT_LOGGING; + +import java.util.Locale; +import java.util.Optional; + +import org.neo4j.driver.AccessMode; +import org.neo4j.driver.AuthTokens; +import org.neo4j.driver.GraphDatabase; +import org.neo4j.driver.Logging; +import org.neo4j.driver.Session; +import org.neo4j.driver.SessionConfig; +import org.neo4j.ogm.config.Configuration; +import org.neo4j.ogm.driver.Driver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.containers.Neo4jContainer; +import org.testcontainers.utility.TestcontainersConfiguration; + +/** + * Reference: https://github.com/neo4j/neo4j-ogm/blob/master/neo4j-ogm-tests/neo4j-ogm-integration-tests/src/test/java/org/neo4j/ogm/testutil/TestContainersTestBase.java + */ +public class TestContainersTestBase { + + public static final Logger LOGGER = LoggerFactory.getLogger(TestContainersTestBase.class); + + public static final Driver driver; + + public static final String version; + + public static final String DEFAULT_IMAGE = "neo4j:5"; + + public static final String SYS_PROPERTY_ACCEPT_AND_USE_COMMERCIAL_EDITION = "NEO4J_OGM_NEO4J_ACCEPT_AND_USE_COMMERCIAL_EDITION"; + + public static final String SYS_PROPERTY_IMAGE_NAME = "NEO4J_OGM_NEO4J_IMAGE_NAME"; + + public static final String SYS_PROPERTY_NEO4J_URL = "NEO4J_OGM_NEO4J_URL"; + + public static final String SYS_PROPERTY_NEO4J_PASSWORD = "NEO4J_OGM_NEO4J_PASSWORD"; + + public static final String DEFAULT_PASSWORD = "verysecret"; + + public static Neo4jContainer neo4jServer; + + public static Configuration.Builder baseConfigurationBuilder; + + public static final String NEO4J_URL = Optional.ofNullable(System.getenv(SYS_PROPERTY_NEO4J_URL)).orElse(""); + + public static final String NEO4J_PASSWORD = Optional.ofNullable(System.getenv(SYS_PROPERTY_NEO4J_PASSWORD)).orElse("").trim(); + + static { + + boolean acceptAndUseCommercialEdition = hasAcceptedAndWantsToUseCommercialEdition(); + + if (!(NEO4J_URL.isEmpty() || NEO4J_PASSWORD.isEmpty())) { + LOGGER.info("Using Neo4j instance at {}.", NEO4J_URL); + driver = new org.neo4j.ogm.drivers.bolt.driver.BoltDriver(); + baseConfigurationBuilder = new Configuration.Builder() + .uri(NEO4J_URL) + .verifyConnection(true) + .withCustomProperty(CONFIG_PARAMETER_BOLT_LOGGING, Logging.slf4j()) + .credentials("neo4j", NEO4J_PASSWORD); + driver.configure(baseConfigurationBuilder.build()); + version = extractVersionFromBolt(); + } else { + LOGGER.info("Using Neo4j test container."); + String imageName = Optional.ofNullable(System.getenv(SYS_PROPERTY_IMAGE_NAME)) + .orElse(DEFAULT_IMAGE + (acceptAndUseCommercialEdition ? "-enterprise" : "")); + + version = extractVersionFromDockerImage(imageName); + + boolean containerReuseSupported = TestcontainersConfiguration + .getInstance().environmentSupportsReuse(); + neo4jServer = new Neo4jContainer<>(imageName) + .withReuse(containerReuseSupported); + + if (acceptAndUseCommercialEdition) { + neo4jServer.withEnv("NEO4J_ACCEPT_LICENSE_AGREEMENT", "yes"); + } + neo4jServer.withAdminPassword(DEFAULT_PASSWORD).start(); + + driver = new org.neo4j.ogm.drivers.bolt.driver.BoltDriver(); + + baseConfigurationBuilder = new Configuration.Builder() + .uri(neo4jServer.getBoltUrl()) + .credentials("neo4j", DEFAULT_PASSWORD) + .verifyConnection(true) + .withCustomProperty(CONFIG_PARAMETER_BOLT_LOGGING, Logging.slf4j()); + + driver.configure(baseConfigurationBuilder.build()); + + Runtime.getRuntime().addShutdownHook(new Thread(neo4jServer::stop)); + } + } + + public static org.neo4j.driver.Driver getNewBoltConnection() { + + if (neo4jServer != null) { + return GraphDatabase.driver(neo4jServer.getBoltUrl(), AuthTokens.basic("neo4j", DEFAULT_PASSWORD)); + } else { + return GraphDatabase.driver(NEO4J_URL, AuthTokens.basic("neo4j", NEO4J_PASSWORD)); + } + } + + public static boolean hasAcceptedAndWantsToUseCommercialEdition() { + return Optional.ofNullable( + System.getenv(TestContainersTestBase.SYS_PROPERTY_ACCEPT_AND_USE_COMMERCIAL_EDITION)) + .orElse("no").toLowerCase(Locale.ENGLISH).equals("yes"); + } + + public static Driver getDriver() { + return driver; + } + + private static String extractVersionFromDockerImage(String imageName) { + return imageName.replace("neo4j:", "").replace("neo4j/neo4j-experimental:", "").replace("-enterprise", ""); + } + + private static String extractVersionFromBolt() { + + org.neo4j.driver.Driver driver = getDriver().unwrap(org.neo4j.driver.Driver.class); + + String version; + SessionConfig sessionConfig = SessionConfig.builder().withDefaultAccessMode(AccessMode.READ).build(); + try (Session session = driver.session(sessionConfig)) { + version = (String) session.run("CALL dbms.components() YIELD versions").single().get("versions").asList().get(0); + } + return version.toLowerCase(Locale.ENGLISH); + } + +} \ No newline at end of file diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 9361e26d7d..29ee5ddaa1 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -113,6 +113,7 @@ spring-data-rest java-mongodb questdb + neo4j From 52d3952ac3fa94d5ffa4860d0b5f4e965231a4db Mon Sep 17 00:00:00 2001 From: timis1 Date: Fri, 16 Jun 2023 08:56:51 +0300 Subject: [PATCH 056/170] JAVA-222364 Keep in the spring data neo4j just the examples with spring --- persistence-modules/pom.xml | 1 - persistence-modules/spring-data-neo4j/pom.xml | 34 ---- .../baeldung/neo4j/Neo4JServerLiveTest.java | 60 ------- .../com/baeldung/neo4j/Neo4jLiveTest.java | 167 ------------------ .../com/baeldung/neo4j/Neo4jOgmLiveTest.java | 47 ----- pom.xml | 2 + 6 files changed, 2 insertions(+), 309 deletions(-) delete mode 100644 persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java delete mode 100644 persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java delete mode 100644 persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 29ee5ddaa1..39172d7f42 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -93,7 +93,6 @@ spring-data-mongodb-2 spring-data-mongodb-reactive - spring-data-redis diff --git a/persistence-modules/spring-data-neo4j/pom.xml b/persistence-modules/spring-data-neo4j/pom.xml index 8c5030779b..33f2966db3 100644 --- a/persistence-modules/spring-data-neo4j/pom.xml +++ b/persistence-modules/spring-data-neo4j/pom.xml @@ -14,26 +14,11 @@ - - org.neo4j - neo4j - ${neo4j.version} - - - org.neo4j - neo4j-ogm-core - ${neo4j-ogm.version} - org.neo4j neo4j-ogm-embedded-driver ${neo4j-ogm.version} - - org.neo4j.driver - neo4j-java-driver - ${neo4j-java-driver.version} - org.springframework.data spring-data-neo4j @@ -51,24 +36,6 @@ ${spring-boot.version} test - - org.neo4j - neo4j-kernel - ${neo4j.version} - test-jar - - - org.neo4j.app - neo4j-server - ${neo4j.version} - test-jar - - - commons-logging - commons-logging - - - org.neo4j neo4j-ogm-test @@ -89,7 +56,6 @@ - 1.6.2 3.4.6 5.0.1.RELEASE 1.1 diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java deleted file mode 100644 index bf187ccb2d..0000000000 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.baeldung.neo4j; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.Statement; - -import org.junit.Assert; -import org.junit.Ignore; -import org.junit.Test; -import org.neo4j.driver.v1.AuthTokens; -import org.neo4j.driver.v1.Driver; -import org.neo4j.driver.v1.GraphDatabase; -import org.neo4j.driver.v1.Session; -import org.neo4j.driver.v1.StatementResult; - -@Ignore -public class Neo4JServerLiveTest { - - @Test - public void standAloneDriver() { - Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "12345")); - Session session = driver.session(); - - session.run("CREATE (baeldung:Company {name:\"Baeldung\"}) " + - "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + - "RETURN baeldung, tesla"); - - StatementResult result = session.run("MATCH (company:Company)-[:owns]-> (car:Car)" + - "WHERE car.make='tesla' and car.model='modelX'" + - "RETURN company.name"); - - Assert.assertTrue(result.hasNext()); - Assert.assertEquals(result.next().get("company.name").asString(), "Baeldung"); - - session.close(); - driver.close(); - } - - @Test - public void standAloneJdbc() throws Exception { - Connection con = DriverManager.getConnection("jdbc:neo4j:bolt://localhost/?user=neo4j,password=12345,scheme=basic"); - - // Querying - try (Statement stmt = con.createStatement()) { - stmt.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + - "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + - "RETURN baeldung, tesla"); - - ResultSet rs = stmt.executeQuery("MATCH (company:Company)-[:owns]-> (car:Car)" + - "WHERE car.make='tesla' and car.model='modelX'" + - "RETURN company.name"); - - while (rs.next()) { - Assert.assertEquals(rs.getString("company.name"), "Baeldung"); - } - } - con.close(); - } -} diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java deleted file mode 100644 index 1ff01b93a1..0000000000 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.baeldung.neo4j; - - -import java.io.File; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.neo4j.graphdb.GraphDatabaseService; -import org.neo4j.graphdb.Label; -import org.neo4j.graphdb.Node; -import org.neo4j.graphdb.NotFoundException; -import org.neo4j.graphdb.RelationshipType; -import org.neo4j.graphdb.Result; -import org.neo4j.graphdb.factory.GraphDatabaseFactory; - -public class Neo4jLiveTest { - - private static GraphDatabaseService graphDb; - - @Before - public void setUp() { - GraphDatabaseFactory graphDbFactory = new GraphDatabaseFactory(); - graphDb = graphDbFactory.newEmbeddedDatabase(new File("data/cars")); - } - - @After - public void tearDown() { - graphDb.shutdown(); - } - - @Test - public void testPersonCar() { - graphDb.beginTx(); - Node car = graphDb.createNode(Label.label("Car")); - car.setProperty("make", "tesla"); - car.setProperty("model", "model3"); - - Node owner = graphDb.createNode(Label.label("Person")); - owner.setProperty("firstName", "baeldung"); - owner.setProperty("lastName", "baeldung"); - - owner.createRelationshipTo(car, RelationshipType.withName("owner")); - - Result result = graphDb.execute("MATCH (c:Car) <-[owner]- (p:Person) " + - "WHERE c.make = 'tesla'" + - "RETURN p.firstName, p.lastName"); - - Map firstResult = result.next(); - Assert.assertEquals("baeldung", firstResult.get("p.firstName")); - } - - @Test - public void testCreateNode() { - - graphDb.beginTx(); - - Result result = graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"})" + - "RETURN baeldung"); - - Map firstResult = result.next(); - Node firstNode = (Node) firstResult.get("baeldung"); - Assert.assertEquals(firstNode.getProperty("name"), "Baeldung"); - } - - @Test - public void testCreateNodeAndLink() { - graphDb.beginTx(); - - Result result = graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + - "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + - "RETURN baeldung, tesla"); - - Map firstResult = result.next(); - Assert.assertTrue(firstResult.containsKey("baeldung")); - Assert.assertTrue(firstResult.containsKey("tesla")); - } - - @Test - public void testFindAndReturn() { - graphDb.beginTx(); - - graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + - "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + - "RETURN baeldung, tesla"); - - Result result = graphDb.execute("MATCH (company:Company)-[:owns]-> (car:Car)" + - "WHERE car.make='tesla' and car.model='modelX'" + - "RETURN company.name"); - - Map firstResult = result.next(); - Assert.assertEquals(firstResult.get("company.name"), "Baeldung"); - } - - @Test - public void testUpdate() { - graphDb.beginTx(); - - graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + - "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + - "RETURN baeldung, tesla"); - - Result result = graphDb.execute("MATCH (car:Car)" + - "WHERE car.make='tesla'" + - " SET car.milage=120" + - " SET car :Car:Electro" + - " SET car.model=NULL" + - " RETURN car"); - - Map firstResult = result.next(); - Node car = (Node) firstResult.get("car"); - - Assert.assertEquals(car.getProperty("milage"), 120L); - Assert.assertEquals(car.getLabels(), Arrays.asList(Label.label("Car"), Label.label("Electro"))); - - try { - car.getProperty("model"); - Assert.fail(); - } catch (NotFoundException e) { - // expected - } - } - - @Test - public void testDelete() { - graphDb.beginTx(); - - graphDb.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + - "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + - "RETURN baeldung, tesla"); - - graphDb.execute("MATCH (company:Company)" + - " WHERE company.name='Baeldung'" + - " DELETE company"); - - Result result = graphDb.execute("MATCH (company:Company)" + - " WHERE company.name='Baeldung'" + - " RETURN company"); - - Assert.assertFalse(result.hasNext()); - } - - @Test - public void testBindings() { - graphDb.beginTx(); - - Map params = new HashMap<>(); - params.put("name", "baeldung"); - params.put("make", "tesla"); - params.put("model", "modelS"); - - Result result = graphDb.execute("CREATE (baeldung:Company {name:$name}) " + - "-[:owns]-> (tesla:Car {make: $make, model: $model})" + - "RETURN baeldung, tesla", params); - - Map firstResult = result.next(); - Assert.assertTrue(firstResult.containsKey("baeldung")); - Assert.assertTrue(firstResult.containsKey("tesla")); - - Node car = (Node) firstResult.get("tesla"); - Assert.assertEquals(car.getProperty("model"), "modelS"); - } -} diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java deleted file mode 100644 index 96e5e76402..0000000000 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.baeldung.neo4j; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; -import org.neo4j.ogm.config.Configuration; -import org.neo4j.ogm.model.Result; -import org.neo4j.ogm.session.Session; -import org.neo4j.ogm.session.SessionFactory; - -import com.baeldung.spring.data.neo4j.domain.Car; -import com.baeldung.spring.data.neo4j.domain.Company; - -public class Neo4jOgmLiveTest { - - @Test - public void testOgm() { - Configuration conf = new Configuration.Builder().build(); - - SessionFactory factory = new SessionFactory(conf, "com.baeldung.spring.data.neo4j.domain"); - Session session = factory.openSession(); - - Car tesla = new Car("tesla", "modelS"); - Company baeldung = new Company("baeldung"); - - baeldung.setCar(tesla); - - session.save(baeldung); - - Assert.assertEquals(1, session.countEntitiesOfType(Company.class)); - - Map params = new HashMap<>(); - params.put("make", "tesla"); - Result result = session.query("MATCH (car:Car) <-[:owns]- (company:Company)" + - " WHERE car.make=$make" + - " RETURN company", params); - - Map firstResult = result.iterator().next(); - - Assert.assertEquals(firstResult.size(), 1); - - Company actual = (Company) firstResult.get("company"); - Assert.assertEquals(actual.getName(), baeldung.getName()); - } -} diff --git a/pom.xml b/pom.xml index e5311ec25f..b8bc85d634 100644 --- a/pom.xml +++ b/pom.xml @@ -369,6 +369,7 @@ persistence-modules/hibernate-ogm persistence-modules/java-cassandra persistence-modules/spring-data-cassandra-reactive + persistence-modules/spring-data-neo4j @@ -545,6 +546,7 @@ persistence-modules/hibernate-ogm persistence-modules/java-cassandra persistence-modules/spring-data-cassandra-reactive + persistence-modules/spring-data-neo4j From cfb75a2922890ddbdf710f282b67e681f5bca06d Mon Sep 17 00:00:00 2001 From: timis1 Date: Fri, 16 Jun 2023 09:35:13 +0300 Subject: [PATCH 057/170] JAVA-22364 Some adjustments in neo4j --- .../test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java | 5 +++++ .../src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java | 4 ++++ .../src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java | 4 ++++ .../test/java/com/baeldung/neo4j/TestContainersTestBase.java | 2 +- 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java b/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java index e9bb7e05b8..2232c68e8e 100644 --- a/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java +++ b/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4JServerLiveTest.java @@ -18,6 +18,11 @@ import org.neo4j.driver.Driver; import org.neo4j.driver.Result; import org.neo4j.driver.Session; + +/** + * To run this test you will need to have an instance of the docker running on your machine (Docker desktop - for Windows and Docker instance for linux) + * After your docker instance is up run this test + */ class Neo4JServerLiveTest { private static Session session; diff --git a/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java b/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java index 840f4536ca..8591dd3a8d 100644 --- a/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java +++ b/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java @@ -24,6 +24,10 @@ import org.neo4j.graphdb.RelationshipType; import org.neo4j.graphdb.Result; import org.neo4j.graphdb.Transaction; +/** + * To run this test you will need to have an instance of the docker running on your machine (Docker desktop - for Windows and Docker instance for linux) + * After your docker instance is up run this test + */ public class Neo4jLiveTest { private static GraphDatabaseService graphDb; diff --git a/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java b/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java index 761ae1697a..aa9dd84ed6 100644 --- a/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java +++ b/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4jOgmLiveTest.java @@ -15,6 +15,10 @@ import org.neo4j.ogm.session.SessionFactory; import com.baeldung.neo4j.domain.Car; import com.baeldung.neo4j.domain.Company; +/** + * To run this test you will need to have an instance of the docker running on your machine (Docker desktop - for Windows and Docker instance for linux) + * After your docker instance is up run this test + */ public class Neo4jOgmLiveTest { private static SessionFactory sessionFactory; diff --git a/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/TestContainersTestBase.java b/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/TestContainersTestBase.java index fd525d6b05..eed2237454 100644 --- a/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/TestContainersTestBase.java +++ b/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/TestContainersTestBase.java @@ -39,7 +39,7 @@ public class TestContainersTestBase { public static final String SYS_PROPERTY_NEO4J_PASSWORD = "NEO4J_OGM_NEO4J_PASSWORD"; - public static final String DEFAULT_PASSWORD = "verysecret"; + public static final String DEFAULT_PASSWORD = "12345"; public static Neo4jContainer neo4jServer; From a88028874b45b24aede2fe7c67b2a8014f334ae6 Mon Sep 17 00:00:00 2001 From: "thibault.faure" Date: Thu, 15 Jun 2023 20:05:04 +0200 Subject: [PATCH 058/170] BAEL-5600 Code for the Read Date in Java using Scanner article --- .../core-java-io-apis-3/README.md | 5 ++++ core-java-modules/core-java-io-apis-3/pom.xml | 15 ++++++++++ .../com/baeldung/scanner/DateScanner.java | 29 +++++++++++++++++++ .../baeldung/scanner/DateScannerUnitTest.java | 26 +++++++++++++++++ core-java-modules/pom.xml | 1 + 5 files changed, 76 insertions(+) create mode 100644 core-java-modules/core-java-io-apis-3/README.md create mode 100644 core-java-modules/core-java-io-apis-3/pom.xml create mode 100644 core-java-modules/core-java-io-apis-3/src/main/java/com/baeldung/scanner/DateScanner.java create mode 100644 core-java-modules/core-java-io-apis-3/src/test/java/com/baeldung/scanner/DateScannerUnitTest.java diff --git a/core-java-modules/core-java-io-apis-3/README.md b/core-java-modules/core-java-io-apis-3/README.md new file mode 100644 index 0000000000..95d8dffce6 --- /dev/null +++ b/core-java-modules/core-java-io-apis-3/README.md @@ -0,0 +1,5 @@ +## Core Java IO APIs + +This module contains articles about core Java input/output(IO) APIs. + +### Relevant Articles: diff --git a/core-java-modules/core-java-io-apis-3/pom.xml b/core-java-modules/core-java-io-apis-3/pom.xml new file mode 100644 index 0000000000..8b2431397b --- /dev/null +++ b/core-java-modules/core-java-io-apis-3/pom.xml @@ -0,0 +1,15 @@ + + + 4.0.0 + core-java-io-apis-3 + core-java-io-apis-3 + 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-io-apis-3/src/main/java/com/baeldung/scanner/DateScanner.java b/core-java-modules/core-java-io-apis-3/src/main/java/com/baeldung/scanner/DateScanner.java new file mode 100644 index 0000000000..a9f3ba820a --- /dev/null +++ b/core-java-modules/core-java-io-apis-3/src/main/java/com/baeldung/scanner/DateScanner.java @@ -0,0 +1,29 @@ +package com.baeldung.scanner; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Date; +import java.util.Scanner; + +public class DateScanner { + + LocalDate scanToLocalDate(String input) { + try (Scanner scanner = new Scanner(input)) { + String dateString = scanner.next(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + return LocalDate.parse(dateString, formatter); + } + } + + Date scanToDate(String input) throws ParseException { + try (Scanner scanner = new Scanner(input)) { + String dateString = scanner.next(); + DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + return formatter.parse(dateString); + } + } + +} diff --git a/core-java-modules/core-java-io-apis-3/src/test/java/com/baeldung/scanner/DateScannerUnitTest.java b/core-java-modules/core-java-io-apis-3/src/test/java/com/baeldung/scanner/DateScannerUnitTest.java new file mode 100644 index 0000000000..1ecd440d95 --- /dev/null +++ b/core-java-modules/core-java-io-apis-3/src/test/java/com/baeldung/scanner/DateScannerUnitTest.java @@ -0,0 +1,26 @@ +package com.baeldung.scanner; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +import org.junit.jupiter.api.Test; + +class DateScannerUnitTest { + + @Test + void whenScanToLocalDate_ThenCorrectLocalDate() { + String dateString = "2018-09-09"; + assertEquals(LocalDate.parse(dateString, DateTimeFormatter.ofPattern("yyyy-MM-dd")), new DateScanner().scanToLocalDate(dateString)); + } + + @Test + void whenScanToDate_ThenCorrectDate() throws ParseException { + String dateString = "2018-09-09"; + assertEquals(new SimpleDateFormat("yyyy-MM-dd").parse(dateString), new DateScanner().scanToDate(dateString)); + } + +} diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 806882a84f..9144e16359 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -81,6 +81,7 @@ core-java-io-4 core-java-io-apis core-java-io-apis-2 + core-java-io-apis-3 core-java-io-conversions core-java-jar core-java-jndi From 553234b8e8d5d9b1ee23b0fb15d1edb93201a13c Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 16 Jun 2023 20:40:51 +0300 Subject: [PATCH 059/170] Update README.md --- persistence-modules/neo4j/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/persistence-modules/neo4j/README.md b/persistence-modules/neo4j/README.md index 354d9605db..c40fdad388 100644 --- a/persistence-modules/neo4j/README.md +++ b/persistence-modules/neo4j/README.md @@ -1,5 +1,3 @@ -## Spring Data Neo4j - ### Relevant Articles: - [A Guide to Neo4J with Java](https://www.baeldung.com/java-neo4j) From b9fc6f2e9c98dcf6ef25ff2a1227402201677424 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 16 Jun 2023 20:41:02 +0300 Subject: [PATCH 060/170] Update README.md --- persistence-modules/spring-data-neo4j/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/persistence-modules/spring-data-neo4j/README.md b/persistence-modules/spring-data-neo4j/README.md index dc54de0e31..0f9a6d99e8 100644 --- a/persistence-modules/spring-data-neo4j/README.md +++ b/persistence-modules/spring-data-neo4j/README.md @@ -2,7 +2,6 @@ ### Relevant Articles: - [Introduction to Spring Data Neo4j](https://www.baeldung.com/spring-data-neo4j-intro) -- [A Guide to Neo4J with Java](https://www.baeldung.com/java-neo4j) ### Build the Project with Tests Running ``` From e3afaf7996ebaa8832598dd63afee8d1125856be Mon Sep 17 00:00:00 2001 From: Bahaa El-Din Helmy Date: Sat, 17 Jun 2023 00:34:34 +0300 Subject: [PATCH 061/170] Difference Between Boolean.TRUE and true in Java (#14253) This commit is related to the article "Difference Between Boolean.TRUE and true in Java" --- .../booleans/BooleanTrueVsTrueUnitTest.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 core-java-modules/core-java-booleans/src/test/java/com/baeldung/booleans/BooleanTrueVsTrueUnitTest.java diff --git a/core-java-modules/core-java-booleans/src/test/java/com/baeldung/booleans/BooleanTrueVsTrueUnitTest.java b/core-java-modules/core-java-booleans/src/test/java/com/baeldung/booleans/BooleanTrueVsTrueUnitTest.java new file mode 100644 index 0000000000..d8c43913fb --- /dev/null +++ b/core-java-modules/core-java-booleans/src/test/java/com/baeldung/booleans/BooleanTrueVsTrueUnitTest.java @@ -0,0 +1,34 @@ +package com.baeldung.booleans; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +public class BooleanTrueVsTrueUnitTest { + + + @Test + public void given_BooleanValues_whenUsingBooleanTrue_thenTestBooleanEquality() { + assertEquals(Boolean.TRUE, Boolean.valueOf(true)); + } + + @Test + public void given_BooleanValues_whenUsingBooleanTrue_thenTestBooleanIdentity() { + assertTrue(Boolean.TRUE == Boolean.valueOf(true)); + } + + @Test + public void given_TrueValue_whenUsingTrue_thenTestPrimitiveEquality() { + assertTrue(true == true); + } + + @Test + public void given_TrueStringValue_whenUsingBooleanTrue_thenTestBooleanToString() { + assertEquals("true", Boolean.TRUE.toString()); + } + + @Test + public void given_PrimitiveValue_whenUsingStringValueOf_thenTestPrimitiveToString() { + assertEquals("true", String.valueOf(true)); + } + +} From c76a1e8c45ec56aba2c16b6240e418988b1ead08 Mon Sep 17 00:00:00 2001 From: timis1 Date: Sat, 17 Jun 2023 00:41:28 +0300 Subject: [PATCH 062/170] JAVA-20167 Remove methods that are not presented in articles --- .../derivedquery/repository/UserRepository.java | 7 ------- .../UserRepositoryIntegrationTest.java | 16 ++-------------- 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/derivedquery/repository/UserRepository.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/derivedquery/repository/UserRepository.java index 4b2d6c11af..7d4a208d26 100644 --- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/derivedquery/repository/UserRepository.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/derivedquery/repository/UserRepository.java @@ -51,13 +51,6 @@ public interface UserRepository extends JpaRepository { List findByAgeIn(Collection ages); - @Query(value = "select * from users where (name = :nameParam OR birth_date <> :birthDateParam)", nativeQuery = true) - List findByNameOrBirthDate(@Param(value = "nameParam") String nameParam, @Param(value = "birthDateParam") ZonedDateTime birthDateParam); - - @Query(value = "select * from users where (name = :nameParam OR birth_date <> :birthDateParam) and active = :activeParam", nativeQuery = true) - List findByNameOrBirthDateAndActive(@Param(value = "nameParam") String nameParam, @Param(value = "birthDateParam") ZonedDateTime birthDateParam, - @Param(value = "activeParam") Boolean activeParam); - List findByNameOrAge(String name, Integer age); List findByNameOrAgeAndActive(String name, Integer age, Boolean active); diff --git a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/derivedquery/repository/UserRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/derivedquery/repository/UserRepositoryIntegrationTest.java index 719f56e3cd..cf479780a1 100644 --- a/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/derivedquery/repository/UserRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/derivedquery/repository/UserRepositoryIntegrationTest.java @@ -152,28 +152,16 @@ public class UserRepositoryIntegrationTest { assertEquals(3, userRepository.findByAgeIn(ages).size()); } - @Test - public void whenByNameOrBirthDate() { - - assertEquals(4, userRepository.findByNameOrBirthDate(USER_NAME_ADAM, BIRTHDATE).size()); - } - - @Test - public void whenByNameOrBirthDateAndActive() { - - assertEquals(2, userRepository.findByNameOrBirthDateAndActive(USER_NAME_ADAM, BIRTHDATE, false).size()); - } - @Test public void whenByNameOrAge() { - assertEquals(2, userRepository.findByNameOrAge(USER_NAME_ADAM, 20).size()); + assertEquals(3, userRepository.findByNameOrAge(USER_NAME_ADAM, 20).size()); } @Test public void whenByNameOrAgeAndActive() { - assertEquals(3, userRepository.findByNameOrAgeAndActive(USER_NAME_ADAM, 20, false).size()); + assertEquals(2, userRepository.findByNameOrAgeAndActive(USER_NAME_ADAM, 20, false).size()); } @Test From ef8a499819758bf12785498cd008874b986380b8 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Sat, 17 Jun 2023 18:55:59 +0200 Subject: [PATCH 063/170] JAVA-6405 | counting Partitions in a topic in two different ways. (#14233) --- ... => KafaConsumeLastNMessagesLiveTest.java} | 2 +- .../kafka/KafkaCountPartitionsLiveTest.java | 83 +++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) rename apache-kafka-2/src/test/java/com/baeldung/kafka/{KafaConsumeLastNMessages.java => KafaConsumeLastNMessagesLiveTest.java} (99%) create mode 100644 apache-kafka-2/src/test/java/com/baeldung/kafka/KafkaCountPartitionsLiveTest.java diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/KafaConsumeLastNMessages.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/KafaConsumeLastNMessagesLiveTest.java similarity index 99% rename from apache-kafka-2/src/test/java/com/baeldung/kafka/KafaConsumeLastNMessages.java rename to apache-kafka-2/src/test/java/com/baeldung/kafka/KafaConsumeLastNMessagesLiveTest.java index 94f5907525..b92f65ca5a 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/KafaConsumeLastNMessages.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/KafaConsumeLastNMessagesLiveTest.java @@ -28,7 +28,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @Testcontainers -public class KafaConsumeLastNMessages { +public class KafaConsumeLastNMessagesLiveTest { private static String TOPIC1 = "baeldung-github"; private static String TOPIC2 = "baeldung-blog"; diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/KafkaCountPartitionsLiveTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/KafkaCountPartitionsLiveTest.java new file mode 100644 index 0000000000..49950f67b1 --- /dev/null +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/KafkaCountPartitionsLiveTest.java @@ -0,0 +1,83 @@ +package com.baeldung.kafka; + +import org.apache.kafka.clients.admin.AdminClient; +import org.apache.kafka.clients.admin.DescribeTopicsResult; +import org.apache.kafka.clients.admin.TopicDescription; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.common.KafkaFuture; +import org.apache.kafka.common.PartitionInfo; +import org.apache.kafka.common.serialization.StringSerializer; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.KafkaContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; + +import java.io.IOException; +import java.util.*; +import java.util.concurrent.ExecutionException; + +@Testcontainers +public class KafkaCountPartitionsLiveTest { + @Container + private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); + private final static String TOPIC = "baeldung-kafka-github"; + private final static Integer PARTITION_NUMBER = 3; + private static KafkaProducer producer; + + @BeforeAll + static void setup() throws IOException, InterruptedException { + KAFKA_CONTAINER.addExposedPort(9092); + + KAFKA_CONTAINER.execInContainer( + "/bin/sh", + "-c", + "/usr/bin/kafka-topics " + + "--bootstrap-server localhost:9092 " + + "--create " + + "--replication-factor 1 " + + "--partitions " + PARTITION_NUMBER + " " + + "--topic " + TOPIC + ); + + Properties producerProperties = new Properties(); + producerProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); + producerProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + producerProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + + producer = new KafkaProducer<>(producerProperties); + } + + @AfterAll + static void destroy() { + KAFKA_CONTAINER.stop(); + } + + @Test + void testPartitionsForTopic_isEqualToActualNumberAssignedDuringCreation() { + List info = producer.partitionsFor(TOPIC); + Assertions.assertEquals(PARTITION_NUMBER, info.size()); + } + + @Test + void testTopicPartitionDescription_isEqualToActualNumberAssignedDuringCreation() { + Properties props = new Properties(); + props.put("bootstrap.servers", KAFKA_CONTAINER.getBootstrapServers()); + props.put("client.id","java-admin-client"); + props.put("request.timeout.ms", 3000); + props.put("connections.max.idle.ms", 5000); + try(AdminClient client = AdminClient.create(props)){ + DescribeTopicsResult describeTopicsResult = client.describeTopics(Collections.singletonList(TOPIC)); + Map> values = describeTopicsResult.values(); + KafkaFuture topicDescription = values.get(TOPIC); + Assertions.assertEquals(PARTITION_NUMBER, topicDescription.get().partitions().size()); + } catch (ExecutionException | InterruptedException e) { + throw new RuntimeException(e); + } + } + +} From 25c26522608b7b7451fbdc582b36c4ad952758a1 Mon Sep 17 00:00:00 2001 From: Kasra Madadipouya Date: Sun, 18 Jun 2023 07:28:01 +0200 Subject: [PATCH 064/170] JAVA-20620 upgrade Spring Swagger module to work with JDK 9 and above (#14254) --- spring-swagger-codegen/pom.xml | 5 +++-- .../spring-swagger-codegen-api-client/pom.xml | 5 +++++ spring-swagger-codegen/spring-swagger-codegen-app/pom.xml | 4 ---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/spring-swagger-codegen/pom.xml b/spring-swagger-codegen/pom.xml index 93cb51d07c..d4fff7eb63 100644 --- a/spring-swagger-codegen/pom.xml +++ b/spring-swagger-codegen/pom.xml @@ -10,8 +10,9 @@ com.baeldung - parent-modules - 1.0.0-SNAPSHOT + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 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 c9ba912feb..b2e97c7a49 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml @@ -79,6 +79,11 @@ joda-time ${jodatime-version} + + javax.annotation + javax.annotation-api + 1.3.2 + diff --git a/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml index 493b7201ee..d3f57474ef 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml @@ -22,12 +22,10 @@ org.springframework.boot spring-boot-starter-web - ${spring.version} org.springframework.boot spring-boot-starter-test - ${spring.version} test @@ -37,14 +35,12 @@ org.springframework.boot spring-boot-maven-plugin - ${spring.version} 0.0.1-SNAPSHOT - 1.5.10.RELEASE \ No newline at end of file From 191245c2da4ea48eb1c942a0d8c809adf9eecf2b Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sun, 18 Jun 2023 11:16:45 +0300 Subject: [PATCH 065/170] [JAVA-21545] Fix test (#14258) --- .../ProductInfoRepositoryIntegrationTest.java | 64 +++++++++++++++++-- 1 file changed, 57 insertions(+), 7 deletions(-) diff --git a/persistence-modules/spring-data-dynamodb/src/test/java/com/baeldung/spring/data/dynamodb/repository/ProductInfoRepositoryIntegrationTest.java b/persistence-modules/spring-data-dynamodb/src/test/java/com/baeldung/spring/data/dynamodb/repository/ProductInfoRepositoryIntegrationTest.java index 6cbd5b0a5a..61de1163b8 100644 --- a/persistence-modules/spring-data-dynamodb/src/test/java/com/baeldung/spring/data/dynamodb/repository/ProductInfoRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-dynamodb/src/test/java/com/baeldung/spring/data/dynamodb/repository/ProductInfoRepositoryIntegrationTest.java @@ -1,6 +1,8 @@ package com.baeldung.spring.data.dynamodb.repository; +import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; import com.amazonaws.services.dynamodbv2.model.CreateTableRequest; import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput; @@ -10,17 +12,24 @@ import com.baeldung.spring.data.dynamodb.model.ProductInfo; import com.baeldung.spring.data.dynamodb.repositories.ProductInfoRepository; import com.baeldung.spring.data.dynamodb.repository.rule.LocalDbCreationRule; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.ClassRule; 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.ActiveProfiles; -import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.List; +import java.util.Optional; +import java.util.Properties; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.core.Is.is; @@ -31,23 +40,40 @@ import static org.junit.Assert.assertThat; @SpringBootTest(classes = Application.class) @WebAppConfiguration @ActiveProfiles("local") -@TestPropertySource(properties = { "amazon.dynamodb.endpoint=http://localhost:8000/", "amazon.aws.accesskey=test1", "amazon.aws.secretkey=test231" }) public class ProductInfoRepositoryIntegrationTest { @ClassRule public static LocalDbCreationRule dynamoDB = new LocalDbCreationRule(); - - private DynamoDBMapper dynamoDBMapper; + private static DynamoDBMapper dynamoDBMapper; + private static AmazonDynamoDB amazonDynamoDB; @Autowired - private AmazonDynamoDB amazonDynamoDB; + private ProductInfoRepository repository; - @Autowired - ProductInfoRepository repository; + private static final String DYNAMODB_ENDPOINT = "amazon.dynamodb.endpoint"; + private static final String AWS_ACCESSKEY = "amazon.aws.accesskey"; + private static final String AWS_SECRETKEY = "amazon.aws.secretkey"; private static final String EXPECTED_COST = "20"; private static final String EXPECTED_PRICE = "50"; + @BeforeClass + public static void setupClass() { + Properties testProperties = loadFromFileInClasspath("application.properties") + .filter(properties -> !isEmpty(properties.getProperty(AWS_ACCESSKEY))) + .filter(properties -> !isEmpty(properties.getProperty(AWS_SECRETKEY))) + .filter(properties -> !isEmpty(properties.getProperty(DYNAMODB_ENDPOINT))) + .orElseThrow(() -> new RuntimeException("Unable to get all of the required test property values")); + + String amazonAWSAccessKey = testProperties.getProperty(AWS_ACCESSKEY); + String amazonAWSSecretKey = testProperties.getProperty(AWS_SECRETKEY); + String amazonDynamoDBEndpoint = testProperties.getProperty(DYNAMODB_ENDPOINT); + + amazonDynamoDB = new AmazonDynamoDBClient(new BasicAWSCredentials(amazonAWSAccessKey, amazonAWSSecretKey)); + amazonDynamoDB.setEndpoint(amazonDynamoDBEndpoint); + dynamoDBMapper = new DynamoDBMapper(amazonDynamoDB); + } + @Before public void setup() throws Exception { @@ -77,4 +103,28 @@ public class ProductInfoRepositoryIntegrationTest { assertThat(result.size(), is(greaterThan(0))); assertThat(result.get(0).getCost(), is(equalTo(EXPECTED_COST))); } + + private static boolean isEmpty(String inputString) { + return inputString == null || "".equals(inputString); + } + + private static Optional loadFromFileInClasspath(String fileName) { + InputStream stream = null; + try { + Properties config = new Properties(); + Path configLocation = Paths.get(ClassLoader.getSystemResource(fileName).toURI()); + stream = Files.newInputStream(configLocation); + config.load(stream); + return Optional.of(config); + } catch (Exception e) { + return Optional.empty(); + } finally { + if (stream != null) { + try { + stream.close(); + } catch (IOException e) { + } + } + } + } } From d4c6226aa52be67c006ed84949836a65480a2489 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Sun, 18 Jun 2023 11:23:46 +0200 Subject: [PATCH 066/170] JAVA-22250 | bumping karate to a new version compatible with jdk 17 (#14230) * JAVA-22250 | bumping karate to a new version compatible with jdk 17 * JAVA-22180 | removed unused lib and added correct scope. --- testing-modules/rest-testing/pom.xml | 39 +++++++------------ .../rest/karate/KarateIntegrationTest.java | 13 +++---- .../com/baeldung/rest}/karate/user.feature | 0 3 files changed, 20 insertions(+), 32 deletions(-) rename testing-modules/rest-testing/src/test/{resources => java/com/baeldung/rest}/karate/user.feature (100%) diff --git a/testing-modules/rest-testing/pom.xml b/testing-modules/rest-testing/pom.xml index 323c46a5fc..f8005092ae 100644 --- a/testing-modules/rest-testing/pom.xml +++ b/testing-modules/rest-testing/pom.xml @@ -26,23 +26,6 @@ commons-lang3 ${commons-lang3.version} - - - org.apache.httpcomponents - httpclient - ${httpclient.version} - - - commons-logging - commons-logging - - - - - org.apache.httpcomponents - httpcore - ${httpcore.version} - com.fasterxml.jackson.core @@ -66,6 +49,7 @@ io.cucumber cucumber-junit ${cucumber.version} + test org.jbehave @@ -73,11 +57,6 @@ ${jbehave.version} test - - com.intuit.karate - karate-apache - ${karate.version} - com.intuit.karate karate-junit4 @@ -94,6 +73,18 @@ true + + + + src/test/java + + **/*.java + + + + src/test/resources + + org.apache.maven.plugins @@ -145,9 +136,7 @@ 2.9.0 6.8.0 2.21.0 - 0.6.1 - 4.4.5 - 4.5.2 + 1.3.1 4.1 diff --git a/testing-modules/rest-testing/src/test/java/com/baeldung/rest/karate/KarateIntegrationTest.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/karate/KarateIntegrationTest.java index 59d14e6ae0..91dbd7599e 100644 --- a/testing-modules/rest-testing/src/test/java/com/baeldung/rest/karate/KarateIntegrationTest.java +++ b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/karate/KarateIntegrationTest.java @@ -2,17 +2,16 @@ package com.baeldung.rest.karate; import com.github.tomakehurst.wiremock.WireMockServer; import com.github.tomakehurst.wiremock.core.WireMockConfiguration; -import cucumber.api.CucumberOptions; +import com.intuit.karate.junit4.Karate; import org.junit.AfterClass; import org.junit.BeforeClass; +import org.junit.runner.RunWith; import static com.github.tomakehurst.wiremock.client.WireMock.*; import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; -//We need to upgrade to latest version of Karate for JDK17 --- JAVA-22250 -//@RunWith(Karate.class) -@CucumberOptions(features = "classpath:karate") +@RunWith(Karate.class) public class KarateIntegrationTest { private static final int PORT_NUMBER = 8097; @@ -20,7 +19,7 @@ public class KarateIntegrationTest { private static final WireMockServer wireMockServer = new WireMockServer(WireMockConfiguration.options().port(PORT_NUMBER)); @BeforeClass - public static void setUp() throws Exception { + public static void setUp() { wireMockServer.start(); configureFor("localhost", PORT_NUMBER); @@ -30,7 +29,7 @@ public class KarateIntegrationTest { .withHeader("Content-Type", "application/json") .withBody("{ \"id\": \"1234\", name: \"John Smith\" }"))); stubFor(post(urlEqualTo("/user/create")) - .withHeader("content-type", equalTo("application/json")) + .withHeader("content-type", equalTo("application/json; charset=UTF-8")) .withRequestBody(containing("id")) .willReturn(aResponse() .withStatus(200) @@ -40,7 +39,7 @@ public class KarateIntegrationTest { } @AfterClass - public static void tearDown() throws Exception { + public static void tearDown() { wireMockServer.stop(); } diff --git a/testing-modules/rest-testing/src/test/resources/karate/user.feature b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/karate/user.feature similarity index 100% rename from testing-modules/rest-testing/src/test/resources/karate/user.feature rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/karate/user.feature From 43fc8b38eacdf03e64608c9e23341d5e8d39f44f Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Sun, 18 Jun 2023 12:54:06 +0200 Subject: [PATCH 067/170] JAVA-6350: Add comments for SpringDoc v2 compatible with Spring Boot 3 (#13989) --- .../spring-boot-springdoc-2/README.md | 3 + .../spring-boot-springdoc-2/pom.xml | 119 ++++++++++++++++++ .../springdoc/SpringdocApplication.java | 13 ++ .../springdoc/controller/BookController.java | 83 ++++++++++++ .../controller/RegularRestController.java | 30 +++++ .../exception/BookNotFoundException.java | 5 + .../GlobalControllerExceptionHandler.java | 24 ++++ .../java/com/baeldung/springdoc/kotlin/Foo.kt | 16 +++ .../springdoc/kotlin/FooController.kt | 36 ++++++ .../com/baeldung/springdoc/model/Book.java | 42 +++++++ .../springdoc/repository/BookRepository.java | 34 +++++ .../src/main/resources/application.properties | 24 ++++ .../src/main/resources/data.sql | 4 + .../src/main/resources/logback.xml | 13 ++ .../src/main/resources/schema.sql | 8 ++ .../baeldung/springdoc/SpringContextTest.java | 17 +++ .../src/test/resources/logback-test.xml | 12 ++ .../spring-boot-springdoc/README.md | 1 - .../spring-boot-springdoc/pom.xml | 50 +------- 19 files changed, 484 insertions(+), 50 deletions(-) create mode 100644 spring-boot-modules/spring-boot-springdoc-2/README.md create mode 100644 spring-boot-modules/spring-boot-springdoc-2/pom.xml create mode 100644 spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/SpringdocApplication.java create mode 100644 spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/controller/BookController.java create mode 100644 spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/controller/RegularRestController.java create mode 100644 spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/exception/BookNotFoundException.java create mode 100644 spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/exception/GlobalControllerExceptionHandler.java create mode 100644 spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/kotlin/Foo.kt create mode 100644 spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/kotlin/FooController.kt create mode 100644 spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/model/Book.java create mode 100644 spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/repository/BookRepository.java create mode 100644 spring-boot-modules/spring-boot-springdoc-2/src/main/resources/application.properties create mode 100644 spring-boot-modules/spring-boot-springdoc-2/src/main/resources/data.sql create mode 100644 spring-boot-modules/spring-boot-springdoc-2/src/main/resources/logback.xml create mode 100644 spring-boot-modules/spring-boot-springdoc-2/src/main/resources/schema.sql create mode 100644 spring-boot-modules/spring-boot-springdoc-2/src/test/java/com/baeldung/springdoc/SpringContextTest.java create mode 100644 spring-boot-modules/spring-boot-springdoc-2/src/test/resources/logback-test.xml diff --git a/spring-boot-modules/spring-boot-springdoc-2/README.md b/spring-boot-modules/spring-boot-springdoc-2/README.md new file mode 100644 index 0000000000..80977ae5d5 --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc-2/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Documenting a Spring REST API Using OpenAPI 3.0](https://www.baeldung.com/spring-rest-openapi-documentation) \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-springdoc-2/pom.xml b/spring-boot-modules/spring-boot-springdoc-2/pom.xml new file mode 100644 index 0000000000..5aff9ec4fa --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc-2/pom.xml @@ -0,0 +1,119 @@ + + + 4.0.0 + spring-boot-springdoc-2 + 0.0.1-SNAPSHOT + spring-boot-springdoc-2 + jar + Project for Springdoc integration + + + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + ${springdoc.version} + + + org.springdoc + springdoc-openapi-starter-common + ${springdoc.version} + + + org.jetbrains.kotlin + kotlin-stdlib + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + integration + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + pre-integration-test + + start + + + + post-integration-test + + stop + + + + + + org.springdoc + springdoc-openapi-maven-plugin + ${springdoc-openapi-maven-plugin.version} + + + integration-test + + generate + + + + + http://localhost:8080/api-docs + openapi.json + ${project.build.directory} + + + + + + + + + 2.1.0 + 1.4 + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/SpringdocApplication.java b/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/SpringdocApplication.java new file mode 100644 index 0000000000..45c7c23621 --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/SpringdocApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.springdoc; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringdocApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringdocApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/controller/BookController.java b/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/controller/BookController.java new file mode 100644 index 0000000000..790cc0797e --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/controller/BookController.java @@ -0,0 +1,83 @@ +package com.baeldung.springdoc.controller; + +import com.baeldung.springdoc.exception.BookNotFoundException; +import com.baeldung.springdoc.model.Book; +import com.baeldung.springdoc.repository.BookRepository; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +import java.util.Collection; + +@RestController +@RequestMapping("/api/book") +public class BookController { + + private final BookRepository repository; + + public BookController(BookRepository repository) { + this.repository = repository; + } + + @Operation(summary = "Get a book by its id") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Found the book", + content = {@Content(mediaType = "application/json", schema = @Schema(implementation = Book.class))}), + @ApiResponse(responseCode = "400", description = "Invalid id supplied", content = @Content), + @ApiResponse(responseCode = "404", description = "Book not found", content = @Content)}) // @formatter:on + @GetMapping("/{id}") + public Book findById(@Parameter(description = "id of book to be searched") @PathVariable long id) { + return repository.findById(id) + .orElseThrow(BookNotFoundException::new); + } + + @GetMapping("/") + public Collection findBooks() { + return repository.getBooks(); + } + + @GetMapping("/filter") + public Page filterBooks(@ParameterObject Pageable pageable) { + return repository.getBooks(pageable); + } + + @PutMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + public Book updateBook(@PathVariable("id") final String id, @RequestBody final Book book) { + return book; + } + + @PatchMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + public Book patchBook(@PathVariable("id") final String id, @RequestBody final Book book) { + return book; + } + + @PostMapping("/") + @ResponseStatus(HttpStatus.CREATED) + public Book postBook(@NotNull @Valid @RequestBody final Book book) { + return book; + } + + @RequestMapping(method = RequestMethod.HEAD, value = "/") + @ResponseStatus(HttpStatus.OK) + public Book headBook() { + return new Book(); + } + + @DeleteMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + public long deleteBook(@PathVariable final long id) { + return id; + } +} diff --git a/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/controller/RegularRestController.java b/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/controller/RegularRestController.java new file mode 100644 index 0000000000..c17cebf37b --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/controller/RegularRestController.java @@ -0,0 +1,30 @@ +package com.baeldung.springdoc.controller; + +import io.swagger.v3.oas.annotations.Hidden; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.LocalDate; +import java.time.LocalTime; + +@Hidden +@RestController +public class RegularRestController { + + @Hidden + @GetMapping("/getAuthor") + public String getAuthor() { + return "Umang Budhwar"; + } + + @GetMapping("/getDate") + public LocalDate getDate() { + return LocalDate.now(); + } + + @GetMapping("/getTime") + public LocalTime getTime() { + return LocalTime.now(); + } + +} diff --git a/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/exception/BookNotFoundException.java b/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/exception/BookNotFoundException.java new file mode 100644 index 0000000000..331f663548 --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/exception/BookNotFoundException.java @@ -0,0 +1,5 @@ +package com.baeldung.springdoc.exception; + +public class BookNotFoundException extends RuntimeException { + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/exception/GlobalControllerExceptionHandler.java b/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/exception/GlobalControllerExceptionHandler.java new file mode 100644 index 0000000000..0a1cbd5d35 --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/exception/GlobalControllerExceptionHandler.java @@ -0,0 +1,24 @@ +package com.baeldung.springdoc.exception; + +import org.springframework.core.convert.ConversionFailedException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class GlobalControllerExceptionHandler { + + @ExceptionHandler(ConversionFailedException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ResponseEntity handleConversion(RuntimeException ex) { + return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(BookNotFoundException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + public ResponseEntity handleBookNotFound(RuntimeException ex) { + return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND); + } +} diff --git a/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/kotlin/Foo.kt b/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/kotlin/Foo.kt new file mode 100644 index 0000000000..08af8fddc6 --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/kotlin/Foo.kt @@ -0,0 +1,16 @@ +package com.baeldung.springdoc.kotlin + +import jakarta.persistence.Entity +import jakarta.persistence.Id +import jakarta.validation.constraints.NotBlank +import jakarta.validation.constraints.Size + +@Entity +data class Foo( + @Id + val id: Long = 0, + + @NotBlank + @Size(min = 0, max = 50) + val name: String = "" +) \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/kotlin/FooController.kt b/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/kotlin/FooController.kt new file mode 100644 index 0000000000..953cf6d00e --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/kotlin/FooController.kt @@ -0,0 +1,36 @@ +package com.baeldung.springdoc.kotlin + +import io.swagger.v3.oas.annotations.Operation +import io.swagger.v3.oas.annotations.media.ArraySchema +import io.swagger.v3.oas.annotations.media.Content +import io.swagger.v3.oas.annotations.media.Schema +import io.swagger.v3.oas.annotations.responses.ApiResponse +import io.swagger.v3.oas.annotations.responses.ApiResponses +import org.hibernate.internal.util.collections.CollectionHelper.listOf +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping("/") +class FooController { + val fooList: List = listOf(Foo(1, "one"), Foo(2, "two")) + + @Operation(summary = "Get all foos") + @ApiResponses( + value = [ + ApiResponse( + responseCode = "200", description = "Found Foos", content = [ + (Content( + mediaType = "application/json", array = ( + ArraySchema(schema = Schema(implementation = Foo::class))) + ))] + ), + ApiResponse(responseCode = "400", description = "Bad request", content = [Content()]), + ApiResponse(responseCode = "404", description = "Did not find any Foos", content = [Content()])] + ) + @GetMapping("/foo") + fun getAllFoos(): List = fooList +} + + diff --git a/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/model/Book.java b/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/model/Book.java new file mode 100644 index 0000000000..7b378a5183 --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/model/Book.java @@ -0,0 +1,42 @@ +package com.baeldung.springdoc.model; + + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; + +public class Book { + + private long id; + + @NotBlank + @Size(min = 0, max = 20) + private String title; + + @NotBlank + @Size(min = 0, max = 30) + private String author; + + 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 String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } +} diff --git a/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/repository/BookRepository.java b/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/repository/BookRepository.java new file mode 100644 index 0000000000..51247910b8 --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc-2/src/main/java/com/baeldung/springdoc/repository/BookRepository.java @@ -0,0 +1,34 @@ +package com.baeldung.springdoc.repository; + +import com.baeldung.springdoc.model.Book; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Repository; + +import java.util.*; + +@Repository +public class BookRepository { + + private final Map books = new HashMap<>(); + + public Optional findById(long id) { + return Optional.ofNullable(books.get(id)); + } + + public void add(Book book) { + books.put(book.getId(), book); + } + + public Collection getBooks() { + return books.values(); + } + + public Page getBooks(Pageable pageable) { + int toSkip = pageable.getPageSize() * pageable.getPageNumber(); + List result = books.values().stream().skip(toSkip).limit(pageable.getPageSize()).toList(); + + return new PageImpl<>(result, pageable, books.size()); + } +} diff --git a/spring-boot-modules/spring-boot-springdoc-2/src/main/resources/application.properties b/spring-boot-modules/spring-boot-springdoc-2/src/main/resources/application.properties new file mode 100644 index 0000000000..a668601a7d --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc-2/src/main/resources/application.properties @@ -0,0 +1,24 @@ +# custom path for swagger-ui +springdoc.swagger-ui.path=/swagger-ui-custom.html + +# custom path for api docs +springdoc.api-docs.path=/api-docs + +# H2 Related Configurations +spring.datasource.url=jdbc:h2:mem:springdoc + +## for com.baeldung.restdocopenapi ## +springdoc.version=@springdoc.version@ +spring.jpa.hibernate.ddl-auto=none + +## for com.baeldung.jwt ## +jwt.private.key=classpath:app.key +jwt.public.key=classpath:app.pub + + +api.version=1.0-SNAPSHOT +tos.uri=terms-of-service +api.server.url=https://www.baeldung.com +api.description=The User API is used to create, update, and delete users. Users can be created with or without an associated account. If an account is created, the user will be granted the ROLE_USER role. If an account is not created, the user will be granted the ROLE_USER role. +springdoc.swagger-ui.operationsSorter=alpha +springdoc.swagger-ui.tagsSorter=alpha \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-springdoc-2/src/main/resources/data.sql b/spring-boot-modules/spring-boot-springdoc-2/src/main/resources/data.sql new file mode 100644 index 0000000000..f80e53b717 --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc-2/src/main/resources/data.sql @@ -0,0 +1,4 @@ +INSERT INTO Foo(id, title, body) VALUES (1, 'Foo 1', 'Foo body 1'); +INSERT INTO Foo(id, title, body) VALUES (2, 'Foo 2', 'Foo body 2'); +INSERT INTO Foo(id, title, body) VALUES (3, 'Foo 3', 'Foo body 3'); + diff --git a/spring-boot-modules/spring-boot-springdoc-2/src/main/resources/logback.xml b/spring-boot-modules/spring-boot-springdoc-2/src/main/resources/logback.xml new file mode 100644 index 0000000000..73dd672c1a --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc-2/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-boot-modules/spring-boot-springdoc-2/src/main/resources/schema.sql b/spring-boot-modules/spring-boot-springdoc-2/src/main/resources/schema.sql new file mode 100644 index 0000000000..e5d33da019 --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc-2/src/main/resources/schema.sql @@ -0,0 +1,8 @@ +DROP TABLE IF EXISTS foo; + +CREATE TABLE foo ( + id INTEGER NOT NULL AUTO_INCREMENT, + title VARCHAR(250) NOT NULL, + body VARCHAR(250), + PRIMARY KEY (id) +); \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-springdoc-2/src/test/java/com/baeldung/springdoc/SpringContextTest.java b/spring-boot-modules/spring-boot-springdoc-2/src/test/java/com/baeldung/springdoc/SpringContextTest.java new file mode 100644 index 0000000000..d7cd6bc30b --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc-2/src/test/java/com/baeldung/springdoc/SpringContextTest.java @@ -0,0 +1,17 @@ +package com.baeldung.springdoc; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +@ExtendWith(SpringExtension.class) +@SpringBootTest +class SpringContextTest { + + @Test + void whenSpringContextIsBootstrapped_thenNoExceptions() { + + } + +} diff --git a/spring-boot-modules/spring-boot-springdoc-2/src/test/resources/logback-test.xml b/spring-boot-modules/spring-boot-springdoc-2/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..ab4a5f3a20 --- /dev/null +++ b/spring-boot-modules/spring-boot-springdoc-2/src/test/resources/logback-test.xml @@ -0,0 +1,12 @@ + + + + + [%d{ISO8601}]-[%thread] %-5level %logger - %msg%n + + + + + + + diff --git a/spring-boot-modules/spring-boot-springdoc/README.md b/spring-boot-modules/spring-boot-springdoc/README.md index 3d0fd19ab1..95e6bf6ead 100644 --- a/spring-boot-modules/spring-boot-springdoc/README.md +++ b/spring-boot-modules/spring-boot-springdoc/README.md @@ -1,6 +1,5 @@ ### Relevant Articles: -- [Documenting a Spring REST API Using OpenAPI 3.0](https://www.baeldung.com/spring-rest-openapi-documentation) - [Spring REST Docs vs OpenAPI](https://www.baeldung.com/spring-rest-docs-vs-openapi) - [Hiding Endpoints From Swagger Documentation in Spring Boot](https://www.baeldung.com/spring-swagger-hiding-endpoints) - [Swagger @Api Description Is Deprecated](https://www.baeldung.com/java-swagger-api-description-deprecated) diff --git a/spring-boot-modules/spring-boot-springdoc/pom.xml b/spring-boot-modules/spring-boot-springdoc/pom.xml index e21efc35d2..8ed9b7c22b 100644 --- a/spring-boot-modules/spring-boot-springdoc/pom.xml +++ b/spring-boot-modules/spring-boot-springdoc/pom.xml @@ -45,7 +45,7 @@ spring-boot-starter-test test - + org.springdoc springdoc-openapi-ui @@ -61,7 +61,6 @@ springdoc-openapi-security ${springdoc.version} - org.springframework.restdocs spring-restdocs-mockmvc @@ -119,53 +118,6 @@ - - - integration - - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot.version} - - - pre-integration-test - - start - - - - post-integration-test - - stop - - - - - - org.springdoc - springdoc-openapi-maven-plugin - ${springdoc-openapi-maven-plugin.version} - - - integration-test - - generate - - - - - http://localhost:8080/api-docs - openapi.json - ${project.build.directory} - - - - - - - 1.7.0 1.5.6 From 0f93526c25a668c541ccee86d9a4b98f206db944 Mon Sep 17 00:00:00 2001 From: Viktor Ardelean Date: Sun, 18 Jun 2023 18:43:01 +0300 Subject: [PATCH 068/170] Feature/bael 5934 (#14120) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Merge fork with source (#6) * JAVA-20280: remove wrong property (#13874) * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md * Update README.md [skip ci] * JAVA-13721 Format, Fix Package, Upgrade version of all the articles * JAVA-13721 Moved mockito-simple to JDK9+ profiles * JAVA-20278. Please point me to the tutorial code #13768. (#13923) Co-authored-by: jogra * BAEL-6352: Check if the First Letter of a String is a Number (#13883) * [BAEL-6434_charAndString] Difference Between "char" and "String" (#13907) * [JAVA-18185] Upgrade groovy version (#13926) * Update code for Overview of NLP Libraries in Java (#13912) * Update code for Overview of NLP Libraries in Java * Update code for Overview of NLP Libraries in Java * Update code for Overview of NLP Libraries in Java * BAEL-6319 Hibernate 6 Boolean Converters (#13894) Co-authored-by: Mariusz Kaczmarczyk * BAEL-6194 Retrieve the Value of an HTML Input Using Selenium WebDriver in Java (#13898) * Retrieve the Value of an HTML Input Using Selenium WebDriver in Java * Retrieve the Value of an HTML Input Using Selenium WebDriver in Java * Retrieve the Value of an HTML Input Using Selenium WebDriver in Java * JAVA-20898 Check Article Code Matches GitHub * Java 15032 (#13913) * JAVA-15032: Changes made for adding the test cases custom userAgent in request header * JAVA-15032: Changes made for adding the test cases custom userAgent in request header * JAVA-15032: Changes made for incorporarting review comments * JAVA-20931 Commented out spring-boot-3 for now because of JDK 19 requirement (#13936) * BAEL-6325 Create core-java-lang-oop-constructors-2 (#13933) * BAEL-5915 Added different ways to create an object * BAEL-6325 Create core-java-lang-oop-constructors-2 * BAEL-6435: Reverse a String in Java 8 using Lambda and Streams (#13910) * [JAVA-20456] Upgraded jackson version (#13871) * [JAVA-20457] Upgraded springdoc version (#13872) * [JAVA-20459] Upgraded org.json to latest version (#13869) * BAEL-6327 - Find the index of an element in a Java array (#13844) * JAVA-20898 Move article url from javaxval-2 to javaxval * Java 20643 (#13914) * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: changes made for removing web-modules from default * [BAEL-6436_printQuotesAroundString] Print "" Quotes Around a String in Java (#13925) * JAVA-18113 Update spring-boot-swagger-keycloak module (#13506) * JAVA-18113 Update spring-boot-swagger-keycloak module * JAVA-16612: Mock Final Classes and Methods with Mockito article; MockMaker improvement (#13890) * BAEL-6254: Scoped values (#13756) * Added the code for "The difference between BufferedReader and FileReader". (#13942) * BAEL-5814 - Is CompletableFuture Non-blocking (#13917) * BAEL-5814 - Is CompletableFuture Non-blocking * Fix the formatting * BAEL-6326: Spring Boot H2 JdbcSQLSyntaxErrorException expected identifier (#13843) * BAEL-6320: added code support for the @NaturalId article * JAVA-16946: comment spring-jooq module from persistence-modules. (#13951) * JAVA-20555 use Java Base64 instead of deprecated Spring Base64Utils (#13941) * [BAEL-6105] code for list to page article * Update README.md [skip ci] * Update README.md [skip ci] * [BAEL-6105] code for list to page article * [BAEL-6105] refactor test names * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * BAEL-6438 Code for the Find the longest word in a given string article * BAEL-6332: Calling Non-Static Method In Static Method In Java (#13940) * [BAEL-6485_RM-Punctuation] Remove Punctuation (#13946) * BAEL-6410 (#13919) * BAEL-6410 | Article code * Adding consumer code for article * BAEL-6046 MongoDB - Field Level Encryption (#13859) * [BAEL-6253] record equals hashcode (#13958) * [BAEL-6253] records equals and hashcode * [BAEL-6253] records equals and hashcode * [BAEL-6253] records equals and hashcode test case --------- Co-authored-by: Bhaskar * [compByteArrays] Comparing Two Byte Arrays in Java (#13935) * Remove Comments and update prefix. * Uploading File using Selenium WebDriver in Java (#13947) * Uploading File using Selenium WebDriver in Java * Uploading File using Selenium WebDriver in Java * Uploading File using Selenium WebDriver in Java * Uploading File using Selenium WebDriver in Java * [rajkishorraj185@gmail.com] Lombok equalsandhashcode annotation (#13717) * example code for equalsandhashcode annotation * moving codes to lombok-2 --------- Co-authored-by: raj kishor * Match prefix same as draft. * JAVA-19152: fix intermittently failing RequestProcessorUnitTest (#13957) * [JAVA-19362] Upgraded itextpdf to 5.5.13.3 (#13961) * JAVA-16946: disable unit test for core-java-lang-oop-modifiers module for maintenance (#13968) * BAEL-6444 | Added P6Spy logging in spring boot observation module. (#13965) * BAEL-6444 | Added P6Spy logging in spring boot observation module. * BAEL-6444 | Added Find with name query and custom log format now working * BAEL-6444 | Formatting * BAEL-6444 | Renaming junit files * BAEL-6444 | Added start class * BAEL-6444 | Actualized code with Article * BAEL-6444 | Actualized code with Article * BAEL-6444 | redded commit() * BAEL-6444 | BDD naming strategy * BAEL-6501 Update article "The producer-consumer problem example in Java" (#13973) * BAEL-6501 Changed the synchronization block to use the DataQueue * BAEL-6501 Fixed the platform agnostic new lines * BAEL-6501 Moved ID increment to a static method * BAEL-6501 Added a logger * Add files via upload (#13978) * JAVA-19152 Increased the awaitility timeout for one more poll delay (#13975) * BAEL-6250: Example code for Get All Caffeine Cache Keys article (#13806) * BAEL-6185 reuse string builder performance (#13791) * BAEL-6444 | Removed copyright commit (#13987) * JAVA-18648 Review the time of the build - Week 9 - 2023 (#13954) * JAVA-20277 GitHub Issue: Regarding article Introduction to JsonPath (#13939) * BAEL-6197 - Execute Tests Based on Active Profile with JUnit 5 (#13776) * BAEL-6255 - Run a Spring Boot application in AWS Lambda * BAEL-6255 - Run a Spring Boot application in AWS Lambda * fix on template.yaml * fix on template.yaml * removed log from test * resolved issues reported on PR * BAEL-6277 - A Guide To Spring Cloud Azure First commit * BAEL-6277 - A Guide To Spring Cloud Azure Added to README.md the steps to create the secrets * BAEL-6277 - A Guide To Spring Cloud Azure Added the integration Azure Key Vault Properties * BAEL-6277 - A Guide To Spring Cloud Azure Added the integration Azure Key Vault Properties * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault Added one level package keyvault * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault removed target release version * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault fix compilation of NoSuchElementException * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault fix pom.xml * Revert "BAEL-6277 - A Guide To Spring Cloud Azure Key Vault" This reverts commit 1cca1d0d692646001a6d7de106f3a37fb22839ce. * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault fix pom.xml * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault downgrade version to fix jenkins pipeline error * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault comment run on main class * Revert "reset last commit" This reverts commit c557fad67f1c15bb384f0af5781430a45121a838. * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #First push * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault Revert for new pr * reset last commit * reset last commit * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #Remove redundant test * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #Format fix * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #fix from review * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #fix from review * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #fix test name --------- Co-authored-by: Cesare * [scanner-to-array] Saving Java Scanner Input to an Array (#13969) * BAEL-6342 JUnit Test Class for Null and Empty String (#13963) * JAVA-20630 upgrade maven war plugin to be compatible with JDK 11 and 17 (#13945) * JAVA-20630 upgrade maven war plugin to be compatible with JDK 11 and 17 * JAVA-20630 code format * JAVA-20630 don't fail if there's no web.xml and using Java based configuration while building a war file * JAVA-20630 avoid unneeded formatting * JAVA-20630 change order of modules to solve flaky tests * fix module order * add dependent module * add parent * JAVA-20828 Fixing the core-java-exclusions module (#13997) * Upgrade spring.vault.core from 2.3.2 to 3.0.2 (#13977) * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Create README.md [skip ci] * Update README.md [skip ci] * Title: Regular Expression: \z vs \Z Anchors in Java (#13994) Hello, This commit related to the article entitled "Regular Expression: \z vs \Z Anchors in Java" * JAVA-20828: Changes made for updating blade module to java 11 (#13929) * JAVA-20828: Changes made for updating blade module to java 11 * JAVA-20828: Changes made for updating bootique,dropwizard,google-web-toolkit module to java 11 * JAVA-20828: Changes made for updating bootique,dropwizard,google-web-toolkit module to java 11 * JAVA-20828: Adding jakarta-ee to jdk-9 profile * BAEL-6334 Add example code for checking if a list element is in another list * JAVA-20610 Upgraded parent-boot-2 to 2.7.11 (#13944) * JAVA-20163 Upgrade hibernate specific modules to JDK 11 (#13817) * JAVA-20163 Migration hibernate-annotations * JAVA-20163 Migrate hibernate-queries * JAVA-20163 Migrating hibernate-mapping * JAVA-20163 rename reserved keywords, update inheritance example * JAVA-20163 Migrate hibernate-ogm module to the jdk 8 because hibernate-ogm doesn't support jakarta API * JAVA-20163 Migrate hibernate-enterprise module * JAVA-20163 Add update to HibernateExceptionUnitTest#whenQueryExecutedWithUnmappedEntity_thenMappingException * JAVA-20163 Set explicit version for hibernate 6.1.7.Final in the hibernate-queries module * JAVA-20163 Fix failed test with port that already exists (giving another port 8088) * JAVA-20163 Fix other location after changing the port * JAVA-20163 Remove duplicate Unit Test --------- Co-authored-by: n Co-authored-by: Loredana Crusoveanu * JAVA-20165 Upgrade spring-boot hibernate specific modules to JDK 11 (#13952) * JAVA-20165 Upgrade spring-boot hibernate specific modules to JDK 11 * JAVA-20165 Migrating spring-boot-persistence-mongodb * JAVA-20165 Migrating spring-boot-persistence-mongodb-2 * JAVA-20165 Migrating spring-boot-persistence-mongodb-3 * JAVA-20165 Adding latest version for jdbi in spring-boot-persistence-2 module --------- Co-authored-by: timis1 * [Check If a Specified Key Exists in a Given S3 Bucket using Java] added code examples (#13775) * [Check If a Specified Key Exists in a Given S3 Bucket using Java]] added code examples for change test name remove link from README.md * - used env variables for AWS credentials - used codestyle profile of baledung * [os-to-is] Convert an OutputStream to an InputStream (#13992) * BAEL-6264 added class to show how to instantiate ArrayBlockingQueue a… (#13851) * BAEL-6264 added class to show how to instantiate ArrayBlockingQueue and LinkedBlockingQueue * BAEL-6264 added unit test case * modified test case * BAEL-6264 deleted BlockingQueueImplExample file not needed anymore * BAEL-6264 code review changes moved class file to different module --------- Co-authored-by: Vartika_Nigam * Add code examples for "Opening a New Tab Using Selenium WebDriver in Java" (#14001) Add code examples for "Opening a New Tab Using Selenium WebDriver in Java" * BAEL-6320: format & code review * JAVA-16946 Upgrade h2 database version for remaining modules (#13976) * Add java interface single implementation examples (#13972) * Fix formatting issues, refactor the `profiles` word in the properties. * Add files via upload (#14006) * JAVA-20828 Fixed module name (#14018) * fix SeleniumOpenNewTabLiveTest (#14019) * BAEL-6493 - Read last N messages from a Kafka Topic (#14020) * BAEL-6398: Java PrintStream to String (#13998) * Revert "JAVA-20280: remove wrong property (#13874)" (#14021) This reverts commit 561e893e86d9c51b1e61818f5450d6194d9959fd. * Hashing with Argon2 in Java (#14009) * Hashing with Argon2 in Java * Hashing with Argon2 in Java * JAVA-13721 Fixing the formatting * JAVA-13721 Further formatting of files * BAEL-4369: Multiple ways of declaring dependency versions in Gradle (#13825) * BAEL-6246 Code for the article Send MultipartFile Request with RestAs… (#13803) * BAEL-6246 Code for the article Send MultipartFile Request with RestAssured * Fix code style in rest assured integration tests --------- Co-authored-by: thibault.faure * Bael 4582: Custom Authentication using shared secret (#13801) * Spring custom security filter add * Integration Tests add * Add Project into parent pom * refactor code * refactor code * remove .env and refactor code * refactor code * exclude auto configuration * Refactored code * removed ssl certificate for security * Set session management to statelees * Refactor tests * Refactor authentication logic * Refactor authentication logic * Refactor authentication logic * Remove unused code * Remove unused code * Remove unused appconfig * disable AWSS3ObjectIntegrationTest due to need real credentials (#14028) make AWSS3ObjectIntegrationTest manual * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * JAVA-20828: changes made for resolving botique module (#14027) * [JAVA-20626]Moved vertx-modules to jdk9-and-above profile + upgraded vertx version to 3.9.15 (#13960) * [JAVA-20633 Clean up modules (#14024) * add value of comparision * [BAEL-6339] custom iterator with testcases (#14038) Co-authored-by: Bhaskar * BAEL-6246 Fix AppControllerIntegrationTest (#14039) Co-authored-by: thibault.faure * JAVA-20946 Renamed HttpBinServiceUnitTest to LiveTest (#14041) - Since it is making actual live request to httpbin.org * JAVA-21186 Fix references to parents - Week 21 - 2023 (#14036) * JAVA-20630 move the jws module to *-jdk9-and-above profiles (#14030) * JAVA-20631 move Jetbrains module to *-jdk9-and-above profiles (#14029) * JAVA-20631 move Jetbrains module to *-jdk9-and-above profiles * JAVA-20631 fix parent modules so that the project parent (pom.xml) can be built without error * BAEL-5711: Securing Spring Boot API with API key and secret (#14015) * #bael-5711: add source * #bael-5711: remove extra space * #bael-5711: remove extra space * #bael-5711: remove extra space --------- Co-authored-by: h_sharifi * BAEL-6334 Improve test names and typos * BAEL-6179: Add Actuator sample without Spring Boot (#14032) * BAEL-6179: Add Actuator sample without Spring Boot * BAEL-6179: Simplify custom health indicator * [JAVA-20624] Moved static-analysis module to jdk9-and-above-profile (#14026) * change return type to optional * Title: Array vs List Performance in Java (#14034) This commit related to the article entitled "Array vs List Performance in Java". * BAEL-6428 Make a Method Execute Only Once in Java * 20616 (#14023) * [JAVA-20616] Upgraded spring-spel module to jdk9-and-above profile * [JAVA-20616] Upgraded spring-websockets module to jdk9-and-above profile * [JAVA-20616] Upgraded spring-shell module to jdk9-and-above profile --------- Co-authored-by: Dhawal Kapil * JAVA-21106: Adding javax-servlets module to jdk9 and above (#13974) * JAVA-21106: Adding javax-servlets module to jdk9 and above * JAVA-21106: Changes made for adding the method for runt he application * JAVA-21106: Changes made for adding javax-servlets-2 modules to jdk-9 and above * JAVA-21106: Changes made for adding linkrest modules to jdk-9 and above * JAVA-21106 : Changes made for adding jee-7 and ninija in default-jdk9-and-above profile * JAVA-21106 : Changes made for adding resteasy,spark-java,struts-3,vraptor,wicket in default-jdk9-and-above profile * JAVA-21106 : Changes made for removing ninja module * JAVA-21106 : Changes made for removing ninja module fro jdk-9 and above * JAVA-21106: Changes made for cleaninhg pom.xml * JAVA-21106: FIXING MAVEN VERISON FOR WICKET * Java 20277 (#14046) * JAVA-20277 GitHub Issue: Regarding article Introduction to JsonPath * JAVA-20277 Code Review Changes * JAVA-20167 Upgrade spring-data hibernate with external libraries specific modules to JDK 11 (#14022) Co-authored-by: timis1 * JAVA-20166 Migrating spring-date-eclipselink (#13959) * JAVA-20166 Migrating spring-date-eclipselink * JAVA-20166 Fix failed tests address already bind * JAVA-20166 Migrating spring-date-couchbase-2 * JAVA-20166 Replace with optional instead of returning null --------- Co-authored-by: timis1 * JAVA-20164 Upgrade java hibernate specific modules to JDK 11 (#13900) * JAVA-20164 Upgrade java hibernate specific modules to JDK 11 * JAVA-20164 Migrating java-jpa-2 * JAVA-20164 Migrating jnosql-artemis * JAVA-20164 Migrating querydsl * JAVA-20164 Migrating r2dbc * JAVA-20164 Migrating redis * JAVA-20164 Fixing test JPATextUnitTest#givenExam_whenSaveExam_thenReturnExpectedExam * JAVA-20164 Fixing givenIdentityStrategy_whenCommitTransction_thenReturnPrimaryKey * JAVA-20164 Changes after review * JAVA-20164 Migrating java-cassandra to jdk8 * JAVA-20164 Fix legacy mode error * Update pom.xml --------- Co-authored-by: timis1 Co-authored-by: Dhawal Kapil * BAEL-5905 move article * BAEL-5947: Moving a project to a different package (#14054) * Revert "feat: BAEL-5947 External Debugging with JMXTerm (#13847)" This reverts commit ae04ab2510a5eb2e7b8c57e14474c6edadeb6883. * BAEL-5947: Moving a project to a different package * BAEL-4615: Create and Detect Memory Leak in Java (#14060) * BAEL-6086: Customize WebFlux Exceptions in Spring Boot 3 (#13948) * BAEL-6086: Added code for webflux default and custom exception along with Unit Tests * BAEL-6086: added missing import * BAEL-6086: reformatting * BAEL-6086: reformatted code --------- Co-authored-by: balasr3 * BAEL-5575 (#14016) * BAEL-5575 First commit of the example for the article: https://drafts.baeldung.com/wp-admin/post.php?post=153774&action=edit * BAEL-5575 Adjusted pom.xml * BAEL-5575 Formatted source code * BAEL-5575 Removed unused import * BAEL-5575 Renamed UT to follow: https://docs.google.com/document/d/1iIeSPuYFG-jEtB8UbcxQnn2AI3OR2LWlnisNo2NUCL8/edit * BAEL-5575 Modified pom.xml to define versions in properties as stated in: https://docs.google.com/document/d/1iIeSPuYFG-jEtB8UbcxQnn2AI3OR2LWlnisNo2NUCL8/edit * BAEL-5575 Changes checking the commands: * mvn clean install * mvn clean install -Dgib.enabled=false * BAEL-5575 Set GB as the base language * BAEL-6094 (#14043) * Inital Commit for BAEL-6094 * Added the test * Updated the test * Convert Hashmap to JSON object in Java (#14070) * Convert Hashmap to JSON object in Java This commit is related to the article entitled "Convert Hashmap to JSON object in Java" * Convert Hashmap to JSON object in Java This commit is for the article "Convert Hashmap to JSON object in Java" * Array vs List Performance in Java (#14078) This commit is related to the article entitled "Array vs List Performance in Java" * Bael-6331: Adding changes for creating and checking empty streams (#14047) * BAEL-6331: Create EmptyStreams.java * BAEL-6331: Create EmptyStreamsUnitTest.java * JAVA-20163 Fix failed integration test with date creation comparison (#14080) Co-authored-by: timis1 * JAVA-21440: Changes made for upgrade jooby module to 2.16.1 to make j… (#14064) * JAVA-21440: Chnages made for upgrade jooby module to 2.16.1 to make java-17 compatable * JAVA-21440: commenting redis code as this will only work in the local or infra should have a redis setup * JAVA-21440 Minor cleanup (#14084) * Delete README.md * removed optional specific function * changing unit test class name * BAEL-6250: refactor: Move to spring-caching-2 since spring-caching is full * Update README.md * Update README.md * BAEL-6460: Why is Scanner skipping nextLine() after using other next functions? (#14079) * changing branch * BAEL-6334 Make object properties example clearer * [BAEL-6344] address PR comment * JAVA-21305 : Changes made for adding ratpack module to jdk9-and above… (#14012) * JAVA-21106 : Changes made for adding ratpack module to jdk9-and above module * JAVA-21106 : Changes made for adding java-lite module to jdk9-and above module * JAVA-21305: Changes made for cleaninhg pom.xml * JAVA-21305: Changes made for cleaning pom.xml * BOSS-21305: changes made for adding ninja in jdk9 above modeule * JAVA-21305: Changes made as per review comments * JAVA-21305: Changes made as per review comments * JAVA-21305: Changes made as per review comments * [JAVA-21134] (#14045) * [JAVA-21134] Removed external repository from jgit module * [JAVA-21134] Removed external repository from aws-miscellaneous module + upgraded dynamodblocal version * [JAVA-21134] Removed external repository from apache-tapestry module * TASK-20628 (#14074) * [TASK-20628] Moved xml module to jdk9-and-above profile * [TASK-20628] Moved xml-2 module to jdk9-and-above profile * [JAVA-15027]Upgraded follow redirects for apache http client + moved … (#14092) * [JAVA-15027]Upgraded follow redirects for apache http client + moved older version to apache-httpclient4 module * [JAVA-15027] Added test case * BAEL-6508 Code for the Solving Gson Parsing Errors article * JAVA-21189: Formatting pom.xml modules starting from KLM (#14096) * JAVA-21189: Formatting pom.xml modules starting from NOPQR (#14097) * JAVA-21189: Formatting pom.xml modules starting from NOPQR (#14097) * java-20079: upgrade apache-spark module libraries (#14087) * [scanner-with-spaces] how to take input as String with spaces in Java… (#14044) * [scanner-with-spaces] how to take input as String with spaces in Java using Scanner?y * [scanner-with-spaces] fix typo * [output-to-file] Write Console Output to Text File in Java (#14082) * [output-to-file] Write Console Output to Text File in Java * [output-to-file] rebase on the master * Convert Hashmap to JSON object in Java (#14110) This commit is for Convert Hashmap to JSON object in Java * Generating Javadoc with Gradle (#14091) * Generating Javadoc with Gradle * Generating Javadoc with Gradle * Generating Javadoc with Gradle * BAEL-6179: Fix readme (#14088) * BAEL-6179: Add Actuator sample without Spring Boot * BAEL-6179: Simplify custom health indicator * BAEL-6179: Fix description in README.md * JAVA-21189: changes made for formatting modules starting from S (#14106) * JAVA-21189: changes made for formatting modules starting from TVWX (#14107) * JAVA_21305: Changes made for fix the Integration test faliures (#14113) * JAVA-20164 Fix .._SEQ.NEXTVAL error (#14109) Co-authored-by: timis1 * JAVA-15022 (#14099) * [JAVA-15022] Moved 4.5 version code to apache-httpclient4 module * [JAVA-15022] Upgraded code to 5.x version * Array vs List Performance in Java (#14114) This commit is related to the article entitled "Array vs List Performance in Java" * BAEL-6461: What's the difference between Scanner next() and nextLine() methods? (#14057) * JAVA-19670: changes made for upgrading jenkins module to jdk-9 above (#14105) * JAVA-19670: changes made for upgrading jenkins module to jdk-9 above * JAVA-19670: Changes made for adding jenkins-modules in jdk-9 and above profile * JAVA_21106: Changes made for fixing test cases for jee-7 (#14115) * Bael 5711: Securing Spring Boot API with API key and secret (#14102) * #bael-5711: add source * #bael-5711: remove extra space * #bael-5711: remove extra space * #bael-5711: remove extra space * #bael-5711: add custom message * #bael-5711: refactor return null --------- Co-authored-by: h_sharifi --------- Co-authored-by: Loredana Crusoveanu Co-authored-by: 3hsan <56245694+ehsansasanian@users.noreply.github.com> Co-authored-by: edizor <113095366+edizor@users.noreply.github.com> Co-authored-by: Vini <34344290+vinipx@users.noreply.github.com> Co-authored-by: Dhawal Kapil Co-authored-by: jsgrah-spring Co-authored-by: jogra Co-authored-by: Azhwani <13301425+azhwani@users.noreply.github.com> Co-authored-by: Kai Yuan Co-authored-by: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Co-authored-by: Michael Olayemi Co-authored-by: mariudotsh <33603097+mariudotsh@users.noreply.github.com> Co-authored-by: Mariusz Kaczmarczyk Co-authored-by: anuragkumawat Co-authored-by: Bipin kumar Co-authored-by: Shaun Phillips <61982125+ShaPhi7@users.noreply.github.com> Co-authored-by: Alejamdro Co-authored-by: Daniel Strmecki Co-authored-by: Arya <108480101+Dazzle-10@users.noreply.github.com> Co-authored-by: Ana Peterlić Co-authored-by: Zahid Khan <63726443+zahikhan@users.noreply.github.com> Co-authored-by: emanuel.trandafir Co-authored-by: Kasra Madadipouya Co-authored-by: uzma Co-authored-by: thibault.faure Co-authored-by: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Co-authored-by: Avin Buricha Co-authored-by: Ulisses Lima Co-authored-by: Bhaskar Ghosh Dastidar Co-authored-by: Bhaskar Co-authored-by: Zahid Khan Co-authored-by: Raj Kishor <30443297+rajkishorraj@users.noreply.github.com> Co-authored-by: raj kishor Co-authored-by: Gaetano Piazzolla Co-authored-by: Eugene Kovko <37694937+eukovko@users.noreply.github.com> Co-authored-by: Bahaa El-Din Helmy Co-authored-by: davidmartinezbarua Co-authored-by: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Co-authored-by: Grzegorz Musiał Co-authored-by: Kilian Schneider <48420258+Basler182@users.noreply.github.com> Co-authored-by: cesarevalenti90 <50798547+cesarevalenti90@users.noreply.github.com> Co-authored-by: Cesare Co-authored-by: brokenhardisk Co-authored-by: Sam Gardner Co-authored-by: timis1 <12120641+timis1@users.noreply.github.com> Co-authored-by: n Co-authored-by: Dmytro Budym <46810751+dbudim@users.noreply.github.com> Co-authored-by: Vartika Nigam <63852792+vnigam2702@users.noreply.github.com> Co-authored-by: Vartika_Nigam Co-authored-by: emanueltrandafir1993 Co-authored-by: Ehsan Sasanianno Co-authored-by: Dileesha Rajapakse Co-authored-by: Maciej Główka Co-authored-by: thibaultfaure Co-authored-by: Saikat Chakraborty <40471715+saikatcse03@users.noreply.github.com> Co-authored-by: Andrew Tarry Co-authored-by: Hamid Reza Sharifi Co-authored-by: h_sharifi Co-authored-by: Ralf Ueberfuhr <40685729+ueberfuhr@users.noreply.github.com> Co-authored-by: Deboshree Co-authored-by: AndiCover Co-authored-by: Balamurugan Co-authored-by: balasr3 Co-authored-by: victorsempere Co-authored-by: Muhammad Asif Co-authored-by: vaibhav007jain <72961247+vaibhav007jain@users.noreply.github.com> Co-authored-by: Andrew Tarry Co-authored-by: ciphx * [BAEL-5934] add code examples for article Listing All AWS S3 Objects in a Bucket Using Java * merge source to fork master (#7) * JAVA-20280: remove wrong property (#13874) * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md * Update README.md [skip ci] * JAVA-13721 Format, Fix Package, Upgrade version of all the articles * JAVA-13721 Moved mockito-simple to JDK9+ profiles * JAVA-20278. Please point me to the tutorial code #13768. (#13923) Co-authored-by: jogra * BAEL-6352: Check if the First Letter of a String is a Number (#13883) * [BAEL-6434_charAndString] Difference Between "char" and "String" (#13907) * [JAVA-18185] Upgrade groovy version (#13926) * Update code for Overview of NLP Libraries in Java (#13912) * Update code for Overview of NLP Libraries in Java * Update code for Overview of NLP Libraries in Java * Update code for Overview of NLP Libraries in Java * BAEL-6319 Hibernate 6 Boolean Converters (#13894) Co-authored-by: Mariusz Kaczmarczyk * BAEL-6194 Retrieve the Value of an HTML Input Using Selenium WebDriver in Java (#13898) * Retrieve the Value of an HTML Input Using Selenium WebDriver in Java * Retrieve the Value of an HTML Input Using Selenium WebDriver in Java * Retrieve the Value of an HTML Input Using Selenium WebDriver in Java * JAVA-20898 Check Article Code Matches GitHub * Java 15032 (#13913) * JAVA-15032: Changes made for adding the test cases custom userAgent in request header * JAVA-15032: Changes made for adding the test cases custom userAgent in request header * JAVA-15032: Changes made for incorporarting review comments * JAVA-20931 Commented out spring-boot-3 for now because of JDK 19 requirement (#13936) * BAEL-6325 Create core-java-lang-oop-constructors-2 (#13933) * BAEL-5915 Added different ways to create an object * BAEL-6325 Create core-java-lang-oop-constructors-2 * BAEL-6435: Reverse a String in Java 8 using Lambda and Streams (#13910) * [JAVA-20456] Upgraded jackson version (#13871) * [JAVA-20457] Upgraded springdoc version (#13872) * [JAVA-20459] Upgraded org.json to latest version (#13869) * BAEL-6327 - Find the index of an element in a Java array (#13844) * JAVA-20898 Move article url from javaxval-2 to javaxval * Java 20643 (#13914) * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: changes made for removing web-modules from default * [BAEL-6436_printQuotesAroundString] Print "" Quotes Around a String in Java (#13925) * JAVA-18113 Update spring-boot-swagger-keycloak module (#13506) * JAVA-18113 Update spring-boot-swagger-keycloak module * JAVA-16612: Mock Final Classes and Methods with Mockito article; MockMaker improvement (#13890) * BAEL-6254: Scoped values (#13756) * Added the code for "The difference between BufferedReader and FileReader". (#13942) * BAEL-5814 - Is CompletableFuture Non-blocking (#13917) * BAEL-5814 - Is CompletableFuture Non-blocking * Fix the formatting * BAEL-6326: Spring Boot H2 JdbcSQLSyntaxErrorException expected identifier (#13843) * BAEL-6320: added code support for the @NaturalId article * JAVA-16946: comment spring-jooq module from persistence-modules. (#13951) * JAVA-20555 use Java Base64 instead of deprecated Spring Base64Utils (#13941) * [BAEL-6105] code for list to page article * Update README.md [skip ci] * Update README.md [skip ci] * [BAEL-6105] code for list to page article * [BAEL-6105] refactor test names * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * BAEL-6438 Code for the Find the longest word in a given string article * BAEL-6332: Calling Non-Static Method In Static Method In Java (#13940) * [BAEL-6485_RM-Punctuation] Remove Punctuation (#13946) * BAEL-6410 (#13919) * BAEL-6410 | Article code * Adding consumer code for article * BAEL-6046 MongoDB - Field Level Encryption (#13859) * [BAEL-6253] record equals hashcode (#13958) * [BAEL-6253] records equals and hashcode * [BAEL-6253] records equals and hashcode * [BAEL-6253] records equals and hashcode test case --------- Co-authored-by: Bhaskar * [compByteArrays] Comparing Two Byte Arrays in Java (#13935) * Remove Comments and update prefix. * Uploading File using Selenium WebDriver in Java (#13947) * Uploading File using Selenium WebDriver in Java * Uploading File using Selenium WebDriver in Java * Uploading File using Selenium WebDriver in Java * Uploading File using Selenium WebDriver in Java * [rajkishorraj185@gmail.com] Lombok equalsandhashcode annotation (#13717) * example code for equalsandhashcode annotation * moving codes to lombok-2 --------- Co-authored-by: raj kishor * Match prefix same as draft. * JAVA-19152: fix intermittently failing RequestProcessorUnitTest (#13957) * [JAVA-19362] Upgraded itextpdf to 5.5.13.3 (#13961) * JAVA-16946: disable unit test for core-java-lang-oop-modifiers module for maintenance (#13968) * BAEL-6444 | Added P6Spy logging in spring boot observation module. (#13965) * BAEL-6444 | Added P6Spy logging in spring boot observation module. * BAEL-6444 | Added Find with name query and custom log format now working * BAEL-6444 | Formatting * BAEL-6444 | Renaming junit files * BAEL-6444 | Added start class * BAEL-6444 | Actualized code with Article * BAEL-6444 | Actualized code with Article * BAEL-6444 | redded commit() * BAEL-6444 | BDD naming strategy * BAEL-6501 Update article "The producer-consumer problem example in Java" (#13973) * BAEL-6501 Changed the synchronization block to use the DataQueue * BAEL-6501 Fixed the platform agnostic new lines * BAEL-6501 Moved ID increment to a static method * BAEL-6501 Added a logger * Add files via upload (#13978) * JAVA-19152 Increased the awaitility timeout for one more poll delay (#13975) * BAEL-6250: Example code for Get All Caffeine Cache Keys article (#13806) * BAEL-6185 reuse string builder performance (#13791) * BAEL-6444 | Removed copyright commit (#13987) * JAVA-18648 Review the time of the build - Week 9 - 2023 (#13954) * JAVA-20277 GitHub Issue: Regarding article Introduction to JsonPath (#13939) * BAEL-6197 - Execute Tests Based on Active Profile with JUnit 5 (#13776) * BAEL-6255 - Run a Spring Boot application in AWS Lambda * BAEL-6255 - Run a Spring Boot application in AWS Lambda * fix on template.yaml * fix on template.yaml * removed log from test * resolved issues reported on PR * BAEL-6277 - A Guide To Spring Cloud Azure First commit * BAEL-6277 - A Guide To Spring Cloud Azure Added to README.md the steps to create the secrets * BAEL-6277 - A Guide To Spring Cloud Azure Added the integration Azure Key Vault Properties * BAEL-6277 - A Guide To Spring Cloud Azure Added the integration Azure Key Vault Properties * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault Added one level package keyvault * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault removed target release version * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault fix compilation of NoSuchElementException * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault fix pom.xml * Revert "BAEL-6277 - A Guide To Spring Cloud Azure Key Vault" This reverts commit 1cca1d0d692646001a6d7de106f3a37fb22839ce. * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault fix pom.xml * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault downgrade version to fix jenkins pipeline error * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault comment run on main class * Revert "reset last commit" This reverts commit c557fad67f1c15bb384f0af5781430a45121a838. * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #First push * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault Revert for new pr * reset last commit * reset last commit * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #Remove redundant test * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #Format fix * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #fix from review * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #fix from review * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #fix test name --------- Co-authored-by: Cesare * [scanner-to-array] Saving Java Scanner Input to an Array (#13969) * BAEL-6342 JUnit Test Class for Null and Empty String (#13963) * JAVA-20630 upgrade maven war plugin to be compatible with JDK 11 and 17 (#13945) * JAVA-20630 upgrade maven war plugin to be compatible with JDK 11 and 17 * JAVA-20630 code format * JAVA-20630 don't fail if there's no web.xml and using Java based configuration while building a war file * JAVA-20630 avoid unneeded formatting * JAVA-20630 change order of modules to solve flaky tests * fix module order * add dependent module * add parent * JAVA-20828 Fixing the core-java-exclusions module (#13997) * Upgrade spring.vault.core from 2.3.2 to 3.0.2 (#13977) * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Create README.md [skip ci] * Update README.md [skip ci] * Title: Regular Expression: \z vs \Z Anchors in Java (#13994) Hello, This commit related to the article entitled "Regular Expression: \z vs \Z Anchors in Java" * JAVA-20828: Changes made for updating blade module to java 11 (#13929) * JAVA-20828: Changes made for updating blade module to java 11 * JAVA-20828: Changes made for updating bootique,dropwizard,google-web-toolkit module to java 11 * JAVA-20828: Changes made for updating bootique,dropwizard,google-web-toolkit module to java 11 * JAVA-20828: Adding jakarta-ee to jdk-9 profile * BAEL-6334 Add example code for checking if a list element is in another list * JAVA-20610 Upgraded parent-boot-2 to 2.7.11 (#13944) * JAVA-20163 Upgrade hibernate specific modules to JDK 11 (#13817) * JAVA-20163 Migration hibernate-annotations * JAVA-20163 Migrate hibernate-queries * JAVA-20163 Migrating hibernate-mapping * JAVA-20163 rename reserved keywords, update inheritance example * JAVA-20163 Migrate hibernate-ogm module to the jdk 8 because hibernate-ogm doesn't support jakarta API * JAVA-20163 Migrate hibernate-enterprise module * JAVA-20163 Add update to HibernateExceptionUnitTest#whenQueryExecutedWithUnmappedEntity_thenMappingException * JAVA-20163 Set explicit version for hibernate 6.1.7.Final in the hibernate-queries module * JAVA-20163 Fix failed test with port that already exists (giving another port 8088) * JAVA-20163 Fix other location after changing the port * JAVA-20163 Remove duplicate Unit Test --------- Co-authored-by: n Co-authored-by: Loredana Crusoveanu * JAVA-20165 Upgrade spring-boot hibernate specific modules to JDK 11 (#13952) * JAVA-20165 Upgrade spring-boot hibernate specific modules to JDK 11 * JAVA-20165 Migrating spring-boot-persistence-mongodb * JAVA-20165 Migrating spring-boot-persistence-mongodb-2 * JAVA-20165 Migrating spring-boot-persistence-mongodb-3 * JAVA-20165 Adding latest version for jdbi in spring-boot-persistence-2 module --------- Co-authored-by: timis1 * [Check If a Specified Key Exists in a Given S3 Bucket using Java] added code examples (#13775) * [Check If a Specified Key Exists in a Given S3 Bucket using Java]] added code examples for change test name remove link from README.md * - used env variables for AWS credentials - used codestyle profile of baledung * [os-to-is] Convert an OutputStream to an InputStream (#13992) * BAEL-6264 added class to show how to instantiate ArrayBlockingQueue a… (#13851) * BAEL-6264 added class to show how to instantiate ArrayBlockingQueue and LinkedBlockingQueue * BAEL-6264 added unit test case * modified test case * BAEL-6264 deleted BlockingQueueImplExample file not needed anymore * BAEL-6264 code review changes moved class file to different module --------- Co-authored-by: Vartika_Nigam * Add code examples for "Opening a New Tab Using Selenium WebDriver in Java" (#14001) Add code examples for "Opening a New Tab Using Selenium WebDriver in Java" * BAEL-6320: format & code review * JAVA-16946 Upgrade h2 database version for remaining modules (#13976) * Add java interface single implementation examples (#13972) * Fix formatting issues, refactor the `profiles` word in the properties. * Add files via upload (#14006) * JAVA-20828 Fixed module name (#14018) * fix SeleniumOpenNewTabLiveTest (#14019) * BAEL-6493 - Read last N messages from a Kafka Topic (#14020) * BAEL-6398: Java PrintStream to String (#13998) * Revert "JAVA-20280: remove wrong property (#13874)" (#14021) This reverts commit 561e893e86d9c51b1e61818f5450d6194d9959fd. * Hashing with Argon2 in Java (#14009) * Hashing with Argon2 in Java * Hashing with Argon2 in Java * JAVA-13721 Fixing the formatting * JAVA-13721 Further formatting of files * BAEL-4369: Multiple ways of declaring dependency versions in Gradle (#13825) * BAEL-6246 Code for the article Send MultipartFile Request with RestAs… (#13803) * BAEL-6246 Code for the article Send MultipartFile Request with RestAssured * Fix code style in rest assured integration tests --------- Co-authored-by: thibault.faure * Bael 4582: Custom Authentication using shared secret (#13801) * Spring custom security filter add * Integration Tests add * Add Project into parent pom * refactor code * refactor code * remove .env and refactor code * refactor code * exclude auto configuration * Refactored code * removed ssl certificate for security * Set session management to statelees * Refactor tests * Refactor authentication logic * Refactor authentication logic * Refactor authentication logic * Remove unused code * Remove unused code * Remove unused appconfig * disable AWSS3ObjectIntegrationTest due to need real credentials (#14028) make AWSS3ObjectIntegrationTest manual * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * JAVA-20828: changes made for resolving botique module (#14027) * [JAVA-20626]Moved vertx-modules to jdk9-and-above profile + upgraded vertx version to 3.9.15 (#13960) * [JAVA-20633 Clean up modules (#14024) * add value of comparision * [BAEL-6339] custom iterator with testcases (#14038) Co-authored-by: Bhaskar * BAEL-6246 Fix AppControllerIntegrationTest (#14039) Co-authored-by: thibault.faure * JAVA-20946 Renamed HttpBinServiceUnitTest to LiveTest (#14041) - Since it is making actual live request to httpbin.org * JAVA-21186 Fix references to parents - Week 21 - 2023 (#14036) * JAVA-20630 move the jws module to *-jdk9-and-above profiles (#14030) * JAVA-20631 move Jetbrains module to *-jdk9-and-above profiles (#14029) * JAVA-20631 move Jetbrains module to *-jdk9-and-above profiles * JAVA-20631 fix parent modules so that the project parent (pom.xml) can be built without error * BAEL-5711: Securing Spring Boot API with API key and secret (#14015) * #bael-5711: add source * #bael-5711: remove extra space * #bael-5711: remove extra space * #bael-5711: remove extra space --------- Co-authored-by: h_sharifi * BAEL-6334 Improve test names and typos * BAEL-6179: Add Actuator sample without Spring Boot (#14032) * BAEL-6179: Add Actuator sample without Spring Boot * BAEL-6179: Simplify custom health indicator * [JAVA-20624] Moved static-analysis module to jdk9-and-above-profile (#14026) * change return type to optional * Title: Array vs List Performance in Java (#14034) This commit related to the article entitled "Array vs List Performance in Java". * BAEL-6428 Make a Method Execute Only Once in Java * 20616 (#14023) * [JAVA-20616] Upgraded spring-spel module to jdk9-and-above profile * [JAVA-20616] Upgraded spring-websockets module to jdk9-and-above profile * [JAVA-20616] Upgraded spring-shell module to jdk9-and-above profile --------- Co-authored-by: Dhawal Kapil * JAVA-21106: Adding javax-servlets module to jdk9 and above (#13974) * JAVA-21106: Adding javax-servlets module to jdk9 and above * JAVA-21106: Changes made for adding the method for runt he application * JAVA-21106: Changes made for adding javax-servlets-2 modules to jdk-9 and above * JAVA-21106: Changes made for adding linkrest modules to jdk-9 and above * JAVA-21106 : Changes made for adding jee-7 and ninija in default-jdk9-and-above profile * JAVA-21106 : Changes made for adding resteasy,spark-java,struts-3,vraptor,wicket in default-jdk9-and-above profile * JAVA-21106 : Changes made for removing ninja module * JAVA-21106 : Changes made for removing ninja module fro jdk-9 and above * JAVA-21106: Changes made for cleaninhg pom.xml * JAVA-21106: FIXING MAVEN VERISON FOR WICKET * Java 20277 (#14046) * JAVA-20277 GitHub Issue: Regarding article Introduction to JsonPath * JAVA-20277 Code Review Changes * JAVA-20167 Upgrade spring-data hibernate with external libraries specific modules to JDK 11 (#14022) Co-authored-by: timis1 * JAVA-20166 Migrating spring-date-eclipselink (#13959) * JAVA-20166 Migrating spring-date-eclipselink * JAVA-20166 Fix failed tests address already bind * JAVA-20166 Migrating spring-date-couchbase-2 * JAVA-20166 Replace with optional instead of returning null --------- Co-authored-by: timis1 * JAVA-20164 Upgrade java hibernate specific modules to JDK 11 (#13900) * JAVA-20164 Upgrade java hibernate specific modules to JDK 11 * JAVA-20164 Migrating java-jpa-2 * JAVA-20164 Migrating jnosql-artemis * JAVA-20164 Migrating querydsl * JAVA-20164 Migrating r2dbc * JAVA-20164 Migrating redis * JAVA-20164 Fixing test JPATextUnitTest#givenExam_whenSaveExam_thenReturnExpectedExam * JAVA-20164 Fixing givenIdentityStrategy_whenCommitTransction_thenReturnPrimaryKey * JAVA-20164 Changes after review * JAVA-20164 Migrating java-cassandra to jdk8 * JAVA-20164 Fix legacy mode error * Update pom.xml --------- Co-authored-by: timis1 Co-authored-by: Dhawal Kapil * BAEL-5905 move article * BAEL-5947: Moving a project to a different package (#14054) * Revert "feat: BAEL-5947 External Debugging with JMXTerm (#13847)" This reverts commit ae04ab2510a5eb2e7b8c57e14474c6edadeb6883. * BAEL-5947: Moving a project to a different package * BAEL-4615: Create and Detect Memory Leak in Java (#14060) * BAEL-6086: Customize WebFlux Exceptions in Spring Boot 3 (#13948) * BAEL-6086: Added code for webflux default and custom exception along with Unit Tests * BAEL-6086: added missing import * BAEL-6086: reformatting * BAEL-6086: reformatted code --------- Co-authored-by: balasr3 * BAEL-5575 (#14016) * BAEL-5575 First commit of the example for the article: https://drafts.baeldung.com/wp-admin/post.php?post=153774&action=edit * BAEL-5575 Adjusted pom.xml * BAEL-5575 Formatted source code * BAEL-5575 Removed unused import * BAEL-5575 Renamed UT to follow: https://docs.google.com/document/d/1iIeSPuYFG-jEtB8UbcxQnn2AI3OR2LWlnisNo2NUCL8/edit * BAEL-5575 Modified pom.xml to define versions in properties as stated in: https://docs.google.com/document/d/1iIeSPuYFG-jEtB8UbcxQnn2AI3OR2LWlnisNo2NUCL8/edit * BAEL-5575 Changes checking the commands: * mvn clean install * mvn clean install -Dgib.enabled=false * BAEL-5575 Set GB as the base language * BAEL-6094 (#14043) * Inital Commit for BAEL-6094 * Added the test * Updated the test * Convert Hashmap to JSON object in Java (#14070) * Convert Hashmap to JSON object in Java This commit is related to the article entitled "Convert Hashmap to JSON object in Java" * Convert Hashmap to JSON object in Java This commit is for the article "Convert Hashmap to JSON object in Java" * Array vs List Performance in Java (#14078) This commit is related to the article entitled "Array vs List Performance in Java" * Bael-6331: Adding changes for creating and checking empty streams (#14047) * BAEL-6331: Create EmptyStreams.java * BAEL-6331: Create EmptyStreamsUnitTest.java * JAVA-20163 Fix failed integration test with date creation comparison (#14080) Co-authored-by: timis1 * JAVA-21440: Changes made for upgrade jooby module to 2.16.1 to make j… (#14064) * JAVA-21440: Chnages made for upgrade jooby module to 2.16.1 to make java-17 compatable * JAVA-21440: commenting redis code as this will only work in the local or infra should have a redis setup * JAVA-21440 Minor cleanup (#14084) * Delete README.md * removed optional specific function * changing unit test class name * BAEL-6250: refactor: Move to spring-caching-2 since spring-caching is full * Update README.md * Update README.md * BAEL-6460: Why is Scanner skipping nextLine() after using other next functions? (#14079) * changing branch * BAEL-6334 Make object properties example clearer * [BAEL-6344] address PR comment * JAVA-21305 : Changes made for adding ratpack module to jdk9-and above… (#14012) * JAVA-21106 : Changes made for adding ratpack module to jdk9-and above module * JAVA-21106 : Changes made for adding java-lite module to jdk9-and above module * JAVA-21305: Changes made for cleaninhg pom.xml * JAVA-21305: Changes made for cleaning pom.xml * BOSS-21305: changes made for adding ninja in jdk9 above modeule * JAVA-21305: Changes made as per review comments * JAVA-21305: Changes made as per review comments * JAVA-21305: Changes made as per review comments * [JAVA-21134] (#14045) * [JAVA-21134] Removed external repository from jgit module * [JAVA-21134] Removed external repository from aws-miscellaneous module + upgraded dynamodblocal version * [JAVA-21134] Removed external repository from apache-tapestry module * TASK-20628 (#14074) * [TASK-20628] Moved xml module to jdk9-and-above profile * [TASK-20628] Moved xml-2 module to jdk9-and-above profile * [JAVA-15027]Upgraded follow redirects for apache http client + moved … (#14092) * [JAVA-15027]Upgraded follow redirects for apache http client + moved older version to apache-httpclient4 module * [JAVA-15027] Added test case * BAEL-6508 Code for the Solving Gson Parsing Errors article * JAVA-21189: Formatting pom.xml modules starting from KLM (#14096) * JAVA-21189: Formatting pom.xml modules starting from NOPQR (#14097) * JAVA-21189: Formatting pom.xml modules starting from NOPQR (#14097) * java-20079: upgrade apache-spark module libraries (#14087) * [scanner-with-spaces] how to take input as String with spaces in Java… (#14044) * [scanner-with-spaces] how to take input as String with spaces in Java using Scanner?y * [scanner-with-spaces] fix typo * [output-to-file] Write Console Output to Text File in Java (#14082) * [output-to-file] Write Console Output to Text File in Java * [output-to-file] rebase on the master * Convert Hashmap to JSON object in Java (#14110) This commit is for Convert Hashmap to JSON object in Java * Generating Javadoc with Gradle (#14091) * Generating Javadoc with Gradle * Generating Javadoc with Gradle * Generating Javadoc with Gradle * BAEL-6179: Fix readme (#14088) * BAEL-6179: Add Actuator sample without Spring Boot * BAEL-6179: Simplify custom health indicator * BAEL-6179: Fix description in README.md * JAVA-21189: changes made for formatting modules starting from S (#14106) * JAVA-21189: changes made for formatting modules starting from TVWX (#14107) * JAVA_21305: Changes made for fix the Integration test faliures (#14113) * JAVA-20164 Fix .._SEQ.NEXTVAL error (#14109) Co-authored-by: timis1 * JAVA-15022 (#14099) * [JAVA-15022] Moved 4.5 version code to apache-httpclient4 module * [JAVA-15022] Upgraded code to 5.x version * Array vs List Performance in Java (#14114) This commit is related to the article entitled "Array vs List Performance in Java" * BAEL-6461: What's the difference between Scanner next() and nextLine() methods? (#14057) * JAVA-19670: changes made for upgrading jenkins module to jdk-9 above (#14105) * JAVA-19670: changes made for upgrading jenkins module to jdk-9 above * JAVA-19670: Changes made for adding jenkins-modules in jdk-9 and above profile * JAVA_21106: Changes made for fixing test cases for jee-7 (#14115) * Bael 5711: Securing Spring Boot API with API key and secret (#14102) * #bael-5711: add source * #bael-5711: remove extra space * #bael-5711: remove extra space * #bael-5711: remove extra space * #bael-5711: add custom message * #bael-5711: refactor return null --------- Co-authored-by: h_sharifi --------- Co-authored-by: Loredana Crusoveanu Co-authored-by: 3hsan <56245694+ehsansasanian@users.noreply.github.com> Co-authored-by: edizor <113095366+edizor@users.noreply.github.com> Co-authored-by: Vini <34344290+vinipx@users.noreply.github.com> Co-authored-by: Dhawal Kapil Co-authored-by: jsgrah-spring Co-authored-by: jogra Co-authored-by: Azhwani <13301425+azhwani@users.noreply.github.com> Co-authored-by: Kai Yuan Co-authored-by: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Co-authored-by: Michael Olayemi Co-authored-by: mariudotsh <33603097+mariudotsh@users.noreply.github.com> Co-authored-by: Mariusz Kaczmarczyk Co-authored-by: anuragkumawat Co-authored-by: Bipin kumar Co-authored-by: Shaun Phillips <61982125+ShaPhi7@users.noreply.github.com> Co-authored-by: Alejamdro Co-authored-by: Daniel Strmecki Co-authored-by: Arya <108480101+Dazzle-10@users.noreply.github.com> Co-authored-by: Ana Peterlić Co-authored-by: Zahid Khan <63726443+zahikhan@users.noreply.github.com> Co-authored-by: emanuel.trandafir Co-authored-by: Kasra Madadipouya Co-authored-by: uzma Co-authored-by: thibault.faure Co-authored-by: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Co-authored-by: Avin Buricha Co-authored-by: Ulisses Lima Co-authored-by: Bhaskar Ghosh Dastidar Co-authored-by: Bhaskar Co-authored-by: Zahid Khan Co-authored-by: Raj Kishor <30443297+rajkishorraj@users.noreply.github.com> Co-authored-by: raj kishor Co-authored-by: Gaetano Piazzolla Co-authored-by: Eugene Kovko <37694937+eukovko@users.noreply.github.com> Co-authored-by: Bahaa El-Din Helmy Co-authored-by: davidmartinezbarua Co-authored-by: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Co-authored-by: Grzegorz Musiał Co-authored-by: Kilian Schneider <48420258+Basler182@users.noreply.github.com> Co-authored-by: cesarevalenti90 <50798547+cesarevalenti90@users.noreply.github.com> Co-authored-by: Cesare Co-authored-by: brokenhardisk Co-authored-by: Sam Gardner Co-authored-by: timis1 <12120641+timis1@users.noreply.github.com> Co-authored-by: n Co-authored-by: Dmytro Budym <46810751+dbudim@users.noreply.github.com> Co-authored-by: Vartika Nigam <63852792+vnigam2702@users.noreply.github.com> Co-authored-by: Vartika_Nigam Co-authored-by: emanueltrandafir1993 Co-authored-by: Ehsan Sasanianno Co-authored-by: Dileesha Rajapakse Co-authored-by: Maciej Główka Co-authored-by: thibaultfaure Co-authored-by: Saikat Chakraborty <40471715+saikatcse03@users.noreply.github.com> Co-authored-by: Andrew Tarry Co-authored-by: Hamid Reza Sharifi Co-authored-by: h_sharifi Co-authored-by: Ralf Ueberfuhr <40685729+ueberfuhr@users.noreply.github.com> Co-authored-by: Deboshree Co-authored-by: AndiCover Co-authored-by: Balamurugan Co-authored-by: balasr3 Co-authored-by: victorsempere Co-authored-by: Muhammad Asif Co-authored-by: vaibhav007jain <72961247+vaibhav007jain@users.noreply.github.com> Co-authored-by: Andrew Tarry Co-authored-by: ciphx * Merge source to fork (#8) * JAVA-20280: remove wrong property (#13874) * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md * Update README.md [skip ci] * JAVA-13721 Format, Fix Package, Upgrade version of all the articles * JAVA-13721 Moved mockito-simple to JDK9+ profiles * JAVA-20278. Please point me to the tutorial code #13768. (#13923) Co-authored-by: jogra * BAEL-6352: Check if the First Letter of a String is a Number (#13883) * [BAEL-6434_charAndString] Difference Between "char" and "String" (#13907) * [JAVA-18185] Upgrade groovy version (#13926) * Update code for Overview of NLP Libraries in Java (#13912) * Update code for Overview of NLP Libraries in Java * Update code for Overview of NLP Libraries in Java * Update code for Overview of NLP Libraries in Java * BAEL-6319 Hibernate 6 Boolean Converters (#13894) Co-authored-by: Mariusz Kaczmarczyk * BAEL-6194 Retrieve the Value of an HTML Input Using Selenium WebDriver in Java (#13898) * Retrieve the Value of an HTML Input Using Selenium WebDriver in Java * Retrieve the Value of an HTML Input Using Selenium WebDriver in Java * Retrieve the Value of an HTML Input Using Selenium WebDriver in Java * JAVA-20898 Check Article Code Matches GitHub * Java 15032 (#13913) * JAVA-15032: Changes made for adding the test cases custom userAgent in request header * JAVA-15032: Changes made for adding the test cases custom userAgent in request header * JAVA-15032: Changes made for incorporarting review comments * JAVA-20931 Commented out spring-boot-3 for now because of JDK 19 requirement (#13936) * BAEL-6325 Create core-java-lang-oop-constructors-2 (#13933) * BAEL-5915 Added different ways to create an object * BAEL-6325 Create core-java-lang-oop-constructors-2 * BAEL-6435: Reverse a String in Java 8 using Lambda and Streams (#13910) * [JAVA-20456] Upgraded jackson version (#13871) * [JAVA-20457] Upgraded springdoc version (#13872) * [JAVA-20459] Upgraded org.json to latest version (#13869) * BAEL-6327 - Find the index of an element in a Java array (#13844) * JAVA-20898 Move article url from javaxval-2 to javaxval * Java 20643 (#13914) * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: Changes made for updating apache-tapestry module to java 11 * JAVA-20643: changes made for removing web-modules from default * [BAEL-6436_printQuotesAroundString] Print "" Quotes Around a String in Java (#13925) * JAVA-18113 Update spring-boot-swagger-keycloak module (#13506) * JAVA-18113 Update spring-boot-swagger-keycloak module * JAVA-16612: Mock Final Classes and Methods with Mockito article; MockMaker improvement (#13890) * BAEL-6254: Scoped values (#13756) * Added the code for "The difference between BufferedReader and FileReader". (#13942) * BAEL-5814 - Is CompletableFuture Non-blocking (#13917) * BAEL-5814 - Is CompletableFuture Non-blocking * Fix the formatting * BAEL-6326: Spring Boot H2 JdbcSQLSyntaxErrorException expected identifier (#13843) * BAEL-6320: added code support for the @NaturalId article * JAVA-16946: comment spring-jooq module from persistence-modules. (#13951) * JAVA-20555 use Java Base64 instead of deprecated Spring Base64Utils (#13941) * [BAEL-6105] code for list to page article * Update README.md [skip ci] * Update README.md [skip ci] * [BAEL-6105] code for list to page article * [BAEL-6105] refactor test names * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * BAEL-6438 Code for the Find the longest word in a given string article * BAEL-6332: Calling Non-Static Method In Static Method In Java (#13940) * [BAEL-6485_RM-Punctuation] Remove Punctuation (#13946) * BAEL-6410 (#13919) * BAEL-6410 | Article code * Adding consumer code for article * BAEL-6046 MongoDB - Field Level Encryption (#13859) * [BAEL-6253] record equals hashcode (#13958) * [BAEL-6253] records equals and hashcode * [BAEL-6253] records equals and hashcode * [BAEL-6253] records equals and hashcode test case --------- Co-authored-by: Bhaskar * [compByteArrays] Comparing Two Byte Arrays in Java (#13935) * Remove Comments and update prefix. * Uploading File using Selenium WebDriver in Java (#13947) * Uploading File using Selenium WebDriver in Java * Uploading File using Selenium WebDriver in Java * Uploading File using Selenium WebDriver in Java * Uploading File using Selenium WebDriver in Java * [rajkishorraj185@gmail.com] Lombok equalsandhashcode annotation (#13717) * example code for equalsandhashcode annotation * moving codes to lombok-2 --------- Co-authored-by: raj kishor * Match prefix same as draft. * JAVA-19152: fix intermittently failing RequestProcessorUnitTest (#13957) * [JAVA-19362] Upgraded itextpdf to 5.5.13.3 (#13961) * JAVA-16946: disable unit test for core-java-lang-oop-modifiers module for maintenance (#13968) * BAEL-6444 | Added P6Spy logging in spring boot observation module. (#13965) * BAEL-6444 | Added P6Spy logging in spring boot observation module. * BAEL-6444 | Added Find with name query and custom log format now working * BAEL-6444 | Formatting * BAEL-6444 | Renaming junit files * BAEL-6444 | Added start class * BAEL-6444 | Actualized code with Article * BAEL-6444 | Actualized code with Article * BAEL-6444 | redded commit() * BAEL-6444 | BDD naming strategy * BAEL-6501 Update article "The producer-consumer problem example in Java" (#13973) * BAEL-6501 Changed the synchronization block to use the DataQueue * BAEL-6501 Fixed the platform agnostic new lines * BAEL-6501 Moved ID increment to a static method * BAEL-6501 Added a logger * Add files via upload (#13978) * JAVA-19152 Increased the awaitility timeout for one more poll delay (#13975) * BAEL-6250: Example code for Get All Caffeine Cache Keys article (#13806) * BAEL-6185 reuse string builder performance (#13791) * BAEL-6444 | Removed copyright commit (#13987) * JAVA-18648 Review the time of the build - Week 9 - 2023 (#13954) * JAVA-20277 GitHub Issue: Regarding article Introduction to JsonPath (#13939) * BAEL-6197 - Execute Tests Based on Active Profile with JUnit 5 (#13776) * BAEL-6255 - Run a Spring Boot application in AWS Lambda * BAEL-6255 - Run a Spring Boot application in AWS Lambda * fix on template.yaml * fix on template.yaml * removed log from test * resolved issues reported on PR * BAEL-6277 - A Guide To Spring Cloud Azure First commit * BAEL-6277 - A Guide To Spring Cloud Azure Added to README.md the steps to create the secrets * BAEL-6277 - A Guide To Spring Cloud Azure Added the integration Azure Key Vault Properties * BAEL-6277 - A Guide To Spring Cloud Azure Added the integration Azure Key Vault Properties * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault Added one level package keyvault * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault removed target release version * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault fix compilation of NoSuchElementException * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault fix pom.xml * Revert "BAEL-6277 - A Guide To Spring Cloud Azure Key Vault" This reverts commit 1cca1d0d692646001a6d7de106f3a37fb22839ce. * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault fix pom.xml * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault downgrade version to fix jenkins pipeline error * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault comment run on main class * Revert "reset last commit" This reverts commit c557fad67f1c15bb384f0af5781430a45121a838. * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #First push * BAEL-6277 - A Guide To Spring Cloud Azure Key Vault Revert for new pr * reset last commit * reset last commit * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #Remove redundant test * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #Format fix * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #fix from review * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #fix from review * BAEL 6197 - Execute Tests Based on Active Profile with JUnit 5 #fix test name --------- Co-authored-by: Cesare * [scanner-to-array] Saving Java Scanner Input to an Array (#13969) * BAEL-6342 JUnit Test Class for Null and Empty String (#13963) * JAVA-20630 upgrade maven war plugin to be compatible with JDK 11 and 17 (#13945) * JAVA-20630 upgrade maven war plugin to be compatible with JDK 11 and 17 * JAVA-20630 code format * JAVA-20630 don't fail if there's no web.xml and using Java based configuration while building a war file * JAVA-20630 avoid unneeded formatting * JAVA-20630 change order of modules to solve flaky tests * fix module order * add dependent module * add parent * JAVA-20828 Fixing the core-java-exclusions module (#13997) * Upgrade spring.vault.core from 2.3.2 to 3.0.2 (#13977) * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Create README.md [skip ci] * Update README.md [skip ci] * Title: Regular Expression: \z vs \Z Anchors in Java (#13994) Hello, This commit related to the article entitled "Regular Expression: \z vs \Z Anchors in Java" * JAVA-20828: Changes made for updating blade module to java 11 (#13929) * JAVA-20828: Changes made for updating blade module to java 11 * JAVA-20828: Changes made for updating bootique,dropwizard,google-web-toolkit module to java 11 * JAVA-20828: Changes made for updating bootique,dropwizard,google-web-toolkit module to java 11 * JAVA-20828: Adding jakarta-ee to jdk-9 profile * BAEL-6334 Add example code for checking if a list element is in another list * JAVA-20610 Upgraded parent-boot-2 to 2.7.11 (#13944) * JAVA-20163 Upgrade hibernate specific modules to JDK 11 (#13817) * JAVA-20163 Migration hibernate-annotations * JAVA-20163 Migrate hibernate-queries * JAVA-20163 Migrating hibernate-mapping * JAVA-20163 rename reserved keywords, update inheritance example * JAVA-20163 Migrate hibernate-ogm module to the jdk 8 because hibernate-ogm doesn't support jakarta API * JAVA-20163 Migrate hibernate-enterprise module * JAVA-20163 Add update to HibernateExceptionUnitTest#whenQueryExecutedWithUnmappedEntity_thenMappingException * JAVA-20163 Set explicit version for hibernate 6.1.7.Final in the hibernate-queries module * JAVA-20163 Fix failed test with port that already exists (giving another port 8088) * JAVA-20163 Fix other location after changing the port * JAVA-20163 Remove duplicate Unit Test --------- Co-authored-by: n Co-authored-by: Loredana Crusoveanu * JAVA-20165 Upgrade spring-boot hibernate specific modules to JDK 11 (#13952) * JAVA-20165 Upgrade spring-boot hibernate specific modules to JDK 11 * JAVA-20165 Migrating spring-boot-persistence-mongodb * JAVA-20165 Migrating spring-boot-persistence-mongodb-2 * JAVA-20165 Migrating spring-boot-persistence-mongodb-3 * JAVA-20165 Adding latest version for jdbi in spring-boot-persistence-2 module --------- Co-authored-by: timis1 * [Check If a Specified Key Exists in a Given S3 Bucket using Java] added code examples (#13775) * [Check If a Specified Key Exists in a Given S3 Bucket using Java]] added code examples for change test name remove link from README.md * - used env variables for AWS credentials - used codestyle profile of baledung * [os-to-is] Convert an OutputStream to an InputStream (#13992) * BAEL-6264 added class to show how to instantiate ArrayBlockingQueue a… (#13851) * BAEL-6264 added class to show how to instantiate ArrayBlockingQueue and LinkedBlockingQueue * BAEL-6264 added unit test case * modified test case * BAEL-6264 deleted BlockingQueueImplExample file not needed anymore * BAEL-6264 code review changes moved class file to different module --------- Co-authored-by: Vartika_Nigam * Add code examples for "Opening a New Tab Using Selenium WebDriver in Java" (#14001) Add code examples for "Opening a New Tab Using Selenium WebDriver in Java" * BAEL-6320: format & code review * JAVA-16946 Upgrade h2 database version for remaining modules (#13976) * Add java interface single implementation examples (#13972) * Fix formatting issues, refactor the `profiles` word in the properties. * Add files via upload (#14006) * JAVA-20828 Fixed module name (#14018) * fix SeleniumOpenNewTabLiveTest (#14019) * BAEL-6493 - Read last N messages from a Kafka Topic (#14020) * BAEL-6398: Java PrintStream to String (#13998) * Revert "JAVA-20280: remove wrong property (#13874)" (#14021) This reverts commit 561e893e86d9c51b1e61818f5450d6194d9959fd. * Hashing with Argon2 in Java (#14009) * Hashing with Argon2 in Java * Hashing with Argon2 in Java * JAVA-13721 Fixing the formatting * JAVA-13721 Further formatting of files * BAEL-4369: Multiple ways of declaring dependency versions in Gradle (#13825) * BAEL-6246 Code for the article Send MultipartFile Request with RestAs… (#13803) * BAEL-6246 Code for the article Send MultipartFile Request with RestAssured * Fix code style in rest assured integration tests --------- Co-authored-by: thibault.faure * Bael 4582: Custom Authentication using shared secret (#13801) * Spring custom security filter add * Integration Tests add * Add Project into parent pom * refactor code * refactor code * remove .env and refactor code * refactor code * exclude auto configuration * Refactored code * removed ssl certificate for security * Set session management to statelees * Refactor tests * Refactor authentication logic * Refactor authentication logic * Refactor authentication logic * Remove unused code * Remove unused code * Remove unused appconfig * disable AWSS3ObjectIntegrationTest due to need real credentials (#14028) make AWSS3ObjectIntegrationTest manual * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * Update README.md [skip ci] * JAVA-20828: changes made for resolving botique module (#14027) * [JAVA-20626]Moved vertx-modules to jdk9-and-above profile + upgraded vertx version to 3.9.15 (#13960) * [JAVA-20633 Clean up modules (#14024) * add value of comparision * [BAEL-6339] custom iterator with testcases (#14038) Co-authored-by: Bhaskar * BAEL-6246 Fix AppControllerIntegrationTest (#14039) Co-authored-by: thibault.faure * JAVA-20946 Renamed HttpBinServiceUnitTest to LiveTest (#14041) - Since it is making actual live request to httpbin.org * JAVA-21186 Fix references to parents - Week 21 - 2023 (#14036) * JAVA-20630 move the jws module to *-jdk9-and-above profiles (#14030) * JAVA-20631 move Jetbrains module to *-jdk9-and-above profiles (#14029) * JAVA-20631 move Jetbrains module to *-jdk9-and-above profiles * JAVA-20631 fix parent modules so that the project parent (pom.xml) can be built without error * BAEL-5711: Securing Spring Boot API with API key and secret (#14015) * #bael-5711: add source * #bael-5711: remove extra space * #bael-5711: remove extra space * #bael-5711: remove extra space --------- Co-authored-by: h_sharifi * BAEL-6334 Improve test names and typos * BAEL-6179: Add Actuator sample without Spring Boot (#14032) * BAEL-6179: Add Actuator sample without Spring Boot * BAEL-6179: Simplify custom health indicator * [JAVA-20624] Moved static-analysis module to jdk9-and-above-profile (#14026) * change return type to optional * Title: Array vs List Performance in Java (#14034) This commit related to the article entitled "Array vs List Performance in Java". * BAEL-6428 Make a Method Execute Only Once in Java * 20616 (#14023) * [JAVA-20616] Upgraded spring-spel module to jdk9-and-above profile * [JAVA-20616] Upgraded spring-websockets module to jdk9-and-above profile * [JAVA-20616] Upgraded spring-shell module to jdk9-and-above profile --------- Co-authored-by: Dhawal Kapil * JAVA-21106: Adding javax-servlets module to jdk9 and above (#13974) * JAVA-21106: Adding javax-servlets module to jdk9 and above * JAVA-21106: Changes made for adding the method for runt he application * JAVA-21106: Changes made for adding javax-servlets-2 modules to jdk-9 and above * JAVA-21106: Changes made for adding linkrest modules to jdk-9 and above * JAVA-21106 : Changes made for adding jee-7 and ninija in default-jdk9-and-above profile * JAVA-21106 : Changes made for adding resteasy,spark-java,struts-3,vraptor,wicket in default-jdk9-and-above profile * JAVA-21106 : Changes made for removing ninja module * JAVA-21106 : Changes made for removing ninja module fro jdk-9 and above * JAVA-21106: Changes made for cleaninhg pom.xml * JAVA-21106: FIXING MAVEN VERISON FOR WICKET * Java 20277 (#14046) * JAVA-20277 GitHub Issue: Regarding article Introduction to JsonPath * JAVA-20277 Code Review Changes * JAVA-20167 Upgrade spring-data hibernate with external libraries specific modules to JDK 11 (#14022) Co-authored-by: timis1 * JAVA-20166 Migrating spring-date-eclipselink (#13959) * JAVA-20166 Migrating spring-date-eclipselink * JAVA-20166 Fix failed tests address already bind * JAVA-20166 Migrating spring-date-couchbase-2 * JAVA-20166 Replace with optional instead of returning null --------- Co-authored-by: timis1 * JAVA-20164 Upgrade java hibernate specific modules to JDK 11 (#13900) * JAVA-20164 Upgrade java hibernate specific modules to JDK 11 * JAVA-20164 Migrating java-jpa-2 * JAVA-20164 Migrating jnosql-artemis * JAVA-20164 Migrating querydsl * JAVA-20164 Migrating r2dbc * JAVA-20164 Migrating redis * JAVA-20164 Fixing test JPATextUnitTest#givenExam_whenSaveExam_thenReturnExpectedExam * JAVA-20164 Fixing givenIdentityStrategy_whenCommitTransction_thenReturnPrimaryKey * JAVA-20164 Changes after review * JAVA-20164 Migrating java-cassandra to jdk8 * JAVA-20164 Fix legacy mode error * Update pom.xml --------- Co-authored-by: timis1 Co-authored-by: Dhawal Kapil * BAEL-5905 move article * BAEL-5947: Moving a project to a different package (#14054) * Revert "feat: BAEL-5947 External Debugging with JMXTerm (#13847)" This reverts commit ae04ab2510a5eb2e7b8c57e14474c6edadeb6883. * BAEL-5947: Moving a project to a different package * BAEL-4615: Create and Detect Memory Leak in Java (#14060) * BAEL-6086: Customize WebFlux Exceptions in Spring Boot 3 (#13948) * BAEL-6086: Added code for webflux default and custom exception along with Unit Tests * BAEL-6086: added missing import * BAEL-6086: reformatting * BAEL-6086: reformatted code --------- Co-authored-by: balasr3 * BAEL-5575 (#14016) * BAEL-5575 First commit of the example for the article: https://drafts.baeldung.com/wp-admin/post.php?post=153774&action=edit * BAEL-5575 Adjusted pom.xml * BAEL-5575 Formatted source code * BAEL-5575 Removed unused import * BAEL-5575 Renamed UT to follow: https://docs.google.com/document/d/1iIeSPuYFG-jEtB8UbcxQnn2AI3OR2LWlnisNo2NUCL8/edit * BAEL-5575 Modified pom.xml to define versions in properties as stated in: https://docs.google.com/document/d/1iIeSPuYFG-jEtB8UbcxQnn2AI3OR2LWlnisNo2NUCL8/edit * BAEL-5575 Changes checking the commands: * mvn clean install * mvn clean install -Dgib.enabled=false * BAEL-5575 Set GB as the base language * BAEL-6094 (#14043) * Inital Commit for BAEL-6094 * Added the test * Updated the test * Convert Hashmap to JSON object in Java (#14070) * Convert Hashmap to JSON object in Java This commit is related to the article entitled "Convert Hashmap to JSON object in Java" * Convert Hashmap to JSON object in Java This commit is for the article "Convert Hashmap to JSON object in Java" * Array vs List Performance in Java (#14078) This commit is related to the article entitled "Array vs List Performance in Java" * Bael-6331: Adding changes for creating and checking empty streams (#14047) * BAEL-6331: Create EmptyStreams.java * BAEL-6331: Create EmptyStreamsUnitTest.java * JAVA-20163 Fix failed integration test with date creation comparison (#14080) Co-authored-by: timis1 * JAVA-21440: Changes made for upgrade jooby module to 2.16.1 to make j… (#14064) * JAVA-21440: Chnages made for upgrade jooby module to 2.16.1 to make java-17 compatable * JAVA-21440: commenting redis code as this will only work in the local or infra should have a redis setup * JAVA-21440 Minor cleanup (#14084) * Delete README.md * removed optional specific function * changing unit test class name * BAEL-6250: refactor: Move to spring-caching-2 since spring-caching is full * Update README.md * Update README.md * BAEL-6460: Why is Scanner skipping nextLine() after using other next functions? (#14079) * changing branch * BAEL-6334 Make object properties example clearer * [BAEL-6344] address PR comment * JAVA-21305 : Changes made for adding ratpack module to jdk9-and above… (#14012) * JAVA-21106 : Changes made for adding ratpack module to jdk9-and above module * JAVA-21106 : Changes made for adding java-lite module to jdk9-and above module * JAVA-21305: Changes made for cleaninhg pom.xml * JAVA-21305: Changes made for cleaning pom.xml * BOSS-21305: changes made for adding ninja in jdk9 above modeule * JAVA-21305: Changes made as per review comments * JAVA-21305: Changes made as per review comments * JAVA-21305: Changes made as per review comments * [JAVA-21134] (#14045) * [JAVA-21134] Removed external repository from jgit module * [JAVA-21134] Removed external repository from aws-miscellaneous module + upgraded dynamodblocal version * [JAVA-21134] Removed external repository from apache-tapestry module * TASK-20628 (#14074) * [TASK-20628] Moved xml module to jdk9-and-above profile * [TASK-20628] Moved xml-2 module to jdk9-and-above profile * [JAVA-15027]Upgraded follow redirects for apache http client + moved … (#14092) * [JAVA-15027]Upgraded follow redirects for apache http client + moved older version to apache-httpclient4 module * [JAVA-15027] Added test case * BAEL-6508 Code for the Solving Gson Parsing Errors article * JAVA-21189: Formatting pom.xml modules starting from KLM (#14096) * JAVA-21189: Formatting pom.xml modules starting from NOPQR (#14097) * JAVA-21189: Formatting pom.xml modules starting from NOPQR (#14097) * java-20079: upgrade apache-spark module libraries (#14087) * [scanner-with-spaces] how to take input as String with spaces in Java… (#14044) * [scanner-with-spaces] how to take input as String with spaces in Java using Scanner?y * [scanner-with-spaces] fix typo * [output-to-file] Write Console Output to Text File in Java (#14082) * [output-to-file] Write Console Output to Text File in Java * [output-to-file] rebase on the master * Convert Hashmap to JSON object in Java (#14110) This commit is for Convert Hashmap to JSON object in Java * Generating Javadoc with Gradle (#14091) * Generating Javadoc with Gradle * Generating Javadoc with Gradle * Generating Javadoc with Gradle * BAEL-6179: Fix readme (#14088) * BAEL-6179: Add Actuator sample without Spring Boot * BAEL-6179: Simplify custom health indicator * BAEL-6179: Fix description in README.md * JAVA-21189: changes made for formatting modules starting from S (#14106) * JAVA-21189: changes made for formatting modules starting from TVWX (#14107) * JAVA_21305: Changes made for fix the Integration test faliures (#14113) * JAVA-20164 Fix .._SEQ.NEXTVAL error (#14109) Co-authored-by: timis1 * JAVA-15022 (#14099) * [JAVA-15022] Moved 4.5 version code to apache-httpclient4 module * [JAVA-15022] Upgraded code to 5.x version * Array vs List Performance in Java (#14114) This commit is related to the article entitled "Array vs List Performance in Java" * BAEL-6461: What's the difference between Scanner next() and nextLine() methods? (#14057) * JAVA-19670: changes made for upgrading jenkins module to jdk-9 above (#14105) * JAVA-19670: changes made for upgrading jenkins module to jdk-9 above * JAVA-19670: Changes made for adding jenkins-modules in jdk-9 and above profile * JAVA_21106: Changes made for fixing test cases for jee-7 (#14115) * Bael 5711: Securing Spring Boot API with API key and secret (#14102) * #bael-5711: add source * #bael-5711: remove extra space * #bael-5711: remove extra space * #bael-5711: remove extra space * #bael-5711: add custom message * #bael-5711: refactor return null --------- Co-authored-by: h_sharifi --------- Co-authored-by: Loredana Crusoveanu Co-authored-by: 3hsan <56245694+ehsansasanian@users.noreply.github.com> Co-authored-by: edizor <113095366+edizor@users.noreply.github.com> Co-authored-by: Vini <34344290+vinipx@users.noreply.github.com> Co-authored-by: Dhawal Kapil Co-authored-by: jsgrah-spring Co-authored-by: jogra Co-authored-by: Azhwani <13301425+azhwani@users.noreply.github.com> Co-authored-by: Kai Yuan Co-authored-by: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Co-authored-by: Michael Olayemi Co-authored-by: mariudotsh <33603097+mariudotsh@users.noreply.github.com> Co-authored-by: Mariusz Kaczmarczyk Co-authored-by: anuragkumawat Co-authored-by: Bipin kumar Co-authored-by: Shaun Phillips <61982125+ShaPhi7@users.noreply.github.com> Co-authored-by: Alejamdro Co-authored-by: Daniel Strmecki Co-authored-by: Arya <108480101+Dazzle-10@users.noreply.github.com> Co-authored-by: Ana Peterlić Co-authored-by: Zahid Khan <63726443+zahikhan@users.noreply.github.com> Co-authored-by: emanuel.trandafir Co-authored-by: Kasra Madadipouya Co-authored-by: uzma Co-authored-by: thibault.faure Co-authored-by: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Co-authored-by: Avin Buricha Co-authored-by: Ulisses Lima Co-authored-by: Bhaskar Ghosh Dastidar Co-authored-by: Bhaskar Co-authored-by: Zahid Khan Co-authored-by: Raj Kishor <30443297+rajkishorraj@users.noreply.github.com> Co-authored-by: raj kishor Co-authored-by: Gaetano Piazzolla Co-authored-by: Eugene Kovko <37694937+eukovko@users.noreply.github.com> Co-authored-by: Bahaa El-Din Helmy Co-authored-by: davidmartinezbarua Co-authored-by: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Co-authored-by: Grzegorz Musiał Co-authored-by: Kilian Schneider <48420258+Basler182@users.noreply.github.com> Co-authored-by: cesarevalenti90 <50798547+cesarevalenti90@users.noreply.github.com> Co-authored-by: Cesare Co-authored-by: brokenhardisk Co-authored-by: Sam Gardner Co-authored-by: timis1 <12120641+timis1@users.noreply.github.com> Co-authored-by: n Co-authored-by: Dmytro Budym <46810751+dbudim@users.noreply.github.com> Co-authored-by: Vartika Nigam <63852792+vnigam2702@users.noreply.github.com> Co-authored-by: Vartika_Nigam Co-authored-by: emanueltrandafir1993 Co-authored-by: Ehsan Sasanianno Co-authored-by: Dileesha Rajapakse Co-authored-by: Maciej Główka Co-authored-by: thibaultfaure Co-authored-by: Saikat Chakraborty <40471715+saikatcse03@users.noreply.github.com> Co-authored-by: Andrew Tarry Co-authored-by: Hamid Reza Sharifi Co-authored-by: h_sharifi Co-authored-by: Ralf Ueberfuhr <40685729+ueberfuhr@users.noreply.github.com> Co-authored-by: Deboshree Co-authored-by: AndiCover Co-authored-by: Balamurugan Co-authored-by: balasr3 Co-authored-by: victorsempere Co-authored-by: Muhammad Asif Co-authored-by: vaibhav007jain <72961247+vaibhav007jain@users.noreply.github.com> Co-authored-by: Andrew Tarry Co-authored-by: ciphx * [BAEL-5934] code formatting and adding submodule * [BAEL-5934] print s3 objects * [BAEL-5934] add subpackage --------- Co-authored-by: Loredana Crusoveanu Co-authored-by: 3hsan <56245694+ehsansasanian@users.noreply.github.com> Co-authored-by: edizor <113095366+edizor@users.noreply.github.com> Co-authored-by: Vini <34344290+vinipx@users.noreply.github.com> Co-authored-by: Dhawal Kapil Co-authored-by: jsgrah-spring Co-authored-by: jogra Co-authored-by: Azhwani <13301425+azhwani@users.noreply.github.com> Co-authored-by: Kai Yuan Co-authored-by: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Co-authored-by: Michael Olayemi Co-authored-by: mariudotsh <33603097+mariudotsh@users.noreply.github.com> Co-authored-by: Mariusz Kaczmarczyk Co-authored-by: anuragkumawat Co-authored-by: Bipin kumar Co-authored-by: Shaun Phillips <61982125+ShaPhi7@users.noreply.github.com> Co-authored-by: Alejamdro Co-authored-by: Daniel Strmecki Co-authored-by: Arya <108480101+Dazzle-10@users.noreply.github.com> Co-authored-by: Ana Peterlić Co-authored-by: Zahid Khan <63726443+zahikhan@users.noreply.github.com> Co-authored-by: emanuel.trandafir Co-authored-by: Kasra Madadipouya Co-authored-by: uzma Co-authored-by: thibault.faure Co-authored-by: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Co-authored-by: Avin Buricha Co-authored-by: Ulisses Lima Co-authored-by: Bhaskar Ghosh Dastidar Co-authored-by: Bhaskar Co-authored-by: Zahid Khan Co-authored-by: Raj Kishor <30443297+rajkishorraj@users.noreply.github.com> Co-authored-by: raj kishor Co-authored-by: Gaetano Piazzolla Co-authored-by: Eugene Kovko <37694937+eukovko@users.noreply.github.com> Co-authored-by: Bahaa El-Din Helmy Co-authored-by: davidmartinezbarua Co-authored-by: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Co-authored-by: Grzegorz Musiał Co-authored-by: Kilian Schneider <48420258+Basler182@users.noreply.github.com> Co-authored-by: cesarevalenti90 <50798547+cesarevalenti90@users.noreply.github.com> Co-authored-by: Cesare Co-authored-by: brokenhardisk Co-authored-by: Sam Gardner Co-authored-by: timis1 <12120641+timis1@users.noreply.github.com> Co-authored-by: n Co-authored-by: Dmytro Budym <46810751+dbudim@users.noreply.github.com> Co-authored-by: Vartika Nigam <63852792+vnigam2702@users.noreply.github.com> Co-authored-by: Vartika_Nigam Co-authored-by: emanueltrandafir1993 Co-authored-by: Ehsan Sasanianno Co-authored-by: Dileesha Rajapakse Co-authored-by: Maciej Główka Co-authored-by: thibaultfaure Co-authored-by: Saikat Chakraborty <40471715+saikatcse03@users.noreply.github.com> Co-authored-by: Andrew Tarry Co-authored-by: Hamid Reza Sharifi Co-authored-by: h_sharifi Co-authored-by: Ralf Ueberfuhr <40685729+ueberfuhr@users.noreply.github.com> Co-authored-by: Deboshree Co-authored-by: AndiCover Co-authored-by: Balamurugan Co-authored-by: balasr3 Co-authored-by: victorsempere Co-authored-by: Muhammad Asif Co-authored-by: vaibhav007jain <72961247+vaibhav007jain@users.noreply.github.com> Co-authored-by: Andrew Tarry Co-authored-by: ciphx --- aws-modules/aws-s3-v2/pom.xml | 50 +++++++ .../com/baeldung/s3/listobjects/File.java | 21 +++ .../s3/listobjects/FileGenerator.java | 27 ++++ .../com/baeldung/s3/listobjects/Main.java | 22 +++ .../baeldung/s3/listobjects/S3Service.java | 129 ++++++++++++++++++ .../aws-s3-v2/src/main/resources/logback.xml | 14 ++ .../s3/listobjects/S3ServiceLiveTest.java | 109 +++++++++++++++ aws-modules/pom.xml | 1 + 8 files changed, 373 insertions(+) create mode 100644 aws-modules/aws-s3-v2/pom.xml create mode 100644 aws-modules/aws-s3-v2/src/main/java/com/baeldung/s3/listobjects/File.java create mode 100644 aws-modules/aws-s3-v2/src/main/java/com/baeldung/s3/listobjects/FileGenerator.java create mode 100644 aws-modules/aws-s3-v2/src/main/java/com/baeldung/s3/listobjects/Main.java create mode 100644 aws-modules/aws-s3-v2/src/main/java/com/baeldung/s3/listobjects/S3Service.java create mode 100644 aws-modules/aws-s3-v2/src/main/resources/logback.xml create mode 100644 aws-modules/aws-s3-v2/src/test/java/com/baeldung/s3/listobjects/S3ServiceLiveTest.java diff --git a/aws-modules/aws-s3-v2/pom.xml b/aws-modules/aws-s3-v2/pom.xml new file mode 100644 index 0000000000..888d98e654 --- /dev/null +++ b/aws-modules/aws-s3-v2/pom.xml @@ -0,0 +1,50 @@ + + 4.0.0 + com.baeldung.s3 + aws-s3-v2 + 1.0-SNAPSHOT + aws-s3-v2 + jar + + + com.baeldung + aws-modules + 1.0.0-SNAPSHOT + + + + UTF-8 + 2.20.52 + 3.6.1 + + + + + software.amazon.awssdk + s3 + ${aws.java.sdk.version} + + + + + + + org.apache.maven.plugins + maven-shade-plugin + ${maven-shade-plugin.version} + + false + + + + package + + shade + + + + + + + diff --git a/aws-modules/aws-s3-v2/src/main/java/com/baeldung/s3/listobjects/File.java b/aws-modules/aws-s3-v2/src/main/java/com/baeldung/s3/listobjects/File.java new file mode 100644 index 0000000000..f9fe7f6fb3 --- /dev/null +++ b/aws-modules/aws-s3-v2/src/main/java/com/baeldung/s3/listobjects/File.java @@ -0,0 +1,21 @@ +package com.baeldung.s3.listobjects; + +import java.nio.ByteBuffer; + +public class File { + private String name; + private ByteBuffer content; + + public File(String name, ByteBuffer content) { + this.name = name; + this.content = content; + } + + public String getName() { + return name; + } + + public ByteBuffer getContent() { + return content; + } +} diff --git a/aws-modules/aws-s3-v2/src/main/java/com/baeldung/s3/listobjects/FileGenerator.java b/aws-modules/aws-s3-v2/src/main/java/com/baeldung/s3/listobjects/FileGenerator.java new file mode 100644 index 0000000000..7c640591d7 --- /dev/null +++ b/aws-modules/aws-s3-v2/src/main/java/com/baeldung/s3/listobjects/FileGenerator.java @@ -0,0 +1,27 @@ +package com.baeldung.s3.listobjects; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class FileGenerator { + + public static List generateFiles(int fileCount, int fileSize) { + List files = new ArrayList<>(); + for (int i = 0; i < fileCount; i++) { + String fileName = "file_" + i + ".txt"; + ByteBuffer fileContent = generateRandomBytes(fileSize); + files.add(new File(fileName, fileContent)); + } + return files; + } + + private static ByteBuffer generateRandomBytes(int size) { + byte[] array = new byte[size]; + new Random().nextBytes(array); + return ByteBuffer.wrap(array); + } + + +} diff --git a/aws-modules/aws-s3-v2/src/main/java/com/baeldung/s3/listobjects/Main.java b/aws-modules/aws-s3-v2/src/main/java/com/baeldung/s3/listobjects/Main.java new file mode 100644 index 0000000000..7b7c95a0d0 --- /dev/null +++ b/aws-modules/aws-s3-v2/src/main/java/com/baeldung/s3/listobjects/Main.java @@ -0,0 +1,22 @@ +package com.baeldung.s3.listobjects; + +import software.amazon.awssdk.regions.Region; + +public class Main { + + private static String AWS_BUCKET = "baeldung-tutorial-s3"; + public static Region AWS_REGION = Region.EU_CENTRAL_1; + + public static void main(String[] args) { + S3Service s3Service = new S3Service(AWS_REGION); + + s3Service.putObject(AWS_BUCKET, FileGenerator.generateFiles(1000, 1)); + s3Service.listBuckets(); + s3Service.listObjectsInBucket(AWS_BUCKET); + s3Service.listAllObjectsInBucket(AWS_BUCKET); + s3Service.listAllObjectsInBucketPaginated(AWS_BUCKET, 500); + s3Service.listAllObjectsInBucketPaginatedWithPrefix(AWS_BUCKET, 500, "backup/"); + + s3Service.cleanup(); + } +} diff --git a/aws-modules/aws-s3-v2/src/main/java/com/baeldung/s3/listobjects/S3Service.java b/aws-modules/aws-s3-v2/src/main/java/com/baeldung/s3/listobjects/S3Service.java new file mode 100644 index 0000000000..132123f214 --- /dev/null +++ b/aws-modules/aws-s3-v2/src/main/java/com/baeldung/s3/listobjects/S3Service.java @@ -0,0 +1,129 @@ +package com.baeldung.s3.listobjects; + +import java.util.List; + +import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.*; +import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Iterable; + +class S3Service { + + private S3Client s3Client; + + public S3Service(Region awsRegion) { + init(awsRegion); + } + + public S3Service(S3Client s3Client) { + this.s3Client = s3Client; + } + + public void init(Region awsRegion) { + this.s3Client = S3Client.builder() + .region(awsRegion) + .credentialsProvider(ProfileCredentialsProvider.create("default")) + .build(); + } + + public void listObjectsInBucket(String bucketName) { + ListObjectsV2Request listObjectsV2Request = ListObjectsV2Request.builder() + .bucket(bucketName) + .build(); + ListObjectsV2Response listObjectsV2Response = s3Client.listObjectsV2(listObjectsV2Request); + + List contents = listObjectsV2Response.contents(); + + System.out.println("Number of objects in the bucket: " + contents.stream().count()); + contents.stream().forEach(System.out::println); + } + + public void listAllObjectsInBucket(String bucketName) { + String nextContinuationToken = null; + long totalObjects = 0; + + do { + ListObjectsV2Request.Builder requestBuilder = ListObjectsV2Request.builder() + .bucket(bucketName) + .continuationToken(nextContinuationToken); + + ListObjectsV2Response response = s3Client.listObjectsV2(requestBuilder.build()); + nextContinuationToken = response.nextContinuationToken(); + + totalObjects += response.contents().stream() + .peek(System.out::println) + .reduce(0, (subtotal, element) -> subtotal + 1, Integer::sum); + } while (nextContinuationToken != null); + System.out.println("Number of objects in the bucket: " + totalObjects); + } + + public void listAllObjectsInBucketPaginated(String bucketName, int pageSize) { + ListObjectsV2Request listObjectsV2Request = ListObjectsV2Request.builder() + .bucket(bucketName) + .maxKeys(pageSize) // Set the maxKeys parameter to control the page size + .build(); + + ListObjectsV2Iterable listObjectsV2Iterable = s3Client.listObjectsV2Paginator(listObjectsV2Request); + long totalObjects = 0; + + for (ListObjectsV2Response page : listObjectsV2Iterable) { + long retrievedPageSize = page.contents().stream() + .peek(System.out::println) + .reduce(0, (subtotal, element) -> subtotal + 1, Integer::sum); + totalObjects += retrievedPageSize; + System.out.println("Page size: " + retrievedPageSize); + } + System.out.println("Total objects in the bucket: " + totalObjects); + } + + public void listAllObjectsInBucketPaginatedWithPrefix(String bucketName, int pageSize, String prefix) { + ListObjectsV2Request listObjectsV2Request = ListObjectsV2Request.builder() + .bucket(bucketName) + .maxKeys(pageSize) // Set the maxKeys parameter to control the page size + .prefix(prefix) + .build(); + + ListObjectsV2Iterable listObjectsV2Iterable = s3Client.listObjectsV2Paginator(listObjectsV2Request); + long totalObjects = 0; + + for (ListObjectsV2Response page : listObjectsV2Iterable) { + long retrievedPageSize = page.contents().stream() + .peek(System.out::println) + .reduce(0, (subtotal, element) -> subtotal + 1, Integer::sum); + totalObjects += retrievedPageSize; + System.out.println("Page size: " + retrievedPageSize); + } + System.out.println("Total objects in the bucket: " + totalObjects); + } + + public void listBuckets() { + // List all buckets + ListBucketsResponse listBucketsResponse = s3Client.listBuckets(); + + // Display the bucket names + List buckets = listBucketsResponse.buckets(); + System.out.println("Buckets:"); + for (Bucket bucket : buckets) { + System.out.println(bucket.name()); + } + } + + public void putObject(String bucketName, List files) { + try { + files.stream().forEach(file -> { + s3Client.putObject(PutObjectRequest.builder().bucket(bucketName).key(file.getName()).build(), + RequestBody.fromByteBuffer(file.getContent())); + System.out.println("Uploaded file: " + file.getName()); + }); + } catch (S3Exception e) { + System.err.println("Upload failed"); + e.printStackTrace(); + } + } + + public void cleanup() { + this.s3Client.close(); + } +} \ No newline at end of file diff --git a/aws-modules/aws-s3-v2/src/main/resources/logback.xml b/aws-modules/aws-s3-v2/src/main/resources/logback.xml new file mode 100644 index 0000000000..91d3d0cfa6 --- /dev/null +++ b/aws-modules/aws-s3-v2/src/main/resources/logback.xml @@ -0,0 +1,14 @@ + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + \ No newline at end of file diff --git a/aws-modules/aws-s3-v2/src/test/java/com/baeldung/s3/listobjects/S3ServiceLiveTest.java b/aws-modules/aws-s3-v2/src/test/java/com/baeldung/s3/listobjects/S3ServiceLiveTest.java new file mode 100644 index 0000000000..40b30f8669 --- /dev/null +++ b/aws-modules/aws-s3-v2/src/test/java/com/baeldung/s3/listobjects/S3ServiceLiveTest.java @@ -0,0 +1,109 @@ +package com.baeldung.s3.listobjects; + +import com.baeldung.s3.listobjects.S3Service; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.ListBucketsResponse; +import software.amazon.awssdk.services.s3.model.ListObjectsV2Request; +import software.amazon.awssdk.services.s3.model.ListObjectsV2Response; +import software.amazon.awssdk.services.s3.model.S3Object; +import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Iterable; + +import java.util.Arrays; +import java.util.Collections; + +import static org.mockito.Mockito.when; + +class S3ServiceLiveTest { + + @Mock + private S3Client s3Client; + + private S3Service s3Service; + + private String AWS_BUCKET = "baeldung-tutorial-s3"; + + @BeforeEach + public void setup() { + MockitoAnnotations.openMocks(this); + s3Service = new S3Service(s3Client); + } + + @AfterEach + public void cleanup() { + s3Service.cleanup(); + Mockito.verify(s3Client).close(); + } + + @Test + public void givenBucketName_whenListObjectsInBucket_thenReturnList() { + ListObjectsV2Request request = ListObjectsV2Request.builder().bucket(AWS_BUCKET).build(); + ListObjectsV2Response response = ListObjectsV2Response.builder().contents(Collections.emptyList()).build(); + + when(s3Client.listObjectsV2(request)).thenReturn(response); + + s3Service.listObjectsInBucket(AWS_BUCKET); + Mockito.verify(s3Client).listObjectsV2(request); + } + + @Test + public void givenBucketName_whenListAllObjectsInBucket_thenReturnList() { + ListObjectsV2Request request = ListObjectsV2Request.builder().bucket(AWS_BUCKET).build(); + ListObjectsV2Response response = ListObjectsV2Response.builder().contents(Collections.emptyList()).build(); + + when(s3Client.listObjectsV2(request)).thenReturn(response); + + s3Service.listAllObjectsInBucket(AWS_BUCKET); + Mockito.verify(s3Client).listObjectsV2(request); + } + + @Test + public void givenBucketNameAndPageSize_whenListAllObjectsInBucketPaginated_thenReturnPaginatedList() { + int pageSize = 10; + ListObjectsV2Request request = ListObjectsV2Request.builder().bucket(AWS_BUCKET).maxKeys(pageSize).build(); + + ListObjectsV2Iterable mockIterable = Mockito.mock(ListObjectsV2Iterable.class); + + S3Object s3Object1 = S3Object.builder().key("object1").build(); + S3Object s3Object2 = S3Object.builder().key("object2").build(); + ListObjectsV2Response response = ListObjectsV2Response.builder().contents(s3Object1, s3Object2).build(); + + when(s3Client.listObjectsV2Paginator(request)).thenReturn(mockIterable); + when(mockIterable.iterator()).thenReturn(Arrays.asList(response).iterator()); + + s3Service.listAllObjectsInBucketPaginated(AWS_BUCKET, pageSize); + Mockito.verify(s3Client).listObjectsV2Paginator(request); + } + + @Test + public void givenBucketNamePageSizeAndPrefix_whenListAllObjectsInBucketPaginatedWithPrefix_thenReturnPaginatedList() { + int pageSize = 1; + String prefix = "folder/"; + ListObjectsV2Request request = ListObjectsV2Request.builder().bucket(AWS_BUCKET).maxKeys(pageSize).prefix(prefix).build(); + + ListObjectsV2Iterable mockIterable = Mockito.mock(ListObjectsV2Iterable.class); + + S3Object s3Object1 = S3Object.builder().key("folder/object1").build(); + S3Object s3Object2 = S3Object.builder().key("folder/object2").build(); + ListObjectsV2Response response = ListObjectsV2Response.builder().contents(s3Object1, s3Object2).build(); + + when(s3Client.listObjectsV2Paginator(request)).thenReturn(mockIterable); + when(mockIterable.iterator()).thenReturn(Arrays.asList(response).iterator()); + + s3Service.listAllObjectsInBucketPaginatedWithPrefix(AWS_BUCKET, pageSize, prefix); + Mockito.verify(s3Client).listObjectsV2Paginator(request); + } + + @Test + public void whenListBuckets_thenReturnBucketList() { + when(s3Client.listBuckets()).thenReturn(ListBucketsResponse.builder().buckets(Collections.emptyList()).build()); + + s3Service.listBuckets(); + Mockito.verify(s3Client).listBuckets(); + } +} diff --git a/aws-modules/pom.xml b/aws-modules/pom.xml index 02473815b5..77872e3f8f 100644 --- a/aws-modules/pom.xml +++ b/aws-modules/pom.xml @@ -19,6 +19,7 @@ aws-miscellaneous aws-reactive aws-s3 + aws-s3-v2 From b58d374862bbf473bf998253ec1b95265767eb7b Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sun, 18 Jun 2023 17:53:42 +0200 Subject: [PATCH 069/170] [list-to-list] Convert a List of Strings to a List of Integers (#14244) --- .../StringListToIntListUnitTest.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 core-java-modules/core-java-collections-conversions-2/src/test/java/com/baeldung/strlisttointlist/StringListToIntListUnitTest.java diff --git a/core-java-modules/core-java-collections-conversions-2/src/test/java/com/baeldung/strlisttointlist/StringListToIntListUnitTest.java b/core-java-modules/core-java-collections-conversions-2/src/test/java/com/baeldung/strlisttointlist/StringListToIntListUnitTest.java new file mode 100644 index 0000000000..a29f32aecc --- /dev/null +++ b/core-java-modules/core-java-collections-conversions-2/src/test/java/com/baeldung/strlisttointlist/StringListToIntListUnitTest.java @@ -0,0 +1,46 @@ +package com.baeldung.strlisttointlist; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.jupiter.api.Test; + +import com.google.common.base.Function; +import com.google.common.collect.Lists; + +public class StringListToIntListUnitTest { + private final static List STRING_LIST = Arrays.asList("1", "2", "3", "4", "5", "6", "7"); + private final static List EXPECTED_LIST = Arrays.asList(1, 2, 3, 4, 5, 6, 7); + + @Test + void whenUsingStream_thenGetExpectedIntegerList() { + List result = STRING_LIST.stream() + .map(Integer::valueOf) + .collect(Collectors.toList()); + assertEquals(EXPECTED_LIST, result); + } + + @Test + void whenUsingLoop_thenGetExpectedIntegerList() { + List result = new ArrayList<>(STRING_LIST.size()); + for (String s : STRING_LIST) { + result.add(Integer.valueOf(s)); + } + assertEquals(EXPECTED_LIST, result); + } + + @Test + void whenUsingGuava_thenGetExpectedIntegerList() { + List result = Lists.transform(STRING_LIST, new Function() { + @Override + public Integer apply(String input) { + return Integer.valueOf(input); + } + }); + assertEquals(EXPECTED_LIST, result); + } +} \ No newline at end of file From 4ad0de6842b1555ee11d0dcebe746efad5fb532c Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Mon, 19 Jun 2023 15:39:08 +0300 Subject: [PATCH 070/170] =?UTF-8?q?[JAVA-22160]=20Upgraded=20resilience4j-?= =?UTF-8?q?spring-boot2=20dependency=20version=20+=20=E2=80=A6=20(#14207)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring-boot-libraries-2/pom.xml | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/spring-boot-modules/spring-boot-libraries-2/pom.xml b/spring-boot-modules/spring-boot-libraries-2/pom.xml index 3cc228d838..ce9157da50 100644 --- a/spring-boot-modules/spring-boot-libraries-2/pom.xml +++ b/spring-boot-modules/spring-boot-libraries-2/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-boot-libraries-2 @@ -16,7 +16,7 @@ org.springframework.experimental spring-modulith-bom - 0.5.1 + ${spring-modulith-bom.version} import pom @@ -48,7 +48,7 @@ org.jobrunr jobrunr-spring-boot-starter - ${jobrunr.version} + ${jobrunr-spring-boot-starter.version} @@ -59,7 +59,7 @@ org.openapitools jackson-databind-nullable - ${jackson-databind.version} + ${jackson-databind-nullable.version} org.springdoc @@ -80,23 +80,23 @@ org.reflections reflections - 0.10.2 + ${reflections.version} org.jboss jandex - 2.4.3.Final + ${jandex.version} io.github.resilience4j resilience4j-spring-boot2 - 1.7.0 + ${resilience4j-spring-boot2.version} com.github.tomakehurst wiremock-jre8 - 2.34.0 + ${wiremock-jre8.version} test @@ -141,7 +141,7 @@ org.jboss.jandex jandex-maven-plugin - 1.2.3 + ${jandex-maven-plugin.version} compile @@ -163,11 +163,17 @@ - 3.1.1 + 0.5.1 + 3.1.1 4.0.3 5.3.0 2.4.5 - 0.2.1 + 0.2.1 + 0.10.2 + 2.4.3.Final + 2.0.2 + 2.34.0 + 1.2.3 1.7.0 com.baeldung.openapi.OpenApiApplication From 9bbd08c6a8297334ed8f2092b7a30d505202c5dc Mon Sep 17 00:00:00 2001 From: sam-gardner <53271849+sam-gardner@users.noreply.github.com> Date: Mon, 19 Jun 2023 16:15:16 +0100 Subject: [PATCH 071/170] BAEL-5830 Add code for setting default values for null fields with Jackson (#14265) --- .../defaultvalues/JsonSetterDefaultValue.java | 30 +++++++++++++++ .../NonAnnotatedDefaultValue.java | 20 ++++++++++ .../defaultvalues/NullsSkipDefaultValue.java | 27 ++++++++++++++ .../defaultvalues/DefaultValuesUnitTest.java | 37 +++++++++++++++++++ 4 files changed, 114 insertions(+) create mode 100644 jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/JsonSetterDefaultValue.java create mode 100644 jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/NonAnnotatedDefaultValue.java create mode 100644 jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/NullsSkipDefaultValue.java create mode 100644 jackson-modules/jackson-core/src/test/java/com/baeldung/jackson/defaultvalues/DefaultValuesUnitTest.java diff --git a/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/JsonSetterDefaultValue.java b/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/JsonSetterDefaultValue.java new file mode 100644 index 0000000000..5d8c758e86 --- /dev/null +++ b/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/JsonSetterDefaultValue.java @@ -0,0 +1,30 @@ +package com.baeldung.jackson.defaultvalues; + +import com.fasterxml.jackson.annotation.JsonSetter; + +public class JsonSetterDefaultValue { + + private String required; + private String optional = "valueIfMissingEntirely"; + + @JsonSetter("optional") + public void setOptional(String optional){ + if(optional == null){ + this.optional = "valueIfNull"; + } + } + + public String getRequired() { + return required; + } + + public String getOptional() { + return optional; + } + + @Override + public String toString() { + return "NonAnnotatedDefaultValue{" + "required='" + required + '\'' + ", optional='" + optional + '\'' + '}'; + } + +} diff --git a/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/NonAnnotatedDefaultValue.java b/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/NonAnnotatedDefaultValue.java new file mode 100644 index 0000000000..54747642ef --- /dev/null +++ b/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/NonAnnotatedDefaultValue.java @@ -0,0 +1,20 @@ +package com.baeldung.jackson.defaultvalues; + +public class NonAnnotatedDefaultValue { + + private String required; + private String optional = "defaultValue"; + + public String getRequired() { + return required; + } + + public String getOptional() { + return optional; + } + + @Override + public String toString() { + return "NonAnnotatedDefaultValue{" + "required='" + required + '\'' + ", optional='" + optional + '\'' + '}'; + } +} diff --git a/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/NullsSkipDefaultValue.java b/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/NullsSkipDefaultValue.java new file mode 100644 index 0000000000..8dc585ea30 --- /dev/null +++ b/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/NullsSkipDefaultValue.java @@ -0,0 +1,27 @@ +package com.baeldung.jackson.defaultvalues; + +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; + +public class NullsSkipDefaultValue { + + private String required; + @JsonSetter(nulls = Nulls.SKIP) + private String optional = "defaultValue"; + + public void setOptional(String optional){} + + public String getRequired() { + return required; + } + + public String getOptional() { + return optional; + } + + @Override + public String toString() { + return "NonAnnotatedDefaultValue{" + "required='" + required + '\'' + ", optional='" + optional + '\'' + '}'; + } + +} diff --git a/jackson-modules/jackson-core/src/test/java/com/baeldung/jackson/defaultvalues/DefaultValuesUnitTest.java b/jackson-modules/jackson-core/src/test/java/com/baeldung/jackson/defaultvalues/DefaultValuesUnitTest.java new file mode 100644 index 0000000000..813cfaae16 --- /dev/null +++ b/jackson-modules/jackson-core/src/test/java/com/baeldung/jackson/defaultvalues/DefaultValuesUnitTest.java @@ -0,0 +1,37 @@ +package com.baeldung.jackson.defaultvalues; + +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class DefaultValuesUnitTest { + + @Test + public void givenAClassWithADefaultValue_whenReadingJsonWithoutOptionalValue_thenExpectDefaultValueInResult() throws JsonProcessingException { + String noOptionalField = "{\"required\": \"value\"}"; + ObjectMapper objectMapper = new ObjectMapper(); + NonAnnotatedDefaultValue createdObject = objectMapper.readValue(noOptionalField, NonAnnotatedDefaultValue.class); + assert(createdObject.getRequired()).equals("value"); + assert(createdObject.getOptional()).equals("defaultValue"); + } + + @Test + public void givenAClassWithAJsonSetter_whenReadingJsonWithNullOptionalValue_thenExpectDefaultValueInResult() throws JsonProcessingException { + String nullOptionalField = "{\"required\": \"value\", \"optional\": null}"; + ObjectMapper objectMapper = new ObjectMapper(); + JsonSetterDefaultValue createdObject = objectMapper.readValue(nullOptionalField, JsonSetterDefaultValue.class); + assert(createdObject.getRequired()).equals("value"); + assert(createdObject.getOptional()).equals("valueIfNull"); + } + + @Test + public void givenAClassWithAJsonSetterNullsSkip_whenReadingJsonWithNullOptionalValue_thenExpectDefaultValueInResult() throws JsonProcessingException { + String nullOptionalField = "{\"required\": \"value\", \"optional\": null}"; + ObjectMapper objectMapper = new ObjectMapper(); + NullsSkipDefaultValue createdObject = objectMapper.readValue(nullOptionalField, NullsSkipDefaultValue.class); + assert(createdObject.getRequired()).equals("value"); + assert(createdObject.getOptional()).equals("defaultValue"); + } + +} From ccaaddd70a9c297b6aca7eec6370fa19ca4d8407 Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Mon, 19 Jun 2023 20:28:52 +0200 Subject: [PATCH 072/170] BAEL-6523: Difference Between findBy and findOneBy in Spring Data JPA (#14136) --- .../jpa/listrepositories/entity/Person.java | 38 +++++++++++ .../repository/PersonRepository.java | 19 ++++++ .../src/main/resources/application.properties | 3 + .../src/main/resources/data.sql | 4 ++ .../src/main/resources/schema.sql | 6 ++ .../PersonRepositoryIntegrationTest.java | 66 +++++++++++++++++++ 6 files changed, 136 insertions(+) create mode 100644 persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/Person.java create mode 100644 persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/repository/PersonRepository.java create mode 100644 persistence-modules/spring-data-jpa-repo-3/src/main/resources/data.sql create mode 100644 persistence-modules/spring-data-jpa-repo-3/src/main/resources/schema.sql create mode 100644 persistence-modules/spring-data-jpa-repo-3/src/test/java/com/baeldung/spring/data/jpa/listrepositories/repository/PersonRepositoryIntegrationTest.java diff --git a/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/Person.java b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/Person.java new file mode 100644 index 0000000000..0f58e403ab --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/Person.java @@ -0,0 +1,38 @@ +package com.baeldung.spring.data.jpa.listrepositories.entity; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; + +@Entity +public class Person { + + @Id + private int id; + private String firstName; + private String lastName; + + public int getId() { + return id; + } + + public void setId(int 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; + } + +} diff --git a/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/repository/PersonRepository.java b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/repository/PersonRepository.java new file mode 100644 index 0000000000..0397cf5063 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/repository/PersonRepository.java @@ -0,0 +1,19 @@ +package com.baeldung.spring.data.jpa.listrepositories.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.baeldung.spring.data.jpa.listrepositories.entity.Person; + +@Repository +public interface PersonRepository extends JpaRepository { + Person findByFirstName(String firstName); + + List findByLastName(String lastName); + + Person findOneByFirstName(String firstName); + + List findOneByLastName(String lastName); +} diff --git a/persistence-modules/spring-data-jpa-repo-3/src/main/resources/application.properties b/persistence-modules/spring-data-jpa-repo-3/src/main/resources/application.properties index 5a1841e2ad..cd6dbe3994 100644 --- a/persistence-modules/spring-data-jpa-repo-3/src/main/resources/application.properties +++ b/persistence-modules/spring-data-jpa-repo-3/src/main/resources/application.properties @@ -1,2 +1,5 @@ +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.jpa.hibernate.ddl-auto=none + logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE 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 new file mode 100644 index 0000000000..50bd326155 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-3/src/main/resources/data.sql @@ -0,0 +1,4 @@ +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 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 new file mode 100644 index 0000000000..c8be0eb781 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-3/src/main/resources/schema.sql @@ -0,0 +1,6 @@ +DROP TABLE IF EXISTS person; +CREATE TABLE person( + id INT PRIMARY KEY, + first_name VARCHAR(200), + last_name VARCHAR(200) +) \ 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/repository/PersonRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-repo-3/src/test/java/com/baeldung/spring/data/jpa/listrepositories/repository/PersonRepositoryIntegrationTest.java new file mode 100644 index 0000000000..f93b822ffb --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-3/src/test/java/com/baeldung/spring/data/jpa/listrepositories/repository/PersonRepositoryIntegrationTest.java @@ -0,0 +1,66 @@ +package com.baeldung.spring.data.jpa.listrepositories.repository; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.dao.IncorrectResultSizeDataAccessException; + +import com.baeldung.spring.data.jpa.listrepositories.entity.Person; + +@DataJpaTest +class PersonRepositoryIntegrationTest { + + @Autowired + private PersonRepository personRepository; + + @Test + void givenFirstName_whenCallingFindByFirstName_ThenReturnOnePerson() { + Person person = personRepository.findByFirstName("Azhrioun"); + + assertNotNull(person); + assertEquals("Abderrahim", person.getLastName()); + } + + @Test + void givenLastName_whenCallingFindByLastName_ThenReturnList() { + List person = personRepository.findByLastName("Wheeler"); + + assertEquals(2, person.size()); + } + + @Test + void givenFirstName_whenCallingFindOneByFirstName_ThenReturnOnePerson() { + Person person = personRepository.findOneByFirstName("Azhrioun"); + + assertNotNull(person); + assertEquals("Abderrahim", person.getLastName()); + } + + @Test + void givenLastName_whenCallingFindOneByLastName_ThenReturnList() { + List persons = personRepository.findOneByLastName("Wheeler"); + + assertEquals(2, persons.size()); + } + + @Test + void givenFirstName_whenCallingFindByFirstName_ThenThrowException() { + IncorrectResultSizeDataAccessException exception = assertThrows(IncorrectResultSizeDataAccessException.class, () -> personRepository.findByFirstName("Stella")); + + assertEquals("query did not return a unique result: 2", exception.getMessage()); + } + + @Test + void givenFirstName_whenCallingFindOneByFirstName_ThenThrowException() { + IncorrectResultSizeDataAccessException exception = assertThrows(IncorrectResultSizeDataAccessException.class, () -> personRepository.findOneByFirstName("Stella")); + + assertEquals("query did not return a unique result: 2", exception.getMessage()); + } + +} From 17cdc7c74591ceaa47f92e4a28b013c4a46b1c44 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 20 Jun 2023 13:26:51 +0300 Subject: [PATCH 073/170] [JAVA-22206] Upgraded micrometer dependency version (#14200) --- metrics/pom.xml | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/metrics/pom.xml b/metrics/pom.xml index d3731242c4..40a1d95d0c 100644 --- a/metrics/pom.xml +++ b/metrics/pom.xml @@ -16,44 +16,44 @@ io.dropwizard.metrics metrics-core - ${dep.ver.metrics} + ${dropwizard.metrics.version} io.dropwizard.metrics metrics-healthchecks - ${dep.ver.metrics} + ${dropwizard.metrics.version} io.dropwizard.metrics metrics-servlets - ${dep.ver.metrics} + ${dropwizard.metrics.version} io.dropwizard.metrics metrics-servlet - ${dep.ver.metrics} + ${dropwizard.metrics.version} javax.servlet javax.servlet-api - ${dep.ver.servlet} + ${javax.servlet-api.version} com.netflix.servo servo-core - ${netflix.servo.ver} + ${netflix.servo.version} test com.netflix.servo servo-atlas - ${netflix.servo.ver} + ${netflix.servo.version} test io.micrometer micrometer-registry-atlas - ${micrometer.ver} + ${micrometer-registry-atlas.version} org.springframework.boot @@ -73,7 +73,7 @@ io.astefanutti.metrics.aspectj metrics-aspectj-deps - ${metrics-aspectj.version} + ${metrics-aspectj-deps.version} com.netflix.spectator @@ -83,14 +83,12 @@ - 3.1.2 - 3.1.0 - 0.12.17 - 1.7.1 - - 2.0.7.RELEASE - 1.1.0 - 1.0.11 + 4.2.17 + 0.13.2 + 1.11.0 + 3.1.0 + 1.2.0 + 1.5.4 \ No newline at end of file From 11469c7c8584f994932f232dd9c30817fddf3a1c Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Tue, 20 Jun 2023 09:45:16 -0600 Subject: [PATCH 074/170] BAEL-6417: MinIO Java SDK examples (#14048) * BAEL-6417: MinIO Java SDK examples * BAEL-6417 Add Live test * BAEL-6417 Rename live test class * BAEL-6417 Create property for minio version --- libraries-data-2/pom.xml | 8 +- .../java/com/baeldung/minio/MinIOService.java | 35 +++++++++ .../baeldung/minio/MinIOServiceLiveTest.java | 73 +++++++++++++++++++ 3 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 libraries-data-2/src/main/java/com/baeldung/minio/MinIOService.java create mode 100644 libraries-data-2/src/test/java/com/baeldung/minio/MinIOServiceLiveTest.java diff --git a/libraries-data-2/pom.xml b/libraries-data-2/pom.xml index 655bad2e2b..b9b785cebb 100644 --- a/libraries-data-2/pom.xml +++ b/libraries-data-2/pom.xml @@ -116,6 +116,11 @@ guava ${guava.version} + + io.minio + minio + ${minio.version} + org.awaitility awaitility @@ -177,6 +182,7 @@ 3.0.0 2.8.4 2.1.13 + 8.5.2 - \ No newline at end of file + diff --git a/libraries-data-2/src/main/java/com/baeldung/minio/MinIOService.java b/libraries-data-2/src/main/java/com/baeldung/minio/MinIOService.java new file mode 100644 index 0000000000..f7a8f498be --- /dev/null +++ b/libraries-data-2/src/main/java/com/baeldung/minio/MinIOService.java @@ -0,0 +1,35 @@ +package com.baeldung.minio; + +import io.minio.GetObjectArgs; +import io.minio.MakeBucketArgs; +import io.minio.MinioClient; +import io.minio.UploadObjectArgs; + +public class MinIOService { + private MinioClient minioClient = + MinioClient.builder() + .endpoint("http://127.0.0.1:9000") + .credentials("minioadmin", "minioadmin") + .build(); + + public void doSomething() throws Exception { + minioClient.makeBucket( + MakeBucketArgs + .builder() + .bucket("user2") + .build()); + + minioClient.uploadObject( + UploadObjectArgs + .builder() + .bucket("user2") + .filename("/tmp/Resume.pdf") + .build()); + + minioClient.getObject( + GetObjectArgs.builder() + .bucket("user2") + .object("Resume.pdf") + .build()); + } +} diff --git a/libraries-data-2/src/test/java/com/baeldung/minio/MinIOServiceLiveTest.java b/libraries-data-2/src/test/java/com/baeldung/minio/MinIOServiceLiveTest.java new file mode 100644 index 0000000000..8737e5e7aa --- /dev/null +++ b/libraries-data-2/src/test/java/com/baeldung/minio/MinIOServiceLiveTest.java @@ -0,0 +1,73 @@ +package com.baeldung.minio; + +import io.minio.*; +import org.junit.Before; +import org.junit.Test; + +import java.io.*; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class MinIOServiceLiveTest { + + private MinioClient minioClient; + + private final String BUCKET_NAME = "livetest"; + + private final String OBJECT_NAME = "minio_sample.txt"; + + private final String CONTENTS = "hello"; + + @Before + public void setup() { + minioClient = + MinioClient.builder() + .endpoint("http://127.0.0.1:9000") + .credentials("minioadmin", "minioadmin") + .build(); + } + + @Test + public void givenFile_whenUploadAndRetrive_thenContentsAreCorrect() throws Exception { + + if(!minioClient.bucketExists(BucketExistsArgs + .builder() + .bucket(BUCKET_NAME) + .build())) { + + minioClient.makeBucket(MakeBucketArgs + .builder() + .bucket(BUCKET_NAME) + .build()); + } + + minioClient.putObject(PutObjectArgs + .builder() + .bucket(BUCKET_NAME) + .object(OBJECT_NAME) + .stream(new ByteArrayInputStream(CONTENTS.getBytes()), CONTENTS.length(),-1) + .build()); + + try (InputStream stream = + minioClient.getObject(GetObjectArgs + .builder() + .bucket(BUCKET_NAME) + .object(OBJECT_NAME) + .build())) { + + byte[] obj = new byte[CONTENTS.length()]; + stream.read(obj); + assertEquals(CONTENTS, new String(obj)); + } + catch (IOException e) { + + } + finally { + minioClient.removeObject(RemoveObjectArgs + .builder() + .bucket(BUCKET_NAME) + .object(OBJECT_NAME) + .build()); + } + } +} From c4334bf328961ebf595bbbff83eafa230ad4dc05 Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Tue, 20 Jun 2023 15:47:00 +0000 Subject: [PATCH 075/170] Hex Representation of a SHA-1 Digest of a String in Java (#14239) * Hex Representation of a SHA-1 Digest of a String in Java * Hex Representation of a SHA-1 Digest of a String in Java * Hex Representation of a SHA-1 Digest of a String in Java --- .../core-java-security-3/pom.xml | 8 +++- .../HexRepresentationSha1DigestUnitTest.java | 42 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/sha1/HexRepresentationSha1DigestUnitTest.java diff --git a/core-java-modules/core-java-security-3/pom.xml b/core-java-modules/core-java-security-3/pom.xml index a4f60b4db5..ad9feeb36a 100644 --- a/core-java-modules/core-java-security-3/pom.xml +++ b/core-java-modules/core-java-security-3/pom.xml @@ -30,6 +30,11 @@ jaxb-api ${jaxb-api.version} + + com.google.guava + guava + ${google-guava.version} + org.springframework.security spring-security-crypto @@ -39,9 +44,10 @@ 1.70 - 1.11 + 1.15 2.3.1 6.0.3 + 31.0.1-jre \ No newline at end of file diff --git a/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/sha1/HexRepresentationSha1DigestUnitTest.java b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/sha1/HexRepresentationSha1DigestUnitTest.java new file mode 100644 index 0000000000..f2c346707e --- /dev/null +++ b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/sha1/HexRepresentationSha1DigestUnitTest.java @@ -0,0 +1,42 @@ +package com.baeldung.crypto.sha1; + +import static org.junit.jupiter.api.Assertions.*; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import org.apache.commons.codec.digest.DigestUtils; +import org.junit.jupiter.api.Test; + +import com.google.common.hash.Hashing; + +public class HexRepresentationSha1DigestUnitTest { + + String input = "Hello, World"; + String expectedHexValue = "907d14fb3af2b0d4f18c2d46abe8aedce17367bd"; + + @Test + public void givenMessageDigest_whenUpdatingWithData_thenDigestShouldMatchExpectedValue() throws NoSuchAlgorithmException { + MessageDigest md = MessageDigest.getInstance("SHA-1"); + md.update(input.getBytes(StandardCharsets.UTF_8)); + + StringBuilder hexString = new StringBuilder(); + byte[] digest = md.digest(); + + for (byte b : digest) { + hexString.append(String.format("%02x", b)); + } + assertEquals(expectedHexValue, hexString.toString()); + } + + @Test + public void givenDigestUtils_whenCalculatingSHA1Hex_thenDigestShouldMatchExpectedValue() { + assertEquals(expectedHexValue, DigestUtils.sha1Hex(input)); + } + + @Test + public void givenHashingLibrary_whenCalculatingSHA1Hash_thenDigestShouldMatchExpectedValue() { + assertEquals(expectedHexValue, Hashing.sha1().hashString(input, StandardCharsets.UTF_8).toString()); + } +} From 6311a27f8cb643e199fb8de060eea43d1cc7a589 Mon Sep 17 00:00:00 2001 From: Dmytro Budym <46810751+dbudim@users.noreply.github.com> Date: Tue, 20 Jun 2023 17:53:47 +0200 Subject: [PATCH 076/170] Add code examples for "Convert Java Array to Iterable" (#14144) * Add code examples for "Convert Java Array to Iterable" * fix formatting --- .../IntArrayToIterableConversionUtils.java | 28 +++++++++++++++ ...rrayToIterableConversionUtilsUnitTest.java | 36 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 core-java-modules/core-java-arrays-convert/src/main/java/com/baeldung/array/conversions/IntArrayToIterableConversionUtils.java create mode 100644 core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/IntArrayToIterableConversionUtilsUnitTest.java diff --git a/core-java-modules/core-java-arrays-convert/src/main/java/com/baeldung/array/conversions/IntArrayToIterableConversionUtils.java b/core-java-modules/core-java-arrays-convert/src/main/java/com/baeldung/array/conversions/IntArrayToIterableConversionUtils.java new file mode 100644 index 0000000000..79f15e0ddd --- /dev/null +++ b/core-java-modules/core-java-arrays-convert/src/main/java/com/baeldung/array/conversions/IntArrayToIterableConversionUtils.java @@ -0,0 +1,28 @@ +package com.baeldung.array.conversions; + + +import com.google.common.primitives.Ints; +import org.apache.commons.lang3.ArrayUtils; + +import java.util.Arrays; +import java.util.stream.Collectors; + +public class IntArrayToIterableConversionUtils { + + public static Iterable convertWithStreamToList(int[] array) { + return Arrays.stream(array).boxed().collect(Collectors.toList()); + } + + public static Iterable convertWithStreamIterator(int[] array) { + return () -> Arrays.stream(array).iterator(); + } + + public static Iterable convertWithApacheCommonsAndJavaAsList(int[] array) { + return Arrays.asList(ArrayUtils.toObject(array)); + } + + public static Iterable convertWithGuava(int[] array) { + return Ints.asList(array); + } + +} diff --git a/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/IntArrayToIterableConversionUtilsUnitTest.java b/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/IntArrayToIterableConversionUtilsUnitTest.java new file mode 100644 index 0000000000..f9d8c0db5a --- /dev/null +++ b/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/IntArrayToIterableConversionUtilsUnitTest.java @@ -0,0 +1,36 @@ +package com.baeldung.array.conversions; + +import org.junit.jupiter.api.Test; + +import static com.baeldung.array.conversions.IntArrayToIterableConversionUtils.*; +import static org.junit.Assert.assertTrue; + + +class IntArrayToIterableConversionUtilsUnitTest { + + private int[] ints = new int[]{1, 2, 3, 4, 5}; + + @Test + void whenConvertWithStreamToList_thenGetIterable() { + Iterable integers = convertWithStreamToList(ints); + assertTrue("should be Iterable", integers instanceof Iterable); + } + + @Test + void whenConvertWithStreamIterator_thenGetIterable() { + Iterable integers = convertWithStreamIterator(ints); + assertTrue("should be Iterable", integers instanceof Iterable); + } + + @Test + void whenConvertWithApacheCommonsAndJavaAsList_thenGetIterable() { + Iterable integers = convertWithApacheCommonsAndJavaAsList(ints); + assertTrue("should be Iterable", integers instanceof Iterable); + } + + @Test + void whenConvertWithGuava_thenGetIterable() { + Iterable integers = convertWithGuava(ints); + assertTrue("should be Iterable", integers instanceof Iterable); + } +} \ No newline at end of file From 936a915ad410f14c17baf9227cdcf57af6583f93 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Tue, 20 Jun 2023 19:03:42 +0200 Subject: [PATCH 077/170] JAVA-22212 | upgraded microprofile version (#14259) --- microservices-modules/microprofile/pom.xml | 4 ++-- .../microprofile/LibraryApplication.java | 6 +++--- .../providers/BookListMessageBodyWriter.java | 18 ++++++++-------- .../providers/BookMessageBodyReader.java | 12 +++++------ .../providers/BookMessageBodyWriter.java | 21 ++++++++++--------- .../microprofile/repo/BookManager.java | 2 +- .../microprofile/util/BookMapper.java | 2 +- .../microprofile/web/BookEndpoint.java | 13 ++++++------ .../src/main/liberty/config/server.xml | 6 +++--- 9 files changed, 42 insertions(+), 42 deletions(-) diff --git a/microservices-modules/microprofile/pom.xml b/microservices-modules/microprofile/pom.xml index 24803cb4a4..b2ce768748 100644 --- a/microservices-modules/microprofile/pom.xml +++ b/microservices-modules/microprofile/pom.xml @@ -83,9 +83,9 @@ library ${project.build.directory}/${app.name}-service.jar runnable - 1.2 + 6.0 2.1.2 - 17.0.0.4 + 23.0.0.5 \ No newline at end of file diff --git a/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/LibraryApplication.java b/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/LibraryApplication.java index f5eccf969e..9039cf0234 100644 --- a/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/LibraryApplication.java +++ b/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/LibraryApplication.java @@ -1,8 +1,8 @@ package com.baeldung.microprofile; -import javax.ws.rs.ApplicationPath; -import javax.ws.rs.core.Application; +import jakarta.ws.rs.ApplicationPath; +import jakarta.ws.rs.core.Application; -@ApplicationPath("/library") +@ApplicationPath("library") public class LibraryApplication extends Application { } diff --git a/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/providers/BookListMessageBodyWriter.java b/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/providers/BookListMessageBodyWriter.java index f7d0bfc5f7..a8a340d1f0 100644 --- a/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/providers/BookListMessageBodyWriter.java +++ b/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/providers/BookListMessageBodyWriter.java @@ -3,15 +3,15 @@ package com.baeldung.microprofile.providers; import com.baeldung.microprofile.model.Book; import com.baeldung.microprofile.util.BookMapper; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonWriter; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonWriter; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyWriter; +import jakarta.ws.rs.ext.Provider; import java.io.IOException; import java.io.OutputStream; import java.lang.annotation.Annotation; diff --git a/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/providers/BookMessageBodyReader.java b/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/providers/BookMessageBodyReader.java index 26ce4c1b64..3fe6a4a1e4 100644 --- a/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/providers/BookMessageBodyReader.java +++ b/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/providers/BookMessageBodyReader.java @@ -3,12 +3,12 @@ package com.baeldung.microprofile.providers; import com.baeldung.microprofile.model.Book; import com.baeldung.microprofile.util.BookMapper; -import javax.ws.rs.Consumes; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; import java.io.IOException; import java.io.InputStream; import java.lang.annotation.Annotation; diff --git a/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/providers/BookMessageBodyWriter.java b/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/providers/BookMessageBodyWriter.java index 9bc6e89958..3d531c370c 100644 --- a/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/providers/BookMessageBodyWriter.java +++ b/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/providers/BookMessageBodyWriter.java @@ -2,16 +2,16 @@ package com.baeldung.microprofile.providers; import com.baeldung.microprofile.model.Book; import com.baeldung.microprofile.util.BookMapper; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonWriter; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyWriter; +import jakarta.ws.rs.ext.Provider; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonWriter; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; import java.io.IOException; import java.io.OutputStream; import java.lang.annotation.Annotation; @@ -47,7 +47,8 @@ public class BookMessageBodyWriter implements MessageBodyWriter { * @throws WebApplicationException */ @Override - public void writeTo(Book book, Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { + public void writeTo(Book book, Class type, Type genericType, Annotation[] annotations, MediaType mediaType, + MultivaluedMap httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { JsonWriter jsonWriter = Json.createWriter(entityStream); JsonObject jsonObject = BookMapper.map(book); jsonWriter.writeObject(jsonObject); diff --git a/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/repo/BookManager.java b/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/repo/BookManager.java index 924cf0ce71..d46506af00 100644 --- a/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/repo/BookManager.java +++ b/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/repo/BookManager.java @@ -1,8 +1,8 @@ package com.baeldung.microprofile.repo; import com.baeldung.microprofile.model.Book; +import jakarta.enterprise.context.ApplicationScoped; -import javax.enterprise.context.ApplicationScoped; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; diff --git a/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/util/BookMapper.java b/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/util/BookMapper.java index 861b172299..5eb7439678 100644 --- a/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/util/BookMapper.java +++ b/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/util/BookMapper.java @@ -1,8 +1,8 @@ package com.baeldung.microprofile.util; import com.baeldung.microprofile.model.Book; +import jakarta.json.*; -import javax.json.*; import java.io.InputStream; import java.util.List; diff --git a/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/web/BookEndpoint.java b/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/web/BookEndpoint.java index 13143a5644..f5dac2f1b7 100644 --- a/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/web/BookEndpoint.java +++ b/microservices-modules/microprofile/src/main/java/com/baeldung/microprofile/web/BookEndpoint.java @@ -2,13 +2,12 @@ package com.baeldung.microprofile.web; import com.baeldung.microprofile.model.Book; import com.baeldung.microprofile.repo.BookManager; - -import javax.enterprise.context.RequestScoped; -import javax.inject.Inject; -import javax.ws.rs.*; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriBuilder; +import jakarta.enterprise.context.RequestScoped; +import jakarta.inject.Inject; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriBuilder; @Path("books") @RequestScoped diff --git a/microservices-modules/microprofile/src/main/liberty/config/server.xml b/microservices-modules/microprofile/src/main/liberty/config/server.xml index 2b855bee05..084c70a27b 100644 --- a/microservices-modules/microprofile/src/main/liberty/config/server.xml +++ b/microservices-modules/microprofile/src/main/liberty/config/server.xml @@ -1,8 +1,8 @@ - jaxrs-2.0 - cdi-1.2 - jsonp-1.0 + jakartaee-10.0 + jsonp-2.1 + cdi-4.0 From c0171ff7ce8b9c02c475fa14fd25cdf8c3293e60 Mon Sep 17 00:00:00 2001 From: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Date: Tue, 20 Jun 2023 20:28:00 +0300 Subject: [PATCH 078/170] Upgrade spring-cloud-contract, spring-cloud-data-flow to JDK 17 (#14263) * Upgrade spring-cloud-contract, spring-cloud-data-flow to JDK 17 * JAVA-22207 Refactored groovy version --- pom.xml | 2 ++ spring-cloud-modules/pom.xml | 4 +-- .../spring-cloud-contract/pom.xml | 2 +- .../spring-cloud-contract-consumer/pom.xml | 10 ++++++ .../spring-cloud-contract-producer/pom.xml | 16 +++++++--- .../data-flow-server/pom.xml | 32 ++++++++----------- 6 files changed, 40 insertions(+), 26 deletions(-) diff --git a/pom.xml b/pom.xml index b8bc85d634..e1d97532c6 100644 --- a/pom.xml +++ b/pom.xml @@ -730,6 +730,8 @@ spring-batch-2 spring-boot-rest spring-drools + spring-cloud-modules/spring-cloud-contract + spring-cloud-modules/spring-cloud-data-flow spring-exceptions spring-jenkins-pipeline spring-core diff --git a/spring-cloud-modules/pom.xml b/spring-cloud-modules/pom.xml index dafc5b628e..3fd2f118dc 100644 --- a/spring-cloud-modules/pom.xml +++ b/spring-cloud-modules/pom.xml @@ -32,7 +32,7 @@ spring-cloud-aws spring-cloud-consul spring-cloud-zuul-eureka-integration - spring-cloud-contract + spring-cloud-kubernetes spring-cloud-open-service-broker spring-cloud-archaius @@ -52,7 +52,7 @@ spring-cloud-dapr spring-cloud-docker spring-cloud-bus - spring-cloud-data-flow + spring-cloud-sleuth spring-cloud-open-telemetry spring-cloud-azure diff --git a/spring-cloud-modules/spring-cloud-contract/pom.xml b/spring-cloud-modules/spring-cloud-contract/pom.xml index bfbac19a81..7a9c8c32cd 100644 --- a/spring-cloud-modules/spring-cloud-contract/pom.xml +++ b/spring-cloud-modules/spring-cloud-contract/pom.xml @@ -60,7 +60,7 @@ - 2.1.1.RELEASE + 4.0.3 2.1.4.RELEASE 2.17.1 diff --git a/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-consumer/pom.xml b/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-consumer/pom.xml index b561000a83..680e2e1795 100644 --- a/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-consumer/pom.xml +++ b/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-consumer/pom.xml @@ -40,6 +40,16 @@ ${project.parent.version} test + + io.rest-assured + rest-assured + + + org.codehaus.groovy + groovy-xml + + + \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-producer/pom.xml b/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-producer/pom.xml index b80b86580f..35dd9596f7 100644 --- a/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-producer/pom.xml +++ b/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-producer/pom.xml @@ -29,6 +29,16 @@ org.springframework.boot spring-boot-starter-data-rest + + io.rest-assured + rest-assured + + + org.codehaus.groovy + groovy-xml + + + @@ -36,7 +46,7 @@ org.springframework.cloud spring-cloud-contract-maven-plugin - ${spring-cloud.version} + 2.1.1.RELEASE true com.baeldung.spring.cloud.springcloudcontractproducer.BaseTestClass @@ -46,8 +56,4 @@ - - 2.1.1.RELEASE - - \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml b/spring-cloud-modules/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml index 9b33411aaa..73b5aeb26d 100644 --- a/spring-cloud-modules/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml +++ b/spring-cloud-modules/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml @@ -17,13 +17,6 @@ - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - org.springframework.cloud spring-cloud-dataflow-dependencies @@ -31,13 +24,6 @@ pom import - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud-dependencies.version} - pom - import - @@ -45,6 +31,7 @@ org.springframework.cloud spring-cloud-starter-dataflow-server-local + 1.7.4.RELEASE org.hibernate @@ -62,13 +49,22 @@ ${byte-buddy.version} test + + org.codehaus.groovy + groovy + ${groovy.version} + + + org.springframework.session + spring-session-data-redis + - 1.3.1.RELEASE - Edgware.SR6 - 5.2.12.Final - 1.5.22.RELEASE + 2.0.0.RELEASE + 5.6.0.Final + 2.1.4.RELEASE + 3.0.8 \ No newline at end of file From 86932cba3d447266596cfe9a92c65cd455b898f6 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Tue, 20 Jun 2023 20:30:45 +0300 Subject: [PATCH 079/170] JAVA-20168 Migrating spring-jpa (#14257) * JAVA-20168 Migrating spring-jpa * JAVA-20168 Migrate spring-jpa-2 * JAVA-20168 Remove unneeded annotation --------- Co-authored-by: timis1 --- persistence-modules/pom.xml | 5 +- persistence-modules/spring-jpa-2/pom.xml | 21 ++++-- .../hibernate/bootstrap/HibernateXMLConf.java | 12 ---- .../hibernate/bootstrap/model/TestEntity.java | 4 +- .../com/baeldung/manytomany/model/Course.java | 2 +- .../manytomany/model/CourseRating.java | 2 +- .../manytomany/model/CourseRatingKey.java | 4 +- .../manytomany/model/CourseRegistration.java | 2 +- .../baeldung/manytomany/model/Student.java | 2 +- .../baeldung/manytomanyremoval/Author.java | 2 +- .../com/baeldung/manytomanyremoval/Book.java | 3 +- .../baeldung/manytomanyremoval/Category.java | 2 +- .../com/baeldung/manytomanyremoval/Post.java | 3 +- .../multitenant/config/TenantFilter.java | 4 +- .../baeldung/multitenant/domain/Employee.java | 12 ++-- .../security/AuthenticationFilter.java | 10 +-- .../security/AuthenticationService.java | 4 +- .../multitenant/security/LoginFilter.java | 8 +-- .../security/SecurityConfiguration.java | 66 ++++++++++--------- .../spring/dao/generics/AbstractJpaDAO.java | 4 +- .../com/baeldung/spring/dao/generics/Foo.java | 2 +- .../com/baeldung/spring/hibernate/Foo.java | 2 +- .../baeldung/spring/transaction/Course.java | 8 +-- .../resources/persistence-mysql.properties | 2 +- .../HibernateBootstrapIntegrationTest.java | 16 ++--- .../HibernateXMLBootstrapIntegrationTest.java | 2 +- .../manytomany/ManyToManyIntegrationTest.java | 4 +- .../ManyToManyTestConfiguration.java | 2 +- .../BidirectionalRemovalUnitTest.java | 2 +- .../UnidirectionalRemovalUnitTest.java | 2 +- persistence-modules/spring-jpa/pom.xml | 35 +++++----- .../java/com/baeldung/annotations/Person.java | 14 ++-- .../annotations/PersonRepository.java | 2 +- .../baeldung/config/PersistenceJPAConfig.java | 2 +- .../com/baeldung/config/SpringWebConfig.java | 3 +- .../com/baeldung/config/StudentJpaConfig.java | 2 +- .../inmemory/persistence/model/KVTag.java | 2 +- .../persistence/model/LocationTag.java | 2 +- .../persistence/model/ManyStudent.java | 2 +- .../inmemory/persistence/model/ManyTag.java | 2 +- .../inmemory/persistence/model/SkillTag.java | 2 +- .../inmemory/persistence/model/Student.java | 6 +- .../persistence/dao/AbstractJpaDAO.java | 4 +- .../com/baeldung/persistence/model/Bar.java | 18 ++--- .../com/baeldung/persistence/model/Foo.java | 2 +- .../multiple/model/user/Possession.java | 2 +- .../persistence/multiple/model/user/User.java | 2 +- .../java/com/baeldung/sqlfiles/Country.java | 10 +-- .../resources/persistence-mysql.properties | 2 +- .../resources/persistence-student.properties | 2 +- .../src/test/java/META-INF/persistence.xml | 10 +-- .../AdvancedTaggingIntegrationTest.java | 2 +- .../repository/InMemoryDBIntegrationTest.java | 2 +- ...oPaginationPersistenceIntegrationTest.java | 14 ++-- .../FooServiceSortingIntegrationTest.java | 14 ++-- ...eSortingWitNullsManualIntegrationTest.java | 6 +- 56 files changed, 188 insertions(+), 190 deletions(-) diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 12db5cbc5f..9eb7ca1f1d 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -66,7 +66,6 @@ spring-data-arangodb spring-data-cassandra spring-data-cassandra-test - spring-data-cosmosdb spring-data-couchbase-2 spring-data-dynamodb @@ -99,8 +98,8 @@ spring-data-solr - + spring-jpa + spring-jpa-2 spring-jdbc spring-jooq spring-mybatis diff --git a/persistence-modules/spring-jpa-2/pom.xml b/persistence-modules/spring-jpa-2/pom.xml index 974dd41df9..9abf888fb2 100644 --- a/persistence-modules/spring-jpa-2/pom.xml +++ b/persistence-modules/spring-jpa-2/pom.xml @@ -71,7 +71,7 @@ org.postgresql postgresql - 42.4.0 + ${postgresql.version} runtime @@ -97,15 +97,26 @@ ${org.springframework.version} test + + com.fasterxml.jackson.core + jackson-databind + ${jakson-databind.version} + + + com.fasterxml.jackson.core + jackson-core + ${jakson-core.version} + - 5.2.0.RELEASE - 2.2.6.RELEASE + 6.0.9 + 3.1.0 - 9.0.0.M26 - 2.1.214 + 10.1.9 + 2.15.1 + 2.14.2 \ No newline at end of file diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/hibernate/bootstrap/HibernateXMLConf.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/hibernate/bootstrap/HibernateXMLConf.java index b3e979478f..f933ddd7ee 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/hibernate/bootstrap/HibernateXMLConf.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/hibernate/bootstrap/HibernateXMLConf.java @@ -1,21 +1,9 @@ package com.baeldung.hibernate.bootstrap; -import com.google.common.base.Preconditions; -import org.apache.tomcat.dbcp.dbcp2.BasicDataSource; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; -import org.springframework.context.annotation.PropertySource; -import org.springframework.core.env.Environment; -import org.springframework.orm.hibernate5.HibernateTransactionManager; -import org.springframework.orm.hibernate5.LocalSessionFactoryBean; -import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; -import javax.sql.DataSource; -import java.util.Properties; - @Configuration @EnableTransactionManagement @ImportResource({ "classpath:hibernate5Configuration.xml" }) diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/hibernate/bootstrap/model/TestEntity.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/hibernate/bootstrap/model/TestEntity.java index cae41db831..d260fed7a1 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/hibernate/bootstrap/model/TestEntity.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/hibernate/bootstrap/model/TestEntity.java @@ -1,7 +1,7 @@ package com.baeldung.hibernate.bootstrap.model; -import javax.persistence.Entity; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; @Entity public class TestEntity { diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/Course.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/Course.java index d824505629..9b035603c2 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/Course.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/Course.java @@ -1,6 +1,6 @@ package com.baeldung.manytomany.model; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.HashSet; import java.util.Set; diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/CourseRating.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/CourseRating.java index b89cc1dae9..6f6ec98482 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/CourseRating.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/CourseRating.java @@ -1,6 +1,6 @@ package com.baeldung.manytomany.model; -import javax.persistence.*; +import jakarta.persistence.*; @Entity @Table(name = "course_rating") diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/CourseRatingKey.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/CourseRatingKey.java index a4b2df9b07..e9aa5d5bfa 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/CourseRatingKey.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/CourseRatingKey.java @@ -1,7 +1,7 @@ package com.baeldung.manytomany.model; -import javax.persistence.Column; -import javax.persistence.Embeddable; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; import java.io.Serializable; @Embeddable diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/CourseRegistration.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/CourseRegistration.java index ba914b564d..fc070287eb 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/CourseRegistration.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/CourseRegistration.java @@ -1,6 +1,6 @@ package com.baeldung.manytomany.model; -import javax.persistence.*; +import jakarta.persistence.*; import java.time.LocalDateTime; @Entity diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/Student.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/Student.java index 53c5d88a57..1f9c0d1d72 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/Student.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/Student.java @@ -1,6 +1,6 @@ package com.baeldung.manytomany.model; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.HashSet; import java.util.Set; diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomanyremoval/Author.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomanyremoval/Author.java index d9906a21cd..ed102ffd77 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomanyremoval/Author.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomanyremoval/Author.java @@ -1,6 +1,6 @@ package com.baeldung.manytomanyremoval; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.HashSet; import java.util.Set; diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomanyremoval/Book.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomanyremoval/Book.java index 4b49acd000..6fd56b1b88 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomanyremoval/Book.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomanyremoval/Book.java @@ -1,7 +1,6 @@ package com.baeldung.manytomanyremoval; - -import javax.persistence.*; +import jakarta.persistence.*; import java.util.HashSet; import java.util.Set; diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomanyremoval/Category.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomanyremoval/Category.java index f7202f544c..c1bc5e4b16 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomanyremoval/Category.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomanyremoval/Category.java @@ -1,6 +1,6 @@ package com.baeldung.manytomanyremoval; -import javax.persistence.*; +import jakarta.persistence.*; @Entity @Table(name = "category") diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomanyremoval/Post.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomanyremoval/Post.java index d229a9d0d7..21d059e50f 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomanyremoval/Post.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomanyremoval/Post.java @@ -1,7 +1,6 @@ package com.baeldung.manytomanyremoval; - -import javax.persistence.*; +import jakarta.persistence.*; import java.util.HashSet; import java.util.Set; diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/config/TenantFilter.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/config/TenantFilter.java index 3fbb5026f7..77ebced103 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/config/TenantFilter.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/config/TenantFilter.java @@ -4,8 +4,8 @@ import com.baeldung.multitenant.security.AuthenticationService; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; @Component diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/domain/Employee.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/domain/Employee.java index 883b70ca01..bedb1383a2 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/domain/Employee.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/domain/Employee.java @@ -1,11 +1,11 @@ package com.baeldung.multitenant.domain; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; @Entity @Table(name = "employee") diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/AuthenticationFilter.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/AuthenticationFilter.java index fa6bcfb5a0..f953bbc625 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/AuthenticationFilter.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/AuthenticationFilter.java @@ -4,11 +4,11 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.filter.GenericFilterBean; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; public class AuthenticationFilter extends GenericFilterBean { 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 302058882d..00db7eebc4 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 @@ -5,8 +5,8 @@ import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.util.Collections; import java.util.Date; diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/LoginFilter.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/LoginFilter.java index 9f6cbe6e16..fffa49d5b3 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/LoginFilter.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/LoginFilter.java @@ -9,10 +9,10 @@ import org.springframework.security.core.GrantedAuthority; import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Collection; import java.util.Collections; diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/SecurityConfiguration.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/SecurityConfiguration.java index 98c6a9c58d..acad0d61e4 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/SecurityConfiguration.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/SecurityConfiguration.java @@ -2,32 +2,39 @@ package com.baeldung.multitenant.security; 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.authentication.AuthenticationManager; +import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer; import org.springframework.security.config.http.SessionCreationPolicy; +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.authentication.UsernamePasswordAuthenticationFilter; @Configuration @EnableWebSecurity -public class SecurityConfiguration extends WebSecurityConfigurerAdapter { +public class SecurityConfiguration { - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication() - .passwordEncoder(passwordEncoder()) - .withUser("user") - .password(passwordEncoder().encode("baeldung")) - .roles("tenant_1"); + @Bean + public InMemoryUserDetailsManager userDetailsService() { + UserDetails user1 = User + .withUsername("user") + .password(passwordEncoder().encode("baeldung")) + .roles("tenant_1") + .build(); - auth.inMemoryAuthentication() - .passwordEncoder(passwordEncoder()) - .withUser("admin") - .password(passwordEncoder().encode("baeldung")) - .roles("tenant_2"); + UserDetails user2 = User + .withUsername("admin") + .password(passwordEncoder().encode("baeldung")) + .roles("tenant_2") + .build(); + return new InMemoryUserDetailsManager(user1, user2); } @Bean @@ -35,22 +42,19 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { return new BCryptPasswordEncoder(); } - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + final AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class); http - .authorizeRequests() - .antMatchers("/login").permitAll() - .anyRequest().authenticated() - .and() - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .and() - .addFilterBefore(new LoginFilter("/login", authenticationManager()), - UsernamePasswordAuthenticationFilter.class) - .addFilterBefore(new AuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) - .csrf().disable() - .headers().frameOptions().disable() - .and() - .httpBasic(); + .authorizeHttpRequests(authorize -> + authorize.requestMatchers("/login").permitAll().anyRequest().authenticated()) + .sessionManagement(securityContext -> securityContext.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + .addFilterBefore(new LoginFilter("/login", authenticationManager), UsernamePasswordAuthenticationFilter.class) + .addFilterBefore(new AuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) + .csrf(AbstractHttpConfigurer::disable) + .headers(header -> header.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) + .httpBasic(Customizer.withDefaults()); + + return http.build(); } } diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/spring/dao/generics/AbstractJpaDAO.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/spring/dao/generics/AbstractJpaDAO.java index e68a9281a0..01a83b8990 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/spring/dao/generics/AbstractJpaDAO.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/spring/dao/generics/AbstractJpaDAO.java @@ -1,7 +1,7 @@ package com.baeldung.spring.dao.generics; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import java.io.Serializable; import java.util.List; diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/spring/dao/generics/Foo.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/spring/dao/generics/Foo.java index 33284d9b8e..113b8d3125 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/spring/dao/generics/Foo.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/spring/dao/generics/Foo.java @@ -2,7 +2,7 @@ package com.baeldung.spring.dao.generics; import org.hibernate.annotations.CacheConcurrencyStrategy; -import javax.persistence.*; +import jakarta.persistence.*; import java.io.Serializable; @Entity diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/spring/hibernate/Foo.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/spring/hibernate/Foo.java index f92b510071..ae4f8e6722 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/spring/hibernate/Foo.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/spring/hibernate/Foo.java @@ -1,6 +1,6 @@ package com.baeldung.spring.hibernate; -import javax.persistence.*; +import jakarta.persistence.*; import java.io.Serializable; @Entity diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/spring/transaction/Course.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/spring/transaction/Course.java index 5add1e4a99..90a53240fb 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/spring/transaction/Course.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/spring/transaction/Course.java @@ -2,10 +2,10 @@ package com.baeldung.spring.transaction; import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "course") diff --git a/persistence-modules/spring-jpa-2/src/main/resources/persistence-mysql.properties b/persistence-modules/spring-jpa-2/src/main/resources/persistence-mysql.properties index 9ba4f7602a..65a6e0dd10 100644 --- a/persistence-modules/spring-jpa-2/src/main/resources/persistence-mysql.properties +++ b/persistence-modules/spring-jpa-2/src/main/resources/persistence-mysql.properties @@ -5,7 +5,7 @@ jdbc.user=tutorialuser jdbc.pass=tutorialmy5ql # hibernate.X -hibernate.dialect=org.hibernate.dialect.MySQL5Dialect +hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.show_sql=false hibernate.hbm2ddl.auto=create-drop diff --git a/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/hibernate/bootstrap/HibernateBootstrapIntegrationTest.java b/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/hibernate/bootstrap/HibernateBootstrapIntegrationTest.java index c41423643a..4c18285baf 100644 --- a/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/hibernate/bootstrap/HibernateBootstrapIntegrationTest.java +++ b/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/hibernate/bootstrap/HibernateBootstrapIntegrationTest.java @@ -4,14 +4,12 @@ import com.baeldung.hibernate.bootstrap.model.TestEntity; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.junit.Assert; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.Commit; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.support.AnnotationConfigContextLoader; import org.springframework.test.context.transaction.TestTransaction; import org.springframework.transaction.annotation.Transactional; @@ -33,7 +31,7 @@ public class HibernateBootstrapIntegrationTest { TestEntity newEntity = new TestEntity(); newEntity.setId(1); - session.save(newEntity); + session.persist(newEntity); TestEntity searchEntity = session.find(TestEntity.class, 1); @@ -49,7 +47,7 @@ public class HibernateBootstrapIntegrationTest { TestEntity newEntity = new TestEntity(); newEntity.setId(1); - session.save(newEntity); + session.persist(newEntity); TestEntity searchEntity = session.find(TestEntity.class, 1); @@ -74,7 +72,7 @@ public class HibernateBootstrapIntegrationTest { Assert.assertNotNull(searchEntity); - session.delete(searchEntity); + session.remove(searchEntity); session.flush(); TestTransaction.end(); @@ -90,7 +88,7 @@ public class HibernateBootstrapIntegrationTest { Assert.assertNotNull(searchEntity); - session.delete(searchEntity); + session.remove(searchEntity); session.flush(); assertTrue(TestTransaction.isActive()); @@ -121,7 +119,7 @@ public class HibernateBootstrapIntegrationTest { TestEntity newEntity = new TestEntity(); newEntity.setId(1); - session.save(newEntity); + session.persist(newEntity); TestEntity searchEntity = session.find(TestEntity.class, 1); @@ -145,7 +143,7 @@ public class HibernateBootstrapIntegrationTest { Assert.assertNotNull(searchEntity); - session.delete(searchEntity); + session.remove(searchEntity); session.flush(); TestTransaction.flagForRollback(); @@ -162,7 +160,7 @@ public class HibernateBootstrapIntegrationTest { Assert.assertNotNull(searchEntity); - session.delete(searchEntity); + session.remove(searchEntity); session.flush(); assertTrue(TestTransaction.isActive()); diff --git a/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/hibernate/bootstrap/HibernateXMLBootstrapIntegrationTest.java b/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/hibernate/bootstrap/HibernateXMLBootstrapIntegrationTest.java index 5b811ad576..d4ec1fe7ab 100644 --- a/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/hibernate/bootstrap/HibernateXMLBootstrapIntegrationTest.java +++ b/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/hibernate/bootstrap/HibernateXMLBootstrapIntegrationTest.java @@ -26,7 +26,7 @@ public class HibernateXMLBootstrapIntegrationTest { TestEntity newEntity = new TestEntity(); newEntity.setId(1); - session.save(newEntity); + session.persist(newEntity); TestEntity searchEntity = session.find(TestEntity.class, 1); diff --git a/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomany/ManyToManyIntegrationTest.java b/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomany/ManyToManyIntegrationTest.java index f5b02ec2c1..ee18853110 100644 --- a/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomany/ManyToManyIntegrationTest.java +++ b/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomany/ManyToManyIntegrationTest.java @@ -11,8 +11,8 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; diff --git a/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomany/ManyToManyTestConfiguration.java b/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomany/ManyToManyTestConfiguration.java index fa12828074..fb19d477fd 100644 --- a/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomany/ManyToManyTestConfiguration.java +++ b/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomany/ManyToManyTestConfiguration.java @@ -11,7 +11,7 @@ import org.springframework.orm.jpa.JpaVendorAdapter; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; -import javax.persistence.EntityManagerFactory; +import jakarta.persistence.EntityManagerFactory; import javax.sql.DataSource; import java.util.HashMap; import java.util.Map; diff --git a/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomanyremoval/BidirectionalRemovalUnitTest.java b/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomanyremoval/BidirectionalRemovalUnitTest.java index f214fcdc2a..4e26429b14 100644 --- a/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomanyremoval/BidirectionalRemovalUnitTest.java +++ b/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomanyremoval/BidirectionalRemovalUnitTest.java @@ -10,7 +10,7 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.transaction.annotation.Transactional; -import javax.persistence.EntityManager; +import jakarta.persistence.EntityManager; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = TestContextConfig.class) diff --git a/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomanyremoval/UnidirectionalRemovalUnitTest.java b/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomanyremoval/UnidirectionalRemovalUnitTest.java index b23b589fb7..16ba7b0687 100644 --- a/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomanyremoval/UnidirectionalRemovalUnitTest.java +++ b/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomanyremoval/UnidirectionalRemovalUnitTest.java @@ -10,7 +10,7 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.transaction.annotation.Transactional; -import javax.persistence.EntityManager; +import jakarta.persistence.EntityManager; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = TestContextConfig.class) diff --git a/persistence-modules/spring-jpa/pom.xml b/persistence-modules/spring-jpa/pom.xml index 77074e835a..c08e4f823a 100644 --- a/persistence-modules/spring-jpa/pom.xml +++ b/persistence-modules/spring-jpa/pom.xml @@ -76,21 +76,21 @@ ${hibernate-validator.version} - javax.el - javax.el-api - ${javax.el-api.version} + org.glassfish.expressly + expressly + ${expressly-language.version} - javax.servlet - jstl - ${jstl.version} + jakarta.servlet.jsp.jstl + jakarta.servlet.jsp.jstl-api + ${jakarta-servlet-jpa-jstl-api.version} - javax.servlet - servlet-api + jakarta.servlet + jakarta.servlet-api + ${jakarta.servlet-api.version} provided - ${javax.servlet.servlet-api.version} @@ -115,17 +115,18 @@ - 5.1.5.RELEASE - 3.21.0-GA - 6.0.6 - 2.1.5.RELEASE + 6.0.6 + 3.29.2-GA + 8.0.33 + 3.1.0 - 2.5 + 6.0.0 - 6.0.15.Final - 1.4.01 - 2.2.5 + 8.0.0.Final + 2.0.2 2.1.214 + 5.0.0 + 3.0.0 \ No newline at end of file diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/annotations/Person.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/annotations/Person.java index b881535e05..8a6ae38886 100644 --- a/persistence-modules/spring-jpa/src/main/java/com/baeldung/annotations/Person.java +++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/annotations/Person.java @@ -2,11 +2,11 @@ package com.baeldung.annotations; import java.util.Date; -import javax.persistence.Entity; -import javax.persistence.NamedStoredProcedureQueries; -import javax.persistence.NamedStoredProcedureQuery; -import javax.persistence.ParameterMode; -import javax.persistence.StoredProcedureParameter; +import jakarta.persistence.Entity; +import jakarta.persistence.NamedStoredProcedureQueries; +import jakarta.persistence.NamedStoredProcedureQuery; +import jakarta.persistence.ParameterMode; +import jakarta.persistence.StoredProcedureParameter; import com.baeldung.persistence.multiple.model.user.User; import org.springframework.data.annotation.CreatedBy; @@ -16,13 +16,13 @@ import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.Transient; @Entity -@NamedStoredProcedureQueries({ +@NamedStoredProcedureQueries({ @NamedStoredProcedureQuery( name = "count_by_name", procedureName = "person.count_by_name", parameters = { @StoredProcedureParameter( - mode = ParameterMode.IN, + mode = ParameterMode.IN, name = "name", type = String.class), @StoredProcedureParameter( diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/annotations/PersonRepository.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/annotations/PersonRepository.java index 77b7067f11..b6a1a41e48 100644 --- a/persistence-modules/spring-jpa/src/main/java/com/baeldung/annotations/PersonRepository.java +++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/annotations/PersonRepository.java @@ -1,6 +1,6 @@ package com.baeldung.annotations; -import javax.persistence.LockModeType; +import jakarta.persistence.LockModeType; import org.springframework.data.jpa.repository.Lock; import org.springframework.data.jpa.repository.Modifying; diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/config/PersistenceJPAConfig.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/config/PersistenceJPAConfig.java index 4eda4d9274..69067901f1 100644 --- a/persistence-modules/spring-jpa/src/main/java/com/baeldung/config/PersistenceJPAConfig.java +++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/config/PersistenceJPAConfig.java @@ -2,7 +2,7 @@ package com.baeldung.config; import java.util.Properties; -import javax.persistence.EntityManagerFactory; +import jakarta.persistence.EntityManagerFactory; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/config/SpringWebConfig.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/config/SpringWebConfig.java index 475970d1f0..de51cf3e23 100644 --- a/persistence-modules/spring-jpa/src/main/java/com/baeldung/config/SpringWebConfig.java +++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/config/SpringWebConfig.java @@ -4,14 +4,13 @@ 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.WebMvcConfigurerAdapter; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; @EnableWebMvc @Configuration @ComponentScan({ "com.baeldung.web" }) -public class SpringWebConfig extends WebMvcConfigurerAdapter { +public class SpringWebConfig { @Bean public InternalResourceViewResolver viewResolver() { diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/config/StudentJpaConfig.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/config/StudentJpaConfig.java index 08f37ea806..692daea66d 100644 --- a/persistence-modules/spring-jpa/src/main/java/com/baeldung/config/StudentJpaConfig.java +++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/config/StudentJpaConfig.java @@ -2,7 +2,7 @@ package com.baeldung.config; import java.util.Properties; -import javax.persistence.EntityManagerFactory; +import jakarta.persistence.EntityManagerFactory; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/KVTag.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/KVTag.java index 1fc186f4ce..29be4eb944 100644 --- a/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/KVTag.java +++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/KVTag.java @@ -1,6 +1,6 @@ package com.baeldung.inmemory.persistence.model; -import javax.persistence.Embeddable; +import jakarta.persistence.Embeddable; @Embeddable public class KVTag { diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/LocationTag.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/LocationTag.java index b12ad9fbd1..8591bc7543 100644 --- a/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/LocationTag.java +++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/LocationTag.java @@ -1,6 +1,6 @@ package com.baeldung.inmemory.persistence.model; -import javax.persistence.Embeddable; +import jakarta.persistence.Embeddable; @Embeddable public class LocationTag { diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/ManyStudent.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/ManyStudent.java index 190740d582..8334cd2453 100644 --- a/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/ManyStudent.java +++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/ManyStudent.java @@ -1,6 +1,6 @@ package com.baeldung.inmemory.persistence.model; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.HashSet; import java.util.Set; diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/ManyTag.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/ManyTag.java index 5af898f7df..a320a0e5ab 100644 --- a/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/ManyTag.java +++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/ManyTag.java @@ -1,6 +1,6 @@ package com.baeldung.inmemory.persistence.model; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.HashSet; import java.util.Set; diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/SkillTag.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/SkillTag.java index 738b5d0b36..b035164f2e 100644 --- a/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/SkillTag.java +++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/SkillTag.java @@ -1,6 +1,6 @@ package com.baeldung.inmemory.persistence.model; -import javax.persistence.Embeddable; +import jakarta.persistence.Embeddable; @Embeddable public class SkillTag { diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/Student.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/Student.java index f0e824e165..52cdae82f4 100644 --- a/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/Student.java +++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/inmemory/persistence/model/Student.java @@ -2,9 +2,9 @@ package com.baeldung.inmemory.persistence.model; import java.util.ArrayList; import java.util.List; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.Id; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; @Entity public class Student { diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/dao/AbstractJpaDAO.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/dao/AbstractJpaDAO.java index b4827cc7e1..b44dbca3fe 100644 --- a/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/dao/AbstractJpaDAO.java +++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/dao/AbstractJpaDAO.java @@ -3,8 +3,8 @@ package com.baeldung.persistence.dao; import java.io.Serializable; import java.util.List; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; public abstract class AbstractJpaDAO { diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/model/Bar.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/model/Bar.java index 5a88ecc6cf..935623945b 100644 --- a/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/model/Bar.java +++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/model/Bar.java @@ -3,15 +3,15 @@ package com.baeldung.persistence.model; import java.io.Serializable; import java.util.List; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToMany; -import javax.persistence.OrderBy; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OrderBy; @Entity public class Bar implements Serializable { diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/model/Foo.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/model/Foo.java index 7897bba4e4..7a82c16788 100644 --- a/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/model/Foo.java +++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/model/Foo.java @@ -2,7 +2,7 @@ package com.baeldung.persistence.model; import org.hibernate.annotations.CacheConcurrencyStrategy; -import javax.persistence.*; +import jakarta.persistence.*; import java.io.Serializable; @Entity diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/multiple/model/user/Possession.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/multiple/model/user/Possession.java index 6ad6b8e603..f83a1df916 100644 --- a/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/multiple/model/user/Possession.java +++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/multiple/model/user/Possession.java @@ -1,6 +1,6 @@ package com.baeldung.persistence.multiple.model.user; -import javax.persistence.*; +import jakarta.persistence.*; @Entity @Table(schema = "spring_jpa_user") diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/multiple/model/user/User.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/multiple/model/user/User.java index 3ebb1e0156..cc9ae085ad 100644 --- a/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/multiple/model/user/User.java +++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/persistence/multiple/model/user/User.java @@ -1,6 +1,6 @@ package com.baeldung.persistence.multiple.model.user; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.List; @Entity diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/sqlfiles/Country.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/sqlfiles/Country.java index f2be33adfd..f4a7b0e046 100644 --- a/persistence-modules/spring-jpa/src/main/java/com/baeldung/sqlfiles/Country.java +++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/sqlfiles/Country.java @@ -1,11 +1,11 @@ package com.baeldung.sqlfiles; -import static javax.persistence.GenerationType.IDENTITY; +import static jakarta.persistence.GenerationType.IDENTITY; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; @Entity public class Country { diff --git a/persistence-modules/spring-jpa/src/main/resources/persistence-mysql.properties b/persistence-modules/spring-jpa/src/main/resources/persistence-mysql.properties index ef17910b68..45a9813c2d 100644 --- a/persistence-modules/spring-jpa/src/main/resources/persistence-mysql.properties +++ b/persistence-modules/spring-jpa/src/main/resources/persistence-mysql.properties @@ -5,7 +5,7 @@ jdbc.user=tutorialuser jdbc.pass=tutorialmy5ql # hibernate.X -hibernate.dialect=org.hibernate.dialect.MySQL5Dialect +hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.show_sql=false hibernate.hbm2ddl.auto=create-drop hibernate.cache.use_second_level_cache=false diff --git a/persistence-modules/spring-jpa/src/main/resources/persistence-student.properties b/persistence-modules/spring-jpa/src/main/resources/persistence-student.properties index 9a06518238..9da3512c0e 100644 --- a/persistence-modules/spring-jpa/src/main/resources/persistence-student.properties +++ b/persistence-modules/spring-jpa/src/main/resources/persistence-student.properties @@ -3,7 +3,7 @@ jdbc.url=jdbc:mysql://localhost:3306/myDb jdbc.user=tutorialuser jdbc.pass=tutorialpass -hibernate.dialect=org.hibernate.dialect.MySQL5Dialect +hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.show_sql=false hibernate.hbm2ddl.auto=create-drop diff --git a/persistence-modules/spring-jpa/src/test/java/META-INF/persistence.xml b/persistence-modules/spring-jpa/src/test/java/META-INF/persistence.xml index 76a3b61399..4e51f630cb 100644 --- a/persistence-modules/spring-jpa/src/test/java/META-INF/persistence.xml +++ b/persistence-modules/spring-jpa/src/test/java/META-INF/persistence.xml @@ -6,11 +6,11 @@ com.baeldung.persistence.model.Foo com.baeldung.persistence.model.Bar - - - - - + + + + + diff --git a/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/repository/AdvancedTaggingIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/repository/AdvancedTaggingIntegrationTest.java index e98c1fa4a6..d0db8ab667 100644 --- a/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/repository/AdvancedTaggingIntegrationTest.java +++ b/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/repository/AdvancedTaggingIntegrationTest.java @@ -17,7 +17,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.util.Arrays; import java.util.Collections; import java.util.List; diff --git a/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/repository/InMemoryDBIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/repository/InMemoryDBIntegrationTest.java index d8d867792e..a81c982ee5 100644 --- a/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/repository/InMemoryDBIntegrationTest.java +++ b/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/repository/InMemoryDBIntegrationTest.java @@ -11,7 +11,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.util.Arrays; import java.util.List; diff --git a/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java index 66f20a6724..776f33a7d0 100644 --- a/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java +++ b/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java @@ -7,13 +7,13 @@ import static org.junit.Assert.assertThat; import java.util.List; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.TypedQuery; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Root; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Root; import com.baeldung.config.PersistenceJPAConfig; import com.baeldung.persistence.model.Foo; diff --git a/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/service/FooServiceSortingIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/service/FooServiceSortingIntegrationTest.java index 8d1f94edf8..caba654e47 100644 --- a/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/service/FooServiceSortingIntegrationTest.java +++ b/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/service/FooServiceSortingIntegrationTest.java @@ -2,13 +2,13 @@ package com.baeldung.persistence.service; import java.util.List; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import javax.persistence.TypedQuery; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Root; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Root; import com.baeldung.config.PersistenceJPAConfig; import com.baeldung.persistence.model.Bar; diff --git a/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/service/FooServiceSortingWitNullsManualIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/service/FooServiceSortingWitNullsManualIntegrationTest.java index b19259d9df..6ada2b8309 100644 --- a/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/service/FooServiceSortingWitNullsManualIntegrationTest.java +++ b/persistence-modules/spring-jpa/src/test/java/com/baeldung/persistence/service/FooServiceSortingWitNullsManualIntegrationTest.java @@ -5,9 +5,9 @@ import static org.junit.Assert.assertNull; import java.util.List; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; import com.baeldung.config.PersistenceJPAConfig; import com.baeldung.persistence.model.Foo; From 2743b7a4163534b9b755505e888bed19c32110bc Mon Sep 17 00:00:00 2001 From: "thibault.faure" Date: Tue, 20 Jun 2023 19:40:15 +0200 Subject: [PATCH 080/170] BAEL-6358 Code for the Starting the Maven Build From the Point Where It Failed article --- maven-modules/resume-from/business/pom.xml | 28 +++++++++++++++++++ .../business/src/main/java/Main.java | 6 ++++ maven-modules/resume-from/lib/pom.xml | 15 ++++++++++ maven-modules/resume-from/pom.xml | 16 +++++++++++ 4 files changed, 65 insertions(+) create mode 100644 maven-modules/resume-from/business/pom.xml create mode 100644 maven-modules/resume-from/business/src/main/java/Main.java create mode 100644 maven-modules/resume-from/lib/pom.xml create mode 100644 maven-modules/resume-from/pom.xml diff --git a/maven-modules/resume-from/business/pom.xml b/maven-modules/resume-from/business/pom.xml new file mode 100644 index 0000000000..189be12a0f --- /dev/null +++ b/maven-modules/resume-from/business/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + business + 1.0-SNAPSHOT + business + + com.baeldung + resume-from + 1.0-SNAPSHOT + + + + com.baeldung + lib + 1.0-SNAPSHOT + + + + + 11 + 11 + + + + \ No newline at end of file diff --git a/maven-modules/resume-from/business/src/main/java/Main.java b/maven-modules/resume-from/business/src/main/java/Main.java new file mode 100644 index 0000000000..255cde5062 --- /dev/null +++ b/maven-modules/resume-from/business/src/main/java/Main.java @@ -0,0 +1,6 @@ +public class Main { + + public static void main(String[] args) { + System.out.println("Hello world!"); + } +} \ No newline at end of file diff --git a/maven-modules/resume-from/lib/pom.xml b/maven-modules/resume-from/lib/pom.xml new file mode 100644 index 0000000000..1b1dbc2d17 --- /dev/null +++ b/maven-modules/resume-from/lib/pom.xml @@ -0,0 +1,15 @@ + + + 4.0.0 + lib + 1.0-SNAPSHOT + lib + + com.baeldung + resume-from + 1.0-SNAPSHOT + + + \ No newline at end of file diff --git a/maven-modules/resume-from/pom.xml b/maven-modules/resume-from/pom.xml new file mode 100644 index 0000000000..972395cbf2 --- /dev/null +++ b/maven-modules/resume-from/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + com.baeldung + resume-from + 1.0-SNAPSHOT + resume-from + pom + + business + lib + + + \ No newline at end of file From 68f6c191095a4e1e2454db25e0435b41f086d1e5 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Wed, 21 Jun 2023 06:52:00 +0300 Subject: [PATCH 081/170] =?UTF-8?q?JAVA-18148=20Create=20a=20new=20java-na?= =?UTF-8?q?shorn=20project=20from=20the=20existing=20langua=E2=80=A6=20(#1?= =?UTF-8?q?4268)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * JAVA-18148 Create a new java-nashorn project from the existing language-interop * JAVA-18148 Cleanup the project to contain just the python related language interop --------- Co-authored-by: timis1 --- java-nashorn/README.md | 7 ++++ java-nashorn/pom.xml | 30 ++++++++++++++++ .../python/ScriptEngineManagerUtils.java | 34 +++++++++++++++++++ .../src/main/resources/js/bind.js | 0 .../src/main/resources/js/locations.js | 0 .../src/main/resources/js/math_module.js | 0 .../src/main/resources/js/no_such.js | 0 .../src/main/resources/js/script.js | 0 .../src/main/resources/js/trim.js | 0 .../src/main/resources/js/typed_arrays.js | 0 java-nashorn/src/main/resources/logback.xml | 13 +++++++ .../interop/javascript/NashornUnitTest.java | 0 language-interop/README.md | 1 - language-interop/pom.xml | 2 +- pom.xml | 6 ++-- 15 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 java-nashorn/README.md create mode 100644 java-nashorn/pom.xml create mode 100644 java-nashorn/src/main/java/com/baeldung/language/interop/python/ScriptEngineManagerUtils.java rename {language-interop => java-nashorn}/src/main/resources/js/bind.js (100%) rename {language-interop => java-nashorn}/src/main/resources/js/locations.js (100%) rename {language-interop => java-nashorn}/src/main/resources/js/math_module.js (100%) rename {language-interop => java-nashorn}/src/main/resources/js/no_such.js (100%) rename {language-interop => java-nashorn}/src/main/resources/js/script.js (100%) rename {language-interop => java-nashorn}/src/main/resources/js/trim.js (100%) rename {language-interop => java-nashorn}/src/main/resources/js/typed_arrays.js (100%) create mode 100644 java-nashorn/src/main/resources/logback.xml rename {language-interop => java-nashorn}/src/test/java/com/baeldung/language/interop/javascript/NashornUnitTest.java (100%) diff --git a/java-nashorn/README.md b/java-nashorn/README.md new file mode 100644 index 0000000000..b4394fa94b --- /dev/null +++ b/java-nashorn/README.md @@ -0,0 +1,7 @@ +## Language Interop + +This module contains articles about Java interop with other language integrations. + +### Relevant Articles: + +- [Introduction to Nashorn](http://www.baeldung.com/java-nashorn) diff --git a/java-nashorn/pom.xml b/java-nashorn/pom.xml new file mode 100644 index 0000000000..1c1236d77b --- /dev/null +++ b/java-nashorn/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + java-nashorn + 0.0.1-SNAPSHOT + java-nashorn + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + java-nashorn + + + src/main/resources + true + + + src/test/resources + true + + + + + \ No newline at end of file diff --git a/java-nashorn/src/main/java/com/baeldung/language/interop/python/ScriptEngineManagerUtils.java b/java-nashorn/src/main/java/com/baeldung/language/interop/python/ScriptEngineManagerUtils.java new file mode 100644 index 0000000000..7bf07cf598 --- /dev/null +++ b/java-nashorn/src/main/java/com/baeldung/language/interop/python/ScriptEngineManagerUtils.java @@ -0,0 +1,34 @@ +package com.baeldung.language.interop.python; + +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.script.ScriptEngineFactory; +import javax.script.ScriptEngineManager; + +public class ScriptEngineManagerUtils { + + private static final Logger LOGGER = LoggerFactory.getLogger(ScriptEngineManagerUtils.class); + + private ScriptEngineManagerUtils() { + } + + public static void listEngines() { + ScriptEngineManager manager = new ScriptEngineManager(); + List engines = manager.getEngineFactories(); + + for (ScriptEngineFactory engine : engines) { + LOGGER.info("Engine name: {}", engine.getEngineName()); + LOGGER.info("Version: {}", engine.getEngineVersion()); + LOGGER.info("Language: {}", engine.getLanguageName()); + + LOGGER.info("Short Names:"); + for (String names : engine.getNames()) { + LOGGER.info(names); + } + } + } + +} diff --git a/language-interop/src/main/resources/js/bind.js b/java-nashorn/src/main/resources/js/bind.js similarity index 100% rename from language-interop/src/main/resources/js/bind.js rename to java-nashorn/src/main/resources/js/bind.js diff --git a/language-interop/src/main/resources/js/locations.js b/java-nashorn/src/main/resources/js/locations.js similarity index 100% rename from language-interop/src/main/resources/js/locations.js rename to java-nashorn/src/main/resources/js/locations.js diff --git a/language-interop/src/main/resources/js/math_module.js b/java-nashorn/src/main/resources/js/math_module.js similarity index 100% rename from language-interop/src/main/resources/js/math_module.js rename to java-nashorn/src/main/resources/js/math_module.js diff --git a/language-interop/src/main/resources/js/no_such.js b/java-nashorn/src/main/resources/js/no_such.js similarity index 100% rename from language-interop/src/main/resources/js/no_such.js rename to java-nashorn/src/main/resources/js/no_such.js diff --git a/language-interop/src/main/resources/js/script.js b/java-nashorn/src/main/resources/js/script.js similarity index 100% rename from language-interop/src/main/resources/js/script.js rename to java-nashorn/src/main/resources/js/script.js diff --git a/language-interop/src/main/resources/js/trim.js b/java-nashorn/src/main/resources/js/trim.js similarity index 100% rename from language-interop/src/main/resources/js/trim.js rename to java-nashorn/src/main/resources/js/trim.js diff --git a/language-interop/src/main/resources/js/typed_arrays.js b/java-nashorn/src/main/resources/js/typed_arrays.js similarity index 100% rename from language-interop/src/main/resources/js/typed_arrays.js rename to java-nashorn/src/main/resources/js/typed_arrays.js diff --git a/java-nashorn/src/main/resources/logback.xml b/java-nashorn/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/java-nashorn/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/language-interop/src/test/java/com/baeldung/language/interop/javascript/NashornUnitTest.java b/java-nashorn/src/test/java/com/baeldung/language/interop/javascript/NashornUnitTest.java similarity index 100% rename from language-interop/src/test/java/com/baeldung/language/interop/javascript/NashornUnitTest.java rename to java-nashorn/src/test/java/com/baeldung/language/interop/javascript/NashornUnitTest.java diff --git a/language-interop/README.md b/language-interop/README.md index f4f2fc0816..458f34a119 100644 --- a/language-interop/README.md +++ b/language-interop/README.md @@ -5,4 +5,3 @@ This module contains articles about Java interop with other language integration ### Relevant Articles: - [How to Call Python From Java](https://www.baeldung.com/java-working-with-python) -- [Introduction to Nashorn](http://www.baeldung.com/java-nashorn) diff --git a/language-interop/pom.xml b/language-interop/pom.xml index 57dd8bdd9a..95d1183e8b 100644 --- a/language-interop/pom.xml +++ b/language-interop/pom.xml @@ -41,7 +41,7 @@ - 2.7.2 + 2.7.3b1 1.3 diff --git a/pom.xml b/pom.xml index e1d97532c6..e96f6200d9 100644 --- a/pom.xml +++ b/pom.xml @@ -356,7 +356,6 @@ - language-interop libraries-jdk8 @@ -370,6 +369,7 @@ persistence-modules/java-cassandra persistence-modules/spring-data-cassandra-reactive persistence-modules/spring-data-neo4j + java-nashorn @@ -534,7 +534,6 @@ - language-interop libraries-jdk8 @@ -547,6 +546,7 @@ persistence-modules/java-cassandra persistence-modules/spring-data-cassandra-reactive persistence-modules/spring-data-neo4j + java-nashorn @@ -937,6 +937,7 @@ xml xml-2 image-processing + language-interop @@ -1204,6 +1205,7 @@ xml xml-2 image-processing + language-interop From 12e8d48d7e1862f17fb31c29997c94f5e9379a97 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 21 Jun 2023 11:35:12 +0530 Subject: [PATCH 082/170] JAVA-22153 Upgraded parent-spring* versions --- parent-spring-5/pom.xml | 2 +- parent-spring-6/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/parent-spring-5/pom.xml b/parent-spring-5/pom.xml index fd3cd734c6..d03eb3def6 100644 --- a/parent-spring-5/pom.xml +++ b/parent-spring-5/pom.xml @@ -24,7 +24,7 @@ - 5.3.25 + 5.3.28 5.7.3 1.5.10.RELEASE diff --git a/parent-spring-6/pom.xml b/parent-spring-6/pom.xml index d91a12bcc5..77afe2072a 100644 --- a/parent-spring-6/pom.xml +++ b/parent-spring-6/pom.xml @@ -35,7 +35,7 @@ - 6.0.8 + 6.0.10 From f2b2b8546d9bc4677b887bd8b1fee174d2775bc1 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 21 Jun 2023 17:36:02 +0800 Subject: [PATCH 083/170] Update README.md [skip ci] --- core-java-modules/core-java-collections-list-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-list-5/README.md b/core-java-modules/core-java-collections-list-5/README.md index 947cf234b9..99563c3103 100644 --- a/core-java-modules/core-java-collections-list-5/README.md +++ b/core-java-modules/core-java-collections-list-5/README.md @@ -10,3 +10,4 @@ This module contains articles about the Java List collection - [Array vs. List Performance in Java](https://www.baeldung.com/java-array-vs-list-performance) - [Set Default Value for Elements in List](https://www.baeldung.com/java-list-set-default-values) - [Get Unique Values From an ArrayList In Java](https://www.baeldung.com/java-unique-values-arraylist) +- [Converting a Java List to a Json Array](https://www.baeldung.com/java-converting-list-to-json-array) From 313840045d72d50860a2b12dcd23f481326b04ec Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 21 Jun 2023 17:47:03 +0800 Subject: [PATCH 084/170] Update README.md [skip ci] --- testing-modules/testing-assertions/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/testing-modules/testing-assertions/README.md b/testing-modules/testing-assertions/README.md index 55a39ec606..37de3d4929 100644 --- a/testing-modules/testing-assertions/README.md +++ b/testing-modules/testing-assertions/README.md @@ -4,3 +4,4 @@ - [Assert Two Lists for Equality Ignoring Order in Java](https://www.baeldung.com/java-assert-lists-equality-ignore-order) - [Assert That a Java Optional Has a Certain Value](https://www.baeldung.com/java-optional-assert-value) - [Assert That an Object Is From a Specific Type](https://www.baeldung.com/java-assert-object-of-type) +- [Asserting Equality on Two Classes Without an equals() Method](https://www.baeldung.com/java-assert-equality-no-equals) From 2ec227acf01170ac16a7697777b8061552e81202 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 21 Jun 2023 17:53:50 +0800 Subject: [PATCH 085/170] 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 73b88a9885..ac931a108f 100644 --- a/testing-modules/mockito-2/README.md +++ b/testing-modules/mockito-2/README.md @@ -5,3 +5,4 @@ This module contains articles about Mockito ### Relevant Articles: - [Mocking a Singleton With Mockito](https://www.baeldung.com/java-mockito-singleton) - [Resolving Mockito Exception: Wanted But Not Invoked](https://www.baeldung.com/mockito-exception-wanted-but-not-invoked) +- [Matching Null With Mockito](https://www.baeldung.com/mockito-match-null) From 9056b74841e4b01b10f21dd252cb3261483a84c3 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 21 Jun 2023 18:15:41 +0800 Subject: [PATCH 086/170] Create README.md [skip ci] --- aws-modules/aws-s3-v2/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 aws-modules/aws-s3-v2/README.md diff --git a/aws-modules/aws-s3-v2/README.md b/aws-modules/aws-s3-v2/README.md new file mode 100644 index 0000000000..4ec342894e --- /dev/null +++ b/aws-modules/aws-s3-v2/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Listing All AWS S3 Objects in a Bucket Using Java](https://www.baeldung.com/java-aws-s3-list-bucket-objects) From e296c2fc7c09deea037f54f3aa26f5a33d46dfc0 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 21 Jun 2023 18:26:24 +0800 Subject: [PATCH 087/170] Update README.md [skip ci] --- core-java-modules/core-java-collections-conversions-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-conversions-2/README.md b/core-java-modules/core-java-collections-conversions-2/README.md index 904e876032..fe17af0a7a 100644 --- a/core-java-modules/core-java-collections-conversions-2/README.md +++ b/core-java-modules/core-java-collections-conversions-2/README.md @@ -11,4 +11,5 @@ This module contains articles about conversions among Collection types and array - [Iterate Over a Set in Java](https://www.baeldung.com/java-iterate-set) - [Convert a List of Integers to a List of Strings](https://www.baeldung.com/java-convert-list-integers-to-list-strings) - [Combining Two Lists Into a Map in Java](https://www.baeldung.com/java-combine-two-lists-into-map) +- [Convert a List of Strings to a List of Integers](https://www.baeldung.com/java-convert-list-strings-to-integers) - More articles: [[<-- prev]](../core-java-collections-conversions) From 279ae5d2a427830fcf831bde251e3d65b6ebd1fc Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 21 Jun 2023 20:22:12 +0800 Subject: [PATCH 088/170] Update README.md [skip ci] --- core-java-modules/core-java-io-apis-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-io-apis-3/README.md b/core-java-modules/core-java-io-apis-3/README.md index 95d8dffce6..23f2b41ac7 100644 --- a/core-java-modules/core-java-io-apis-3/README.md +++ b/core-java-modules/core-java-io-apis-3/README.md @@ -3,3 +3,4 @@ This module contains articles about core Java input/output(IO) APIs. ### Relevant Articles: +- [Read Date in Java Using Scanner](https://www.baeldung.com/java-scanner-read-date) From cb6aad3322167b4cebfd41ae2d7068fb95b7ba67 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 21 Jun 2023 20:31:57 +0800 Subject: [PATCH 089/170] Update README.md [skip ci] --- mapstruct/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/mapstruct/README.md b/mapstruct/README.md index 46a9f8b213..790b4b1a93 100644 --- a/mapstruct/README.md +++ b/mapstruct/README.md @@ -10,3 +10,4 @@ This module contains articles about MapStruct. - [Ignoring Unmapped Properties with MapStruct](https://www.baeldung.com/mapstruct-ignore-unmapped-properties) - [Mapping Collections with MapStruct](https://www.baeldung.com/java-mapstruct-mapping-collections) - [Use Mapper in Another Mapper with Mapstruct and Java](https://www.baeldung.com/java-mapstruct-nested-mapping) +- [Throw Exception for Unexpected Input for Enum With MapStruct](https://www.baeldung.com/java-mapstruct-enum-unexpected-input-exception) From 6844a63c64ce416de2dc2be606edcaaf73e5445d Mon Sep 17 00:00:00 2001 From: Bhaskar Ghosh Dastidar Date: Thu, 22 Jun 2023 02:20:45 +0530 Subject: [PATCH 090/170] [BAEL-6090] vector api examples (#14274) Co-authored-by: Bhaskar --- core-java-modules/core-java-19/pom.xml | 1 + .../baeldung/vectors/VectorAPIExamples.java | 100 ++++++++++++++++++ .../baeldung/vectors/VectorAPIUnitTest.java | 48 +++++++++ 3 files changed, 149 insertions(+) create mode 100644 core-java-modules/core-java-19/src/main/java/com/baeldung/vectors/VectorAPIExamples.java create mode 100644 core-java-modules/core-java-19/src/test/java/com/baeldung/vectors/VectorAPIUnitTest.java diff --git a/core-java-modules/core-java-19/pom.xml b/core-java-modules/core-java-19/pom.xml index 930b37391c..11ae8cc224 100644 --- a/core-java-modules/core-java-19/pom.xml +++ b/core-java-modules/core-java-19/pom.xml @@ -21,6 +21,7 @@ 19 19 --enable-preview + --add-modules=jdk.incubator.vector diff --git a/core-java-modules/core-java-19/src/main/java/com/baeldung/vectors/VectorAPIExamples.java b/core-java-modules/core-java-19/src/main/java/com/baeldung/vectors/VectorAPIExamples.java new file mode 100644 index 0000000000..eda36dbfde --- /dev/null +++ b/core-java-modules/core-java-19/src/main/java/com/baeldung/vectors/VectorAPIExamples.java @@ -0,0 +1,100 @@ +package com.baeldung.vectors; + +import jdk.incubator.vector.FloatVector; +import jdk.incubator.vector.IntVector; +import jdk.incubator.vector.VectorOperators; +import jdk.incubator.vector.VectorSpecies; + +/** + * This class contains examples of the Vector API in Java, more specifically the fourth incubator to the Vector API. + * There are scalar and vector methods written here and the method names will specify the type. + * Note that, the code is written without any benchmarking done and without any assumption of it being run on + * a SIMD processor, or any specific compiler. + */ +public class VectorAPIExamples { + + static final VectorSpecies SPECIES = IntVector.SPECIES_PREFERRED; + static final VectorSpecies PREFERRED_SPECIES = FloatVector.SPECIES_PREFERRED; + + public int[] addTwoScalarArrays(int[] arr1, int[] arr2) { + int[] result = new int[arr1.length]; + for (int i = 0; i < arr1.length; i++) { + result[i] = arr1[i] + arr2[i]; + } + return result; + } + + public int[] addTwoVectorArrays(int[] arr1, int[] arr2) { + var v1 = IntVector.fromArray(SPECIES, arr1, 0); + var v2 = IntVector.fromArray(SPECIES, arr2, 0); + var result = v1.add(v2); + return result.toArray(); + } + + public int[] addTwoVectorsWIthHigherShape(int[] arr1, int[] arr2) { + int[] finalResult = new int[arr1.length]; + for (int i = 0; i < arr1.length; i += SPECIES.length()) { + var v1 = IntVector.fromArray(SPECIES, arr1, i); + var v2 = IntVector.fromArray(SPECIES, arr2, i); + var result = v1.add(v2); + result.intoArray(finalResult, i); + } + return finalResult; + } + + public int[] addTwoVectorsWithMasks(int[] arr1, int[] arr2) { + int[] finalResult = new int[arr1.length]; + int i = 0; + for (; i < SPECIES.loopBound(arr1.length); i += SPECIES.length()) { + var mask = SPECIES.indexInRange(i, arr1.length); + var v1 = IntVector.fromArray(SPECIES, arr1, i, mask); + var v2 = IntVector.fromArray(SPECIES, arr2, i, mask); + var result = v1.add(v2, mask); + result.intoArray(finalResult, i, mask); + } + + // tail cleanup loop + for (; i < arr1.length; i++) { + finalResult[i] = arr1[i] + arr2[i]; + } + return finalResult; + } + + public float[] scalarNormOfTwoArrays(float[] arr1, float[] arr2) { + float[] finalResult = new float[arr1.length]; + for (int i = 0; i < arr1.length; i++) { + finalResult[i] = (arr1[i] * arr1[i] + arr2[i] * arr2[i]) * -1.0f; + } + return finalResult; + } + + public float[] vectorNormalForm(float[] arr1, float[] arr2) { + float[] finalResult = new float[arr1.length]; + int i = 0; + int upperBound = SPECIES.loopBound(arr1.length); + for (; i < upperBound; i += SPECIES.length()) { + var va = FloatVector.fromArray(PREFERRED_SPECIES, arr1, i); + var vb = FloatVector.fromArray(PREFERRED_SPECIES, arr2, i); + var vc = va.mul(va) + .add(vb.mul(vb)) + .neg(); + vc.intoArray(finalResult, i); + } + + // tail cleanup + for (; i < arr1.length; i++) { + finalResult[i] = (arr1[i] * arr1[i] + arr2[i] * arr2[i]) * -1.0f; + } + return finalResult; + } + + public double averageOfaVector(int[] arr) { + double sum = 0; + for (int i = 0; i < arr.length; i += SPECIES.length()) { + var mask = SPECIES.indexInRange(i, arr.length); + var V = IntVector.fromArray(SPECIES, arr, i, mask); + sum += V.reduceLanes(VectorOperators.ADD, mask); + } + return sum / arr.length; + } +} diff --git a/core-java-modules/core-java-19/src/test/java/com/baeldung/vectors/VectorAPIUnitTest.java b/core-java-modules/core-java-19/src/test/java/com/baeldung/vectors/VectorAPIUnitTest.java new file mode 100644 index 0000000000..22b37a2b28 --- /dev/null +++ b/core-java-modules/core-java-19/src/test/java/com/baeldung/vectors/VectorAPIUnitTest.java @@ -0,0 +1,48 @@ +package com.baeldung.vectors; + +import static org.junit.Assert.assertArrayEquals; + +import org.junit.Test; +import org.junit.jupiter.api.Assertions; + +public class VectorAPIUnitTest { + VectorAPIExamples vector = new VectorAPIExamples(); + + @Test + public void whenTwoArraysProvided_thenVerifyScalarAdd() { + int[] arr1 = { 1, 2, 3, 4 }; + int[] arr2 = { 100, 200, 300, 400 }; + int[] result = { 101, 202, 303, 404 }; + assertArrayEquals(result, vector.addTwoScalarArrays(arr1, arr2)); + } + + @Test + public void whenTwoArraysProvided_thenVerifyVectorAdd() { + int[] arr1 = { 1, 2, 3, 4 }; + int[] arr2 = { 100, 200, 300, 400 }; + int[] result = { 101, 202, 303, 404 }; + assertArrayEquals(result, vector.addTwoVectorsWithMasks(arr1, arr2)); + } + + @Test + public void whenTwoValuesProvided_thenComputeScalarNorm() { + float[] arr1 = { 1, 2.3f }; + float[] arr2 = { 1.3f, 2.0f }; + float[] result = { -2.6899998f, -9.29f }; + Assertions.assertArrayEquals(result, vector.scalarNormOfTwoArrays(arr1, arr2)); + } + + @Test + public void whenTwoValuesProvided_thenComputeVectorNorm() { + float[] arr1 = { 1, 2.3f }; + float[] arr2 = { 1.3f, 2.0f }; + float[] result = { -2.6899998f, -9.29f }; + Assertions.assertArrayEquals(result, vector.vectorNormalForm(arr1, arr2)); + } + + @Test + public void whenArrayProvided_thenComputeVectorAverage() { + int[] arr = { 100, 200, 300, 400 }; + Assertions.assertEquals(250.0, vector.averageOfaVector(arr)); + } +} From 18da9d53f7570bd53724387e3dd0d637fbeea982 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 22 Jun 2023 13:16:56 +0300 Subject: [PATCH 091/170] [JAVA-15033] Update article Apache HttpClient 4 Cookbook (#14266) --- .../httpclient/httpclient/ClientUtil.java | 18 ++ .../HttpClientCookBookLiveTest.java | 211 ++++++++++++++++++ .../com/baeldung/httpclient/ClientUtil.java | 20 ++ .../HttpClientCookBookV4LiveTest.java | 166 ++++++++++++++ 4 files changed, 415 insertions(+) create mode 100644 apache-httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/ClientUtil.java create mode 100644 apache-httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/HttpClientCookBookLiveTest.java create mode 100644 apache-httpclient4/src/test/java/com/baeldung/httpclient/ClientUtil.java create mode 100644 apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpClientCookBookV4LiveTest.java diff --git a/apache-httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/ClientUtil.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/ClientUtil.java new file mode 100644 index 0000000000..2f430dbd64 --- /dev/null +++ b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/ClientUtil.java @@ -0,0 +1,18 @@ +package com.baeldung.httpclient.httpclient; + +import java.io.IOException; + +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; + +public final class ClientUtil { + + private ClientUtil(){} + + public static void closeClient(CloseableHttpClient client) throws IOException { + if (client == null) { + return; + } + + client.close(); + } +} diff --git a/apache-httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/HttpClientCookBookLiveTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/HttpClientCookBookLiveTest.java new file mode 100644 index 0000000000..6484b2f7e5 --- /dev/null +++ b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/httpclient/HttpClientCookBookLiveTest.java @@ -0,0 +1,211 @@ +package com.baeldung.httpclient.httpclient; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.emptyArray; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import org.apache.hc.client5.http.classic.methods.HttpPost; +import org.apache.hc.client5.http.config.ConnectionConfig; +import org.apache.hc.client5.http.config.RequestConfig; +import org.apache.hc.client5.http.entity.UrlEncodedFormEntity; +import org.apache.hc.client5.http.impl.io.BasicHttpClientConnectionManager; +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.core5.http.ContentType; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HttpHeaders; +import org.apache.hc.core5.http.NameValuePair; +import org.apache.hc.core5.http.io.entity.EntityUtils; +import org.apache.hc.core5.http.message.BasicNameValuePair; +import org.apache.hc.core5.util.Timeout; + +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +class HttpClientCookBookLiveTest { + + private static final String SAMPLE_GET_URL = "http://www.google.com"; + private static final String SAMPLE_POST_URL = "http://www.github.com"; + + private CloseableHttpClient httpClient; + + private CloseableHttpResponse response; + + @BeforeEach + public final void before() { + httpClient = HttpClientBuilder.create().build(); + } + + @AfterEach + public final void after() throws IOException { + ClientUtil.closeClient(httpClient); + } + + @Test + void givenGetRequestExecuted_thenCorrectStatusCode() throws IOException { + HttpGet httpGet = new HttpGet(SAMPLE_GET_URL); + httpClient.execute(httpGet, + response -> { + assertThat(response.getCode()).isEqualTo(200); + return response; + } + ); + } + + @Test + void givenGetRequestExecuted_thenCorrectContentMimeType() throws IOException { + HttpGet httpGet = new HttpGet(SAMPLE_GET_URL); + httpClient.execute(httpGet, + response -> { + final String contentMimeType = ContentType.parse(response.getEntity().getContentType()).getMimeType(); + assertThat(contentMimeType).isEqualTo(ContentType.TEXT_HTML.getMimeType()); + return response; + } + ); + } + + @Test + void givenGetRequestExecuted_thenCorrectResponse() throws IOException { + HttpGet httpGet = new HttpGet(SAMPLE_GET_URL); + httpClient.execute(httpGet, + response -> { + String bodyAsString = EntityUtils.toString(response.getEntity()); + assertThat(bodyAsString, notNullValue()); + return response; + } + ); + } + + @Test + void whenConfigureTimeoutOnRequest_thenCorrectResponse() throws IOException { + RequestConfig requestConfig = RequestConfig.custom() + .setConnectionRequestTimeout(Timeout.ofMilliseconds(2000L)) + .build(); + + CloseableHttpClient httpClient = HttpClientBuilder.create() + .setDefaultRequestConfig(requestConfig) + .build(); + + HttpGet request = new HttpGet(SAMPLE_GET_URL); + request.setConfig(requestConfig); + + httpClient.execute(request, + response -> { + assertThat(response.getCode()).isEqualTo(200); + return response; + } + ); + } + + @Test + void givenLowSocketTimeOut_whenExecutingRequestWithTimeout_thenException() throws IOException { + ConnectionConfig connConfig = ConnectionConfig.custom() + .setConnectTimeout(1000, TimeUnit.MILLISECONDS) + .setSocketTimeout(20, TimeUnit.MILLISECONDS) + .build(); + + RequestConfig requestConfig = RequestConfig.custom() + .setConnectionRequestTimeout(Timeout.ofMilliseconds(2000L)) + .build(); + + BasicHttpClientConnectionManager cm = new BasicHttpClientConnectionManager(); + cm.setConnectionConfig(connConfig); + + CloseableHttpClient httpClient = HttpClientBuilder.create() + .setDefaultRequestConfig(requestConfig) + .setConnectionManager(cm) + .build(); + + HttpGet request = new HttpGet(SAMPLE_GET_URL); + + assertThrows(SocketTimeoutException.class, () -> { + httpClient.execute(request, resp -> resp); + }); + } + + @Test + void whenExecutingPostRequest_thenNoExceptions() throws IOException { + final HttpPost httpPost = new HttpPost(SAMPLE_POST_URL); + httpClient.execute(httpPost, + response -> { + assertThat(response.getCode()).isEqualTo(200); + return response; + } + ); + } + + @Test + void givenParametersAddedToRequest_thenCorrect() throws IOException { + final HttpPost httpPost = new HttpPost(SAMPLE_POST_URL); + final List params = new ArrayList(); + params.add(new BasicNameValuePair("key1", "value1")); + params.add(new BasicNameValuePair("key2", "value2")); + httpPost.setEntity(new UrlEncodedFormEntity(params, Charset.defaultCharset())); + + httpClient.execute(httpPost, response -> { + assertThat(response.getCode()).isEqualTo(200); + return response; + }); + } + + @Test + void givenRedirectsAreDisabled_whenConsumingUrlWhichRedirects_thenNotRedirected() throws IOException { + CloseableHttpClient client = HttpClientBuilder.create() + .disableRedirectHandling() + .build(); + client.execute(new HttpGet("http://t.co/I5YYd9tddw"), response -> { + assertThat(response.getCode()).isEqualTo(301); + return response; + }); + } + + @Test + void givenHeadersAddedToRequest_thenCorrect() throws IOException { + HttpGet request = new HttpGet(SAMPLE_GET_URL); + request.addHeader(HttpHeaders.ACCEPT, "application/xml"); + httpClient.execute(request, + response -> { + assertThat(response.getCode()).isEqualTo(200); + return response; + } + ); + } + + @Test + void givenRequestWasSet_whenAnalyzingTheHeadersOfTheResponse_thenCorrect() throws IOException { + HttpGet httpGet = new HttpGet(SAMPLE_GET_URL); + httpClient.execute(httpGet, + response -> { + Header[] headers = response.getHeaders(HttpHeaders.CONTENT_TYPE); + assertThat(headers, not(emptyArray())); + return response; + } + ); + } + + @Test + void givenAutoClosableClient_thenCorrect() throws IOException { + HttpGet httpGet = new HttpGet(SAMPLE_GET_URL); + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + httpClient.execute(httpGet, resp -> { + assertThat(resp.getCode()).isEqualTo(200); + return resp; + }); + } + } + +} diff --git a/apache-httpclient4/src/test/java/com/baeldung/httpclient/ClientUtil.java b/apache-httpclient4/src/test/java/com/baeldung/httpclient/ClientUtil.java new file mode 100644 index 0000000000..ce8a869e97 --- /dev/null +++ b/apache-httpclient4/src/test/java/com/baeldung/httpclient/ClientUtil.java @@ -0,0 +1,20 @@ +package com.baeldung.httpclient; + +import java.io.IOException; + +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.impl.client.CloseableHttpClient; + +public final class ClientUtil { + + private ClientUtil(){} + + public static void closeClient(CloseableHttpClient client) throws IOException { + if (client == null) { + return; + } + + client.close(); + } +} diff --git a/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpClientCookBookV4LiveTest.java b/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpClientCookBookV4LiveTest.java new file mode 100644 index 0000000000..e82120a105 --- /dev/null +++ b/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpClientCookBookV4LiveTest.java @@ -0,0 +1,166 @@ +package com.baeldung.httpclient; + + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import static org.hamcrest.Matchers.emptyArray; +import static org.hamcrest.Matchers.not; + +import java.io.IOException; +import java.io.InputStream; +import java.net.SocketTimeoutException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.http.Consts; +import org.apache.http.Header; +import org.apache.http.HttpEntity; +import org.apache.http.HttpHeaders; +import org.apache.http.NameValuePair; + +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +class HttpClientCookBookV4LiveTest { + + private static final String SAMPLE_GET_URL = "http://www.google.com"; + private static final String SAMPLE_POST_URL = "http://www.github.com"; + + private CloseableHttpClient client; + + private CloseableHttpResponse response; + + @BeforeEach + public final void before() { + client = HttpClientBuilder.create().build(); + } + + @AfterEach + public final void after() throws IllegalStateException, IOException { + ResponseUtil.closeResponse(response); + ClientUtil.closeClient(client); + } + + @Test + void givenGetRequestExecuted_thenCorrectStatusCode() throws IOException { + HttpGet httpGet = new HttpGet(SAMPLE_GET_URL); + response = client.execute(httpGet); + assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + } + + @Test + void givenGetRequestExecuted_thenCorrectContentMimeType() throws IOException { + CloseableHttpResponse response = client.execute(new HttpGet(SAMPLE_GET_URL)); + String contentMimeType = ContentType.getOrDefault(response.getEntity()).getMimeType(); + assertThat(contentMimeType, equalTo(ContentType.TEXT_HTML.getMimeType())); + } + + @Test + void givenGetRequestExecuted_thenCorrectResponse() throws IOException { + CloseableHttpResponse response = client.execute(new HttpGet(SAMPLE_GET_URL)); + String bodyAsString = EntityUtils.toString(response.getEntity()); + assertThat(bodyAsString, notNullValue()); + } + + @Test + void givenLowSocketTimeOut_whenExecutingRequestWithTimeout_thenException() throws IOException { + RequestConfig requestConfig = RequestConfig.custom() + .setConnectionRequestTimeout(1000) + .setConnectTimeout(1000) + .setSocketTimeout(20) + .build(); + HttpGet request = new HttpGet(SAMPLE_POST_URL); + request.setConfig(requestConfig); + + assertThrows(SocketTimeoutException.class, () -> { + response = client.execute(request); + }); + } + + @Test + void givenLowSocketTimeOut_whenSettingTimeoutOnTheClient_thenException(){ + RequestConfig requestConfig = RequestConfig.custom() + .setConnectionRequestTimeout(1000) + .setConnectTimeout(1000) + .setSocketTimeout(20).build(); + HttpClientBuilder builder = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig); + + client = builder.build(); + HttpGet request = new HttpGet(SAMPLE_GET_URL); + + assertThrows(SocketTimeoutException.class, () -> { + response = client.execute(request); + }); + } + + @Test + void whenExecutingPostRequest_thenNoExceptions() throws IOException { + response = client.execute(new HttpPost(SAMPLE_POST_URL)); + assertThat(response.getStatusLine().getStatusCode(), equalTo(301)); + } + + @Test + void givenParametersAddedToRequest_thenCorrect() throws IOException { + final HttpPost httpPost = new HttpPost(SAMPLE_POST_URL); + final List params = new ArrayList(); + params.add(new BasicNameValuePair("key1", "value1")); + params.add(new BasicNameValuePair("key2", "value2")); + httpPost.setEntity(new UrlEncodedFormEntity(params, Consts.UTF_8)); + + response = client.execute(new HttpPost(SAMPLE_POST_URL)); + assertThat(response.getStatusLine().getStatusCode(), equalTo(301)); + } + + @Test + void givenRedirectsAreDisabled_whenConsumingUrlWhichRedirects_thenNotRedirected() throws IOException { + CloseableHttpClient client = HttpClientBuilder.create() + .disableRedirectHandling() + .build(); + CloseableHttpResponse response = client.execute(new HttpGet("http://t.co/I5YYd9tddw")); + assertThat(response.getStatusLine().getStatusCode(), equalTo(301)); + } + + @Test + void givenHeadersAddedToRequest_thenCorrect() throws IOException { + HttpGet request = new HttpGet(SAMPLE_GET_URL); + request.addHeader(HttpHeaders.ACCEPT, "application/xml"); + response = client.execute(request); + assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + } + + @Test + void givenRequestWasSet_whenAnalyzingTheHeadersOfTheResponse_thenCorrect() throws IOException { + CloseableHttpResponse response = client.execute(new HttpGet(SAMPLE_GET_URL)); + Header[] headers = response.getHeaders(HttpHeaders.CONTENT_TYPE); + assertThat(headers, not(emptyArray())); + } + + @Test + void givenStreamIsClosed_thenCloseResponse() throws IOException { + response = client.execute(new HttpGet(SAMPLE_GET_URL)); + try { + HttpEntity entity = response.getEntity(); + if (entity != null) { + InputStream instream = entity.getContent(); + instream.close(); + } + } finally { + response.close(); + } + } +} From a6052bde9374a4771f98f1cf153aee1b8f856cca Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Thu, 22 Jun 2023 16:53:01 +0200 Subject: [PATCH 092/170] JAVA-22236 | adding new submodule due to too much articles in the same submodule. (#14286) --- spring-boot-modules/pom.xml | 1 + .../spring-boot-properties-2/README.md | 2 +- .../spring-boot-properties-3/README.md | 4 +- .../src/main/resources/application.properties | 16 +------ .../spring-boot-properties-4/README.md | 10 ++++ .../spring-boot-properties-4/pom.xml | 47 +++++++++++++++++++ .../envvariables/BaeldungProperties.java | 0 .../baeldung/envvariables/MyController.java | 0 .../error/KebabCasingDemoApplication.java | 0 .../configuration/MainConfiguration.java | 0 .../src/main/resources/application.properties | 13 +++++ .../MyControllerIntegrationTest.java | 0 12 files changed, 74 insertions(+), 19 deletions(-) create mode 100644 spring-boot-modules/spring-boot-properties-4/README.md create mode 100644 spring-boot-modules/spring-boot-properties-4/pom.xml rename spring-boot-modules/{spring-boot-properties-3 => spring-boot-properties-4}/src/main/java/com/baeldung/envvariables/BaeldungProperties.java (100%) rename spring-boot-modules/{spring-boot-properties-3 => spring-boot-properties-4}/src/main/java/com/baeldung/envvariables/MyController.java (100%) rename spring-boot-modules/{spring-boot-properties-3 => spring-boot-properties-4}/src/main/java/com/baeldung/error/KebabCasingDemoApplication.java (100%) rename spring-boot-modules/{spring-boot-properties-3 => spring-boot-properties-4}/src/main/java/com/baeldung/error/configuration/MainConfiguration.java (100%) create mode 100644 spring-boot-modules/spring-boot-properties-4/src/main/resources/application.properties rename spring-boot-modules/{spring-boot-properties-3 => spring-boot-properties-4}/src/test/java/com/baeldung/envvariables/MyControllerIntegrationTest.java (100%) diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index d46612393d..2c82fa1611 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -93,6 +93,7 @@ spring-boot-properties spring-boot-properties-2 spring-boot-properties-3 + spring-boot-properties-4 spring-boot-properties-migrator-demo diff --git a/spring-boot-modules/spring-boot-properties-2/README.md b/spring-boot-modules/spring-boot-properties-2/README.md index 296486e7d7..a10d0db7d3 100644 --- a/spring-boot-modules/spring-boot-properties-2/README.md +++ b/spring-boot-modules/spring-boot-properties-2/README.md @@ -10,4 +10,4 @@ This module contains articles about Properties in Spring Boot. - [Inject Arrays and Lists From Spring Properties Files](https://www.baeldung.com/spring-inject-arrays-lists) - [Inject a Map from a YAML File with Spring](https://www.baeldung.com/spring-yaml-inject-map) - [YAML to List of Objects in Spring Boot](https://www.baeldung.com/spring-boot-yaml-list) -- More articles: [[<-- prev]](../spring-boot-properties) +- More articles: [[<-- Prev]](../spring-boot-properties) [[Next -->]](../spring-boot-properties-3) diff --git a/spring-boot-modules/spring-boot-properties-3/README.md b/spring-boot-modules/spring-boot-properties-3/README.md index 476797965a..f9bae5f12c 100644 --- a/spring-boot-modules/spring-boot-properties-3/README.md +++ b/spring-boot-modules/spring-boot-properties-3/README.md @@ -12,6 +12,4 @@ - [Log Properties in a Spring Boot Application](https://www.baeldung.com/spring-boot-log-properties) - [Using Environment Variables in Spring Boot’s application.properties](https://www.baeldung.com/spring-boot-properties-env-variables) - [Loading Multiple YAML Configuration Files in Spring Boot](https://www.baeldung.com/spring-boot-load-multiple-yaml-configuration-files) -- [Using Environment Variables in Spring Boot’s Properties Files](https://www.baeldung.com/spring-boot-properties-env-variables) -- [Spring Boot Properties Prefix Must Be in Canonical Form](https://www.baeldung.com/spring-boot-properties-canonical-form) -- More articles: [[<-- prev]](../spring-boot-properties-2) +- More articles: [[<-- Prev]](../spring-boot-properties-2) [[Next -->]](../spring-boot-properties-4) diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.properties b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.properties index 225ebb05b6..a079837942 100644 --- a/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.properties +++ b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.properties @@ -26,18 +26,4 @@ spring.config.activate.on-profile=multidocument-prod spring.datasource.password=password spring.datasource.url=jdbc:h2:prod spring.datasource.username=prodUser -bael.property=prodValue -#--- -environment.name=${OS} -java.home.and.environment=${JAVA_HOME}+${OS} -not.existing.system.property=${thispropertydoesnotexist} -baeldung.presentation=${HELLO_BAELDUNG}. Java is installed in the folder: ${JAVA_HOME} -#--- -#camelCasing -#customProperties.name="Baeldung" -#PascalCasing -#CustomProperties.name="Baeldung" -#SnakingCasing -#custom_properties.name="Baeldung" -#KebabCasing -custom-properties.name="Baeldung" \ No newline at end of file +bael.property=prodValue \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-properties-4/README.md b/spring-boot-modules/spring-boot-properties-4/README.md new file mode 100644 index 0000000000..3033b8725c --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-4/README.md @@ -0,0 +1,10 @@ + +## Spring Boot Properties + + + +### Relevant Articles: + +- [Using Environment Variables in Spring Boot’s Properties Files](https://www.baeldung.com/spring-boot-properties-env-variables) +- [Spring Boot Properties Prefix Must Be in Canonical Form](https://www.baeldung.com/spring-boot-properties-canonical-form) +- More articles: [[<-- Prev]](../spring-boot-properties-3) diff --git a/spring-boot-modules/spring-boot-properties-4/pom.xml b/spring-boot-modules/spring-boot-properties-4/pom.xml new file mode 100644 index 0000000000..1699e2defd --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-4/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + spring-boot-properties-4 + 0.0.1-SNAPSHOT + spring-boot-properties-4 + Spring Boot Properties Module + + + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-web + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/envvariables/BaeldungProperties.java b/spring-boot-modules/spring-boot-properties-4/src/main/java/com/baeldung/envvariables/BaeldungProperties.java similarity index 100% rename from spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/envvariables/BaeldungProperties.java rename to spring-boot-modules/spring-boot-properties-4/src/main/java/com/baeldung/envvariables/BaeldungProperties.java diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/envvariables/MyController.java b/spring-boot-modules/spring-boot-properties-4/src/main/java/com/baeldung/envvariables/MyController.java similarity index 100% rename from spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/envvariables/MyController.java rename to spring-boot-modules/spring-boot-properties-4/src/main/java/com/baeldung/envvariables/MyController.java diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/KebabCasingDemoApplication.java b/spring-boot-modules/spring-boot-properties-4/src/main/java/com/baeldung/error/KebabCasingDemoApplication.java similarity index 100% rename from spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/KebabCasingDemoApplication.java rename to spring-boot-modules/spring-boot-properties-4/src/main/java/com/baeldung/error/KebabCasingDemoApplication.java diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/configuration/MainConfiguration.java b/spring-boot-modules/spring-boot-properties-4/src/main/java/com/baeldung/error/configuration/MainConfiguration.java similarity index 100% rename from spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/error/configuration/MainConfiguration.java rename to spring-boot-modules/spring-boot-properties-4/src/main/java/com/baeldung/error/configuration/MainConfiguration.java diff --git a/spring-boot-modules/spring-boot-properties-4/src/main/resources/application.properties b/spring-boot-modules/spring-boot-properties-4/src/main/resources/application.properties new file mode 100644 index 0000000000..a078e68820 --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-4/src/main/resources/application.properties @@ -0,0 +1,13 @@ +environment.name=${OS} +java.home.and.environment=${JAVA_HOME}+${OS} +not.existing.system.property=${thispropertydoesnotexist} +baeldung.presentation=${HELLO_BAELDUNG}. Java is installed in the folder: ${JAVA_HOME} +#--- +#camelCasing +#customProperties.name="Baeldung" +#PascalCasing +#CustomProperties.name="Baeldung" +#SnakingCasing +#custom_properties.name="Baeldung" +#KebabCasing +custom-properties.name="Baeldung" \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-properties-3/src/test/java/com/baeldung/envvariables/MyControllerIntegrationTest.java b/spring-boot-modules/spring-boot-properties-4/src/test/java/com/baeldung/envvariables/MyControllerIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-properties-3/src/test/java/com/baeldung/envvariables/MyControllerIntegrationTest.java rename to spring-boot-modules/spring-boot-properties-4/src/test/java/com/baeldung/envvariables/MyControllerIntegrationTest.java From 6ac079cc265df5cfdef56d4617439cd5ae2b7521 Mon Sep 17 00:00:00 2001 From: Ehsan Sasanianno Date: Thu, 22 Jun 2023 19:30:27 +0200 Subject: [PATCH 093/170] java-20085: fix selenium failing tests (#14279) --- .../selenium/pages/BaeldungHomePage.java | 2 +- .../SeleniumJavaScriptClickLiveTest.java | 15 ++++---- .../cookies/SeleniumCookiesJUnitLiveTest.java | 35 +++++++++---------- .../selenium/setup/InvalidSetupLiveTest.java | 6 ++-- .../webdriver/SeleniumWebDriverUnitTest.java | 4 +-- 5 files changed, 29 insertions(+), 33 deletions(-) diff --git a/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java index d901bf3c34..50861d2e57 100644 --- a/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java +++ b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java @@ -10,7 +10,7 @@ public class BaeldungHomePage { private SeleniumConfig config; @FindBy(css = ".nav--logo_mobile") private WebElement title; - @FindBy(css = ".menu-start-here > a") + @FindBy(css = ".header--menu") private WebElement startHere; public BaeldungHomePage(SeleniumConfig config) { diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/clickusingjavascript/SeleniumJavaScriptClickLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/clickusingjavascript/SeleniumJavaScriptClickLiveTest.java index c6abda08ee..e585aa90f3 100644 --- a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/clickusingjavascript/SeleniumJavaScriptClickLiveTest.java +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/clickusingjavascript/SeleniumJavaScriptClickLiveTest.java @@ -39,22 +39,21 @@ public class SeleniumJavaScriptClickLiveTest { public void whenSearchForSeleniumArticles_thenReturnNotEmptyResults() { driver.get("https://baeldung.com"); String title = driver.getTitle(); - assertEquals("Baeldung | Java, Spring and Web Development tutorials", title); + assertEquals("Baeldung", title); wait.until(ExpectedConditions.elementToBeClickable(By.className("nav--menu_item_anchor"))); WebElement searchButton = driver.findElement(By.className("nav--menu_item_anchor")); clickElement(searchButton); - wait.until(ExpectedConditions.elementToBeClickable(By.id("search"))); - WebElement searchInput = driver.findElement(By.id("search")); - searchInput.sendKeys("Selenium"); + wait.until(ExpectedConditions.elementToBeClickable(By.id("menu-item-40489"))); + WebElement searchInput = driver.findElement(By.id("menu-item-40489")); - wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(".btn-search"))); - WebElement seeSearchResultsButton = driver.findElement(By.cssSelector(".btn-search")); + wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(".nav--menu_item"))); + WebElement seeSearchResultsButton = driver.findElement(By.cssSelector(".nav--menu_item")); clickElement(seeSearchResultsButton); - wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.className("post"))); - int seleniumPostsCount = driver.findElements(By.className("post")) + wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.className("nav--menu_item_anchor"))); + int seleniumPostsCount = driver.findElements(By.className("nav--menu_item_anchor")) .size(); assertTrue(seleniumPostsCount > 0); } diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/cookies/SeleniumCookiesJUnitLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/cookies/SeleniumCookiesJUnitLiveTest.java index 8906f89fba..add0bf5ace 100644 --- a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/cookies/SeleniumCookiesJUnitLiveTest.java +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/cookies/SeleniumCookiesJUnitLiveTest.java @@ -19,19 +19,24 @@ import org.junit.Test; import org.openqa.selenium.Cookie; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.support.ui.WebDriverWait; public class SeleniumCookiesJUnitLiveTest { private WebDriver driver; private String navUrl; + private final String COOKIE = "SNS"; + @Before public void setUp() { System.setProperty("webdriver.gecko.driver", findFile("geckodriver.mac")); driver = new FirefoxDriver(); navUrl = "https://baeldung.com"; - driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5)); + driver.navigate().to(navUrl); + WebDriverWait wait = new WebDriverWait(driver, Duration.ofMillis(1000)); + wait.until(d -> d.manage().getCookieNamed(COOKIE) != null); } private static String findFile(String filename) { @@ -50,7 +55,6 @@ public class SeleniumCookiesJUnitLiveTest { @Test public void whenNavigate_thenCookiesExist() { - driver.navigate().to(navUrl); Set cookies = driver.manage().getCookies(); assertThat(cookies, is(not(empty()))); @@ -58,35 +62,30 @@ public class SeleniumCookiesJUnitLiveTest { @Test public void whenNavigate_thenLpCookieExists() { - driver.navigate().to(navUrl); - Cookie lpCookie = driver.manage().getCookieNamed("lp_120073"); + Cookie lpCookie = driver.manage().getCookieNamed(COOKIE); assertThat(lpCookie, is(not(nullValue()))); } @Test public void whenNavigate_thenLpCookieIsHasCorrectValue() { - driver.navigate().to(navUrl); - Cookie lpCookie = driver.manage().getCookieNamed("lp_120073"); + Cookie lpCookie = driver.manage().getCookieNamed(COOKIE); - assertThat(lpCookie.getValue(), containsString("www.baeldung.com")); + assertThat(lpCookie.getValue(), containsString("1")); } @Test public void whenNavigate_thenLpCookieHasCorrectProps() { - driver.navigate().to(navUrl); - Cookie lpCookie = driver.manage().getCookieNamed("lp_120073"); + Cookie lpCookie = driver.manage().getCookieNamed(COOKIE); - assertThat(lpCookie.getDomain(), equalTo(".baeldung.com")); + assertThat(lpCookie.getDomain(), equalTo("www.baeldung.com")); assertThat(lpCookie.getPath(), equalTo("/")); - assertThat(lpCookie.getExpiry(), is(not(nullValue()))); assertThat(lpCookie.isSecure(), equalTo(false)); assertThat(lpCookie.isHttpOnly(), equalTo(false)); } @Test public void whenAddingCookie_thenItIsPresent() { - driver.navigate().to(navUrl); Cookie cookie = new Cookie("foo", "bar"); driver.manage().addCookie(cookie); Cookie driverCookie = driver.manage().getCookieNamed("foo"); @@ -96,27 +95,25 @@ public class SeleniumCookiesJUnitLiveTest { @Test public void whenDeletingCookie_thenItIsAbsent() { - driver.navigate().to(navUrl); - Cookie lpCookie = driver.manage().getCookieNamed("lp_120073"); + Cookie lpCookie = driver.manage().getCookieNamed("SNS"); assertThat(lpCookie, is(not(nullValue()))); driver.manage().deleteCookie(lpCookie); - Cookie deletedCookie = driver.manage().getCookieNamed("lp_120073"); + Cookie deletedCookie = driver.manage().getCookieNamed(COOKIE); assertThat(deletedCookie, is(nullValue())); } @Test public void whenOverridingCookie_thenItIsUpdated() { - driver.navigate().to(navUrl); - Cookie lpCookie = driver.manage().getCookieNamed("lp_120073"); + Cookie lpCookie = driver.manage().getCookieNamed(COOKIE); driver.manage().deleteCookie(lpCookie); - Cookie newLpCookie = new Cookie("lp_120073", "foo"); + Cookie newLpCookie = new Cookie(COOKIE, "foo"); driver.manage().addCookie(newLpCookie); - Cookie overriddenCookie = driver.manage().getCookieNamed("lp_120073"); + Cookie overriddenCookie = driver.manage().getCookieNamed(COOKIE); assertThat(overriddenCookie.getValue(), equalTo("foo")); } diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/setup/InvalidSetupLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/setup/InvalidSetupLiveTest.java index 09ab823828..dce4427ae9 100644 --- a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/setup/InvalidSetupLiveTest.java +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/setup/InvalidSetupLiveTest.java @@ -13,9 +13,9 @@ final class InvalidSetupLiveTest { @BeforeAll static void setup() { // Make sure the properties are cleared before the tests. - System.clearProperty("webdriver.chrome.driver"); - System.clearProperty("webdriver.gecko.driver"); - System.clearProperty("webdriver.edge.driver"); + System.setProperty("webdriver.chrome.driver", ""); + System.setProperty("webdriver.gecko.driver",""); + System.setProperty("webdriver.edge.driver",""); } @Test diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/webdriver/SeleniumWebDriverUnitTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/webdriver/SeleniumWebDriverUnitTest.java index e4e89611d1..ed1aa60598 100644 --- a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/webdriver/SeleniumWebDriverUnitTest.java +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/webdriver/SeleniumWebDriverUnitTest.java @@ -16,7 +16,7 @@ public class SeleniumWebDriverUnitTest { private WebDriver driver; private static final String URL = "https://duckduckgo.com/"; - private static final String INPUT_ID = "search_form_input_homepage"; + private static final String INPUT_ID = "searchbox_input__bEGm3"; @BeforeEach public void setUp() { @@ -32,7 +32,7 @@ public class SeleniumWebDriverUnitTest { @Test public void givenDuckDuckGoHomePage_whenInputHelloWorld_thenInputValueIsHelloWorld() { driver.get(URL); - WebElement inputElement = driver.findElement(By.id(INPUT_ID)); + WebElement inputElement = driver.findElement(By.className(INPUT_ID)); inputElement.sendKeys(Keys.chord(Keys.CONTROL, "a"), Keys.DELETE); inputElement.sendKeys("Hello World!"); From 9836be647090cf4e6ec4aa111fccad643c9f2475 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Fri, 23 Jun 2023 10:39:53 +0300 Subject: [PATCH 094/170] JAVA-16399 Upgrade gradle-modules/gradle/maven-to-gradle to JDK 17 (#14282) * JAVA-16399 Upgrade gradle-modules/gradle/maven-to-gradle to JDK 17 * JAVA-16399 Remove duplicate modules in a profile * JAVA-16399 Fix broken pom.xml --------- Co-authored-by: timis1 --- .../gradle/maven-to-gradle/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 58695 -> 63282 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- gradle-modules/gradle/maven-to-gradle/gradlew | 293 +++++++++++------- .../gradle/maven-to-gradle/gradlew.bat | 38 +-- gradle-modules/gradle/maven-to-gradle/pom.xml | 5 + .../gradle/maven-to-gradle/settings.gradle | 2 + pom.xml | 4 +- 8 files changed, 210 insertions(+), 142 deletions(-) diff --git a/gradle-modules/gradle/maven-to-gradle/build.gradle b/gradle-modules/gradle/maven-to-gradle/build.gradle index f891e592c2..b213b8125f 100644 --- a/gradle-modules/gradle/maven-to-gradle/build.gradle +++ b/gradle-modules/gradle/maven-to-gradle/build.gradle @@ -1,9 +1,11 @@ /* * This file was generated by the Gradle 'init' task. + * + * This project uses @Incubating APIs which are subject to change. */ plugins { - id 'java' + id 'java-library' id 'maven-publish' } @@ -15,7 +17,7 @@ repositories { } dependencies { - implementation 'org.apache.commons:commons-lang3:3.12.0' + api 'org.apache.commons:commons-lang3:3.12.0' } group = 'com.baeldung' diff --git a/gradle-modules/gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.jar index f3d88b1c2faf2fc91d853cd5d4242b5547257070..f03f475efe8cbb781d8a1f9dfcd7fbfc89bcef5a 100644 GIT binary patch delta 43630 zcmaI7b8sfn*DV~|wrv{|+qP{xPn?OJiETSiY}?7in%Kr9ckcVveeeBMef9m*=Tx23 z-PKiVpS^nRy~ZZNo36njmF2)8Fp>%|lkm_%F_M^E{#^>l|MvwmX#?}W#uNxpLJSNL z5EvK`5D*cNh|@JMYB&%OL+q3wI(C3R{tDrjA;ZVf!-&|dDwb@{a1%QMZ16BFZ2Z+a z6eUu6%5qq;{$&g!*;&pKt)jJ!9Cohz0;v0<2zQ|v7ZCLKBB+B+p&xSROJ3@;pI1|j z%eo_=@91pj`|peY9I~*_O#ld2%oChp#ewTqiReho(YYe?-o zDJJo#)X|#MadOfWkQhC1s~Av(_A>dmBsyWgJNm=9FBT3DDFxv$^=)xQzWXs{TLC?&%vodNa>u9xmtedQ}(Z{b1qYkG)N z_0K(iu$Zp*-+W}bQpl40AMu_q*B1i6{R;ZZz50HTxaJ1xIz?Sf?56`N97d9d_#ytZ zXHTToQeTPr3OK-o$&T~$eQf%YyQO5-!nW?U(}#c$Q|MY+y3g9bz0x7sBAy9c2h` zUvALt%(*i0YFA32v`Gap4;TeY?30&L@h^JVWqh6s#zQVMoY1?=75pCgnaSv9<`P=I zQk*^^#&20dA^xLLe(CxrYP+d=yDF5h=E(&wPC{!-c2rm%LGmb(v-5a`>%4p(6}e19 zYX*rgmj!+lIIoHi!te6&aWPh@E1bg<(#0h9R4J*)-|DD(o#U+lW{0r@#wBN)@~I1w zv@0(3mS!?XBxE^@Up^9~2L#D=RPbj4W(Z{tDX(_jx5(J06XGSpio+30=}Zb})>*+d zg2ZVpU!-mfxZF>q!D)u(f`l7xxI44#p%E8ckh>OWr($9w*OuagJMpygk%PI@HEH`~ z+Ad$q79Nw>n)plrk%uuIs5XfWeP`^D9{BLs3q8s_Gg>?;?+ zv~w24OU|WuwzIhLV8Y>2`h_swx>mYc50eojipO7DqJhw@$0Z#l7e=Ewt7NIFtcp z6t1++m+P?U+>mYiR{2R2mQfzXCaL=>-a$nt&YQi&DUW6s_d`P{N;xdwy+{?cimEEC z?B`on1r}#?#fo??3{80w(vEz+7gE#mpWKdNvhTS~CM0`sHG~pGvN{Hi*FXO|c#a&Nr-t9gIZ? zn22H=$$>!gyxB806*=Zs>>cXW$nRhH;aVT}qG`304KMi588*3>R%R?qZEj;0j4hE? z8NQ{sDsX2>MBO9;o4JR-agV3H3GewBtycURexb#`%R)Nhkcr=k_L$#NW3ddqwV+R+VG zPQ^U5A&&(AfevhLp)XmWVt(>&ayfv{jGL-l`noQ=3$_cKvZ>g)UwmENVF{N*BIDk$ zn_^ezFL^pI6?0p>m-%Z^D0##~BCBHQ6Axhv3-NAlBY##M71*YVsMTJZpZE7q=s2w- zEZ=!qg)Q1F^FI?)A!_#OrS|L2mMVoZYFK~BQ#=YVWJ?{`KZrcoG(w`SOk@Ca%wXXqhrZ(4{iDx#~2IriFD1k&|CEjH|BPD2Uc(5a)6dae@VNC_7>`*|liq}*-lT+pxbHon}vPk04g2N6w6Jkup-k15slJ?>f z`eRX!Utvuu4VsrYj+Nq!(3VXbSd(}}C$$o8fZ60dFs3O)(QBhugS$`OxROJsCvm9}p`D2P1+B@;r ztB!`;?}4pp@(ySGz&>6=56h`>ImKT0^?R^iB6tSZ9(QbH7`m%w~7Pbj7-<246uvf$wD-Upz6K@BfoaGT3z zN1qSa)k}fco<0SjdUeOeJ=cwAjU?y_7%Q_7uIMXw-WG2HK2;kLj%B>C(tMQ8t}-Z} zHkCnO@TkL$E_%K*eY=u)jq6S2^;FUgI#=|(-Es~^1p$qnvLG0M^u0E)R&M-(UZL)6 zRv}fWtRYm|428_I0a9a+^e^>0jetp+b(~G?!Bsv()TJspGEBk0!;FkJr23a_cPvgQ zYFXnBt48nh3({NaY05uQkR2I{sT{6r5fHK`7c8>Ia zdF|<|O<#&&xH3SGr-4zqiev|sUX(dC1V&pK^jMb$CV8)~)ZjvNgK|^CA2NSXt6w}+ z*7URdE;H6;)-iZhwG9XDJ7;P-$ElZ>pWQF;>+2r#2XQ(D2brdlSbZ4PFvak~iG=XA z3xe|&b`~it!4Ls5k0gcnopMN+6hQ*-D30xnmaWkG)I1<*InJKJZagywP3~lQJ*>Bt z(k`>4iZ-SxNh=mYC!r$CR>(Z#+?DHla}doc`Vwus8X*r>u$YAdc3^OJwbQg_{DL`RadENmemr)c%9F+nPp2DK{CIAQgGuZz;XXNbxKMKzFj*J)#o!#z>1Yvs zp-_)=V0vl>qv;keqPyx9+rm~E{bS(Jx>-r7*Hm@mjJfxwIKKzF^iI8wwBgmGu~vt2?HM|tUdW8J8!P${o9^0vxN-+Gkn3}*I9h!A5(RW zqCtQxg!-(`i1{hQHBRLdBBcXS9wU|ugX%6F?A4V_&mV%xM&OycUbmaZQ;+RJAkVIo z%vT+-ru z^npjw#o7Itt#CSbF&Y_LQ6F)-ID$a=2c8ax5-Ux78OM45CG!2cpxd>DC>|)%9W56M z5+Xg9A|^vimsmgjjAGuiq_6*u)c=WapoejO%KlFUKwAZgkQPKRy>n1B*{Jv}DFvp& zyrhZ|!Oi*RUBD?R)c?Dj7o$hw1~qRdObL zPY;(hfK?u;#}aBhAjZU-V<(_yI#K_z3Sy3S=-x75COzRTOD?^bvVL%z?N|JwnAsxW zm;2Fz5p;OCa zR^M^@l*EkgT`9TkgIP5KER!8wN1H?hk&-wHfX@=gH`|q+j`3Z6$QIf)Qu|J#rE%rW z&*TeNiNWtci8Hg0P5V?`&%fK6g76n^I+F9)-TGMpa!V~Or}7#ip*ehL2qNEh{rUmJV6yG?kKVw z;2D8E(h2e1|4=E-q~uESrK?^vhj=JbG46{PkLq{icb21`{=2_VtFPD8ukPt>1;2dk zf>Vcr&;uS3lTej1t$WG=@;|5=cb&^NVA8f(8u9 zq}sm9`0sh3Ad&~!-v2=hCbv|_$0jNPz^EB*Z!9o4uZs}JKn*quq8J$q-4a?v{z5om zCGo(HMmJQa}6>bFM<25cdqLev8*l;C?D->s*Ve6ubgAlJEgUyOz&Ovb5EzS*@;jYBT5!Z9% zk^DzZ=IO@jfM5m^a=iQud48BDcK1Is5;T1u#b0m`5D$0|5P=kuQi_zg9eluu=7s8} zCdyYlBTqa7+94F$??t|4h+9Z-nf~=K2$&8G=yDHHyTxn<46T85_NJ{P%y*c8822*5 zWVW79yYicPDVuUX3h2vqlBEgxfB7O$uxmH)ck^%I@3%8-5I1j%Lx#n2Ywc9lFb*lr zh%icATzy1S+%=xMm>IaSDrGjEJ6TXS+qczaEHE-AhHk za(|m9uG;eR4dIfm+pEiUdKfWkNTbcJaI`j+>PD<{hbIS3v9wePSLp!W6^5!d!zC+i zQban;vN~HeRW3YomlyL$iVYA|N<^-dTj6%jl|f6fy0mSf(}UAwd3?c>JJvpWFrCqVFK^-0(Hr4Cn zkr9yFl+&Evd6=^G2}J-ng{z)7RZ2MtQ!2*m0pvc%go8CHe!W)grWu$+1Y#|}{199V zR~tAcag!2<2>F&m{2)(Qi;Qtjc&^zgl!hyTpFak$g!W(6MNl^pP??1=1%|BAC2#jczRnUkyBOvDzx#D50fgiyQawDc+eVCDkARSCvc~$8Mwi!+NPD_D3Mo(`{b4z7gVPMM(wD&%t@Bf-22b zhlrS3mTh?-k9L5D`%hyP5}X^z0WRn}Tzj*ZO~;z<;Ke1~2ESvDM?N&VlhiDYG;5v9 zkca&{dBW7|LME^9KH+W|yKi{!UmxEwox?IUWTHJwD6RSo7-%Eent`w4jL<`yEnNzJ z!ZWfAU*!Ic-loW3H#Rpz{2X~$R`x^z_Mjr^qg@pEW$b{(F`A8t<|18Lwg_bBMw=&Q z=f{PbYcaY}bbI80>_*}}zu>Q7IcMTPF%t4P={~bn%=~wx{ebZi9*0oYMXkIWvjQ9; z#=o)b5`d;#utGtEug(N#R$j86Mc<1K^u(Zdq7Dc>vJ5TO$#mAyI?{nU@+r+qMt!dW zBTo^+A6fv`V3`mGO|_PLQfc8z95iz`4DQ5X4$e|qYU$nGaaU=A;AT>k;N}_ShZ6dQ zX~OGuQm?;*EL{gY@f~!~@w~15Cj?^zzX+a(&)MpDjI4GV8-reK3?+hkjUxshNM#>@ z6z@j}2g^uvFlvP$;`!ZB3y@aM*hTrXd*l<5b2d0%qRHR?Et&pLV!L&?MUzXRPt*Z4 z|JAP0tAwm7f+3UbGcRNwZLwLVqEa}QQXTwgAw1t}+MITb0*rjmV;iyD4ZL1Dk)7sl zD%~+o`7Gb6pSe_zB=jSuvP~lQxRk4ufE};*l z5-ZZ?Gna1b4mQ?4m)7bg%6|;w+YJ)7yxc&%%Gjtc=Y>A9UCNOy+v_XFk>jK|?V$|wY-gKk6 zK(G`RSis>QnPn9|ZX4PzBqY6P&Q#5|?N%WX^fJ201eLG1E3qd@h{wTMG4BF^-t+-R zq#94E@-F;YA5AXq5mITscU&q>J zn$9T|Yz9s>?+2yJi*W2$o*qfz2z5H^;SMIqTw>Q=bnsK!tRlTaAG?5OG(U=;CdYIV z2zn3OrrPnl6Txdloq1@T!b5;_Oee{{#1Yyo6E`Bk4wFS}NsY%DN)zk+Q}cz1vT>TS z$$S(4qPSp&TAN(+6QH6WJ(w}9Pqe%q4mQ0gHSHhz6?TfO3*sc*{L=te(GBtO)HN8- zV2+RASP}aO)TZ>}$qbDfO%)jaW0w?9s2SsZEJyS?U5*7_hIBv0zc+@%fAi-JLQLEA z-y+o00wB}*%n7$_m;6tT*5q=n5%4K$PH zv7nUmu(mnI;<(Y*WVEO1BUR@RIU@rBqqu9h5bEL*&I72+5a3e#IVxj1f`NC!w*=o% z$WqHM90uI0_$5j9?v5_@U{?pjf{3&ogQ1iHcEc2)_)VmLxe* z>K*=PdOLvnkm)mzn<#n@S$;z+*ic}4h#ZaR_-f4i;|@+BH~=lrd_h?DH6^SZ0>f^d zlc9O76)}b2173yeMESINio>Iey%NA1e+|tpJ+73y$ zi?4`M&3|%ooykGmPNqY$iPDmX=_>6754`M8nZ0Va`Qo$gH-BX&IO9OarVe0RcZg%l zGr0JPUA&e@btE`*WB=C^Y#3iHM6M%J^J7Vb=jrqI?|2H8DpO5;xo4ZUfn8A6BP2Ws zjVG!lJkEgn`*|a^t>D3;upIkL!sj2h(%c5YdKcw`UG`;#an`s28fq)B(`2Ks*NzT6 zJlpp1;g(&3??k`!QMC<)&9VW_(C%KLf6SFsb^9(2Z=5N3bCz*S*_e-M+!(!-+qt1j zixB+w7}^9Glu&kBqg0|$m4z#f`bwoNvF8#1}<_=*g~X%`oOGQt7Ui!}8eVF)~?D@8uo)tjgb5p^wyO$C|XT7UIaYpXrZm%~c=t86-|s;^cxX4ID^Hs!U{ zxO}*8)=S4Gn)?o%E_VVUnGb^ceVGaW*2(YvbFs>YjTxfoM`WKQzYYlvcxIe#X1ZyXFK*m=UNAOor zxl=ph6FpHS)a=0+s@?MKBs!}PWb>5m@gUK7!#mM?M}{u%?U)&V#lJj&9cU$oq!7fYz5W=C1hZ}IRJ}zVg>VE8UZ?^J9J0dms5#m}YHcLB zBYqspPZ}7XJvy>>7B)k!AD_4V(dFuaj9%;fvCZKq_^n#ll`+aP;wxQT?V}J()y&D& zv08D1aZ30A&q<@1w>$&tHQ&4HJu%_hzg55_}p!g>lSe+ro&s%=>n$#ul|> z2jR$<--ZdJeCNqsx@%N*v8XrBN@Si5A!BqKRwG-S^zpN1VwfWU_IQ}f)ZDd)Pl?9> zyyOSoGC^Q+qRdkEy$JGRq=*tl(+yJi^p2xmH&HTv*=g%+lP8JHz$!VH=#ai8=+ z@wA0*4m!nR3SX?!zvZZSVmd7*2>aHDI3?CgIAjZu;tayaXRnlTF(jY|n5j{}lxdO7 zdc83@4`8qWF>A{7hGUGw&5LWXNbX=e(Sn#e(E*HinwJih?WO>+mOi8l@SFHV%s=N* z@nS+@;Z`aOMx|jw12tcZr&2I4fw3FqtS9LlnELbMeD*qmrbY(XkCza!K2GBMk`@|^Q4 zNWYXh1fG*%H5|i&K|`}%FjRfu9_Qyydzo?(8~F#>-jS-a{=wDsmk8cRB&t`AlCID1 z*TtWi#(=HK9UrEec6XtYQlU_$c&*)^irEfx_-Vb%(gwYdb!b})eY9esL-HZkn+D07 z*tCBO7^}GR!W#956fPgz;HkUA+7y#oGG>sCv~t93XKWf zDf!w4L~#%IIm>@S8~yw~_&xx<>iQp(VpF;Ukkp`Fl!xW+AWeXouIcPg+494J z`k6;53)ra%v5X>b<3MT}V%)!mZ@1@$_LTUPz_}$q;VeO%LF=#>s^3Nu59cV~Z~F(# zn(w{YD_W8?+Xk^g-$pKXCyAfr|CukV1wju=z(7DAq5jW*+v+YpAUDlGX~`I4?Ar=| zdleIx?q|Kc_y&AaFbs@s(JR`aI64BA_fvnC&XORdgVoU}zSCouH))jUK{# z-k%`KPzxEa*(JBYlh&*JzP>>4jDh5M3^=|;nlc?aS`SqzDDIVw)Z|GSd1_X%`5eYw zS97#>m{4Z$w=`!#z>>jJxD#5em1@>?6QjV~BTTc#SnaQix{3`;pQX0RDaB$^^IBUO z_D6hSFr5P$FGicU7ubh4Ly&MzQPYh|7a{OT=hBUJmhCmup+6~08dhrSc7v^{M1)kI zURdS)kAwFDa;suT;O#^jt@DC0@p<~PZKQ47@~is7-D4{EfR&enP?}BA)v4;D-Kak@=5z1g8f;bfnrc1=2a|1dX)i zOw(`M%A>qqGLhQIo*Rppmcs51fhdm}g)&zB-Kpqh^IUj#z^E) ze;SSV$e3_}fY1dBELgW5MpTn~iocZ8Io-iwjn`Ks@&sl)CdF#$?R`IdS*{p2)lKN$ z(4At4T8cJUN|nYv+$7_74Q&GJ?@~(229hH(vQY97nx0czalWmhTOzd^AJOj!HO=gi zxDuMnBZck@)zGb8?RhxHbkb3z;p9H~Ba>h{aYR~80XEoCPKbEF}d zN!33v4@0HwCsU{V*ds_$%!MTZx*Py0Qn~aeOH)g*%N-Vf(DpdfVoG2Zl0Zt(Ib{#0 zc;zwz`g?E=r0wRDlDb&qhz{|nSSkm8XpW>pVY1V?;+bY>s3^PSk{WtsDLAf0r#rC4 zViBs$tw7duPV2Xt9Ot?2XSJ>fXHZ7`d|7l|dLueT(*Gz(Jhhl=>*hy5rViO3xKFWw zvRJ89X@Wglx8|fT^B$!~yhp&urE^N{XehY?@MC5&iJechS@AwkB4PLHP8<@AJb7$# zjo5~E)yV+E`x%ycGEWUs6u#O_lPS9c5QgT(?=S%~ZitR+Zj?&eo&h%ZykZ$Ko$^3> zX-1bz#4#a~pTsiHfy|wIu?b}xO4;YDX1!Nh()7HHDx7N!HYJ^kbJ7xouoNCSqdD<_ zz??-F^dY)G9$SMU(GrAm+Ljsc)8@zFR?(btK*LInyCH}o|g*=#ASYk z36W-Qz+fJm{9ic-jV%it9K6%ZK>?*lj zyxD4vC66UHpU#m?vn@H^M!oOjFQRq;*M)&C^$8y0C@uM8$MTsN-e5tF6G>(&x>6ns z23`>;OAcwZ^iP&r8S*Z8%Z7RwT(vG3!2MjvtZI%$K_e^0I#0y-uOgh>!Y6_G9ho>3 z7sLLBxo+t;af#SVY#L&uH!=+9DbHJRBp)*1PdN-LU@U6B6?A}u`oL=}i^>yVVX~L> z9;s5WB6~3zbyDD+C`xdcD?sgIJy5T*QU)qrDs{&56bs1%zV}+=cQuR!QKfn}isYt@ z(GagLqAa=MT(j&?Q>Z$c`)@PjEEHDV2MX6>gP2pN|3oN4Q;K2NKZI8OJ8rrE6>ywf zt(dJ`P0a06hzl$r`^GBrW1FK2Lc#u@LQ5t?-(d<~u{$_Q0B&7QgEz3B<(*4k|l>1ZgQn5R!R;7|HgPiHF@05V?7$XNPyX8cZ26^n2#DjlcnKG!8T zZ;&rk_s)(>%y;ANGA(zsjIjGKyN;3WP2;-mp&!+AvrS=jR2SlXC9Vn`pZv z0D6_o@b6;;Hzgq=GH!CxZs+Rl&;6&4_v@K@2CHKKOw1yNVFIyh0Uw0F-MXzqELwT_ zrH`^-Axo#ffxUljAT&No$ zz3lHtXTSwUu|i1>tg)2s(~6ymcH^>r1MalA+plchCp|DY7yKd~S07A2eR1wc;DmV= zu!fX>&0q;Frku=_U9J3dY!5=x>axN+^JXT)DbF{G4(x=BOR<#E)r`%U1wJB%5Yg%2 zn~$8zXGi|bT>4O+IS^XUlP65Jq3c(#V2Bq={}FA2L-p-Vk4O%LlU7JIQAH2O04&Aym7=Q&DqwZK>;34Kzrymqx^B{Hzv9 zmu57_?|yK|w?G%|w-NlDcg+xI5J(v&l=omMR-9uSqP0Xv(-kqC1d}`t#L#^b)DKqV zFI1v>L;lZD2>VuXN&6QH-jM%&SXWR3N~f^sL^WDMveCa)g%Lg-3aiTv1%>}g80`l9TgJ+8BZN?`=T|xiLmr#0d2Pr5FUIeV zbq^YL)t9Wn4b)!7Lq}D_m#ZMst^kbRd7Cf+n+_U1L*)B0^AEVOSr@v2E2tvIsE)PQ zZ;Z{yF@j@k+3^l&&&oi*rVaLe==A))PStP`J4sZ|T-s&i;YJq1{kCZwowFGXJNMC; zsx-lN7gyb;xNxS2FbBV7m>*VdwXCv5lY`u}^`EZ{I3T^`~ zr~NM!Oq!X;s$goe@U6B;xN8UM~S)a{aK;Rdcb5MF5 zM->-ah2`C_B%%`IrFI268?)evV*G(2pFS)r)b6B()t+qa>tmWMxT1XG{A2RNszq%1(L|G@q|j3i|n}XJ|zX^vUGLM0IDV! z?}%lg2o2R2=XSYU*0fERcMbs8aWxVC$b^J>q&Jg$ZqX0!2;-=hKzE(;avA$U!0Dox zOGub}`3qX1!EYcO4|pRGaDKs_k)B6|46hTS0U+dh)>D9=5qMT^X;50%v*aSW+VzZo zKe;9$BVg$B6!o}sUdy7C8eor=;NV#@akdxt)KLoLb6bd*S76)w|Upohck zfcWUULsTcQFZIiuhZ#57lWk?GDxx~`smRpf%R=zl_GGwnNg`yW*7{t1!7{{@xMS}oXGd?R>n$E{QB z=EK^2u>Yq;xaht2+6WB<gg2_6YuL^urEgF=wEPH|0;cQyUX!uFeL1HM|vnT7*-rDb}4)myMz- zt+S--W)r(|jnJ~JdX_hsP1dQ>s+`#9(57wfVUtRsTgk2V%sokalYN9V)T!9PwowJt znlbuJnG#qjrO(65Hn*}Vrj#1$l&SMejaj(Xo&Vd6XHoFr(eWewLY3abP)Ee%6iugc zD%>?m>wM*iPJsyvhjYIH*8mM}*wj*<#Zp2_00(w$ta!lrB6<8z{0|P41aVFs#*7vU z6n48oR(1mT(a>Mnf1@CLp3fgW>>vP#Oi1mKA1YW~`15bDC0mwY2A|+i2Xy&(`uO9w7^>-JIN zGl7R$HA=VzzIG(GmX}>3iP@~qwA}LT>Bh^^Y1Oux%MLZwbp~xN7Ee_gQ%ry=^w)GJ zIDMju(^zOROqJ%9EzL$Ylydd`ju2E-z4Z|T86xt<3OjJZl8H*>wg~XMSsG6LbYA|s zKt#yFT1>9cjw$km)#z300$y`Xj_?pn*zI)ap)$tHEyyEYHWWCCwpFP1%o$iW*i;KC zokQHOgXxM&I=-US%|&B|c^m+njrd%*F%OOr$v6{(sXH)TJWGL6*sJPdYs*?vi&j+R z>t0%oq=gR!vFc^GfPM#y;$$M9w9dgE?&4Zma9|_+0_t3EIX|?uhBpqG_lWDMN0kto z3oKxxjfx$Y4`hqEGC4SJZj!+YA9-3*W&Uul9Oo}5&M za8A+-0b9qlfUA!$bD2x1Od!c$IY@JQ%G@0)m4mTd8y;0dPpsb~KQd|#C9WmKMw7#E zjdDO26q%%>#;?||TQy-3ax7*jL_w{1E{7^AP8MXkvfmq)sml|Tr1pA_Rg5{^mtHv9 zfS#SC@R$9qd5JpdsuEC9(EkRmJZ z*0Mvyp~_S5v?Dwlsaq9ijivc0p;ey6Z3lSNcAvyzK(odts8GqzbSdorE} z%?Sj5;LOr%rUP_NYm%}Eid6IYOVu(fp|i54we8PqaM>Z2;Gm^~$%qzoHZ31(b80p7 zcvI8BC!;B1c%#F;h<Aa?w`pyPw@6kCbv+sY_HEq29|XNLn#cv~3cXQ6bOi{R6iL7zJ6EhlvT52#Y!F8{ zOJs}?mmrk|oZzDUQpD^0*9_{7Ir?AQAtVO3YC+;x*Zx`v~i;iL}eSob;btL#&s~ zi1UbRq^fThYPgBCeTtBwhQL^LWYi5e&;XND;a$Ud6lJQY_acn#D)-#w7pYN7SBflE z1N)XE7d2Rd4zKv1zs#%=m+6AIRq9g3!A#-P2vGplzF?yR2eIp*uIqP4I!j=+d-R)GZXBzd95pgMC)&FGq9!YVTr`M@1vWiT*uO$FBraPkd(e$IlVl6HB^Ox)L4n4asMv ze5~wiWYs?9Wdshdw``xP$eBN`lp|iLVtsbw@+bc+Z&O|I{8pacN8 zm_+8KEk3A2LqORO0cA2`(n>lw50{( zEp$?hBcy!$vI)hgjZ%@%pbl&y82ng@r z>{0LX;j0)*FS!c#)pP-#ciaT(Jrpr^7m@sj4)d8<9jV*mNRMiU*bP8Zs;BVy>tkL> zZG}g`wOLD8sbP=CFYZiSuBKmWzhnOJIoB!N<0p+O{H+xox8^b%sMyHqEU$#PISN}H zK5b$8ou9OX1R&VsXelNN!Y{9=`qjhWfgiair}>Tb<;~ju-d@G!l+!78AAn=yt#|U^ z*~|EY%P)sX2t><;c?%H$z2^g`^HG!Lbz9jCX*m$S0Zb7bDjPF+#oM&=Y1~zS8?h78 zlgL)ncSX@f?oKGr@UD@VVt_KUFM76`$cr*rsts@%{ zk15zXna$n}l}RJYZVJK(l&F5=Al}vgrDLabSmf4W-PC%@5wm)%n3!BUcO|o+@H>Il zPx;4rWywzHmZ3bLm|pQ)=vQLJWbyK|50Z&5)|H^--93e8OUV#E?2bm3L?tCnJ>!K0 zDK6$Q_Dg{{>aWKF_144cZXqY+Nl)_K6NM@{73XF=rg}H6KNv?eDH@j}_O>J3rN8=Q z=gcdqwa;nOk3IO^Nm9+qWNgd=_nt-in6ilTL zmC2KEoX8lK@F?Xt4IX0bhYmc@8WUIj5GD>|{#7>2Ro3g(LlOJ_6d=ZTM4UI`uYIi& zf8@AV=qzWj88(EnScw?cPAsL3Ad4B042Nbch+>tx*IbjYMs3AcY~ z?bEF0DVg^Ga6Xu8<2Q{4Lj6c@Fl$rgK#};vvKof6vgp53EXl4u&cZ}{4~p`G+zr2a zpjij;mS{3f=2Wq=6%QR#?iBptJBJ$*Tl|v5D)DM{m|tdO9;0v3h{$p!aW7j9ZJ$Xy zdH;yC3dA`zpJ;BRP76Ih@0nO`@w|cehTgDomybIEXikc!`^J*b9904m1doG##`)vX z5P9)Dt=GLUnmJo5IFs9Px)k{;*AGTB@d~27%yN1F3T)B5Y<0603m^m z`_@=e7^>DIb>)c$pWeb4za{pa6vRjw3nQGD|257SyYTC5?e`z(3WO77hXX6SMjM~t zoREwGmJTuo8~d_ao~2#=27AA!)R~;;YVK31-0r6t2nKa@w40Y^fPnT#6ie9iNqdyR z^(F`?4LWnWtAUMe>K*3mnB$2@G;3^T2eu?2cc=qpfETHm8DcJZo(XwRHV7%=+zZXU$fc}Y|{e} zE`(VJ&9ZUg0ah-?6FJ?A&;ohI}A!EsAQ3v5B2%ceex1`0bAb^yd}& zi^4Rn`N-~H_Zjke{7hdgmdn*D3!to&l8B%@6JL>&uEGRjj%yHz8fP5VIyLmAp6u#KeW&Z&PSOtOd@=(+zJI~9eZ>$ zIqjX?%Y6<;KN;XCe#u3xhznl7vjp~AuL5tbUP%LotpkbG?gXsdfV&Xg#tXG27~83% zLjefzten@bw1&e88bVW>69OhT7N22-x#acxn4hUS`za^4?AJ+gnTv5+QEN=HpA2{2 z%n#R%;$Iud-FeAJC&N5`kwyUL=|6Y!(PQ{66_aiFte+57XdBNrc$RvwFH}ni!zUK= z(2CX-E$>b`;!>>n8NLwZXd($F-Qo4cO-l39*MV}NvoUG?(?=#)LT*=+Q z=*PdM>;>)TZboz?W;%7(LXxrfCxih$cce8+^~EfVDpDF9)R!WPv|<3;p)6GoE~6^n z4fsx_?h%~d>yb9ca11nY*iJ5U?X;)-VcA9x%YnaMpNa0SxV6J}O<4n_{(jSkJC)WT z?G6Ac*rQM0>VaUIHwN#jChMkkf0g7CB#s*B|Hd|*0;V)&Sdr??a4Jn|3BoOLgC(oK z!(7+PXK#MKY;UcNevkkH${AdMC2fzlA(ygR!FGd&_Kb|qGc~SyBsYqwYQ2W~tBJ(Y zCHY-nBzVXLQ4(1p*?*3@Hvoacx~Z+Ye)DbABIuV&%}XQAhh>K9TovbUAY3cyx-1!i zsqzeRpixuFQyN*rMK3kyG@DI0Gu*wesoxVcO=HUiG(h0kxLHTV3c06?K*$ z)Pw`63Hw43VDwqI$!hoAuTEuk0jgRJ8u4mWvw=~~U(g9tGH3_wnY zxXs{GaNz&kK}fSp|JxnJdW75jG1u{L`p*E5kMjQ(v@DoC+->Zc!T-mB1i=0OShjI= zw{Ued`Ja9N(rcIaV(e)KZU#qnBt_&=?Y}d>S6r%4I?9cZ4k}l^KK1BVADv+rzkQ+E|LQOi?4Hv zt}Ohve5!(qZQHhORczzLHc!RoiEX=L+hzq7R_x?d#YyMh?lHRm_o2twFZ*G?t^JL) z*8I)+847=SLC=neLLQ#9iADABL&hCZ+Q*AE&FQwku_{TVG~$&q^Sgzbm?z^`6% z0X!2OhQssDe~sb}M?Zg1oK zUsVWna|_c@@LH0_e5Y=r7}4^ERU0g>#3z=+Ow=O{qvV7Zx3*F8&IqM0iHYLim9U&h z9W6O6%YKh~L~$P~ayNC|Q184>I6Ea;hr*c_i^=Rr=-BZhDF(j39Z>zaf2{i<82mN< z00SdmkJo8m{0k17=8vE`@M&_`ly813Yw;Tpz+|v+cdVE3^Cm2;TCW$d*BR!6z{ALh z>5O5Fyvwk)SXR&EZ(cM!50sKtn_=JlUU>}Z66%6 z%#&sEO5tmvQx9KI%h3q29pn*5<4i$>#G^}+6hzdr>>-?dW*iDi5y7TpmZV=d`ojh6 z3Ik(0LI_)vU81WJ4SW7shh$*K#tTKH*HdP*g@{tC_Fog8hj$M&bOe%?U9y zlGb$E230hCyqPMwZOPRTM6@J(i2Q->7w-H=lgn{thpyUgp1@=eZR^!K<@NHWo_Kew zH#jy?y?yEgUNCf+>wRZcN@N^=8eadbBXi4kC6Xt}@eE@;NhVA1!eyv#9 zzqcO)vFgSYSvsw^pFVkiJ9Fr2ZsH(=nObd4=bg2)4^>B;tg;K2oaJ`2j4R+mxJ)UJ z+l3IckiIO3-K2Y=miFdyj>fH|>eMoI$lt1;%YUx2@3RHzVo31Gt0L{87||TuuiVvl zlv69%FssFXEA4m6a*A(~DG2(ZazX_t9QG_+u%qr3MJwE<$sYM^a9#cu7P=cA14rJ^ z8xt$eVb)SmLN{~N{x$j`R4xG|5iV*GQAZvsU2zmpiB#SA=8Rs>pRR2JXhn0v2@t@2 z#~6(UO}&M^M(?G1Eqr`E+SzvcV``!Luz=j@u+OQAdmb$;p2g9eVA*>CH84N!WfDlO zwqY}AH(+bF=mw)l%gJ`eH*(>ea&t*dIEQC%x`Pbk)d>6sxYGU;Yvl(#8KY&GKf!j! zj&P2*$ajT1>El`-v8alX6H)rWf>em`XgpXY+SO=yJ;pe&m>|2ifwU6>^Q`b z@QG-MiO?e+txDS5@G=L#_^-jL*~kAthWZ*7D?34~Uu1!z`jf?>t@D(LdJRZsVw#kR z2r&iBsM%3MN@cF23*KKvM#7O~86P2p;ax5yzl!4+PH&CnxOrUl+~2P~kU->_iS)BO z*6w@$5NJO)-y9PnQ3^`6+OU2wC|I@4hxLx|se-B--KgMMx)ojba!q7gioBNu&@7&@ z=g|o9EQSF^A184wQ8;ulqxXt=+lH*IEwd_5K&hapriBzEGhD_gxd5U6mU>){vX8*J-3sXed{9guYm{J&+454Ty2w+ntq4Oeq*mq=s`uf zQ7H)68-+dtrt}i!REA>wdhDufBGW5^{>P$|&Xi*d8g&b*r{dT|Fn3^yuj}Py{{mzr zLU2w$uf1RWK`r=B!<>+B7Zq`D>KutVCbG56&;8t=2A@GXvD_TAa}k;-Rc}>B$}e_azpT+ z2lAvVO#mD;1Oy^H=voL5r2N^N5HG_3xU25sk><#e#GSC{bk>Hna*f z;%Mg!(rCFCH;^aDVwC}lnQ-Dx{~TH70&Z$W2700Nv@Z3#w1Dc`+7Fp>lyJ9S?Q%2M z{qlSI-Y$PWOo)8Ez2o-Ny;4&AD2WBN)0%QeDxfn@WejyAl3-JIGm%kI#7f}-wVgFb zxwLlF~Z##`S_>=Apk!tK&YclFK{-Jcn z3n2H!wL`x{oa{DrW~i)gopA_XwV9dE!Gkg8Y@Ocyp2auo%vy@~Dqqu&a+wyH?nZf?r zPc>!jOztdptbjA*x{GQyw~-E<1X%<2lgsYua1v|}=?0UiM-iKFTxS_k(;)w5<826D z2HT=N*Vyp-FS#r!XWGVtST8PF+d=J(DOIXbpDN{LG%oVmu%{Gx^E?aC)#~>&8+aL4 z$6x7KmuByD{7y&6MSq0eCpXTqTm~@S8`3_xZKx50#o^=0F%=UJz;6xppr6SC{86)= z7_W1iQmSLw=+~#fi0-vgej+qjcPgkgT4o${(9_3ccSx&Y#F00v)Fm4WgM@~})nJX| zi3;v9NRtmQ#(Mnpi~I!2{VX{q4?mT3Cm-5Fv&xlW?mCRpXq3X9Ws%}6rk}OJRM%&M zLrK~r^YhNxn>R|VuJ(ehg;E+I+QO1`53eg<2BFui(9-rNn$XkkQ^2KtC5R7B)`4jt z+sg}9vZs5*%}4EWZyoC?<}@1NzY4+(rG3QAU*N+!4ytgVtqcavxfl=P!1oSoqxWjv zAi-2S)4!^pqrH)X+u(bLAfa~-zHqG|{9E1)4JNsv7`j1lEO6YA&{Z#$h$E67GM#CL zr}sEtKY4$zc95$lTmfnCl*(jZVAT>iPZKEIWAflvI}ATnKD*9nGpfHZst@`=?yUrS z9d&@Vn~01moSuNzHI3*0^zvE_)R`PrdK=H&tE7D=nUiFYoYvNu>J~*$#?u)0DxQDq z;;e$;Z@9gZm0;ArgYot@+@YSer9v{How0wEkrHEBHc4P z@v@~J+~#1Yqb>B;w#umSI9$bjB9q-5h@6OBM^@FTPK&_ThTr;^*b-fUwb(Z9Tz9jd z?VV@8@odFngL(U zc%;#|LU_`w@>l%83q1(N)PEj6f<#AgzF!x35G>|*!2)EL({AHZ z$5ufNiP9v({4(`A`L?eo1qx$)S({0kqSq-e_G<=$e*$Nwf3Kn%-xpla9&-2aObl2ki9FntbNzdo4-F$hrM zvIMYHb4Q&(6Z74XI~!?=Iy6y*wol($q5!I;D6zE_Nm4?hGBntFMK^h~;j$?v8wu=m z67oIZG)9;&;I@>5T*C^iWc4h=m*)o;r2M7aoW0}WD9>;9A>cTt=jAzn=N;lkxOXL~ ze~js*zZn-WoVa4sjy>u@#B(FZklaq^=?FY+k27EZu$7b5e{u$B{@9%zFi#7r{oS}% z);jaf+C$_LGo0*imQ(#G1D+KlY-_KY$GgdrJF-?^q5UkMPs)T~gwX~q|@!ht5U zwWw>YMTa+Ce`h?dn6l5gFNb3s*PFE!=g>b0vc-TyRcwgUcM*W!|Gvjen_v=VxwYz6 zySTOoV%P6|L`ql6Y2mjfJ3ar^a~yK7>K>d=q8Dawn~5EIn|>=5_Y5?$UYwSff-;Hh zwE;w?7)As?OI>NaAx&Ngh6LgoNCIO~#h-42J62S3Fb#5t)G{=UT<@vjG}OQ8zeR^-5F+xyQHMr9YV zJraH#v~;S4SL*rLpVMpA6zjS*Wt8;gVd|ro$5o1tCpcp-O^^wn;svHB`C3;w72j#I z`P~1OOjB5s_sZM(M-Dm-G>{^`a;uWpaIBKa$@?mv6V_&dVknp{OMIO(Ka!XpQxb(P z8#}f3I5x*L(QybWk_B^EYHa>54vvz9n6ekKY`tmA8s69j%_ zPHAq6*;P2@5;dpM_yLV(L9eF+t6EkV5(b9?2EF4BHgr2;pr=oy0!5MMvwVLBJz$7~ zp#d=Zd2c`dfmu}E!}EwQ5U<2aZ`a)70oUD!<=D*Q^|GzN>FH_ zN$Oz2t;Q2$kHIRK<#?E7dB}O%EGk$ld2+PJrdaTVs5Zg;u~p0?C~twMLOU;T@a@G< zG3KE?Huv>4u|{EH1ODF5Py?O08IS`8N}eg6p^i&BQF5)vq>T!>eyq5wl`{5{QnU^yS7BpKqjA5G^kSMXveB2hw~d1$xxw0Udfxr49oK5v|pVksC8`T zx;TL3Hb1)*CCd8Zj;^$KLsVf`A_|+-a`2wQAjQe3(_e)$?78nh`!ei!&EUMxK{@an zh!j}>sQKcAA%pt<&))T)rBW<`tUA7I3_>gD7jh{Iy3qh#%BoMIwj2g+_WdNEZ;#vD zarmpmTc*}-vsBe%l>D1EJ=wEptp=ROzkSJ83_ea*Pb<&9%-kn{=k?mBWe;(eQ647V zlv9347c#(GyYjfm8|9ke6cUnTzdML6_PpH$NLmGBTACbnAj0Uh*swfqEmlh^^kZG^po4{5R{zHG|mHg7qS##t|V;+Wi$d6@3 z+C(A+hv_G;XItgT8ydsZXJ=mW4pZPT$r7)#>Sj=pZeld$ZpV%SOau9-=*8;zg)Q5+ zGW+83;$gtH5BIjXmb^X?Spykfc6oHbdfn*LU$a_Tmi@Od@owGmfmB$0Wvs>KX$RCt zyhn`%=1Jyo`KRq8jj?lh&l?c{Q1h}X{kL0yQqo)Y0h>)b|S zPlPH+$U$6KwG%Gza^V*r=ikE3yJ(sn5Zx`3$x_so$0|Q}vTIzrRK;O4(c~>arSDuk znp0#G*pyf_PxQRu5J-zXrs?#0WTY5E_h!T_bRV6V^XfP zO~FK4yKn|v=5fAZN5oO>_j@4#&j+(_1RLd0)aiTF3d(k9a#F>8;X=U34-5J;`z{_a zvhZT+>Cya8N{h2eWefHe;lyH7_GDlp8+;h+3v$F80_FK}$n}1?ZY4Jz56__?&#~fkOz9pU$l$^1Aol=PFeQ3qk zIQVy@XQ)x3oLRlQ4U#D(hRQ}C7rl!oW>Fu2(_V*!SCA&{P-~@Mu^OXn?V_p zxX-}R4BaXM4B3nfSEmw1Qs>ekjUy${Aj8o)y2Va;K-F}Nz2JmTf8R%guSZ$Ze*S>` z&mVXZl5~OpvrFJ)gn%IXueN{)l&}H=oY8~x*H~E*p~;-~%j~v?l!W;r1C6MgO0N)% zh8_$@`Go_HvtUu?E;&{au&AqJzp@eS`O~a4Mz5_kjd{_G0Rxp`LrTAEJ)kW{KfQkS zs(R)@=bjm$2H3Iwg zsmV2HcIwbAY`P`|kjkmF$Z6LN)H^^BS|0!D;g~cRQ=(gZulHoX(xD`L>{k)AX0ugy z@0-h#rWz5Eccg5?J$_2Sb+y>ODPh+!CSm6dipaxqoP%$(^7+Y`F1vJIc+9)ICw!F- zh?&(FYK~sRN_wp%rQg%O{}GY5=fLmua8v4^dC_hFU|#c%n5|z}Phlbg;$LIdek;XG z9!&=5WTDwem%`clhs}0Ljwa5U6K{-}=2Gw{oWJU2#zlWKBgQ{&pM^tt3-LPdmO1EQ zZ~1=A;1QTBy|eQ8m$)~&e)S2T?*IwkxcZjBBM>yZcG_)xeD2XJX8#wk_l%vpQ+2=T z9@sU@bM}gy>$Ldv!@gS=c;IF0j{sW0L)KqtO~i}QWh>)Y)g1zmV;bYEV<1aS7tSn< z%PvQcbOtxJLyJ?hl>NKX&yGyc+w*pwkCkE7-QM}xXtlJON2I^u2br7gE4u0t*0E`i zn7NlUDk_MNn83-A+A1~J*p3(P#3li!a2%o-v)WQ`yt%W|R$Sf#bUH8FjuUw1@7m<~ z`*3-3b#Zov*xcrDri){;KPz73MxPa(=GFOT}5JWtImQBD>|SG zH^0m~px4c4R++a0NZyL_##Zx#l^F9pZBtrqIHYjY(Tz}YBxqOmS1e5t>TdAX%E}TG zZ$KHeRZ3XxW1g(Lwz2bcH08cZfCnpKY#VEf)?C3$C1IaC0;rma-6HB@pkW1syJ;i! zGM!7NU_gk+DWN}Ytui`W!XS(vT802%$F^{M*^ytRE6U{t;=)~ryFe~61}J-^v2h^G zD3tpYz_P|)4Ow-)@zJE4C1t_nS_z&%R=t)Ffg!#O%Fw#T{&W(wEI9H%wtDehnq{aN z@V*D*-Fn!NIwD^U3VURYUN1iW#_x-$d|Ad6wp1|`Dh_$imF2~XSMMh8ecJ`9{7`RB zj`W!UE-KRlVXxjkoM@?z{h`jCouMinZJ|~1+8XpCC(X6ID~8x3d~4UJYjD3-E`H%o zHZTV|mFFfqW42Du)wmBI9K7`yR~em8hiKhVUytGtj3bW6U@@qRlg(=ipEX8sBARxYEcW9IArXNY%1X zCl}5GMnb}+@r54-oA8d&?M)Yrw%Ph;kG9#p3ddc`3P1+x@nS)$zqOKDkvFgq@;m?( zG@(P1O2>JuqLTie9o+UH&sR= zvD$c~x@sS-p@g&3rEprpC3aV>>*2mKN#zs)S1wFBAL1EeUOHL@zevMNYk(5OtX~T^4?$MoM)<~V%R|}8KA=gKKi2RBqJSRrJ zvRM&CHkSwd)4yorQ^I7B0!4tL2PpXdEWq(yiC5DQkwFs6tkmN(lbf-}VwjyV`y12K zfERJHeFV&^Cul-upZ%Ab;`kOGtw2VuA5I3sT;$ISk41H#9*OVi!Ap|CzR;YI9jL1>oFeu&a)HCUG9%ye_vXrGHEzzOf+c%_3K7Wr z=Jee97z2sXIq-W&2^(C~Bngj5?}R|3tg%GXw;}2R_T@j{Q!)FXn)>usNg@~(q~;>j zu4ZcuWg!*LUtI)lpR1Fc$IPPN5nzBx`K*r$q6h&od6GVg4o;fTgZPuPBd8Qzs}?L1 zHpXd33@|{=>07SA#ohXQE2MWI3{d^R3Gdb6J$_*45QXDO?dtBD&HTM!Inmlo&=HBt z`c){TZ%%~uG2)eidhu}#Mg;oh{yP-8Rkt{kn0rZlxaHf>!gvOW4Y@-XBL?oe+}Lh@ z^d~$qGbeRaUiuKrIad^h>9c%2*`e`ntXJdiWLc#iQYjR5@fSO#UTZjCBuR=Z2p;pKFqL?-pPiw zIomnNIFa6G$fh({;l_d?GDMO9xYnYRXr4*dH}d5b9S&rO&rChmH!M%uFdtc8p5PZc z#TI2Gs_AuMKEjPfX)S>8XuzXvjm=X}o{=sOna z4}1$aKi9^8m3dc3Hncsj5#)-VVEO4s@Gm|L-xFp?0_l9Z9d8U&H52$Ag_?T6OX?W2 z8jX-Dc*r~jqe9#@`sx>ayMXtK9s4wt)Gm^SOOo(oCXvMLB@uZ3M$qa$bY&#q#>JaC zrEH_w0m{yWr)hk%3i%kkNT~_`t^9=}CrLeH@^ViHARRM|f8l#7#$vUhL3IHhX&fD4 z1ODCD`T5+&S#5V?{Nywa?St-c+zC$g7*Oqbf)Ynf0A9KX1u5LhPLNo@(2?}MSBb*t3glrp^ z1)peB7=HEM3h;1EyIZl?mW83V+sQJX)NSNfJ1LJ@H;L_F%OB#r1WEU0^M3@h>HC*_ zX3MUw-0phN`j@iFJZ@T9?hRKNfSTG-m&oVf^q@N1zt5{V$stf2TC-;vY^l$#MoI|cN(`RMo`ZhIYtFeP_p7e484EN!l377cr(&m{? z=uO7^z0(G>3Yx2vDIC*<&2&@!j5LQiX(LQ8bas80yKteRf`7L>rB;4+SNQr>XLOOv zP_<}8cLh}>;~$Uq3Nfrx;hs-#{miiah;xPltF-~+AZ)G4SGl8q9;WE3Z#xojSCIa~ zkh=QnPwG+rHTl}|{_79SXi^j`q;PUJAIAZhpaE3{`tr97d{^2-Tf%Z&$kH)BVnQP^-V8P5S=^&PJH z%d}~}^08UNYJkh%9v@+(L%Zsy6$g$(C^4xcJD3M&N`Am-xooP;Q@WD$j61caT5!g; zJn`Lvk~_p(c2vcW?WkKOcUGZ5oS9-TtGFFt$gSVc(Y9o5;^h;+L#0~bYiHqGMy-6W zC7}XfU(pA|s5f1)aeRm0sf0C(X>;z@pXBu{y}D`O5Gr0$+0ZLNoXLA?r}iiWPO`OIXEaAm%w18*T>@*!fAf4rKQi>nf#gf-%UOlB&#)MOW~Q+G0^GVBdm z995KB)w`F005+z=@AGf+gEL?`;4`MM$63L*6sPzq40ysS%8H8?6cdN9b`F1hqq^~l zmQEfinW)mGQ8p;z5b0HZ2Y`O1bg5Xg?C$I|03dfm??xqBO;7Z^ha9?k>b8&Xur%}3 z_a2K_r*O`9|9O@w#3<#hT?V%Wb3(u`K{N!B(=w`M;UmBOp06KAJ71Eo0Y(rt=Jj_| zf2K+c34AF1NxO8nM9`N)yUPSGObZfn+>TGV4wuxnwgU1|D!A*?N-sc^G8 zZDW+_13mhL5_<&q4>}eCb@lEc8Xv$1oP7|q)f&anwqV@U{DLq@E z_z*d5riW@-Qt1Q5=@i9R1^m89$sjqUW{e~r*c}wpYg$hfip_XZXy_%}w1E8LxglCO zy)Skmb+10WaX)}VVCZM^_H)rg3@{b$0;E$Qo-nfpOgMp2kxN|fU@d;Fo}96!v{fg% zh;cCu5#fV+AXFnil%B7XJQw}5jrJ1r;fv;O= zMVCdnuf4LODT{b9+a1q?@d2}*md;4^jN$H7?u<~!$iNxL&@+~s(&nI6!#7w9$-9fX z;>AL9B4_{YC_1@H?XRw$CV#f?Xf(>U7)+Yr3(B_i{c=uA5$46ws##stA6^Gf^`7r6 zIqEqj3dlgE?f6pN?QKeEf2o9|D+YNr<2Uo>9$~q+h>ChSjBq+<2WWrEA#ESy+;18i zP)IrU^mD)h>Tl1J-{q5;Lo|&=-SVF3129PUfabCXV3+`kQD=qq3UNfHCcCBI&xdS+)2hy*;#bE zX6P@kuas5dQo>)4QDo;8#V67alCTmwU-f|fa(CJTvueC&-{)Ju81S}oWGUQ!nthnZ z=8#{z0m0K0hRMV|AuY*w8U-&&bDl?(uL-6{!u$xRPmylgya;+C(tT>+zx4X+l{-rI zw!aKX`)r)==1qCU?(`Lqyb=E{Q*8deZm}g(PY!pYkboYB{aQ3DkQH50F#P=u%Fq-z zhMX)>2Fs-J_YSoCmoDSsi)?bqQvdJoV=f;)tmnbMl9kPwPB~Y_`@V?6H~3MJ2J}x< zu&#{HAh-@!^u z3m%2cuy&@^h<8Wf$AbD43KHK_h`ER+aVCZJS*d%&2g>i z85JDK@93W1|I`EfVs~S+Spkzq_9*oYeEjtlse-r~B3+@th$Ywr^Itp6o*UCw*$WRk zMphimzT%yOP#FH~_aAu(9B!uxU>a{{Ozzg>I;n{djyLEYBg(A4A{yKdHivTpV5(uM z?`3)4!VX!nPJ0?W^+2!60PYtsN>mU7O%SoRuRI98ta9@1yYGb9r@bPIV{;k$(AGmN zh^lktCTqE&{ECeq(g*DRO{~Iaie6=7N5zTa1op=BGKn+%g5drksVWdc@C}vjuZ-xZ zy6!Ih+RT>bZinB~WC@UP1Nx3Ib&!C~t`UkdXva3Qw7LOL3&nuy+aKtlRD zm=p{eMo3qq5Ei!)${ByXuzu!i_QQX(+D))RlbS1Z7fjHfWNC7&Xye7EvnoGt7xnQb zqq^xti&P?XljWu+tlxs^Lw-M{j-ok^ru9;V+H2!!-lUr|GkC;<*eX=rbt#l zagLW2yq{g9m;V(+Z?K97`YVJ1N?XPMc})}WnPU$^S;GT)aL)ffrfTOtCU&k*A|xFF z&niquu6|BJmQ?*XjF||=Yggi}62(bnzywRylb%UT2B=?g@Wrrb(rpU4~re}rI zlS}~|91K|*FTK|#HGkZC|HSa=ROqDo->SctXe7%&Ob=e|%fl`I^ZQ+YeYNKF{(Su) z0zugC3fE9@NMze^9&jX-@v|8cur>1y3EO^GV_G4)uu$I zx8cVpG4zdLpnbTxF&hV;wv}*DE7{l#C3{_7tA*L@%1_->YU-hu`jpf^cCR)|cBkmS zbmgq)|M~xJ%DB$3$$p3X!qbXx?xUF6K($8lYpfM6$T}ZXmf}Fj?!cFvtt98A_}vAa zAe^@xqtlMvh*X-7`isMSt6XNOUmm6V1ASndyLzPRB2bd9E}^BiCKeEGAF#Aokh~Fe zMSduZXS`@QDL=Wa`#U$u@fXxNsMm2C@q9h_{H*dkeA;y@@2iZ-eKJRyqZPW9x_0Rv zD892Kv(ZE3I9c|(2aznSb5vf%4wr8&wKe~Qg67v`>OIp1r)sDZhP`HOCSXG!RhUkF5|Es0pDMcxuN#NHW`0& zHfK6hOE0;Ou+Ao9$RkL$oTGRT<{;NwZfL5#at{lpp8b-myKWDu`!n#byLOid>3UxX z>G}W?n#A@Imc;Hcv_oXX3SM~a2D(?{CN;eN78n=q=Sfjf%^?Gg6F=6;| zvUW}usBsK2Sf>I@vS4*MnTL2jjuGs!X%iIxt7q&%9+Uoia7!;nGSt5j`nXtjsXrV1 zOTc0@IXtf|f}k#(iO$ooKu1auKlMEGLw~-im!%Zk->fAv5_K`727sA^YQb2pt^440 zNAAtutaVqpc!1nLh$*c)OUw1t7Dk)JKS*=wU`(kJg}JFT%URXv>GH=CVg3ETVy*uE zGig)$MUBBoXC;j0*njWS*N#^o`Fp#Gi3h&mn?I4`s#tLY3Wun&_{t*v#o@= zdWN@P2G=dFQ;(?BY3V5ta zWGp%}H>@7!7|cZp2VUaAZAi7Ij0xdIgc4{aJIOzy%}s)K!CMKM>GCR2905vb61RA% z@U%d14X+*+a@Eizj)g<}o<`wM6u)D~U(A^=F}Y)iv9bwT>qs6rzmRk9h%+(iJAMS$ zHakuoknKBVF*<86u;?XL84dqK2U0CaU5uMsseb1mX{wXDASddgkr>OOhJ5pCu!=@v zEO?qD1?Gfd{E~J4;rhxMK$7L?B#WgKOW zmL7aDf=1Or#2Z{JMtqHZhdcCnRR$L(VMvG5G~_w8YAE+fO<}j2=oDIVeVrw zKV)e!!4uZYRf8?CLY@{8D6Tr~HV3ygD`|qc(jy9C@w60ZR+cnHto0h<&L#Twnb36L zN`EO8^KWGJ$w^69$I}?KJm8ai4-wS49&T>c-uEZ@xT@|5aMngRY?g(Zmb!NjiB(yV z2;^Z1nPyxBfo-Zj&liUXAU(3$fb(D{Yz~u*J$s45k`vxtOXOzPd3P$OrSpoMORt(~ z22(B`vu}?hZ79-tx zeHeB&lQoIQ)a2K&$JTt~Fsp~O2zA|V6(S1mDF3Vxk7pu`%lWs!C5s$R3lxp*x>GgpwB zlwI{|t8MM?3tPK~fG52c+uo0k>lta7(D$>1t%q&HS)r*9#)tU1zL!#(Nb9851qG^Z zy(}0T{GR0rCH{IBAZp)TNxFf*7IEjA{1W2~zs>BwMTD*WLoLVq#e;66EF}K?gVL{# z=~6`ePAPoZ?%NloX4~Y=bE#!Z3isaC-4385!Q361xqFXZ(c?>_tPv$*$JUUxcjfF^AA7#h!Nc(q%Om8X!QozY=?gxJF@u}P$=>am0i7sj)w3mdCGB>G6>VDC_H()K<|Q@N25=&cO)&UPiKF(=s8!_YpZ) zggV!+2kg=dROi3GyBRxtf@9g4dGLNT!t3~s+ipx9xHy!5cUS(z(R3@ED{@{c?3kSJ z&0^))Vn2j9Q1&>&BXD>q!PmPlmiT57;&Y?U;_br@R6QR1!*@|CM!fJ;knS1vj52Yr zuxP*X)R5jcouF_Zn$CPohC*_C12PJX?n@r~ey<${%&+%(#Pbnm$QCTWU+Zbs$85;X zpF6gF59i!je$qGU#QV38^C;!xCkp5*xo`6bTvs4Tf^NI@vRGjt@Av94ps?MHgK^qf zdU{cmcH_;14HZXv13XBbaoCUIiwAjc#d191XRj_h*{*wwnY)dR{ySR9=H{+<>N1gd z8*NbpN-^QUctY8V2RR!n$&h0sKCH0C*+s(kIGeeVa$5U7epB=v+jvI6W-<(K`$vsx zb7ry+`1Tn@{s&p=`FR?5sX0xyroM~?`vfkNOTawHdO3Ebxk4=QFIdtuTp~#nWog;~ zBb(sT#gq(R7Q7bn5mc9`k_WOI2%qND;au4Qt`OnJe)Gz(3nu&7+qD@xrVqLIW51Rf zC#=kz8G`R&(u6ldXT&{l-Q^E|FXi>jztKr}3C=<)T<%SnZ=KV>Mj>EE1e2~r zt=&kmQ=Gb%GEYzjYnI%u?7w{3^6N4OkeYJC9Ke-f@lpLU6EeNrHrX*@OoWvl^tfk| z1VT}86=ASRc^&aCy<$*9NBK4cF#h7A-N`m1E4#&hYRIfuU*3+T3nN2oWHZm36_NCs zTKKJ~u&ti$HdZr;+{wCt8(Yf#eF{)9(*{#~hm`vT1)z~8))&?TDC!c)4wMjib0~Tf}1TWw>WbLE9rdyn~6^lTiT;dW!xcfnx zd~pY7M7czLJ>W+Vx{A?*R1G7~H4f{GO=1lhUZ+9MwC^}RhNs&e7Ue7j@FcEN2=h_3 zxc)V9s>kE-+gOQ|O%tP1H!G$=pcDCeI>5?Vj5x>1P#&aK`+}873hZZ91^L}1B`CxhS-{Ez#f~q8qi^7(^!fgk8aq&z2HbSBJ4pQ zWVc6)N2YFw!NW~dT;K{F$C8E0xD(ypAd0d_l&Ss}LN*XHE3)!r#sBsNf5&t*xJM$h z!ZAS-9e$qAJ)O>Ib{rtH+>uGAH9%z^BF(W)gdkmuyLX{#a--+IDh)Hu2~=;z!c1zX z4X|0);ob%*W$>{O<3TZM$jd;G8HU!ib+4k~AzM$A#D6!j8UnT;@dS zrR$)p)7VetRsD=d;tvkk6E$OnX+qczS;f^DIz9jt+2A-Qq00O+8HEYHZO3xq8VD80 zJBdQ1R@+r+UX?V143ZR=0>W6q>Y{^+4I@qPHr7#NWZ#v=zh=a;VfH`Cl^%J}b`=m2<#?Z0rmCrOFaT-BBk3D=jnWbb zRLmyJDN(69bn+Ki)>SL25ZU-b9M!#@`xQ%FA~tsDh8uU2EeP`k)6fL!nJ1NOEk_!4 z(!C$DX8RzHIw=+kW1ago4AVFi|6t4JNFa#kB14nQ$ZDJ;(R$1oHkf=-H=Z3%W6XI^ zXA|FS5zPu)WR!Pnlmxa%=5peEgwRWDw&-M0*%+n4vuM%`#3bH&R_vM|Oy_AcEg{a9 zli-0hpR>fA7WH9-Ci|e?KvmtA3+FIGiV3*Q3Bq>skYK(L;*to&cdQS+;{$DSym@k%_*DYTN7M(R5r-7pBg?CHXreg__oLGV2k;~v%F`&!;MMEBTI_nU zLTrbIFuIJmi<{#_%9oB$Vy`@aH3t?sqY}?K-`s-3V$Pz7)$cXaXOzWd-RVZ;F@N!u zWNU*Y_GJj|BVLsD*TFX&Tlp5)xB8N9Zs*;O6_?a2r1!RyE2N|&)j$jl*K|`_Om-}Q zhgnp{qiW#P?k5ZNwU3FKc~-TS%#=qGMnY(pWly`btWN~>`k}bs_WU(|;QEfX$i1a5 zsj%_pd;t4awtdyfIx8`cN$>Nk`obzXkk%fW0->35xd>WNc+LeoXL>FT+BvtPbkf{rMNMG6f15sc zDRNwVhk_~E$NLmrC4n9`I?!vseuylP$QH1@0qhlHISs5 z)%I~3;VTDkve01QHFc^3E?VuD^ej;mZ`Z1WU8jH4Y2xaYYFS#Z=qW8KX|mQNjC_?) z1HR*Je09kR)9V;ehdSG?Gx>$wT45fq*=4!MrTf~|`SOjNc9?J~otdjyir&*E2FW2R ze9rQ#sc}60K)mjT>m_GqA9>82hGtX)89!=yg=Ln{>%Pj`8KOg}XJ=t;^0;;$vSfvQ z(7T1rc|w_;ew0s3pk%ykH-9X;>e?)8GmxXj*HGWV8cDCXkjuu7wR?%47U`1Fp|+6A z?py`txTX;?uRPbmnyF}83(gVbilf!J3a~zJ@s-#lea;VbFEGy6q*R`WwaAnx>T;8e zxrAZa4GUi_#NwC{7*K;d9Q)u3LdDfS&3^ zGjMdO6s{3IIU#lc_Q@I*gfUXSDMvgk)}>(s%W8hHf+p8gE}m+2LFMc9L7bEsk>{i7 z&+JHx&RvVExA*F)mZD-_O{+Z2pQqW}EJvlxKa_hPg{0~H*+=RHO!7O<+>D@T70A~5 zuXy9BZ1MY}cd5^bhvoBJqlM%zfU$llQI>p8%3A~NRNXXaa-*DW4fN$xRfKC0=9MK0 zt-ALPW$`?HlsEw$o}st|U&-r7vg4i3Vf`lkcG64&Tzu04+-Q1;J9g|;%iXoTXwk>q z^pF)wodo`R7p!ezB9Q+}Bl0Nq;5-Q!>yAnvGAfx9*R#9ZmLRO`Wgvz_0#Yk};mANJ zGYC-AJqnOwhZ@hs^{~zEKzP4Gtd?n2Qm1v+KYlgO5na5Sp%>UjQx00%vXqiOQAQsg zg;f{!))q#)8pTFPKuR*-ZsHq3Mb~Vt%}aRR5yHKMgYDwyuMs`CYJ|-GY2UkbWGTr$ z5g=dt6g9p9rZSMzb#wGT0G9lwftRKnGFqC#kN+ksgzJPKNge*DO3%{tFTn_I)21@i zk;m!51v}qtUY@!-O`yHkX9%FE9C8IPww-S2SYEoCA_+=doOC1Fw}m1IBdo$HSYw1K zXn+;I;#a3ABhp>5;|zOnDbuVgn$<|gIt_F5W;brB{%Zw9;_{!>8X)5eDqPsSgWr$`+4Y)6OJFd?!O;A~qNcE8?!x z#gket&}s~|S{oBj5xAPMZh4J*_Vk4T*1jPDRk1uzB~SL&98a;S)gZ(1O!jR%n@y#h zu$!t0gO7u>kiSFbC@06yJDElz^g*!~{~59o8DdUyOO4bm95Y^Cjdh~zU}{kN-^>A& zGcv^{(#Ua*~d2 zk*`{uk)1c)>D;(pN@8-`aHp!!pq>6H_B$~$>qIfe|DACC9pIn7_o5CyU4F2tkY(<^ zF{1P`I(s4&D#=4xqVUExzbbAfx%}ealW*{6*v;_?mTw9LRQ+?@PE_`L->R>(+BzCfu(`|3Ts@wM^UcIxp?{5F~1^o?xAq{ zoUSgLc-W8zm=f#ydm|5=I9jc^A9Y;0Z$mpiBM<$m7EqU>^TO9>bRw9r zTh4@DMVbB$$&5WYU-&`AQX4Qg4+4L)Yz>HZAiKsELwBujC2phB7smAF` zqq2}EIll?@{cVL#HxfRgDM6~d9u*s@Ls%u|di+AV!=`>*YU8juE^+lKhIu}u>IYTx z+Hy&+9iU8@@Y+uc6Jp9-)pJ*7H{;@jw3GY-b>yY#*&)tqx6oIqpAk05tpcUi%tqmr z?xD&;YWuxz;7Q0`55n5gpEmrI=$FkB%ta6dD^f;hqt+}>l?n2d`Sd5`C#FAU3t+ia zG0&L?CSxj7&D@zs8f_DOt-k@TOHeP1gxu)@GJwqLS(ngUA`nlALJGt+ydinT^#@3L zayBnorBYf>X|0D!?iVUfW(YLAT}gT0#tjR+g#sYKTf299&(uHamfBd|pnbMWUHHQ? z?}@DLHZ5*wXUG$jsra$ZIls5CRKN}MD*^Rk%KD%!0Qfgjz7uzl!of4cKfc4>Z6Ggo zmjD4l{3IHB8fnX)Fz&G_{pU8U%+(Lxh@q)W<7?ShW!xuL%^)?8a-B9nDE4w^z?G?< zPW6;|()S(X^TusK8Qa``Pou>G1<{%_Ql|ga*H=JAwY_f-gLHT2NOw2V9nwgOfHX)q zLzjTS5TbxINav6OQWDZ74MVH6G~zdxd%f!Yt?z%%k{CT?aDdAX>Y6xu2> z$P+4R15B5rkzX<0d575aowN&PHZSKrL44)I%IvpBGCGb!G(W1&vbmUIkXaTWty9_$ zs(4h~^5d~Gew`<&UuuxmhkcjOxO*+0o2XbeP<`q=zanUwU_GGH%)> zQ;f_fv#c1^lxzyKSo*Q$g5#b>v71E&o6tFwj%B}-_o`D9R*WbO^a&zFvbS- z0F*z&z$H107dIVxdWhodh#h-<-VNWQq0i4{HRWBuN-iKPuxAktP zREii^x*oNUr(5Mue1Gf=B(2cPeNyOWWIrF*6`q4CM97WswiS24A3f6#dC`ZH@F6l0 zyTX|XHt7`1moXcw6MSwI4aVl(65RM0v=RLrZ#pWGMl!hl3&2`y&$lyxZt7gD#}}nU zBY$O*CMP@SUg`s2wDUabJh-c*^Oo_7FNHnGhw6L8Eqbp;4%?2)H}AuC;<+z0hF?0f z*>>N21Lx5987f^dqqgd9T%>FKQ26Q-wxj;41vwWZfXa4i=! zI<8P4VRXq=9ZR^jaKJnWo{xA+YGh?43?_utpVB%lyhu8E_-;8Y_nb;%Ls)LxAuZ}E z6JPS+*Py1)_qbNY?Iz?Y%^10~11Q9Cm6P?Pn@+3)qNPB8mw zMX5sUrp@k$U?lEtIZ_*Rt0UQ9qQ~#3)vCI$k-du5-T~V|)VXEfGIeEJoxTCBkc7r6 z5qO_F<};}~o!(bBRjCXh)D`ttaJ3!VOOBPmFP#fhx7(uFc=A5C&+KNCi7)vngM3~w z-g{2`g|Z7%LYW+A>w85Z8t3bT`yPbyfUrDfDFD04BA7>pM{Ab5*TGbBmYd;hg1qb* z`PY;KDp0-7v__O2Nxhhro+gHvgT&~V)f+R9m`y%O%@5qBvEpYf%$K#$K>j6qe`GTZ zhczVw%*oV=qg!aHP5+w=0m;Nl#PV`iz(h(8a|?AP!|1|}8^udw*LGUeO4(;PFY=#I zYciNfJqI@@+Bc*6aVl`XR9f)GH|>G!s+^5Cd@cUsOTN@Oxl7!((#N;sm96Z3#NP74 zX0q59J1}CK)mXveltXtok~JTy!}6jVTQqMKGaFFi7d+s_+3Bny_o=QK^}2Zn`D5x} zmvUow(WnJjSx2+@*e7_aM|1Kd8cZi%a}9LZ6vR8hdLel)^opG= z-oTHv#~)IPr$nM`M=j=;VjSJVruc=>-EhXi)XJ8w?bP1;BZT)dDOJB*~+~qT1G0Yh1oz zfAuLQ#P>ah4ar7)xi{k9+jQ}~)P{P*&tT1$$TUBDBXJ;KT|Oa_a)Xc!+xZzBkVo=C719;{t@B` zz%sP54UfFCItVE6Ell57myP&lhS1EpF6YD!I^pSq&We#(zA0*qvpv_4Ome?$qdb?Y zUwIn;RP9vrJj#gH&f57Lr8KUL!r8Pec5FI8Pzx=v9qQ^$@RtSN4b4j^P^4& z#YY*ejnnHrY+KJ(0R}(^za+VeA6V4e`kCe@w|}o&)T;D(xN^+s{QaD%?;pzO6C%A4Qn(PpZn9TkC}6U z{$O9E>V!*nZPL-s_u+yN&LY!~+)a9ODx6jji|VOWA@M}lYA)HDIgUN$-o)kPBsD16 z7REdEcea;t@8{ynLg@^WlY|}3QzO8lo12NeK`fPrhjDCgU4?eKA@;h@GcYvXt0p6lx@>Qd5c~&|8*^>P+M!7=fPPtG$wYMTDiJ`XF))D@gsmxz1K* zfW_r?#iP&p24m5k%8U9$;|M{c$pXVCiSNs!B%7!wo|%5+DgR+kjmE<&Lp>b|&Ucg5 z#Yb+;mwzXU`!@kx&Kgwg9y}KT8#X+}*4=uZlo2JE z12nXb)T>-wL(q#>!#+T)jFuu?AP0>hVi!AA$O4Qgkq<$X_@1Qo>}sGnU~pV(tDL9p z7cpqZVgwwlOdWrD$7eYp=oZ4|vhVM{BC(zAy*+Y$UQ82&xhgD)zD}xdgr}GkHO;MS zf(`MEh{DIQ#v|wYBK|hoM?6lj{4f^$K8-B2S5qtwxAOQ{fOWCj_G}=eM$DK}`rVkKA+V$eoB@(sShSY`VkWWQXU{N*#a&aYZbBhRT9q^0a1;!2CDbyd+Lc1lUFtQlP5%aG$+Tur48 zQ%c{?*dd@;F1%|TjU-08`0x!V58lhv7OM-x%4kNKkwY_w{istuG5&;yHeWts94`Gv$eZ;u^!yo7)) zcEgdI8D`+CNIP_9+7yVowb9dfStRr?ubd()>+1K_Hc0qS$}#NaJJr6{fl;m*jvciL z^PEx`t=&`EC&n5Q1f}g-n%|YbEHcsUo6dV;1iUh3(ivEYv^UkXZfs}#A+_Jq8?oTV z!y%PJdF~t|T9anLnk^|k8A2N_qB>$eFi2FzEQ(cFZm!2T!!FN9HTV5hewx&0RI-V& zvU>*I2wVi}HQE?;8K(Ci`+`a0wBIcYy<_o-7?kQU26hn&sYh*5_IK_B1=@)oyy0=m zoOA+J9nuqBL2Jp^sPGkzpy5?8Ni-(cH_>lYl-8-xNRFbzqj)$h@Nvc)I|SOo->jLU z@w!bRd1)&z*uTvo#Sa>h?C9iD&PWM2KXQcA2_I5GgPwaMQT{ki9R>4f#9U;BudGYp zffEyZ>jCCoH{sE68eoE3_BF1HvhWTIQ>n)8N;MuGyM~wJ?1lYP%QjJ3H(7SyWjnJO zt!Z-_YeXF!(v0+>ZC@!S_q6FsclA9|O9e~qi56m8Jo&n69^}*yG{uyLlRGP4Fcq6x zHtlQ|s%JUdxTGG^34%)u+lrJ01~;GasxXk~4VP4yj(>AV5dD$2gtf&d;{0+UZL1A- z*4xB}9rXSnU8X0}i+CrSDxPa^%EY_eF89D=D}@CoasnL~*)e8wphqIaqq_2Ocki61>3epkcW zVZSrmgdu7K9cKvcCrN3@Ai|yt7u#I1pKl)4Z{bR_OBjk@VME$5C|6XkYSj*DAvMiaPN2lr*z;D4&)<-#SVJv&w2HjNiYWa!ZblDL z+Z3;Twv`IDiT&#C`F!w59=j48>)2q@MzI(E7uwa7-6F zn|OdgK00P98PBN_7@UYhAb8UH`aWtN4xg~*h130U@GOt2KMq79%9rVNlIS%ayYN?% z0c@H6nDEIiu;q(W>-hnO*{tZrN4?|M*UQqhHQ9%!dOZE)m(Y|iBBD)EsMhFv^&MK3 zOP=-40o~FB1D0qcr~}>KaprfSJq8Fk=V;9v8V5F$rI;(jDzVnlaCf`^y>65CWv zTy#{2lz3m4UM4)*g^utCfa6O{|Fgg?<87UjK^9&a>y0U0`xE!3FA%D5F8oiRd$-I~ z@!Lay1E9``8O~9*yn0Yzq$Ip&IC~FRKSFBvvr%? zGn3Dy+Ojr`?xg29u}bS_AF7rKN>vN_=)mj1OK5Fqlaqq=p#dBp_R7JKF$@Z;In&Zn zU()l2qEBMN;*XGq$H_b{MD&KsOBmuZh$IiSG4pYVW0l+zbexu#FFn zI&~*(rv=tJWq#Hlw(dm7YmtWrO*Pc6;VA{Jw9hOE0CmDZ)EL00>#Vn97i(^=L z9{JW~N(0Bk-xw@b;@32jtG_hu7?vHTJ|MwMi42k-sw^QgW;5_SU7Q&i@h}ejaxFh} z^H|p&s$hDAwZPW$y2H)z=qoDNWDomIO264K-Hb+M3YgrKWV15cu^6PH@w93?R^|G` z(Cnf2q=|EP+=PZLb7bke=V*PIeJBrLBslc9vOo~UVmR25$N^k5xfiChJxyP+)QNq@cjcrRphxkwmpNAvS@jBmJc7@?o?#En52K$UjmW(6ks zBx+5?MFfu>mK?prmD`fmrRzuJiT)TSt}qP2O|$~=a^ACBm(E6)*5y&6z~PO5m4Tb6 z3pfTpM8#i|-U_FE(L;+zZG|UriJQ0&u#!Q=-;~yem-f6>|jvI_-LO4tI1LrI6kZ=yWO!$))9_ngZLs$imbWclC z+1EUzg^3WV#~yQYA4g*6`PCt>itHTxii>trsn3**9YLQST22<(PhP7We1h*t2dN(i z@^$mJ#zo#<@EinwxCVdlUpZfvyxIuEL9iu`m1|S!$wFu|l0h&7!5Z*ygc-roou(gs zv!Z8F4w3O(Ql1gIBtMK3QZ)>=q+h1Dpi3ZvY%SgRvVjv$y8M0C7JR&_!W-AA%Fjmt z%f0KZ8G$sT%LJYNz5z7gWtvVj>Ia=Loa3*u2mvoYTwk6f0VD_4KV0zPbt+Ro7-@O4 zI){jm33E*r(GeHpfI$$%`}e^bD2FTwyOuu(ER8wSU&;*9Ur;aUNavjO^Dpo`3K zcj3_*v&2JR@xeMSr3?CY!p?Lg-MwfzONpetcQr}|+fpu?*HYe^2HwV+<(g8}fgNrS z?Npctl8Q>~YzLA!fGS3(R`a^aTht6mT1fDH(T*-L&}Lk>h$W61Q%>+&GNpxw!I0ER z%PHdcGB$$2H^ml|yc+oK_W-%{`!tnx9MHxxn{z4liSe0f3ip`Ov-)~Pulk;OMZ2%dW_JQMs+ zn2*Be`JI_rjArX+sg1!LS#h~9Uu74_Z+5pxd!3cZZeb7SR5?=;S3?C!Zrq}sqNZ{& zIY8XzWzU2!1t0R#1TBw`vYs^ly=|gHC(xS`wZB zRo>J+^0+XV8G(lkL#&JM<9M^i)s9;(1th^fS0^if^r%$kIvL@+m!km4@pfC>yFN>l8Xe3o(`!= zg{|w@5{vVzjfCr0C{>~NdeTE$$h2{^$ON@(hM#z1xgkQ1oC2aM0@M8_#2qvg2zkg% zchZi;zx6+y1J53;UGqlbk{ltDJ?L5I<%B6(@$B0J7ERj3V)XeP4fDGKdVto@f zst&ZIzhzlBzi5p9(SN~}op|&>oCU^`@mY;lh8Z_P=FuTq5CTV*Uq9>1v8Ja9k=P|s zdk~1mTd?eWby1(J(Zu9s2H%V@BxF&Hj)|*AOO~dQtMkzkrva3BGrc~zOoFRF(^*cU zxjL;we&$HS_`X0geanjvgp;lLO|6Zlz-6b3t};k+1^#|xY%ZgE>sFo6{8!7T`DF>^ zu$knkCWy+DqF2WWghaE_)9uJNjHbh{f(1q?1HrcvE!zt-pbj|P+jGe_5!6mz3)bYf=q==;T$#ZsbbVqk_z~Wy($8W7Yf-W3}9vP z&pu7p+rIFYhHwXxSbwXmM4AVU*<6;2Hfl~;lUe_kseFu)U`(0QmfP#*E^QOL6aBe1 zqvr-TCtZS7LFiZzL#GpRC$mYy88t9Wgz4duo%J5Mn8Rsi!?cc}|JnTriY}1wi>FNH z@V{2T*@uU0HMkBnpG0lHC_8}k9}@^Z=A+8zAnnwD*+lI9m}0-z^JV90_@s&wM^o^g zPbM}Sd>LMe_tg1RJxeaQb?}38{seV!;AHN5m6y2dSqCM42Oioh^+k2| z!(Bl#n*Sp?06z~>s#T!gWmhD-j62T6t|WCq{&NTN0S5gQxGAuD@w9N|8yPX z6coSb-b?iiMw}SFU+&^IbL|^=3zMFG0`_u67ZPn&c_&O*#F&!--uU*-1Ncd$ z4akOY8v3G?`9UONTCa*RlLJq1x*=6UlCxW)7ru6G{M2ehL93uEC;q6JN*xg6DnGMuEFzq0tVM10!yN$@1+YBKvXW#XprVDl}&3Jk4n3FthGLj4BiaENNvm}>Pp z8n(2?NLVlf4XUde^v0G4>$S&3x*rOuu}dVtxKA^&2)Z0=IP!O-oA9mO>2i?=)>PcQ z(AH*F1(Rt!_im2MxrXZ6*}ZE&)GhS0EnnKVbfK4us`5P_0HJ7EM9oIkRAj9rt5XS{{pa&+z#fuE`-JKleXI1S22>1gVUM%r% z5yc`1SWN(-E2M;&EKZo2?YE~ z2`>Oaz~LzW)8L&8yADBY{^~~*wvPMX;c7iG008kn)H>h46Nz7@`wf2RbcnACkAFIV=gn341K!Jg z2R~nC`wcE$jG>ASf2Hk%2LMR?0rz0LgFCFy{{}CUK!6p%wSR+?O#JE09Pb@`X61Kh zqRfC6rEqu;9R8>FSphhl1tOe94C#a+WB+O{W-Y`F@@$nDxF~#wkjTOPpPtTO?^rKJ z008pg-6H&l(_h8zgw*r#{!;s!<09-#U*Ez#fx^RY{~D1$kAje03Al*B|Je9N1^-{y z*QMYBToARA|8?vSKJK3;;ManXNm;lM2*OqNU&sF7W&T5iS>aA3tb+PKZTZE`{5R9b zPpN{CC(3XUdN@-vCVaRqb^SiHkxU>6L-bgGbI<&oAuj76Aifp6f)hf$^j8=&_Q>xt zf;N!-bs2au&jtvHZU?y>75h1p;PaN{FK(T`4_v^W^pgD_bM%gB=N~(8@Ez06FEEzF z|APPJ-TChv`7iIzPpk0x`hThUgM|nD|D)mgud)BqsQfav;`D#`{2Qr?yZe82!U-LK za7KraNg`mbE2PGb2u=n-`9CA>7heDX!12>8{8|uF;{K1&Ukn0&eYI>;AmEJ;Jo6e>z@cnN$cz9SgEI>PzR119D9;l8 zX7E?AJODud%O2c6-@H5cs1yo3d>;EZk$+=9;g6d?dvL$_Uy;LEvfo6u?S2c<`@>3I z=|3V^|2l5?2?Xrxxhqcog#VkCyH#8G1L*+%g!%J<+|K>p=6~J;!CwOb0L*`wHk*UP ZS&1L2BEfs`ucinCUJw8P@#}xx{XdIRF0cRq delta 38981 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 diff --git a/gradle-modules/gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.properties index ba94df8451..38f7c5acfc 100644 --- a/gradle-modules/gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.properties +++ b/gradle-modules/gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-rc-2-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradle-modules/gradle/maven-to-gradle/gradlew b/gradle-modules/gradle/maven-to-gradle/gradlew index 2fe81a7d95..fcb6fca147 100644 --- a/gradle-modules/gradle/maven-to-gradle/gradlew +++ b/gradle-modules/gradle/maven-to-gradle/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,78 +17,110 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -97,87 +129,120 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/gradle-modules/gradle/maven-to-gradle/gradlew.bat b/gradle-modules/gradle/maven-to-gradle/gradlew.bat index 9618d8d960..93e3f59f13 100644 --- a/gradle-modules/gradle/maven-to-gradle/gradlew.bat +++ b/gradle-modules/gradle/maven-to-gradle/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,10 +25,14 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @@ -37,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -51,7 +55,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -61,38 +65,26 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/gradle-modules/gradle/maven-to-gradle/pom.xml b/gradle-modules/gradle/maven-to-gradle/pom.xml index 7a30c389da..786b5e4fbd 100644 --- a/gradle-modules/gradle/maven-to-gradle/pom.xml +++ b/gradle-modules/gradle/maven-to-gradle/pom.xml @@ -14,4 +14,9 @@ + + 17 + 17 + + \ No newline at end of file diff --git a/gradle-modules/gradle/maven-to-gradle/settings.gradle b/gradle-modules/gradle/maven-to-gradle/settings.gradle index 8a7251a5c2..655854407d 100644 --- a/gradle-modules/gradle/maven-to-gradle/settings.gradle +++ b/gradle-modules/gradle/maven-to-gradle/settings.gradle @@ -1,5 +1,7 @@ /* * This file was generated by the Gradle 'init' task. + * + * This project uses @Incubating APIs which are subject to change. */ rootProject.name = 'maven-to-gradle' diff --git a/pom.xml b/pom.xml index e96f6200d9..fb3caef3e7 100644 --- a/pom.xml +++ b/pom.xml @@ -351,7 +351,6 @@ - gradle-modules/gradle/maven-to-gradle @@ -529,7 +528,6 @@ - gradle-modules/gradle/maven-to-gradle @@ -938,6 +936,7 @@ xml-2 image-processing language-interop + gradle-modules/gradle/maven-to-gradle @@ -1206,6 +1205,7 @@ xml-2 image-processing language-interop + gradle-modules/gradle/maven-to-gradle From b39cee5e7a8c2d96811ea0b35ec8bd6ff209b83d Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Fri, 23 Jun 2023 10:45:40 +0300 Subject: [PATCH 095/170] Java 20405 Align module names, folder names and artifact id - Week 18 - 2023 (moved-7) (#14290) * JAVA-20405 Align name for spring-boot-aws * JAVA-20405 Align module name for spring-boot-3-url-matching * JAVA-20405 Align module name for core-java-streams-collect * JAVA-20405 Align module name for dummy-surefire-junit47 --------- Co-authored-by: timis1 --- core-java-modules/core-java-streams-collect/pom.xml | 2 +- .../dependency-exclusion/dummy-surefire-junit47/pom.xml | 2 +- spring-boot-modules/spring-boot-3-url-matching/pom.xml | 6 +++--- spring-boot-modules/spring-boot-aws/pom.xml | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core-java-modules/core-java-streams-collect/pom.xml b/core-java-modules/core-java-streams-collect/pom.xml index e81598017c..427fcbdf8d 100644 --- a/core-java-modules/core-java-streams-collect/pom.xml +++ b/core-java-modules/core-java-streams-collect/pom.xml @@ -3,7 +3,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-streams-4 + core-java-streams-collect core-java-streams-collect jar diff --git a/maven-modules/dependency-exclusion/dummy-surefire-junit47/pom.xml b/maven-modules/dependency-exclusion/dummy-surefire-junit47/pom.xml index 93c5f7591f..5f90b4202f 100644 --- a/maven-modules/dependency-exclusion/dummy-surefire-junit47/pom.xml +++ b/maven-modules/dependency-exclusion/dummy-surefire-junit47/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.apache.maven.surefire - surefire-junit47 + dummy-surefire-junit47 dummy 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 ca8213e1cf..0ed6fdbd9b 100644 --- a/spring-boot-modules/spring-boot-3-url-matching/pom.xml +++ b/spring-boot-modules/spring-boot-3-url-matching/pom.xml @@ -3,10 +3,10 @@ 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-boot-3 + spring-boot-3-url-matching 0.0.1-SNAPSHOT - spring-boot-3 - URL Matching in Spring Boot + spring-boot-3-url-matching + URL Matching in Spring Boot 3 com.baeldung diff --git a/spring-boot-modules/spring-boot-aws/pom.xml b/spring-boot-modules/spring-boot-aws/pom.xml index bdb23f9fe2..2abce7df76 100644 --- a/spring-boot-modules/spring-boot-aws/pom.xml +++ b/spring-boot-modules/spring-boot-aws/pom.xml @@ -6,8 +6,8 @@ com.baeldung spring-boot-aws 0.0.1-SNAPSHOT - spring-boot-data-3 - spring-boot-boot + spring-boot-aws + spring-boot-aws com.baeldung.spring-boot-modules From 462cfaf9807e27cf53988ab0d365aba1a09e7ec7 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Fri, 23 Jun 2023 14:03:16 +0530 Subject: [PATCH 096/170] JAVA-21298 Fix failing tests in spring-boot-testing module (#14289) --- spring-boot-modules/pom.xml | 1 + .../spring-boot-testing-spock/README.md | 7 ++ .../spring-boot-testing-spock/pom.xml | 103 ++++++++++++++++++ .../java/com/baeldung/boot/Application.java | 14 +++ .../boot/controller/rest/WebController.java | 0 .../src/main/resources/application.properties | 2 + .../com/baeldung/boot/LoadContextTest.groovy | 0 .../baeldung/boot/WebControllerTest.groovy | 0 .../boot/WebControllerTest.groovy alias | Bin .../com/baeldung/boot/SpringContextTest.java | 15 +++ .../resources/application-test.properties | 2 + .../src/test/resources/logback-test.xml | 12 ++ .../spring-boot-testing/README.md | 1 - .../spring-boot-testing/pom.xml | 30 +---- .../resources/property-validation.properties | 4 + 15 files changed, 161 insertions(+), 30 deletions(-) create mode 100644 spring-boot-modules/spring-boot-testing-spock/README.md create mode 100644 spring-boot-modules/spring-boot-testing-spock/pom.xml create mode 100644 spring-boot-modules/spring-boot-testing-spock/src/main/java/com/baeldung/boot/Application.java rename spring-boot-modules/{spring-boot-testing => spring-boot-testing-spock}/src/main/java/com/baeldung/boot/controller/rest/WebController.java (100%) create mode 100644 spring-boot-modules/spring-boot-testing-spock/src/main/resources/application.properties rename spring-boot-modules/{spring-boot-testing => spring-boot-testing-spock}/src/test/groovy/com/baeldung/boot/LoadContextTest.groovy (100%) rename spring-boot-modules/{spring-boot-testing => spring-boot-testing-spock}/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy (100%) rename spring-boot-modules/{spring-boot-testing => spring-boot-testing-spock}/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy alias (100%) create mode 100644 spring-boot-modules/spring-boot-testing-spock/src/test/java/com/baeldung/boot/SpringContextTest.java create mode 100644 spring-boot-modules/spring-boot-testing-spock/src/test/resources/application-test.properties create mode 100644 spring-boot-modules/spring-boot-testing-spock/src/test/resources/logback-test.xml create mode 100644 spring-boot-modules/spring-boot-testing/src/test/resources/property-validation.properties diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 2c82fa1611..36a25b0005 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -75,6 +75,7 @@ spring-boot-swagger-keycloak spring-boot-testing spring-boot-testing-2 + spring-boot-testing-spock spring-boot-vue spring-boot-actuator spring-boot-data-2 diff --git a/spring-boot-modules/spring-boot-testing-spock/README.md b/spring-boot-modules/spring-boot-testing-spock/README.md new file mode 100644 index 0000000000..ab8193ab4e --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-spock/README.md @@ -0,0 +1,7 @@ +## Spring Boot Testing + +This module contains articles about Spring Boot testing with Spock framework + +### Relevant Articles: + +- [Testing with Spring and Spock](https://www.baeldung.com/spring-spock-testing) diff --git a/spring-boot-modules/spring-boot-testing-spock/pom.xml b/spring-boot-modules/spring-boot-testing-spock/pom.xml new file mode 100644 index 0000000000..c82d88ccfb --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-spock/pom.xml @@ -0,0 +1,103 @@ + + + 4.0.0 + spring-boot-testing-spock + spring-boot-testing-spock + war + This is simple boot application for demonstrating spock framework testing features. + + + com.baeldung.spring-boot-modules + spring-boot-modules + 1.0.0-SNAPSHOT + + + + + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.spockframework + spock-core + ${spock.version} + test + + + org.spockframework + spock-spring + ${spock.version} + test + + + + + spring-boot-testing-spock + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-war-plugin + + + org.codehaus.gmavenplus + gmavenplus-plugin + ${gmavenplus-plugin.version} + + + + compileTests + + + + + 17 + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + + + + + + com.baeldung.boot.Application + 2.4-M1-groovy-4.0 + 3.0.0 + 3.10.1 + 2.17.1 + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-testing-spock/src/main/java/com/baeldung/boot/Application.java b/spring-boot-modules/spring-boot-testing-spock/src/main/java/com/baeldung/boot/Application.java new file mode 100644 index 0000000000..cb0d0c1532 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-spock/src/main/java/com/baeldung/boot/Application.java @@ -0,0 +1,14 @@ +package com.baeldung.boot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; + +@SpringBootApplication +public class Application { + private static ApplicationContext applicationContext; + + public static void main(String[] args) { + applicationContext = SpringApplication.run(Application.class, args); + } +} diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/controller/rest/WebController.java b/spring-boot-modules/spring-boot-testing-spock/src/main/java/com/baeldung/boot/controller/rest/WebController.java similarity index 100% rename from spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/controller/rest/WebController.java rename to spring-boot-modules/spring-boot-testing-spock/src/main/java/com/baeldung/boot/controller/rest/WebController.java diff --git a/spring-boot-modules/spring-boot-testing-spock/src/main/resources/application.properties b/spring-boot-modules/spring-boot-testing-spock/src/main/resources/application.properties new file mode 100644 index 0000000000..139597f9cb --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-spock/src/main/resources/application.properties @@ -0,0 +1,2 @@ + + diff --git a/spring-boot-modules/spring-boot-testing/src/test/groovy/com/baeldung/boot/LoadContextTest.groovy b/spring-boot-modules/spring-boot-testing-spock/src/test/groovy/com/baeldung/boot/LoadContextTest.groovy similarity index 100% rename from spring-boot-modules/spring-boot-testing/src/test/groovy/com/baeldung/boot/LoadContextTest.groovy rename to spring-boot-modules/spring-boot-testing-spock/src/test/groovy/com/baeldung/boot/LoadContextTest.groovy diff --git a/spring-boot-modules/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy b/spring-boot-modules/spring-boot-testing-spock/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy similarity index 100% rename from spring-boot-modules/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy rename to spring-boot-modules/spring-boot-testing-spock/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy diff --git a/spring-boot-modules/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy alias b/spring-boot-modules/spring-boot-testing-spock/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy alias similarity index 100% rename from spring-boot-modules/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy alias rename to spring-boot-modules/spring-boot-testing-spock/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy alias diff --git a/spring-boot-modules/spring-boot-testing-spock/src/test/java/com/baeldung/boot/SpringContextTest.java b/spring-boot-modules/spring-boot-testing-spock/src/test/java/com/baeldung/boot/SpringContextTest.java new file mode 100644 index 0000000000..f3c8b9a954 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-spock/src/test/java/com/baeldung/boot/SpringContextTest.java @@ -0,0 +1,15 @@ +package com.baeldung.boot; + +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) +public class SpringContextTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } +} diff --git a/spring-boot-modules/spring-boot-testing-spock/src/test/resources/application-test.properties b/spring-boot-modules/spring-boot-testing-spock/src/test/resources/application-test.properties new file mode 100644 index 0000000000..a2c9b6d480 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-spock/src/test/resources/application-test.properties @@ -0,0 +1,2 @@ +# test properties +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-testing-spock/src/test/resources/logback-test.xml b/spring-boot-modules/spring-boot-testing-spock/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..9553dcad41 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-spock/src/test/resources/logback-test.xml @@ -0,0 +1,12 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + diff --git a/spring-boot-modules/spring-boot-testing/README.md b/spring-boot-modules/spring-boot-testing/README.md index 19f5ca0f59..407cc410e7 100644 --- a/spring-boot-modules/spring-boot-testing/README.md +++ b/spring-boot-modules/spring-boot-testing/README.md @@ -8,7 +8,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [Testing with Spring and Spock](https://www.baeldung.com/spring-spock-testing) - [Exclude Auto-Configuration Classes in Spring Boot Tests](https://www.baeldung.com/spring-boot-exclude-auto-configuration-test) - [Embedded Redis Server with Spring Boot Test](https://www.baeldung.com/spring-embedded-redis) - [Testing Spring Boot @ConfigurationProperties](https://www.baeldung.com/spring-boot-testing-configurationproperties) diff --git a/spring-boot-modules/spring-boot-testing/pom.xml b/spring-boot-modules/spring-boot-testing/pom.xml index ace6307761..2098ac767d 100644 --- a/spring-boot-modules/spring-boot-testing/pom.xml +++ b/spring-boot-modules/spring-boot-testing/pom.xml @@ -67,19 +67,6 @@ ${redis.version} test - - - org.spockframework - spock-core - ${spock.version} - test - - - org.spockframework - spock-spring - ${spock.version} - test - @@ -120,21 +107,6 @@ ${project.build.outputDirectory}/git.properties - - org.codehaus.gmavenplus - gmavenplus-plugin - ${gmavenplus-plugin.version} - - - - compileTests - - - - - 17 - - org.apache.maven.plugins maven-compiler-plugin @@ -148,7 +120,7 @@ com.baeldung.boot.Application 2.2.4 2.4-M1-groovy-4.0 - 2.1.0 + 3.0.0 3.10.1 0.7.2 2.5.0 diff --git a/spring-boot-modules/spring-boot-testing/src/test/resources/property-validation.properties b/spring-boot-modules/spring-boot-testing/src/test/resources/property-validation.properties new file mode 100644 index 0000000000..6b4c881dc0 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing/src/test/resources/property-validation.properties @@ -0,0 +1,4 @@ +validate.propertiesMap.first=prop1 +validate.propertiesMap.second=prop2 + +validate.mail_config.address=user1@test \ No newline at end of file From f70b3a06ab7ffe8c98e0fa3d34f89b8701dcceb6 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Fri, 23 Jun 2023 15:06:31 +0530 Subject: [PATCH 097/170] Java-15020: Minor fix in HttpClientParamsLiveTest (#14284) --- .../httpclient/HttpClientParamsLiveTest.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientParamsLiveTest.java b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientParamsLiveTest.java index ef662e1bd8..7acdf2c091 100644 --- a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientParamsLiveTest.java +++ b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientParamsLiveTest.java @@ -3,7 +3,6 @@ package com.baeldung.httpclient; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; - import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -13,10 +12,9 @@ import java.util.List; import org.apache.hc.client5.http.classic.methods.HttpGet; import org.apache.hc.client5.http.classic.methods.HttpPost; +import org.apache.hc.client5.http.entity.UrlEncodedFormEntity; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; -import org.apache.hc.client5.http.ClientProtocolException; -import org.apache.hc.client5.http.entity.UrlEncodedFormEntity; import org.apache.hc.client5.http.impl.classic.HttpClients; import org.apache.hc.core5.http.HttpStatus; import org.apache.hc.core5.http.NameValuePair; @@ -42,7 +40,7 @@ class HttpClientParamsLiveTest { } @Test - void givenStringNameValuePairParams_whenGetRequest_thenResponseOk() throws URISyntaxException, ClientProtocolException, IOException { + void givenStringNameValuePairParams_whenGetRequest_thenResponseOk() throws URISyntaxException, IOException { HttpGet httpGet = new HttpGet("https://postman-echo.com/get"); URI uri = new URIBuilder(httpGet.getUri()).addParameter("param1", "value1") .addParameter("param2", "value2") @@ -59,7 +57,7 @@ class HttpClientParamsLiveTest { } @Test - void givenStringNameValuePairParams_whenPostRequest_thenResponseOk() throws URISyntaxException, ClientProtocolException, IOException { + void givenStringNameValuePairParams_whenPostRequest_thenResponseOk() throws URISyntaxException, IOException { HttpPost httpPost = new HttpPost("https://postman-echo.com/post"); URI uri = new URIBuilder(httpPost.getUri()).addParameter("param1", "value1") .addParameter("param2", "value2") @@ -76,7 +74,7 @@ class HttpClientParamsLiveTest { } @Test - void givenNameValuePairParams_whenGetRequest_thenResponseOk() throws URISyntaxException, ClientProtocolException, IOException { + void givenNameValuePairParams_whenGetRequest_thenResponseOk() throws URISyntaxException, IOException { HttpGet httpGet = new HttpGet("https://postman-echo.com/get"); URI uri = new URIBuilder(httpGet.getUri()).addParameters(nameValuePairs) .build(); @@ -92,7 +90,7 @@ class HttpClientParamsLiveTest { } @Test - void givenNameValuePairsParams_whenPostRequest_thenResponseOk() throws URISyntaxException, ClientProtocolException, IOException { + void givenNameValuePairsParams_whenPostRequest_thenResponseOk() throws URISyntaxException, IOException { HttpPost httpPost = new HttpPost("https://postman-echo.com/post"); URI uri = new URIBuilder(httpPost.getUri()).addParameters(nameValuePairs) .build(); @@ -108,7 +106,7 @@ class HttpClientParamsLiveTest { } @Test - void givenUrlEncodedEntityParams_whenPostRequest_thenResponseOk() throws URISyntaxException, ClientProtocolException, IOException { + void givenUrlEncodedEntityParams_whenPostRequest_thenResponseOk() throws IOException { HttpPost httpPost = new HttpPost("https://postman-echo.com/post"); httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, StandardCharsets.UTF_8)); From 0c017b4b0edd665c7fe63916fc41fb8323231e0b Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Fri, 23 Jun 2023 14:08:20 +0000 Subject: [PATCH 098/170] How to convert docx into pdf with Java? (#14273) --- pdf/input.docx | Bin 0 -> 10729 bytes pdf/output.pdf | Bin 0 -> 2441 bytes .../com/baeldung/pdf/DocxToPDFExample.java | 35 ++++++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 pdf/input.docx create mode 100644 pdf/output.pdf create mode 100644 pdf/src/main/java/com/baeldung/pdf/DocxToPDFExample.java diff --git a/pdf/input.docx b/pdf/input.docx new file mode 100644 index 0000000000000000000000000000000000000000..b6b2b09f793605cf458a0760acdd81eb6537f9fa GIT binary patch literal 10729 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 literal 0 HcmV?d00001 diff --git a/pdf/output.pdf b/pdf/output.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ebbe80989efc684d961ce3f4926137b38a242003 GIT binary patch literal 2441 zcmai0c{r5q8Ykp3l_jNh^p1=r#w-joXc*gAQcN_-h%xiZXv}10Xd0=sTFNP;h(0a0 zY$26ULbik$vJ^FaWXaYd>60_#tJAqU=UnIh=Y5{vec!+Pe(vYFuHOrHvvWY8jZ7eL z@!Qr82nIj_9RDDQr6qD3$lk{f1kk2vQ=|iv#Rs`a2NsPF+JSTq10)c5d@e`}h6qwK zD39Y_+NoAfQW9t4?NXqo!1XBaV=KIrn32n4&T~hKp1uv}dzCOTvwX;S3Hit+O6N@8 zC4siKvimOjK}u(M;ogf@)WhXvv!e=?6-S6y=ENxlS05!>JrvBRUOnn`Wk@^{e9z1? zv;4FvhduoH)vGTYeZk!L#0%fytWCbb?5n{?>K~7h-u=-(x24#Lx>Mc8_1oIfhfNxa zHIbVKlb9TGW?>=IPhGuq=|cB-NOhQCzUog_P3_V5WlePyxplrf882&MVSW9RxPpec zy4gGqB|j7!3JZA4($q_7W@h{&%!qaFM&-?fGuTQc5}{#QL_q}i@aQ}(_2k1ivEtal zSek8zcFP^8Ug_P(7dFP}bVUmXibKkv*>_VrgwvmnD!D8mYgP8-Y;ZfM#W^V-xk2Vj z$o`6X_45Y1P2X}<{<_sRJsXoIpt{Fp-sP^p&BO^8OjN?X8wa1B?eb7Rn~=I6c{mbk9-I$}t|;ET?ISXgeCUBks2NeZ>v zinrXj1LLvZ*W1*=_P8In3_a0MBIY|oPT5ZZ$sRgvTMLmrJ{IQc^Y)2o5};454eC2+ zPgnV5qO(8eLv8@$L0huiXK*PvH$WzBKDFN4Me{gI^fu9>uHkL!*D>HH|& z3^y-r>JDAQs7aoOV4q`Q(+#zrCsmt!Prf+oA`8zTfb`0qw zVPPvbG*|^W}$->F& zLstT!c6;;b(brZ1H_P+9)Z&n26|lXE0S;ZJqHu#Zkva3j9+0dL&N!oO*ZIlBl4UK9 z_eOe%Juo+2wsN4M-{G)lzeZ5rH1E9)nY#E%q#b zFGR`KJCv;OjzZOpXCMu#_A2=}+Q{=(_vD~OrqTJx7e%rGdvryQv%N4b#{5+xmu9aw zw%qcKUWrDhTpK>Vk@xNRhWYyDKzN*T%}iL?3N__sLgN;-Xtn3Bk^>@lrPwPDa!!*4xfk2MGsp=e&qM03|qAMjXAlr<#xyu z#TNZdw}tUB(B2S{;py@FOVL*!U2`Ft>pSJ;xX5)y1-xSyzIxo>;NpKM!{m_96KIij z_RH3@y6i{YEa|#bSPE}?ovwc`*FZ!l9SnkyQ*}v^O!G%;6J-#~d8ruE z2%L%H8%Fe}owCKHj_-Z|yAqzfzJ1|bbXt&J?KiPd!G};1l87o>G2amDN!VfhbTk!b zFqbc=gskzaivJvw5WaO~i8imbB8w2Msws+bJXF__!ai2n*4TpJICTqmPOs|;uFq|+ zd|AXfqrI%l&ir<@<;cpD2U|bTE!EJ<3MC+G3*BlCOuVg{J9z2BUU6=3ysdrwd)#4S z({Ov6YB@7BX<$1Zu}o&BM}OmJ0fFHiy}_|BP%(DMMh?la-f{XK~>{tE!MS z1=H^8^pr_l=sQ3ya9+Nv#X4=jFcum{T_S=OnLVvpDJ(K%8D&h8o{RfrEw%EqDTchP zTmy{Cw}@lo)xwUWM@4{6GrG_GjWV3}lkxNcvX^r|kERoOPmVg2n*CYX z&)f(xC|4h4RlSXzLTgq?vPp8bBOK+sI@mu5(bs59mrvWHWB!ERg*Ba{wu^_U)@fL{P$jj%>& z6p({Kp->163XKI89RP{T2|WO8-vv paragraphs = document.getParagraphs(); + for (XWPFParagraph paragraph : paragraphs) { + pdfDocument.add(new Paragraph(paragraph.getText())); + } + pdfDocument.close(); + } + } +} From c54937de569a14cb38dcc2708982ff8989cf9329 Mon Sep 17 00:00:00 2001 From: Tapan Avasthi Date: Sat, 24 Jun 2023 07:40:42 +0530 Subject: [PATCH 099/170] BAEL-6532: Define main class when using multiple profiles in a Spring Boot project (#14267) Co-authored-by: Tapan Avasthi --- .../spring-boot-basic-customization/pom.xml | 50 ++++++++++++++++++- .../SpringBootFiltersApplication.java | 4 +- .../changeport/CustomApplication.java | 4 +- .../ErrorHandlingApplication.java | 2 + .../FailureAnalyzerApplication.java | 4 +- .../baeldung/favicon/FaviconApplication.java | 4 +- .../FailureAnalyzerAppIntegrationTest.java | 9 +++- 7 files changed, 70 insertions(+), 7 deletions(-) diff --git a/spring-boot-modules/spring-boot-basic-customization/pom.xml b/spring-boot-modules/spring-boot-basic-customization/pom.xml index 28b30e6bd4..310da40688 100644 --- a/spring-boot-modules/spring-boot-basic-customization/pom.xml +++ b/spring-boot-modules/spring-boot-basic-customization/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-boot-basic-customization spring-boot-basic-customization @@ -39,4 +39,50 @@ com.baeldung.changeport.CustomApplication + + + errorhandling + + com.baeldung.errorhandling.ErrorHandlingApplication + + + + filter + + com.baeldung.bootcustomfilters.SpringBootFiltersApplication + + + + customapplication + + com.baeldung.changeport.CustomApplication + + + + failureanalyzer + + com.baeldung.failureanalyzer.FailureAnalyzerApplication + + + + favicon + + com.baeldung.favicon.FaviconApplication + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 1.5.2.RELEASE + + ${spring.boot.mainclass} + + + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/SpringBootFiltersApplication.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/SpringBootFiltersApplication.java index c4653932c0..825e77f0ce 100644 --- a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/SpringBootFiltersApplication.java +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/bootcustomfilters/SpringBootFiltersApplication.java @@ -2,13 +2,15 @@ package com.baeldung.bootcustomfilters; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Profile; /** * Boot application * @author hemant * */ -@SpringBootApplication +@Profile("filter") +@SpringBootApplication(scanBasePackages = "com.baeldung.bootcustomfilters.*") public class SpringBootFiltersApplication { public static void main(String[] args) { diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/changeport/CustomApplication.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/changeport/CustomApplication.java index 3fce0f1289..b8885393eb 100644 --- a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/changeport/CustomApplication.java +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/changeport/CustomApplication.java @@ -4,8 +4,10 @@ import java.util.Collections; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Profile; -@SpringBootApplication +@Profile("customapplication") +@SpringBootApplication(scanBasePackages = "com.baeldung.changeport") public class CustomApplication { public static void main(String[] args) { diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/ErrorHandlingApplication.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/ErrorHandlingApplication.java index 9f6c209deb..1326c35382 100644 --- a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/ErrorHandlingApplication.java +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/errorhandling/ErrorHandlingApplication.java @@ -2,7 +2,9 @@ package com.baeldung.errorhandling; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Profile; +@Profile("errorhandling") @SpringBootApplication(scanBasePackages = "com.baeldung.errorhandling") public class ErrorHandlingApplication { diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java index d08fa05c6e..4ad763e0ab 100644 --- a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java @@ -2,10 +2,12 @@ package com.baeldung.failureanalyzer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Profile; import javax.annotation.security.RolesAllowed; -@SpringBootApplication +@Profile("failureanalyzer") +@SpringBootApplication(scanBasePackages = "com.baeldung.failureanalyzer") public class FailureAnalyzerApplication { @RolesAllowed("*") public static void main(String[] args) { diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/favicon/FaviconApplication.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/favicon/FaviconApplication.java index f94549b988..33852db863 100644 --- a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/favicon/FaviconApplication.java +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/favicon/FaviconApplication.java @@ -2,8 +2,10 @@ package com.baeldung.favicon; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Profile; -@SpringBootApplication +@Profile("favicon") +@SpringBootApplication(scanBasePackages = "com.baeldung.favicon") public class FaviconApplication { public static void main(String[] args) { diff --git a/spring-boot-modules/spring-boot-basic-customization/src/test/java/com/baeldung/failureanalyzer/FailureAnalyzerAppIntegrationTest.java b/spring-boot-modules/spring-boot-basic-customization/src/test/java/com/baeldung/failureanalyzer/FailureAnalyzerAppIntegrationTest.java index 2d9fb56217..b59e190418 100644 --- a/spring-boot-modules/spring-boot-basic-customization/src/test/java/com/baeldung/failureanalyzer/FailureAnalyzerAppIntegrationTest.java +++ b/spring-boot-modules/spring-boot-basic-customization/src/test/java/com/baeldung/failureanalyzer/FailureAnalyzerAppIntegrationTest.java @@ -1,13 +1,16 @@ package com.baeldung.failureanalyzer; import ch.qos.logback.classic.spi.ILoggingEvent; + import com.baeldung.failureanalyzer.utils.ListAppender; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.BeanCreationException; import org.springframework.boot.SpringApplication; import java.util.Collection; +import java.util.Properties; import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; @@ -27,7 +30,11 @@ public class FailureAnalyzerAppIntegrationTest { @Test public void givenBeanCreationErrorInContext_whenContextLoaded_thenFailureAnalyzerLogsReport() { try { - SpringApplication.run(FailureAnalyzerApplication.class); + Properties properties = new Properties(); + properties.setProperty("spring.profiles.active", "failureanalyzer"); + SpringApplication app = new SpringApplication(FailureAnalyzerApplication.class); + app.setDefaultProperties(properties); + app.run(); } catch (BeanCreationException e) { Collection allLoggedEntries = ListAppender.getEvents() .stream() From d071df91a8442d999e8edb9aad0f1d9262e13dc0 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Sat, 24 Jun 2023 13:29:37 +0530 Subject: [PATCH 100/170] updated backlink --- core-java-modules/core-java-methods/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-methods/README.md b/core-java-modules/core-java-methods/README.md index b2208778e7..3f4202dd0e 100644 --- a/core-java-modules/core-java-methods/README.md +++ b/core-java-modules/core-java-methods/README.md @@ -3,4 +3,4 @@ ## Core Java Methods ### Relevant Articles: -- [Execute a Method Only Once in Java](https://www.baeldung.com/execute-a-method-only-once-in-java) \ No newline at end of file +- [Execute a Method Only Once in Java](https://www.baeldung.com/java-execute-method-only-once) From faf6b79e866e5fe4439201a67a9819a3287a370a Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Sat, 24 Jun 2023 10:38:42 +0200 Subject: [PATCH 101/170] BAEL-6397: Adding One Month to Current Date in Java (#14261) --- .../core-java-date-operations-3/pom.xml | 18 +++++ .../AddOneMonthToCurrentDateUnitTest.java | 79 +++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/date/AddOneMonthToCurrentDateUnitTest.java diff --git a/core-java-modules/core-java-date-operations-3/pom.xml b/core-java-modules/core-java-date-operations-3/pom.xml index 89c21a31c1..19760ca357 100644 --- a/core-java-modules/core-java-date-operations-3/pom.xml +++ b/core-java-modules/core-java-date-operations-3/pom.xml @@ -12,5 +12,23 @@ core-java-modules 0.0.1-SNAPSHOT + + + + joda-time + joda-time + ${joda-time.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + 2.12.5 + 3.12.0 + \ No newline at end of file diff --git a/core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/date/AddOneMonthToCurrentDateUnitTest.java b/core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/date/AddOneMonthToCurrentDateUnitTest.java new file mode 100644 index 0000000000..7b15fadd03 --- /dev/null +++ b/core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/date/AddOneMonthToCurrentDateUnitTest.java @@ -0,0 +1,79 @@ +package com.baeldung.date; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.time.LocalDate; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +import org.apache.commons.lang3.time.DateUtils; +import org.junit.jupiter.api.Test; + +class AddOneMonthToCurrentDateUnitTest { + + @Test + void givenCalendarDate_whenAddingOneMonth_thenDateIsChangedCorrectly() { + Calendar calendar = Calendar.getInstance(); + // Dummy current date + calendar.set(2023, Calendar.APRIL, 20); + + // add one month + calendar.add(Calendar.MONTH, 1); + + assertEquals(Calendar.MAY, calendar.get(Calendar.MONTH)); + assertEquals(20, calendar.get(Calendar.DAY_OF_MONTH)); + assertEquals(2023, calendar.get(Calendar.YEAR)); + } + + @SuppressWarnings("deprecation") + @Test + void givenDate_whenAddingOneMonth_thenDateIsChangedCorrectly() { + // Dummy current date + Date currentDate = new Date(2023, Calendar.DECEMBER, 20); + // Expected Date + Date expectedDate = new Date(2024, Calendar.JANUARY, 20); + + // add one month + currentDate.setMonth(currentDate.getMonth() + 1); + + assertEquals(expectedDate, currentDate); + } + + @Test + void givenJavaLocalDate_whenAddingOneMonth_thenDateIsChangedCorrectly() { + // Dummy current date + LocalDate localDate = LocalDate.of(2023, 12, 20); + + // add one month + localDate = localDate.plusMonths(1); + + assertEquals(1, localDate.getMonthValue()); + assertEquals(20, localDate.getDayOfMonth()); + assertEquals(2024, localDate.getYear()); + } + + @Test + void givenJodaTimeLocalDate_whenAddingOneMonth_thenDateIsChangedCorrectly() { + // Dummy current date + org.joda.time.LocalDate localDate = new org.joda.time.LocalDate(2023, 12, 20); + + // add one month + localDate = localDate.plusMonths(1); + + assertEquals(1, localDate.getMonthOfYear()); + assertEquals(20, localDate.getDayOfMonth()); + assertEquals(2024, localDate.getYear()); + } + + @Test + void givenApacheCommonsLangDateUtils_whenAddingOneMonth_thenDateIsChangedCorrectly() { + // Dummy current date + Date currentDate = new GregorianCalendar(2023, Calendar.APRIL, 20, 4, 0).getTime(); + // Expected Date + Date expectedDate = new GregorianCalendar(2023, Calendar.MAY, 20, 4, 0).getTime(); + + assertEquals(expectedDate, DateUtils.addMonths(currentDate, 1)); + } + +} From 7d58a8852945f64ee82a859f4a6b2c0b8ff60a0c Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Sat, 24 Jun 2023 05:43:02 -0300 Subject: [PATCH 102/170] BAEL-6403 - Extracting a Tar File in Java (#14240) * code 1 * sibling module readme * new module * review 1 * review 2 --- libraries-apache-commons-2/README.md | 7 +++ libraries-apache-commons-2/log4j.properties | 1 + libraries-apache-commons-2/pom.xml | 39 ++++++++++++++ .../com/baeldung/commons/untar/Resources.java | 14 +++++ .../baeldung/commons/untar/TarExtractor.java | 39 ++++++++++++++ .../commons/untar/impl/TarExtractorAnt.java | 37 ++++++++++++++ .../impl/TarExtractorCommonsCompress.java | 38 ++++++++++++++ .../commons/untar/impl/TarExtractorVfs.java | 48 ++++++++++++++++++ .../src/main/resources/logback.xml | 13 +++++ .../untar/TarExtractorAntUnitTest.java | 40 +++++++++++++++ .../TarExtractorCommonsCompressUnitTest.java | 40 +++++++++++++++ .../untar/TarExtractorVfsUnitTest.java | 40 +++++++++++++++ .../src/test/resources/untar/test.tar | Bin 0 -> 5632 bytes .../src/test/resources/untar/test.tar.gz | Bin 0 -> 211 bytes libraries-apache-commons/README.md | 3 +- pom.xml | 2 + 16 files changed, 360 insertions(+), 1 deletion(-) create mode 100644 libraries-apache-commons-2/README.md create mode 100644 libraries-apache-commons-2/log4j.properties create mode 100644 libraries-apache-commons-2/pom.xml create mode 100644 libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/Resources.java create mode 100644 libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/TarExtractor.java create mode 100644 libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorAnt.java create mode 100644 libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorCommonsCompress.java create mode 100644 libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorVfs.java create mode 100644 libraries-apache-commons-2/src/main/resources/logback.xml create mode 100644 libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorAntUnitTest.java create mode 100644 libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorCommonsCompressUnitTest.java create mode 100644 libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorVfsUnitTest.java create mode 100644 libraries-apache-commons-2/src/test/resources/untar/test.tar create mode 100644 libraries-apache-commons-2/src/test/resources/untar/test.tar.gz diff --git a/libraries-apache-commons-2/README.md b/libraries-apache-commons-2/README.md new file mode 100644 index 0000000000..7f91a737d5 --- /dev/null +++ b/libraries-apache-commons-2/README.md @@ -0,0 +1,7 @@ +## Apache Commons + +This module contains articles about Apache Commons libraries. + +### Relevant articles + +- More articles: [[<--prev]](../libraries-apache-commons) \ No newline at end of file diff --git a/libraries-apache-commons-2/log4j.properties b/libraries-apache-commons-2/log4j.properties new file mode 100644 index 0000000000..2173c5d96f --- /dev/null +++ b/libraries-apache-commons-2/log4j.properties @@ -0,0 +1 @@ +log4j.rootLogger=INFO, stdout diff --git a/libraries-apache-commons-2/pom.xml b/libraries-apache-commons-2/pom.xml new file mode 100644 index 0000000000..d771aac9ab --- /dev/null +++ b/libraries-apache-commons-2/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + libraries-apache-commons-2 + libraries-apache-commons-2 + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.apache.commons + commons-compress + ${commons-compress.version} + + + org.apache.ant + ant + ${ant.version} + + + org.apache.commons + commons-vfs2 + ${commons-vfs2.version} + + + + + 1.23.0 + 1.10.13 + 2.9.0 + + + \ No newline at end of file diff --git a/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/Resources.java b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/Resources.java new file mode 100644 index 0000000000..15e71eb156 --- /dev/null +++ b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/Resources.java @@ -0,0 +1,14 @@ +package com.baeldung.commons.untar; + +import java.io.InputStream; + +public interface Resources { + + static InputStream tarFile() { + return Resources.class.getResourceAsStream("/untar/test.tar"); + } + + static InputStream tarGzFile() { + return Resources.class.getResourceAsStream("/untar/test.tar.gz"); + } +} \ No newline at end of file diff --git a/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/TarExtractor.java b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/TarExtractor.java new file mode 100644 index 0000000000..73a54bba44 --- /dev/null +++ b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/TarExtractor.java @@ -0,0 +1,39 @@ +package com.baeldung.commons.untar; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; + +public abstract class TarExtractor { + + private InputStream tarStream; + private boolean gzip; + private Path destination; + + protected TarExtractor(InputStream in, boolean gzip, Path destination) throws IOException { + this.tarStream = in; + this.gzip = gzip; + this.destination = destination; + + Files.createDirectories(destination); + } + + protected TarExtractor(Path tarFile, Path destination) throws IOException { + this(Files.newInputStream(tarFile), tarFile.endsWith("gz"), destination); + } + + public Path getDestination() { + return destination; + } + + public InputStream getTarStream() { + return tarStream; + } + + public boolean isGzip() { + return gzip; + } + + public abstract void untar() throws IOException; +} \ No newline at end of file diff --git a/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorAnt.java b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorAnt.java new file mode 100644 index 0000000000..5bb4d74beb --- /dev/null +++ b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorAnt.java @@ -0,0 +1,37 @@ +package com.baeldung.commons.untar.impl; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.zip.GZIPInputStream; + +import org.apache.tools.tar.TarEntry; +import org.apache.tools.tar.TarInputStream; + +import com.baeldung.commons.untar.TarExtractor; + +public class TarExtractorAnt extends TarExtractor { + + public TarExtractorAnt(InputStream in, boolean gzip, Path destination) throws IOException { + super(in, gzip, destination); + } + + @Override + public void untar() throws IOException { + try (TarInputStream tar = new TarInputStream(new BufferedInputStream( // + isGzip() ? new GZIPInputStream(getTarStream()) : getTarStream()))) { + TarEntry entry; + while ((entry = tar.getNextEntry()) != null) { + Path extractTo = getDestination().resolve(entry.getName()); + if (entry.isDirectory()) { + Files.createDirectories(extractTo); + } else { + Files.copy(tar, extractTo, StandardCopyOption.REPLACE_EXISTING); + } + } + } + } +} \ No newline at end of file diff --git a/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorCommonsCompress.java b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorCommonsCompress.java new file mode 100644 index 0000000000..4981426c35 --- /dev/null +++ b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorCommonsCompress.java @@ -0,0 +1,38 @@ +package com.baeldung.commons.untar.impl; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; + +import org.apache.commons.compress.archivers.ArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; +import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; + +import com.baeldung.commons.untar.TarExtractor; + +public class TarExtractorCommonsCompress extends TarExtractor { + + public TarExtractorCommonsCompress(InputStream in, boolean gzip, Path destination) throws IOException { + super(in, gzip, destination); + } + + @Override + public void untar() throws IOException { + try (BufferedInputStream inputStream = new BufferedInputStream(getTarStream()); // + TarArchiveInputStream tar = new TarArchiveInputStream( // + isGzip() ? new GzipCompressorInputStream(inputStream) : inputStream)) { + ArchiveEntry entry; + while ((entry = tar.getNextEntry()) != null) { + Path extractTo = getDestination().resolve(entry.getName()); + if (entry.isDirectory()) { + Files.createDirectories(extractTo); + } else { + Files.copy(tar, extractTo, StandardCopyOption.REPLACE_EXISTING); + } + } + } + } +} \ No newline at end of file diff --git a/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorVfs.java b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorVfs.java new file mode 100644 index 0000000000..291fcebfb0 --- /dev/null +++ b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorVfs.java @@ -0,0 +1,48 @@ +package com.baeldung.commons.untar.impl; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; + +import org.apache.commons.vfs2.FileContent; +import org.apache.commons.vfs2.FileObject; +import org.apache.commons.vfs2.FileSystemManager; +import org.apache.commons.vfs2.FileType; +import org.apache.commons.vfs2.VFS; + +import com.baeldung.commons.untar.TarExtractor; + +public class TarExtractorVfs extends TarExtractor { + + public TarExtractorVfs(InputStream in, boolean gzip, Path destination) throws IOException { + super(in, gzip, destination); + } + + @Override + public void untar() throws IOException { + Path tmpTar = Files.createTempFile("temp", isGzip() ? ".tar.gz" : ".tar"); + Files.copy(getTarStream(), tmpTar, StandardCopyOption.REPLACE_EXISTING); + + FileSystemManager fsManager = VFS.getManager(); + String uri = String.format("%s:file://%s", isGzip() ? "tgz" : "tar", tmpTar); + FileObject tar = fsManager.resolveFile(uri); + + for (FileObject entry : tar) { + Path extractTo = Paths.get(getDestination().toString(), entry.getName() + .getPath()); + + if (entry.isReadable() && entry.getType() == FileType.FILE) { + Files.createDirectories(extractTo.getParent()); + + try (FileContent content = entry.getContent(); InputStream stream = content.getInputStream()) { + Files.copy(stream, extractTo, StandardCopyOption.REPLACE_EXISTING); + } + } + } + + Files.delete(tmpTar); + } +} \ No newline at end of file diff --git a/libraries-apache-commons-2/src/main/resources/logback.xml b/libraries-apache-commons-2/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/libraries-apache-commons-2/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-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorAntUnitTest.java b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorAntUnitTest.java new file mode 100644 index 0000000000..0b39f49884 --- /dev/null +++ b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorAntUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.commons.untar; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.stream.Stream; + +import org.junit.Test; + +import com.baeldung.commons.untar.impl.TarExtractorAnt; + +public class TarExtractorAntUnitTest { + + @Test + public void givenTarFile_whenUntar_thenExtractedToDestination() throws IOException { + Path destination = Paths.get("/tmp/ant"); + + new TarExtractorAnt(Resources.tarFile(), false, destination).untar(); + + try (Stream files = Files.list(destination)) { + assertTrue(files.findFirst() + .isPresent()); + } + } + + @Test + public void givenTarGzFile_whenUntar_thenExtractedToDestination() throws IOException { + Path destination = Paths.get("/tmp/ant-gz"); + + new TarExtractorAnt(Resources.tarGzFile(), true, destination).untar(); + + try (Stream files = Files.list(destination)) { + assertTrue(files.findFirst() + .isPresent()); + } + } +} diff --git a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorCommonsCompressUnitTest.java b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorCommonsCompressUnitTest.java new file mode 100644 index 0000000000..e9c7d701d3 --- /dev/null +++ b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorCommonsCompressUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.commons.untar; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.stream.Stream; + +import org.junit.jupiter.api.Test; + +import com.baeldung.commons.untar.impl.TarExtractorCommonsCompress; + +public class TarExtractorCommonsCompressUnitTest { + + @Test + public void givenTarFile_whenUntar_thenExtractedToDestination() throws IOException { + Path destination = Paths.get("/tmp/commons-compress"); + + new TarExtractorCommonsCompress(Resources.tarFile(), false, destination).untar(); + + try (Stream files = Files.list(destination)) { + assertTrue(files.findFirst() + .isPresent()); + } + } + + @Test + public void givenTarGzFile_whenUntar_thenExtractedToDestination() throws IOException { + Path destination = Paths.get("/tmp/commons-compress-gz"); + + new TarExtractorCommonsCompress(Resources.tarGzFile(), true, destination).untar(); + + try (Stream files = Files.list(destination)) { + assertTrue(files.findFirst() + .isPresent()); + } + } +} \ No newline at end of file diff --git a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorVfsUnitTest.java b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorVfsUnitTest.java new file mode 100644 index 0000000000..d5e9004732 --- /dev/null +++ b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorVfsUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.commons.untar; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.stream.Stream; + +import org.junit.Test; + +import com.baeldung.commons.untar.impl.TarExtractorVfs; + +public class TarExtractorVfsUnitTest { + + @Test + public void givenTarFile_whenUntar_thenExtractedToDestination() throws IOException { + Path destination = Paths.get("/tmp/vfs"); + + new TarExtractorVfs(Resources.tarFile(), false, destination).untar(); + + try (Stream files = Files.list(destination)) { + assertTrue(files.findFirst() + .isPresent()); + } + } + + @Test + public void givenTarGzFile_whenUntar_thenExtractedToDestination() throws IOException { + Path destination = Paths.get("/tmp/vfs-gz"); + + new TarExtractorVfs(Resources.tarGzFile(), true, destination).untar(); + + try (Stream files = Files.list(destination)) { + assertTrue(files.findFirst() + .isPresent()); + } + } +} \ No newline at end of file diff --git a/libraries-apache-commons-2/src/test/resources/untar/test.tar b/libraries-apache-commons-2/src/test/resources/untar/test.tar new file mode 100644 index 0000000000000000000000000000000000000000..a0c9e8714fc9c02482ceb12119b972e3b7327f81 GIT binary patch literal 5632 zcmeHJyAHxI49wiG$QOW}=l3Lt0f~vU5}%Kg3fiSGC9;IGbg*P!F23HS)BK!O-va<4 zIIRFMdf0!d(oWFmoV5lqV$^`v1W+3K!dkm8Wlj%*w%l)}T+89eU-k7O^>X#-!#>Ok zY0A@OVg^d!3}Ya3)4y>||2~TTM=XKpe+0{XXOtzMd!r*ijM49X|D6MxS2n-=_&)^% z@_&e^wC@e9_WyJLukW9+uL;ltf6sr2TmEx3|2ay4^8X*P{)r5L5}-uD5o9x*QT3l# c>EAZ}8!!4Fu`Z(j5iH9LVL%uV2KX`X0$IO(CIA2c literal 0 HcmV?d00001 diff --git a/libraries-apache-commons-2/src/test/resources/untar/test.tar.gz b/libraries-apache-commons-2/src/test/resources/untar/test.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..99bc3ec9339c01c9214b6f2db104e7868b742c93 GIT binary patch literal 211 zcmV;^04)C>iwFSng?3~B1MQYg4gw(zMrS>z-~`(8*YkjJVd6@L#N%5qI&O4U%#5LL z(*-1yG>?yPnC{ci769ZyeuWj|;k@&v`;(y}IwFaKfopBLDFARLry z-B_V>|I7R%whe*B_aAYdzb*ei%LyRw{~81i08RjjfKDm?hh6z^s{h)F|7#%r3xXi@ N$pic9;O_ty001@SXGQ=3 literal 0 HcmV?d00001 diff --git a/libraries-apache-commons/README.md b/libraries-apache-commons/README.md index aceea3282a..9623ecca2f 100644 --- a/libraries-apache-commons/README.md +++ b/libraries-apache-commons/README.md @@ -13,4 +13,5 @@ This module contains articles about Apache Commons libraries. - [Apache Commons BeanUtils](https://www.baeldung.com/apache-commons-beanutils) - [Histograms with Apache Commons Frequency](https://www.baeldung.com/apache-commons-frequency) - [An Introduction to Apache Commons Lang 3](https://www.baeldung.com/java-commons-lang-3) -- [Differences Between the Java WatchService API and the Apache Commons IO Monitor Library](https://www.baeldung.com/java-watchservice-vs-apache-commons-io-monitor-library) \ No newline at end of file +- [Differences Between the Java WatchService API and the Apache Commons IO Monitor Library](https://www.baeldung.com/java-watchservice-vs-apache-commons-io-monitor-library) +More articles: [[next-->]](../libraries-apache-commons-2) \ No newline at end of file diff --git a/pom.xml b/pom.xml index 0091f57913..6d566549ef 100644 --- a/pom.xml +++ b/pom.xml @@ -867,6 +867,7 @@ libraries-6 libraries-apache-commons + libraries-apache-commons-2 libraries-apache-commons-collections libraries-apache-commons-io libraries-data-2 @@ -1135,6 +1136,7 @@ libraries-5 libraries-6 libraries-apache-commons + libraries-apache-commons-2 libraries-apache-commons-collections libraries-apache-commons-io libraries-data-2 From e30ae6e6e08752799c7a3644e7589413fa5d96d5 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Sat, 24 Jun 2023 20:11:14 +0200 Subject: [PATCH 103/170] JAVA-22238 | moved articles into correct locations. (#14297) --- .../core-java-string-apis-2/README.md | 2 + .../core-java-string-apis-2/pom.xml | 6 + .../java/com/baeldung/localization/App.java | 0 .../com/baeldung/localization/ICUFormat.java | 0 .../baeldung/localization/JavaSEFormat.java | 0 .../baeldung/localization/Localization.java | 0 .../src/main/resources/formats_en.properties | 0 .../src/main/resources/formats_fr.properties | 0 .../src/main/resources/formats_it.properties | 0 .../src/main/resources/formats_pl.properties | 0 .../src/main/resources/messages_en.properties | 0 .../src/main/resources/messages_fr.properties | 0 .../src/main/resources/messages_it.properties | 0 .../src/main/resources/messages_pl.properties | 0 .../localization/ICUFormatUnitTest.java | 0 .../stringpool/StringPoolUnitTest.java | 0 .../core-java-string-operations-6/README.md | 3 + .../compactstring/CompactStringDemo.java | 0 .../src/main/resources/config.properties | 2 +- .../randomstrings/RandomStringsUnitTest.java | 206 +++++++++--------- .../src/test/resources/stringtoolong.txt | 0 core-java-modules/core-java-strings/README.md | 12 +- core-java-modules/core-java-strings/pom.xml | 6 - 23 files changed, 121 insertions(+), 116 deletions(-) rename core-java-modules/{core-java-strings => core-java-string-apis-2}/src/main/java/com/baeldung/localization/App.java (100%) rename core-java-modules/{core-java-strings => core-java-string-apis-2}/src/main/java/com/baeldung/localization/ICUFormat.java (100%) rename core-java-modules/{core-java-strings => core-java-string-apis-2}/src/main/java/com/baeldung/localization/JavaSEFormat.java (100%) rename core-java-modules/{core-java-strings => core-java-string-apis-2}/src/main/java/com/baeldung/localization/Localization.java (100%) rename core-java-modules/{core-java-strings => core-java-string-apis-2}/src/main/resources/formats_en.properties (100%) rename core-java-modules/{core-java-strings => core-java-string-apis-2}/src/main/resources/formats_fr.properties (100%) rename core-java-modules/{core-java-strings => core-java-string-apis-2}/src/main/resources/formats_it.properties (100%) rename core-java-modules/{core-java-strings => core-java-string-apis-2}/src/main/resources/formats_pl.properties (100%) rename core-java-modules/{core-java-strings => core-java-string-apis-2}/src/main/resources/messages_en.properties (100%) rename core-java-modules/{core-java-strings => core-java-string-apis-2}/src/main/resources/messages_fr.properties (100%) rename core-java-modules/{core-java-strings => core-java-string-apis-2}/src/main/resources/messages_it.properties (100%) rename core-java-modules/{core-java-strings => core-java-string-apis-2}/src/main/resources/messages_pl.properties (100%) rename core-java-modules/{core-java-strings => core-java-string-apis-2}/src/test/java/com/baeldung/localization/ICUFormatUnitTest.java (100%) rename core-java-modules/{core-java-strings => core-java-string-apis-2}/src/test/java/com/baeldung/stringpool/StringPoolUnitTest.java (100%) rename core-java-modules/{core-java-strings => core-java-string-operations-6}/src/main/java/com/baeldung/java9/compactstring/CompactStringDemo.java (100%) rename core-java-modules/{core-java-strings => core-java-string-operations-6}/src/main/resources/config.properties (99%) rename core-java-modules/{core-java-strings => core-java-string-operations-6}/src/test/java/com/baeldung/randomstrings/RandomStringsUnitTest.java (97%) rename core-java-modules/{core-java-strings => core-java-string-operations-6}/src/test/resources/stringtoolong.txt (100%) diff --git a/core-java-modules/core-java-string-apis-2/README.md b/core-java-modules/core-java-string-apis-2/README.md index d1ec0d8388..38bfb70ef1 100644 --- a/core-java-modules/core-java-string-apis-2/README.md +++ b/core-java-modules/core-java-string-apis-2/README.md @@ -5,3 +5,5 @@ This module contains articles about string APIs. ### Relevant Articles: - [Retain Only Digits and Decimal Separator in String](https://www.baeldung.com/java-string-retain-digits-decimal) - [Difference Between null and Empty String in Java](https://www.baeldung.com/java-string-null-vs-empty) +- [Guide to Java String Pool](https://www.baeldung.com/java-string-pool) +- [Java Localization – Formatting Messages](https://www.baeldung.com/java-localization-messages-formatting) \ No newline at end of file diff --git a/core-java-modules/core-java-string-apis-2/pom.xml b/core-java-modules/core-java-string-apis-2/pom.xml index db97b85748..51ab3bc1f8 100644 --- a/core-java-modules/core-java-string-apis-2/pom.xml +++ b/core-java-modules/core-java-string-apis-2/pom.xml @@ -24,6 +24,11 @@ commons-lang3 ${commons.lang3.version} + + com.ibm.icu + icu4j + ${icu4j.version} + @@ -39,6 +44,7 @@ 3.12.0 31.1-jre + 61.1 \ No newline at end of file diff --git a/core-java-modules/core-java-strings/src/main/java/com/baeldung/localization/App.java b/core-java-modules/core-java-string-apis-2/src/main/java/com/baeldung/localization/App.java similarity index 100% rename from core-java-modules/core-java-strings/src/main/java/com/baeldung/localization/App.java rename to core-java-modules/core-java-string-apis-2/src/main/java/com/baeldung/localization/App.java diff --git a/core-java-modules/core-java-strings/src/main/java/com/baeldung/localization/ICUFormat.java b/core-java-modules/core-java-string-apis-2/src/main/java/com/baeldung/localization/ICUFormat.java similarity index 100% rename from core-java-modules/core-java-strings/src/main/java/com/baeldung/localization/ICUFormat.java rename to core-java-modules/core-java-string-apis-2/src/main/java/com/baeldung/localization/ICUFormat.java diff --git a/core-java-modules/core-java-strings/src/main/java/com/baeldung/localization/JavaSEFormat.java b/core-java-modules/core-java-string-apis-2/src/main/java/com/baeldung/localization/JavaSEFormat.java similarity index 100% rename from core-java-modules/core-java-strings/src/main/java/com/baeldung/localization/JavaSEFormat.java rename to core-java-modules/core-java-string-apis-2/src/main/java/com/baeldung/localization/JavaSEFormat.java diff --git a/core-java-modules/core-java-strings/src/main/java/com/baeldung/localization/Localization.java b/core-java-modules/core-java-string-apis-2/src/main/java/com/baeldung/localization/Localization.java similarity index 100% rename from core-java-modules/core-java-strings/src/main/java/com/baeldung/localization/Localization.java rename to core-java-modules/core-java-string-apis-2/src/main/java/com/baeldung/localization/Localization.java diff --git a/core-java-modules/core-java-strings/src/main/resources/formats_en.properties b/core-java-modules/core-java-string-apis-2/src/main/resources/formats_en.properties similarity index 100% rename from core-java-modules/core-java-strings/src/main/resources/formats_en.properties rename to core-java-modules/core-java-string-apis-2/src/main/resources/formats_en.properties diff --git a/core-java-modules/core-java-strings/src/main/resources/formats_fr.properties b/core-java-modules/core-java-string-apis-2/src/main/resources/formats_fr.properties similarity index 100% rename from core-java-modules/core-java-strings/src/main/resources/formats_fr.properties rename to core-java-modules/core-java-string-apis-2/src/main/resources/formats_fr.properties diff --git a/core-java-modules/core-java-strings/src/main/resources/formats_it.properties b/core-java-modules/core-java-string-apis-2/src/main/resources/formats_it.properties similarity index 100% rename from core-java-modules/core-java-strings/src/main/resources/formats_it.properties rename to core-java-modules/core-java-string-apis-2/src/main/resources/formats_it.properties diff --git a/core-java-modules/core-java-strings/src/main/resources/formats_pl.properties b/core-java-modules/core-java-string-apis-2/src/main/resources/formats_pl.properties similarity index 100% rename from core-java-modules/core-java-strings/src/main/resources/formats_pl.properties rename to core-java-modules/core-java-string-apis-2/src/main/resources/formats_pl.properties diff --git a/core-java-modules/core-java-strings/src/main/resources/messages_en.properties b/core-java-modules/core-java-string-apis-2/src/main/resources/messages_en.properties similarity index 100% rename from core-java-modules/core-java-strings/src/main/resources/messages_en.properties rename to core-java-modules/core-java-string-apis-2/src/main/resources/messages_en.properties diff --git a/core-java-modules/core-java-strings/src/main/resources/messages_fr.properties b/core-java-modules/core-java-string-apis-2/src/main/resources/messages_fr.properties similarity index 100% rename from core-java-modules/core-java-strings/src/main/resources/messages_fr.properties rename to core-java-modules/core-java-string-apis-2/src/main/resources/messages_fr.properties diff --git a/core-java-modules/core-java-strings/src/main/resources/messages_it.properties b/core-java-modules/core-java-string-apis-2/src/main/resources/messages_it.properties similarity index 100% rename from core-java-modules/core-java-strings/src/main/resources/messages_it.properties rename to core-java-modules/core-java-string-apis-2/src/main/resources/messages_it.properties diff --git a/core-java-modules/core-java-strings/src/main/resources/messages_pl.properties b/core-java-modules/core-java-string-apis-2/src/main/resources/messages_pl.properties similarity index 100% rename from core-java-modules/core-java-strings/src/main/resources/messages_pl.properties rename to core-java-modules/core-java-string-apis-2/src/main/resources/messages_pl.properties diff --git a/core-java-modules/core-java-strings/src/test/java/com/baeldung/localization/ICUFormatUnitTest.java b/core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/localization/ICUFormatUnitTest.java similarity index 100% rename from core-java-modules/core-java-strings/src/test/java/com/baeldung/localization/ICUFormatUnitTest.java rename to core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/localization/ICUFormatUnitTest.java diff --git a/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringpool/StringPoolUnitTest.java b/core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/stringpool/StringPoolUnitTest.java similarity index 100% rename from core-java-modules/core-java-strings/src/test/java/com/baeldung/stringpool/StringPoolUnitTest.java rename to core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/stringpool/StringPoolUnitTest.java diff --git a/core-java-modules/core-java-string-operations-6/README.md b/core-java-modules/core-java-string-operations-6/README.md index a6e5380424..e866f50860 100644 --- a/core-java-modules/core-java-string-operations-6/README.md +++ b/core-java-modules/core-java-string-operations-6/README.md @@ -3,3 +3,6 @@ - [Find the Longest Word in a Given String in Java](https://www.baeldung.com/java-longest-word-string) - [Check if a String Is All Uppercase or Lowercase in Java](https://www.baeldung.com/java-check-string-uppercase-lowercase) +- [Java – Generate Random String](https://www.baeldung.com/java-random-string) +- [Fixing “constant string too long” Build Error](https://www.baeldung.com/java-constant-string-too-long-error) +- [Compact Strings in Java 9](https://www.baeldung.com/java-9-compact-string) \ No newline at end of file diff --git a/core-java-modules/core-java-strings/src/main/java/com/baeldung/java9/compactstring/CompactStringDemo.java b/core-java-modules/core-java-string-operations-6/src/main/java/com/baeldung/java9/compactstring/CompactStringDemo.java similarity index 100% rename from core-java-modules/core-java-strings/src/main/java/com/baeldung/java9/compactstring/CompactStringDemo.java rename to core-java-modules/core-java-string-operations-6/src/main/java/com/baeldung/java9/compactstring/CompactStringDemo.java diff --git a/core-java-modules/core-java-strings/src/main/resources/config.properties b/core-java-modules/core-java-string-operations-6/src/main/resources/config.properties similarity index 99% rename from core-java-modules/core-java-strings/src/main/resources/config.properties rename to core-java-modules/core-java-string-operations-6/src/main/resources/config.properties index 8197c13543..088ed029d7 100644 --- a/core-java-modules/core-java-strings/src/main/resources/config.properties +++ b/core-java-modules/core-java-string-operations-6/src/main/resources/config.properties @@ -1 +1 @@ -string.too.long= StringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLong +string.too.long= StringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLong diff --git a/core-java-modules/core-java-strings/src/test/java/com/baeldung/randomstrings/RandomStringsUnitTest.java b/core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/randomstrings/RandomStringsUnitTest.java similarity index 97% rename from core-java-modules/core-java-strings/src/test/java/com/baeldung/randomstrings/RandomStringsUnitTest.java rename to core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/randomstrings/RandomStringsUnitTest.java index edfabc8777..8bc50be7e6 100644 --- a/core-java-modules/core-java-strings/src/test/java/com/baeldung/randomstrings/RandomStringsUnitTest.java +++ b/core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/randomstrings/RandomStringsUnitTest.java @@ -1,103 +1,103 @@ -package com.baeldung.randomstrings; - -import org.apache.commons.lang3.RandomStringUtils; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.nio.charset.Charset; -import java.util.Random; - -public class RandomStringsUnitTest { - - private static final Logger LOG = LoggerFactory.getLogger(RandomStringsUnitTest.class); - - @Test - public void givenUsingPlainJava_whenGeneratingRandomStringUnbounded_thenCorrect() { - byte[] array = new byte[7]; // length is bounded by 7 - new Random().nextBytes(array); - String generatedString = new String(array, Charset.forName("UTF-8")); - - LOG.debug(generatedString); - } - - @Test - public void givenUsingPlainJava_whenGeneratingRandomStringBounded_thenCorrect() { - int leftLimit = 97; // letter 'a' - int rightLimit = 122; // letter 'z' - int targetStringLength = 10; - Random random = new Random(); - StringBuilder buffer = new StringBuilder(targetStringLength); - - for (int i = 0; i < targetStringLength; i++) { - int randomLimitedInt = leftLimit + (int) (random.nextFloat() * (rightLimit - leftLimit + 1)); - buffer.append((char) randomLimitedInt); - } - String generatedString = buffer.toString(); - - LOG.debug(generatedString); - } - - @Test - public void givenUsingJava8_whenGeneratingRandomAlphabeticString_thenCorrect() { - int leftLimit = 97; // letter 'a' - int rightLimit = 122; // letter 'z' - int targetStringLength = 10; - Random random = new Random(); - - String generatedString = random.ints(leftLimit, rightLimit + 1) - .limit(targetStringLength) - .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) - .toString(); - - LOG.debug(generatedString); - } - - @Test - public void givenUsingJava8_whenGeneratingRandomAlphanumericString_thenCorrect() { - int leftLimit = 48; // numeral '0' - int rightLimit = 122; // letter 'z' - int targetStringLength = 10; - Random random = new Random(); - - String generatedString = random.ints(leftLimit, rightLimit + 1) - .filter(i -> (i <= 57 || i >= 65) && (i <= 90 || i >= 97)) - .limit(targetStringLength) - .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) - .toString(); - - LOG.debug(generatedString); - } - - @Test - public void givenUsingApache_whenGeneratingRandomString_thenCorrect() { - String generatedString = RandomStringUtils.random(10); - - LOG.debug(generatedString); - } - - @Test - public void givenUsingApache_whenGeneratingRandomAlphabeticString_thenCorrect() { - String generatedString = RandomStringUtils.randomAlphabetic(10); - - LOG.debug(generatedString); - } - - @Test - public void givenUsingApache_whenGeneratingRandomAlphanumericString_thenCorrect() { - String generatedString = RandomStringUtils.randomAlphanumeric(10); - - LOG.debug(generatedString); - } - - @Test - public void givenUsingApache_whenGeneratingRandomStringBounded_thenCorrect() { - int length = 10; - boolean useLetters = true; - boolean useNumbers = false; - String generatedString = RandomStringUtils.random(length, useLetters, useNumbers); - - LOG.debug(generatedString); - } - -} +package com.baeldung.randomstrings; + +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.nio.charset.Charset; +import java.util.Random; + +public class RandomStringsUnitTest { + + private static final Logger LOG = LoggerFactory.getLogger(RandomStringsUnitTest.class); + + @Test + public void givenUsingPlainJava_whenGeneratingRandomStringUnbounded_thenCorrect() { + byte[] array = new byte[7]; // length is bounded by 7 + new Random().nextBytes(array); + String generatedString = new String(array, Charset.forName("UTF-8")); + + LOG.debug(generatedString); + } + + @Test + public void givenUsingPlainJava_whenGeneratingRandomStringBounded_thenCorrect() { + int leftLimit = 97; // letter 'a' + int rightLimit = 122; // letter 'z' + int targetStringLength = 10; + Random random = new Random(); + StringBuilder buffer = new StringBuilder(targetStringLength); + + for (int i = 0; i < targetStringLength; i++) { + int randomLimitedInt = leftLimit + (int) (random.nextFloat() * (rightLimit - leftLimit + 1)); + buffer.append((char) randomLimitedInt); + } + String generatedString = buffer.toString(); + + LOG.debug(generatedString); + } + + @Test + public void givenUsingJava8_whenGeneratingRandomAlphabeticString_thenCorrect() { + int leftLimit = 97; // letter 'a' + int rightLimit = 122; // letter 'z' + int targetStringLength = 10; + Random random = new Random(); + + String generatedString = random.ints(leftLimit, rightLimit + 1) + .limit(targetStringLength) + .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) + .toString(); + + LOG.debug(generatedString); + } + + @Test + public void givenUsingJava8_whenGeneratingRandomAlphanumericString_thenCorrect() { + int leftLimit = 48; // numeral '0' + int rightLimit = 122; // letter 'z' + int targetStringLength = 10; + Random random = new Random(); + + String generatedString = random.ints(leftLimit, rightLimit + 1) + .filter(i -> (i <= 57 || i >= 65) && (i <= 90 || i >= 97)) + .limit(targetStringLength) + .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) + .toString(); + + LOG.debug(generatedString); + } + + @Test + public void givenUsingApache_whenGeneratingRandomString_thenCorrect() { + String generatedString = RandomStringUtils.random(10); + + LOG.debug(generatedString); + } + + @Test + public void givenUsingApache_whenGeneratingRandomAlphabeticString_thenCorrect() { + String generatedString = RandomStringUtils.randomAlphabetic(10); + + LOG.debug(generatedString); + } + + @Test + public void givenUsingApache_whenGeneratingRandomAlphanumericString_thenCorrect() { + String generatedString = RandomStringUtils.randomAlphanumeric(10); + + LOG.debug(generatedString); + } + + @Test + public void givenUsingApache_whenGeneratingRandomStringBounded_thenCorrect() { + int length = 10; + boolean useLetters = true; + boolean useNumbers = false; + String generatedString = RandomStringUtils.random(length, useLetters, useNumbers); + + LOG.debug(generatedString); + } + +} diff --git a/core-java-modules/core-java-strings/src/test/resources/stringtoolong.txt b/core-java-modules/core-java-string-operations-6/src/test/resources/stringtoolong.txt similarity index 100% rename from core-java-modules/core-java-strings/src/test/resources/stringtoolong.txt rename to core-java-modules/core-java-string-operations-6/src/test/resources/stringtoolong.txt diff --git a/core-java-modules/core-java-strings/README.md b/core-java-modules/core-java-strings/README.md index 84cf31e8bd..03e980e5a5 100644 --- a/core-java-modules/core-java-strings/README.md +++ b/core-java-modules/core-java-strings/README.md @@ -1,16 +1,16 @@ ## Java Strings -This module contains articles about strings in Java. +This is a generic module contains articles about strings in Java. +Listed here there are only those articles that does not fit into other core-java-string-* modules as: +- [core-java-string-operations](../core-java-string-operations) +- [core-java-string-apis](../core-java-string-apis) +- [core-java-string-conversion](../core-java-string-conversions) +- [core-java-string-algorithms](../core-java-string-algorithms) ### Relevant Articles: - [Use char[] Array Over a String for Manipulating Passwords in Java?](https://www.baeldung.com/java-storing-passwords) -- [Compact Strings in Java 9](https://www.baeldung.com/java-9-compact-string) - [String Not Empty Test Assertions in Java](https://www.baeldung.com/java-assert-string-not-empty) - [String Performance Hints](https://www.baeldung.com/java-string-performance) -- [Java Localization – Formatting Messages](https://www.baeldung.com/java-localization-messages-formatting) -- [Java – Generate Random String](https://www.baeldung.com/java-random-string) - [Java String Interview Questions and Answers](https://www.baeldung.com/java-string-interview-questions) - [Java Multi-line String](https://www.baeldung.com/java-multiline-string) -- [Guide to Java String Pool](https://www.baeldung.com/java-string-pool) -- [Fixing “constant string too long” Build Error](https://www.baeldung.com/java-constant-string-too-long-error) - [Reuse StringBuilder for Efficiency](https://www.baeldung.com/java-reuse-stringbuilder-for-efficiency) diff --git a/core-java-modules/core-java-strings/pom.xml b/core-java-modules/core-java-strings/pom.xml index e3cdb3c666..b43e7bfe73 100644 --- a/core-java-modules/core-java-strings/pom.xml +++ b/core-java-modules/core-java-strings/pom.xml @@ -29,11 +29,6 @@ jmh-generator-annprocess ${jmh-generator.version} - - com.ibm.icu - icu4j - ${icu4j.version} - @@ -47,7 +42,6 @@ - 61.1 15 From fee50e9b340cf1a987ce55fe07a149d8f9cde475 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Sun, 25 Jun 2023 14:23:03 +0300 Subject: [PATCH 104/170] JAVA-20405 Remove 'modules' from spring-thymeleaf-attributes (#14300) Co-authored-by: timis1 --- .../accessing-session-attributes/pom.xml | 2 +- spring-web-modules/spring-thymeleaf-attributes/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-web-modules/spring-thymeleaf-attributes/accessing-session-attributes/pom.xml b/spring-web-modules/spring-thymeleaf-attributes/accessing-session-attributes/pom.xml index 8d1b43f2c6..59bca1ac7e 100644 --- a/spring-web-modules/spring-thymeleaf-attributes/accessing-session-attributes/pom.xml +++ b/spring-web-modules/spring-thymeleaf-attributes/accessing-session-attributes/pom.xml @@ -12,7 +12,7 @@ com.baeldung.spring-thymeleaf-attributes - spring-thymeleaf-attributes-modules + spring-thymeleaf-attributes 0.0.1-SNAPSHOT ../pom.xml diff --git a/spring-web-modules/spring-thymeleaf-attributes/pom.xml b/spring-web-modules/spring-thymeleaf-attributes/pom.xml index 44806cc29f..c7b1b7669d 100644 --- a/spring-web-modules/spring-thymeleaf-attributes/pom.xml +++ b/spring-web-modules/spring-thymeleaf-attributes/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.baeldung.spring-thymeleaf-attributes - spring-thymeleaf-attributes-modules + spring-thymeleaf-attributes 0.0.1-SNAPSHOT pom From bac109cdc852e343dc8c4e51f22ca35a78914649 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sun, 25 Jun 2023 17:00:13 +0530 Subject: [PATCH 105/170] JAVA-21460 Upgrade spring-boot-swagger-jwt modules to use SpringDoc in place of SpringFox (#14296) * JAVA-21460 Upgrade spring-boot-swagger-jwt modules to use SpringDoc in place of SpringFox * JAVA-21460 Upgrade spring-boot-swagger-2 module to use SpringDoc in place of SpringFox * JAVA-21460 Upgrade spring-boot-swagger module to use SpringDoc in place of SpringFox --- .../config/Swagger2Config.java | 31 +++------- .../controller/FooController.java | 6 +- .../controller/UserController.java | 17 +++--- .../baeldung/swagger2bootmvc/model/Foo.java | 7 +-- .../baeldung/swagger2bootmvc/model/User.java | 7 +-- .../spring-boot-swagger-jwt/pom.xml | 8 +-- .../configuration/SwaggerConfiguration.java | 60 ++++++------------- .../controller/ClientsRestController.java | 11 ++-- .../spring-boot-swagger/pom.xml | 6 ++ .../swaggerexample/config/SwaggerConfig.java | 37 ++++-------- .../controller/ProductController.java | 32 ++++++---- .../swaggerexample/entity/Product.java | 10 ++-- .../config/SwaggerConfiguration.java | 17 +++--- .../controller/CustomerController.java | 20 ++++--- 14 files changed, 115 insertions(+), 154 deletions(-) diff --git a/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/config/Swagger2Config.java b/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/config/Swagger2Config.java index d4a7774510..2e5e4f8ce5 100644 --- a/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/config/Swagger2Config.java +++ b/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/config/Swagger2Config.java @@ -4,35 +4,20 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; @Configuration @EnableWebMvc -@EnableSwagger2 public class Swagger2Config { - @Bean - public Docket api() { - return new Docket(DocumentationType.SWAGGER_2) - .select() - .apis(RequestHandlerSelectors.any()) - .paths(PathSelectors.any()) - .build() - .apiInfo(apiEndPointsInfo()); - } - private ApiInfo apiEndPointsInfo() { - return new ApiInfoBuilder().title("Swagger Array") + @Bean + public OpenAPI openAPI() { + return new OpenAPI().info(new Info().title("Swagger Array") .description("This is a sample Swagger description for an Array server") - .license("Apache 2.0") - .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html") .version("1.0.0") - .build(); + .license(new License().name("Apache 2.0") + .url("http://www.apache.org/licenses/LICENSE-2.0.html"))); } } \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/controller/FooController.java b/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/controller/FooController.java index 5edf610154..8bd421241c 100644 --- a/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/controller/FooController.java +++ b/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/controller/FooController.java @@ -12,8 +12,8 @@ import org.springframework.web.bind.annotation.ResponseStatus; import com.baeldung.swagger2bootmvc.model.Foo; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; @Controller public class FooController { @@ -26,7 +26,7 @@ public class FooController { @RequestMapping(method = RequestMethod.POST, value = "/foos") @ResponseStatus(HttpStatus.CREATED) @ResponseBody - @ApiImplicitParams({ @ApiImplicitParam(name = "foo", value = "List of strings", paramType = "body", dataType = "Foo") }) + @Parameters({ @Parameter(name = "foo", description = "List of strings") }) public Foo create(@RequestBody final Foo foo) { foo.setId(Long.parseLong(randomNumeric(2))); return foo; diff --git a/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/controller/UserController.java b/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/controller/UserController.java index fa879f3bea..727b6e21b0 100644 --- a/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/controller/UserController.java +++ b/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/controller/UserController.java @@ -10,27 +10,26 @@ import org.springframework.web.bind.annotation.ResponseStatus; import com.baeldung.swagger2bootmvc.model.User; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; @Controller public class UserController { public UserController() { super(); - } //@formatter:off + } @RequestMapping(method = RequestMethod.POST, value = "/createUser", produces = "application/json; charset=UTF-8") @ResponseStatus(HttpStatus.CREATED) @ResponseBody - @ApiOperation(value = "Create user", - notes = "This method creates a new user") - public User createUser(@ApiParam( + @Operation(summary = "Create user", + description = "This method creates a new user") + public User createUser(@Parameter( name = "firstName", - type = "String", - value = "First Name of the user", + description = "First Name of the user", example = "Vatsal", - required = true) @RequestParam String firstName) { //@formatter:on + required = true) @RequestParam String firstName) { User user = new User(firstName); return user; } diff --git a/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/model/Foo.java b/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/model/Foo.java index f3fe56e07d..c8eadadb26 100644 --- a/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/model/Foo.java +++ b/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/model/Foo.java @@ -2,14 +2,13 @@ package com.baeldung.swagger2bootmvc.model; import java.util.List; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; -@ApiModel +@Schema public class Foo { private long id; - @ApiModelProperty(name = "name", dataType = "List", example = "[\"str1\", \"str2\", \"str3\"]") + @Schema(name = "name", type = "array", example = "[\"str1\", \"str2\", \"str3\"]") private List name; public Foo() { diff --git a/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/model/User.java b/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/model/User.java index b4ec55f564..1b63ffc81d 100644 --- a/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/model/User.java +++ b/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/swagger2bootmvc/model/User.java @@ -1,12 +1,11 @@ package com.baeldung.swagger2bootmvc.model; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; -@ApiModel +@Schema public class User { - @ApiModelProperty(value = "first name of the user", name = "firstName", dataType = "String", example = "Vatsal") + @Schema(description = "first name of the user", name = "firstName", type = "string", example = "Vatsal") String firstName; public User() { diff --git a/spring-boot-modules/spring-boot-swagger-jwt/pom.xml b/spring-boot-modules/spring-boot-swagger-jwt/pom.xml index e0d96627cd..464777a788 100644 --- a/spring-boot-modules/spring-boot-swagger-jwt/pom.xml +++ b/spring-boot-modules/spring-boot-swagger-jwt/pom.xml @@ -21,9 +21,9 @@ spring-boot-starter-web - io.springfox - springfox-boot-starter - ${springfox.version} + org.springdoc + springdoc-openapi-ui + ${springdoc.version} @@ -37,7 +37,7 @@ - 3.0.0 + 1.7.0 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-swagger-jwt/src/main/java/com/baeldung/swaggerjwt/configuration/SwaggerConfiguration.java b/spring-boot-modules/spring-boot-swagger-jwt/src/main/java/com/baeldung/swaggerjwt/configuration/SwaggerConfiguration.java index e5e87de3ec..f67b75c670 100644 --- a/spring-boot-modules/spring-boot-swagger-jwt/src/main/java/com/baeldung/swaggerjwt/configuration/SwaggerConfiguration.java +++ b/spring-boot-modules/spring-boot-swagger-jwt/src/main/java/com/baeldung/swaggerjwt/configuration/SwaggerConfiguration.java @@ -3,54 +3,32 @@ package com.baeldung.swaggerjwt.configuration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.*; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.service.contexts.SecurityContext; -import springfox.documentation.spring.web.plugins.Docket; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; @Configuration public class SwaggerConfiguration { - public static final String AUTHORIZATION_HEADER = "Authorization"; - - private ApiInfo apiInfo() { - return new ApiInfo("My REST API", "Some custom description of API.", "1.0", "Terms of service", new Contact("Sallo Szrajbman", "www.baeldung.com", "salloszraj@gmail.com"), "License of API", "API license URL", Collections.emptyList()); - } - @Bean - public Docket api() { - return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()) - .securityContexts(Arrays.asList(securityContext())) - .securitySchemes(Arrays.asList(apiKey())) - .select() - .apis(RequestHandlerSelectors.any()) - .paths(PathSelectors.any()) - .build(); + public OpenAPI openAPI() { + return new OpenAPI().addSecurityItem(new SecurityRequirement().addList("Bearer Authentication")) + .components(new Components().addSecuritySchemes("Bearer Authentication", createAPIKeyScheme())) + .info(new Info().title("My REST API") + .description("Some custom description of API.") + .version("1.0").contact(new Contact().name("Sallo Szrajbman").email( "www.baeldung.com").url("salloszraj@gmail.com")) + .license(new License().name("License of API") + .url("API license URL"))); } - private ApiKey apiKey() { - return new ApiKey("JWT", AUTHORIZATION_HEADER, "header"); - } - - private SecurityContext securityContext() { - return SecurityContext.builder() - .securityReferences(List.of(defaultAuth())) - .operationSelector(o -> o.requestMappingPattern() - .matches("/.*")) - .build(); - } - - private SecurityReference defaultAuth() { - return SecurityReference.builder() - .scopes(new AuthorizationScope[0]) - .reference("JWT") - .build(); + private SecurityScheme createAPIKeyScheme() { + return new SecurityScheme().type(SecurityScheme.Type.HTTP) + .bearerFormat("JWT") + .scheme("bearer"); } } diff --git a/spring-boot-modules/spring-boot-swagger-jwt/src/main/java/com/baeldung/swaggerjwt/controller/ClientsRestController.java b/spring-boot-modules/spring-boot-swagger-jwt/src/main/java/com/baeldung/swaggerjwt/controller/ClientsRestController.java index f60ba2448a..1e73ed55be 100644 --- a/spring-boot-modules/spring-boot-swagger-jwt/src/main/java/com/baeldung/swaggerjwt/controller/ClientsRestController.java +++ b/spring-boot-modules/spring-boot-swagger-jwt/src/main/java/com/baeldung/swaggerjwt/controller/ClientsRestController.java @@ -3,20 +3,17 @@ package com.baeldung.swaggerjwt.controller; import java.util.Arrays; import java.util.List; -import com.baeldung.swaggerjwt.configuration.SwaggerConfiguration; -import io.swagger.annotations.Api; -import org.springframework.http.HttpHeaders; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RestController; -import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; @RestController(value = "/clients") -@Api( tags = "Clients") +@Tag(name = "Clients") public class ClientsRestController { - @ApiOperation(value = "This method is used to get the clients.") + @Operation(summary = "This method is used to get the clients.") @GetMapping public List getClients() { return Arrays.asList("First Client", "Second Client"); diff --git a/spring-boot-modules/spring-boot-swagger/pom.xml b/spring-boot-modules/spring-boot-swagger/pom.xml index 749442c225..c064f9c636 100644 --- a/spring-boot-modules/spring-boot-swagger/pom.xml +++ b/spring-boot-modules/spring-boot-swagger/pom.xml @@ -30,6 +30,11 @@ swagger-maven-plugin ${swagger-maven-plugin.version} + + org.springdoc + springdoc-openapi-ui + ${springdoc.version} + @@ -82,6 +87,7 @@ 3.0.0 3.1.1 + 1.7.0 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerexample/config/SwaggerConfig.java b/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerexample/config/SwaggerConfig.java index 32dbe87bae..df808a214b 100644 --- a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerexample/config/SwaggerConfig.java +++ b/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerexample/config/SwaggerConfig.java @@ -2,37 +2,26 @@ package com.baeldung.swaggerexample.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; - import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.service.Contact; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import java.util.Collections; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; @Configuration @EnableWebMvc public class SwaggerConfig { @Bean - public Docket api() { - return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()) - .select() - .apis(RequestHandlerSelectors.basePackage("com.baeldung.swaggerexample")) - .paths(PathSelectors.any()) - .build(); - } - - private ApiInfo apiInfo() { - return new ApiInfo( - "Products API", - "API to let you add and view product", - "0.0.1", - "Terms of service", - new Contact("John Doe", "www.example.com", "myemail@company.com"), - "License of API", "API license URL", Collections.emptyList()); + public OpenAPI openAPI() { + return new OpenAPI().info(new Info().title("Products API") + .description("API to let you add and view product") + .version("0.0.1") + .contact(new Contact().name("John Doe") + .email("myemail@company.com") + .url("www.example.com")) + .license(new License().name("License of API") + .url("API license URL"))); } } diff --git a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerexample/controller/ProductController.java b/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerexample/controller/ProductController.java index 7500c01bc0..1e838bc5c9 100644 --- a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerexample/controller/ProductController.java +++ b/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerexample/controller/ProductController.java @@ -1,33 +1,41 @@ package com.baeldung.swaggerexample.controller; -import com.baeldung.swaggerexample.entity.Product; -import io.swagger.annotations.*; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.swaggerexample.entity.Product; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; @RestController -@ApiOperation("Products API") +@Tag(name = "Products API") public class ProductController { - @ApiOperation(value = "Create a new product", notes = "Creates a new product as per the request body") + @Operation(summary = "Create a new product", description = "Creates a new product as per the request body") @ApiResponses(value = { - @ApiResponse(code = 201, message = "Successfully created"), - @ApiResponse(code = 400, message = "Bad request - The product is not valid"), - @ApiResponse(code = 500, message = "Internal server error - Something went wrong") + @ApiResponse(responseCode = "201", description = "Successfully created"), @ApiResponse(responseCode = "400", description = "Bad request - The product is not valid"), + @ApiResponse(responseCode = "500", description = "Internal server error - Something went wrong") }) @PostMapping(value = "/products") public ResponseEntity createProduct(@RequestBody Product product) { return new ResponseEntity<>(HttpStatus.CREATED); } - @ApiOperation(value = "Get a product by id", notes = "Returns a product as per the id") + @Operation(summary = "Get a product by id", description = "Returns a product as per the id") @ApiResponses(value = { - @ApiResponse(code = 200, message = "Successfully retrieved"), - @ApiResponse(code = 404, message = "Not found - The product was not found") + @ApiResponse(responseCode = "200", description = "Successfully retrieved"), @ApiResponse(responseCode = "404", description = "Not found - The product was not found") }) @GetMapping("/products/{id}") - public ResponseEntity getProduct(@PathVariable("id") @ApiParam(name = "id", value = "Product id", example = "1") Long id) { + public ResponseEntity getProduct(@PathVariable("id") @Parameter(name = "id", description = "Product id", example = "1") Long id) { //retrieval logic return ResponseEntity.ok(new Product(1, "Product 1", "$21.99")); } diff --git a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerexample/entity/Product.java b/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerexample/entity/Product.java index 122addadd5..40cde738ab 100644 --- a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerexample/entity/Product.java +++ b/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerexample/entity/Product.java @@ -1,15 +1,15 @@ package com.baeldung.swaggerexample.entity; -import io.swagger.annotations.ApiModelProperty; - +import io.swagger.v3.oas.annotations.media.Schema; import java.io.Serializable; public class Product implements Serializable { - @ApiModelProperty(notes = "Product ID", example = "1", required = true) + + @Schema(name = "Product ID", example = "1", required = true) private Long id; - @ApiModelProperty(notes = "Product name", example = "Product 1", required = false) + @Schema(name = "Product name", example = "Product 1", required = false) private String name; - @ApiModelProperty(notes = "Product price", example = "$100.00", required = true) + @Schema(name = "Product price", example = "$100.00", required = true) private String price; // constructor and getter/setters diff --git a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerresponses/config/SwaggerConfiguration.java b/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerresponses/config/SwaggerConfiguration.java index 5a4d237d97..33e7e64b19 100644 --- a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerresponses/config/SwaggerConfiguration.java +++ b/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerresponses/config/SwaggerConfiguration.java @@ -2,21 +2,20 @@ package com.baeldung.swaggerresponses.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; @Configuration +@EnableWebMvc public class SwaggerConfiguration { @Bean - public Docket api() { - return new Docket(DocumentationType.SWAGGER_2).select() - .apis(RequestHandlerSelectors.any()) - .paths(PathSelectors.any()) - .build(); + public OpenAPI openAPI() { + return new OpenAPI().info(new Info().title("Swagger Application") + .description("This is a sample application for difference between @Operation & @ApiResponse") + .version("1.0.0")); } } diff --git a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerresponses/controller/CustomerController.java b/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerresponses/controller/CustomerController.java index 0811af56ec..436b848904 100644 --- a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerresponses/controller/CustomerController.java +++ b/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerresponses/controller/CustomerController.java @@ -4,10 +4,12 @@ import com.baeldung.swaggerresponses.response.CustomerResponse; import com.baeldung.swaggerresponses.response.ErrorResponse; import com.baeldung.swaggerresponses.service.CustomerService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -15,7 +17,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -@Api("Customer Controller") +@Tag(name = "Customer Controller") @RestController @RequestMapping("/customers") public class CustomerController { @@ -26,11 +28,11 @@ public class CustomerController { this.customerService = customerService; } - @ApiOperation(value = "Gets customer by ID", response = CustomerResponse.class, notes = "Customer must exist") + @Operation(summary = "Gets customer by ID", description = "Customer must exist") @ApiResponses(value = { - @ApiResponse(code = 400, message = "Invalid ID supplied"), - @ApiResponse(code = 404, message = "Customer not found"), - @ApiResponse(code = 500, message = "Internal server error", response = ErrorResponse.class) }) + @ApiResponse(responseCode = "200", description = "Ok", content = { @Content(mediaType = "application/json", schema = @Schema(implementation = CustomerResponse.class)) }), + @ApiResponse(responseCode = "400", description = "Invalid ID supplied"), @ApiResponse(responseCode = "404", description = "Customer not found"), + @ApiResponse(responseCode = "500", description = "Internal server error", content = { @Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class)) }) }) @GetMapping("/{id}") public ResponseEntity getCustomer(@PathVariable("id") Long id) { return ResponseEntity.ok(customerService.getById(id)); From f4402b33e17386dd023d98f2dd240f8ef679fd94 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sun, 25 Jun 2023 14:14:06 +0200 Subject: [PATCH 106/170] Adjust for a non-null MongoClient API (#14247) --- .../boot/csfle/service/CitizenService.java | 58 +++++++++++-------- .../boot/csfle/web/CitizenController.java | 7 ++- 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java index 094483bbdf..573bd77b48 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java @@ -1,6 +1,8 @@ package com.baeldung.boot.csfle.service; import java.util.List; +import java.util.Objects; +import java.util.Optional; import java.util.stream.Collectors; import org.bson.BsonBinary; @@ -26,22 +28,32 @@ public class CitizenService { public static final String DETERMINISTIC_ALGORITHM = "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"; public static final String RANDOM_ALGORITHM = "AEAD_AES_256_CBC_HMAC_SHA_512-Random"; - @Autowired - private MongoTemplate mongo; + private final MongoTemplate mongo; + private final EncryptionConfig encryptionConfig; + private final ClientEncryption clientEncryption; - @Autowired - private EncryptionConfig encryptionConfig; - - @Autowired - private ClientEncryption clientEncryption; + public CitizenService(MongoTemplate mongo, EncryptionConfig encryptionConfig, ClientEncryption clientEncryption) { + this.mongo = mongo; + this.encryptionConfig = encryptionConfig; + this.clientEncryption = clientEncryption; + } public Object save(Citizen citizen) { if (encryptionConfig.isAutoEncryption()) { return mongo.save(citizen); } else { EncryptedCitizen encryptedCitizen = new EncryptedCitizen(citizen.getName()); - encryptedCitizen.setEmail(encrypt(citizen.getEmail(), DETERMINISTIC_ALGORITHM)); - encryptedCitizen.setBirthYear(encrypt(citizen.getBirthYear(), RANDOM_ALGORITHM)); + if (citizen.getEmail() != null) { + encryptedCitizen.setEmail(encrypt(citizen.getEmail(), DETERMINISTIC_ALGORITHM)); + } else { + encryptedCitizen.setEmail(null); + + } + if (citizen.getBirthYear() != null) { + encryptedCitizen.setBirthYear(encrypt(citizen.getBirthYear(), RANDOM_ALGORITHM)); + } else { + encryptedCitizen.setBirthYear(null); + } return mongo.save(encryptedCitizen); } @@ -78,8 +90,8 @@ public class CitizenService { } public Binary encrypt(BsonValue bsonValue, String algorithm) { - if (bsonValue == null) - return null; + Objects.requireNonNull(bsonValue); + Objects.requireNonNull(algorithm); EncryptOptions options = new EncryptOptions(algorithm); options.keyId(encryptionConfig.getDataKeyId()); @@ -89,42 +101,38 @@ public class CitizenService { } public Binary encrypt(String value, String algorithm) { - if (value == null) - return null; + Objects.requireNonNull(value); + Objects.requireNonNull(algorithm); return encrypt(new BsonString(value), algorithm); } public Binary encrypt(Integer value, String algorithm) { - if (value == null) - return null; + Objects.requireNonNull(value); + Objects.requireNonNull(algorithm); return encrypt(new BsonInt32(value), algorithm); } public BsonValue decryptProperty(Binary value) { - if (value == null) - return null; + Objects.requireNonNull(value); return clientEncryption.decrypt(new BsonBinary(value.getType(), value.getData())); } private Citizen decrypt(EncryptedCitizen encrypted) { - if (encrypted == null) - return null; + Objects.requireNonNull(encrypted); Citizen citizen = new Citizen(encrypted.getName()); - BsonValue decryptedBirthYear = decryptProperty(encrypted.getBirthYear()); + BsonValue decryptedBirthYear = encrypted.getBirthYear() != null ? decryptProperty(encrypted.getBirthYear()) : null; if (decryptedBirthYear != null) { - citizen.setBirthYear(decryptedBirthYear.asInt32() - .intValue()); + citizen.setBirthYear(decryptedBirthYear.asInt32().intValue()); } - BsonValue decryptedEmail = decryptProperty(encrypted.getEmail()); + BsonValue decryptedEmail = encrypted.getEmail() != null ? decryptProperty(encrypted.getEmail()) : null; if (decryptedEmail != null) { - citizen.setEmail(decryptedEmail.asString() - .getValue()); + citizen.setEmail(decryptedEmail.asString().getValue()); } return citizen; diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/web/CitizenController.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/web/CitizenController.java index 7a2b2605cd..b198b97d57 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/web/CitizenController.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/web/CitizenController.java @@ -17,8 +17,11 @@ import com.baeldung.boot.csfle.service.CitizenService; @RequestMapping("/citizen") public class CitizenController { - @Autowired - private CitizenService service; + private final CitizenService service; + + public CitizenController(CitizenService service) { + this.service = service; + } @GetMapping public List get() { From 7464d2b90e7e5d4540e2a3a3152a409be75ab1d1 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sun, 25 Jun 2023 18:06:27 +0530 Subject: [PATCH 107/170] JAVA-21458 Upgrade custom-validations-opeanpi-codegen to use SpringDoc in place of SpringFox (#14302) --- .../custom-validations-opeanpi-codegen/pom.xml | 16 ++++++---------- .../resources/openapi/templates/api.mustache | 5 ++--- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml index 9cd6f71892..c529951b07 100644 --- a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml +++ b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml @@ -41,21 +41,16 @@ openapi-generator 3.3.4 - - io.springfox - springfox-oas - ${springfox-version} - - - io.springfox - springfox-swagger-ui - ${springfox-version} - com.fasterxml.jackson.core jackson-databind 2.10.0.pr3 + + org.springdoc + springdoc-openapi-ui + ${springdoc.version} + @@ -101,6 +96,7 @@ 11 3.0.0 2.17.1 + 1.7.0 \ No newline at end of file diff --git a/spring-swagger-codegen/custom-validations-opeanpi-codegen/src/main/resources/openapi/templates/api.mustache b/spring-swagger-codegen/custom-validations-opeanpi-codegen/src/main/resources/openapi/templates/api.mustache index 34f4afac3a..ed806c6282 100644 --- a/spring-swagger-codegen/custom-validations-opeanpi-codegen/src/main/resources/openapi/templates/api.mustache +++ b/spring-swagger-codegen/custom-validations-opeanpi-codegen/src/main/resources/openapi/templates/api.mustache @@ -37,7 +37,6 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import org.springframework.http.codec.multipart.Part; {{/reactive}} -import springfox.documentation.annotations.ApiIgnore; {{#useBeanValidation}} import javax.validation.Valid; @@ -129,13 +128,13 @@ public interface {{classname}} { produces = { {{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}} }{{/hasProduces}}{{#hasConsumes}}, consumes = { {{#consumes}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/consumes}} }{{/hasConsumes}}{{/singleContentTypes}} ) - {{#jdk8-default-interface}}default {{/jdk8-default-interface}}{{#responseWrapper}}{{.}}<{{/responseWrapper}}ResponseEntity<{{>returnTypes}}>{{#responseWrapper}}>{{/responseWrapper}} {{#delegate-method}}_{{/delegate-method}}{{operationId}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{>cookieParams}}{{^-last}},{{/-last}}{{#-last}}{{#reactive}}, {{/reactive}}{{/-last}}{{/allParams}}{{#reactive}}@ApiIgnore final ServerWebExchange exchange{{/reactive}}{{#vendorExtensions.x-spring-paginated}}, @ApiIgnore final Pageable pageable{{/vendorExtensions.x-spring-paginated}}){{^jdk8-default-interface}};{{/jdk8-default-interface}}{{#jdk8-default-interface}}{{#unhandledException}} throws Exception{{/unhandledException}} { + {{#jdk8-default-interface}}default {{/jdk8-default-interface}}{{#responseWrapper}}{{.}}<{{/responseWrapper}}ResponseEntity<{{>returnTypes}}>{{#responseWrapper}}>{{/responseWrapper}} {{#delegate-method}}_{{/delegate-method}}{{operationId}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{>cookieParams}}{{^-last}},{{/-last}}{{#-last}}{{#reactive}}, {{/reactive}}{{/-last}}{{/allParams}}{{#reactive}}final ServerWebExchange exchange{{/reactive}}{{#vendorExtensions.x-spring-paginated}}, final Pageable pageable{{/vendorExtensions.x-spring-paginated}}){{^jdk8-default-interface}};{{/jdk8-default-interface}}{{#jdk8-default-interface}}{{#unhandledException}} throws Exception{{/unhandledException}} { {{#delegate-method}} return {{operationId}}({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}}{{#reactive}}{{#hasParams}}, {{/hasParams}}exchange{{/reactive}}{{#vendorExtensions.x-spring-paginated}}, pageable{{/vendorExtensions.x-spring-paginated}}); } // Override this method - {{#jdk8-default-interface}}default {{/jdk8-default-interface}} {{#responseWrapper}}{{.}}<{{/responseWrapper}}ResponseEntity<{{>returnTypes}}>{{#responseWrapper}}>{{/responseWrapper}} {{operationId}}({{#allParams}}{{^isFile}}{{^isBodyParam}}{{>optionalDataType}}{{/isBodyParam}}{{#isBodyParam}}{{^reactive}}{{{dataType}}}{{/reactive}}{{#reactive}}{{^isArray}}Mono<{{{dataType}}}>{{/isArray}}{{#isArray}}Flux<{{{baseType}}}>{{/isArray}}{{/reactive}}{{/isBodyParam}}{{/isFile}}{{#isFile}}{{#reactive}}Flux{{/reactive}}{{^reactive}}MultipartFile{{/reactive}}{{/isFile}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}{{#reactive}}{{#hasParams}}, {{/hasParams}}@ApiIgnore final ServerWebExchange exchange{{/reactive}}{{#vendorExtensions.x-spring-paginated}}, @ApiIgnore final Pageable pageable{{/vendorExtensions.x-spring-paginated}}){{#unhandledException}} throws Exception{{/unhandledException}} { + {{#jdk8-default-interface}}default {{/jdk8-default-interface}} {{#responseWrapper}}{{.}}<{{/responseWrapper}}ResponseEntity<{{>returnTypes}}>{{#responseWrapper}}>{{/responseWrapper}} {{operationId}}({{#allParams}}{{^isFile}}{{^isBodyParam}}{{>optionalDataType}}{{/isBodyParam}}{{#isBodyParam}}{{^reactive}}{{{dataType}}}{{/reactive}}{{#reactive}}{{^isArray}}Mono<{{{dataType}}}>{{/isArray}}{{#isArray}}Flux<{{{baseType}}}>{{/isArray}}{{/reactive}}{{/isBodyParam}}{{/isFile}}{{#isFile}}{{#reactive}}Flux{{/reactive}}{{^reactive}}MultipartFile{{/reactive}}{{/isFile}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}{{#reactive}}{{#hasParams}}, {{/hasParams}} final ServerWebExchange exchange{{/reactive}}{{#vendorExtensions.x-spring-paginated}}, final Pageable pageable{{/vendorExtensions.x-spring-paginated}}){{#unhandledException}} throws Exception{{/unhandledException}} { {{/delegate-method}} {{^isDelegate}} {{>methodBody}} From 69fe2bb1ae45704e9df2021664880cbeeaae9105 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sun, 25 Jun 2023 14:38:28 +0200 Subject: [PATCH 108/170] Remove redundant constructors (#14248) --- .../main/java/com/baeldung/boot/csfle/data/Citizen.java | 7 ------- .../com/baeldung/boot/csfle/data/EncryptedCitizen.java | 7 ------- .../com/baeldung/boot/csfle/service/CitizenService.java | 6 ++++-- 3 files changed, 4 insertions(+), 16 deletions(-) diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/Citizen.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/Citizen.java index fb38ae4018..2be2c13463 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/Citizen.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/Citizen.java @@ -9,13 +9,6 @@ public class Citizen { private String email; private Integer birthYear; - public Citizen() { - } - - public Citizen(String name) { - this.name = name; - } - public String getName() { return name; } diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/EncryptedCitizen.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/EncryptedCitizen.java index b8d7f413ce..64ded0fcc2 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/EncryptedCitizen.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/EncryptedCitizen.java @@ -10,13 +10,6 @@ public class EncryptedCitizen { private Binary email; private Binary birthYear; - public EncryptedCitizen() { - } - - public EncryptedCitizen(String name) { - this.name = name; - } - public String getName() { return name; } diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java index 573bd77b48..f7767c48de 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java @@ -42,7 +42,8 @@ public class CitizenService { if (encryptionConfig.isAutoEncryption()) { return mongo.save(citizen); } else { - EncryptedCitizen encryptedCitizen = new EncryptedCitizen(citizen.getName()); + EncryptedCitizen encryptedCitizen = new EncryptedCitizen(); + encryptedCitizen.setName(citizen.getName()); if (citizen.getEmail() != null) { encryptedCitizen.setEmail(encrypt(citizen.getEmail(), DETERMINISTIC_ALGORITHM)); } else { @@ -123,7 +124,8 @@ public class CitizenService { private Citizen decrypt(EncryptedCitizen encrypted) { Objects.requireNonNull(encrypted); - Citizen citizen = new Citizen(encrypted.getName()); + Citizen citizen = new Citizen(); + citizen.setName(encrypted.getName()); BsonValue decryptedBirthYear = encrypted.getBirthYear() != null ? decryptProperty(encrypted.getBirthYear()) : null; if (decryptedBirthYear != null) { From dad0e8cf5e31b84a8e26a1081aa03742a6584502 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Sun, 25 Jun 2023 18:19:11 +0530 Subject: [PATCH 109/170] Java-20326: Changes made for replacing strSubstitutor with stringSubstitutor (#14301) --- .../core-java-string-operations-4/pom.xml | 6 ++++++ .../namedformatting/NamedFormatterUnitTest.java | 10 +++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/core-java-modules/core-java-string-operations-4/pom.xml b/core-java-modules/core-java-string-operations-4/pom.xml index cc755cf470..5cd1bd3c56 100644 --- a/core-java-modules/core-java-string-operations-4/pom.xml +++ b/core-java-modules/core-java-string-operations-4/pom.xml @@ -29,6 +29,11 @@ commons-lang3 ${apache-commons-lang3.version} + + org.apache.commons + commons-text + ${apache-commons-text.version} + org.assertj assertj-core @@ -56,6 +61,7 @@ 4.1 5.3.13 3.12.0 + 1.10.0 \ No newline at end of file diff --git a/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/namedformatting/NamedFormatterUnitTest.java b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/namedformatting/NamedFormatterUnitTest.java index 843aaac0b5..a278041b8b 100644 --- a/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/namedformatting/NamedFormatterUnitTest.java +++ b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/namedformatting/NamedFormatterUnitTest.java @@ -1,6 +1,6 @@ package com.baeldung.namedformatting; -import org.apache.commons.text.StrSubstitutor; +import org.apache.commons.text.StringSubstitutor; import org.junit.jupiter.api.Test; import java.util.HashMap; @@ -12,20 +12,20 @@ class NamedFormatterUnitTest { private static final String TEMPLATE = "Text: [${text}] Number: [${number}] Text again: [${text}]"; @Test - void givenTemplateWithNamedParam_whenCallingCommonsTextStrSubstitutor_shouldGetExpectedResult() { + void givenTemplateWithNamedParam_whenCallingCommonsTextStringSubstitutor_shouldGetExpectedResult() { Map params = new HashMap<>(); params.put("text", "It's awesome!"); params.put("number", 42); - String result = StrSubstitutor.replace(TEMPLATE, params, "${", "}"); + String result = StringSubstitutor.replace(TEMPLATE, params, "${", "}"); assertThat(result).isEqualTo("Text: [It's awesome!] Number: [42] Text again: [It's awesome!]"); } @Test - void givenTemplateWithNamedParam_whenCallingCommonsTextStrSubstitutorWithParameterNames_shouldNotWorkAsExpected() { + void givenTemplateWithNamedParam_whenCallingCommonsTextStringSubstitutorWithParameterNames_shouldNotWorkAsExpected() { Map params = new HashMap<>(); params.put("text", "'${number}' is a placeholder."); params.put("number", 42); - String result = StrSubstitutor.replace(TEMPLATE, params, "${", "}"); + String result = StringSubstitutor.replace(TEMPLATE, params, "${", "}"); assertThat(result).isNotEqualTo("Text: ['${number}' is a placeholder.] Number: [42] Text again: ['${number}' is a placeholder.]"); From c95dcbb07749b99ed448a5b4f4a182069631ab5f Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Sun, 25 Jun 2023 18:28:58 +0300 Subject: [PATCH 110/170] add live test --- .../spring-data-yugabytedb/pom.xml | 96 +++++++++---------- .../src/main/java/com/baeldung/Main.java | 34 +++---- .../src/main/java/com/baeldung/User.java | 45 ++++----- .../src/main/resources/docker-compose.yml | 13 +++ .../java/com/baeldung/YugabyteDBLiveTest.java | 37 +++++++ 5 files changed, 136 insertions(+), 89 deletions(-) create mode 100644 persistence-modules/spring-data-yugabytedb/src/main/resources/docker-compose.yml create mode 100644 persistence-modules/spring-data-yugabytedb/src/test/java/com/baeldung/YugabyteDBLiveTest.java diff --git a/persistence-modules/spring-data-yugabytedb/pom.xml b/persistence-modules/spring-data-yugabytedb/pom.xml index c1095a20ca..fb4e4c160d 100644 --- a/persistence-modules/spring-data-yugabytedb/pom.xml +++ b/persistence-modules/spring-data-yugabytedb/pom.xml @@ -1,55 +1,55 @@ - 4.0.0 - spring-data-yugabytedb - 1.0 - spring-data-yugabytedb - jar + 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-yugabytedb + 1.0 + spring-data-yugabytedb + jar - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../../parent-boot-2 - + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + - - - org.springframework.boot - spring-boot-starter-web - - - org.projectlombok - lombok - - - org.springframework - spring-test - - - org.springframework.boot - spring-boot-starter-test - test - - - org.postgresql - postgresql - - - org.springframework.boot - spring-boot-starter-data-jpa - - + + + org.springframework.boot + spring-boot-starter-web + + + org.projectlombok + lombok + + + org.springframework + spring-test + + + org.springframework.boot + spring-boot-starter-test + test + + + org.postgresql + postgresql + + + org.springframework.boot + spring-boot-starter-data-jpa + + - - - - org.apache.maven.plugins - maven-surefire-plugin - - - + + + + org.apache.maven.plugins + maven-surefire-plugin + + + diff --git a/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/Main.java b/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/Main.java index 27b087790a..8638528f6a 100644 --- a/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/Main.java +++ b/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/Main.java @@ -8,25 +8,25 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Main implements CommandLineRunner { - @Autowired - private UserRepository userRepository; + @Autowired + private UserRepository userRepository; - public static void main(String[] args) { - SpringApplication.run(Main.class, args); - } + public static void main(String[] args) { + SpringApplication.run(Main.class, args); + } - @Override - public void run(String... args) throws InterruptedException { + @Override + public void run(String... args) throws InterruptedException { - int iterationCount = 1_000; - int elementsPerIteration = 100; + int iterationCount = 1_000; + int elementsPerIteration = 100; - for (int i = 0; i < iterationCount; i++) { - for (long j = 0; j < elementsPerIteration; j++) { - User user = new User(); - userRepository.save(user); - } - Thread.sleep(1000); - } - } + for (int i = 0; i < iterationCount; i++) { + for (long j = 0; j < elementsPerIteration; j++) { + User user = new User(); + userRepository.save(user); + } + Thread.sleep(1000); + } + } } 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 278bc6c9ae..54bbf2617c 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 @@ -11,34 +11,31 @@ import javax.persistence.Table; @Table(name = "users") public class User { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; - @Column - private String name; + @Column + private String name; - Long getId() { - return id; - } + public Long getId() { + return id; + } - void setId(Long id) { - this.id = id; - } + public void setId(Long id) { + this.id = id; + } - String getName() { - return name; - } + public String getName() { + return name; + } - void setName(String name) { - this.name = name; - } + public void setName(String name) { + this.name = name; + } - @Override - public String toString() { - return "User{" + - "id=" + id + - ", name='" + name + '\'' + - '}'; - } + @Override + public String toString() { + return "User{" + "id=" + id + ", name='" + name + '\'' + '}'; + } } diff --git a/persistence-modules/spring-data-yugabytedb/src/main/resources/docker-compose.yml b/persistence-modules/spring-data-yugabytedb/src/main/resources/docker-compose.yml new file mode 100644 index 0000000000..6d95320525 --- /dev/null +++ b/persistence-modules/spring-data-yugabytedb/src/main/resources/docker-compose.yml @@ -0,0 +1,13 @@ +version: '3' + +services: + yugabytedb: + image: yugabytedb/yugabyte:latest + container_name: yugabyte + user: root + ports: + - '5433:5433' + - '7000:7000' + - '9000:9000' + command: ["bin/yugabyted", "start", "--daemon=false"] + diff --git a/persistence-modules/spring-data-yugabytedb/src/test/java/com/baeldung/YugabyteDBLiveTest.java b/persistence-modules/spring-data-yugabytedb/src/test/java/com/baeldung/YugabyteDBLiveTest.java new file mode 100644 index 0000000000..8a9de9bab4 --- /dev/null +++ b/persistence-modules/spring-data-yugabytedb/src/test/java/com/baeldung/YugabyteDBLiveTest.java @@ -0,0 +1,37 @@ +package com.baeldung; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; + +/* + To run this test we need to run the databases first. + A dedicated docker-compose.yml file is located under the resources directory. + We can run it by simple executing `docker-compose up`. + */ +@SpringJUnitConfig +@SpringBootTest +@TestPropertySource("classpath:application.properties") +public class YugabyteDBLiveTest { + + @Autowired + private UserRepository userRepository; + + @Test + void givenTwoUsers_whenPersistUsingJPARepository_thenUserAreSaved() { + User user1 = new User(); + user1.setName("Alex"); + User user2 = new User(); + user2.setName("John"); + userRepository.save(user1); + userRepository.save(user2); + List allUsers = userRepository.findAll(); + assertEquals(2, allUsers.size()); + } +} From 5abc2c6d2c559da89e47646892518885ec590cb4 Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Sun, 25 Jun 2023 19:42:54 -0600 Subject: [PATCH 111/170] Add unit tests (#14306) --- .../InstantAndLocalDateTimeUnitTest.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/instantvslocaldatetime/InstantAndLocalDateTimeUnitTest.java diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/instantvslocaldatetime/InstantAndLocalDateTimeUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/instantvslocaldatetime/InstantAndLocalDateTimeUnitTest.java new file mode 100644 index 0000000000..74be3efe84 --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/instantvslocaldatetime/InstantAndLocalDateTimeUnitTest.java @@ -0,0 +1,41 @@ +package com.baeldung.instantvslocaldatetime; + +import org.junit.Test; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class InstantAndLocalDateTimeUnitTest { + + @Test + public void givenTwoInstants_whenComparing_thenDifferent() { + + // Instant arithmetic + Instant.now().plus(12, ChronoUnit.HOURS); + Instant oneWeekAgo = Instant.now().minus(7, ChronoUnit.DAYS); + + // Comparing 2 Instants + Instant instant1 = Instant.now(); + Instant instant2 = instant1.plus(1, ChronoUnit.SECONDS); + assertTrue(instant1.isBefore(instant2)); + assertFalse(instant1.isAfter(instant2)); + } + + @Test + public void givenTwoLocalDateTimes_whenComparing_thenDifferent() { + + // LocalDateTime arithmetic + LocalDateTime tomorrow = LocalDateTime.now().plus(1, ChronoUnit.DAYS); + LocalDateTime oneYearAgo = LocalDateTime.now().minus(1, ChronoUnit.YEARS); + + // Comparing 2 LocalDateTimes + LocalDateTime now = LocalDateTime.now(); + LocalDateTime y2k = LocalDateTime.of(2000, 1, 1, 0, 0); + assertTrue(now.isAfter(y2k)); + assertTrue(y2k.isBefore(now)); + } +} From 68add3d3019f9837d0c5b066fec080766ff68fc1 Mon Sep 17 00:00:00 2001 From: "tudor.marc" Date: Mon, 26 Jun 2023 11:47:01 +0300 Subject: [PATCH 112/170] BAEL-6310 - review updates --- .../main/java/com/baeldung/jacksonjr/MyHandlerProvider.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jackson-jr/src/main/java/com/baeldung/jacksonjr/MyHandlerProvider.java b/jackson-jr/src/main/java/com/baeldung/jacksonjr/MyHandlerProvider.java index 0b76187592..266a09eecc 100644 --- a/jackson-jr/src/main/java/com/baeldung/jacksonjr/MyHandlerProvider.java +++ b/jackson-jr/src/main/java/com/baeldung/jacksonjr/MyHandlerProvider.java @@ -10,8 +10,8 @@ import java.time.LocalDate; public class MyHandlerProvider extends ReaderWriterProvider { - public ValueWriter findValueWriter (JSONWriter writeContext, - Class type) { + @Override + public ValueWriter findValueWriter (JSONWriter writeContext, Class type) { if (type == LocalDate.class) { return new CustomDateSerializer(); } From 9e144b09945e48f3c1b85ba4396b85f8ffecad02 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Mon, 26 Jun 2023 16:42:55 +0530 Subject: [PATCH 113/170] Java-15020: Changes made for running failed cases (#14288) --- .../httpclient/HttpAsyncClientLiveTest.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) 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 123c51bb86..d421de1c7a 100644 --- a/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java +++ b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java @@ -9,16 +9,12 @@ import java.util.concurrent.Future; import javax.net.ssl.SSLContext; -import org.apache.hc.client5.http.impl.routing.DefaultProxyRoutePlanner; -import org.junit.jupiter.api.Test; - import org.apache.hc.client5.http.async.methods.SimpleHttpRequest; import org.apache.hc.client5.http.async.methods.SimpleHttpResponse; import org.apache.hc.client5.http.async.methods.SimpleRequestBuilder; import org.apache.hc.client5.http.auth.AuthScope; import org.apache.hc.client5.http.auth.UsernamePasswordCredentials; import org.apache.hc.client5.http.classic.methods.HttpGet; -import org.apache.hc.client5.http.config.RequestConfig; import org.apache.hc.client5.http.cookie.BasicCookieStore; import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient; import org.apache.hc.client5.http.impl.async.HttpAsyncClients; @@ -26,9 +22,9 @@ import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider; import org.apache.hc.client5.http.impl.cookie.BasicClientCookie; import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManager; import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder; +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.core5.concurrent.FutureCallback; import org.apache.hc.core5.http.HttpHost; import org.apache.hc.core5.http.HttpResponse; import org.apache.hc.core5.http.nio.ssl.TlsStrategy; @@ -37,6 +33,8 @@ 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; class HttpAsyncClientLiveTest extends GetRequestMockServer { @@ -56,12 +54,10 @@ class HttpAsyncClientLiveTest extends GetRequestMockServer { @Test void whenUseHttpAsyncClient_thenCorrect() throws InterruptedException, ExecutionException, IOException { - final HttpHost target = new HttpHost(HOST_WITH_COOKIE); - final SimpleHttpRequest request = SimpleRequestBuilder.get() - .setHttpHost(target) + final SimpleHttpRequest request = SimpleRequestBuilder.get(HOST_WITH_COOKIE) + .build(); + final CloseableHttpAsyncClient client = HttpAsyncClients.custom() .build(); - - final CloseableHttpAsyncClient client = HttpAsyncClients.custom().build(); client.start(); @@ -126,6 +122,7 @@ class HttpAsyncClientLiveTest extends GetRequestMockServer { .build(); final TlsStrategy tlsStrategy = ClientTlsStrategyBuilder.create() + .setHostnameVerifier(SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER) .setSslContext(sslContext) .build(); From e2976f0686709292e267f8bb7b2b3acd2e5655cf Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Mon, 26 Jun 2023 14:39:00 +0300 Subject: [PATCH 114/170] Java 15033 Added apache httpclient v4 test case demonstrating close/release resources (#14295) --- .../HttpClientCookBookV4LiveTest.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpClientCookBookV4LiveTest.java b/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpClientCookBookV4LiveTest.java index e82120a105..8b83419ba1 100644 --- a/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpClientCookBookV4LiveTest.java +++ b/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpClientCookBookV4LiveTest.java @@ -1,6 +1,5 @@ package com.baeldung.httpclient; - import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -33,6 +32,7 @@ import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; @@ -163,4 +163,22 @@ class HttpClientCookBookV4LiveTest { response.close(); } } + + @Test + void givenAutoClosableClient_thenCorrect() throws IOException { + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + HttpGet httpGet = new HttpGet(SAMPLE_GET_URL); + try (CloseableHttpResponse response = httpClient.execute(httpGet)) { + // handle response; + HttpEntity entity = response.getEntity(); + if (entity != null) { + try (InputStream instream = entity.getContent()) { + // Process the input stream if needed + } + } + assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + } + } + } + } From 8e6bdc02059747929b1ffceaa2e1b93a5c815c36 Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Mon, 26 Jun 2023 14:05:24 +0200 Subject: [PATCH 115/170] BAEL-6597: How to get the last Day of the Month in Java (#14191) --- .../baeldung/lastdaymonth/LastDayOfMonth.java | 32 +++++++++++++++ .../lastdaymonth/LastDayOfMonthUnitTest.java | 40 +++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 core-java-modules/core-java-date-operations-3/src/main/java/com/baeldung/lastdaymonth/LastDayOfMonth.java create mode 100644 core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/lastdaymonth/LastDayOfMonthUnitTest.java diff --git a/core-java-modules/core-java-date-operations-3/src/main/java/com/baeldung/lastdaymonth/LastDayOfMonth.java b/core-java-modules/core-java-date-operations-3/src/main/java/com/baeldung/lastdaymonth/LastDayOfMonth.java new file mode 100644 index 0000000000..0dc8304309 --- /dev/null +++ b/core-java-modules/core-java-date-operations-3/src/main/java/com/baeldung/lastdaymonth/LastDayOfMonth.java @@ -0,0 +1,32 @@ +package com.baeldung.lastdaymonth; + +import java.time.LocalDate; +import java.time.YearMonth; +import java.time.temporal.TemporalAdjusters; +import java.util.Calendar; + +public class LastDayOfMonth { + + static int getLastDayOfMonthUsingCalendar(int month) { + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.MONTH, month); + return cal.getActualMaximum(Calendar.DAY_OF_MONTH); + } + + static int getLastDayOfMonthUsingTemporalAdjusters(LocalDate date) { + return date.with(TemporalAdjusters.lastDayOfMonth()) + .getDayOfMonth(); + } + + static int getLastDayOfMonthUsingYearMonth(YearMonth date) { + return date.atEndOfMonth() + .getDayOfMonth(); + } + + static int getLastDayOfMonthUsingJodaTime(org.joda.time.LocalDate date) { + return date.dayOfMonth() + .withMaximumValue() + .getDayOfMonth(); + } + +} diff --git a/core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/lastdaymonth/LastDayOfMonthUnitTest.java b/core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/lastdaymonth/LastDayOfMonthUnitTest.java new file mode 100644 index 0000000000..ea9a02c484 --- /dev/null +++ b/core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/lastdaymonth/LastDayOfMonthUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.lastdaymonth; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.time.LocalDate; +import java.time.YearMonth; + +import org.junit.jupiter.api.Test; + +class LastDayOfMonthUnitTest { + + @Test + void givenMonth_whenUsingCalendar_thenReturnLastDay() { + assertEquals(31, LastDayOfMonth.getLastDayOfMonthUsingCalendar(0)); + assertEquals(30, LastDayOfMonth.getLastDayOfMonthUsingCalendar(3)); + assertEquals(31, LastDayOfMonth.getLastDayOfMonthUsingCalendar(9)); + } + + @Test + void givenMonth_whenUsingTemporalAdjusters_thenReturnLastDay() { + assertEquals(31, LastDayOfMonth.getLastDayOfMonthUsingTemporalAdjusters(LocalDate.of(2023, 1, 1))); + assertEquals(30, LastDayOfMonth.getLastDayOfMonthUsingTemporalAdjusters(LocalDate.of(2023, 4, 1))); + assertEquals(31, LastDayOfMonth.getLastDayOfMonthUsingTemporalAdjusters(LocalDate.of(2023, 10, 1))); + } + + @Test + void givenMonth_whenUsingYearMonth_thenReturnLastDay() { + assertEquals(31, LastDayOfMonth.getLastDayOfMonthUsingYearMonth(YearMonth.of(2023, 1))); + assertEquals(30, LastDayOfMonth.getLastDayOfMonthUsingYearMonth(YearMonth.of(2023, 4))); + assertEquals(31, LastDayOfMonth.getLastDayOfMonthUsingYearMonth(YearMonth.of(2023, 10))); + } + + @Test + void givenMonth_whenUsingJodaTime_thenReturnLastDay() { + assertEquals(31, LastDayOfMonth.getLastDayOfMonthUsingJodaTime(org.joda.time.LocalDate.parse("2023-1-1"))); + assertEquals(30, LastDayOfMonth.getLastDayOfMonthUsingJodaTime(org.joda.time.LocalDate.parse("2023-4-1"))); + assertEquals(31, LastDayOfMonth.getLastDayOfMonthUsingJodaTime(org.joda.time.LocalDate.parse("2023-10-1"))); + } + +} From 5e3bf803f4df8e62017b8ac159f94bf06528fa58 Mon Sep 17 00:00:00 2001 From: Mo Helmy <135069400+BenHelmyBen@users.noreply.github.com> Date: Tue, 27 Jun 2023 03:26:45 +0300 Subject: [PATCH 116/170] Removing JSON elements with Jackson [BAEL-6511] (#14291) * Removing JSON elements with Jackson [BAEL-6511] This commit adds a test class for removing JSON elements using the Jackson library. * Removing JSON elements with Jackson [BAEL-6511] This PR adds a test class for removing JSON elements using the Jackson library. --- .../jsonnode/RemoveJsonElementsUnitTest.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 jackson-modules/jackson-core/src/test/java/com/baeldung/jackson/jsonnode/RemoveJsonElementsUnitTest.java diff --git a/jackson-modules/jackson-core/src/test/java/com/baeldung/jackson/jsonnode/RemoveJsonElementsUnitTest.java b/jackson-modules/jackson-core/src/test/java/com/baeldung/jackson/jsonnode/RemoveJsonElementsUnitTest.java new file mode 100644 index 0000000000..73c0a1f925 --- /dev/null +++ b/jackson-modules/jackson-core/src/test/java/com/baeldung/jackson/jsonnode/RemoveJsonElementsUnitTest.java @@ -0,0 +1,48 @@ +package com.baeldung.jackson.jsonnode; + +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.jupiter.api.Assertions; +import java.util.Iterator; +import org.junit.Test; + +public class RemoveJsonElementsUnitTest { + @Test + public void given_JsonData_whenUsingJackson_thenRemoveElementByKey() throws JsonProcessingException { + String json = "{\"name\": \"John\", \"age\": 30, \"city\": \"New York\"}"; + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode jsonNode = objectMapper.readTree(json); + ObjectNode object = (ObjectNode) jsonNode; + object.remove("age"); + String updatedJson = objectMapper.writeValueAsString(object); + Assertions.assertEquals("{\"name\":\"John\",\"city\":\"New York\"}", updatedJson); + } + @Test + public void given_JsonData_whenUsingJackson_thenRemoveElementsByCondition() throws JsonProcessingException { + String json = "{\"name\": \"John\", \"age\": 30, \"city\": \"New York\"}"; + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode jsonNode = objectMapper.readTree(json); + Iterator elements = jsonNode.elements(); + while (elements.hasNext()) { + JsonNode element = elements.next(); + if (element.isNumber() && element.asInt() == 30) { + elements.remove(); + } + } + String updatedJson = objectMapper.writeValueAsString(jsonNode); + Assertions.assertEquals("{\"name\":\"John\",\"city\":\"New York\"}", updatedJson); + } + + @Test + public void given_JsonData_whenUsingJackson_thenRemoveElementFromNestedStructure() throws JsonProcessingException { + String json = "{\"name\": \"John\", \"details\": {\"age\": 30, \"city\": \"New York\"}}"; + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode jsonNode = objectMapper.readTree(json); + JsonNode detailsNode = jsonNode.path("details"); + ((ObjectNode) detailsNode).remove("age"); + String updatedJson = objectMapper.writeValueAsString(jsonNode); + Assertions.assertEquals("{\"name\":\"John\",\"details\":{\"city\":\"New York\"}}", updatedJson); + } +} From 9b0b36b308726eeb2df9689c73082290d5f56860 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 27 Jun 2023 11:35:06 +0300 Subject: [PATCH 117/170] [JAVA-22213] Upgraded mantis-runtime version (#14246) * [JAVA-22213] Added Spectator library --- netflix-modules/mantis/pom.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/netflix-modules/mantis/pom.xml b/netflix-modules/mantis/pom.xml index 50d9e61d9e..351f079481 100644 --- a/netflix-modules/mantis/pom.xml +++ b/netflix-modules/mantis/pom.xml @@ -54,6 +54,11 @@ reactor-netty test + + com.netflix.spectator + spectator-api + ${spectator-api.version} + @@ -64,8 +69,9 @@ - 1.2.63 + 2.0.42 0.4.2 + 1.6.5 \ No newline at end of file From e3058691b281c51ffd2df5668731714930d71cc5 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Tue, 27 Jun 2023 12:51:25 +0200 Subject: [PATCH 118/170] JAVA-22499 | Upgraded spring-boot and removed hybernate-validator to use 3.0.0.Final version of the spring-boot 3 (#14315) --- javaxval-2/pom.xml | 26 +------------------ .../hibernate/validator/ap/Message.java | 8 +++--- .../javaxval/messageinterpolator/Person.java | 6 ++--- .../ConsistentDateParameterValidator.java | 8 +++--- .../constraints/ConsistentDateParameters.java | 4 +-- .../constraints/ValidReservation.java | 4 +-- .../ValidReservationValidator.java | 4 +-- .../methodvalidation/model/Customer.java | 4 +-- .../methodvalidation/model/Reservation.java | 4 +-- .../model/ReservationManagement.java | 10 +++---- .../notnull/NotNullMethodParameter.java | 8 +++--- .../javaxval/notnull/ValidatingComponent.java | 2 +- ...terMessageInterpolaterIntegrationTest.java | 8 +++--- .../ContainerValidationIntegrationTest.java | 2 +- .../ValidationIntegrationTest.java | 8 +++--- .../ValidatingComponentIntegrationTest.java | 6 ++--- 16 files changed, 45 insertions(+), 67 deletions(-) diff --git a/javaxval-2/pom.xml b/javaxval-2/pom.xml index 5c311e10f8..7d84b4ce9b 100644 --- a/javaxval-2/pom.xml +++ b/javaxval-2/pom.xml @@ -14,26 +14,6 @@ - - org.hibernate.validator - hibernate-validator - ${hibernate-validator.version} - - - org.glassfish - javax.el - ${javax.el.version} - - - org.springframework - spring-context - ${org.springframework.version} - - - org.springframework - spring-test - ${org.springframework.version} - org.springframework.boot spring-boot-starter-validation @@ -58,11 +38,7 @@ - 6.2.3.Final - 6.2.0.Final - 3.0.0 - 5.3.21 - 2.7.1 + 3.0.4 \ No newline at end of file diff --git a/javaxval-2/src/main/java/com/baeldung/javaxval/hibernate/validator/ap/Message.java b/javaxval-2/src/main/java/com/baeldung/javaxval/hibernate/validator/ap/Message.java index 2d9b1141ec..c6cd443cf2 100644 --- a/javaxval-2/src/main/java/com/baeldung/javaxval/hibernate/validator/ap/Message.java +++ b/javaxval-2/src/main/java/com/baeldung/javaxval/hibernate/validator/ap/Message.java @@ -1,11 +1,13 @@ package com.baeldung.javaxval.hibernate.validator.ap; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Past; + import java.util.List; import java.util.Optional; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Past; + public class Message { diff --git a/javaxval-2/src/main/java/com/baeldung/javaxval/messageinterpolator/Person.java b/javaxval-2/src/main/java/com/baeldung/javaxval/messageinterpolator/Person.java index 387af48c20..df5b959bfe 100644 --- a/javaxval-2/src/main/java/com/baeldung/javaxval/messageinterpolator/Person.java +++ b/javaxval-2/src/main/java/com/baeldung/javaxval/messageinterpolator/Person.java @@ -1,8 +1,8 @@ package com.baeldung.javaxval.messageinterpolator; -import javax.validation.constraints.Email; -import javax.validation.constraints.Min; -import javax.validation.constraints.Size; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.Size; public class Person { diff --git a/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameterValidator.java b/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameterValidator.java index 6b48046b5c..38da3b46f6 100644 --- a/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameterValidator.java +++ b/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameterValidator.java @@ -2,10 +2,10 @@ package com.baeldung.javaxval.methodvalidation.constraints; import java.time.LocalDate; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; -import javax.validation.constraintvalidation.SupportedValidationTarget; -import javax.validation.constraintvalidation.ValidationTarget; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; +import jakarta.validation.constraintvalidation.SupportedValidationTarget; +import jakarta.validation.constraintvalidation.ValidationTarget; @SupportedValidationTarget(ValidationTarget.PARAMETERS) public class ConsistentDateParameterValidator implements ConstraintValidator { diff --git a/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameters.java b/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameters.java index 83f551d45f..23c9cc67e6 100644 --- a/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameters.java +++ b/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameters.java @@ -8,8 +8,8 @@ import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; @Constraint(validatedBy = ConsistentDateParameterValidator.class) @Target({ METHOD, CONSTRUCTOR }) diff --git a/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/constraints/ValidReservation.java b/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/constraints/ValidReservation.java index c28cc79004..0a4000e32f 100644 --- a/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/constraints/ValidReservation.java +++ b/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/constraints/ValidReservation.java @@ -8,8 +8,8 @@ import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; @Constraint(validatedBy = ValidReservationValidator.class) @Target({ METHOD, CONSTRUCTOR }) diff --git a/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java b/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java index 541fc15e9c..699c8309cc 100644 --- a/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java +++ b/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java @@ -2,8 +2,8 @@ package com.baeldung.javaxval.methodvalidation.constraints; import java.time.LocalDate; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import com.baeldung.javaxval.methodvalidation.model.Reservation; diff --git a/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/model/Customer.java b/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/model/Customer.java index e0b7fcf917..ba1c1cd341 100644 --- a/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/model/Customer.java +++ b/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/model/Customer.java @@ -1,7 +1,7 @@ package com.baeldung.javaxval.methodvalidation.model; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import org.springframework.validation.annotation.Validated; diff --git a/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/model/Reservation.java b/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/model/Reservation.java index a6d5ab42b1..7b41cfba33 100644 --- a/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/model/Reservation.java +++ b/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/model/Reservation.java @@ -2,8 +2,8 @@ package com.baeldung.javaxval.methodvalidation.model; import java.time.LocalDate; -import javax.validation.Valid; -import javax.validation.constraints.Positive; +import jakarta.validation.Valid; +import jakarta.validation.constraints.Positive; import org.springframework.validation.annotation.Validated; diff --git a/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/model/ReservationManagement.java b/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/model/ReservationManagement.java index ec71502119..2170c633cf 100644 --- a/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/model/ReservationManagement.java +++ b/javaxval-2/src/main/java/com/baeldung/javaxval/methodvalidation/model/ReservationManagement.java @@ -3,11 +3,11 @@ package com.baeldung.javaxval.methodvalidation.model; import java.time.LocalDate; import java.util.List; -import javax.validation.Valid; -import javax.validation.constraints.Future; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; +import jakarta.validation.Valid; +import jakarta.validation.constraints.Future; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; diff --git a/javaxval-2/src/main/java/com/baeldung/javaxval/notnull/NotNullMethodParameter.java b/javaxval-2/src/main/java/com/baeldung/javaxval/notnull/NotNullMethodParameter.java index 47f0ee69fe..8b950b81ab 100644 --- a/javaxval-2/src/main/java/com/baeldung/javaxval/notnull/NotNullMethodParameter.java +++ b/javaxval-2/src/main/java/com/baeldung/javaxval/notnull/NotNullMethodParameter.java @@ -1,9 +1,9 @@ package com.baeldung.javaxval.notnull; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; -import javax.validation.constraints.NotNull; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; +import jakarta.validation.constraints.NotNull; public class NotNullMethodParameter { diff --git a/javaxval-2/src/main/java/com/baeldung/javaxval/notnull/ValidatingComponent.java b/javaxval-2/src/main/java/com/baeldung/javaxval/notnull/ValidatingComponent.java index dc6db0b7b7..eedfeda962 100644 --- a/javaxval-2/src/main/java/com/baeldung/javaxval/notnull/ValidatingComponent.java +++ b/javaxval-2/src/main/java/com/baeldung/javaxval/notnull/ValidatingComponent.java @@ -1,6 +1,6 @@ package com.baeldung.javaxval.notnull; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; import org.springframework.stereotype.Component; import org.springframework.validation.annotation.Validated; diff --git a/javaxval-2/src/test/java/com/baeldung/javaxval/messageinterpolator/ParameterMessageInterpolaterIntegrationTest.java b/javaxval-2/src/test/java/com/baeldung/javaxval/messageinterpolator/ParameterMessageInterpolaterIntegrationTest.java index a60550aca5..99c1a15a04 100644 --- a/javaxval-2/src/test/java/com/baeldung/javaxval/messageinterpolator/ParameterMessageInterpolaterIntegrationTest.java +++ b/javaxval-2/src/test/java/com/baeldung/javaxval/messageinterpolator/ParameterMessageInterpolaterIntegrationTest.java @@ -4,10 +4,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.Set; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator; import org.junit.BeforeClass; diff --git a/javaxval-2/src/test/java/com/baeldung/javaxval/methodvalidation/ContainerValidationIntegrationTest.java b/javaxval-2/src/test/java/com/baeldung/javaxval/methodvalidation/ContainerValidationIntegrationTest.java index 1a66bf3c59..0159d984fb 100644 --- a/javaxval-2/src/test/java/com/baeldung/javaxval/methodvalidation/ContainerValidationIntegrationTest.java +++ b/javaxval-2/src/test/java/com/baeldung/javaxval/methodvalidation/ContainerValidationIntegrationTest.java @@ -3,7 +3,7 @@ package com.baeldung.javaxval.methodvalidation; import java.time.LocalDate; import java.util.List; -import javax.validation.ConstraintViolationException; +import jakarta.validation.ConstraintViolationException; import org.junit.Rule; import org.junit.Test; diff --git a/javaxval-2/src/test/java/com/baeldung/javaxval/methodvalidation/ValidationIntegrationTest.java b/javaxval-2/src/test/java/com/baeldung/javaxval/methodvalidation/ValidationIntegrationTest.java index 5713e0b10b..fcf04ef086 100644 --- a/javaxval-2/src/test/java/com/baeldung/javaxval/methodvalidation/ValidationIntegrationTest.java +++ b/javaxval-2/src/test/java/com/baeldung/javaxval/methodvalidation/ValidationIntegrationTest.java @@ -8,10 +8,10 @@ import java.time.LocalDate; import java.util.Collections; import java.util.Set; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.ValidatorFactory; -import javax.validation.executable.ExecutableValidator; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.ValidatorFactory; +import jakarta.validation.executable.ExecutableValidator; import org.junit.Before; import org.junit.Test; diff --git a/javaxval-2/src/test/java/com/baeldung/javaxval/notnull/ValidatingComponentIntegrationTest.java b/javaxval-2/src/test/java/com/baeldung/javaxval/notnull/ValidatingComponentIntegrationTest.java index e18ab38a61..92f86005bd 100644 --- a/javaxval-2/src/test/java/com/baeldung/javaxval/notnull/ValidatingComponentIntegrationTest.java +++ b/javaxval-2/src/test/java/com/baeldung/javaxval/notnull/ValidatingComponentIntegrationTest.java @@ -6,9 +6,9 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.Set; -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; -import javax.validation.constraints.NotNull; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.constraints.NotNull; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; From 0ec89aee72aec022b5bfd15bd78915e2e1ae06ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kingsley=E2=9C=A8?= <64941442+KingsleyAmankwah@users.noreply.github.com> Date: Tue, 27 Jun 2023 13:08:52 +0000 Subject: [PATCH 119/170] Jaxb vs Jaxp (#14242) --- .../jaxb/jaxpvsjaxb/jaxb/Department.java | 9 +++++++++ .../jaxb/jaxpvsjaxb/jaxb/Employee.java | 8 ++++++++ .../jaxb/jaxpvsjaxb/jaxp/JaxpExample.java | 18 ++++++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 jaxb/src/main/java/com/baeldung/jaxb/jaxpvsjaxb/jaxb/Department.java create mode 100644 jaxb/src/main/java/com/baeldung/jaxb/jaxpvsjaxb/jaxb/Employee.java create mode 100644 jaxb/src/main/java/com/baeldung/jaxb/jaxpvsjaxb/jaxp/JaxpExample.java diff --git a/jaxb/src/main/java/com/baeldung/jaxb/jaxpvsjaxb/jaxb/Department.java b/jaxb/src/main/java/com/baeldung/jaxb/jaxpvsjaxb/jaxb/Department.java new file mode 100644 index 0000000000..e83beda29b --- /dev/null +++ b/jaxb/src/main/java/com/baeldung/jaxb/jaxpvsjaxb/jaxb/Department.java @@ -0,0 +1,9 @@ +package com.baeldung.jaxb.jaxpvsjaxb.jaxb; + +import jakarta.xml.bind.annotation.XmlElement; + + +public class Department { + @XmlElement + private String id; +} diff --git a/jaxb/src/main/java/com/baeldung/jaxb/jaxpvsjaxb/jaxb/Employee.java b/jaxb/src/main/java/com/baeldung/jaxb/jaxpvsjaxb/jaxb/Employee.java new file mode 100644 index 0000000000..a1bb5ff9dd --- /dev/null +++ b/jaxb/src/main/java/com/baeldung/jaxb/jaxpvsjaxb/jaxb/Employee.java @@ -0,0 +1,8 @@ +package com.baeldung.jaxb.jaxpvsjaxb.jaxb; + +import jakarta.xml.bind.annotation.XmlElement; + +public class Employee { + @XmlElement + private String id; +} diff --git a/jaxb/src/main/java/com/baeldung/jaxb/jaxpvsjaxb/jaxp/JaxpExample.java b/jaxb/src/main/java/com/baeldung/jaxb/jaxpvsjaxb/jaxp/JaxpExample.java new file mode 100644 index 0000000000..57bc64d592 --- /dev/null +++ b/jaxb/src/main/java/com/baeldung/jaxb/jaxpvsjaxb/jaxp/JaxpExample.java @@ -0,0 +1,18 @@ +package com.baeldung.jaxb.jaxpvsjaxb.jaxp; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.DocumentBuilder; +import org.w3c.dom.Document; + +public class JaxpExample { + public static void main(String[] args) { + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse("input.xml"); + } catch (Exception e) { + e.printStackTrace(); + } + } +} + From 2f0f9d7e4734d4ba272c29a1943b648e4a710880 Mon Sep 17 00:00:00 2001 From: brokenhardisk Date: Tue, 27 Jun 2023 15:13:29 +0200 Subject: [PATCH 120/170] BAEL-6498 RequiredArgsConstructor Code and Tests (#14281) * BAEL-6498 RequiredArgsConstructor Code and Tests * BAEL-6498 RequiredArgsConstructor Code and Tests --- .../ClassWithFinalMembers.java | 13 +++++++++ .../ClassWithFinalNonNullMembers.java | 26 +++++++++++++++++ .../ClassWithNonFinalMembers.java | 13 +++++++++ .../RequiredArgsConstructorUnitTest.java | 28 +++++++++++++++++++ pom.xml | 2 +- 5 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/requiredargsconstructor/ClassWithFinalMembers.java create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/requiredargsconstructor/ClassWithFinalNonNullMembers.java create mode 100644 lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/requiredargsconstructor/ClassWithNonFinalMembers.java create mode 100644 lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/requiredargsconstructor/RequiredArgsConstructorUnitTest.java diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/requiredargsconstructor/ClassWithFinalMembers.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/requiredargsconstructor/ClassWithFinalMembers.java new file mode 100644 index 0000000000..9537c0a664 --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/requiredargsconstructor/ClassWithFinalMembers.java @@ -0,0 +1,13 @@ +package com.baeldung.lombok.requiredargsconstructor; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class ClassWithFinalMembers { + + private final String stringObject; + + public String getStringObject() { + return stringObject; + } +} diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/requiredargsconstructor/ClassWithFinalNonNullMembers.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/requiredargsconstructor/ClassWithFinalNonNullMembers.java new file mode 100644 index 0000000000..7585afa6c1 --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/requiredargsconstructor/ClassWithFinalNonNullMembers.java @@ -0,0 +1,26 @@ +package com.baeldung.lombok.requiredargsconstructor; + +import lombok.NonNull; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class ClassWithFinalNonNullMembers { + + private final String finalStringObject; + @NonNull + private String nonNullStringObject; + + private String nonFinalStringObject; + + public String getFinalStringObject() { + return finalStringObject; + } + + public String getNonNullStringObject() { + return nonNullStringObject; + } + + public String getNonFinalStringObject() { + return nonFinalStringObject; + } +} diff --git a/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/requiredargsconstructor/ClassWithNonFinalMembers.java b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/requiredargsconstructor/ClassWithNonFinalMembers.java new file mode 100644 index 0000000000..7a125a343a --- /dev/null +++ b/lombok-modules/lombok-2/src/main/java/com/baeldung/lombok/requiredargsconstructor/ClassWithNonFinalMembers.java @@ -0,0 +1,13 @@ +package com.baeldung.lombok.requiredargsconstructor; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class ClassWithNonFinalMembers { + + private String stringObject; + + public String getStringObject() { + return stringObject; + } +} diff --git a/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/requiredargsconstructor/RequiredArgsConstructorUnitTest.java b/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/requiredargsconstructor/RequiredArgsConstructorUnitTest.java new file mode 100644 index 0000000000..a05fe7eb31 --- /dev/null +++ b/lombok-modules/lombok-2/src/test/java/com/baeldung/lombok/requiredargsconstructor/RequiredArgsConstructorUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.lombok.requiredargsconstructor; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class RequiredArgsConstructorUnitTest { + @Test + void whenClassHasFinalMembers_thenGeneratedConstructorHasParameters() { + ClassWithFinalMembers classWithFinalMembers = new ClassWithFinalMembers("dummyString"); + Assertions.assertNotNull(classWithFinalMembers); + Assertions.assertEquals("dummyString", classWithFinalMembers.getStringObject()); + } + + @Test + void whenClassHasNonFinalMembers_thenGeneratedConstructorHasNoParameters() { + ClassWithNonFinalMembers classWithNonFinalMembers = new ClassWithNonFinalMembers(); + Assertions.assertNotNull(classWithNonFinalMembers); + } + + @Test + void whenClassHasFinalAndNonNullMembers_thenGeneratedConstructorHasParameters() { + ClassWithFinalNonNullMembers classWithFinalNonNullMembers = new ClassWithFinalNonNullMembers("finalString", "nonNullString"); + Assertions.assertNotNull(classWithFinalNonNullMembers); + Assertions.assertEquals("finalString", classWithFinalNonNullMembers.getFinalStringObject()); + Assertions.assertEquals("nonNullString", classWithFinalNonNullMembers.getNonNullStringObject()); + Assertions.assertNull(classWithFinalNonNullMembers.getNonFinalStringObject()); + } +} diff --git a/pom.xml b/pom.xml index 6d566549ef..dbf8c942c3 100644 --- a/pom.xml +++ b/pom.xml @@ -1297,7 +1297,7 @@ 3.12.2 3.0.0 3.19.0 - 1.18.24 + 1.18.28 2.1.214 31.1-jre 3.2.2 From 44179d218732fb9ff01bf5eba88bea5253b6ef54 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Wed, 28 Jun 2023 10:13:24 +0530 Subject: [PATCH 121/170] Java 21460 Move code from spring-boot-swagger & spring-boot-swagger-2 to spring-boot-swagger-springfox module (#14310) * JAVA-21460 Upgrade spring-boot-swagger-jwt modules to use SpringDoc in place of SpringFox * JAVA-21460 Upgrade spring-boot-swagger-2 module to use SpringDoc in place of SpringFox * JAVA-21460 Upgrade spring-boot-swagger module to use SpringDoc in place of SpringFox * JAVA-21460 Move code from spring-boot-swagger & spring-boot-swagger-2 to spring-boot-swagger-springfox module * JAVA-21457 Upgrade spring-security-web-rest to use SpringDoc in place of SpringFox --- .../spring-boot-swagger-2/README.md | 1 - .../spring-boot-swagger-2/pom.xml | 10 ----- .../spring-boot-swagger-springfox/README.md | 7 ++++ .../spring-boot-swagger-springfox/pom.xml | 39 +++++++++++++++++++ .../com/baeldung/apiswagger/Application.java | 0 .../config/SwaggerConfiguration.java | 0 .../apiswagger/controller/BookController.java | 0 .../demo/SpringFoxExampleApplication.java | 0 .../demo/config/SpringFoxSwaggerConfig.java | 0 .../demo/controller/SwaggerController.java | 13 +++++++ .../demo/controller/TopicsController.java | 26 +++++++++++++ .../baeldung/springdoc/demo/model/Topic.java | 26 +++++++++++++ .../springdoc/demo/service/TopicService.java | 26 +++++++++++++ .../com/baeldung/swagger2/SwaggerConfig.java | 0 .../SpringBootSwaggerApplication.java | 0 .../configuration/SwaggerConfiguration.java | 0 .../controller/RegularRestController.java | 0 .../SpringBootSwaggerConfApplication.java | 0 .../configuration/SwaggerConfiguration.java | 0 .../ErrorControllerExcludedForAnnotation.java | 0 .../ErrorControllerExcludedForApiIgnore.java | 0 .../ErrorControllerExcludedForPath.java | 0 .../controller/RegularRestController.java | 0 .../ErrorControllerExcludedForPackage.java | 0 .../web/controller/CustomController.java | 0 .../src/main/resources/application.properties | 1 + ...ExcludeErrorControllerIntegrationTest.java | 0 .../com/baeldung/web/SwaggerLiveTest.java | 4 +- .../spring-boot-swagger/README.md | 3 -- .../spring-boot-swagger/pom.xml | 6 --- .../spring-security-web-rest/README.md | 1 - .../spring-security-web-rest/pom.xml | 13 ------- 32 files changed, 140 insertions(+), 36 deletions(-) create mode 100644 spring-boot-modules/spring-boot-swagger-springfox/README.md create mode 100644 spring-boot-modules/spring-boot-swagger-springfox/pom.xml rename spring-boot-modules/{spring-boot-swagger => spring-boot-swagger-springfox}/src/main/java/com/baeldung/apiswagger/Application.java (100%) rename spring-boot-modules/{spring-boot-swagger => spring-boot-swagger-springfox}/src/main/java/com/baeldung/apiswagger/config/SwaggerConfiguration.java (100%) rename spring-boot-modules/{spring-boot-swagger => spring-boot-swagger-springfox}/src/main/java/com/baeldung/apiswagger/controller/BookController.java (100%) rename spring-boot-modules/{spring-boot-swagger-2 => spring-boot-swagger-springfox}/src/main/java/com/baeldung/springdoc/demo/SpringFoxExampleApplication.java (100%) rename spring-boot-modules/{spring-boot-swagger-2 => spring-boot-swagger-springfox}/src/main/java/com/baeldung/springdoc/demo/config/SpringFoxSwaggerConfig.java (100%) create mode 100644 spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/controller/SwaggerController.java create mode 100644 spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/controller/TopicsController.java create mode 100644 spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/model/Topic.java create mode 100644 spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/service/TopicService.java rename {spring-security-modules/spring-security-web-rest => spring-boot-modules/spring-boot-swagger-springfox}/src/main/java/com/baeldung/swagger2/SwaggerConfig.java (100%) rename spring-boot-modules/{spring-boot-swagger => spring-boot-swagger-springfox}/src/main/java/com/baeldung/swagger2boot/SpringBootSwaggerApplication.java (100%) rename spring-boot-modules/{spring-boot-swagger => spring-boot-swagger-springfox}/src/main/java/com/baeldung/swagger2boot/configuration/SwaggerConfiguration.java (100%) rename spring-boot-modules/{spring-boot-swagger => spring-boot-swagger-springfox}/src/main/java/com/baeldung/swagger2boot/controller/RegularRestController.java (100%) rename spring-boot-modules/{spring-boot-swagger => spring-boot-swagger-springfox}/src/main/java/com/baeldung/swaggerconf/SpringBootSwaggerConfApplication.java (100%) rename spring-boot-modules/{spring-boot-swagger => spring-boot-swagger-springfox}/src/main/java/com/baeldung/swaggerconf/configuration/SwaggerConfiguration.java (100%) rename spring-boot-modules/{spring-boot-swagger => spring-boot-swagger-springfox}/src/main/java/com/baeldung/swaggerconf/controller/ErrorControllerExcludedForAnnotation.java (100%) rename spring-boot-modules/{spring-boot-swagger => spring-boot-swagger-springfox}/src/main/java/com/baeldung/swaggerconf/controller/ErrorControllerExcludedForApiIgnore.java (100%) rename spring-boot-modules/{spring-boot-swagger => spring-boot-swagger-springfox}/src/main/java/com/baeldung/swaggerconf/controller/ErrorControllerExcludedForPath.java (100%) rename spring-boot-modules/{spring-boot-swagger => spring-boot-swagger-springfox}/src/main/java/com/baeldung/swaggerconf/controller/RegularRestController.java (100%) rename spring-boot-modules/{spring-boot-swagger => spring-boot-swagger-springfox}/src/main/java/com/baeldung/swaggerconf/excluded/ErrorControllerExcludedForPackage.java (100%) rename {spring-security-modules/spring-security-web-rest => spring-boot-modules/spring-boot-swagger-springfox}/src/main/java/com/baeldung/web/controller/CustomController.java (100%) create mode 100644 spring-boot-modules/spring-boot-swagger-springfox/src/main/resources/application.properties rename spring-boot-modules/{spring-boot-swagger => spring-boot-swagger-springfox}/src/test/java/com/baeldung/swaggerconf/SwaggerConfExcludeErrorControllerIntegrationTest.java (100%) rename {spring-security-modules/spring-security-web-rest => spring-boot-modules/spring-boot-swagger-springfox}/src/test/java/com/baeldung/web/SwaggerLiveTest.java (83%) diff --git a/spring-boot-modules/spring-boot-swagger-2/README.md b/spring-boot-modules/spring-boot-swagger-2/README.md index 99e4c4cca5..1b43b09e39 100644 --- a/spring-boot-modules/spring-boot-swagger-2/README.md +++ b/spring-boot-modules/spring-boot-swagger-2/README.md @@ -5,4 +5,3 @@ - [Swagger @ApiParam vs @ApiModelProperty](https://www.baeldung.com/swagger-apiparam-vs-apimodelproperty) - [Map Date Types With OpenAPI Generator](https://www.baeldung.com/openapi-map-date-types) - [API First Development with Spring Boot and OpenAPI 3.0](https://www.baeldung.com/spring-boot-openapi-api-first-development) -- [Change Swagger-UI URL prefix](https://www.baeldung.com/spring-boot-custom-swagger-url) diff --git a/spring-boot-modules/spring-boot-swagger-2/pom.xml b/spring-boot-modules/spring-boot-swagger-2/pom.xml index daca41426a..12b9bf664b 100644 --- a/spring-boot-modules/spring-boot-swagger-2/pom.xml +++ b/spring-boot-modules/spring-boot-swagger-2/pom.xml @@ -34,11 +34,6 @@ springfox-oas ${springfox.version} - - io.springfox - springfox-swagger-ui - ${springfox.version} - javax.validation validation-api @@ -48,11 +43,6 @@ springfox-swagger2 ${springfox.version} - - io.springfox - springfox-spring-webmvc - ${springfox.version} - diff --git a/spring-boot-modules/spring-boot-swagger-springfox/README.md b/spring-boot-modules/spring-boot-swagger-springfox/README.md new file mode 100644 index 0000000000..301b2752ee --- /dev/null +++ b/spring-boot-modules/spring-boot-swagger-springfox/README.md @@ -0,0 +1,7 @@ +## Relevant Articles: + +- [Hiding Endpoints From Swagger Documentation in Spring Boot](https://www.baeldung.com/spring-swagger-hiding-endpoints) +- [Swagger @Api Description Is Deprecated](https://www.baeldung.com/java-swagger-api-description-deprecated) +- [Remove Basic Error Controller In SpringFox Swagger-UI](https://www.baeldung.com/spring-swagger-remove-error-controller) +- [Change Swagger-UI URL prefix](https://www.baeldung.com/spring-boot-custom-swagger-url) +- [Setting Up Swagger 2 with a Spring REST API Using Springfox](https://www.baeldung.com/swagger-2-documentation-for-spring-rest-api) \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-swagger-springfox/pom.xml b/spring-boot-modules/spring-boot-swagger-springfox/pom.xml new file mode 100644 index 0000000000..8efe03bc72 --- /dev/null +++ b/spring-boot-modules/spring-boot-swagger-springfox/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + spring-boot-swagger-springfox + 0.1.0-SNAPSHOT + spring-boot-swagger-springfox + jar + Module For Spring Boot Swagger Springfox + + + com.baeldung.spring-boot-modules + spring-boot-modules + 1.0.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + io.springfox + springfox-boot-starter + ${springfox.version} + + + com.google.guava + guava + ${guava.version} + + + + + 3.0.0 + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/apiswagger/Application.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/apiswagger/Application.java similarity index 100% rename from spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/apiswagger/Application.java rename to spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/apiswagger/Application.java diff --git a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/apiswagger/config/SwaggerConfiguration.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/apiswagger/config/SwaggerConfiguration.java similarity index 100% rename from spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/apiswagger/config/SwaggerConfiguration.java rename to spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/apiswagger/config/SwaggerConfiguration.java diff --git a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/apiswagger/controller/BookController.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/apiswagger/controller/BookController.java similarity index 100% rename from spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/apiswagger/controller/BookController.java rename to spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/apiswagger/controller/BookController.java diff --git a/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/springdoc/demo/SpringFoxExampleApplication.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/SpringFoxExampleApplication.java similarity index 100% rename from spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/springdoc/demo/SpringFoxExampleApplication.java rename to spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/SpringFoxExampleApplication.java diff --git a/spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/springdoc/demo/config/SpringFoxSwaggerConfig.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/config/SpringFoxSwaggerConfig.java similarity index 100% rename from spring-boot-modules/spring-boot-swagger-2/src/main/java/com/baeldung/springdoc/demo/config/SpringFoxSwaggerConfig.java rename to spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/config/SpringFoxSwaggerConfig.java diff --git a/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/controller/SwaggerController.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/controller/SwaggerController.java new file mode 100644 index 0000000000..79c35e025e --- /dev/null +++ b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/controller/SwaggerController.java @@ -0,0 +1,13 @@ +package com.baeldung.springdoc.demo.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class SwaggerController { + + @RequestMapping("/myproject") + public String getRedirectUrl() { + return "redirect:swagger-ui.html"; + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/controller/TopicsController.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/controller/TopicsController.java new file mode 100644 index 0000000000..dee825788d --- /dev/null +++ b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/controller/TopicsController.java @@ -0,0 +1,26 @@ +package com.baeldung.springdoc.demo.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.springdoc.demo.model.Topic; +import com.baeldung.springdoc.demo.service.TopicService; + + +@RestController +public class TopicsController { + + @Autowired + TopicService topicService; + + @GetMapping(value = "/topics") + public ResponseEntity> getAllTopics() { + return new ResponseEntity<>(topicService.getAlllTopics(), HttpStatus.OK); + } +} diff --git a/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/model/Topic.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/model/Topic.java new file mode 100644 index 0000000000..0e4417b64f --- /dev/null +++ b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/model/Topic.java @@ -0,0 +1,26 @@ +package com.baeldung.springdoc.demo.model; + +public class Topic { + + Integer id; + String name; + + public Topic(Integer id, String name) { + super(); + this.id = id; + this.name = name; + } + + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } +} diff --git a/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/service/TopicService.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/service/TopicService.java new file mode 100644 index 0000000000..a468d2915b --- /dev/null +++ b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/service/TopicService.java @@ -0,0 +1,26 @@ +package com.baeldung.springdoc.demo.service; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.baeldung.springdoc.demo.model.Topic; + +@Service +public class TopicService { + + private List topicsList; + + public TopicService(){ + this.topicsList = new ArrayList() {{ + add(new Topic(1, "Topic1")); + add(new Topic(2, "Topic2")); + add(new Topic(3, "Topic3")); + }}; + } + + public List getAlllTopics(){ + return topicsList; + } +} diff --git a/spring-security-modules/spring-security-web-rest/src/main/java/com/baeldung/swagger2/SwaggerConfig.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swagger2/SwaggerConfig.java similarity index 100% rename from spring-security-modules/spring-security-web-rest/src/main/java/com/baeldung/swagger2/SwaggerConfig.java rename to spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swagger2/SwaggerConfig.java diff --git a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swagger2boot/SpringBootSwaggerApplication.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swagger2boot/SpringBootSwaggerApplication.java similarity index 100% rename from spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swagger2boot/SpringBootSwaggerApplication.java rename to spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swagger2boot/SpringBootSwaggerApplication.java diff --git a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swagger2boot/configuration/SwaggerConfiguration.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swagger2boot/configuration/SwaggerConfiguration.java similarity index 100% rename from spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swagger2boot/configuration/SwaggerConfiguration.java rename to spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swagger2boot/configuration/SwaggerConfiguration.java diff --git a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swagger2boot/controller/RegularRestController.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swagger2boot/controller/RegularRestController.java similarity index 100% rename from spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swagger2boot/controller/RegularRestController.java rename to spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swagger2boot/controller/RegularRestController.java diff --git a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerconf/SpringBootSwaggerConfApplication.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swaggerconf/SpringBootSwaggerConfApplication.java similarity index 100% rename from spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerconf/SpringBootSwaggerConfApplication.java rename to spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swaggerconf/SpringBootSwaggerConfApplication.java diff --git a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerconf/configuration/SwaggerConfiguration.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swaggerconf/configuration/SwaggerConfiguration.java similarity index 100% rename from spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerconf/configuration/SwaggerConfiguration.java rename to spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swaggerconf/configuration/SwaggerConfiguration.java diff --git a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerconf/controller/ErrorControllerExcludedForAnnotation.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swaggerconf/controller/ErrorControllerExcludedForAnnotation.java similarity index 100% rename from spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerconf/controller/ErrorControllerExcludedForAnnotation.java rename to spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swaggerconf/controller/ErrorControllerExcludedForAnnotation.java diff --git a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerconf/controller/ErrorControllerExcludedForApiIgnore.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swaggerconf/controller/ErrorControllerExcludedForApiIgnore.java similarity index 100% rename from spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerconf/controller/ErrorControllerExcludedForApiIgnore.java rename to spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swaggerconf/controller/ErrorControllerExcludedForApiIgnore.java diff --git a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerconf/controller/ErrorControllerExcludedForPath.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swaggerconf/controller/ErrorControllerExcludedForPath.java similarity index 100% rename from spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerconf/controller/ErrorControllerExcludedForPath.java rename to spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swaggerconf/controller/ErrorControllerExcludedForPath.java diff --git a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerconf/controller/RegularRestController.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swaggerconf/controller/RegularRestController.java similarity index 100% rename from spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerconf/controller/RegularRestController.java rename to spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swaggerconf/controller/RegularRestController.java diff --git a/spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerconf/excluded/ErrorControllerExcludedForPackage.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swaggerconf/excluded/ErrorControllerExcludedForPackage.java similarity index 100% rename from spring-boot-modules/spring-boot-swagger/src/main/java/com/baeldung/swaggerconf/excluded/ErrorControllerExcludedForPackage.java rename to spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/swaggerconf/excluded/ErrorControllerExcludedForPackage.java diff --git a/spring-security-modules/spring-security-web-rest/src/main/java/com/baeldung/web/controller/CustomController.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/web/controller/CustomController.java similarity index 100% rename from spring-security-modules/spring-security-web-rest/src/main/java/com/baeldung/web/controller/CustomController.java rename to spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/web/controller/CustomController.java diff --git a/spring-boot-modules/spring-boot-swagger-springfox/src/main/resources/application.properties b/spring-boot-modules/spring-boot-swagger-springfox/src/main/resources/application.properties new file mode 100644 index 0000000000..a4e98652bc --- /dev/null +++ b/spring-boot-modules/spring-boot-swagger-springfox/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.mvc.pathmatch.matching-strategy = ANT_PATH_MATCHER \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-swagger/src/test/java/com/baeldung/swaggerconf/SwaggerConfExcludeErrorControllerIntegrationTest.java b/spring-boot-modules/spring-boot-swagger-springfox/src/test/java/com/baeldung/swaggerconf/SwaggerConfExcludeErrorControllerIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-swagger/src/test/java/com/baeldung/swaggerconf/SwaggerConfExcludeErrorControllerIntegrationTest.java rename to spring-boot-modules/spring-boot-swagger-springfox/src/test/java/com/baeldung/swaggerconf/SwaggerConfExcludeErrorControllerIntegrationTest.java diff --git a/spring-security-modules/spring-security-web-rest/src/test/java/com/baeldung/web/SwaggerLiveTest.java b/spring-boot-modules/spring-boot-swagger-springfox/src/test/java/com/baeldung/web/SwaggerLiveTest.java similarity index 83% rename from spring-security-modules/spring-security-web-rest/src/test/java/com/baeldung/web/SwaggerLiveTest.java rename to spring-boot-modules/spring-boot-swagger-springfox/src/test/java/com/baeldung/web/SwaggerLiveTest.java index 3f86b63503..4dec4acaa5 100644 --- a/spring-security-modules/spring-security-web-rest/src/test/java/com/baeldung/web/SwaggerLiveTest.java +++ b/spring-boot-modules/spring-boot-swagger-springfox/src/test/java/com/baeldung/web/SwaggerLiveTest.java @@ -4,8 +4,8 @@ import static org.junit.Assert.assertEquals; import org.junit.Test; -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.response.Response; +import io.restassured.RestAssured; +import io.restassured.response.Response; public class SwaggerLiveTest { private static final String URL_PREFIX = "http://localhost:8080/spring-security-rest/api"; diff --git a/spring-boot-modules/spring-boot-swagger/README.md b/spring-boot-modules/spring-boot-swagger/README.md index c3f6578dee..ecf057bda1 100644 --- a/spring-boot-modules/spring-boot-swagger/README.md +++ b/spring-boot-modules/spring-boot-swagger/README.md @@ -1,9 +1,6 @@ ## Relevant Articles: -- [Hiding Endpoints From Swagger Documentation in Spring Boot](https://www.baeldung.com/spring-swagger-hiding-endpoints) -- [Swagger @Api Description Is Deprecated](https://www.baeldung.com/java-swagger-api-description-deprecated) - [Generate PDF from Swagger API Documentation](https://www.baeldung.com/swagger-generate-pdf) -- [Remove Basic Error Controller In SpringFox Swagger-UI](https://www.baeldung.com/spring-swagger-remove-error-controller) - [Setting Example and Description with Swagger](https://www.baeldung.com/swagger-set-example-description) - [Document Enum in Swagger](https://www.baeldung.com/swagger-enum) - [@ApiOperation vs @ApiResponse in Swagger](https://www.baeldung.com/swagger-apioperation-vs-apiresponse) diff --git a/spring-boot-modules/spring-boot-swagger/pom.xml b/spring-boot-modules/spring-boot-swagger/pom.xml index c064f9c636..668c9d561f 100644 --- a/spring-boot-modules/spring-boot-swagger/pom.xml +++ b/spring-boot-modules/spring-boot-swagger/pom.xml @@ -20,11 +20,6 @@ org.springframework.boot spring-boot-starter-web - - io.springfox - springfox-boot-starter - ${springfox.version} - com.github.kongchen swagger-maven-plugin @@ -85,7 +80,6 @@ - 3.0.0 3.1.1 1.7.0 diff --git a/spring-security-modules/spring-security-web-rest/README.md b/spring-security-modules/spring-security-web-rest/README.md index 5a94504762..a11bc7e8d6 100644 --- a/spring-security-modules/spring-security-web-rest/README.md +++ b/spring-security-modules/spring-security-web-rest/README.md @@ -9,7 +9,6 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [Setting Up Swagger 2 with a Spring REST API Using Springfox](https://www.baeldung.com/swagger-2-documentation-for-spring-rest-api) - [Custom Error Message Handling for REST API](https://www.baeldung.com/global-error-handler-in-a-spring-rest-api) - [Spring Security Context Propagation with @Async](https://www.baeldung.com/spring-security-async-principal-propagation) - [Servlet 3 Async Support with Spring MVC and Spring Security](https://www.baeldung.com/spring-mvc-async-security) diff --git a/spring-security-modules/spring-security-web-rest/pom.xml b/spring-security-modules/spring-security-web-rest/pom.xml index 99a040293b..76d9ad37de 100644 --- a/spring-security-modules/spring-security-web-rest/pom.xml +++ b/spring-security-modules/spring-security-web-rest/pom.xml @@ -139,17 +139,6 @@ - - - io.springfox - springfox-swagger2 - ${springfox-swagger.version} - - - io.springfox - springfox-swagger-ui - ${springfox-swagger.version} - commons-fileupload commons-fileupload @@ -246,8 +235,6 @@ 1.1.0.Final 2.9.0 - - 3.0.0 1.6.1 From f372563ca2d4b965a96dc91b3dd7c747544e14b5 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Wed, 28 Jun 2023 16:48:08 +0200 Subject: [PATCH 122/170] JAVA-21602 | fixing sync code block (#14318) --- .../baeldung/producerconsumer/Consumer.java | 27 +++++++++---------- .../baeldung/producerconsumer/Producer.java | 27 +++++++++---------- 2 files changed, 26 insertions(+), 28 deletions(-) diff --git a/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/Consumer.java b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/Consumer.java index 933a1b5f52..9c880025f7 100644 --- a/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/Consumer.java +++ b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/Consumer.java @@ -17,22 +17,21 @@ public class Consumer implements Runnable { public void consume() { while (dataQueue.runFlag) { - synchronized (dataQueue) { - while (dataQueue.isEmpty() && dataQueue.runFlag) { - try { - dataQueue.waitOnEmpty(); - } catch (InterruptedException e) { - e.printStackTrace(); - break; - } - } - if (!dataQueue.runFlag) { + while (dataQueue.isEmpty() && dataQueue.runFlag) { + try { + dataQueue.waitOnEmpty(); + } catch (InterruptedException e) { + e.printStackTrace(); break; } - Message message = dataQueue.remove(); - dataQueue.notifyAllForFull(); - useMessage(message); } + if (!dataQueue.runFlag) { + break; + } + Message message = dataQueue.remove(); + dataQueue.notifyAllForFull(); + useMessage(message); + } log.info("Consumer Stopped"); } @@ -40,7 +39,7 @@ public class Consumer implements Runnable { private void useMessage(Message message) { if (message != null) { log.info(String.format("[%s] Consuming Message. Id: %d, Data: %f%n", - Thread.currentThread().getName(), message.getId(), message.getData())); + Thread.currentThread().getName(), message.getId(), message.getData())); //Sleeping on random time to make it realistic ThreadUtil.sleep((long) (message.getData() * 100)); diff --git a/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/Producer.java b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/Producer.java index ca89d0c866..5ca60a29e4 100644 --- a/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/Producer.java +++ b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/producerconsumer/Producer.java @@ -19,22 +19,21 @@ public class Producer implements Runnable { public void produce() { while (dataQueue.runFlag) { - synchronized (dataQueue) { - while (dataQueue.isFull() && dataQueue.runFlag) { - try { - dataQueue.waitOnFull(); - } catch (InterruptedException e) { - e.printStackTrace(); - break; - } - } - if (!dataQueue.runFlag) { + while (dataQueue.isFull() && dataQueue.runFlag) { + try { + dataQueue.waitOnFull(); + } catch (InterruptedException e) { + e.printStackTrace(); break; } - Message message = generateMessage(); - dataQueue.add(message); - dataQueue.notifyAllForEmpty(); } + if (!dataQueue.runFlag) { + break; + } + Message message = generateMessage(); + dataQueue.add(message); + dataQueue.notifyAllForEmpty(); + } log.info("Producer Stopped"); } @@ -42,7 +41,7 @@ public class Producer implements Runnable { private Message generateMessage() { Message message = new Message(incrementAndGetId(), Math.random()); log.info(String.format("[%s] Generated Message. Id: %d, Data: %f%n", - Thread.currentThread().getName(), message.getId(), message.getData())); + Thread.currentThread().getName(), message.getId(), message.getData())); //Sleeping on random time to make it realistic ThreadUtil.sleep((long) (message.getData() * 100)); From eea21ae2a08e96d0324d2f9e4c7c23456ff2456f Mon Sep 17 00:00:00 2001 From: Hamid Reza Sharifi Date: Wed, 28 Jun 2023 19:44:01 +0330 Subject: [PATCH 123/170] bael-3314:update jmockit articles (#14320) --- testing-modules/mocks/pom.xml | 2 +- .../jmockit/AdvancedCollaborator.java | 4 +- .../AdvancedCollaboratorIntegrationTest.java | 62 +++++++------------ .../jmockit/ExpectationsIntegrationTest.java | 26 +++----- .../LoginControllerIntegrationTest.java | 15 +---- .../jmockit/PerformerIntegrationTest.java | 9 +-- .../jmockit/ReusingIntegrationTest.java | 13 +--- 7 files changed, 37 insertions(+), 94 deletions(-) diff --git a/testing-modules/mocks/pom.xml b/testing-modules/mocks/pom.xml index 281fff38c2..88fc6367aa 100644 --- a/testing-modules/mocks/pom.xml +++ b/testing-modules/mocks/pom.xml @@ -67,7 +67,7 @@ 0.15 1.5 3.5.1 - 1.41 + 1.49 1.1 diff --git a/testing-modules/mocks/src/main/java/com/baeldung/jmockit/AdvancedCollaborator.java b/testing-modules/mocks/src/main/java/com/baeldung/jmockit/AdvancedCollaborator.java index ef7484cfdd..61afccc745 100644 --- a/testing-modules/mocks/src/main/java/com/baeldung/jmockit/AdvancedCollaborator.java +++ b/testing-modules/mocks/src/main/java/com/baeldung/jmockit/AdvancedCollaborator.java @@ -8,12 +8,12 @@ public class AdvancedCollaborator { i = string.length(); } public String methodThatCallsPrivateMethod(int i){ - return privateMethod() + i; + return protectedMethod() + i; } public int methodThatReturnsThePrivateField(){ return privateField; } - private String privateMethod(){ + protected String protectedMethod(){ return "default:"; } class InnerAdvancedCollaborator{} diff --git a/testing-modules/mocks/src/test/java/com/baeldung/jmockit/AdvancedCollaboratorIntegrationTest.java b/testing-modules/mocks/src/test/java/com/baeldung/jmockit/AdvancedCollaboratorIntegrationTest.java index e55a69895f..ff69a701e7 100644 --- a/testing-modules/mocks/src/test/java/com/baeldung/jmockit/AdvancedCollaboratorIntegrationTest.java +++ b/testing-modules/mocks/src/test/java/com/baeldung/jmockit/AdvancedCollaboratorIntegrationTest.java @@ -1,37 +1,33 @@ package com.baeldung.jmockit; -import static org.junit.Assert.assertEquals; +import mockit.*; +import org.junit.Test; -import java.util.ArrayList; +import java.io.Serializable; +import java.util.Comparator; import java.util.List; -import com.baeldung.jmockit.AdvancedCollaborator; -import org.junit.Test; -import org.junit.runner.RunWith; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; -import mockit.Deencapsulation; -import mockit.Expectations; -import mockit.Invocation; -import mockit.Mock; -import mockit.MockUp; -import mockit.Mocked; -import mockit.Tested; -import mockit.integration.junit4.JMockit; +public class AdvancedCollaboratorIntegrationTest { -@RunWith(JMockit.class) -public class AdvancedCollaboratorIntegrationTest & Comparable>> { + interface IList extends List {} + interface IComparator extends Comparator, Serializable {} + static class MultiMock { + IList get() { return null; } + IComparator compareTo() { return null; } + } @Tested private AdvancedCollaborator mock; - @Mocked - private MultiMock multiMock; @Test public void testToMockUpPrivateMethod() { new MockUp() { @Mock - private String privateMethod() { + protected String protectedMethod() { return "mocked: "; } }; @@ -52,40 +48,26 @@ public class AdvancedCollaboratorIntegrationTest } @Test - public void testToSetPrivateFieldDirectly() { - Deencapsulation.setField(mock, "privateField", 10); - assertEquals(10, mock.methodThatReturnsThePrivateField()); + public void testToSetPrivateFieldDirectly(@Injectable("10") int privateField) { + assertEquals(10, privateField); } @Test public void testToGetPrivateFieldDirectly() { - int value = Deencapsulation.getField(mock, "privateField"); - assertEquals(5, value); + assertEquals(5, mock.methodThatReturnsThePrivateField()); } @Test @SuppressWarnings("unchecked") - public void testMultipleInterfacesWholeTest() { + public void testMultipleInterfacesWholeTest(@Mocked MultiMock multiMock) { new Expectations() { { - multiMock.get(5); result = "foo"; - multiMock.compareTo((List) any); result = 0; + multiMock.get(); result = null; + multiMock.compareTo(); result = null; } }; - assertEquals("foo", multiMock.get(5)); - assertEquals(0, multiMock.compareTo(new ArrayList<>())); + assertNull(multiMock.get()); + assertNull(multiMock.compareTo()); } - @Test - @SuppressWarnings("unchecked") - public & Comparable>> void testMultipleInterfacesOneMethod(@Mocked M mock) { - new Expectations() { - { - mock.get(5); result = "foo"; - mock.compareTo((List) any); - result = 0; } - }; - assertEquals("foo", mock.get(5)); - assertEquals(0, mock.compareTo(new ArrayList<>())); - } } diff --git a/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ExpectationsIntegrationTest.java b/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ExpectationsIntegrationTest.java index 1ff90111d1..b17f7b183f 100644 --- a/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ExpectationsIntegrationTest.java +++ b/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ExpectationsIntegrationTest.java @@ -1,23 +1,17 @@ package com.baeldung.jmockit; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; - -import java.util.ArrayList; -import java.util.List; - -import org.hamcrest.BaseMatcher; -import org.hamcrest.Description; -import org.junit.Test; -import org.junit.runner.RunWith; - import mockit.Delegate; import mockit.Expectations; import mockit.Mocked; import mockit.Verifications; -import mockit.integration.junit4.JMockit; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; -@RunWith(JMockit.class) @SuppressWarnings("unchecked") public class ExpectationsIntegrationTest { @@ -91,15 +85,11 @@ public class ExpectationsIntegrationTest { @Test public void testCustomArgumentMatching(@Mocked ExpectationsCollaborator mock) { new Expectations() {{ - mock.methodForArgThat(withArgThat(new BaseMatcher() { - @Override + mock.methodForArgThat(with(new Delegate() { public boolean matches(Object item) { return item instanceof Model && "info".equals(((Model) item).getInfo()); } - @Override - public void describeTo(Description description) { - } })); }}; mock.methodForArgThat(new Model()); diff --git a/testing-modules/mocks/src/test/java/com/baeldung/jmockit/LoginControllerIntegrationTest.java b/testing-modules/mocks/src/test/java/com/baeldung/jmockit/LoginControllerIntegrationTest.java index df3eeccca2..c2b8bea1ea 100644 --- a/testing-modules/mocks/src/test/java/com/baeldung/jmockit/LoginControllerIntegrationTest.java +++ b/testing-modules/mocks/src/test/java/com/baeldung/jmockit/LoginControllerIntegrationTest.java @@ -1,18 +1,13 @@ package com.baeldung.jmockit; -import mockit.*; -import mockit.integration.junit4.JMockit; import com.baeldung.testCase.LoginController; import com.baeldung.testCase.LoginDao; import com.baeldung.testCase.LoginService; import com.baeldung.testCase.UserForm; -import org.hamcrest.BaseMatcher; -import org.hamcrest.Description; +import mockit.*; import org.junit.Assert; import org.junit.Test; -import org.junit.runner.RunWith; -@RunWith(JMockit.class) public class LoginControllerIntegrationTest { @Injectable @@ -110,16 +105,10 @@ public class LoginControllerIntegrationTest { loginService.login((UserForm) any); result = true; // complex matcher - loginService.setCurrentUser(withArgThat(new BaseMatcher() { - @Override + loginService.setCurrentUser(with(new Delegate() { public boolean matches(Object item) { return item instanceof String && ((String) item).startsWith("foo"); } - - @Override - public void describeTo(Description description) { - //NOOP - } })); }}; diff --git a/testing-modules/mocks/src/test/java/com/baeldung/jmockit/PerformerIntegrationTest.java b/testing-modules/mocks/src/test/java/com/baeldung/jmockit/PerformerIntegrationTest.java index fb94ae908b..d2a5c52154 100644 --- a/testing-modules/mocks/src/test/java/com/baeldung/jmockit/PerformerIntegrationTest.java +++ b/testing-modules/mocks/src/test/java/com/baeldung/jmockit/PerformerIntegrationTest.java @@ -1,15 +1,8 @@ package com.baeldung.jmockit; -import com.baeldung.jmockit.Collaborator; -import com.baeldung.jmockit.Model; -import com.baeldung.jmockit.Performer; -import org.junit.Test; -import org.junit.runner.RunWith; - import mockit.*; -import mockit.integration.junit4.JMockit; +import org.junit.Test; -@RunWith(JMockit.class) public class PerformerIntegrationTest { @Injectable diff --git a/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ReusingIntegrationTest.java b/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ReusingIntegrationTest.java index 30b17ee2e4..f702f776fc 100644 --- a/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ReusingIntegrationTest.java +++ b/testing-modules/mocks/src/test/java/com/baeldung/jmockit/ReusingIntegrationTest.java @@ -1,20 +1,9 @@ package com.baeldung.jmockit; -import com.baeldung.jmockit.Collaborator; -import com.baeldung.jmockit.Model; -import com.baeldung.jmockit.Performer; +import mockit.*; import org.junit.Before; import org.junit.Test; -import org.junit.runner.RunWith; -import mockit.Expectations; -import mockit.Injectable; -import mockit.Mocked; -import mockit.Tested; -import mockit.Verifications; -import mockit.integration.junit4.JMockit; - -@RunWith(JMockit.class) public class ReusingIntegrationTest { @Injectable From 91b0d6478b817d47f12ce8da4497be80dbf88ce8 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 28 Jun 2023 19:16:12 +0300 Subject: [PATCH 124/170] [JAVA-22159] Upgraded circuitbreaker-resilience4j and spring boot version (#14316) --- pom.xml | 2 ++ spring-cloud-modules/pom.xml | 2 +- spring-cloud-modules/spring-cloud-circuit-breaker/pom.xml | 5 +++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index dbf8c942c3..3af4c1b6a7 100644 --- a/pom.xml +++ b/pom.xml @@ -730,6 +730,7 @@ spring-drools spring-cloud-modules/spring-cloud-contract spring-cloud-modules/spring-cloud-data-flow + spring-cloud-modules/spring-cloud-circuit-breaker spring-exceptions spring-jenkins-pipeline spring-core @@ -1000,6 +1001,7 @@ spring-batch-2 spring-boot-rest spring-drools + spring-cloud-modules/spring-cloud-circuit-breaker spring-exceptions spring-jenkins-pipeline spring-core diff --git a/spring-cloud-modules/pom.xml b/spring-cloud-modules/pom.xml index 3fd2f118dc..1ddc2f9015 100644 --- a/spring-cloud-modules/pom.xml +++ b/spring-cloud-modules/pom.xml @@ -43,7 +43,7 @@ spring-cloud-zuul spring-cloud-zuul-fallback spring-cloud-ribbon-retry - spring-cloud-circuit-breaker + spring-cloud-eureka-self-preservation spring-cloud-openfeign spring-cloud-netflix-feign diff --git a/spring-cloud-modules/spring-cloud-circuit-breaker/pom.xml b/spring-cloud-modules/spring-cloud-circuit-breaker/pom.xml index 3fe060c0b6..e2ba6433c0 100644 --- a/spring-cloud-modules/spring-cloud-circuit-breaker/pom.xml +++ b/spring-cloud-modules/spring-cloud-circuit-breaker/pom.xml @@ -18,7 +18,7 @@ org.springframework.boot spring-boot-dependencies - 2.2.4.RELEASE + ${spring-boot-dependencies.version} pom import @@ -38,7 +38,8 @@ - 1.0.2.RELEASE + 3.0.1 + 3.0.2 \ No newline at end of file From 718e1998cbc017a2c224703990ab9358cd049d2d Mon Sep 17 00:00:00 2001 From: kpentaris Date: Thu, 29 Jun 2023 06:24:43 +0300 Subject: [PATCH 125/170] BAEL-4466 Smart Batching in Java (#14190) * Tutorial code for BAEL-4466 Smart Batching in Java * Revert "Tutorial code for BAEL-4466 Smart Batching in Java" This reverts commit d8d4fa7a42b0806d1f0a64d53425a3a4337cb79d. * Tutorial code for BAEL-4466 Smart Batching in Java --- .../baeldung/smartbatching/BatchingApp.java | 72 +++++++++++++++++++ .../baeldung/smartbatching/MicroBatcher.java | 59 +++++++++++++++ .../baeldung/smartbatching/SmartBatcher.java | 52 ++++++++++++++ 3 files changed, 183 insertions(+) create mode 100644 patterns-modules/design-patterns-behavioral-2/src/main/java/com/baeldung/smartbatching/BatchingApp.java create mode 100644 patterns-modules/design-patterns-behavioral-2/src/main/java/com/baeldung/smartbatching/MicroBatcher.java create mode 100644 patterns-modules/design-patterns-behavioral-2/src/main/java/com/baeldung/smartbatching/SmartBatcher.java diff --git a/patterns-modules/design-patterns-behavioral-2/src/main/java/com/baeldung/smartbatching/BatchingApp.java b/patterns-modules/design-patterns-behavioral-2/src/main/java/com/baeldung/smartbatching/BatchingApp.java new file mode 100644 index 0000000000..8f95d5cbee --- /dev/null +++ b/patterns-modules/design-patterns-behavioral-2/src/main/java/com/baeldung/smartbatching/BatchingApp.java @@ -0,0 +1,72 @@ +package com.baeldung.smartbatching; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.ScheduledExecutorService; + +/** + * @author KPentaris + * @date 07/06/2023 + * @project design-patterns-behavioral-2 + */ +public class BatchingApp { + + static void simpleProcessing() throws Exception { + final Path testPath = Paths.get("./testio.txt"); + testPath.toFile().createNewFile(); + ScheduledExecutorService executorService = Executors.newScheduledThreadPool(100); + Set futures = new HashSet<>(); + for (int i = 0; i < 50000; i++) { + futures.add(executorService.submit(() -> { + try { + Files.write(testPath, Collections.singleton(Thread.currentThread().getName()), StandardOpenOption.APPEND); + } catch (IOException e) { + e.printStackTrace(); + } + })); + } + long start = System.currentTimeMillis(); + for (Future future : futures) { + future.get(); + } + System.out.println("Time: " + (System.currentTimeMillis() - start)); + executorService.shutdown(); + } + + static void batchedProcessing() throws Exception { + final Path testPath = Paths.get("./testio.txt"); + testPath.toFile().createNewFile(); + SmartBatcher batcher = new SmartBatcher(10, strings -> { + List content = new ArrayList<>(strings); + content.add("-----Batch Operation-----"); + try { + Files.write(testPath, content, StandardOpenOption.APPEND); + } catch (IOException e) { + e.printStackTrace(); + } + }); + for (int i = 0; i < 50000; i++) { + batcher.submit(Thread.currentThread().getName() + "-1"); + } + long start = System.currentTimeMillis(); + while (!batcher.finished()) { + Thread.sleep(10); + } + System.out.println("Time: " + (System.currentTimeMillis() - start)); + } + + public static void main(String[] args) throws Exception { +// simpleProcessing(); + batchedProcessing(); + } +} diff --git a/patterns-modules/design-patterns-behavioral-2/src/main/java/com/baeldung/smartbatching/MicroBatcher.java b/patterns-modules/design-patterns-behavioral-2/src/main/java/com/baeldung/smartbatching/MicroBatcher.java new file mode 100644 index 0000000000..b6d171246a --- /dev/null +++ b/patterns-modules/design-patterns-behavioral-2/src/main/java/com/baeldung/smartbatching/MicroBatcher.java @@ -0,0 +1,59 @@ +package com.baeldung.smartbatching; + +import java.util.ArrayList; +import java.util.List; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.function.Consumer; + +/** + * @author KPentaris + * @date 07/06/2023 + * @project design-patterns-behavioral-2 + */ +public class MicroBatcher { + Queue tasksQueue = new ConcurrentLinkedQueue<>(); + Thread batchThread; + int executionThreshold; + int timeoutThreshold; + boolean working = false; + + MicroBatcher(int executionThreshold, int timeoutThreshold, Consumer> executionLogic) { + batchThread = new Thread(batchHandling(executionLogic)); + batchThread.setDaemon(true); + batchThread.start(); + this.executionThreshold = executionThreshold; + this.timeoutThreshold = timeoutThreshold; + } + + void submit(String task) { + tasksQueue.add(task); + } + + Runnable batchHandling(Consumer> executionLogic) { + return () -> { + while (!batchThread.isInterrupted()) { + long startTime = System.currentTimeMillis(); + while (tasksQueue.size() < executionThreshold && (System.currentTimeMillis() - startTime) < timeoutThreshold) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + return; // exit the external loop + } + } + List tasks = new ArrayList<>(executionThreshold); + while (tasksQueue.size() > 0 && tasks.size() < executionThreshold) { + tasks.add(tasksQueue.poll()); + } + working = true; + executionLogic.accept(tasks); + working = false; + } + }; + } + + boolean finished() { + return tasksQueue.isEmpty() && !working; + } + +} diff --git a/patterns-modules/design-patterns-behavioral-2/src/main/java/com/baeldung/smartbatching/SmartBatcher.java b/patterns-modules/design-patterns-behavioral-2/src/main/java/com/baeldung/smartbatching/SmartBatcher.java new file mode 100644 index 0000000000..d4aab8e986 --- /dev/null +++ b/patterns-modules/design-patterns-behavioral-2/src/main/java/com/baeldung/smartbatching/SmartBatcher.java @@ -0,0 +1,52 @@ +package com.baeldung.smartbatching; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.function.Consumer; + +/** + * @author KPentaris + * @date 07/06/2023 + * @project design-patterns-behavioral-2 + */ +public class SmartBatcher { + BlockingQueue tasksQueue = new LinkedBlockingQueue<>(); + Thread batchThread; + int executionThreshold; + boolean working = false; + + SmartBatcher(int executionThreshold, Consumer> executionLogic) { + batchThread = new Thread(batchHandling(executionLogic)); + batchThread.setDaemon(true); + batchThread.start(); + this.executionThreshold = executionThreshold; + } + + void submit(String task) { + tasksQueue.add(task); + } + + Runnable batchHandling(Consumer> executionLogic) { + return () -> { + while (!batchThread.isInterrupted()) { + List tasks = new ArrayList<>(executionThreshold); + while (tasksQueue.drainTo(tasks, executionThreshold) == 0) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + return; // exit the external loop + } + } + working = true; + executionLogic.accept(tasks); + working = false; + } + }; + } + + boolean finished() { + return tasksQueue.isEmpty() && !working; + } +} From cd6661e1179265c88df90806431fa933d9553c65 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Thu, 29 Jun 2023 11:26:08 +0300 Subject: [PATCH 126/170] JAVA-100003 Removed apis from Kong Co-authored-by: timis1 --- .../baeldung/kong/KongAdminAPILiveTest.java | 22 +++++++++---------- .../kong/KongLoadBalanceLiveTest.java | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/kong/KongAdminAPILiveTest.java b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/kong/KongAdminAPILiveTest.java index 92d2286518..019d39f590 100644 --- a/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/kong/KongAdminAPILiveTest.java +++ b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/kong/KongAdminAPILiveTest.java @@ -53,17 +53,17 @@ public class KongAdminAPILiveTest { @Test public void givenKongAdminAPI_whenAddAPI_thenAPIAccessibleViaKong() throws Exception { - restTemplate.delete("http://localhost:8001/apis/stock-api"); + restTemplate.delete("http://localhost:8001/stock-api"); APIObject stockAPI = new APIObject("stock-api", "stock.api", "http://localhost:9090", "/"); HttpEntity apiEntity = new HttpEntity<>(stockAPI); - ResponseEntity addAPIResp = restTemplate.postForEntity("http://localhost:8001/apis", apiEntity, String.class); + ResponseEntity addAPIResp = restTemplate.postForEntity("http://localhost:8001", apiEntity, String.class); assertEquals(HttpStatus.CREATED, addAPIResp.getStatusCode()); - addAPIResp = restTemplate.postForEntity("http://localhost:8001/apis", apiEntity, String.class); + addAPIResp = restTemplate.postForEntity("http://localhost:8001", apiEntity, String.class); assertEquals(HttpStatus.CONFLICT, addAPIResp.getStatusCode()); - String apiListResp = restTemplate.getForObject("http://localhost:8001/apis/", String.class); + String apiListResp = restTemplate.getForObject("http://localhost:8001/", String.class); assertTrue(apiListResp.contains("stock-api")); @@ -94,17 +94,17 @@ public class KongAdminAPILiveTest { @Test public void givenAPI_whenEnableAuth_thenAnonymousDenied() throws Exception { - String apiListResp = restTemplate.getForObject("http://localhost:8001/apis/", String.class); + String apiListResp = restTemplate.getForObject("http://localhost:8001/", String.class); if (!apiListResp.contains("stock-api")) { givenKongAdminAPI_whenAddAPI_thenAPIAccessibleViaKong(); } PluginObject authPlugin = new PluginObject("key-auth"); - ResponseEntity enableAuthResp = restTemplate.postForEntity("http://localhost:8001/apis/stock-api/plugins", new HttpEntity<>(authPlugin), String.class); + ResponseEntity enableAuthResp = restTemplate.postForEntity("http://localhost:8001/stock-api/plugins", new HttpEntity<>(authPlugin), String.class); assertTrue(HttpStatus.CREATED == enableAuthResp.getStatusCode() || HttpStatus.CONFLICT == enableAuthResp.getStatusCode()); - String pluginsResp = restTemplate.getForObject("http://localhost:8001/apis/stock-api/plugins", String.class); + String pluginsResp = restTemplate.getForObject("http://localhost:8001/stock-api/plugins", String.class); assertTrue(pluginsResp.contains("key-auth")); HttpHeaders headers = new HttpHeaders(); @@ -116,7 +116,7 @@ public class KongAdminAPILiveTest { @Test public void givenAPIAuthEnabled_whenAddKey_thenAccessAllowed() throws Exception { - String apiListResp = restTemplate.getForObject("http://localhost:8001/apis/", String.class); + String apiListResp = restTemplate.getForObject("http://localhost:8001/", String.class); if (!apiListResp.contains("stock-api")) { givenKongAdminAPI_whenAddAPI_thenAPIAccessibleViaKong(); } @@ -127,7 +127,7 @@ public class KongAdminAPILiveTest { } PluginObject authPlugin = new PluginObject("key-auth"); - ResponseEntity enableAuthResp = restTemplate.postForEntity("http://localhost:8001/apis/stock-api/plugins", new HttpEntity<>(authPlugin), String.class); + ResponseEntity enableAuthResp = restTemplate.postForEntity("http://localhost:8001/stock-api/plugins", new HttpEntity<>(authPlugin), String.class); assertTrue(HttpStatus.CREATED == enableAuthResp.getStatusCode() || HttpStatus.CONFLICT == enableAuthResp.getStatusCode()); final String consumerKey = "eugenp.pass"; @@ -154,14 +154,14 @@ public class KongAdminAPILiveTest { public void givenAdminAPIProxy_whenAddAPIViaProxy_thenAPIAdded() throws Exception { APIObject adminAPI = new APIObject("admin-api", "admin.api", "http://localhost:8001", "/admin-api"); HttpEntity apiEntity = new HttpEntity<>(adminAPI); - ResponseEntity addAPIResp = restTemplate.postForEntity("http://localhost:8001/apis", apiEntity, String.class); + ResponseEntity addAPIResp = restTemplate.postForEntity("http://localhost:8001", apiEntity, String.class); assertTrue(HttpStatus.CREATED == addAPIResp.getStatusCode() || HttpStatus.CONFLICT == addAPIResp.getStatusCode()); HttpHeaders headers = new HttpHeaders(); headers.set("Host", "admin.api"); APIObject baeldungAPI = new APIObject("baeldung-api", "baeldung.com", "http://ww.baeldung.com", "/"); - RequestEntity requestEntity = new RequestEntity<>(baeldungAPI, headers, HttpMethod.POST, new URI("http://localhost:8000/admin-api/apis")); + RequestEntity requestEntity = new RequestEntity<>(baeldungAPI, headers, HttpMethod.POST, new URI("http://localhost:8000/admin-api")); addAPIResp = restTemplate.exchange(requestEntity, String.class); assertTrue(HttpStatus.CREATED == addAPIResp.getStatusCode() || HttpStatus.CONFLICT == addAPIResp.getStatusCode()); diff --git a/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/kong/KongLoadBalanceLiveTest.java b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/kong/KongLoadBalanceLiveTest.java index 7cf67453a6..13e741eb46 100644 --- a/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/kong/KongLoadBalanceLiveTest.java +++ b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/kong/KongLoadBalanceLiveTest.java @@ -55,7 +55,7 @@ public class KongLoadBalanceLiveTest { APIObject stockAPI = new APIObject("balanced-stock-api", "balanced.stock.api", "http://stock.api.service", "/"); HttpEntity apiEntity = new HttpEntity<>(stockAPI); - ResponseEntity addAPIResp = restTemplate.postForEntity("http://localhost:8001/apis", apiEntity, String.class); + ResponseEntity addAPIResp = restTemplate.postForEntity("http://localhost:8001", apiEntity, String.class); assertTrue(HttpStatus.CREATED == addAPIResp.getStatusCode() || HttpStatus.CONFLICT == addAPIResp.getStatusCode()); HttpHeaders headers = new HttpHeaders(); From 615bd5c714749fd814812721c63808fc63b99463 Mon Sep 17 00:00:00 2001 From: timis1 Date: Thu, 29 Jun 2023 22:04:33 +0300 Subject: [PATCH 127/170] JAVA-22498 Potential issue in "Difference Between FileReader and BufferedReader in Java" --- .../BufferedReaderUnitTest.java | 17 +++++++++++------ .../FileReaderUnitTest.java | 4 ++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/BufferedReaderUnitTest.java b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/BufferedReaderUnitTest.java index 06b7d38821..62f0d9da22 100644 --- a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/BufferedReaderUnitTest.java +++ b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/BufferedReaderUnitTest.java @@ -3,18 +3,23 @@ package com.baeldung.bufferedreadervsfilereader; import static org.junit.jupiter.api.Assertions.assertEquals; import java.io.BufferedReader; -import java.io.FileReader; +import java.io.File; import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; -import org.junit.jupiter.api.Assertions; -import org.testng.annotations.Test; -public class BufferedReaderUnitTest { +import org.junit.jupiter.api.Test; + +class BufferedReaderUnitTest { @Test - public void whenReadingAFile_thenReadsLineByLine() { + void whenReadingAFile_thenReadsLineByLine() { StringBuilder result = new StringBuilder(); - try (BufferedReader br = new BufferedReader(new FileReader("src/test/resources/sampleText1.txt"))) { + final Path filePath = new File("src/test/resources/sampleText1.txt").toPath(); + try (BufferedReader br = new BufferedReader(new InputStreamReader(Files.newInputStream(filePath), StandardCharsets.UTF_8))) { String line; while((line = br.readLine()) != null) { diff --git a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/FileReaderUnitTest.java b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/FileReaderUnitTest.java index 5df870e7b5..da724d32e8 100644 --- a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/FileReaderUnitTest.java +++ b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/bufferedreadervsfilereader/FileReaderUnitTest.java @@ -7,10 +7,10 @@ import java.io.IOException; import org.junit.jupiter.api.Test; -public class FileReaderUnitTest { +class FileReaderUnitTest { @Test - public void whenReadingAFile_thenReadsCharByChar() { + void whenReadingAFile_thenReadsCharByChar() { StringBuilder result = new StringBuilder(); try (FileReader fr = new FileReader("src/test/resources/sampleText2.txt")) { From f9ac0f459ed36cb843278aaea6cdfb042856df3b Mon Sep 17 00:00:00 2001 From: Tapan Avasthi Date: Fri, 30 Jun 2023 07:29:37 +0530 Subject: [PATCH 128/170] BAEL-6627: How to start a thread using an anonymous class (#14314) Co-authored-by: Tapan Avasthi --- .../AnonymousThreadUnitTest.java | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/anonymousthread/AnonymousThreadUnitTest.java diff --git a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/anonymousthread/AnonymousThreadUnitTest.java b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/anonymousthread/AnonymousThreadUnitTest.java new file mode 100644 index 0000000000..c292b480cf --- /dev/null +++ b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/anonymousthread/AnonymousThreadUnitTest.java @@ -0,0 +1,112 @@ +package com.baeldung.concurrent.anonymousthread; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +public class AnonymousThreadUnitTest { + static ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + static PrintStream printStream = new PrintStream(outputStream); + static List expectedNumbers = new ArrayList<>(); + + @BeforeClass + public static void setupClass() { + for (int i = 1; i <= 10; i++) { + expectedNumbers.add(String.valueOf(i)); + } + } + + @Before + public void setupMethod() { + System.setOut(printStream); + } + + @After + public void cleanUpMethod() { + outputStream.reset(); + System.setOut(System.out); + } + + @AfterClass + public static void cleanupClass() throws IOException { + expectedNumbers.clear(); + outputStream.close(); + printStream.close(); + } + + @Test + public void givenAnonymousThreadSubclassOverridingRunMethod_whenStart_thenRunAsExpected() { + Thread anonymousThread = new Thread() { + @Override + public void run() { + printNumbersFrom1To10(); + } + }; + anonymousThread.start(); + waitForThreadToFinish(); + anonymousThread.interrupt(); + + String[] printedNumbers = getPrintedNumbers(); + assertEquals(expectedNumbers, List.of(printedNumbers)); + } + + @Test + public void givenAnonymousThreadWithLambdaExpression_whenStart_thenRunAsExpected() { + Thread anonymousThread = new Thread(() -> { + printNumbersFrom1To10(); + }); + + anonymousThread.start(); + waitForThreadToFinish(); + anonymousThread.interrupt(); + + String[] printedNumbers = getPrintedNumbers(); + assertEquals(expectedNumbers, List.of(printedNumbers)); + } + + @Test + public void givenAnonymousThreadWithRunnableObject_whenStart_thenRunAsExpected() { + Thread anonymousThread = new Thread(new Runnable() { + @Override + public void run() { + printNumbersFrom1To10(); + } + }); + anonymousThread.start(); + waitForThreadToFinish(); + anonymousThread.interrupt(); + + String[] printedNumbers = getPrintedNumbers(); + assertEquals(expectedNumbers, List.of(printedNumbers)); + } + + private void printNumbersFrom1To10() { + for (int i = 1; i <= 10; i++) { + System.out.println(i); + } + } + + private void waitForThreadToFinish() { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // ignore + } + } + + private String[] getPrintedNumbers() { + String printedOutput = outputStream.toString() + .trim(); + return printedOutput.split(System.lineSeparator()); + } +} From 7047e858de65156e2a980b972644c0d4a77313af Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Fri, 30 Jun 2023 06:59:21 +0300 Subject: [PATCH 129/170] JAVA-20168 Update article links in README.md (#14307) Co-authored-by: timis1 --- persistence-modules/spring-boot-persistence/README.md | 1 + persistence-modules/spring-jpa/README.md | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/spring-boot-persistence/README.md b/persistence-modules/spring-boot-persistence/README.md index 88526cdb89..6bbc2b37ae 100644 --- a/persistence-modules/spring-boot-persistence/README.md +++ b/persistence-modules/spring-boot-persistence/README.md @@ -7,4 +7,5 @@ - [Resolving “Failed to Configure a DataSource” Error](https://www.baeldung.com/spring-boot-failed-to-configure-data-source) - [Hibernate Field Naming with Spring Boot](https://www.baeldung.com/hibernate-field-naming-spring-boot) - [Spring Boot with Hibernate](https://www.baeldung.com/spring-boot-hibernate) +- [A Guide to Spring AbstractRoutingDatasource](https://www.baeldung.com/spring-abstract-routing-data-source) - More articles: [[more -->]](../spring-boot-persistence-2) diff --git a/persistence-modules/spring-jpa/README.md b/persistence-modules/spring-jpa/README.md index aa9e833260..43dffa6973 100644 --- a/persistence-modules/spring-jpa/README.md +++ b/persistence-modules/spring-jpa/README.md @@ -6,7 +6,6 @@ - [Sorting with JPA](https://www.baeldung.com/jpa-sort) - [Self-Contained Testing Using an In-Memory Database](https://www.baeldung.com/spring-jpa-test-in-memory-database) - [Spring Data Annotations](http://www.baeldung.com/spring-data-annotations) -- [A Guide to Spring AbstractRoutingDatasource](https://www.baeldung.com/spring-abstract-routing-data-source) - More articles: [[next -->]](/spring-jpa-2) ### Eclipse Config From 8e800d1a2de6e65ff091b55c3b752d00d543ed34 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Fri, 30 Jun 2023 07:03:31 +0300 Subject: [PATCH 130/170] JAVA-21187 Cleanup un-committed or un-ignored artifacts - Week 21 - 2023 (moved-5) (#14312) Co-authored-by: timis1 --- .gitignore | 1 + .../SingletonUnitTest.java | 33 +++++++++++++--- .../readresolvevsreadobject/UserUnitTest.java | 38 +++++++++++++++---- .../FileProcessorIntegrationTest.java | 9 ++++- 4 files changed, 67 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index b731787052..d22c792f43 100644 --- a/.gitignore +++ b/.gitignore @@ -70,6 +70,7 @@ jmeter/src/main/resources/*-JMeter*.csv jmeter/src/main/resources/*ReportsDashboard*.csv jmeter/src/main/resources/dashboard/*ReportsDashboard*.csv jmeter/src/main/resources/*FileExtractionExample.csv +jmeter/src/main/resources/*_Summary-Report.csv ninja/devDb.mv.db diff --git a/core-java-modules/core-java-serialization/src/test/java/com/baeldung/readresolvevsreadobject/SingletonUnitTest.java b/core-java-modules/core-java-serialization/src/test/java/com/baeldung/readresolvevsreadobject/SingletonUnitTest.java index d5133ae976..3d233327e3 100644 --- a/core-java-modules/core-java-serialization/src/test/java/com/baeldung/readresolvevsreadobject/SingletonUnitTest.java +++ b/core-java-modules/core-java-serialization/src/test/java/com/baeldung/readresolvevsreadobject/SingletonUnitTest.java @@ -1,47 +1,70 @@ package com.baeldung.readresolvevsreadobject; +import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; + +import org.junit.After; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; public class SingletonUnitTest { + private static final String SINGLETON_SER = "singleton.ser"; + + @After + public void tearDown() { + final File file = new File(SINGLETON_SER); + if (file.exists()) { + file.deleteOnExit(); + } + } + @Test public void testSingletonObj_withNoReadResolve() throws ClassNotFoundException, IOException { // Serialization - FileOutputStream fos = new FileOutputStream("singleton.ser"); + FileOutputStream fos = new FileOutputStream(SINGLETON_SER); ObjectOutputStream oos = new ObjectOutputStream(fos); Singleton actualSingletonObject = Singleton.getInstance(); oos.writeObject(actualSingletonObject); // Deserialization Singleton deserializedSingletonObject = null; - FileInputStream fis = new FileInputStream("singleton.ser"); + FileInputStream fis = new FileInputStream(SINGLETON_SER); ObjectInputStream ois = new ObjectInputStream(fis); deserializedSingletonObject = (Singleton) ois.readObject(); // remove readResolve() from Singleton class and uncomment this to test. //assertNotEquals(actualSingletonObject.hashCode(), deserializedSingletonObject.hashCode()); + + fos.close(); + oos.close(); + fis.close(); + ois.close(); } @Test public void testSingletonObj_withCustomReadResolve() throws ClassNotFoundException, IOException { // Serialization - FileOutputStream fos = new FileOutputStream("singleton.ser"); + FileOutputStream fos = new FileOutputStream(SINGLETON_SER); ObjectOutputStream oos = new ObjectOutputStream(fos); Singleton actualSingletonObject = Singleton.getInstance(); oos.writeObject(actualSingletonObject); // Deserialization - Singleton deserializedSingletonObject = null; - FileInputStream fis = new FileInputStream("singleton.ser"); + Singleton deserializedSingletonObject; + FileInputStream fis = new FileInputStream(SINGLETON_SER); ObjectInputStream ois = new ObjectInputStream(fis); deserializedSingletonObject = (Singleton) ois.readObject(); assertEquals(actualSingletonObject.hashCode(), deserializedSingletonObject.hashCode()); + + fos.close(); + oos.close(); + fis.close(); + ois.close(); } } diff --git a/core-java-modules/core-java-serialization/src/test/java/com/baeldung/readresolvevsreadobject/UserUnitTest.java b/core-java-modules/core-java-serialization/src/test/java/com/baeldung/readresolvevsreadobject/UserUnitTest.java index ffd56d67e9..cd07fd2bc7 100644 --- a/core-java-modules/core-java-serialization/src/test/java/com/baeldung/readresolvevsreadobject/UserUnitTest.java +++ b/core-java-modules/core-java-serialization/src/test/java/com/baeldung/readresolvevsreadobject/UserUnitTest.java @@ -1,52 +1,74 @@ package com.baeldung.readresolvevsreadobject; +import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; + +import org.junit.After; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; public class UserUnitTest { + private static final String USER_SER = "user.ser"; + + @After + public void tearDown() { + final File file = new File(USER_SER); + if (file.exists()) { + file.deleteOnExit(); + } + } + @Test - public void testDeserializeObj_withOverriddenReadObject() - throws ClassNotFoundException, IOException { + public void testDeserializeObj_withOverriddenReadObject() throws ClassNotFoundException, IOException { // Serialization - FileOutputStream fos = new FileOutputStream("user.ser"); + FileOutputStream fos = new FileOutputStream(USER_SER); ObjectOutputStream oos = new ObjectOutputStream(fos); User acutalObject = new User("Sachin", "Kumar"); oos.writeObject(acutalObject); // Deserialization - User deserializedUser = null; - FileInputStream fis = new FileInputStream("user.ser"); + User deserializedUser; + FileInputStream fis = new FileInputStream(USER_SER); ObjectInputStream ois = new ObjectInputStream(fis); deserializedUser = (User) ois.readObject(); assertNotEquals(deserializedUser.hashCode(), acutalObject.hashCode()); assertEquals(deserializedUser.getUserName(), "Sachin"); assertEquals(deserializedUser.getPassword(), "Kumar"); + + fos.close(); + oos.close(); + fis.close(); + ois.close(); } @Test public void testDeserializeObj_withDefaultReadObject() throws ClassNotFoundException, IOException { // Serialization - FileOutputStream fos = new FileOutputStream("user.ser"); + FileOutputStream fos = new FileOutputStream(USER_SER); ObjectOutputStream oos = new ObjectOutputStream(fos); User acutalObject = new User("Sachin", "Kumar"); oos.writeObject(acutalObject); // Deserialization - User deserializedUser = null; - FileInputStream fis = new FileInputStream("user.ser"); + User deserializedUser; + FileInputStream fis = new FileInputStream(USER_SER); ObjectInputStream ois = new ObjectInputStream(fis); deserializedUser = (User) ois.readObject(); assertNotEquals(deserializedUser.hashCode(), acutalObject.hashCode()); assertEquals(deserializedUser.getUserName(), "Sachin"); // remove readObject() from User class and uncomment this to test. //assertEquals(deserializedUser.getPassword(), "xyzKumar"); + + fos.close(); + oos.close(); + fis.close(); + ois.close(); } } diff --git a/messaging-modules/apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorIntegrationTest.java b/messaging-modules/apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorIntegrationTest.java index bc5de17537..e4390a95e5 100644 --- a/messaging-modules/apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorIntegrationTest.java +++ b/messaging-modules/apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorIntegrationTest.java @@ -5,6 +5,7 @@ import java.io.File; import org.apache.camel.CamelContext; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.impl.DefaultCamelContext; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; @@ -33,12 +34,18 @@ public class FileProcessorIntegrationTest { file2.createNewFile(); } + @After + public void tearDown() { + cleanFolder(new File(SOURCE_FOLDER)); + cleanFolder(new File(DESTINATION_FOLDER)); + } + private void cleanFolder(File folder) { File[] files = folder.listFiles(); if (files != null) { for (File file : files) { if (file.isFile()) { - file.delete(); + file.deleteOnExit(); } } } From 673673cad8d7e045e15eeca60447c6c89167aaaa Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Fri, 30 Jun 2023 12:49:14 +0200 Subject: [PATCH 131/170] JAVA-21601 | Using oracle Starter instead of Multiple dependencies. (#14326) --- .../spring-boot-persistence-2/pom.xml | 17 ++++------------- ...aclePoolingApplicationOracleUCPLiveTest.java | 5 ++--- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/persistence-modules/spring-boot-persistence-2/pom.xml b/persistence-modules/spring-boot-persistence-2/pom.xml index 260c558875..6bca6df2b9 100644 --- a/persistence-modules/spring-boot-persistence-2/pom.xml +++ b/persistence-modules/spring-boot-persistence-2/pom.xml @@ -111,19 +111,10 @@ hsqldb - com.oracle.database.jdbc - ojdbc8 - ${oracle-database.version} - - - com.oracle.database.ha - ons - ${oracle-database.version} - - - com.oracle.database.jdbc - ucp - ${oracle-database.version} + com.oracle.database.spring + oracle-spring-boot-starter-ucp + 3.1.0 + pom diff --git a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleUCPLiveTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleUCPLiveTest.java index aa448bc44a..6ef780fcef 100644 --- a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleUCPLiveTest.java +++ b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/spring/oracle/pooling/SpringOraclePoolingApplicationOracleUCPLiveTest.java @@ -15,7 +15,7 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes = {SpringOraclePoolingApplication.class}) @ActiveProfiles({"oracle-pooling-basic"}) -@TestPropertySource(properties = "spring.datasource.type=oracle.ucp.jdbc.UCPDataSource") +@TestPropertySource(properties = "spring.datasource.type=oracle.ucp.jdbc.PoolDataSource") public class SpringOraclePoolingApplicationOracleUCPLiveTest { @Autowired @@ -23,8 +23,7 @@ public class SpringOraclePoolingApplicationOracleUCPLiveTest { @Test public void givenOracleUCPConfiguration_thenBuildsOraclePoolDataSource() { - assertTrue(dataSource instanceof oracle.ucp.jdbc.UCPDataSource); + assertTrue(dataSource instanceof oracle.ucp.jdbc.PoolDataSource); } - } From 4a2c365472312877ce76936e00c40fc8bee44f15 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Fri, 30 Jun 2023 16:37:25 +0530 Subject: [PATCH 132/170] JAVA-22625: Changes made for formatting the pom.xml (#14329) --- gcp-firebase/pom.xml | 1 - guest/memory-leaks/pom.xml | 5 +- image-compressing/pom.xml | 4 +- java-jdi/pom.xml | 1 - jaxb/pom.xml | 2 +- jhipster-6/pom.xml | 5 +- .../jhipster-microservice/pom.xml | 5 +- jhipster-modules/jhipster-monolithic/pom.xml | 25 ++++---- jhipster-modules/jhipster-uaa/gateway/pom.xml | 40 +++++++------ jhipster-modules/jhipster-uaa/pom.xml | 11 ++-- jhipster-modules/jhipster-uaa/quotes/pom.xml | 40 +++++++------ jhipster-modules/jhipster-uaa/uaa/pom.xml | 40 +++++++------ jhipster-modules/pom.xml | 11 ++-- json-modules/gson-2/pom.xml | 4 +- libraries-http-2/pom.xml | 34 +++++------ libraries-transform/pom.xml | 2 +- logging-modules/log4j2/pom.xml | 1 - .../maven-pom-types/effective-pom.xml | 4 +- messaging-modules/pom.xml | 2 +- messaging-modules/postgres-notify/pom.xml | 59 +++++++++---------- messaging-modules/rabbitmq/pom.xml | 1 - microservices-modules/rest-express/pom.xml | 1 - 22 files changed, 152 insertions(+), 146 deletions(-) diff --git a/gcp-firebase/pom.xml b/gcp-firebase/pom.xml index 10a899f370..c2dbfb813f 100644 --- a/gcp-firebase/pom.xml +++ b/gcp-firebase/pom.xml @@ -18,7 +18,6 @@ ${firebase-admin.version} - org.springframework.boot spring-boot-starter-web diff --git a/guest/memory-leaks/pom.xml b/guest/memory-leaks/pom.xml index 0712e0627d..42bb71617d 100644 --- a/guest/memory-leaks/pom.xml +++ b/guest/memory-leaks/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 memory-leaks 0.0.1-SNAPSHOT diff --git a/image-compressing/pom.xml b/image-compressing/pom.xml index 99cdd65647..8e79cdcc2a 100644 --- a/image-compressing/pom.xml +++ b/image-compressing/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 image-compressing diff --git a/java-jdi/pom.xml b/java-jdi/pom.xml index dded13896f..aad2f7cfff 100644 --- a/java-jdi/pom.xml +++ b/java-jdi/pom.xml @@ -41,7 +41,6 @@ - 17 17 diff --git a/jaxb/pom.xml b/jaxb/pom.xml index ac448d2d62..64a01600df 100644 --- a/jaxb/pom.xml +++ b/jaxb/pom.xml @@ -59,7 +59,7 @@ - + diff --git a/jhipster-6/pom.xml b/jhipster-6/pom.xml index b3c5e58319..f2406d1bdb 100644 --- a/jhipster-6/pom.xml +++ b/jhipster-6/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 com.baeldung.jhipster jhipster-6 diff --git a/jhipster-modules/jhipster-microservice/pom.xml b/jhipster-modules/jhipster-microservice/pom.xml index ae58ad2203..7c9ea3f15f 100644 --- a/jhipster-modules/jhipster-microservice/pom.xml +++ b/jhipster-modules/jhipster-microservice/pom.xml @@ -1,12 +1,13 @@ - 4.0.0 jhipster-microservice jhipster-microservice pom - + jhipster-modules com.baeldung.jhipster 1.0.0-SNAPSHOT diff --git a/jhipster-modules/jhipster-monolithic/pom.xml b/jhipster-modules/jhipster-monolithic/pom.xml index ac483fdae6..fbcee8f1ff 100644 --- a/jhipster-modules/jhipster-monolithic/pom.xml +++ b/jhipster-modules/jhipster-monolithic/pom.xml @@ -1,9 +1,10 @@ - 4.0.0 jhipster-monolithic war - jhipster-monolithic + jhipster-monolithic JHipster Monolithic Application @@ -87,7 +88,7 @@ io.dropwizard.metrics metrics-annotation - + io.dropwizard.metrics metrics-core @@ -95,15 +96,15 @@ io.dropwizard.metrics metrics-json - + io.dropwizard.metrics metrics-jvm - + io.dropwizard.metrics metrics-servlet - + io.dropwizard.metrics metrics-servlets @@ -315,7 +316,7 @@ - + @@ -329,7 +330,7 @@ - + @@ -547,9 +548,9 @@ src/main/resources/config/liquibase/changelog/${maven.build.timestamp}_changelog.xml org.h2.Driver jdbc:h2:file:./target/h2db/db/baeldung - + baeldung - + hibernate:spring:com.baeldung.domain?dialect=org.hibernate.dialect.H2Dialect&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy true debug @@ -913,8 +914,8 @@ v6.10.0 4.3.0 - - + + ${project.build.directory}/test-results 0.0.20 diff --git a/jhipster-modules/jhipster-uaa/gateway/pom.xml b/jhipster-modules/jhipster-uaa/gateway/pom.xml index 536b847237..13652575cd 100644 --- a/jhipster-modules/jhipster-uaa/gateway/pom.xml +++ b/jhipster-modules/jhipster-uaa/gateway/pom.xml @@ -1,5 +1,7 @@ - + 4.0.0 @@ -852,21 +854,21 @@ pl.project13.maven git-commit-id-plugin ${git-commit-id-plugin.version} - - - - revision - - - - - false - true - - ^git.commit.id.abbrev$ - ^git.commit.id.describe$ - ^git.branch$ - + + + + revision + + + + + false + true + + ^git.commit.id.abbrev$ + ^git.commit.id.describe$ + ^git.branch$ + @@ -1026,9 +1028,9 @@ jdt_apt false - - - + + + 2.0.25 diff --git a/jhipster-modules/jhipster-uaa/pom.xml b/jhipster-modules/jhipster-uaa/pom.xml index b90b59047d..7c60f95e28 100644 --- a/jhipster-modules/jhipster-uaa/pom.xml +++ b/jhipster-modules/jhipster-uaa/pom.xml @@ -1,12 +1,13 @@ - 4.0.0 jhipster-uaa jhipster-uaa pom - + jhipster-modules com.baeldung.jhipster 1.0.0-SNAPSHOT @@ -15,7 +16,7 @@ uaa gateway - quotes - - + quotes + + diff --git a/jhipster-modules/jhipster-uaa/quotes/pom.xml b/jhipster-modules/jhipster-uaa/quotes/pom.xml index d922be10c2..2a3c550071 100644 --- a/jhipster-modules/jhipster-uaa/quotes/pom.xml +++ b/jhipster-modules/jhipster-uaa/quotes/pom.xml @@ -1,5 +1,7 @@ - + 4.0.0 @@ -674,21 +676,21 @@ pl.project13.maven git-commit-id-plugin ${git-commit-id-plugin.version} - - - - revision - - - - - false - true - - ^git.commit.id.abbrev$ - ^git.commit.id.describe$ - ^git.branch$ - + + + + revision + + + + + false + true + + ^git.commit.id.abbrev$ + ^git.commit.id.describe$ + ^git.branch$ + @@ -846,9 +848,9 @@ jdt_apt false - - - + + + 2.0.25 diff --git a/jhipster-modules/jhipster-uaa/uaa/pom.xml b/jhipster-modules/jhipster-uaa/uaa/pom.xml index a43da9c366..42802b6040 100644 --- a/jhipster-modules/jhipster-uaa/uaa/pom.xml +++ b/jhipster-modules/jhipster-uaa/uaa/pom.xml @@ -1,5 +1,7 @@ - + 4.0.0 jhipster-uaa @@ -673,21 +675,21 @@ pl.project13.maven git-commit-id-plugin ${git-commit-id-plugin.version} - - - - revision - - - - - false - true - - ^git.commit.id.abbrev$ - ^git.commit.id.describe$ - ^git.branch$ - + + + + revision + + + + + false + true + + ^git.commit.id.abbrev$ + ^git.commit.id.describe$ + ^git.branch$ + @@ -847,9 +849,9 @@ jdt_apt false - - - + + + 2.0.25 diff --git a/jhipster-modules/pom.xml b/jhipster-modules/pom.xml index 789666ffb6..1e11d97f40 100644 --- a/jhipster-modules/pom.xml +++ b/jhipster-modules/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 com.baeldung.jhipster @@ -9,8 +10,8 @@ pom - + parent-boot-1 com.baeldung 0.0.1-SNAPSHOT @@ -55,7 +56,7 @@ jhipster-monolithic jhipster-microservice - jhipster-uaa - + jhipster-uaa + diff --git a/json-modules/gson-2/pom.xml b/json-modules/gson-2/pom.xml index aa451bdeed..c3935d5721 100644 --- a/json-modules/gson-2/pom.xml +++ b/json-modules/gson-2/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 gson-2 gson-2 diff --git a/libraries-http-2/pom.xml b/libraries-http-2/pom.xml index 77498dd248..fa3b6534db 100644 --- a/libraries-http-2/pom.xml +++ b/libraries-http-2/pom.xml @@ -88,25 +88,25 @@ ${mockito.version} test - - org.jmockit - jmockit - ${jmockit.version} - + + org.jmockit + jmockit + ${jmockit.version} + - + - - - maven-surefire-plugin - - - -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar - - - - - + + + maven-surefire-plugin + + + -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar + + + + + 4.9.1 diff --git a/libraries-transform/pom.xml b/libraries-transform/pom.xml index 0dd7ebcfae..f59682622d 100644 --- a/libraries-transform/pom.xml +++ b/libraries-transform/pom.xml @@ -17,7 +17,7 @@ spoon-core ${spoon-core.version} - + diff --git a/logging-modules/log4j2/pom.xml b/logging-modules/log4j2/pom.xml index da2984442c..6ea491e28b 100644 --- a/logging-modules/log4j2/pom.xml +++ b/logging-modules/log4j2/pom.xml @@ -80,7 +80,6 @@ - 2.9.0 2.19.0 diff --git a/maven-modules/maven-pom-types/effective-pom.xml b/maven-modules/maven-pom-types/effective-pom.xml index a2f8460809..d8a4578402 100644 --- a/maven-modules/maven-pom-types/effective-pom.xml +++ b/maven-modules/maven-pom-types/effective-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 maven-pom-types diff --git a/messaging-modules/pom.xml b/messaging-modules/pom.xml index 6fd14f7c64..27524637ab 100644 --- a/messaging-modules/pom.xml +++ b/messaging-modules/pom.xml @@ -22,7 +22,7 @@ spring-amqp spring-apache-camel spring-jms - postgres-notify + postgres-notify \ No newline at end of file diff --git a/messaging-modules/postgres-notify/pom.xml b/messaging-modules/postgres-notify/pom.xml index 174d66b7f5..876519f40c 100644 --- a/messaging-modules/postgres-notify/pom.xml +++ b/messaging-modules/postgres-notify/pom.xml @@ -42,37 +42,36 @@ lombok true - + + + 1.8 + + + + + org.springframework.boot + spring-boot-maven-plugin + + + - - 1.8 - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - - instance1 - - - - org.springframework.boot - spring-boot-maven-plugin - - -Dserver.port=8081 - - - - - - - + + + instance1 + + + + org.springframework.boot + spring-boot-maven-plugin + + -Dserver.port=8081 + + + + + + + \ No newline at end of file diff --git a/messaging-modules/rabbitmq/pom.xml b/messaging-modules/rabbitmq/pom.xml index 69476ba31b..2add4b8d35 100644 --- a/messaging-modules/rabbitmq/pom.xml +++ b/messaging-modules/rabbitmq/pom.xml @@ -13,7 +13,6 @@ 0.0.1-SNAPSHOT - diff --git a/microservices-modules/rest-express/pom.xml b/microservices-modules/rest-express/pom.xml index e92607aec7..da697fdc56 100644 --- a/microservices-modules/rest-express/pom.xml +++ b/microservices-modules/rest-express/pom.xml @@ -24,7 +24,6 @@ rest-express jar - com.strategicgains From c6a627972443de7ff9a2b39921e7e835de5ea744 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Fri, 30 Jun 2023 16:37:55 +0530 Subject: [PATCH 133/170] JAVA-22625: Changes made for module Q to S formatting the pom.xml (#14330) --- quarkus-modules/quarkus-funqy/pom.xml | 5 +++-- spring-boot-modules/pom.xml | 2 +- .../spring-boot-3-test-pitfalls/pom.xml | 1 - .../spring-boot-basic-customization/pom.xml | 4 ++-- .../spring-boot-keycloak-2/pom.xml | 1 - .../spring-boot-libraries-2/pom.xml | 4 ++-- spring-boot-modules/spring-boot-mvc-4/pom.xml | 10 +++++----- .../spring-boot-mvc-legacy/pom.xml | 2 +- spring-boot-modules/spring-boot-redis/pom.xml | 3 ++- .../spring-boot-springdoc-2/pom.xml | 4 ++-- .../spring-boot-swagger-springfox/pom.xml | 2 +- spring-cloud-modules/pom.xml | 6 +++--- .../spring-cloud-azure/pom.xml | 1 - .../data-flow-server/pom.xml | 2 +- .../spring-cloud-open-telemetry2/pom.xml | 3 ++- spring-security-modules/pom.xml | 2 +- .../reactive-resource-server/pom.xml | 3 ++- .../servlet-resource-server/pom.xml | 3 ++- .../spring-security-saml2/pom.xml | 3 ++- .../spring-security-web-react/pom.xml | 1 - spring-web-modules/spring-mvc-basics/pom.xml | 2 +- spring-web-modules/spring-mvc-java-3/pom.xml | 4 ++-- spring-web-modules/spring-rest-http-2/pom.xml | 20 +++++++++---------- 23 files changed, 45 insertions(+), 43 deletions(-) diff --git a/quarkus-modules/quarkus-funqy/pom.xml b/quarkus-modules/quarkus-funqy/pom.xml index 39a6151c69..f5ba9d08d8 100644 --- a/quarkus-modules/quarkus-funqy/pom.xml +++ b/quarkus-modules/quarkus-funqy/pom.xml @@ -1,5 +1,6 @@ - - + 4.0.0 diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 36a25b0005..0417d83c61 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -75,7 +75,7 @@ spring-boot-swagger-keycloak spring-boot-testing spring-boot-testing-2 - spring-boot-testing-spock + spring-boot-testing-spock spring-boot-vue spring-boot-actuator spring-boot-data-2 diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/pom.xml b/spring-boot-modules/spring-boot-3-test-pitfalls/pom.xml index 21a7e5f702..f3ed67e87b 100644 --- a/spring-boot-modules/spring-boot-3-test-pitfalls/pom.xml +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/pom.xml @@ -83,5 +83,4 @@ 3.0.0-M7 - diff --git a/spring-boot-modules/spring-boot-basic-customization/pom.xml b/spring-boot-modules/spring-boot-basic-customization/pom.xml index 310da40688..20b2980f29 100644 --- a/spring-boot-modules/spring-boot-basic-customization/pom.xml +++ b/spring-boot-modules/spring-boot-basic-customization/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-boot-basic-customization spring-boot-basic-customization diff --git a/spring-boot-modules/spring-boot-keycloak-2/pom.xml b/spring-boot-modules/spring-boot-keycloak-2/pom.xml index c5bb97fb21..4c4f403776 100644 --- a/spring-boot-modules/spring-boot-keycloak-2/pom.xml +++ b/spring-boot-modules/spring-boot-keycloak-2/pom.xml @@ -77,7 +77,6 @@ ${keycloak.version} - diff --git a/spring-boot-modules/spring-boot-libraries-2/pom.xml b/spring-boot-modules/spring-boot-libraries-2/pom.xml index ce9157da50..1734a7d5ac 100644 --- a/spring-boot-modules/spring-boot-libraries-2/pom.xml +++ b/spring-boot-modules/spring-boot-libraries-2/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-boot-libraries-2 diff --git a/spring-boot-modules/spring-boot-mvc-4/pom.xml b/spring-boot-modules/spring-boot-mvc-4/pom.xml index 800ca8e31e..dbbb03ad0e 100644 --- a/spring-boot-modules/spring-boot-mvc-4/pom.xml +++ b/spring-boot-modules/spring-boot-mvc-4/pom.xml @@ -32,11 +32,11 @@ spring-boot-devtools true - - org.springdoc - springdoc-openapi-ui - ${springdoc.version} - + + org.springdoc + springdoc-openapi-ui + ${springdoc.version} + com.fasterxml.jackson.core jackson-databind diff --git a/spring-boot-modules/spring-boot-mvc-legacy/pom.xml b/spring-boot-modules/spring-boot-mvc-legacy/pom.xml index b5422b12bd..981ba057a8 100644 --- a/spring-boot-modules/spring-boot-mvc-legacy/pom.xml +++ b/spring-boot-modules/spring-boot-mvc-legacy/pom.xml @@ -23,7 +23,7 @@ org.springframework.boot spring-boot-starter-data-jpa - + org.springframework.boot spring-boot-starter-data-rest diff --git a/spring-boot-modules/spring-boot-redis/pom.xml b/spring-boot-modules/spring-boot-redis/pom.xml index 4467e38dbe..e0ae5d388f 100644 --- a/spring-boot-modules/spring-boot-redis/pom.xml +++ b/spring-boot-modules/spring-boot-redis/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 com.baelding diff --git a/spring-boot-modules/spring-boot-springdoc-2/pom.xml b/spring-boot-modules/spring-boot-springdoc-2/pom.xml index 5aff9ec4fa..1ea52667c5 100644 --- a/spring-boot-modules/spring-boot-springdoc-2/pom.xml +++ b/spring-boot-modules/spring-boot-springdoc-2/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-boot-springdoc-2 0.0.1-SNAPSHOT diff --git a/spring-boot-modules/spring-boot-swagger-springfox/pom.xml b/spring-boot-modules/spring-boot-swagger-springfox/pom.xml index 8efe03bc72..a856253f07 100644 --- a/spring-boot-modules/spring-boot-swagger-springfox/pom.xml +++ b/spring-boot-modules/spring-boot-swagger-springfox/pom.xml @@ -31,7 +31,7 @@ ${guava.version} - + 3.0.0 diff --git a/spring-cloud-modules/pom.xml b/spring-cloud-modules/pom.xml index 1ddc2f9015..c4b89d6db0 100644 --- a/spring-cloud-modules/pom.xml +++ b/spring-cloud-modules/pom.xml @@ -32,7 +32,7 @@ spring-cloud-aws spring-cloud-consul spring-cloud-zuul-eureka-integration - + spring-cloud-kubernetes spring-cloud-open-service-broker spring-cloud-archaius @@ -43,7 +43,7 @@ spring-cloud-zuul spring-cloud-zuul-fallback spring-cloud-ribbon-retry - + spring-cloud-eureka-self-preservation spring-cloud-openfeign spring-cloud-netflix-feign @@ -52,7 +52,7 @@ spring-cloud-dapr spring-cloud-docker spring-cloud-bus - + spring-cloud-sleuth spring-cloud-open-telemetry spring-cloud-azure diff --git a/spring-cloud-modules/spring-cloud-azure/pom.xml b/spring-cloud-modules/spring-cloud-azure/pom.xml index 5153eecc9f..5271ee7e7e 100644 --- a/spring-cloud-modules/spring-cloud-azure/pom.xml +++ b/spring-cloud-modules/spring-cloud-azure/pom.xml @@ -42,7 +42,6 @@ - com.azure.spring diff --git a/spring-cloud-modules/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml b/spring-cloud-modules/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml index 73b5aeb26d..072d4a2de0 100644 --- a/spring-cloud-modules/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml +++ b/spring-cloud-modules/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml @@ -49,7 +49,7 @@ ${byte-buddy.version} test - + org.codehaus.groovy groovy ${groovy.version} diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/pom.xml b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/pom.xml index ecf275fac6..6f11451bfb 100644 --- a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/pom.xml +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 spring-cloud-open-telemetry2 diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml index 2c9a8e3dfe..4fde64bc7a 100644 --- a/spring-security-modules/pom.xml +++ b/spring-security-modules/pom.xml @@ -20,7 +20,7 @@ spring-security-cognito spring-security-core spring-security-core-2 - + spring-security-legacy-oidc spring-security-oauth2 spring-security-oauth2-sso 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 86f73cfdbf..3d5ff0cb69 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 @@ -1,5 +1,6 @@ - 4.0.0 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 271cc7dc18..eb507fc3d3 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 @@ -1,5 +1,6 @@ - 4.0.0 diff --git a/spring-security-modules/spring-security-saml2/pom.xml b/spring-security-modules/spring-security-saml2/pom.xml index 0e92339bc0..6de69fd201 100644 --- a/spring-security-modules/spring-security-saml2/pom.xml +++ b/spring-security-modules/spring-security-saml2/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 diff --git a/spring-security-modules/spring-security-web-react/pom.xml b/spring-security-modules/spring-security-web-react/pom.xml index 93119cbe66..3a519acf09 100644 --- a/spring-security-modules/spring-security-web-react/pom.xml +++ b/spring-security-modules/spring-security-web-react/pom.xml @@ -129,7 +129,6 @@ - diff --git a/spring-web-modules/spring-mvc-basics/pom.xml b/spring-web-modules/spring-mvc-basics/pom.xml index 0f1d423ca2..94f3ac1e9e 100644 --- a/spring-web-modules/spring-mvc-basics/pom.xml +++ b/spring-web-modules/spring-mvc-basics/pom.xml @@ -61,7 +61,7 @@ - 2.3.5 + 2.3.5 \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-java-3/pom.xml b/spring-web-modules/spring-mvc-java-3/pom.xml index 3a49a5f9af..4d669c7e7b 100644 --- a/spring-web-modules/spring-mvc-java-3/pom.xml +++ b/spring-web-modules/spring-mvc-java-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 spring-mvc-java-3 diff --git a/spring-web-modules/spring-rest-http-2/pom.xml b/spring-web-modules/spring-rest-http-2/pom.xml index d83a83c690..88294c7811 100644 --- a/spring-web-modules/spring-rest-http-2/pom.xml +++ b/spring-web-modules/spring-rest-http-2/pom.xml @@ -37,16 +37,16 @@ resilience4j-timelimiter ${resilience4j.version} - - org.springdoc - springdoc-openapi-ui - ${springdoc.version} - - - com.google.guava - guava - ${guava.version} - + + org.springdoc + springdoc-openapi-ui + ${springdoc.version} + + + com.google.guava + guava + ${guava.version} + From cd747f077bf3aa71e3ac2ceb5e2d0028184700fd Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Fri, 30 Jun 2023 16:38:28 +0530 Subject: [PATCH 134/170] Java 22625 S to Z (#14332) * JAVA-22625: Changes made for module T to Z formatting the pom.xml * JAVA-22625: Changes made for module S to Z formatting the pom.xml --- pom.xml | 3 - .../accessing-session-attributes/pom.xml | 168 +++++++++--------- testing-modules/mockito-2/pom.xml | 4 +- testing-modules/testing-techniques/pom.xml | 4 +- xml-2/pom.xml | 1 - 5 files changed, 88 insertions(+), 92 deletions(-) diff --git a/pom.xml b/pom.xml index 3af4c1b6a7..bea9a5a6fa 100644 --- a/pom.xml +++ b/pom.xml @@ -666,7 +666,6 @@ - @@ -894,7 +893,6 @@ reactor-core rsocket - spring-5 spring-5-webflux @@ -1165,7 +1163,6 @@ reactor-core rsocket - spring-5 diff --git a/spring-web-modules/spring-thymeleaf-attributes/accessing-session-attributes/pom.xml b/spring-web-modules/spring-thymeleaf-attributes/accessing-session-attributes/pom.xml index 59bca1ac7e..8c26e9947d 100644 --- a/spring-web-modules/spring-thymeleaf-attributes/accessing-session-attributes/pom.xml +++ b/spring-web-modules/spring-thymeleaf-attributes/accessing-session-attributes/pom.xml @@ -1,95 +1,95 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd"> - 4.0.0 + 4.0.0 - com.baeldung.spring-thymeleaf-attributes.module - accessing-session-attributes - 0.0.1-SNAPSHOT - war - - - com.baeldung.spring-thymeleaf-attributes - spring-thymeleaf-attributes + com.baeldung.spring-thymeleaf-attributes.module + accessing-session-attributes 0.0.1-SNAPSHOT - ../pom.xml - + war - - - jakarta.servlet - jakarta.servlet-api - provided - - - org.springframework.boot - spring-boot-starter-web - - - org.thymeleaf - thymeleaf-spring6 - ${thymeleaf.spring6.version} - - - - org.junit.jupiter - junit-jupiter-engine - ${junit.jupiter.engine.version} - test - - - org.mockito - mockito-core - ${mockito.version} - test - - - org.mockito - mockito-junit-jupiter - ${mockito.version} - test - - - org.junit.jupiter - junit-jupiter-api - ${junit.jupiter.engine.version} - test - + + com.baeldung.spring-thymeleaf-attributes + spring-thymeleaf-attributes + 0.0.1-SNAPSHOT + ../pom.xml + - + + + jakarta.servlet + jakarta.servlet-api + provided + + + org.springframework.boot + spring-boot-starter-web + + + org.thymeleaf + thymeleaf-spring6 + ${thymeleaf.spring6.version} + + + + org.junit.jupiter + junit-jupiter-engine + ${junit.jupiter.engine.version} + test + + + org.mockito + mockito-core + ${mockito.version} + test + + + org.mockito + mockito-junit-jupiter + ${mockito.version} + test + + + org.junit.jupiter + junit-jupiter-api + ${junit.jupiter.engine.version} + test + - - - - src/main/resources - - + - - - org.springframework.boot - spring-boot-maven-plugin - - - -Dfile.encoding="UTF-8" -Xdebug - -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 - - - - - + + + + src/main/resources + + - - com.baeldung.accesing_session_attributes.SpringWebApplicationInitializer - UTF-8 - UTF-8 - UTF-8 - true - true - 5.9.3 - 5.3.1 - 3.1.1.RELEASE - + + + org.springframework.boot + spring-boot-maven-plugin + + + -Dfile.encoding="UTF-8" -Xdebug + -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 + + + + + + + + com.baeldung.accesing_session_attributes.SpringWebApplicationInitializer + UTF-8 + UTF-8 + UTF-8 + true + true + 5.9.3 + 5.3.1 + 3.1.1.RELEASE + \ No newline at end of file diff --git a/testing-modules/mockito-2/pom.xml b/testing-modules/mockito-2/pom.xml index fe7ec0fe7a..0e0f19b6b3 100644 --- a/testing-modules/mockito-2/pom.xml +++ b/testing-modules/mockito-2/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 mockito-2 diff --git a/testing-modules/testing-techniques/pom.xml b/testing-modules/testing-techniques/pom.xml index 5902047aeb..2e34a122ab 100644 --- a/testing-modules/testing-techniques/pom.xml +++ b/testing-modules/testing-techniques/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"> testing-techniques 4.0.0 diff --git a/xml-2/pom.xml b/xml-2/pom.xml index 6b25d66b6a..d56fdd7165 100644 --- a/xml-2/pom.xml +++ b/xml-2/pom.xml @@ -68,7 +68,6 @@ - 2.1.3 2.14.1 From f4d0dfcbbe30cfacf6e7d19699eb0581275c21b1 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Fri, 30 Jun 2023 17:03:46 +0530 Subject: [PATCH 135/170] JAVA-22625 Replaced Junit4 package with Junit5 (#14334) --- .../java/com/baeldung/asciiart/AsciiArtIntegrationTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-console/src/test/java/com/baeldung/asciiart/AsciiArtIntegrationTest.java b/core-java-modules/core-java-console/src/test/java/com/baeldung/asciiart/AsciiArtIntegrationTest.java index a8c42fbeb1..364435e890 100644 --- a/core-java-modules/core-java-console/src/test/java/com/baeldung/asciiart/AsciiArtIntegrationTest.java +++ b/core-java-modules/core-java-console/src/test/java/com/baeldung/asciiart/AsciiArtIntegrationTest.java @@ -1,10 +1,11 @@ package com.baeldung.asciiart; import com.baeldung.asciiart.AsciiArt.Settings; -import org.junit.Test; import java.awt.*; +import org.junit.jupiter.api.Test; + public class AsciiArtIntegrationTest { @Test @@ -12,7 +13,7 @@ public class AsciiArtIntegrationTest { AsciiArt asciiArt = new AsciiArt(); String text = "BAELDUNG"; Settings settings = asciiArt.new Settings(new Font("SansSerif", Font.BOLD, 24), text.length() * 30, 30); // 30 pixel width per character - + asciiArt.drawString(text, "*", settings); } } From 3f9cfa9bebaa97554b21872772bbe61b3f7f4076 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 1 Jul 2023 16:50:32 +0800 Subject: [PATCH 136/170] Update README.md [skip ci] --- core-java-modules/core-java-security-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-security-3/README.md b/core-java-modules/core-java-security-3/README.md index 222834d06b..91f48ff547 100644 --- a/core-java-modules/core-java-security-3/README.md +++ b/core-java-modules/core-java-security-3/README.md @@ -13,4 +13,5 @@ This module contains articles about core Java Security - [Error: “trustAnchors parameter must be non-empty”](https://www.baeldung.com/java-trustanchors-parameter-must-be-non-empty) - [Common Exceptions of Crypto APIs in Java](https://www.baeldung.com/java-crypto-apis-exceptions) - [Hashing With Argon2 in Java](https://www.baeldung.com/java-argon2-hashing) +- [Hex Representation of a SHA-1 Digest of a String in Java](https://www.baeldung.com/java-string-sha1-hexadecimal) - More articles: [[<-- prev]](/core-java-modules/core-java-security-2) From a328fcec3b7d668230842482b6587a5b8b68b67f Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 1 Jul 2023 16:59:56 +0800 Subject: [PATCH 137/170] 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 4365fd12f9..fecbcfb698 100644 --- a/core-java-modules/core-java-arrays-convert/README.md +++ b/core-java-modules/core-java-arrays-convert/README.md @@ -7,3 +7,4 @@ This module contains articles about arrays conversion in Java - [Converting Between Stream and Array in Java](https://www.baeldung.com/java-stream-to-array) - [Convert a Byte Array to a Numeric Representation in Java](https://www.baeldung.com/java-byte-array-to-number) - [Converting a String Array Into an int Array in Java](https://www.baeldung.com/java-convert-string-array-to-int-array) +- [Convert Java Array to Iterable](https://www.baeldung.com/java-array-convert-to-iterable) From bfaba12c089589401577abf47825987e78fffaf5 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 1 Jul 2023 17:03:31 +0800 Subject: [PATCH 138/170] Update README.md [skip ci] --- persistence-modules/spring-data-jpa-repo-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-data-jpa-repo-3/README.md b/persistence-modules/spring-data-jpa-repo-3/README.md index 93cc9379f7..623ac66bb3 100644 --- a/persistence-modules/spring-data-jpa-repo-3/README.md +++ b/persistence-modules/spring-data-jpa-repo-3/README.md @@ -7,4 +7,5 @@ This module contains articles about Spring Data JPA. - [How to Persist a List of String in JPA?](https://www.baeldung.com/java-jpa-persist-string-list) - [Hibernate Natural IDs in Spring Boot](https://www.baeldung.com/spring-boot-hibernate-natural-ids) - [Correct Use of flush() in JPA](https://www.baeldung.com/spring-jpa-flush) +- [Difference Between findBy and findOneBy in Spring Data JPA](https://www.baeldung.com/spring-data-jpa-findby-vs-findoneby) - More articles: [[<-- prev]](../spring-data-jpa-repo-2) From 315b7f3f2b2ec441fc16df2777ad3cadf29078cf Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 1 Jul 2023 17:06:20 +0800 Subject: [PATCH 139/170] Update README.md [skip ci] --- apache-kafka-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apache-kafka-2/README.md b/apache-kafka-2/README.md index 9a5f6e15ae..81239d4a7b 100644 --- a/apache-kafka-2/README.md +++ b/apache-kafka-2/README.md @@ -11,3 +11,4 @@ You can build the project from the command line using: *mvn clean install*, or i - [Get Last N Messages in Apache Kafka Topic](https://www.baeldung.com/java-apache-kafka-get-last-n-messages) - [Is a Key Required as Part of Sending Messages to Kafka?](https://www.baeldung.com/java-kafka-message-key) - [Read Data From the Beginning Using Kafka Consumer API](https://www.baeldung.com/java-kafka-consumer-api-read) +- [Get Partition Count for a Topic in Kafka](https://www.baeldung.com/java-kafka-partition-count-topic) From feb2bd3c8f92b757c62511faab99c7975d2abcbf Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 1 Jul 2023 17:09:10 +0800 Subject: [PATCH 140/170] Update README.md [skip ci] --- jackson-modules/jackson-core/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/jackson-modules/jackson-core/README.md b/jackson-modules/jackson-core/README.md index 73293b1e84..78526c5bca 100644 --- a/jackson-modules/jackson-core/README.md +++ b/jackson-modules/jackson-core/README.md @@ -16,3 +16,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Get all the Keys in a JSON String Using JsonNode](https://www.baeldung.com/java-jsonnode-get-keys) - [Difference Between asText() and toString() in JsonNode](https://www.baeldung.com/java-jsonnode-astext-vs-tostring) - [Deserialize Generic Type with Jackson](https://www.baeldung.com/java-deserialize-generic-type-with-jackson) +- [Setting Default Values to Null Fields in Jackson Mapping](https://www.baeldung.com/java-jackson-mapping-default-values-null-fields) From f9eec5f598509f266d7e1c4d577d97317c996605 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 1 Jul 2023 17:18:27 +0800 Subject: [PATCH 141/170] Update README.md [skip ci] --- core-java-modules/core-java-booleans/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-booleans/README.md b/core-java-modules/core-java-booleans/README.md index fe7068c6f4..9a4c948256 100644 --- a/core-java-modules/core-java-booleans/README.md +++ b/core-java-modules/core-java-booleans/README.md @@ -4,3 +4,4 @@ This module contains articles about Java Booleans. ### Relevant Articles: - [Convert Boolean to String in Java](https://www.baeldung.com/java-convert-boolean-to-string) +- [Difference Between Boolean.TRUE and true in Java](https://www.baeldung.com/java-boolean-true-primitive-vs-constant) From 9ec60c6e803d4e160b724f1af171fba92bfa6c09 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 1 Jul 2023 17:20:41 +0800 Subject: [PATCH 142/170] Update README.md [skip ci] --- core-java-modules/core-java-19/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-19/README.md b/core-java-modules/core-java-19/README.md index 68244d9f91..89ec729ca6 100644 --- a/core-java-modules/core-java-19/README.md +++ b/core-java-modules/core-java-19/README.md @@ -2,3 +2,4 @@ - [Record Patterns in Java 19](https://www.baeldung.com/java-19-record-patterns) - [Structured Concurrency in Java 19](https://www.baeldung.com/java-structured-concurrency) - [Possible Root Causes for High CPU Usage in Java](https://www.baeldung.com/java-high-cpu-usage-causes) +- [The Vector API in Java 19](https://www.baeldung.com/java-vector-api) From a24bbc618751dd45bd3bbc2b6c9b60ad4eaac4de Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 1 Jul 2023 17:31:59 +0800 Subject: [PATCH 143/170] Update README.md [skip ci] --- core-java-modules/core-java-date-operations-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-date-operations-3/README.md b/core-java-modules/core-java-date-operations-3/README.md index 0d36f9c8a2..d0f7ee03be 100644 --- a/core-java-modules/core-java-date-operations-3/README.md +++ b/core-java-modules/core-java-date-operations-3/README.md @@ -6,4 +6,5 @@ This module contains articles about date operations in Java. - [Create Date From Unix Timestamp in Java](https://www.baeldung.com/java-date-unix-timestamp) - [Convert java.util.Date to java.sql.Date](https://www.baeldung.com/java-convert-util-date-to-sql) - [How to Determine Date of the First Day of the Week Using LocalDate in Java](https://www.baeldung.com/java-first-day-of-the-week) +- [Adding One Month to Current Date in Java](https://www.baeldung.com/java-adding-one-month-to-current-date) - [[<-- Prev]](/core-java-modules/core-java-date-operations-2) From 004089182c453c17a5ef43d77af0f2e41f5aebd5 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 1 Jul 2023 17:39:19 +0800 Subject: [PATCH 144/170] Update README.md [skip ci] --- 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 b61937371f..b860ca979d 100644 --- a/core-java-modules/core-java-8-datetime-2/README.md +++ b/core-java-modules/core-java-8-datetime-2/README.md @@ -4,4 +4,5 @@ - [Creating a LocalDate with Values in Java](https://www.baeldung.com/java-creating-localdate-with-values) - [Parsing Date Strings with Varying Formats](https://www.baeldung.com/java-parsing-dates-many-formats) - [How Many Days Are There in a Particular Month of a Given Year?](https://www.baeldung.com/days-particular-month-given-year) +- [Difference Between Instant and LocalDateTime](https://www.baeldung.com/java-instant-vs-localdatetime) - [[<-- Prev]](/core-java-modules/core-java-datetime-java8-1) From 88ca165998a452b12a21b75a0b164c8a8bcda203 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 1 Jul 2023 17:45:15 +0800 Subject: [PATCH 145/170] Update README.md [skip ci] --- libraries-apache-commons-2/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries-apache-commons-2/README.md b/libraries-apache-commons-2/README.md index 7f91a737d5..76105d6ea4 100644 --- a/libraries-apache-commons-2/README.md +++ b/libraries-apache-commons-2/README.md @@ -3,5 +3,5 @@ This module contains articles about Apache Commons libraries. ### Relevant articles - -- More articles: [[<--prev]](../libraries-apache-commons) \ No newline at end of file +- [Extracting a Tar File in Java](https://www.baeldung.com/java-extract-tar-file) +- More articles: [[<--prev]](../libraries-apache-commons) From 8deff81ef91eff6fdb445da2318e0ab751fca4ca Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 1 Jul 2023 17:54:36 +0800 Subject: [PATCH 146/170] Update README.md [skip ci] --- core-java-modules/core-java-date-operations-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-date-operations-3/README.md b/core-java-modules/core-java-date-operations-3/README.md index d0f7ee03be..c87714f38a 100644 --- a/core-java-modules/core-java-date-operations-3/README.md +++ b/core-java-modules/core-java-date-operations-3/README.md @@ -7,4 +7,5 @@ This module contains articles about date operations in Java. - [Convert java.util.Date to java.sql.Date](https://www.baeldung.com/java-convert-util-date-to-sql) - [How to Determine Date of the First Day of the Week Using LocalDate in Java](https://www.baeldung.com/java-first-day-of-the-week) - [Adding One Month to Current Date in Java](https://www.baeldung.com/java-adding-one-month-to-current-date) +- [How to Get Last Day of a Month in Java](https://www.baeldung.com/java-last-day-month) - [[<-- Prev]](/core-java-modules/core-java-date-operations-2) From 3767122ebb2bc5151b80fa2f6eb6cc894d70af60 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 1 Jul 2023 18:06:20 +0800 Subject: [PATCH 147/170] Create README.md [skip ci] --- maven-modules/resume-from/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 maven-modules/resume-from/README.md diff --git a/maven-modules/resume-from/README.md b/maven-modules/resume-from/README.md new file mode 100644 index 0000000000..15f6702fbd --- /dev/null +++ b/maven-modules/resume-from/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Starting the Maven Build From the Point Where It Failed](https://www.baeldung.com/maven-resume-failed-build) From 6b98a133f608f2286915a810be3f3455fb3bed09 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 1 Jul 2023 18:13:54 +0800 Subject: [PATCH 148/170] Update README.md [skip ci] --- jackson-modules/jackson-core/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/jackson-modules/jackson-core/README.md b/jackson-modules/jackson-core/README.md index 78526c5bca..5706acec0a 100644 --- a/jackson-modules/jackson-core/README.md +++ b/jackson-modules/jackson-core/README.md @@ -17,3 +17,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Difference Between asText() and toString() in JsonNode](https://www.baeldung.com/java-jsonnode-astext-vs-tostring) - [Deserialize Generic Type with Jackson](https://www.baeldung.com/java-deserialize-generic-type-with-jackson) - [Setting Default Values to Null Fields in Jackson Mapping](https://www.baeldung.com/java-jackson-mapping-default-values-null-fields) +- [Removing JSON Elements With Jackson](https://www.baeldung.com/java-jackson-remove-json-elements) From b88a0f7a116b8f5f56ea62f6fdbeb5830f1783bc Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 1 Jul 2023 18:22:12 +0800 Subject: [PATCH 149/170] Update README.md [skip ci] --- persistence-modules/spring-boot-persistence-mongodb-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/README.md b/persistence-modules/spring-boot-persistence-mongodb-3/README.md index f0cc97619a..ee6a96397a 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/README.md +++ b/persistence-modules/spring-boot-persistence-mongodb-3/README.md @@ -1,3 +1,4 @@ # Relevant Articles - [How to Insert a HashMap Into MongoDB With Java?](https://www.baeldung.com/java-mongodb-insert-hashmap) +- [MongoDB – Field Level Encryption](https://www.baeldung.com/mongodb-field-level-encryption) - More articles: [[<--prev]](../spring-boot-persistence-mongodb-2) From 15f6789dccc17206b7520db441c89931e009ccbf Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 1 Jul 2023 18:28:28 +0800 Subject: [PATCH 150/170] Update README.md [skip ci] --- jaxb/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/jaxb/README.md b/jaxb/README.md index a471ccd39d..a2be5d9a1e 100644 --- a/jaxb/README.md +++ b/jaxb/README.md @@ -5,3 +5,4 @@ This module contains articles about JAXB. ### Relevant Articles: - [Guide to JAXB](https://www.baeldung.com/jaxb) - [Unmarshalling Dates Using JAXB](https://www.baeldung.com/jaxb-unmarshalling-dates) +- [JAXP vs JAXB: XML Processing APIs Compared](https://www.baeldung.com/java-jaxp-vs-jaxb) From a10323b794997ac6aec6648314a3d6d3bd392717 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 1 Jul 2023 18:36:32 +0800 Subject: [PATCH 151/170] Update README.md [skip ci] --- lombok-modules/lombok-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/lombok-modules/lombok-2/README.md b/lombok-modules/lombok-2/README.md index fcee23fc82..6d3482d800 100644 --- a/lombok-modules/lombok-2/README.md +++ b/lombok-modules/lombok-2/README.md @@ -12,4 +12,5 @@ This module contains articles about Project Lombok. - [Constructor Injection in Spring with Lombok](https://www.baeldung.com/spring-injection-lombok) - [@StandardException Annotation in Lombok](https://www.baeldung.com/lombok-standardexception-annotation) - [Lombok EqualsAndHashCode Annotation](https://www.baeldung.com/java-lombok-equalsandhashcode) +- [Lombok’s @RequiredArgsConstructor Annotation](https://www.baeldung.com/java-lombok-constructor-annotation) - More articles: [[<-- prev]](../lombok) From 3763fc228e42a021b4a00c94c938f58cba7b56f7 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 1 Jul 2023 18:45:22 +0800 Subject: [PATCH 152/170] Update README.md [skip ci] --- patterns-modules/design-patterns-behavioral-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/patterns-modules/design-patterns-behavioral-2/README.md b/patterns-modules/design-patterns-behavioral-2/README.md index db4dd8d719..2afa7b9eb6 100644 --- a/patterns-modules/design-patterns-behavioral-2/README.md +++ b/patterns-modules/design-patterns-behavioral-2/README.md @@ -1,3 +1,4 @@ ### Relevant Articles: - [Memento Design Pattern in Java](https://www.baeldung.com/java-memento-design-pattern) - [Difference Between Fluent Interface and Builder Pattern in Java](https://www.baeldung.com/java-fluent-interface-vs-builder-pattern) +- [Smart Batching in Java](https://www.baeldung.com/java-smart-batching) From dbbd2a0a12872f8599ea312b24ffd02e36352750 Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Sat, 1 Jul 2023 13:24:01 +0200 Subject: [PATCH 153/170] BAEL-6579: completable future's thread pool --- .../threadpool/CustomCompletableFuture.java | 28 +++++++ .../CompletableFutureThreadPoolUnitTest.java | 82 +++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/threadpool/CustomCompletableFuture.java create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/threadpool/CompletableFutureThreadPoolUnitTest.java diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/threadpool/CustomCompletableFuture.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/threadpool/CustomCompletableFuture.java new file mode 100644 index 0000000000..1f3997768e --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/threadpool/CustomCompletableFuture.java @@ -0,0 +1,28 @@ +package com.baeldung.concurrent.completablefuture.threadpool; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; +import java.util.function.Supplier; + +public class CustomCompletableFuture extends CompletableFuture { + private static final Executor executor = Executors.newSingleThreadExecutor(runnable -> new Thread(runnable, "Custom-Single-Thread")); + + public static CustomCompletableFuture supplyAsync(Supplier supplier) { + CustomCompletableFuture future = new CustomCompletableFuture<>(); + executor.execute(() -> { + try { + future.complete(supplier.get()); + } catch (Exception ex) { + future.completeExceptionally(ex); + } + }); + return future; + } + + @Override + public Executor defaultExecutor() { + return executor; + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/threadpool/CompletableFutureThreadPoolUnitTest.java b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/threadpool/CompletableFutureThreadPoolUnitTest.java new file mode 100644 index 0000000000..4f94f36131 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/threadpool/CompletableFutureThreadPoolUnitTest.java @@ -0,0 +1,82 @@ +package com.baeldung.concurrent.completablefuture.threadpool; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + +import org.junit.jupiter.api.Test; + +public class CompletableFutureThreadPoolUnitTest { + + @Test + void whenUsingNonAsync_thenUsesMainThread() { + CompletableFuture name = CompletableFuture.supplyAsync(() -> "Baeldung"); + + CompletableFuture nameLength = name.thenApply(value -> { + printCurrentThread(); + return value.length(); + }); + + assertThat(nameLength).isCompletedWithValue(8); + } + + @Test + void whenUsingNonAsync_thenUsesCallersThread() throws InterruptedException { + Runnable test = () -> { + CompletableFuture name = CompletableFuture.supplyAsync(() -> "Baeldung"); + + CompletableFuture nameLength = name.thenApply(value -> { + printCurrentThread(); + return value.length(); + }); + + assertThat(nameLength).isCompletedWithValue(8); + }; + + new Thread(test, "test-thread").start(); + Thread.sleep(100l); + } + + @Test + void whenUsingAsync_thenUsesCommonPool() { + CompletableFuture name = CompletableFuture.supplyAsync(() -> "Baeldung"); + + CompletableFuture nameLength = name.thenApplyAsync(value -> { + printCurrentThread(); + return value.length(); + }); + + assertThat(nameLength).isCompletedWithValue(8); + } + + @Test + void whenUsingAsync_thenUsesCustomExecutor() { + Executor testExecutor = Executors.newFixedThreadPool(5); + CompletableFuture name = CompletableFuture.supplyAsync(() -> "Baeldung"); + + CompletableFuture nameLength = name.thenApplyAsync(value -> { + printCurrentThread(); + return value.length(); + }, testExecutor); + + assertThat(nameLength).isCompletedWithValue(8); + } + + @Test + void whenOverridingDefaultThreadPool_thenUsesCustomExecutor() { + CompletableFuture name = CustomCompletableFuture.supplyAsync(() -> "Baeldung"); + + CompletableFuture nameLength = name.thenApplyAsync(value -> { + printCurrentThread(); + return value.length(); + }); + + assertThat(nameLength).isCompletedWithValue(8); + } + + private static void printCurrentThread() { + System.out.println(Thread.currentThread().getName()); + } +} From 09c62a2d700bc7b92e110742c676812ae6a28d57 Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Sat, 1 Jul 2023 13:33:40 +0200 Subject: [PATCH 154/170] BAEL-6579: fixing tests --- .../CompletableFutureThreadPoolUnitTest.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/threadpool/CompletableFutureThreadPoolUnitTest.java b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/threadpool/CompletableFutureThreadPoolUnitTest.java index 4f94f36131..9deadfb906 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/threadpool/CompletableFutureThreadPoolUnitTest.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/threadpool/CompletableFutureThreadPoolUnitTest.java @@ -1,8 +1,10 @@ package com.baeldung.concurrent.completablefuture.threadpool; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; import java.util.concurrent.Executors; @@ -11,7 +13,7 @@ import org.junit.jupiter.api.Test; public class CompletableFutureThreadPoolUnitTest { @Test - void whenUsingNonAsync_thenUsesMainThread() { + void whenUsingNonAsync_thenUsesMainThread() throws ExecutionException, InterruptedException { CompletableFuture name = CompletableFuture.supplyAsync(() -> "Baeldung"); CompletableFuture nameLength = name.thenApply(value -> { @@ -19,7 +21,7 @@ public class CompletableFutureThreadPoolUnitTest { return value.length(); }); - assertThat(nameLength).isCompletedWithValue(8); + assertThat(nameLength.get()).isEqualTo(8); } @Test @@ -32,7 +34,11 @@ public class CompletableFutureThreadPoolUnitTest { return value.length(); }); - assertThat(nameLength).isCompletedWithValue(8); + try { + assertThat(nameLength.get()).isEqualTo(8); + } catch (Exception e) { + fail(e.getMessage()); + } }; new Thread(test, "test-thread").start(); @@ -40,7 +46,7 @@ public class CompletableFutureThreadPoolUnitTest { } @Test - void whenUsingAsync_thenUsesCommonPool() { + void whenUsingAsync_thenUsesCommonPool() throws ExecutionException, InterruptedException { CompletableFuture name = CompletableFuture.supplyAsync(() -> "Baeldung"); CompletableFuture nameLength = name.thenApplyAsync(value -> { @@ -48,11 +54,11 @@ public class CompletableFutureThreadPoolUnitTest { return value.length(); }); - assertThat(nameLength).isCompletedWithValue(8); + assertThat(nameLength.get()).isEqualTo(8); } @Test - void whenUsingAsync_thenUsesCustomExecutor() { + void whenUsingAsync_thenUsesCustomExecutor() throws ExecutionException, InterruptedException { Executor testExecutor = Executors.newFixedThreadPool(5); CompletableFuture name = CompletableFuture.supplyAsync(() -> "Baeldung"); @@ -61,11 +67,11 @@ public class CompletableFutureThreadPoolUnitTest { return value.length(); }, testExecutor); - assertThat(nameLength).isCompletedWithValue(8); + assertThat(nameLength.get()).isEqualTo(8); } @Test - void whenOverridingDefaultThreadPool_thenUsesCustomExecutor() { + void whenOverridingDefaultThreadPool_thenUsesCustomExecutor() throws ExecutionException, InterruptedException { CompletableFuture name = CustomCompletableFuture.supplyAsync(() -> "Baeldung"); CompletableFuture nameLength = name.thenApplyAsync(value -> { @@ -73,7 +79,7 @@ public class CompletableFutureThreadPoolUnitTest { return value.length(); }); - assertThat(nameLength).isCompletedWithValue(8); + assertThat(nameLength.get()).isEqualTo(8); } private static void printCurrentThread() { From 5bae0396c0537903372a615ac7d0929ce8939f50 Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Sat, 1 Jul 2023 13:23:45 +0000 Subject: [PATCH 155/170] Upload file and get its URL from Amazon S3 (#14317) * Upload file and get its URL from Amazon S3 * Upload file and get its URL from Amazon S3 * Upload file and get its URL from Amazon S3 --- .../aws-s3/src/main/java/com/baeldung/s3/AWSS3Service.java | 6 ++++++ .../aws-s3/src/main/java/com/baeldung/s3/S3Application.java | 3 +++ 2 files changed, 9 insertions(+) diff --git a/aws-modules/aws-s3/src/main/java/com/baeldung/s3/AWSS3Service.java b/aws-modules/aws-s3/src/main/java/com/baeldung/s3/AWSS3Service.java index 792e41a188..64ed043f98 100644 --- a/aws-modules/aws-s3/src/main/java/com/baeldung/s3/AWSS3Service.java +++ b/aws-modules/aws-s3/src/main/java/com/baeldung/s3/AWSS3Service.java @@ -1,6 +1,7 @@ package com.baeldung.s3; import java.io.File; +import java.net.URL; import java.util.List; import com.amazonaws.services.s3.AmazonS3; @@ -49,6 +50,11 @@ public class AWSS3Service { public PutObjectResult putObject(String bucketName, String key, File file) { return s3client.putObject(bucketName, key, file); } + //uploading object and getting url + public URL getObjectURL(String bucketName, String key, File file) { + s3client.putObject(bucketName, key, file); + return s3client.getUrl(bucketName, key); + } //listing objects public ObjectListing listObjects(String bucketName) { diff --git a/aws-modules/aws-s3/src/main/java/com/baeldung/s3/S3Application.java b/aws-modules/aws-s3/src/main/java/com/baeldung/s3/S3Application.java index fdfb909f73..39a9b0050f 100644 --- a/aws-modules/aws-s3/src/main/java/com/baeldung/s3/S3Application.java +++ b/aws-modules/aws-s3/src/main/java/com/baeldung/s3/S3Application.java @@ -66,6 +66,9 @@ public class S3Application { new File("/Users/user/Document/hello.txt") ); + //uploading object and getting url + awsService.getObjectURL(bucketName, "Document/hello.txt", new File("/Users/user/Document/hello.txt")); + //listing objects ObjectListing objectListing = awsService.listObjects(bucketName); for(S3ObjectSummary os : objectListing.getObjectSummaries()) { From dbaba09fb929ac8938bfb0ccfc04235ef2a75839 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sun, 2 Jul 2023 04:39:05 +0200 Subject: [PATCH 156/170] [file-is-empty] Check If a File is Empty in Java (#14319) * [file-is-empty] Check If a File is Empty in Java * [file-is-empty] adjust code format * [file-is-empty] rename test methods * [file-is-empty] Then->then in method names --- .../emptyfile/CheckFileIsEmptyUnitTest.java | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 core-java-modules/core-java-io-apis-3/src/test/java/com/baeldung/emptyfile/CheckFileIsEmptyUnitTest.java diff --git a/core-java-modules/core-java-io-apis-3/src/test/java/com/baeldung/emptyfile/CheckFileIsEmptyUnitTest.java b/core-java-modules/core-java-io-apis-3/src/test/java/com/baeldung/emptyfile/CheckFileIsEmptyUnitTest.java new file mode 100644 index 0000000000..0603a298f5 --- /dev/null +++ b/core-java-modules/core-java-io-apis-3/src/test/java/com/baeldung/emptyfile/CheckFileIsEmptyUnitTest.java @@ -0,0 +1,71 @@ +package com.baeldung.emptyfile; + +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 java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.NoSuchFileException; +import java.nio.file.Path; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +public class CheckFileIsEmptyUnitTest { + @Test + void whenTheFileIsEmpty_thenFileLengthIsZero(@TempDir Path tempDir) throws IOException { + File emptyFile = tempDir.resolve("an-empty-file.txt") + .toFile(); + emptyFile.createNewFile(); + assertTrue(emptyFile.exists()); + assertEquals(0, emptyFile.length()); + } + + @Test + void whenFileDoesNotExist_thenFileLengthIsZero(@TempDir Path tempDir) { + File aNewFile = tempDir.resolve("a-new-file.txt") + .toFile(); + assertFalse(aNewFile.exists()); + assertEquals(0, aNewFile.length()); + } + + boolean isFileEmpty(File file) { + if (!file.exists()) { + throw new IllegalArgumentException("Cannot check the file length. The file is not found: " + file.getAbsolutePath()); + } + return file.length() == 0; + } + + @Test + void whenTheFileDoesNotExist_thenIsFilesEmptyThrowsException(@TempDir Path tempDir) { + File aNewFile = tempDir.resolve("a-new-file.txt") + .toFile(); + IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> isFileEmpty(aNewFile)); + assertEquals(ex.getMessage(), "Cannot check the file length. The file is not found: " + aNewFile.getAbsolutePath()); + } + + @Test + void whenTheFileIsEmpty_thenIsFilesEmptyReturnsTrue(@TempDir Path tempDir) throws IOException { + File emptyFile = tempDir.resolve("an-empty-file.txt") + .toFile(); + emptyFile.createNewFile(); + assertTrue(isFileEmpty(emptyFile)); + + } + + @Test + void whenTheFileIsEmpty_thenFilesSizeReturnsTrue(@TempDir Path tempDir) throws IOException { + Path emptyFilePath = tempDir.resolve("an-empty-file.txt"); + Files.createFile(emptyFilePath); + assertEquals(0, Files.size(emptyFilePath)); + } + + @Test + void whenTheFileDoesNotExist_thenFilesSizeThrowsException(@TempDir Path tempDir) { + Path aNewFilePath = tempDir.resolve("a-new-file.txt"); + assertThrows(NoSuchFileException.class, () -> Files.size(aNewFilePath)); + } +} \ No newline at end of file From b119316bf4705f97a68c93bc46406970ec24797b Mon Sep 17 00:00:00 2001 From: Tapan Avasthi Date: Sun, 2 Jul 2023 21:17:44 +0530 Subject: [PATCH 157/170] BAEL-6647: How to handle character encoding in JSON POST Request (#14335) Co-authored-by: Tapan Avasthi --- .../resttemplate/RestTemplateApplication.java | 16 +++++ ...stTemplatePostRequestEncodingLiveTest.java | 59 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/resttemplate/RestTemplateApplication.java create mode 100644 spring-web-modules/spring-resttemplate-2/src/test/java/com/baeldung/resttemplate/postjson/RestTemplatePostRequestEncodingLiveTest.java diff --git a/spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/resttemplate/RestTemplateApplication.java b/spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/resttemplate/RestTemplateApplication.java new file mode 100644 index 0000000000..ca1e141d44 --- /dev/null +++ b/spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/resttemplate/RestTemplateApplication.java @@ -0,0 +1,16 @@ +package com.baeldung.resttemplate; + +import java.util.Collections; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class RestTemplateApplication { + + public static void main(String[] args) { + SpringApplication app = new SpringApplication(RestTemplateApplication.class); + app.setDefaultProperties(Collections.singletonMap("server.servlet.encoding.charset", "ISO-8859-1")); + app.run(args); + } +} diff --git a/spring-web-modules/spring-resttemplate-2/src/test/java/com/baeldung/resttemplate/postjson/RestTemplatePostRequestEncodingLiveTest.java b/spring-web-modules/spring-resttemplate-2/src/test/java/com/baeldung/resttemplate/postjson/RestTemplatePostRequestEncodingLiveTest.java new file mode 100644 index 0000000000..803ab96ba4 --- /dev/null +++ b/spring-web-modules/spring-resttemplate-2/src/test/java/com/baeldung/resttemplate/postjson/RestTemplatePostRequestEncodingLiveTest.java @@ -0,0 +1,59 @@ +package com.baeldung.resttemplate.postjson; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; + +import org.json.JSONException; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.client.RestTemplate; + +import com.baeldung.resttemplate.RestTemplateApplication; +import com.baeldung.resttemplate.web.dto.Person; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = RestTemplateApplication.class) +public class RestTemplatePostRequestEncodingLiveTest { + private static String createPersonUrl; + private static RestTemplate restTemplate; + + @BeforeClass + public static void runBeforeAllTestMethods() throws JSONException { + createPersonUrl = "http://localhost:8080/spring-rest/createPerson"; + restTemplate = new RestTemplate(); + } + + @Test + public void givenJapaneseNameInDataWithoutHeaderEncoding_whenDataIsPostedByPostForObject_thenSaveIncorrectly() { + Person japanese = new Person(100, "関連当"); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity request = new HttpEntity<>(japanese, headers); + + Person person = restTemplate.postForObject(createPersonUrl, request, Person.class); + assertNotNull(person); + assertNotEquals("関連当", person.getName()); + } + + @Test + public void givenJapaneseNameInDataWithHeaderEncoding_whenDataIsPostedByPostForObject_thenSaveCorrectly() { + Person japanese = new Person(100, "関連当"); + + HttpHeaders headers = new HttpHeaders(); + headers.set("Content-type", "application/json;charset=UTF-8"); + HttpEntity request = new HttpEntity<>(japanese, headers); + + Person person = restTemplate.postForObject(createPersonUrl, request, Person.class); + assertNotNull(person); + assertEquals("関連当", person.getName()); + } +} \ No newline at end of file From 8e336ba02080fecaea235875b763c010ddd9551a Mon Sep 17 00:00:00 2001 From: vunamtien Date: Mon, 3 Jul 2023 17:04:44 +0700 Subject: [PATCH 158/170] BAEL-6644-read-zip-entries (#14321) * read zip file entries * add unit test * update test code --- .../baeldung/zipentries/ZipEntryReader.java | 31 ++++++++++++++++++ .../zipentries/ZipEntryReaderTest.java | 17 ++++++++++ .../src/test/resources/zipFile.zip | Bin 0 -> 482 bytes 3 files changed, 48 insertions(+) create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/zipentries/ZipEntryReader.java create mode 100644 core-java-modules/core-java-20/src/test/java/com/baeldung/zipentries/ZipEntryReaderTest.java create mode 100644 core-java-modules/core-java-20/src/test/resources/zipFile.zip diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/zipentries/ZipEntryReader.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/zipentries/ZipEntryReader.java new file mode 100644 index 0000000000..a353837e08 --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/zipentries/ZipEntryReader.java @@ -0,0 +1,31 @@ +package com.baeldung.zipentries; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.Scanner; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +public class ZipEntryReader { + + public static void readZipEntries(String filePath) throws IOException { + try (ZipFile zipFile = new ZipFile(filePath)) { + Enumeration entries = zipFile.entries(); + while (entries.hasMoreElements()) { + ZipEntry entry = entries.nextElement(); + // Check if entry is a directory + if (!entry.isDirectory()) { + // Read and process the entry contents using the inputStream + try (InputStream inputStream = zipFile.getInputStream(entry); + Scanner scanner = new Scanner(inputStream);) { + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + System.out.println(line); + } + } + } + } + } + } +} diff --git a/core-java-modules/core-java-20/src/test/java/com/baeldung/zipentries/ZipEntryReaderTest.java b/core-java-modules/core-java-20/src/test/java/com/baeldung/zipentries/ZipEntryReaderTest.java new file mode 100644 index 0000000000..2eb47ff057 --- /dev/null +++ b/core-java-modules/core-java-20/src/test/java/com/baeldung/zipentries/ZipEntryReaderTest.java @@ -0,0 +1,17 @@ +package com.baeldung.zipentries; + +import org.junit.Test; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class ZipEntryReaderTest { + + @Test + public void givenZipFile_thenReadEntriesAndValidateContent() throws URISyntaxException, IOException { + Path zipFilePath = Paths.get(getClass().getClassLoader().getResource("zipFile.zip").toURI()); + ZipEntryReader.readZipEntries(zipFilePath.toString()); + } +} diff --git a/core-java-modules/core-java-20/src/test/resources/zipFile.zip b/core-java-modules/core-java-20/src/test/resources/zipFile.zip new file mode 100644 index 0000000000000000000000000000000000000000..3fc509651f7fea8700482c899da099cd6ce8aaba GIT binary patch literal 482 zcmWIWW@h1H0D;u1hhZ_SMa?omHVAV9aav|hs-s>>MM+6UX0ZYgm1LwUB literal 0 HcmV?d00001 From de3fc4f21ada9425133ce3c51da61fa5202066bb Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Tue, 4 Jul 2023 05:17:45 -0700 Subject: [PATCH 159/170] BAEL-6626 (#14345) * BALE-6626 Check If a String Contains Non-Alphanumeric Characters in Java * Move patterns to class level. --------- Co-authored-by: parthiv39731 --- .../NonAlphaNumRegexChecker.java | 50 ++++++ .../NonAlphaNumericChecker.java | 49 ++++++ .../NonAlphaNumRegexCheckerUnitTest.java | 117 +++++++++++++ .../NonAlphaNumericCheckerUnitTest.java | 159 ++++++++++++++++++ 4 files changed, 375 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-6/src/main/java/com/baeldung/nonalphanumeric/NonAlphaNumRegexChecker.java create mode 100644 core-java-modules/core-java-string-operations-6/src/main/java/com/baeldung/nonalphanumeric/NonAlphaNumericChecker.java create mode 100644 core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/nonalphanumeric/NonAlphaNumRegexCheckerUnitTest.java create mode 100644 core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/nonalphanumeric/NonAlphaNumericCheckerUnitTest.java diff --git a/core-java-modules/core-java-string-operations-6/src/main/java/com/baeldung/nonalphanumeric/NonAlphaNumRegexChecker.java b/core-java-modules/core-java-string-operations-6/src/main/java/com/baeldung/nonalphanumeric/NonAlphaNumRegexChecker.java new file mode 100644 index 0000000000..2d56213c31 --- /dev/null +++ b/core-java-modules/core-java-string-operations-6/src/main/java/com/baeldung/nonalphanumeric/NonAlphaNumRegexChecker.java @@ -0,0 +1,50 @@ +package com.baeldung.nonalphanumeric; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class NonAlphaNumRegexChecker { + + private static final Pattern PATTERN_NON_ALPHNUM_ANYLANG = Pattern.compile("[^\\p{IsAlphabetic}\\p{IsDigit}]"); + private static final Pattern PATTERN_NON_ALPHNUM_USASCII = Pattern.compile("[^a-zA-Z0-9]+"); + /** + * checks if a non-alphanumeric character is present. this method would return true if + * it comes across a non english or non US-ASCII letter + * + * @param str - String to check for special character + * @return true if special character found else false + */ + public static boolean isNonAlphanumeric(String str) { +// Pattern pattern = Pattern.compile("\\W"); //same as [^a-zA-Z0-9]+ +// Pattern pattern = Pattern.compile("[^a-zA-Z0-9||\\s]+"); //ignores space + Matcher matcher = PATTERN_NON_ALPHNUM_USASCII.matcher(str); + return matcher.find(); + } + + /** + * Checks for non-alphanumeric characters from all language scripts + * + * @param input - String to check for special character + * @return true if special character found else false + */ + public static boolean containsNonAlphanumeric(String input) { +// Pattern pattern = Pattern.compile("[^\\p{Alnum}]", Pattern.UNICODE_CHARACTER_CLASS); //Binary properties + Matcher matcher = PATTERN_NON_ALPHNUM_ANYLANG.matcher(input); + return matcher.find(); + } + + /** + * checks for non-alphanumeric character. it returns true if it detects any character other than the + * specified script argument. example of script - Character.UnicodeScript.GEORGIAN.name() + * + * @param input - String to check for special character + * @param script - language script + * @return true if special character found else false + */ + public static boolean containsNonAlphanumeric(String input, String script) { + String regexScriptClass = "\\p{" + "Is" + script + "}"; + Pattern pattern = Pattern.compile("[^" + regexScriptClass + "\\p{IsDigit}]"); //Binary properties + Matcher matcher = pattern.matcher(input); + return matcher.find(); + } +} diff --git a/core-java-modules/core-java-string-operations-6/src/main/java/com/baeldung/nonalphanumeric/NonAlphaNumericChecker.java b/core-java-modules/core-java-string-operations-6/src/main/java/com/baeldung/nonalphanumeric/NonAlphaNumericChecker.java new file mode 100644 index 0000000000..e9458459eb --- /dev/null +++ b/core-java-modules/core-java-string-operations-6/src/main/java/com/baeldung/nonalphanumeric/NonAlphaNumericChecker.java @@ -0,0 +1,49 @@ +package com.baeldung.nonalphanumeric; + +import org.apache.commons.lang3.StringUtils; + +public class NonAlphaNumericChecker { + /** + * Checks for non-alphanumeric characters in any Unicode Script + * @param str - String to check for special characters + * @return true if special character found else false + */ + public static boolean isNonAlphanumericAnyLangScript(String str) { + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + if (!Character.isLetterOrDigit(c)) { + return true; + } + } + return false; + } + + /** + * checks for special characters,returns false if any character + * found other than the script argument + * @param str - String to check for special characters + * @param script - Language script + * @return true if special character found else false + */ + public static boolean isNonAlphanumericInLangScript(String str, String script) { + + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); +// script e.g., Character.UnicodeScript.of(c).toString().equalsIgnoreCase(Character.UnicodeScript.LATIN.toString()) + if (!Character.UnicodeScript.of(c).toString().equalsIgnoreCase(script) + && !Character.isDigit(c)) { + return true; + } + } + return false; + } + + /** + * checks for special characters in any lang + * @param str - String to check for special characters + * @return true if special character found else false + */ + public static boolean isNonAlphanumericAnyLangScriptV2(String str) { + return !StringUtils.isAlphanumeric(str); + } +} diff --git a/core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/nonalphanumeric/NonAlphaNumRegexCheckerUnitTest.java b/core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/nonalphanumeric/NonAlphaNumRegexCheckerUnitTest.java new file mode 100644 index 0000000000..67d3d3c00c --- /dev/null +++ b/core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/nonalphanumeric/NonAlphaNumRegexCheckerUnitTest.java @@ -0,0 +1,117 @@ +package com.baeldung.nonalphanumeric; + +import org.junit.Test; + +import static org.junit.Assert.*; + + +public class NonAlphaNumRegexCheckerUnitTest { + @Test + public void whenStrLatinOrHasNonAlphaNum_ThenRetTrue() { + //alphabets with special character + String str1 = "W$nder^ful"; + //digits with special character + String str2 = "123$%45"; + //alphabets and digits with special characters + String str3 = "W@nd$r123$%45"; + //Error message + String ERROR_MSG = "Test failed, no alphanumeric char found in "; + + assertTrue(ERROR_MSG + str1, NonAlphaNumRegexChecker.isNonAlphanumeric(str1)); + assertTrue(ERROR_MSG + str2, NonAlphaNumRegexChecker.isNonAlphanumeric(str2)); + assertTrue(ERROR_MSG + str3, NonAlphaNumRegexChecker.isNonAlphanumeric(str3)); + } + + @Test + public void whenStrLatinOrHasNoNonAlphaNum_ThenRetFalse() { + //only alphabets + String str1 = "Wonderful"; + //only digits + String str2 = "12345"; + //mix of alphabet and digit + String str3 = "5Won6der1234"; + //Error message + String ERROR_MSG = "Test failed, non alphanumeric char found in "; + + assertFalse(ERROR_MSG + str1, NonAlphaNumRegexChecker.isNonAlphanumeric(str1)); + assertFalse(ERROR_MSG + str2, NonAlphaNumRegexChecker.isNonAlphanumeric(str2)); + assertFalse(ERROR_MSG + str3, NonAlphaNumRegexChecker.isNonAlphanumeric(str3)); + } + + @Test + public void whenStrNonLatinOrHasNonAlphaNum_ThenRetTrue() { + //special character in Georgian text + String str1 = "##მშვენიერი@"; + //special character with Turkish text + String str2 = "müthiş#$"; + //No special character in Georgian text + String str3 = "მშვენიერი"; + //Error message + String ERROR_MSG = "Test failed, no alphanumeric char found in "; + + assertTrue(ERROR_MSG + str1, NonAlphaNumRegexChecker.isNonAlphanumeric(str1)); + assertTrue(ERROR_MSG + str2, NonAlphaNumRegexChecker.isNonAlphanumeric(str2)); + assertTrue(ERROR_MSG + str3, NonAlphaNumRegexChecker.isNonAlphanumeric(str3)); + } + + @Test + public void whenStrAnyLangOrHasNonAlphaNum_ThenRetTrue() { + //special character in Georgian text + String str1 = "##მშვენიერი@"; + //special character with Turkish text + String str2 = "müthiş#$"; + //Error message + String ERROR_MSG = "Test failed, no alphanumeric char found in "; + + assertTrue(ERROR_MSG + str1, NonAlphaNumRegexChecker.containsNonAlphanumeric(str1)); + assertTrue(ERROR_MSG + str2, NonAlphaNumRegexChecker.containsNonAlphanumeric(str2)); + } + + @Test + public void whenStrAnyLangOrHasNoNonAlphaNum_ThenRetFalse() { + //Georgian text with no special char + String str1 = "მშვენიერი"; + //Turkish text with no special char + String str2 = "müthiş"; + //Latin text with no special char + String str3 = "Wonderful"; + //Error message + String ERROR_MSG = "Test failed, no alphanumeric char found in "; + + assertFalse(ERROR_MSG + str1, NonAlphaNumRegexChecker.containsNonAlphanumeric(str1)); + assertFalse(ERROR_MSG + str2, NonAlphaNumRegexChecker.containsNonAlphanumeric(str2)); + assertFalse(ERROR_MSG + str3, NonAlphaNumRegexChecker.containsNonAlphanumeric(str3)); + } + + @Test + public void givenLang_whenStrHasDiffLangOrHasNonAlphaNum_ThenRetTrue() { + String script1 = Character.UnicodeScript.MYANMAR.name(); //script used for Burmese Lang + //text in Burmese with special char + String str1 = "အံ့ဩ%စ##ရာ"; + //special character and english char in Burmese + String str2 = "အံ့ADFဩစ%ရာ*^"; + //English character in Burmese + String str3 = "အံ့ဩစTရာWon"; + //Error message + String ERROR_MSG = "Test failed, no alphanumeric char found in "; + + assertTrue(ERROR_MSG + str1, NonAlphaNumRegexChecker.containsNonAlphanumeric(str1, script1)); + assertTrue(ERROR_MSG + str2, NonAlphaNumRegexChecker.containsNonAlphanumeric(str2, script1)); + assertTrue(ERROR_MSG + str3, NonAlphaNumRegexChecker.containsNonAlphanumeric(str3, script1)); + } + + @Test + public void givenLang_whenStrHasSameLangOrHasNoNonAlphaNum_ThenRetFalse() { + String script1 = Character.UnicodeScript.MYANMAR.name(); //script used for Burmese Lang + String script2 = Character.UnicodeScript.GREEK.name(); + //text in Burmese + String str1 = "အံ့ဩစရာ"; + //text in Greek + String str2 = "Εκπληκτικός"; + //Error message + String ERROR_MSG = "Test failed, alphanumeric char found in "; + + assertFalse(ERROR_MSG + str1, NonAlphaNumRegexChecker.containsNonAlphanumeric(str1, script1)); + assertFalse(ERROR_MSG + str2, NonAlphaNumRegexChecker.containsNonAlphanumeric(str2, script2)); + } +} diff --git a/core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/nonalphanumeric/NonAlphaNumericCheckerUnitTest.java b/core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/nonalphanumeric/NonAlphaNumericCheckerUnitTest.java new file mode 100644 index 0000000000..3323377bcc --- /dev/null +++ b/core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/nonalphanumeric/NonAlphaNumericCheckerUnitTest.java @@ -0,0 +1,159 @@ +package com.baeldung.nonalphanumeric; + +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class NonAlphaNumericCheckerUnitTest { + @Test + public void whenStrLatinOrHasNonAlphaNum_ThenRetTrue() { + String latin = Character.UnicodeScript.LATIN.name(); + //alphabets with special character + String str1 = "W$nder^ful"; + //digits with special character + String str2 = "123$%45"; + //alphabets and digits with special characters + String str3 = "W@nd$r123$%45"; + //Error message + String ERROR_MSG = "Test failed, no alphanumeric char found in "; + + assertTrue(ERROR_MSG + str1, NonAlphaNumericChecker.isNonAlphanumericInLangScript(str1, latin)); + assertTrue(ERROR_MSG + str2, NonAlphaNumericChecker.isNonAlphanumericInLangScript(str2, latin)); + assertTrue(ERROR_MSG + str3, NonAlphaNumericChecker.isNonAlphanumericInLangScript(str3, latin)); + } + + @Test + public void whenStrLatinOrHasNoNonAlphaNum_ThenRetFalse() { + String latin = Character.UnicodeScript.LATIN.name(); + //only alphabets + String str1 = "Wonderful"; + //only digits + String str2 = "12345"; + //mix of alphabet and digit + String str3 = "5Won6der1234"; + //Error message + String ERROR_MSG = "Test failed, non alphanumeric char found in "; + + assertFalse(ERROR_MSG + str1, NonAlphaNumericChecker.isNonAlphanumericInLangScript(str1, latin)); + assertFalse(ERROR_MSG + str2, NonAlphaNumericChecker.isNonAlphanumericInLangScript(str2, latin)); + assertFalse(ERROR_MSG + str3, NonAlphaNumericChecker.isNonAlphanumericInLangScript(str3, latin)); + } + + @Test + public void whenStrNonLatinOrHasNonAlphaNum_ThenRetTrue() { + String latin = Character.UnicodeScript.LATIN.name(); + //special character in Georgian text + String str1 = "##მშვენიერი@"; + //special character with Turkish text + String str2 = "müthiş#$"; + //No special character in Georgian text + String str3 = "მშვენიერი"; + //Error message + String ERROR_MSG = "Test failed, no alphanumeric char found in "; + + assertTrue(ERROR_MSG + str1, NonAlphaNumericChecker.isNonAlphanumericInLangScript(str1, latin)); + assertTrue(ERROR_MSG + str2, NonAlphaNumericChecker.isNonAlphanumericInLangScript(str2, latin)); + assertTrue(ERROR_MSG + str3, NonAlphaNumericChecker.isNonAlphanumericInLangScript(str3, latin)); + } + + @Test + public void whenStrAnyLangOrHasNonAlphaNum_ThenRetTrue() { + //special character in Georgian text + String str1 = "##მშვენიერი@"; + //special character with Turkish text + String str2 = "müthiş#$"; + //Error message + String ERROR_MSG = "Test failed, no alphanumeric char found in "; + + assertTrue(ERROR_MSG + str1, NonAlphaNumericChecker.isNonAlphanumericAnyLangScript(str1)); + assertTrue(ERROR_MSG + str2, NonAlphaNumericChecker.isNonAlphanumericAnyLangScript(str2)); + } + + @Test + public void whenStrAnyLangOrHasNoNonAlphaNum_ThenRetFalse() { + //Georgian text with no special char + String str1 = "მშვენიერი"; + //Turkish text with no special char + String str2 = "müthiş"; + //Latin text with no special char + String str3 = "Wonderful"; + //Error message + String ERROR_MSG = "Test failed, no alphanumeric char found in "; + + assertFalse(ERROR_MSG + str1, NonAlphaNumericChecker.isNonAlphanumericAnyLangScript(str1)); + assertFalse(ERROR_MSG + str2, NonAlphaNumericChecker.isNonAlphanumericAnyLangScript(str2)); + assertFalse(ERROR_MSG + str3, NonAlphaNumericChecker.isNonAlphanumericAnyLangScript(str3)); + } + + @Test + public void givenLang_whenStrHasDiffLangOrHasNonAlphaNum_ThenRetTrue() { + String script1 = Character.UnicodeScript.MYANMAR.name(); //script used for Burmese Lang + //text in Burmese with special char + String str1 = "အံ့ဩ%စ##ရာ"; + //special character and english char in Burmese + String str2 = "အံ့ADFဩစ%ရာ*^"; + //English character in Burmese + String str3 = "အံ့ဩစTရာWon"; + //Error message + String ERROR_MSG = "Test failed, no alphanumeric char found in "; + + assertTrue(ERROR_MSG + str1, NonAlphaNumericChecker.isNonAlphanumericInLangScript(str1, script1)); + assertTrue(ERROR_MSG + str2, NonAlphaNumericChecker.isNonAlphanumericInLangScript(str2, script1)); + assertTrue(ERROR_MSG + str3, NonAlphaNumericChecker.isNonAlphanumericInLangScript(str3, script1)); + } + + @Test + public void givenLang_whenStrHasSameLangOrHasNoNonAlphaNum_ThenRetFalse() { + String script1 = Character.UnicodeScript.MYANMAR.name(); //script used for Burmese Lang + String script2 = Character.UnicodeScript.GREEK.name(); + //text in Burmese + String str1 = "အံ့ဩစရာ"; + //text in Greek + String str2 = "Εκπληκτικός"; + //Error message + String ERROR_MSG = "Test failed, alphanumeric char found in "; + + assertFalse(ERROR_MSG + str1, NonAlphaNumericChecker.isNonAlphanumericInLangScript(str1, script1)); + assertFalse(ERROR_MSG + str2, NonAlphaNumericChecker.isNonAlphanumericInLangScript(str2, script2)); + } + + @Test + public void givenComLangImpl_whenStrAnyLangOrHasNonAlphaNum_ThenRetTrue() { + //special character in Georgian text + String str1 = "##მშვენიერი@"; + //special character with Turkish text + String str2 = "müthiş#$"; + //Error message + String ERROR_MSG = "Test failed, no alphanumeric char found in "; + + assertTrue(ERROR_MSG + str1, NonAlphaNumericChecker.isNonAlphanumericAnyLangScriptV2(str1)); + assertTrue(ERROR_MSG + str2, NonAlphaNumericChecker.isNonAlphanumericAnyLangScriptV2(str2)); + } + + @Test + public void givenComLangImpl_whenStrAnyLangOrHasNoNonAlphaNum_ThenRetFalse() { + //Georgian text with no special char + String str1 = "მშვენიერი"; + //Turkish text with no special char + String str2 = "müthiş"; + //Latin text with no special char + String str3 = "Wonderful"; + //Burmese in Myanmar script +// String str4 = "အံ့ဩစရာ"; + //only digits + String str5 = "3465"; + //Error message + String ERROR_MSG = "Test failed, alphanumeric char found in "; + + assertFalse(ERROR_MSG + str1, NonAlphaNumericChecker.isNonAlphanumericAnyLangScriptV2(str1)); + assertFalse(ERROR_MSG + str2, NonAlphaNumericChecker.isNonAlphanumericAnyLangScriptV2(str2)); + assertFalse(ERROR_MSG + str3, NonAlphaNumericChecker.isNonAlphanumericAnyLangScriptV2(str3)); + //StringUtils.isAlphanumeric is unable to support supplementary unicode character and hence fails + //assertFalse(ERROR_MSG + str4, NonAlphaNumericChecker.isNonAlphanumericAnyLangScriptV2(str4)); + assertFalse(ERROR_MSG + str5, NonAlphaNumericChecker.isNonAlphanumericAnyLangScriptV2(str5)); + } +} + + + From 1c12d45700330e9812cc3300397e74cecf14c812 Mon Sep 17 00:00:00 2001 From: Shahul Basha <32072554+shahulbasha@users.noreply.github.com> Date: Tue, 4 Jul 2023 08:35:53 -0400 Subject: [PATCH 160/170] BAEL-6633 (#14308) * Deep copy of Arraylist * Deep copy of Arraylist * Deep copy of Arraylist updated as per review --- .../baeldung/deepcopyarraylist/Course.java | 42 +++++++ .../baeldung/deepcopyarraylist/Student.java | 103 ++++++++++++++++++ .../DeepCopyArrayListUnitTest.java | 77 +++++++++++++ 3 files changed, 222 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopyarraylist/Course.java create mode 100644 core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopyarraylist/Student.java create mode 100644 core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/deepcopyarraylist/DeepCopyArrayListUnitTest.java diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopyarraylist/Course.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopyarraylist/Course.java new file mode 100644 index 0000000000..5724be7218 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopyarraylist/Course.java @@ -0,0 +1,42 @@ +package com.baeldung.deepcopyarraylist; + +import java.io.Serializable; + +public class Course implements Serializable, Cloneable { + + private Integer courseId; + private String courseName; + + public Course() { + } + + public Course(Integer courseId, String courseName) { + this.courseId = courseId; + this.courseName = courseName; + } + + public Integer getCourseId() { + return courseId; + } + + public void setCourseId(Integer courseId) { + this.courseId = courseId; + } + + public String getCourseName() { + return courseName; + } + + public void setCourseName(String courseName) { + this.courseName = courseName; + } + + @Override + public Course clone() { + try { + return (Course) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(); + } + } +} diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopyarraylist/Student.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopyarraylist/Student.java new file mode 100644 index 0000000000..fedc9010ab --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopyarraylist/Student.java @@ -0,0 +1,103 @@ +package com.baeldung.deepcopyarraylist; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.commons.lang3.SerializationUtils; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class Student implements Serializable, Cloneable { + + private int studentId; + private String studentName; + private Course course; + + public Student() { + } + + public Student(int studentId, String studentName, Course course) { + this.studentId = studentId; + this.studentName = studentName; + this.course = course; + } + + public Student(Student student) { + this.studentId = student.getStudentId(); + this.studentName = student.getStudentName(); + this.course = new Course(student.getCourse() + .getCourseId(), student.getCourse() + .getCourseName()); + } + + public static Student createDeepCopy(Student student) { + ObjectMapper objectMapper = new ObjectMapper(); + try { + return objectMapper.readValue(objectMapper.writeValueAsString(student), Student.class); + } catch (JsonProcessingException e) { + throw new IllegalArgumentException(e); + } + } + + public static List deepCopyUsingJackson(List students) { + return students.stream() + .map(Student::createDeepCopy) + .collect(Collectors.toList()); + } + + public static List deepCopyUsingCloneable(List students) { + return students.stream() + .map(Student::clone) + .collect(Collectors.toList()); + } + + public static List deepCopyUsingCopyConstructor(List students) { + return students.stream() + .map(Student::new) + .collect(Collectors.toList()); + } + + public static List deepCopyUsingSerialization(List students) { + return students.stream() + .map(SerializationUtils::clone) + .collect(Collectors.toList()); + } + + public int getStudentId() { + return studentId; + } + + public void setStudentId(int studentId) { + this.studentId = studentId; + } + + public String getStudentName() { + return studentName; + } + + public void setStudentName(String studentName) { + this.studentName = studentName; + } + + public Course getCourse() { + return course; + } + + public void setCourse(Course course) { + this.course = course; + } + + @Override + public Student clone() { + Student student; + try { + student = (Student) super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(); + } + student.course = this.course.clone(); + return student; + } +} diff --git a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/deepcopyarraylist/DeepCopyArrayListUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/deepcopyarraylist/DeepCopyArrayListUnitTest.java new file mode 100644 index 0000000000..625c7e8385 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/deepcopyarraylist/DeepCopyArrayListUnitTest.java @@ -0,0 +1,77 @@ +package com.baeldung.deepcopyarraylist; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; +import org.junit.jupiter.api.Assertions; + +public class DeepCopyArrayListUnitTest { + + @Test + public void whenCreatingCopyWithCloneable_thenObjectsShouldNotBeSame() { + Course course = new Course(1, "Spring Masterclass"); + Student student1 = new Student(1, "John", course); + Student student2 = new Student(2, "David", course); + List students = new ArrayList<>(); + students.add(student1); + students.add(student2); + + List deepCopy = Student.deepCopyUsingCloneable(students); + + Assertions.assertNotEquals(students.get(0), deepCopy.get(0)); + Assertions.assertNotEquals(students.get(1), deepCopy.get(1)); + + } + + @Test + public void whenCreatingDeepCopyWithCopyConstructor_thenObjectsShouldNotBeSame() { + + Course course = new Course(1, "Spring Masterclass"); + Student student1 = new Student(1, "John", course); + Student student2 = new Student(2, "David", course); + + List students = new ArrayList<>(); + students.add(student1); + students.add(student2); + + List deepCopy = Student.deepCopyUsingCopyConstructor(students); + + Assertions.assertNotEquals(students.get(0), deepCopy.get(0)); + Assertions.assertNotEquals(students.get(1), deepCopy.get(1)); + } + + @Test + public void whenCreatingDeepCopyWithSerializationUtils_thenObjectsShouldNotBeSame() { + + Course course = new Course(1, "Spring Masterclass"); + Student student1 = new Student(1, "John", course); + Student student2 = new Student(2, "David", course); + + List students = new ArrayList<>(); + students.add(student1); + students.add(student2); + + List deepCopy = Student.deepCopyUsingSerialization(students); + + Assertions.assertNotEquals(students.get(0), deepCopy.get(0)); + Assertions.assertNotEquals(students.get(1), deepCopy.get(1)); + } + + @Test + public void whenCreatingDeepCopyWithJackson_thenObjectsShouldNotBeSame() { + + Course course = new Course(1, "Spring Masterclass"); + Student student1 = new Student(1, "John", course); + Student student2 = new Student(2, "David", course); + + List students = new ArrayList<>(); + students.add(student1); + students.add(student2); + + List deepCopy = Student.deepCopyUsingJackson(students); + + Assertions.assertNotEquals(students.get(0), deepCopy.get(0)); + Assertions.assertNotEquals(students.get(1), deepCopy.get(1)); + } +} From 0b193f4544439b88f56779911e23aef4e5337065 Mon Sep 17 00:00:00 2001 From: Abhinav Pandey Date: Tue, 4 Jul 2023 20:07:40 +0530 Subject: [PATCH 161/170] Bael 6577 (#14260) * BAEL-6577 - Paralellize for loops in Java * BAEL-6577 - Paralellize for loops in Java * BAEL-6577 - Paralellize for loops in Java - adding JMH * BAEL-6577 - Paralellize for loops in Java - using CompletableFuture --- .../concurrent/parallel/Benchmark.java | 14 ++++ .../concurrent/parallel/Processor.java | 73 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/parallel/Benchmark.java create mode 100644 core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/parallel/Processor.java diff --git a/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/parallel/Benchmark.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/parallel/Benchmark.java new file mode 100644 index 0000000000..964f6b3e3d --- /dev/null +++ b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/parallel/Benchmark.java @@ -0,0 +1,14 @@ +package com.baeldung.concurrent.parallel; + +import java.io.IOException; + +class Benchmark { + + public static void main(String[] args) { + try { + org.openjdk.jmh.Main.main(new String[]{"com.baeldung.concurrent.parallel.Processor"}); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/parallel/Processor.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/parallel/Processor.java new file mode 100644 index 0000000000..747ae568b0 --- /dev/null +++ b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/parallel/Processor.java @@ -0,0 +1,73 @@ +package com.baeldung.concurrent.parallel; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Mode; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.stream.IntStream; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +public class Processor { + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + public void processSerially() throws InterruptedException { + for (int i = 0; i < 100; i++) { + Thread.sleep(10); + } + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + public void processParallelyWithExecutorService() throws InterruptedException { + ExecutorService executorService = Executors.newFixedThreadPool(10); + List> futures = new ArrayList<>(); + for (int i = 0; i < 100; i++) { + CompletableFuture future = CompletableFuture.runAsync(() -> { + try { + Thread.sleep(10); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }, executorService); + futures.add(future); + } + CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); + executorService.shutdown(); + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + public void processParallelyWithStream() { + IntStream.range(0, 100) + .parallel() + .forEach(i -> { + try { + Thread.sleep(10); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }); + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + public void processParallelyWithStreamSupport() { + Iterable iterable = () -> IntStream.range(0, 100).iterator(); + Stream stream = StreamSupport.stream(iterable.spliterator(), true); + stream.forEach(i -> { + try { + Thread.sleep(10); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }); + } +} From e3f36b304f92e857329344686a83b94c842871cf Mon Sep 17 00:00:00 2001 From: vunamtien Date: Wed, 5 Jul 2023 18:23:40 +0700 Subject: [PATCH 162/170] rename file (#14365) --- .../{ZipEntryReaderTest.java => ZipEntryReaderUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename core-java-modules/core-java-20/src/test/java/com/baeldung/zipentries/{ZipEntryReaderTest.java => ZipEntryReaderUnitTest.java} (92%) diff --git a/core-java-modules/core-java-20/src/test/java/com/baeldung/zipentries/ZipEntryReaderTest.java b/core-java-modules/core-java-20/src/test/java/com/baeldung/zipentries/ZipEntryReaderUnitTest.java similarity index 92% rename from core-java-modules/core-java-20/src/test/java/com/baeldung/zipentries/ZipEntryReaderTest.java rename to core-java-modules/core-java-20/src/test/java/com/baeldung/zipentries/ZipEntryReaderUnitTest.java index 2eb47ff057..b21470baea 100644 --- a/core-java-modules/core-java-20/src/test/java/com/baeldung/zipentries/ZipEntryReaderTest.java +++ b/core-java-modules/core-java-20/src/test/java/com/baeldung/zipentries/ZipEntryReaderUnitTest.java @@ -7,7 +7,7 @@ import java.net.URISyntaxException; import java.nio.file.Path; import java.nio.file.Paths; -public class ZipEntryReaderTest { +public class ZipEntryReaderUnitTest { @Test public void givenZipFile_thenReadEntriesAndValidateContent() throws URISyntaxException, IOException { From 1556a3c3841d3bfeb0dce959c6ea36f18745e125 Mon Sep 17 00:00:00 2001 From: Shahul Basha <32072554+shahulbasha@users.noreply.github.com> Date: Wed, 5 Jul 2023 08:24:57 -0400 Subject: [PATCH 163/170] BAEL-6633 (#14356) * Deep copy of Arraylist * Deep copy of Arraylist * Deep copy of Arraylist updated as per review * Deep copy of Arraylist updated as per review * Deep copy of Arraylist updated as per review --- .../src/main/java/com/baeldung/deepcopyarraylist/Course.java | 2 +- .../src/main/java/com/baeldung/deepcopyarraylist/Student.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopyarraylist/Course.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopyarraylist/Course.java index 5724be7218..f8367cfd50 100644 --- a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopyarraylist/Course.java +++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopyarraylist/Course.java @@ -36,7 +36,7 @@ public class Course implements Serializable, Cloneable { try { return (Course) super.clone(); } catch (CloneNotSupportedException e) { - throw new AssertionError(); + throw new IllegalStateException(e); } } } diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopyarraylist/Student.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopyarraylist/Student.java index fedc9010ab..0b3f1ba4a9 100644 --- a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopyarraylist/Student.java +++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deepcopyarraylist/Student.java @@ -95,7 +95,7 @@ public class Student implements Serializable, Cloneable { try { student = (Student) super.clone(); } catch (CloneNotSupportedException e) { - throw new AssertionError(); + throw new IllegalStateException(e); } student.course = this.course.clone(); return student; From fae290a10227cd05ac76601c21753e479b7ffaf4 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 5 Jul 2023 18:08:31 +0300 Subject: [PATCH 164/170] [JAVA-21545] Upgraded aws-java-sdk-dynamodb version (#14351) --- persistence-modules/spring-data-dynamodb/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/spring-data-dynamodb/pom.xml b/persistence-modules/spring-data-dynamodb/pom.xml index 06425cceb7..e6f5ea9cae 100644 --- a/persistence-modules/spring-data-dynamodb/pom.xml +++ b/persistence-modules/spring-data-dynamodb/pom.xml @@ -175,7 +175,7 @@ 4.3.4.RELEASE 4.5.2 5.1.0 - 1.11.64 + 1.12.331 3.3.7-1 1.0.392 1.21.1 From 6130c8436dbe9d8d3b98f47447fe03104e4c8596 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Wed, 5 Jul 2023 19:23:06 +0200 Subject: [PATCH 165/170] JAVA-20499 | Merging javax-validation-advanced module in javaxval-2. (#14362) --- javax-validation-advanced/.gitignore | 6 -- javax-validation-advanced/README.md | 6 -- javax-validation-advanced/pom.xml | 33 ------ javaxval-2/README.md | 1 + javaxval-2/pom.xml | 6 ++ ...eanDeserializerModifierWithValidation.java | 40 +++---- .../BeanDeserializerWithValidation.java | 80 +++++++------- .../afterdeserialization/Student.java | 28 ++--- .../StudentDeserializerWithValidation.java | 48 ++++----- ...entDeserializerWithValidationUnitTest.java | 102 +++++++++--------- .../nameTooLongStudent.json | 4 +- .../nameTooShortStudent.json | 4 +- .../afterdeserialization/validStudent.json | 4 +- pom.xml | 2 - 14 files changed, 162 insertions(+), 202 deletions(-) delete mode 100644 javax-validation-advanced/.gitignore delete mode 100644 javax-validation-advanced/README.md delete mode 100644 javax-validation-advanced/pom.xml rename {javax-validation-advanced => javaxval-2}/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerModifierWithValidation.java (97%) rename {javax-validation-advanced => javaxval-2}/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerWithValidation.java (81%) rename {javax-validation-advanced => javaxval-2}/src/main/java/com/baeldung/javaxval/afterdeserialization/Student.java (82%) rename {javax-validation-advanced => javaxval-2}/src/main/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidation.java (97%) rename {javax-validation-advanced/src/test/java/com/baeldung/javaxval => javaxval-2/src/test/java/com/baeldung/javaxval/afterdeserialization}/StudentDeserializerWithValidationUnitTest.java (95%) rename {javax-validation-advanced => javaxval-2}/src/test/resources/afterdeserialization/nameTooLongStudent.json (89%) rename {javax-validation-advanced => javaxval-2}/src/test/resources/afterdeserialization/nameTooShortStudent.json (85%) rename {javax-validation-advanced => javaxval-2}/src/test/resources/afterdeserialization/validStudent.json (87%) diff --git a/javax-validation-advanced/.gitignore b/javax-validation-advanced/.gitignore deleted file mode 100644 index 8027134ae9..0000000000 --- a/javax-validation-advanced/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -.classpath -.project -.settings/ -target/ -bin/ - diff --git a/javax-validation-advanced/README.md b/javax-validation-advanced/README.md deleted file mode 100644 index b3ed669c39..0000000000 --- a/javax-validation-advanced/README.md +++ /dev/null @@ -1,6 +0,0 @@ -## Java Bean Validation Examples - -This module contains articles about Bean Validation. - -### Relevant Articles: -- [Object Validation After Deserialization](https://www.baeldung.com/java-object-validation-deserialization) diff --git a/javax-validation-advanced/pom.xml b/javax-validation-advanced/pom.xml deleted file mode 100644 index 7709f37883..0000000000 --- a/javax-validation-advanced/pom.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - 4.0.0 - javax-validation-advanced - javax-validation-advanced - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - org.springframework.boot - spring-boot-starter-validation - ${spring.boot.version} - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.databind.version} - - - - - 2.7.5 - 2.14.0 - - - \ No newline at end of file diff --git a/javaxval-2/README.md b/javaxval-2/README.md index 0fd5ce163b..e10629975c 100644 --- a/javaxval-2/README.md +++ b/javaxval-2/README.md @@ -6,4 +6,5 @@ This module contains articles about Bean Validation. - [Method Constraints with Bean Validation 2.0](https://www.baeldung.com/javax-validation-method-constraints) - [Guide to ParameterMessageInterpolator](https://www.baeldung.com/hibernate-parametermessageinterpolator) - [Hibernate Validator Annotation Processor in Depth](https://www.baeldung.com/hibernate-validator-annotation-processor) +- [Object Validation After Deserialization](https://www.baeldung.com/java-object-validation-deserialization) - More articles: [[<-- prev]](../javaxval) \ No newline at end of file diff --git a/javaxval-2/pom.xml b/javaxval-2/pom.xml index 7d84b4ce9b..f73f23bcb2 100644 --- a/javaxval-2/pom.xml +++ b/javaxval-2/pom.xml @@ -25,6 +25,11 @@ ${spring.boot.version} test + + com.fasterxml.jackson.core + jackson-databind + ${jackson.databind.version} + @@ -39,6 +44,7 @@ 3.0.4 + 2.14.0 \ No newline at end of file diff --git a/javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerModifierWithValidation.java b/javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerModifierWithValidation.java similarity index 97% rename from javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerModifierWithValidation.java rename to javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerModifierWithValidation.java index 3e20ebad6b..f2425b542f 100644 --- a/javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerModifierWithValidation.java +++ b/javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerModifierWithValidation.java @@ -1,20 +1,20 @@ -package com.baeldung.javaxval.afterdeserialization; - -import com.fasterxml.jackson.databind.BeanDescription; -import com.fasterxml.jackson.databind.DeserializationConfig; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.deser.BeanDeserializer; -import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier; - -public class BeanDeserializerModifierWithValidation extends BeanDeserializerModifier { - - @Override - public JsonDeserializer modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer deserializer) { - if (deserializer instanceof BeanDeserializer) { - return new BeanDeserializerWithValidation((BeanDeserializer) deserializer); - } - - return deserializer; - } - -} +package com.baeldung.javaxval.afterdeserialization; + +import com.fasterxml.jackson.databind.BeanDescription; +import com.fasterxml.jackson.databind.DeserializationConfig; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.deser.BeanDeserializer; +import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier; + +public class BeanDeserializerModifierWithValidation extends BeanDeserializerModifier { + + @Override + public JsonDeserializer modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer deserializer) { + if (deserializer instanceof BeanDeserializer) { + return new BeanDeserializerWithValidation((BeanDeserializer) deserializer); + } + + return deserializer; + } + +} diff --git a/javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerWithValidation.java b/javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerWithValidation.java similarity index 81% rename from javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerWithValidation.java rename to javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerWithValidation.java index 332c83010d..178baaac95 100644 --- a/javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerWithValidation.java +++ b/javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerWithValidation.java @@ -1,40 +1,40 @@ -package com.baeldung.javaxval.afterdeserialization; - -import java.io.IOException; -import java.util.Set; - -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.deser.BeanDeserializer; -import com.fasterxml.jackson.databind.deser.BeanDeserializerBase; - -public class BeanDeserializerWithValidation extends BeanDeserializer { - - private static final ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - private static final Validator validator = factory.getValidator(); - - protected BeanDeserializerWithValidation(BeanDeserializerBase src) { - super(src); - } - - @Override - public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - Object instance = super.deserialize(p, ctxt); - validate(instance); - return instance; - } - - public void validate(T t) { - Set> violations = validator.validate(t); - if (!violations.isEmpty()) { - throw new ConstraintViolationException(violations); - } - } - -} +package com.baeldung.javaxval.afterdeserialization; + +import java.io.IOException; +import java.util.Set; + +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.BeanDeserializer; +import com.fasterxml.jackson.databind.deser.BeanDeserializerBase; + +public class BeanDeserializerWithValidation extends BeanDeserializer { + + private static final ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + private static final Validator validator = factory.getValidator(); + + protected BeanDeserializerWithValidation(BeanDeserializerBase src) { + super(src); + } + + @Override + public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + Object instance = super.deserialize(p, ctxt); + validate(instance); + return instance; + } + + public void validate(T t) { + Set> violations = validator.validate(t); + if (!violations.isEmpty()) { + throw new ConstraintViolationException(violations); + } + } + +} diff --git a/javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/Student.java b/javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/Student.java similarity index 82% rename from javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/Student.java rename to javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/Student.java index c1923de265..b359f67078 100644 --- a/javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/Student.java +++ b/javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/Student.java @@ -1,14 +1,14 @@ -package com.baeldung.javaxval.afterdeserialization; - -import javax.validation.constraints.Size; - -public class Student { - - @Size(min = 5, max = 10, message = "Student's name must be between 5 and 10 characters") - private String name; - - public String getName() { - return name; - } - -} +package com.baeldung.javaxval.afterdeserialization; + +import jakarta.validation.constraints.Size; + +public class Student { + + @Size(min = 5, max = 10, message = "Student's name must be between 5 and 10 characters") + private String name; + + public String getName() { + return name; + } + +} diff --git a/javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidation.java b/javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidation.java similarity index 97% rename from javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidation.java rename to javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidation.java index e652a43ccb..588493782e 100644 --- a/javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidation.java +++ b/javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidation.java @@ -1,24 +1,24 @@ -package com.baeldung.javaxval.afterdeserialization; - -import java.io.IOException; -import java.io.InputStream; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.module.SimpleModule; - -public class StudentDeserializerWithValidation { - - public static Student readStudent(InputStream inputStream) throws IOException { - ObjectMapper mapper = getObjectMapperWithValidation(); - return mapper.readValue(inputStream, Student.class); - } - - private static ObjectMapper getObjectMapperWithValidation() { - SimpleModule validationModule = new SimpleModule(); - validationModule.setDeserializerModifier(new BeanDeserializerModifierWithValidation()); - ObjectMapper mapper = new ObjectMapper(); - mapper.registerModule(validationModule); - return mapper; - } - -} +package com.baeldung.javaxval.afterdeserialization; + +import java.io.IOException; +import java.io.InputStream; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; + +public class StudentDeserializerWithValidation { + + public static Student readStudent(InputStream inputStream) throws IOException { + ObjectMapper mapper = getObjectMapperWithValidation(); + return mapper.readValue(inputStream, Student.class); + } + + private static ObjectMapper getObjectMapperWithValidation() { + SimpleModule validationModule = new SimpleModule(); + validationModule.setDeserializerModifier(new BeanDeserializerModifierWithValidation()); + ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(validationModule); + return mapper; + } + +} diff --git a/javax-validation-advanced/src/test/java/com/baeldung/javaxval/StudentDeserializerWithValidationUnitTest.java b/javaxval-2/src/test/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidationUnitTest.java similarity index 95% rename from javax-validation-advanced/src/test/java/com/baeldung/javaxval/StudentDeserializerWithValidationUnitTest.java rename to javaxval-2/src/test/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidationUnitTest.java index edbe85ecfe..094236e963 100644 --- a/javax-validation-advanced/src/test/java/com/baeldung/javaxval/StudentDeserializerWithValidationUnitTest.java +++ b/javaxval-2/src/test/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidationUnitTest.java @@ -1,51 +1,51 @@ -package com.baeldung.javaxval; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import java.io.IOException; -import java.io.InputStream; - -import javax.validation.ConstraintViolationException; - -import org.junit.jupiter.api.Test; - -import com.baeldung.javaxval.afterdeserialization.Student; -import com.baeldung.javaxval.afterdeserialization.StudentDeserializerWithValidation; - -public class StudentDeserializerWithValidationUnitTest { - - private final String EXPECTED_ERROR_MESSAGE = "name: Student's name must be between 5 and 10 characters"; - private final String EXPECTED_STUDENT_NAME = "Daniel"; - private final String NAME_TOO_LONG_STUDENT_FILE = "nameTooLongStudent.json"; - private final String NAME_TOO_SHORT_STUDENT_FILE = "nameTooShortStudent.json"; - private final String SUBDIRECTORY = "afterdeserialization/"; - private final String VALID_STUDENT_FILE = "validStudent.json"; - - @Test - void givenValidStudent_WhenReadStudent_ThenReturnStudent() throws IOException { - InputStream inputStream = getInputStream(VALID_STUDENT_FILE); - Student result = StudentDeserializerWithValidation.readStudent(inputStream); - assertEquals(EXPECTED_STUDENT_NAME, result.getName()); - } - - @Test - void givenStudentWithTooShortName_WhenReadStudent_ThenThrows() { - InputStream inputStream = getInputStream(NAME_TOO_SHORT_STUDENT_FILE); - ConstraintViolationException constraintViolationException = assertThrows(ConstraintViolationException.class, () -> StudentDeserializerWithValidation.readStudent(inputStream)); - assertEquals(EXPECTED_ERROR_MESSAGE, constraintViolationException.getMessage()); - } - - @Test - void givenStudentWithTooLongName_WhenReadStudent_ThenThrows() { - InputStream inputStream = getInputStream(NAME_TOO_LONG_STUDENT_FILE); - ConstraintViolationException constraintViolationException = assertThrows(ConstraintViolationException.class, () -> StudentDeserializerWithValidation.readStudent(inputStream)); - assertEquals(EXPECTED_ERROR_MESSAGE, constraintViolationException.getMessage()); - } - - private InputStream getInputStream(String fileName) { - return getClass().getClassLoader() - .getResourceAsStream(SUBDIRECTORY + fileName); - } - -} +package com.baeldung.javaxval; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.io.IOException; +import java.io.InputStream; + +import jakarta.validation.ConstraintViolationException; + +import org.junit.jupiter.api.Test; + +import com.baeldung.javaxval.afterdeserialization.Student; +import com.baeldung.javaxval.afterdeserialization.StudentDeserializerWithValidation; + +public class StudentDeserializerWithValidationUnitTest { + + private final String EXPECTED_ERROR_MESSAGE = "name: Student's name must be between 5 and 10 characters"; + private final String EXPECTED_STUDENT_NAME = "Daniel"; + private final String NAME_TOO_LONG_STUDENT_FILE = "nameTooLongStudent.json"; + private final String NAME_TOO_SHORT_STUDENT_FILE = "nameTooShortStudent.json"; + private final String SUBDIRECTORY = "afterdeserialization/"; + private final String VALID_STUDENT_FILE = "validStudent.json"; + + @Test + void givenValidStudent_WhenReadStudent_ThenReturnStudent() throws IOException { + InputStream inputStream = getInputStream(VALID_STUDENT_FILE); + Student result = StudentDeserializerWithValidation.readStudent(inputStream); + assertEquals(EXPECTED_STUDENT_NAME, result.getName()); + } + + @Test + void givenStudentWithTooShortName_WhenReadStudent_ThenThrows() { + InputStream inputStream = getInputStream(NAME_TOO_SHORT_STUDENT_FILE); + ConstraintViolationException constraintViolationException = assertThrows(ConstraintViolationException.class, () -> StudentDeserializerWithValidation.readStudent(inputStream)); + assertEquals(EXPECTED_ERROR_MESSAGE, constraintViolationException.getMessage()); + } + + @Test + void givenStudentWithTooLongName_WhenReadStudent_ThenThrows() { + InputStream inputStream = getInputStream(NAME_TOO_LONG_STUDENT_FILE); + ConstraintViolationException constraintViolationException = assertThrows(ConstraintViolationException.class, () -> StudentDeserializerWithValidation.readStudent(inputStream)); + assertEquals(EXPECTED_ERROR_MESSAGE, constraintViolationException.getMessage()); + } + + private InputStream getInputStream(String fileName) { + return getClass().getClassLoader() + .getResourceAsStream(SUBDIRECTORY + fileName); + } + +} diff --git a/javax-validation-advanced/src/test/resources/afterdeserialization/nameTooLongStudent.json b/javaxval-2/src/test/resources/afterdeserialization/nameTooLongStudent.json similarity index 89% rename from javax-validation-advanced/src/test/resources/afterdeserialization/nameTooLongStudent.json rename to javaxval-2/src/test/resources/afterdeserialization/nameTooLongStudent.json index e537ecb25d..486709db60 100644 --- a/javax-validation-advanced/src/test/resources/afterdeserialization/nameTooLongStudent.json +++ b/javaxval-2/src/test/resources/afterdeserialization/nameTooLongStudent.json @@ -1,3 +1,3 @@ -{ - "name": "Constantine" +{ + "name": "Constantine" } \ No newline at end of file diff --git a/javax-validation-advanced/src/test/resources/afterdeserialization/nameTooShortStudent.json b/javaxval-2/src/test/resources/afterdeserialization/nameTooShortStudent.json similarity index 85% rename from javax-validation-advanced/src/test/resources/afterdeserialization/nameTooShortStudent.json rename to javaxval-2/src/test/resources/afterdeserialization/nameTooShortStudent.json index 79ab10cb80..23410153e3 100644 --- a/javax-validation-advanced/src/test/resources/afterdeserialization/nameTooShortStudent.json +++ b/javaxval-2/src/test/resources/afterdeserialization/nameTooShortStudent.json @@ -1,3 +1,3 @@ -{ - "name": "Max" +{ + "name": "Max" } \ No newline at end of file diff --git a/javax-validation-advanced/src/test/resources/afterdeserialization/validStudent.json b/javaxval-2/src/test/resources/afterdeserialization/validStudent.json similarity index 87% rename from javax-validation-advanced/src/test/resources/afterdeserialization/validStudent.json rename to javaxval-2/src/test/resources/afterdeserialization/validStudent.json index 938002ea51..d106f7d7ce 100644 --- a/javax-validation-advanced/src/test/resources/afterdeserialization/validStudent.json +++ b/javaxval-2/src/test/resources/afterdeserialization/validStudent.json @@ -1,3 +1,3 @@ -{ - "name": "Daniel" +{ + "name": "Daniel" } \ No newline at end of file diff --git a/pom.xml b/pom.xml index bea9a5a6fa..a82f898689 100644 --- a/pom.xml +++ b/pom.xml @@ -850,7 +850,6 @@ javax-sound javaxval javaxval-2 - javax-validation-advanced jetbrains jgit jib @@ -1120,7 +1119,6 @@ javax-sound javaxval javaxval-2 - javax-validation-advanced jetbrains jgit jib From 14ffda870bb644171c1a0ff2b7202e93e8a80a50 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Wed, 5 Jul 2023 23:10:52 +0530 Subject: [PATCH 166/170] JAVA-21457 Add SpringFox module to spring-boot-modules pom (#14344) * JAVA-21457 Add SpringFox module to spring-boot-modules pom * JAVA-21460 Update articles URLs for new annotations --- spring-boot-modules/pom.xml | 1 + spring-boot-modules/spring-boot-swagger-2/README.md | 2 +- spring-boot-modules/spring-boot-swagger/README.md | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 0417d83c61..0679f33ae7 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -73,6 +73,7 @@ spring-boot-swagger-2 spring-boot-swagger-jwt spring-boot-swagger-keycloak + spring-boot-swagger-springfox spring-boot-testing spring-boot-testing-2 spring-boot-testing-spock diff --git a/spring-boot-modules/spring-boot-swagger-2/README.md b/spring-boot-modules/spring-boot-swagger-2/README.md index 1b43b09e39..512ed9e52c 100644 --- a/spring-boot-modules/spring-boot-swagger-2/README.md +++ b/spring-boot-modules/spring-boot-swagger-2/README.md @@ -2,6 +2,6 @@ - [Swagger: Specify Two Responses with the Same Response Code](https://www.baeldung.com/swagger-two-responses-one-response-code) - [Specify an Array of Strings as Body Parameters in Swagger](https://www.baeldung.com/swagger-body-array-of-strings) -- [Swagger @ApiParam vs @ApiModelProperty](https://www.baeldung.com/swagger-apiparam-vs-apimodelproperty) +- [Swagger @Parameter vs @Schema](https://www.baeldung.com/swagger-parameter-vs-schema) - [Map Date Types With OpenAPI Generator](https://www.baeldung.com/openapi-map-date-types) - [API First Development with Spring Boot and OpenAPI 3.0](https://www.baeldung.com/spring-boot-openapi-api-first-development) diff --git a/spring-boot-modules/spring-boot-swagger/README.md b/spring-boot-modules/spring-boot-swagger/README.md index ecf057bda1..75fb450120 100644 --- a/spring-boot-modules/spring-boot-swagger/README.md +++ b/spring-boot-modules/spring-boot-swagger/README.md @@ -3,4 +3,4 @@ - [Generate PDF from Swagger API Documentation](https://www.baeldung.com/swagger-generate-pdf) - [Setting Example and Description with Swagger](https://www.baeldung.com/swagger-set-example-description) - [Document Enum in Swagger](https://www.baeldung.com/swagger-enum) -- [@ApiOperation vs @ApiResponse in Swagger](https://www.baeldung.com/swagger-apioperation-vs-apiresponse) +- [@Operation vs @ApiResponse in Swagger](https://www.baeldung.com/swagger-operation-vs-apiresponse) From b64958a6bf4101d002555c6508b517282f4b8fe5 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Thu, 6 Jul 2023 01:20:28 +0200 Subject: [PATCH 167/170] [split-digits] Split a String Into Digits- and Non-Digits-Elements (#14349) * [split-digits] Split a String Into Digits- and Non-Digits-Elements * [split-digits] JMH benchmark * [split-digits] using enum --- .../core-java-string-operations-6/pom.xml | 12 +++- .../digitsandnondigits/BenchmarkLiveTest.java | 47 +++++++++++++ .../SplitDigitsAndNondigitsUnitTest.java | 69 +++++++++++++++++++ 3 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/digitsandnondigits/BenchmarkLiveTest.java create mode 100644 core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/digitsandnondigits/SplitDigitsAndNondigitsUnitTest.java diff --git a/core-java-modules/core-java-string-operations-6/pom.xml b/core-java-modules/core-java-string-operations-6/pom.xml index ddbb5d0e40..0ec32d91b1 100644 --- a/core-java-modules/core-java-string-operations-6/pom.xml +++ b/core-java-modules/core-java-string-operations-6/pom.xml @@ -18,7 +18,16 @@ commons-lang3 ${apache.commons-lang.version} - + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + @@ -38,6 +47,7 @@ 11 11 3.12.0 + 1.36 \ No newline at end of file diff --git a/core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/digitsandnondigits/BenchmarkLiveTest.java b/core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/digitsandnondigits/BenchmarkLiveTest.java new file mode 100644 index 0000000000..7c5c8101f8 --- /dev/null +++ b/core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/digitsandnondigits/BenchmarkLiveTest.java @@ -0,0 +1,47 @@ +package com.baeldung.digitsandnondigits; + +import static com.baeldung.digitsandnondigits.SplitDigitsAndNondigitsUnitTest.parseString; + +import java.util.concurrent.TimeUnit; + +import org.junit.jupiter.api.Test; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Threads; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Blackhole; + +@State(Scope.Benchmark) +@Threads(1) +@BenchmarkMode(Mode.Throughput) +@Fork(warmups = 1, value = 1) +@Warmup(iterations = 2, time = 10, timeUnit = TimeUnit.MILLISECONDS) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +public class BenchmarkLiveTest { + private static final String INPUT = "01Michael Jackson23Michael Jordan42Michael Bolton999Michael Johnson000"; + + @Param({ "10000" }) + public int iterations; + + @Benchmark + public void regexBased(Blackhole blackhole) { + blackhole.consume(INPUT.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)")); + } + + @Benchmark + public void nonRegexBased(Blackhole blackhole) { + blackhole.consume(parseString(INPUT)); + } + + @Test + public void benchmark() throws Exception { + String[] argv = {}; + org.openjdk.jmh.Main.main(argv); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/digitsandnondigits/SplitDigitsAndNondigitsUnitTest.java b/core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/digitsandnondigits/SplitDigitsAndNondigitsUnitTest.java new file mode 100644 index 0000000000..55e0e48070 --- /dev/null +++ b/core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/digitsandnondigits/SplitDigitsAndNondigitsUnitTest.java @@ -0,0 +1,69 @@ +package com.baeldung.digitsandnondigits; + +import static com.baeldung.digitsandnondigits.SplitDigitsAndNondigitsUnitTest.State.INIT; +import static com.baeldung.digitsandnondigits.SplitDigitsAndNondigitsUnitTest.State.PARSING_DIGIT; +import static com.baeldung.digitsandnondigits.SplitDigitsAndNondigitsUnitTest.State.PARSING_NON_DIGIT; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.Test; + +public class SplitDigitsAndNondigitsUnitTest { + private static final String INPUT1 = "01Michael Jackson23Michael Jordan42Michael Bolton999Michael Johnson000"; + private static final String[] EXPECTED1 = new String[] { "01", "Michael Jackson", "23", "Michael Jordan", "42", "Michael Bolton", "999", "Michael Johnson", "000" }; + private static final List EXPECTED_LIST1 = Arrays.asList(EXPECTED1); + + private static final String INPUT2 = "Michael Jackson01Michael Jordan23Michael Bolton42Michael Johnson999Great Michaels"; + private static final String[] EXPECTED2 = new String[] { "Michael Jackson", "01", "Michael Jordan", "23", "Michael Bolton", "42", "Michael Johnson", "999", "Great Michaels" }; + private static final List EXPECTED_LIST2 = Arrays.asList(EXPECTED2); + + @Test + void whenUsingLookaroundRegex_thenGetExpectedResult() { + String splitRE = "(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)"; + String[] result1 = INPUT1.split(splitRE); + assertArrayEquals(EXPECTED1, result1); + + String[] result2 = INPUT2.split(splitRE); + assertArrayEquals(EXPECTED2, result2); + } + + enum State { + INIT, PARSING_DIGIT, PARSING_NON_DIGIT + } + + static List parseString(String input) { + List result = new ArrayList<>(); + int start = 0; + State state = INIT; + for (int i = 0; i < input.length(); i++) { + if (input.charAt(i) >= '0' && input.charAt(i) <= '9') { + if (state == PARSING_NON_DIGIT) { + result.add(input.substring(start, i)); + start = i; + } + state = PARSING_DIGIT; + } else { + if (state == PARSING_DIGIT) { + result.add(input.substring(start, i)); + start = i; + } + state = PARSING_NON_DIGIT; + } + } + result.add(input.substring(start)); + return result; + } + + @Test + void whenCheckEachChar_thenGetExpectedResult() { + List result1 = parseString(INPUT1); + assertEquals(EXPECTED_LIST1, result1); + + List result2 = parseString(INPUT2); + assertEquals(EXPECTED_LIST2, result2); + } +} \ No newline at end of file From 120a6c152a9547c3b434d91346e16c6407e32de0 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Thu, 6 Jul 2023 12:04:39 +0530 Subject: [PATCH 168/170] Java 19657 (#14336) * JAVA-19657: Changes made for WSDL stubs with maven * JAVA-19657: changes made for upgrading module Generate WSDL Stubs with Maven --- maven-modules/maven-plugins/jaxws/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/maven-modules/maven-plugins/jaxws/pom.xml b/maven-modules/maven-plugins/jaxws/pom.xml index a7c4740acb..f17d70c182 100644 --- a/maven-modules/maven-plugins/jaxws/pom.xml +++ b/maven-modules/maven-plugins/jaxws/pom.xml @@ -13,9 +13,9 @@ - javax.xml.bind - jaxb-api - 2.3.0 + jakarta.xml.ws + jakarta.xml.ws-api + 4.0.0 org.glassfish.jaxb @@ -44,9 +44,9 @@ - org.codehaus.mojo + com.sun.xml.ws jaxws-maven-plugin - 2.6 + 4.0.1 From 6f905048c41ce1ab0d4be62bc3195794ff45b7f4 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 6 Jul 2023 13:02:53 +0530 Subject: [PATCH 169/170] JAVA-22625 Removed junit4 engine (#14368) --- core-java-modules/core-java-console/pom.xml | 20 +++++++++++++++++++ .../asciiart/AsciiArtIntegrationTest.java | 6 +++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-console/pom.xml b/core-java-modules/core-java-console/pom.xml index 4debf9388b..9ba1b55188 100644 --- a/core-java-modules/core-java-console/pom.xml +++ b/core-java-modules/core-java-console/pom.xml @@ -19,6 +19,16 @@ jansi 2.4.0 + + org.junit.vintage + junit-vintage-engine + + + junit + junit + + + @@ -70,6 +80,16 @@ ${target.version} + + org.apache.maven.plugins + maven-surefire-plugin + 3.1.2 + + + junit-vintage-engine + + + diff --git a/core-java-modules/core-java-console/src/test/java/com/baeldung/asciiart/AsciiArtIntegrationTest.java b/core-java-modules/core-java-console/src/test/java/com/baeldung/asciiart/AsciiArtIntegrationTest.java index 364435e890..4274551cf8 100644 --- a/core-java-modules/core-java-console/src/test/java/com/baeldung/asciiart/AsciiArtIntegrationTest.java +++ b/core-java-modules/core-java-console/src/test/java/com/baeldung/asciiart/AsciiArtIntegrationTest.java @@ -1,11 +1,11 @@ package com.baeldung.asciiart; -import com.baeldung.asciiart.AsciiArt.Settings; - -import java.awt.*; +import java.awt.Font; import org.junit.jupiter.api.Test; +import com.baeldung.asciiart.AsciiArt.Settings; + public class AsciiArtIntegrationTest { @Test From 21c413d0c6454cd002e9da24789f0b3dd147f069 Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Fri, 7 Jul 2023 14:49:14 +0300 Subject: [PATCH 170/170] remove unused dependency --- persistence-modules/spring-data-yugabytedb/pom.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/persistence-modules/spring-data-yugabytedb/pom.xml b/persistence-modules/spring-data-yugabytedb/pom.xml index fb4e4c160d..cf85988ac3 100644 --- a/persistence-modules/spring-data-yugabytedb/pom.xml +++ b/persistence-modules/spring-data-yugabytedb/pom.xml @@ -20,10 +20,6 @@ org.springframework.boot spring-boot-starter-web - - org.projectlombok - lombok - org.springframework spring-test