From 03fe7966de0d3490a5b2c568c3e6df3cd3d805ba Mon Sep 17 00:00:00 2001 From: Vishal Date: Sun, 13 Sep 2020 23:05:36 +0530 Subject: [PATCH 01/26] Add examples to demo IndexOutOfBoundsException while using Collectins.copy method and other working demos to copy elements from one list to another list --- .../CopyListUsingAddAllMethodDemo.java | 24 +++++++++++++++++ ...opyListUsingCollectionsCopyMethodDemo.java | 21 +++++++++++++++ .../CopyListUsingConstructorDemo.java | 21 +++++++++++++++ .../com/baeldung/CopyListUsingJava10Demo.java | 18 +++++++++++++ .../CopyListUsingJava8StreamDemo.java | 22 +++++++++++++++ .../exception/IndexOutOfBoundsException.java | 27 +++++++++++++++++++ 6 files changed, 133 insertions(+) create mode 100644 core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingAddAllMethodDemo.java create mode 100644 core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingCollectionsCopyMethodDemo.java create mode 100644 core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingConstructorDemo.java create mode 100644 core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingJava10Demo.java create mode 100644 core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingJava8StreamDemo.java create mode 100644 core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/IndexOutOfBoundsException.java diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingAddAllMethodDemo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingAddAllMethodDemo.java new file mode 100644 index 0000000000..a7d24cdec8 --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingAddAllMethodDemo.java @@ -0,0 +1,24 @@ +package com.baeldung; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class CopyListUsingAddAllMethodDemo { + + static List copyList(List source) { + List destination = new ArrayList<>(); + + destination.addAll(source); + + return destination; + } + + public static void main(String[] args) { + List source = Arrays.asList(11, 22, 33); + + List destination = copyList(source); + + System.out.println("copy = " + destination); + } +} diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingCollectionsCopyMethodDemo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingCollectionsCopyMethodDemo.java new file mode 100644 index 0000000000..bdf6726924 --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingCollectionsCopyMethodDemo.java @@ -0,0 +1,21 @@ +package com.baeldung; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class CopyListUsingCollectionsCopyMethodDemo { + + static void copyList(List source, List destination) { + Collections.copy(destination, source); + } + + public static void main(String[] args) { + List source = Arrays.asList(11, 22, 33); + List destination = Arrays.asList(1, 2, 3, 4, 5); + + copyList(source, destination); + + System.out.println("copy = " + destination); + } +} diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingConstructorDemo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingConstructorDemo.java new file mode 100644 index 0000000000..b76a1448d4 --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingConstructorDemo.java @@ -0,0 +1,21 @@ +package com.baeldung; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class CopyListUsingConstructorDemo { + + static List copyList(List source) { + + return new ArrayList<>(source); + } + + public static void main(String[] args) { + List source = Arrays.asList(11, 22, 33); + + List destination = copyList(source); + + System.out.println("copy = " + destination); + } +} diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingJava10Demo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingJava10Demo.java new file mode 100644 index 0000000000..1a32dcec4f --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingJava10Demo.java @@ -0,0 +1,18 @@ +package com.baeldung; + +import java.util.Arrays; +import java.util.List; + +public class CopyListUsingJava10Demo { + static List copyList(List source) { + return List.copyOf(source); + } + + public static void main(String[] args) { + List source = Arrays.asList(11, 22, 33); + + List destination = copyList(source); + + System.out.println("copy = " + destination); + } +} diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingJava8StreamDemo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingJava8StreamDemo.java new file mode 100644 index 0000000000..81ae533505 --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingJava8StreamDemo.java @@ -0,0 +1,22 @@ +package com.baeldung; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class CopyListUsingJava8StreamDemo { + + static List copyList(List source) { + return source + .stream() + .collect(Collectors.toList()); + } + + public static void main(String[] args) { + List source = Arrays.asList(11, 22, 33); + + List destination = copyList(source); + + System.out.println("copy = " + destination); + } +} diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/IndexOutOfBoundsException.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/IndexOutOfBoundsException.java new file mode 100644 index 0000000000..a1b6bf1151 --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/IndexOutOfBoundsException.java @@ -0,0 +1,27 @@ +package com.baeldung.exception; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * This example produces an IndexOutOfBoundsException, when we try to copy a list using the Collections.copy method. + * As the destination list doesn't have enough space/size to copy elements from source list. + */ +public class IndexOutOfBoundsException { + + static List copyList(List source) { + List destination = new ArrayList<>(source.size()); + Collections.copy(destination, source); + return destination; + } + + public static void main(String[] args) { + List source = Arrays.asList(1, 2, 3, 4, 5); + List copy = copyList(source); + + System.out.println("copy = " + copy); + } + +} From e62a786c936c92ee5b751705eeebfe74ed7cbec3 Mon Sep 17 00:00:00 2001 From: Vishal Date: Thu, 17 Sep 2020 16:41:47 +0530 Subject: [PATCH 02/26] Add maven compiler plugin for java 11 --- core-java-modules/core-java-exceptions-3/pom.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core-java-modules/core-java-exceptions-3/pom.xml b/core-java-modules/core-java-exceptions-3/pom.xml index b909572afe..19996f85af 100644 --- a/core-java-modules/core-java-exceptions-3/pom.xml +++ b/core-java-modules/core-java-exceptions-3/pom.xml @@ -26,6 +26,19 @@ + + + + org.apache.maven.plugins + maven-compiler-plugin + + 11 + 11 + 11 + + + + 3.10.0 From e700813d806666c0ad9015363640ec3db6100108 Mon Sep 17 00:00:00 2001 From: Vishal Date: Tue, 27 Oct 2020 13:10:58 +0530 Subject: [PATCH 03/26] BAEL-4236 | Add code examples to handle IndexOutOfBoundsException and alternatives to make a copy of the l.ist --- .../CopyListUsingAddAllMethodDemo.java | 14 +++++++++ ...opyListUsingCollectionsCopyMethodDemo.java | 10 ++++++ .../CopyListUsingConstructorDemo.java | 10 ++++++ .../CopyListUsingJava8StreamDemo.java | 12 +++++++ .../IndexOutOfBoundsExceptionDemo.java | 13 ++++++++ ...CopyListUsingAddAllMethodDemoUnitTest.java | 18 +++++++++++ ...singCollectionsCopyMethodDemoUnitTest.java | 31 +++++++++++++++++++ .../CopyListUsingConstructorDemoUnitTest.java | 18 +++++++++++ .../CopyListUsingJava8StreamDemoUnitTest.java | 18 +++++++++++ ...IndexOutOfBoundsExceptionDemoUnitTest.java | 28 +++++++++++++++++ 10 files changed, 172 insertions(+) create mode 100644 core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingAddAllMethodDemo.java create mode 100644 core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemo.java create mode 100644 core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingConstructorDemo.java create mode 100644 core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingJava8StreamDemo.java create mode 100644 core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/IndexOutOfBoundsExceptionDemo.java create mode 100644 core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingAddAllMethodDemoUnitTest.java create mode 100644 core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemoUnitTest.java create mode 100644 core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingConstructorDemoUnitTest.java create mode 100644 core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingJava8StreamDemoUnitTest.java create mode 100644 core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/IndexOutOfBoundsExceptionDemoUnitTest.java diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingAddAllMethodDemo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingAddAllMethodDemo.java new file mode 100644 index 0000000000..d3e88029c9 --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingAddAllMethodDemo.java @@ -0,0 +1,14 @@ +package com.baeldung.indexoutofbounds; + +import java.util.ArrayList; +import java.util.List; + +public class CopyListUsingAddAllMethodDemo { + static List copyList(List source) { + List destination = new ArrayList<>(); + + destination.addAll(source); + + return destination; + } +} diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemo.java new file mode 100644 index 0000000000..6f897fdfbd --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemo.java @@ -0,0 +1,10 @@ +package com.baeldung.indexoutofbounds; + +import java.util.Collections; +import java.util.List; + +public class CopyListUsingCollectionsCopyMethodDemo { + static void copyList(List source, List destination) { + Collections.copy(destination, source); + } +} diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingConstructorDemo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingConstructorDemo.java new file mode 100644 index 0000000000..6c6da80a46 --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingConstructorDemo.java @@ -0,0 +1,10 @@ +package com.baeldung.indexoutofbounds; + +import java.util.ArrayList; +import java.util.List; + +public class CopyListUsingConstructorDemo { + static List copyList(List source) { + return new ArrayList<>(source); + } +} diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingJava8StreamDemo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingJava8StreamDemo.java new file mode 100644 index 0000000000..1b5a4c2e01 --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingJava8StreamDemo.java @@ -0,0 +1,12 @@ +package com.baeldung.indexoutofbounds; + +import java.util.List; +import java.util.stream.Collectors; + +public class CopyListUsingJava8StreamDemo { + static List copyList(List source) { + return source + .stream() + .collect(Collectors.toList()); + } +} diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/IndexOutOfBoundsExceptionDemo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/IndexOutOfBoundsExceptionDemo.java new file mode 100644 index 0000000000..3088811d60 --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/IndexOutOfBoundsExceptionDemo.java @@ -0,0 +1,13 @@ +package com.baeldung.indexoutofbounds; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class IndexOutOfBoundsExceptionDemo { + static List copyList(List source) { + List destination = new ArrayList<>(source.size()); + Collections.copy(destination, source); + return destination; + } +} diff --git a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingAddAllMethodDemoUnitTest.java b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingAddAllMethodDemoUnitTest.java new file mode 100644 index 0000000000..c16c7bca7c --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingAddAllMethodDemoUnitTest.java @@ -0,0 +1,18 @@ +package com.baeldung.indexoutofbounds; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class CopyListUsingAddAllMethodDemoUnitTest { + + @Test + void whenPassValidArrayList_thenCopyListUsingAddAllMethod() { + List source = Arrays.asList(11, 22, 33); + + assertEquals(source, CopyListUsingAddAllMethodDemo.copyList(source)); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemoUnitTest.java b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemoUnitTest.java new file mode 100644 index 0000000000..49d66b855c --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemoUnitTest.java @@ -0,0 +1,31 @@ +package com.baeldung.indexoutofbounds; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +public class CopyListUsingCollectionsCopyMethodDemoUnitTest { + @Test + void whenCopyListUsingCollectionsCopy_thenOverrideAllDestinationListValues() { + List source = Arrays.asList(11, 22, 33); + List destination = Arrays.asList(1, 2, 3); + + CopyListUsingCollectionsCopyMethodDemo.copyList(source, destination); + + assertEquals(source, destination); + } + + @Test + void whenCopyListUsingCollectionsCopy_thenOverrideInitialDestinationValuesAndOthersShouldBeUnchanged(){ + List source = Arrays.asList(11, 22, 33); + List destination = Arrays.asList(1, 2, 3, 4, 5); + List expectedList = Arrays.asList(11, 22, 33, 4, 5); + + CopyListUsingCollectionsCopyMethodDemo.copyList(source, destination); + + assertEquals(expectedList, destination); + } +} diff --git a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingConstructorDemoUnitTest.java b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingConstructorDemoUnitTest.java new file mode 100644 index 0000000000..9978b57ca1 --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingConstructorDemoUnitTest.java @@ -0,0 +1,18 @@ +package com.baeldung.indexoutofbounds; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class CopyListUsingConstructorDemoUnitTest { + + @Test + void whenCopyListUsingConstructor_thenMakeACopyOfList() { + List source = Arrays.asList(11, 22, 33); + + assertEquals(source, CopyListUsingConstructorDemo.copyList(source)); + } +} diff --git a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingJava8StreamDemoUnitTest.java b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingJava8StreamDemoUnitTest.java new file mode 100644 index 0000000000..1d541b03fa --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingJava8StreamDemoUnitTest.java @@ -0,0 +1,18 @@ +package com.baeldung.indexoutofbounds; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class CopyListUsingJava8StreamDemoUnitTest { + + @Test + void whenCopyListUsingStream_thenMakeACopyOfArrayList() { + List source = Arrays.asList(11, 22, 33); + + assertEquals(source, CopyListUsingJava8StreamDemo.copyList(source)); + } +} diff --git a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/IndexOutOfBoundsExceptionDemoUnitTest.java b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/IndexOutOfBoundsExceptionDemoUnitTest.java new file mode 100644 index 0000000000..6a53ce8dfc --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/IndexOutOfBoundsExceptionDemoUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.indexoutofbounds; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + + +class IndexOutOfBoundsExceptionDemoUnitTest { + + @Test + void givenDestinationArrayListSizeIsZero_whenCopySourceArrayListToDestination_thenShouldThrowIndexOutOfBoundsException() { + List source = Arrays.asList(1, 2, 3, 4, 5); + + assertThrows(IndexOutOfBoundsException.class, () -> IndexOutOfBoundsExceptionDemo.copyList(source)); + } + + @Test + void givenSourceAndDestinationListSizeIsEqual_whenCopySourceArrayListToDestination_thenShouldNotThrowIndexOutOfBoundsException() { + List source = Collections.emptyList(); + + assertEquals(source, IndexOutOfBoundsExceptionDemo.copyList(source)); + } +} From dfb6a4eec20b0e2cc8dffc6df9b963a690e8a05e Mon Sep 17 00:00:00 2001 From: Vishal Date: Tue, 27 Oct 2020 17:36:56 +0530 Subject: [PATCH 04/26] BAEL-4236 | fix the failing build --- .../core-java-exceptions-3/pom.xml | 13 ------------- .../com/baeldung/CopyListUsingJava10Demo.java | 18 ------------------ 2 files changed, 31 deletions(-) delete mode 100644 core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingJava10Demo.java diff --git a/core-java-modules/core-java-exceptions-3/pom.xml b/core-java-modules/core-java-exceptions-3/pom.xml index 19996f85af..b909572afe 100644 --- a/core-java-modules/core-java-exceptions-3/pom.xml +++ b/core-java-modules/core-java-exceptions-3/pom.xml @@ -26,19 +26,6 @@ - - - - org.apache.maven.plugins - maven-compiler-plugin - - 11 - 11 - 11 - - - - 3.10.0 diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingJava10Demo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingJava10Demo.java deleted file mode 100644 index 1a32dcec4f..0000000000 --- a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingJava10Demo.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung; - -import java.util.Arrays; -import java.util.List; - -public class CopyListUsingJava10Demo { - static List copyList(List source) { - return List.copyOf(source); - } - - public static void main(String[] args) { - List source = Arrays.asList(11, 22, 33); - - List destination = copyList(source); - - System.out.println("copy = " + destination); - } -} From 7d65b4b0ab46c27233c8ac99858046f1c2634d57 Mon Sep 17 00:00:00 2001 From: joe Date: Tue, 27 Oct 2020 21:59:40 -0400 Subject: [PATCH 05/26] [BAEL-4635] Tests for JPA Transient Annotation tutorial --- persistence-modules/java-jpa-3/pom.xml | 16 +++- .../ignorable/fields/HibernateConfig.java | 40 ++++++++++ .../com/baeldung/ignorable/fields/User.java | 80 +++++++++++++++++++ .../baeldung/ignorable/fields/UserDao.java | 32 ++++++++ .../ignorable/fields/TransientFieldTest.java | 79 ++++++++++++++++++ 5 files changed, 246 insertions(+), 1 deletion(-) create mode 100644 persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java create mode 100644 persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/User.java create mode 100644 persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/UserDao.java create mode 100644 persistence-modules/java-jpa-3/src/test/java/com/baeldung/ignorable/fields/TransientFieldTest.java diff --git a/persistence-modules/java-jpa-3/pom.xml b/persistence-modules/java-jpa-3/pom.xml index da18ae3046..7c02cc6c8e 100644 --- a/persistence-modules/java-jpa-3/pom.xml +++ b/persistence-modules/java-jpa-3/pom.xml @@ -27,7 +27,21 @@ h2 ${h2.version} - + + mysql + mysql-connector-java + 8.0.21 + + + com.fasterxml.jackson.core + jackson-databind + 2.11.3 + + + com.fasterxml.jackson.datatype + jackson-datatype-hibernate5 + 2.9.8 + javax.persistence diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java new file mode 100644 index 0000000000..f5608db8d7 --- /dev/null +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java @@ -0,0 +1,40 @@ +package com.baeldung.ignorable.fields; + +import java.util.Properties; + +import org.hibernate.SessionFactory; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.Configuration; +import org.hibernate.cfg.Environment; +import org.hibernate.service.ServiceRegistry; + +public class HibernateConfig { + private static SessionFactory sessionFactory; + + public static SessionFactory getSessionFactory() { + if (sessionFactory == null) { + try { + Configuration configuration = new Configuration(); + + Properties settings = new Properties(); + settings.put(Environment.DRIVER, "com.mysql.cj.jdbc.Driver"); + settings.put(Environment.URL, "jdbc:mysql://localhost:3306/app_db?useSSL=false"); + settings.put(Environment.USER, "root"); + settings.put(Environment.PASS, "password"); + settings.put(Environment.DIALECT, "org.hibernate.dialect.MySQL5Dialect"); + settings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread"); + configuration.setProperties(settings); + + configuration.addAnnotatedClass(User.class); + + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()) + .build(); + + sessionFactory = configuration.buildSessionFactory(serviceRegistry); + } catch (Exception e) { + e.printStackTrace(); + } + } + return sessionFactory; + } +} \ No newline at end of file diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/User.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/User.java new file mode 100644 index 0000000000..0789b93b75 --- /dev/null +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/User.java @@ -0,0 +1,80 @@ +package com.baeldung.ignorable.fields; + +import java.io.Serializable; +import java.util.StringJoiner; + +import javax.persistence.*; + +@Entity +@Table(name = "Users") +public class User implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + private String email; + private String password; + @Transient + private String currentDevice; + + // Needed for Hibernate mapping + public User() { + } + + public User(String email, String password, String currentDevice) { + this.email = email; + this.password = password; + this.currentDevice = currentDevice; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getCurrentDevice() { + return currentDevice; + } + + public void setCurrentDevice(String currentDevice) { + this.currentDevice = currentDevice; + } + + @Override + public String toString() { + return new StringJoiner(", ", User.class.getSimpleName() + "[", "]").add("id=" + id) + .add("email='" + email + "'") + .add("password='" + password + "'") + .add("currentDevice='" + currentDevice + "'") + .toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof User)) + return false; + User user = (User) o; + return email.equals(user.email); + } +} \ No newline at end of file diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/UserDao.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/UserDao.java new file mode 100644 index 0000000000..f923968ef4 --- /dev/null +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/UserDao.java @@ -0,0 +1,32 @@ +package com.baeldung.ignorable.fields; + +import java.util.List; + +import org.hibernate.Session; +import org.hibernate.Transaction; + +public class UserDao { + + public void saveUser(User user) { + Transaction transaction = null; + try (Session session = HibernateConfig.getSessionFactory() + .openSession()) { + transaction = session.beginTransaction(); + session.save(user); + transaction.commit(); + } catch (Exception e) { + e.printStackTrace(); + if (transaction != null) { + transaction.rollback(); + } + } + } + + public List getUsers() { + try (Session session = HibernateConfig.getSessionFactory() + .openSession()) { + return session.createQuery("from User", User.class) + .list(); + } + } +} diff --git a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/ignorable/fields/TransientFieldTest.java b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/ignorable/fields/TransientFieldTest.java new file mode 100644 index 0000000000..221bc9bfed --- /dev/null +++ b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/ignorable/fields/TransientFieldTest.java @@ -0,0 +1,79 @@ +package com.baeldung.ignorable.fields; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.io.*; +import java.util.List; +import java.util.Random; + +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module; + +public class TransientFieldTest { + + private final UserDao userDao = new UserDao(); + + private final int randInt = new Random().nextInt(); + + private final User user = new User("user" + randInt + "@bar.com", "hunter2", "MacOSX"); + + @Test + public void JPA_UserWithTransientAnnotation_FieldNotPersisted() { + userDao.saveUser(user); + List allUsers = userDao.getUsers(); + User savedUser = allUsers.get(allUsers.indexOf(user)); + + assertNull(savedUser.getCurrentDevice()); + } + + @Test + public void JavaSerialization_UserWithTransientAnnotation_FieldSerialized() throws IOException, ClassNotFoundException { + + FileOutputStream fout = new FileOutputStream("test.obj"); + ObjectOutputStream out = new ObjectOutputStream(fout); + out.writeObject(user); + out.flush(); + out.close(); + + FileInputStream fin = new FileInputStream("test.obj"); + ObjectInputStream in = new ObjectInputStream(fin); + User savedUser = (User) in.readObject(); + in.close(); + + assertEquals(user.getCurrentDevice(), savedUser.getCurrentDevice()); + } + + @Test + public void JSONSerialization_UserWithTransientAnnotation_FieldSerialized() throws JsonProcessingException { + ObjectMapper objectMapper = new ObjectMapper(); + String json = objectMapper.writeValueAsString(user); + User savedUser = objectMapper.readValue(json, User.class); + + assertEquals(user.getCurrentDevice(), savedUser.getCurrentDevice()); + } + + @Test + public void JSONSerialization_JacksonUsingHibernate5Module_FieldNotSerialized() throws JsonProcessingException { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.registerModule(new Hibernate5Module()); + String json = objectMapper.writeValueAsString(user); + User savedUser = objectMapper.readValue(json, User.class); + + assertNull(savedUser.getCurrentDevice()); + } + + @Test + public void JSONSerialization_MapperPropagatesTransientMarker_FieldSerialized() throws JsonProcessingException { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true); + String json = objectMapper.writeValueAsString(user); + User savedUser = objectMapper.readValue(json, User.class); + + assertEquals(user.getCurrentDevice(), savedUser.getCurrentDevice()); + } +} From 7c3fcf1c47bcd75a4ddb136218740da3dc74c3a9 Mon Sep 17 00:00:00 2001 From: joe Date: Mon, 2 Nov 2020 22:05:46 -0500 Subject: [PATCH 06/26] [BAEL-4635] Fixed tests and formatted per feedback --- .../ignorable/fields/HibernateConfig.java | 31 +++++++++---------- .../com/baeldung/ignorable/fields/User.java | 8 ++--- .../baeldung/ignorable/fields/UserDao.java | 10 ++---- ...dTest.java => TransientFieldUnitTest.java} | 12 +++---- 4 files changed, 27 insertions(+), 34 deletions(-) rename persistence-modules/java-jpa-3/src/test/java/com/baeldung/ignorable/fields/{TransientFieldTest.java => TransientFieldUnitTest.java} (77%) diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java index f5608db8d7..9285c23dfa 100644 --- a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java @@ -13,27 +13,24 @@ public class HibernateConfig { public static SessionFactory getSessionFactory() { if (sessionFactory == null) { - try { - Configuration configuration = new Configuration(); + Configuration configuration = new Configuration(); - Properties settings = new Properties(); - settings.put(Environment.DRIVER, "com.mysql.cj.jdbc.Driver"); - settings.put(Environment.URL, "jdbc:mysql://localhost:3306/app_db?useSSL=false"); - settings.put(Environment.USER, "root"); - settings.put(Environment.PASS, "password"); - settings.put(Environment.DIALECT, "org.hibernate.dialect.MySQL5Dialect"); - settings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread"); - configuration.setProperties(settings); + Properties settings = new Properties(); + settings.put(Environment.DRIVER, "com.mysql.cj.jdbc.Driver"); + settings.put(Environment.URL, "jdbc:mysql://localhost:3306/app_db?useSSL=false"); + settings.put(Environment.USER, "root"); + settings.put(Environment.PASS, "password"); + settings.put(Environment.DIALECT, "org.hibernate.dialect.MySQL5Dialect"); + settings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread"); + configuration.setProperties(settings); - configuration.addAnnotatedClass(User.class); + configuration.addAnnotatedClass(User.class); - ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()) - .build(); + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() + .applySettings(configuration.getProperties()) + .build(); - sessionFactory = configuration.buildSessionFactory(serviceRegistry); - } catch (Exception e) { - e.printStackTrace(); - } + sessionFactory = configuration.buildSessionFactory(serviceRegistry); } return sessionFactory; } diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/User.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/User.java index 0789b93b75..8d1812605d 100644 --- a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/User.java +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/User.java @@ -62,10 +62,10 @@ public class User implements Serializable { @Override public String toString() { return new StringJoiner(", ", User.class.getSimpleName() + "[", "]").add("id=" + id) - .add("email='" + email + "'") - .add("password='" + password + "'") - .add("currentDevice='" + currentDevice + "'") - .toString(); + .add("email='" + email + "'") + .add("password='" + password + "'") + .add("currentDevice='" + currentDevice + "'") + .toString(); } @Override diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/UserDao.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/UserDao.java index f923968ef4..45e491e42e 100644 --- a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/UserDao.java +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/UserDao.java @@ -9,13 +9,11 @@ public class UserDao { public void saveUser(User user) { Transaction transaction = null; - try (Session session = HibernateConfig.getSessionFactory() - .openSession()) { + try (Session session = HibernateConfig.getSessionFactory().openSession()) { transaction = session.beginTransaction(); session.save(user); transaction.commit(); } catch (Exception e) { - e.printStackTrace(); if (transaction != null) { transaction.rollback(); } @@ -23,10 +21,8 @@ public class UserDao { } public List getUsers() { - try (Session session = HibernateConfig.getSessionFactory() - .openSession()) { - return session.createQuery("from User", User.class) - .list(); + try (Session session = HibernateConfig.getSessionFactory().openSession()) { + return session.createQuery("from User", User.class).list(); } } } diff --git a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/ignorable/fields/TransientFieldTest.java b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/ignorable/fields/TransientFieldUnitTest.java similarity index 77% rename from persistence-modules/java-jpa-3/src/test/java/com/baeldung/ignorable/fields/TransientFieldTest.java rename to persistence-modules/java-jpa-3/src/test/java/com/baeldung/ignorable/fields/TransientFieldUnitTest.java index 221bc9bfed..114a4cca4c 100644 --- a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/ignorable/fields/TransientFieldTest.java +++ b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/ignorable/fields/TransientFieldUnitTest.java @@ -14,7 +14,7 @@ import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module; -public class TransientFieldTest { +public class TransientFieldUnitTest { private final UserDao userDao = new UserDao(); @@ -23,7 +23,7 @@ public class TransientFieldTest { private final User user = new User("user" + randInt + "@bar.com", "hunter2", "MacOSX"); @Test - public void JPA_UserWithTransientAnnotation_FieldNotPersisted() { + public void givenFieldWithTransientAnnotation_whenSavingViaJPA_thenFieldIgnored() { userDao.saveUser(user); List allUsers = userDao.getUsers(); User savedUser = allUsers.get(allUsers.indexOf(user)); @@ -32,7 +32,7 @@ public class TransientFieldTest { } @Test - public void JavaSerialization_UserWithTransientAnnotation_FieldSerialized() throws IOException, ClassNotFoundException { + public void givenFieldWithTransientAnnotation_whenSerializingObject_thenFieldSerialized() throws IOException, ClassNotFoundException { FileOutputStream fout = new FileOutputStream("test.obj"); ObjectOutputStream out = new ObjectOutputStream(fout); @@ -49,7 +49,7 @@ public class TransientFieldTest { } @Test - public void JSONSerialization_UserWithTransientAnnotation_FieldSerialized() throws JsonProcessingException { + public void givenFieldWithTransientAnnotation_whenSerializingToJSON_thenFieldSerialized() throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writeValueAsString(user); User savedUser = objectMapper.readValue(json, User.class); @@ -58,7 +58,7 @@ public class TransientFieldTest { } @Test - public void JSONSerialization_JacksonUsingHibernate5Module_FieldNotSerialized() throws JsonProcessingException { + public void givenJacksonHibernate5Module_whenSerializingTransientAnnotation_thenFieldIgnored() throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new Hibernate5Module()); String json = objectMapper.writeValueAsString(user); @@ -68,7 +68,7 @@ public class TransientFieldTest { } @Test - public void JSONSerialization_MapperPropagatesTransientMarker_FieldSerialized() throws JsonProcessingException { + public void givenPropagateTransientFieldFlag_whenSerializingTransientAnnotation_thenFieldSerialized() throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true); String json = objectMapper.writeValueAsString(user); From d3da953252511500578caef6aec9f41984e96ec1 Mon Sep 17 00:00:00 2001 From: Emmanuel Yasa Date: Thu, 29 Oct 2020 00:16:53 +0800 Subject: [PATCH 07/26] BAEL-4643: JPA CascadeType.REMOVE vs orphanRemoval * Defines the Domain: ShipmentInfo, LineItem and OrderRequest entity * Adds CascadeTypeRemoveIntegrationTest * Adds OrphanRemovalIntegrationTest --- .../com/baeldung/jpa/removal/LineItem.java | 42 ++++++++++ .../baeldung/jpa/removal/OrderRequest.java | 38 +++++++++ .../baeldung/jpa/removal/ShipmentInfo.java | 22 ++++++ .../main/resources/META-INF/persistence.xml | 18 +++++ .../CascadeTypeRemoveIntegrationTest.java | 72 +++++++++++++++++ .../removal/OrphanRemovalIntegrationTest.java | 78 +++++++++++++++++++ 6 files changed, 270 insertions(+) create mode 100644 persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/LineItem.java create mode 100644 persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/OrderRequest.java create mode 100644 persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/ShipmentInfo.java create mode 100644 persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/CascadeTypeRemoveIntegrationTest.java create mode 100644 persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/OrphanRemovalIntegrationTest.java diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/LineItem.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/LineItem.java new file mode 100644 index 0000000000..c926785acc --- /dev/null +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/LineItem.java @@ -0,0 +1,42 @@ +package com.baeldung.jpa.removal; + +import java.util.Objects; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.ManyToOne; + +@Entity +public class LineItem { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String name; + + @ManyToOne + private OrderRequest orderRequest; + + public LineItem(String name) { + this.name = name; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + LineItem lineItem = (LineItem) o; + + return Objects.equals(id, lineItem.id); + } + + @Override + public int hashCode() { + return id != null ? id.hashCode() : 0; + } + + protected LineItem() {} +} diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/OrderRequest.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/OrderRequest.java new file mode 100644 index 0000000000..ada0459054 --- /dev/null +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/OrderRequest.java @@ -0,0 +1,38 @@ +package com.baeldung.jpa.removal; + +import java.util.List; +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; + +@Entity +public class OrderRequest { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @OneToOne(cascade = { CascadeType.REMOVE, CascadeType.PERSIST }) + private ShipmentInfo shipmentInfo; + + @OneToMany(orphanRemoval = true, cascade = CascadeType.PERSIST, mappedBy = "orderRequest") + private List lineItems; + + public OrderRequest(ShipmentInfo shipmentInfo) { + this.shipmentInfo = shipmentInfo; + } + + public OrderRequest(List lineItems) { + this.lineItems = lineItems; + } + + public void removeLineItem(LineItem lineItem) { + lineItems.remove(lineItem); + } + + protected OrderRequest() {} +} diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/ShipmentInfo.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/ShipmentInfo.java new file mode 100644 index 0000000000..67c8151801 --- /dev/null +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/ShipmentInfo.java @@ -0,0 +1,22 @@ +package com.baeldung.jpa.removal; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class ShipmentInfo { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String name; + + public ShipmentInfo(String name) { + this.name = name; + } + + protected ShipmentInfo() {} +} diff --git a/persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml b/persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml index 28a929f912..39d55695c4 100644 --- a/persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml +++ b/persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml @@ -22,4 +22,22 @@ + + org.hibernate.jpa.HibernatePersistenceProvider + com.baeldung.jpa.removal.ShipmentInfo + com.baeldung.jpa.removal.LineItem + com.baeldung.jpa.removal.OrderRequest + true + + + + + + + + + + + + diff --git a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/CascadeTypeRemoveIntegrationTest.java b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/CascadeTypeRemoveIntegrationTest.java new file mode 100644 index 0000000000..11050a14ee --- /dev/null +++ b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/CascadeTypeRemoveIntegrationTest.java @@ -0,0 +1,72 @@ +package com.baeldung.jpa.removal; + +import java.util.List; +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class CascadeTypeRemoveIntegrationTest { + + private static EntityManagerFactory factory; + private static EntityManager entityManager; + + @BeforeClass + public static void setup() { + factory = Persistence.createEntityManagerFactory("jpa-h2-removal"); + entityManager = factory.createEntityManager(); + } + + @Test + public void whenOrderRequestIsDeleted_thenDeleteShipmentInfo() { + createOrderRequestWithShipmentInfo(); + + OrderRequest orderRequest = entityManager.find(OrderRequest.class, 1L); + + entityManager.getTransaction().begin(); + entityManager.remove(orderRequest); + entityManager.getTransaction().commit(); + + Assert.assertEquals(0, findAllOrderRequest().size()); + Assert.assertEquals(0, findAllShipmentInfo().size()); + } + + private void createOrderRequestWithShipmentInfo() { + ShipmentInfo shipmentInfo = new ShipmentInfo("name"); + OrderRequest orderRequest = new OrderRequest(shipmentInfo); + + entityManager.getTransaction().begin(); + entityManager.persist(orderRequest); + entityManager.getTransaction().commit(); + + Assert.assertEquals(1, findAllOrderRequest().size()); + Assert.assertEquals(1, findAllShipmentInfo().size()); + } + + private List findAllOrderRequest() { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(OrderRequest.class); + Root root = cq.from(OrderRequest.class); + CriteriaQuery findAll = cq.select(root); + TypedQuery findAllQuery = entityManager.createQuery(findAll); + + return findAllQuery.getResultList(); + } + + private List findAllShipmentInfo() { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(ShipmentInfo.class); + Root root = cq.from(ShipmentInfo.class); + CriteriaQuery findAll = cq.select(root); + TypedQuery findAllQuery = entityManager.createQuery(findAll); + + return findAllQuery.getResultList(); + } + +} diff --git a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/OrphanRemovalIntegrationTest.java b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/OrphanRemovalIntegrationTest.java new file mode 100644 index 0000000000..75bb321ef4 --- /dev/null +++ b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/OrphanRemovalIntegrationTest.java @@ -0,0 +1,78 @@ +package com.baeldung.jpa.removal; + +import java.util.ArrayList; +import java.util.List; +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class OrphanRemovalIntegrationTest { + + private static EntityManagerFactory factory; + private static EntityManager entityManager; + + @BeforeClass + public static void setup() { + factory = Persistence.createEntityManagerFactory("jpa-h2-removal"); + entityManager = factory.createEntityManager(); + } + + @Test + public void whenLineItemIsRemovedFromOrderRequest_thenDeleteOrphanedLineItem() { + createOrderRequestWithLineItems(); + + OrderRequest orderRequest = entityManager.find(OrderRequest.class, 1L); + LineItem lineItem = entityManager.find(LineItem.class, 2L); + orderRequest.removeLineItem(lineItem); + + entityManager.getTransaction().begin(); + entityManager.merge(orderRequest); + entityManager.getTransaction().commit(); + + Assert.assertEquals(1, findAllOrderRequest().size()); + Assert.assertEquals(2, findAllLineItem().size()); + } + + private void createOrderRequestWithLineItems() { + List lineItems = new ArrayList<>(); + lineItems.add(new LineItem("line item 1")); + lineItems.add(new LineItem("line item 2")); + lineItems.add(new LineItem("line item 3")); + + OrderRequest orderRequest = new OrderRequest(lineItems); + + entityManager.getTransaction().begin(); + entityManager.persist(orderRequest); + entityManager.getTransaction().commit(); + + Assert.assertEquals(1, findAllOrderRequest().size()); + Assert.assertEquals(3, findAllLineItem().size()); + } + + private List findAllOrderRequest() { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(OrderRequest.class); + Root root = cq.from(OrderRequest.class); + CriteriaQuery findAll = cq.select(root); + TypedQuery findAllQuery = entityManager.createQuery(findAll); + + return findAllQuery.getResultList(); + } + + private List findAllLineItem() { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(LineItem.class); + Root root = cq.from(LineItem.class); + CriteriaQuery findAll = cq.select(root); + TypedQuery findAllQuery = entityManager.createQuery(findAll); + + return findAllQuery.getResultList(); + } +} From e66514e3ddf1d5123b4bab4f2cffe8af5a9c0818 Mon Sep 17 00:00:00 2001 From: Emmanuel Yasa Date: Tue, 3 Nov 2020 19:11:44 +0800 Subject: [PATCH 08/26] BAEL-4643: JPA CascadeType.REMOVE vs orphanRemoval * Reformats code using the provided intelliJ-formatter.xml --- .../com/baeldung/jpa/removal/LineItem.java | 11 ++- .../baeldung/jpa/removal/OrderRequest.java | 5 +- .../baeldung/jpa/removal/ShipmentInfo.java | 3 +- .../main/resources/META-INF/persistence.xml | 78 +++++++++---------- .../CascadeTypeRemoveIntegrationTest.java | 9 ++- .../removal/OrphanRemovalIntegrationTest.java | 11 +-- 6 files changed, 62 insertions(+), 55 deletions(-) diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/LineItem.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/LineItem.java index c926785acc..9ab2dd4e74 100644 --- a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/LineItem.java +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/LineItem.java @@ -1,11 +1,11 @@ package com.baeldung.jpa.removal; -import java.util.Objects; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToOne; +import java.util.Objects; @Entity public class LineItem { @@ -25,8 +25,10 @@ public class LineItem { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; LineItem lineItem = (LineItem) o; @@ -38,5 +40,6 @@ public class LineItem { return id != null ? id.hashCode() : 0; } - protected LineItem() {} + protected LineItem() { + } } diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/OrderRequest.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/OrderRequest.java index ada0459054..16ee3e0109 100644 --- a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/OrderRequest.java +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/OrderRequest.java @@ -1,6 +1,5 @@ package com.baeldung.jpa.removal; -import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -8,6 +7,7 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.OneToOne; +import java.util.List; @Entity public class OrderRequest { @@ -34,5 +34,6 @@ public class OrderRequest { lineItems.remove(lineItem); } - protected OrderRequest() {} + protected OrderRequest() { + } } diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/ShipmentInfo.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/ShipmentInfo.java index 67c8151801..12274bcadf 100644 --- a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/ShipmentInfo.java +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/ShipmentInfo.java @@ -18,5 +18,6 @@ public class ShipmentInfo { this.name = name; } - protected ShipmentInfo() {} + protected ShipmentInfo() { + } } diff --git a/persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml b/persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml index 39d55695c4..88378bd8db 100644 --- a/persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml +++ b/persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml @@ -1,43 +1,43 @@ - - org.hibernate.jpa.HibernatePersistenceProvider - com.baeldung.jpa.equality.EqualByJavaDefault - com.baeldung.jpa.equality.EqualById - com.baeldung.jpa.equality.EqualByBusinessKey - true - - - - - - - - - - - - - - org.hibernate.jpa.HibernatePersistenceProvider - com.baeldung.jpa.removal.ShipmentInfo - com.baeldung.jpa.removal.LineItem - com.baeldung.jpa.removal.OrderRequest - true - - - - - - - - - - - - + version="2.2"> + + org.hibernate.jpa.HibernatePersistenceProvider + com.baeldung.jpa.equality.EqualByJavaDefault + com.baeldung.jpa.equality.EqualById + com.baeldung.jpa.equality.EqualByBusinessKey + true + + + + + + + + + + + + + + org.hibernate.jpa.HibernatePersistenceProvider + com.baeldung.jpa.removal.ShipmentInfo + com.baeldung.jpa.removal.LineItem + com.baeldung.jpa.removal.OrderRequest + true + + + + + + + + + + + + diff --git a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/CascadeTypeRemoveIntegrationTest.java b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/CascadeTypeRemoveIntegrationTest.java index 11050a14ee..8f99723ac6 100644 --- a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/CascadeTypeRemoveIntegrationTest.java +++ b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/CascadeTypeRemoveIntegrationTest.java @@ -1,6 +1,9 @@ package com.baeldung.jpa.removal; -import java.util.List; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; @@ -8,9 +11,7 @@ import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; +import java.util.List; public class CascadeTypeRemoveIntegrationTest { diff --git a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/OrphanRemovalIntegrationTest.java b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/OrphanRemovalIntegrationTest.java index 75bb321ef4..0ab6e4cfbc 100644 --- a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/OrphanRemovalIntegrationTest.java +++ b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/OrphanRemovalIntegrationTest.java @@ -1,7 +1,9 @@ package com.baeldung.jpa.removal; -import java.util.ArrayList; -import java.util.List; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; @@ -9,9 +11,8 @@ import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; +import java.util.ArrayList; +import java.util.List; public class OrphanRemovalIntegrationTest { From f6f1c110820789688e9ecbd830f6603e7bbc9724 Mon Sep 17 00:00:00 2001 From: Emmanuel Yasa Date: Wed, 4 Nov 2020 23:38:29 +0800 Subject: [PATCH 09/26] BAEL-4643: JPA CascadeType.REMOVE vs orphanRemoval * Adds a test to OrphanRemovalIntegrationTest that expects a PersistenceException --- .../baeldung/jpa/removal/OrderRequest.java | 4 ++++ .../removal/OrphanRemovalIntegrationTest.java | 19 ++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/OrderRequest.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/OrderRequest.java index 16ee3e0109..739c110d8c 100644 --- a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/OrderRequest.java +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/removal/OrderRequest.java @@ -34,6 +34,10 @@ public class OrderRequest { lineItems.remove(lineItem); } + public void setLineItems(List lineItems) { + this.lineItems = lineItems; + } + protected OrderRequest() { } } diff --git a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/OrphanRemovalIntegrationTest.java b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/OrphanRemovalIntegrationTest.java index 0ab6e4cfbc..615e8cf3a8 100644 --- a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/OrphanRemovalIntegrationTest.java +++ b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/removal/OrphanRemovalIntegrationTest.java @@ -1,12 +1,13 @@ package com.baeldung.jpa.removal; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; +import javax.persistence.PersistenceException; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; @@ -19,8 +20,8 @@ public class OrphanRemovalIntegrationTest { private static EntityManagerFactory factory; private static EntityManager entityManager; - @BeforeClass - public static void setup() { + @Before + public void setup() { factory = Persistence.createEntityManagerFactory("jpa-h2-removal"); entityManager = factory.createEntityManager(); } @@ -41,6 +42,18 @@ public class OrphanRemovalIntegrationTest { Assert.assertEquals(2, findAllLineItem().size()); } + @Test(expected = PersistenceException.class) + public void whenLineItemsIsReassigned_thenThrowAnException() { + createOrderRequestWithLineItems(); + + OrderRequest orderRequest = entityManager.find(OrderRequest.class, 1L); + orderRequest.setLineItems(new ArrayList<>()); + + entityManager.getTransaction().begin(); + entityManager.merge(orderRequest); + entityManager.getTransaction().commit(); + } + private void createOrderRequestWithLineItems() { List lineItems = new ArrayList<>(); lineItems.add(new LineItem("line item 1")); From 3dbc5e3af076f404bf1be0cef4f1e53e5767a576 Mon Sep 17 00:00:00 2001 From: Gerardo Roza Date: Fri, 6 Nov 2020 12:14:07 -0300 Subject: [PATCH 10/26] fixed tests in spring-5-reactive module --- ...g5ReactiveServerClientIntegrationTest.java | 63 +++++++------------ 1 file changed, 21 insertions(+), 42 deletions(-) diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java index b8dd9c9509..14e9ed96c0 100644 --- a/spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java @@ -7,8 +7,10 @@ import java.time.Duration; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.springframework.http.server.reactive.HttpHandler; import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter; +import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.RouterFunctions; import org.springframework.web.reactive.function.server.ServerResponse; @@ -22,6 +24,7 @@ import reactor.netty.http.server.HttpServer; public class Spring5ReactiveServerClientIntegrationTest { private static DisposableServer disposableServer; + private static WebTestClient webTestClient; @BeforeAll public static void setUp() throws Exception { @@ -37,6 +40,9 @@ public class Spring5ReactiveServerClientIntegrationTest { ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(httpHandler); disposableServer = server.handle(adapter) .bindNow(); + webTestClient = WebTestClient.bindToServer() + .baseUrl("http://localhost:8080") + .build(); } @AfterAll @@ -44,49 +50,22 @@ public class Spring5ReactiveServerClientIntegrationTest { disposableServer.disposeNow(); } - // @Test - // public void givenCheckTask_whenServerHandle_thenServerResponseALiveString() throws Exception { - // WebClient client = WebClient.create("http://localhost:8080"); - // Mono result = client - // .get() - // .uri("/task") - // .exchange() - // .then(response -> response.bodyToMono(String.class)); - // - // assertThat(result.block()).isInstanceOf(String.class); - // } + @Test + public void givenCheckTask_whenServerHandle_thenServerResponseALiveString() throws Exception { + webTestClient.get() + .uri("/task") + .exchange() + .expectBody(String.class); + } - // @Test - // public void givenThreeTasks_whenServerHandleTheTasks_thenServerResponseATask() throws Exception { - // URI uri = URI.create("http://localhost:8080/task/process"); - // ExchangeFunction exchange = ExchangeFunctions.create(new ReactorClientHttpConnector()); - // ClientRequest request = ClientRequest - // .method(HttpMethod.POST, uri) - // .body(BodyInserters.fromPublisher(getLatLngs(), Task.class)) - // .build(); - // - // Flux taskResponse = exchange - // .exchange(request) - // .flatMap(response -> response.bodyToFlux(Task.class)); - // - // assertThat(taskResponse.blockFirst()).isInstanceOf(Task.class); - // } - - // @Test - // public void givenCheckTask_whenServerHandle_thenOragicServerResponseALiveString() throws Exception { - // URI uri = URI.create("http://localhost:8080/task"); - // ExchangeFunction exchange = ExchangeFunctions.create(new ReactorClientHttpConnector()); - // ClientRequest request = ClientRequest - // .method(HttpMethod.GET, uri) - // .body(BodyInserters.fromPublisher(getLatLngs(), Task.class)) - // .build(); - // - // Flux taskResponse = exchange - // .exchange(request) - // .flatMap(response -> response.bodyToFlux(String.class)); - // - // assertThat(taskResponse.blockFirst()).isInstanceOf(String.class); - // } + @Test + public void givenThreeTasks_whenServerHandleTheTasks_thenServerResponseATask() throws Exception { + webTestClient.post() + .uri("/task/process") + .body(getLatLngs(), Task.class) + .exchange() + .expectBodyList(Task.class); + } private static Flux getLatLngs() { return Flux.range(0, 3) From 7bc828330b212906a814c8f419d0c75052d2148d Mon Sep 17 00:00:00 2001 From: Vishal Date: Sat, 7 Nov 2020 12:01:26 +0530 Subject: [PATCH 11/26] BAEL-4236 | delete duplicate classes --- .../CopyListUsingAddAllMethodDemo.java | 24 ------------------- ...opyListUsingCollectionsCopyMethodDemo.java | 21 ---------------- .../CopyListUsingConstructorDemo.java | 21 ---------------- .../CopyListUsingJava8StreamDemo.java | 22 ----------------- 4 files changed, 88 deletions(-) delete mode 100644 core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingAddAllMethodDemo.java delete mode 100644 core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingCollectionsCopyMethodDemo.java delete mode 100644 core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingConstructorDemo.java delete mode 100644 core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingJava8StreamDemo.java diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingAddAllMethodDemo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingAddAllMethodDemo.java deleted file mode 100644 index a7d24cdec8..0000000000 --- a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingAddAllMethodDemo.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class CopyListUsingAddAllMethodDemo { - - static List copyList(List source) { - List destination = new ArrayList<>(); - - destination.addAll(source); - - return destination; - } - - public static void main(String[] args) { - List source = Arrays.asList(11, 22, 33); - - List destination = copyList(source); - - System.out.println("copy = " + destination); - } -} diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingCollectionsCopyMethodDemo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingCollectionsCopyMethodDemo.java deleted file mode 100644 index bdf6726924..0000000000 --- a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingCollectionsCopyMethodDemo.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class CopyListUsingCollectionsCopyMethodDemo { - - static void copyList(List source, List destination) { - Collections.copy(destination, source); - } - - public static void main(String[] args) { - List source = Arrays.asList(11, 22, 33); - List destination = Arrays.asList(1, 2, 3, 4, 5); - - copyList(source, destination); - - System.out.println("copy = " + destination); - } -} diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingConstructorDemo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingConstructorDemo.java deleted file mode 100644 index b76a1448d4..0000000000 --- a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingConstructorDemo.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class CopyListUsingConstructorDemo { - - static List copyList(List source) { - - return new ArrayList<>(source); - } - - public static void main(String[] args) { - List source = Arrays.asList(11, 22, 33); - - List destination = copyList(source); - - System.out.println("copy = " + destination); - } -} diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingJava8StreamDemo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingJava8StreamDemo.java deleted file mode 100644 index 81ae533505..0000000000 --- a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/CopyListUsingJava8StreamDemo.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -public class CopyListUsingJava8StreamDemo { - - static List copyList(List source) { - return source - .stream() - .collect(Collectors.toList()); - } - - public static void main(String[] args) { - List source = Arrays.asList(11, 22, 33); - - List destination = copyList(source); - - System.out.println("copy = " + destination); - } -} From 01bbb91d71b7deba1dab76644d8495bd7b58f04e Mon Sep 17 00:00:00 2001 From: Vishal Date: Sat, 7 Nov 2020 12:19:25 +0530 Subject: [PATCH 12/26] BAEL-4236 | delete duplicate class IndexOutOfBoundsException.java --- .../exception/IndexOutOfBoundsException.java | 27 ------------------- 1 file changed, 27 deletions(-) delete mode 100644 core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/IndexOutOfBoundsException.java diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/IndexOutOfBoundsException.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/IndexOutOfBoundsException.java deleted file mode 100644 index a1b6bf1151..0000000000 --- a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/IndexOutOfBoundsException.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.exception; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -/** - * This example produces an IndexOutOfBoundsException, when we try to copy a list using the Collections.copy method. - * As the destination list doesn't have enough space/size to copy elements from source list. - */ -public class IndexOutOfBoundsException { - - static List copyList(List source) { - List destination = new ArrayList<>(source.size()); - Collections.copy(destination, source); - return destination; - } - - public static void main(String[] args) { - List source = Arrays.asList(1, 2, 3, 4, 5); - List copy = copyList(source); - - System.out.println("copy = " + copy); - } - -} From 05ea845ec00e6b57df28aa50238a5234975530d3 Mon Sep 17 00:00:00 2001 From: Vishal Date: Sat, 7 Nov 2020 12:21:21 +0530 Subject: [PATCH 13/26] BAEL-4236 | move all classes to package com.baeldung.exception.indexoutofbounds --- .../indexoutofbounds/CopyListUsingAddAllMethodDemo.java | 2 +- .../CopyListUsingCollectionsCopyMethodDemo.java | 2 +- .../indexoutofbounds/CopyListUsingConstructorDemo.java | 2 +- .../indexoutofbounds/CopyListUsingJava8StreamDemo.java | 2 +- .../indexoutofbounds/IndexOutOfBoundsExceptionDemo.java | 2 +- .../indexoutofbounds/CopyListUsingAddAllMethodDemoUnitTest.java | 2 +- .../CopyListUsingCollectionsCopyMethodDemoUnitTest.java | 2 +- .../indexoutofbounds/CopyListUsingConstructorDemoUnitTest.java | 2 +- .../indexoutofbounds/CopyListUsingJava8StreamDemoUnitTest.java | 2 +- .../indexoutofbounds/IndexOutOfBoundsExceptionDemoUnitTest.java | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) rename core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/{ => exception}/indexoutofbounds/CopyListUsingAddAllMethodDemo.java (85%) rename core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/{ => exception}/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemo.java (83%) rename core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/{ => exception}/indexoutofbounds/CopyListUsingConstructorDemo.java (80%) rename core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/{ => exception}/indexoutofbounds/CopyListUsingJava8StreamDemo.java (84%) rename core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/{ => exception}/indexoutofbounds/IndexOutOfBoundsExceptionDemo.java (87%) rename core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/{ => exception}/indexoutofbounds/CopyListUsingAddAllMethodDemoUnitTest.java (89%) rename core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/{ => exception}/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemoUnitTest.java (95%) rename core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/{ => exception}/indexoutofbounds/CopyListUsingConstructorDemoUnitTest.java (89%) rename core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/{ => exception}/indexoutofbounds/CopyListUsingJava8StreamDemoUnitTest.java (89%) rename core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/{ => exception}/indexoutofbounds/IndexOutOfBoundsExceptionDemoUnitTest.java (94%) diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingAddAllMethodDemo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/indexoutofbounds/CopyListUsingAddAllMethodDemo.java similarity index 85% rename from core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingAddAllMethodDemo.java rename to core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/indexoutofbounds/CopyListUsingAddAllMethodDemo.java index d3e88029c9..34e6f1c998 100644 --- a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingAddAllMethodDemo.java +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/indexoutofbounds/CopyListUsingAddAllMethodDemo.java @@ -1,4 +1,4 @@ -package com.baeldung.indexoutofbounds; +package com.baeldung.exception.indexoutofbounds; import java.util.ArrayList; import java.util.List; diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemo.java similarity index 83% rename from core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemo.java rename to core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemo.java index 6f897fdfbd..664e2152d8 100644 --- a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemo.java +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemo.java @@ -1,4 +1,4 @@ -package com.baeldung.indexoutofbounds; +package com.baeldung.exception.indexoutofbounds; import java.util.Collections; import java.util.List; diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingConstructorDemo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/indexoutofbounds/CopyListUsingConstructorDemo.java similarity index 80% rename from core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingConstructorDemo.java rename to core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/indexoutofbounds/CopyListUsingConstructorDemo.java index 6c6da80a46..493031ba0a 100644 --- a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingConstructorDemo.java +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/indexoutofbounds/CopyListUsingConstructorDemo.java @@ -1,4 +1,4 @@ -package com.baeldung.indexoutofbounds; +package com.baeldung.exception.indexoutofbounds; import java.util.ArrayList; import java.util.List; diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingJava8StreamDemo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/indexoutofbounds/CopyListUsingJava8StreamDemo.java similarity index 84% rename from core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingJava8StreamDemo.java rename to core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/indexoutofbounds/CopyListUsingJava8StreamDemo.java index 1b5a4c2e01..d9d0247d2f 100644 --- a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/CopyListUsingJava8StreamDemo.java +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/indexoutofbounds/CopyListUsingJava8StreamDemo.java @@ -1,4 +1,4 @@ -package com.baeldung.indexoutofbounds; +package com.baeldung.exception.indexoutofbounds; import java.util.List; import java.util.stream.Collectors; diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/IndexOutOfBoundsExceptionDemo.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/indexoutofbounds/IndexOutOfBoundsExceptionDemo.java similarity index 87% rename from core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/IndexOutOfBoundsExceptionDemo.java rename to core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/indexoutofbounds/IndexOutOfBoundsExceptionDemo.java index 3088811d60..78b7b03bc1 100644 --- a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/indexoutofbounds/IndexOutOfBoundsExceptionDemo.java +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exception/indexoutofbounds/IndexOutOfBoundsExceptionDemo.java @@ -1,4 +1,4 @@ -package com.baeldung.indexoutofbounds; +package com.baeldung.exception.indexoutofbounds; import java.util.ArrayList; import java.util.Collections; diff --git a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingAddAllMethodDemoUnitTest.java b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exception/indexoutofbounds/CopyListUsingAddAllMethodDemoUnitTest.java similarity index 89% rename from core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingAddAllMethodDemoUnitTest.java rename to core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exception/indexoutofbounds/CopyListUsingAddAllMethodDemoUnitTest.java index c16c7bca7c..204bbff696 100644 --- a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingAddAllMethodDemoUnitTest.java +++ b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exception/indexoutofbounds/CopyListUsingAddAllMethodDemoUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.indexoutofbounds; +package com.baeldung.exception.indexoutofbounds; import org.junit.jupiter.api.Test; diff --git a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemoUnitTest.java b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exception/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemoUnitTest.java similarity index 95% rename from core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemoUnitTest.java rename to core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exception/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemoUnitTest.java index 49d66b855c..7ebf7461a6 100644 --- a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemoUnitTest.java +++ b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exception/indexoutofbounds/CopyListUsingCollectionsCopyMethodDemoUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.indexoutofbounds; +package com.baeldung.exception.indexoutofbounds; import org.junit.jupiter.api.Test; diff --git a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingConstructorDemoUnitTest.java b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exception/indexoutofbounds/CopyListUsingConstructorDemoUnitTest.java similarity index 89% rename from core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingConstructorDemoUnitTest.java rename to core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exception/indexoutofbounds/CopyListUsingConstructorDemoUnitTest.java index 9978b57ca1..cd15c5055c 100644 --- a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingConstructorDemoUnitTest.java +++ b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exception/indexoutofbounds/CopyListUsingConstructorDemoUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.indexoutofbounds; +package com.baeldung.exception.indexoutofbounds; import org.junit.jupiter.api.Test; diff --git a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingJava8StreamDemoUnitTest.java b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exception/indexoutofbounds/CopyListUsingJava8StreamDemoUnitTest.java similarity index 89% rename from core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingJava8StreamDemoUnitTest.java rename to core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exception/indexoutofbounds/CopyListUsingJava8StreamDemoUnitTest.java index 1d541b03fa..9fb8e16b2a 100644 --- a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/CopyListUsingJava8StreamDemoUnitTest.java +++ b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exception/indexoutofbounds/CopyListUsingJava8StreamDemoUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.indexoutofbounds; +package com.baeldung.exception.indexoutofbounds; import org.junit.jupiter.api.Test; diff --git a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/IndexOutOfBoundsExceptionDemoUnitTest.java b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exception/indexoutofbounds/IndexOutOfBoundsExceptionDemoUnitTest.java similarity index 94% rename from core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/IndexOutOfBoundsExceptionDemoUnitTest.java rename to core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exception/indexoutofbounds/IndexOutOfBoundsExceptionDemoUnitTest.java index 6a53ce8dfc..9929fa78d3 100644 --- a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/indexoutofbounds/IndexOutOfBoundsExceptionDemoUnitTest.java +++ b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exception/indexoutofbounds/IndexOutOfBoundsExceptionDemoUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.indexoutofbounds; +package com.baeldung.exception.indexoutofbounds; import org.junit.jupiter.api.Test; From 640f7f589f49d9463b2becb2e3065b3ac3662d0e Mon Sep 17 00:00:00 2001 From: Jordan Simpson Date: Sun, 8 Nov 2020 10:34:48 -0600 Subject: [PATCH 14/26] Bael 4700 (#10231) * Added code examples from the article. * Hide the revoked token * Reduce long line break indentation to 2 spaces, change "your" to "our," and use the -LiveTest convention for the test class. * Reduce Java version from 11 to 1.8 and add the new discord4j module to the root pom. * Remove test due to context failing to start up without a valid bot token. * Replace test class and add error handling for invalid tokens. --- discord4j/.gitignore | 33 ++++++++++ discord4j/pom.xml | 63 +++++++++++++++++++ .../baeldung/discordbot/BotConfiguration.java | 48 ++++++++++++++ .../discordbot/DiscordBotApplication.java | 12 ++++ .../discordbot/events/EventListener.java | 19 ++++++ .../events/MessageCreateListener.java | 19 ++++++ .../discordbot/events/MessageListener.java | 19 ++++++ .../events/MessageUpdateListener.java | 22 +++++++ discord4j/src/main/resources/application.yml | 1 + .../discordbot/DiscordBotLiveTest.java | 12 ++++ pom.xml | 2 + 11 files changed, 250 insertions(+) create mode 100644 discord4j/.gitignore create mode 100644 discord4j/pom.xml create mode 100644 discord4j/src/main/java/com/baeldung/discordbot/BotConfiguration.java create mode 100644 discord4j/src/main/java/com/baeldung/discordbot/DiscordBotApplication.java create mode 100644 discord4j/src/main/java/com/baeldung/discordbot/events/EventListener.java create mode 100644 discord4j/src/main/java/com/baeldung/discordbot/events/MessageCreateListener.java create mode 100644 discord4j/src/main/java/com/baeldung/discordbot/events/MessageListener.java create mode 100644 discord4j/src/main/java/com/baeldung/discordbot/events/MessageUpdateListener.java create mode 100644 discord4j/src/main/resources/application.yml create mode 100644 discord4j/src/test/java/com/baeldung/discordbot/DiscordBotLiveTest.java diff --git a/discord4j/.gitignore b/discord4j/.gitignore new file mode 100644 index 0000000000..b56f1dd0d0 --- /dev/null +++ b/discord4j/.gitignore @@ -0,0 +1,33 @@ +README.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/discord4j/pom.xml b/discord4j/pom.xml new file mode 100644 index 0000000000..7687f63ad5 --- /dev/null +++ b/discord4j/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.3.5.RELEASE + + + com.baeldung + discord4j-bot + 0.0.1-SNAPSHOT + discord4j-bot + Demo Discord bot using Discord4J + Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + com.discord4j + discord4j-core + 3.1.1 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + diff --git a/discord4j/src/main/java/com/baeldung/discordbot/BotConfiguration.java b/discord4j/src/main/java/com/baeldung/discordbot/BotConfiguration.java new file mode 100644 index 0000000000..a60005e9b5 --- /dev/null +++ b/discord4j/src/main/java/com/baeldung/discordbot/BotConfiguration.java @@ -0,0 +1,48 @@ +package com.baeldung.discordbot; + +import com.baeldung.discordbot.events.EventListener; +import discord4j.core.DiscordClientBuilder; +import discord4j.core.GatewayDiscordClient; +import discord4j.core.event.domain.Event; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +@Configuration +public class BotConfiguration { + + private static final Logger log = LoggerFactory.getLogger( BotConfiguration.class ); + + @Value("${token}") + private String token; + + @Bean + public GatewayDiscordClient gatewayDiscordClient(List> eventListeners) { + GatewayDiscordClient client = null; + + try { + client = DiscordClientBuilder.create(token) + .build() + .login() + .block(); + + for(EventListener listener : eventListeners) { + client.on(listener.getEventType()) + .flatMap(listener::execute) + .onErrorResume(listener::handleError) + .subscribe(); + } + + client.onDisconnect().block(); + } + catch ( Exception exception ) { + log.error( "Be sure to use a valid bot token!", exception ); + } + + return client; + } +} diff --git a/discord4j/src/main/java/com/baeldung/discordbot/DiscordBotApplication.java b/discord4j/src/main/java/com/baeldung/discordbot/DiscordBotApplication.java new file mode 100644 index 0000000000..069a36635c --- /dev/null +++ b/discord4j/src/main/java/com/baeldung/discordbot/DiscordBotApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.discordbot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DiscordBotApplication { + + public static void main(String[] args) { + SpringApplication.run(DiscordBotApplication.class, args); + } +} diff --git a/discord4j/src/main/java/com/baeldung/discordbot/events/EventListener.java b/discord4j/src/main/java/com/baeldung/discordbot/events/EventListener.java new file mode 100644 index 0000000000..ca4c79de0d --- /dev/null +++ b/discord4j/src/main/java/com/baeldung/discordbot/events/EventListener.java @@ -0,0 +1,19 @@ +package com.baeldung.discordbot.events; + +import discord4j.core.event.domain.Event; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import reactor.core.publisher.Mono; + +public interface EventListener { + + Logger LOG = LoggerFactory.getLogger(EventListener.class); + + Class getEventType(); + Mono execute(T event); + + default Mono handleError(Throwable error) { + LOG.error("Unable to process " + getEventType().getSimpleName(), error); + return Mono.empty(); + } +} diff --git a/discord4j/src/main/java/com/baeldung/discordbot/events/MessageCreateListener.java b/discord4j/src/main/java/com/baeldung/discordbot/events/MessageCreateListener.java new file mode 100644 index 0000000000..f545489804 --- /dev/null +++ b/discord4j/src/main/java/com/baeldung/discordbot/events/MessageCreateListener.java @@ -0,0 +1,19 @@ +package com.baeldung.discordbot.events; + +import discord4j.core.event.domain.message.MessageCreateEvent; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Mono; + +@Service +public class MessageCreateListener extends MessageListener implements EventListener { + + @Override + public Class getEventType() { + return MessageCreateEvent.class; + } + + @Override + public Mono execute(MessageCreateEvent event) { + return processCommand(event.getMessage()); + } +} diff --git a/discord4j/src/main/java/com/baeldung/discordbot/events/MessageListener.java b/discord4j/src/main/java/com/baeldung/discordbot/events/MessageListener.java new file mode 100644 index 0000000000..e1f48468be --- /dev/null +++ b/discord4j/src/main/java/com/baeldung/discordbot/events/MessageListener.java @@ -0,0 +1,19 @@ +package com.baeldung.discordbot.events; + +import discord4j.core.object.entity.Message; +import reactor.core.publisher.Mono; + +public abstract class MessageListener { + + public Mono processCommand(Message eventMessage) { + return Mono.just(eventMessage) + .filter(message -> message.getAuthor().map(user -> !user.isBot()).orElse(false)) + .filter(message -> message.getContent().equalsIgnoreCase("!todo")) + .flatMap(Message::getChannel) + .flatMap(channel -> channel.createMessage("Things to do today:\n" + + " - write a bot\n" + + " - eat lunch\n" + + " - play a game")) + .then(); + } +} diff --git a/discord4j/src/main/java/com/baeldung/discordbot/events/MessageUpdateListener.java b/discord4j/src/main/java/com/baeldung/discordbot/events/MessageUpdateListener.java new file mode 100644 index 0000000000..62802d4903 --- /dev/null +++ b/discord4j/src/main/java/com/baeldung/discordbot/events/MessageUpdateListener.java @@ -0,0 +1,22 @@ +package com.baeldung.discordbot.events; + +import discord4j.core.event.domain.message.MessageUpdateEvent; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Mono; + +@Service +public class MessageUpdateListener extends MessageListener implements EventListener { + + @Override + public Class getEventType() { + return MessageUpdateEvent.class; + } + + @Override + public Mono execute(MessageUpdateEvent event) { + return Mono.just(event) + .filter(MessageUpdateEvent::isContentChanged) + .flatMap(MessageUpdateEvent::getMessage) + .flatMap(super::processCommand); + } +} diff --git a/discord4j/src/main/resources/application.yml b/discord4j/src/main/resources/application.yml new file mode 100644 index 0000000000..e2079e33b4 --- /dev/null +++ b/discord4j/src/main/resources/application.yml @@ -0,0 +1 @@ +token: 'our-token-here' diff --git a/discord4j/src/test/java/com/baeldung/discordbot/DiscordBotLiveTest.java b/discord4j/src/test/java/com/baeldung/discordbot/DiscordBotLiveTest.java new file mode 100644 index 0000000000..8d9a285748 --- /dev/null +++ b/discord4j/src/test/java/com/baeldung/discordbot/DiscordBotLiveTest.java @@ -0,0 +1,12 @@ +package com.baeldung.discordbot; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class DiscordBotLiveTest { + + @Test + public void contextTest() { + } +} diff --git a/pom.xml b/pom.xml index cba7e33b03..6c96d8d77e 100644 --- a/pom.xml +++ b/pom.xml @@ -397,6 +397,7 @@ ddd deeplearning4j + discord4j disruptor dozer drools @@ -909,6 +910,7 @@ ddd deeplearning4j + discord4j disruptor dozer drools From 180799240671eccb84bd69c17d7eb39977c1488a Mon Sep 17 00:00:00 2001 From: Bradley M Handy Date: Mon, 9 Nov 2020 12:37:47 -0500 Subject: [PATCH 15/26] BAEL-4209: Difference between e.getMessage() and e.getLocalizedMessage() (#10222) * - initial commit of sample code * BAEL-4209: Moving the localized exception module into core-java-exceptions-3. * BAEL-4209: Removed the old files for localizing exception messages. --- .../localization/LocalizedException.java | 47 ++++++++++++++ .../exceptions/localization/Messages.java | 27 ++++++++ .../src/main/resources/messages.properties | 1 + .../src/main/resources/messages_fr.properties | 1 + .../LocalizedExceptionUnitTest.java | 61 +++++++++++++++++++ .../localization/MessagesUnitTest.java | 25 ++++++++ 6 files changed, 162 insertions(+) create mode 100644 core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/localization/LocalizedException.java create mode 100644 core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/localization/Messages.java create mode 100644 core-java-modules/core-java-exceptions-3/src/main/resources/messages.properties create mode 100644 core-java-modules/core-java-exceptions-3/src/main/resources/messages_fr.properties create mode 100644 core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/localization/LocalizedExceptionUnitTest.java create mode 100644 core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/localization/MessagesUnitTest.java diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/localization/LocalizedException.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/localization/LocalizedException.java new file mode 100644 index 0000000000..c3f9980b99 --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/localization/LocalizedException.java @@ -0,0 +1,47 @@ +package com.baeldung.exceptions.localization; + +import java.util.Locale; + +public class LocalizedException extends Exception { + + private static final long serialVersionUID = 1L; + + private final String messageKey; + private final Locale locale; + + public LocalizedException(String messageKey) { + this(messageKey, Locale.getDefault()); + } + + public LocalizedException(String messageKey, Locale locale) { + this.messageKey = messageKey; + this.locale = locale; + } + + /** + * @return a localized message based on the messageKey provided at instantiation. + */ + public String getMessage() { + + /* + * This is a deliberate role reversal of the default implementation of getLocalizedMessage. + * some logging frameworks like Log4J 1 & 2 and Logback will use getMessage instead of + * getLocalizedMessage when logging Throwables. If we want to use these frameworks in client + * applications to log localized messages, then we'll need to override getMessage in a + * similar fashion to return the appropriate content. Or, you can call getLocalizedMessage + * on your own to create the log content. + */ + return getLocalizedMessage(); + } + + /** + * @return a localized message based on the messageKey provided at instantiation. + */ + public String getLocalizedMessage() { + + /* + * java.util.logging uses getLocalizedMessage when logging Throwables. + */ + return Messages.getMessageForLocale(messageKey, locale); + } +} diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/localization/Messages.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/localization/Messages.java new file mode 100644 index 0000000000..1079bedd1a --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/localization/Messages.java @@ -0,0 +1,27 @@ +package com.baeldung.exceptions.localization; + +import java.util.Locale; +import java.util.ResourceBundle; + +public class Messages { + + /** + * Retrieves the value for the messageKey from the locale-specific messages.properties, or from + * the base messages.properties for unsupported locales. + * + * @param messageKey The key for the message in the messages.properties ResourceBundle. + * @param locale The locale to search the message key. + * @return The value defined for the messageKey in the provided locale. + */ + public static String getMessageForLocale(String messageKey, Locale locale) { + + /* + * For more complex implementations, you will want a var-args parameter for MessageFormat + * substitutions. Then we can read the value from the bundle and pass the value with the + * substitutions to MessageFormat to create the final message value. + */ + return ResourceBundle.getBundle("messages", locale) + .getString(messageKey); + } + +} diff --git a/core-java-modules/core-java-exceptions-3/src/main/resources/messages.properties b/core-java-modules/core-java-exceptions-3/src/main/resources/messages.properties new file mode 100644 index 0000000000..b6122d7f21 --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/main/resources/messages.properties @@ -0,0 +1 @@ +message.exception = I am an exception. \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions-3/src/main/resources/messages_fr.properties b/core-java-modules/core-java-exceptions-3/src/main/resources/messages_fr.properties new file mode 100644 index 0000000000..f28e0d54ff --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/main/resources/messages_fr.properties @@ -0,0 +1 @@ +message.exception = Je suis une exception. \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/localization/LocalizedExceptionUnitTest.java b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/localization/LocalizedExceptionUnitTest.java new file mode 100644 index 0000000000..a46ca05d23 --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/localization/LocalizedExceptionUnitTest.java @@ -0,0 +1,61 @@ +package com.baeldung.exceptions.localization; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.util.Locale; + +import static org.assertj.core.api.Assertions.assertThat; + +public class LocalizedExceptionUnitTest { + + private Locale originalDefaultLocale; + + @Before + public void saveOriginalDefaultLocale() { + originalDefaultLocale = Locale.getDefault(); + } + + @After + public void restoreOriginalDefaultLocale() { + Locale.setDefault(originalDefaultLocale); + } + + @Test + public void givenUsEnglishDefaultLocale_whenLocalizingMessage_thenMessageComesFromDefaultMessages() { + Locale.setDefault(Locale.US); + + LocalizedException localizedException = new LocalizedException("message.exception"); + String usEnglishLocalizedExceptionMessage = localizedException.getLocalizedMessage(); + + assertThat(usEnglishLocalizedExceptionMessage).isEqualTo("I am an exception."); + } + + @Test + public void givenFranceFrenchDefaultLocale_whenLocalizingMessage_thenMessageComesFromFrenchTranslationMessages() { + Locale.setDefault(Locale.FRANCE); + + LocalizedException localizedException = new LocalizedException("message.exception"); + String franceFrenchLocalizedExceptionMessage = localizedException.getLocalizedMessage(); + + assertThat(franceFrenchLocalizedExceptionMessage).isEqualTo("Je suis une exception."); + } + + @Test + public void givenUsEnglishProvidedLocale_whenLocalizingMessage_thenMessageComesFromDefaultMessage() { + LocalizedException localizedException = new LocalizedException("message.exception", Locale.US); + String usEnglishLocalizedExceptionMessage = localizedException.getLocalizedMessage(); + + assertThat(usEnglishLocalizedExceptionMessage).isEqualTo("I am an exception."); + } + + @Test + public void givenFranceFrenchProvidedLocale_whenLocalizingMessage_thenMessageComesFromFrenchTranslationMessages() { + LocalizedException localizedException = new LocalizedException("message.exception", Locale.FRANCE); + String franceFrenchLocalizedExceptionMessage = localizedException.getLocalizedMessage(); + + assertThat(franceFrenchLocalizedExceptionMessage).isEqualTo("Je suis une exception."); + } + +} diff --git a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/localization/MessagesUnitTest.java b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/localization/MessagesUnitTest.java new file mode 100644 index 0000000000..7a6cb8ed32 --- /dev/null +++ b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/localization/MessagesUnitTest.java @@ -0,0 +1,25 @@ +package com.baeldung.exceptions.localization; + +import org.junit.Test; + +import java.util.Locale; + +import static org.assertj.core.api.Assertions.assertThat; + +public class MessagesUnitTest { + + @Test + public void givenUsEnglishLocale_whenRetrievingMessage_thenEnglishTranslationIsReturned() { + String translatedMessage = Messages.getMessageForLocale("message.exception", Locale.US); + + assertThat(translatedMessage).isEqualTo("I am an exception."); + } + + @Test + public void givenFranceFrenchLocale_whenRetrievingMessage_thenFrenchTranslationIsReturned() { + String translatedMessage = Messages.getMessageForLocale("message.exception", Locale.FRANCE); + + assertThat(translatedMessage).isEqualTo("Je suis une exception."); + } + +} From 958206c54b20272b617428344620a662dfb5dbe6 Mon Sep 17 00:00:00 2001 From: Gerardo Roza Date: Tue, 10 Nov 2020 12:04:40 -0300 Subject: [PATCH 16/26] removed test as it's not related to any article --- ...g5ReactiveServerClientIntegrationTest.java | 76 ------------------- 1 file changed, 76 deletions(-) delete mode 100644 spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java deleted file mode 100644 index 14e9ed96c0..0000000000 --- a/spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.baeldung.reactive; - -import static org.springframework.web.reactive.function.server.RequestPredicates.GET; -import static org.springframework.web.reactive.function.server.RequestPredicates.POST; - -import java.time.Duration; - -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.springframework.http.server.reactive.HttpHandler; -import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter; -import org.springframework.test.web.reactive.server.WebTestClient; -import org.springframework.web.reactive.function.server.RouterFunction; -import org.springframework.web.reactive.function.server.RouterFunctions; -import org.springframework.web.reactive.function.server.ServerResponse; - -import com.baeldung.web.reactive.Task; - -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import reactor.netty.DisposableServer; -import reactor.netty.http.server.HttpServer; - -public class Spring5ReactiveServerClientIntegrationTest { - private static DisposableServer disposableServer; - private static WebTestClient webTestClient; - - @BeforeAll - public static void setUp() throws Exception { - HttpServer server = HttpServer.create() - .host("localhost") - .port(8080); - RouterFunction route = RouterFunctions.route(POST("/task/process"), request -> ServerResponse.ok() - .body(request.bodyToFlux(Task.class) - .map(ll -> new Task("TaskName", 1)), Task.class)) - .and(RouterFunctions.route(GET("/task"), request -> ServerResponse.ok() - .body(Mono.just("server is alive"), String.class))); - HttpHandler httpHandler = RouterFunctions.toHttpHandler(route); - ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(httpHandler); - disposableServer = server.handle(adapter) - .bindNow(); - webTestClient = WebTestClient.bindToServer() - .baseUrl("http://localhost:8080") - .build(); - } - - @AfterAll - public static void shutDown() { - disposableServer.disposeNow(); - } - - @Test - public void givenCheckTask_whenServerHandle_thenServerResponseALiveString() throws Exception { - webTestClient.get() - .uri("/task") - .exchange() - .expectBody(String.class); - } - - @Test - public void givenThreeTasks_whenServerHandleTheTasks_thenServerResponseATask() throws Exception { - webTestClient.post() - .uri("/task/process") - .body(getLatLngs(), Task.class) - .exchange() - .expectBodyList(Task.class); - } - - private static Flux getLatLngs() { - return Flux.range(0, 3) - .zipWith(Flux.interval(Duration.ofSeconds(1))) - .map(x -> new Task("taskname", 1)) - .doOnNext(ll -> System.out.println("Produced: {}" + ll)); - } -} From 19b70f1d91454135b99aaa6998b09a3e43c3bc03 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 11 Nov 2020 20:11:57 +0800 Subject: [PATCH 17/26] Update README.md --- core-java-modules/core-java-lang-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-3/README.md b/core-java-modules/core-java-lang-3/README.md index 0707d0de98..78491e5bfa 100644 --- a/core-java-modules/core-java-lang-3/README.md +++ b/core-java-modules/core-java-lang-3/README.md @@ -8,4 +8,5 @@ This module contains articles about core features in the Java language - [Checking if a Class Exists in Java](https://www.baeldung.com/java-check-class-exists) - [The Difference Between a.getClass() and A.class in Java](https://www.baeldung.com/java-getclass-vs-class) - [Constants in Java: Patterns and Anti-Patterns](https://www.baeldung.com/java-constants-good-practices) +- [The transient Keyword in Java](https://www.baeldung.com/java-transient-keyword) - [[<-- Prev]](/core-java-modules/core-java-lang-2) From 14d33d55bcc9e085438e83a816815cd9187da7ab Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 11 Nov 2020 20:13:52 +0800 Subject: [PATCH 18/26] Update README.md --- core-java-modules/core-java-string-operations-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-operations-3/README.md b/core-java-modules/core-java-string-operations-3/README.md index 4e46849c11..7f391ee056 100644 --- a/core-java-modules/core-java-string-operations-3/README.md +++ b/core-java-modules/core-java-string-operations-3/README.md @@ -1,3 +1,4 @@ ### Relevant Articles: - [Version Comparison in Java](https://www.baeldung.com/java-comparing-versions) +- [Java (String) or .toString()?](https://www.baeldung.com/java-string-casting-vs-tostring) From c6d63614da6c6cb0c25b45e05bb0f39c3ad207ab Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 11 Nov 2020 21:18:12 +0800 Subject: [PATCH 19/26] Update README.md --- core-java-modules/core-java-lang-oop-types/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-oop-types/README.md b/core-java-modules/core-java-lang-oop-types/README.md index 459352c490..6c649877b3 100644 --- a/core-java-modules/core-java-lang-oop-types/README.md +++ b/core-java-modules/core-java-lang-oop-types/README.md @@ -12,3 +12,4 @@ This module contains articles about types in Java - [Attaching Values to Java Enum](https://www.baeldung.com/java-enum-values) - [A Guide to Java Enums](https://www.baeldung.com/a-guide-to-java-enums) - [Determine if an Object is of Primitive Type](https://www.baeldung.com/java-object-primitive-type) +- [Extending Enums in Java](https://www.baeldung.com/java-extending-enums) From b731ee1633a45918a2e2fc84df7fe6cda66485a3 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 11 Nov 2020 21:19:54 +0800 Subject: [PATCH 20/26] Update README.md --- java-native/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-native/README.md b/java-native/README.md index 2e2047924b..4f85342a38 100644 --- a/java-native/README.md +++ b/java-native/README.md @@ -6,3 +6,4 @@ This module contains articles about the Java Native Interface (JNI). - [Guide to JNI (Java Native Interface)](https://www.baeldung.com/jni) - [Using JNA to Access Native Dynamic Libraries](https://www.baeldung.com/java-jna-dynamic-libraries) +- [Check if a Java Program Is Running in 64-Bit or 32-Bit JVM](https://www.baeldung.com/java-detect-jvm-64-or-32-bit) From 8dbb2084e8ee607b58ac8a22bc2fad3ab9c52d30 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 11 Nov 2020 21:22:12 +0800 Subject: [PATCH 21/26] Update README.md --- core-java-modules/core-java-functional/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core-java-modules/core-java-functional/README.md b/core-java-modules/core-java-functional/README.md index ff12555376..5891b4a943 100644 --- a/core-java-modules/core-java-functional/README.md +++ b/core-java-modules/core-java-functional/README.md @@ -1 +1,3 @@ ## Relevant articles: + +- [Functional Programming in Java](https://www.baeldung.com/java-functional-programming) From ccee6520f3390d84225f89e68e1d52e8b457ed87 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 11 Nov 2020 21:24:16 +0800 Subject: [PATCH 22/26] Update README.md --- core-java-modules/core-java-exceptions-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-exceptions-3/README.md b/core-java-modules/core-java-exceptions-3/README.md index f136a73daf..8922c159b9 100644 --- a/core-java-modules/core-java-exceptions-3/README.md +++ b/core-java-modules/core-java-exceptions-3/README.md @@ -4,3 +4,4 @@ - [IllegalArgumentException or NullPointerException for a Null Parameter?](https://www.baeldung.com/java-illegalargumentexception-or-nullpointerexception) - [IllegalMonitorStateException in Java](https://www.baeldung.com/java-illegalmonitorstateexception) - [AbstractMethodError in Java](https://www.baeldung.com/java-abstractmethoderror) +- [Java IndexOutOfBoundsException “Source Does Not Fit in Dest”](https://www.baeldung.com/java-indexoutofboundsexception) From df816b18991cb7a8b8346bc03b0b87ab854cf96c Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 11 Nov 2020 21:24:47 +0800 Subject: [PATCH 23/26] Update README.md --- core-java-modules/core-java-10/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-10/README.md b/core-java-modules/core-java-10/README.md index 23f598b902..38b1db1c05 100644 --- a/core-java-modules/core-java-10/README.md +++ b/core-java-modules/core-java-10/README.md @@ -10,3 +10,4 @@ This module contains articles about Java 10 core features - [Deep Dive Into the New Java JIT Compiler – Graal](https://www.baeldung.com/graal-java-jit-compiler) - [Copying Sets in Java](https://www.baeldung.com/java-copy-sets) - [Converting between a List and a Set in Java](https://www.baeldung.com/convert-list-to-set-and-set-to-list) +- [Java IndexOutOfBoundsException “Source Does Not Fit in Dest”](https://www.baeldung.com/java-indexoutofboundsexception) From 401ccd1abfc8a6bf6877a187df05ef334ff0aa5e Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 11 Nov 2020 21:30:48 +0800 Subject: [PATCH 24/26] Update README.md --- core-java-modules/core-java-exceptions-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-exceptions-3/README.md b/core-java-modules/core-java-exceptions-3/README.md index 8922c159b9..f93e1a9943 100644 --- a/core-java-modules/core-java-exceptions-3/README.md +++ b/core-java-modules/core-java-exceptions-3/README.md @@ -5,3 +5,4 @@ - [IllegalMonitorStateException in Java](https://www.baeldung.com/java-illegalmonitorstateexception) - [AbstractMethodError in Java](https://www.baeldung.com/java-abstractmethoderror) - [Java IndexOutOfBoundsException “Source Does Not Fit in Dest”](https://www.baeldung.com/java-indexoutofboundsexception) +- [Localizing Exception Messages in Java](https://www.baeldung.com/java-localize-exception-messages) From 1334e1a27974b4b831255d27a20a70bb57efdfb6 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 11 Nov 2020 21:32:16 +0800 Subject: [PATCH 25/26] Update README.md --- persistence-modules/java-jpa-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/java-jpa-3/README.md b/persistence-modules/java-jpa-3/README.md index dce9c4e711..504c7ccdd0 100644 --- a/persistence-modules/java-jpa-3/README.md +++ b/persistence-modules/java-jpa-3/README.md @@ -5,3 +5,4 @@ This module contains articles about the Java Persistence API (JPA) in Java. ### Relevant Articles: - [JPA Entity Equality](https://www.baeldung.com/jpa-entity-equality) +- [Ignoring Fields With the JPA @Transient Annotation](https://www.baeldung.com/jpa-transient-ignore-field) From 406482442543bed4a21f2016b367b7993a387c25 Mon Sep 17 00:00:00 2001 From: Harihar Das Date: Thu, 12 Nov 2020 21:22:06 +0100 Subject: [PATCH 26/26] [KTLN-3] Fix package name (#10246) --- .../com/baeldung/{channles => channels}/BufferedChannel.kt | 2 +- .../com/baeldung/{channles => channels}/ConflatedChannel.kt | 2 +- .../com/baeldung/{channles => channels}/PizzaPipeline.kt | 4 ++-- .../com/baeldung/{channles => channels}/ProducerConsumer.kt | 2 +- .../com/baeldung/{channles => channels}/RendezvousChannel.kt | 2 +- .../{channles => channels}/SeveralProducersOneConsumer.kt | 2 +- .../{channles => channels}/SingleProducerSeveralConsumers.kt | 2 +- .../com/baeldung/{channles => channels}/TickerChannel.kt | 2 +- .../com/baeldung/{channles => channels}/UnlimitedChannel.kt | 2 +- .../main/kotlin/com/baeldung/{channles => channels}/logger.kt | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) rename core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/{channles => channels}/BufferedChannel.kt (95%) rename core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/{channles => channels}/ConflatedChannel.kt (95%) rename core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/{channles => channels}/PizzaPipeline.kt (94%) rename core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/{channles => channels}/ProducerConsumer.kt (95%) rename core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/{channles => channels}/RendezvousChannel.kt (94%) rename core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/{channles => channels}/SeveralProducersOneConsumer.kt (96%) rename core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/{channles => channels}/SingleProducerSeveralConsumers.kt (96%) rename core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/{channles => channels}/TickerChannel.kt (94%) rename core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/{channles => channels}/UnlimitedChannel.kt (95%) rename core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/{channles => channels}/logger.kt (83%) diff --git a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/BufferedChannel.kt b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/BufferedChannel.kt similarity index 95% rename from core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/BufferedChannel.kt rename to core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/BufferedChannel.kt index 6cfaf5b496..5fefc2f95e 100644 --- a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/BufferedChannel.kt +++ b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/BufferedChannel.kt @@ -1,4 +1,4 @@ -package com.baeldung.channles +package com.baeldung.channels import kotlinx.coroutines.cancelChildren import kotlinx.coroutines.channels.Channel diff --git a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/ConflatedChannel.kt b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/ConflatedChannel.kt similarity index 95% rename from core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/ConflatedChannel.kt rename to core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/ConflatedChannel.kt index 63b0b967c1..6225eeb107 100644 --- a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/ConflatedChannel.kt +++ b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/ConflatedChannel.kt @@ -1,4 +1,4 @@ -package com.baeldung.channles +package com.baeldung.channels import kotlinx.coroutines.cancelChildren import kotlinx.coroutines.channels.Channel diff --git a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/PizzaPipeline.kt b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/PizzaPipeline.kt similarity index 94% rename from core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/PizzaPipeline.kt rename to core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/PizzaPipeline.kt index ff4dcb2d32..abc8be4d18 100644 --- a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/PizzaPipeline.kt +++ b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/PizzaPipeline.kt @@ -1,6 +1,6 @@ -package com.baeldung.channles +package com.baeldung.channels -import com.baeldung.channles.OrderStatus.* +import com.baeldung.channels.OrderStatus.* import kotlinx.coroutines.* import kotlinx.coroutines.channels.ReceiveChannel import kotlinx.coroutines.channels.produce diff --git a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/ProducerConsumer.kt b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/ProducerConsumer.kt similarity index 95% rename from core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/ProducerConsumer.kt rename to core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/ProducerConsumer.kt index 50687b909a..37f3c7d7bb 100644 --- a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/ProducerConsumer.kt +++ b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/ProducerConsumer.kt @@ -1,4 +1,4 @@ -package com.baeldung.channles +package com.baeldung.channels import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi diff --git a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/RendezvousChannel.kt b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/RendezvousChannel.kt similarity index 94% rename from core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/RendezvousChannel.kt rename to core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/RendezvousChannel.kt index e046e86e29..d4b554bced 100644 --- a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/RendezvousChannel.kt +++ b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/RendezvousChannel.kt @@ -1,4 +1,4 @@ -package com.baeldung.channles +package com.baeldung.channels import kotlinx.coroutines.* import kotlinx.coroutines.channels.Channel diff --git a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/SeveralProducersOneConsumer.kt b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/SeveralProducersOneConsumer.kt similarity index 96% rename from core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/SeveralProducersOneConsumer.kt rename to core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/SeveralProducersOneConsumer.kt index fd2c046f97..5ed95debe8 100644 --- a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/SeveralProducersOneConsumer.kt +++ b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/SeveralProducersOneConsumer.kt @@ -1,4 +1,4 @@ -package com.baeldung.channles +package com.baeldung.channels import kotlinx.coroutines.cancelChildren import kotlinx.coroutines.channels.Channel diff --git a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/SingleProducerSeveralConsumers.kt b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/SingleProducerSeveralConsumers.kt similarity index 96% rename from core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/SingleProducerSeveralConsumers.kt rename to core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/SingleProducerSeveralConsumers.kt index bff1609b35..f8f7b4b23b 100644 --- a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/SingleProducerSeveralConsumers.kt +++ b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/SingleProducerSeveralConsumers.kt @@ -1,4 +1,4 @@ -package com.baeldung.channles +package com.baeldung.channels import kotlinx.coroutines.* import kotlinx.coroutines.channels.ReceiveChannel diff --git a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/TickerChannel.kt b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/TickerChannel.kt similarity index 94% rename from core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/TickerChannel.kt rename to core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/TickerChannel.kt index febcbd1534..85c0dc8d04 100644 --- a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/TickerChannel.kt +++ b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/TickerChannel.kt @@ -1,4 +1,4 @@ -package com.baeldung.channles +package com.baeldung.channels import kotlinx.coroutines.channels.ticker import kotlinx.coroutines.delay diff --git a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/UnlimitedChannel.kt b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/UnlimitedChannel.kt similarity index 95% rename from core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/UnlimitedChannel.kt rename to core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/UnlimitedChannel.kt index 9b01bcee54..e4725ca903 100644 --- a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/UnlimitedChannel.kt +++ b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/UnlimitedChannel.kt @@ -1,4 +1,4 @@ -package com.baeldung.channles +package com.baeldung.channels import kotlinx.coroutines.cancelChildren import kotlinx.coroutines.channels.Channel diff --git a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/logger.kt b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/logger.kt similarity index 83% rename from core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/logger.kt rename to core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/logger.kt index fdc4c295f8..036a6a4504 100644 --- a/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channles/logger.kt +++ b/core-kotlin-modules/core-kotlin-concurrency/src/main/kotlin/com/baeldung/channels/logger.kt @@ -1,4 +1,4 @@ -package com.baeldung.channles +package com.baeldung.channels import java.text.SimpleDateFormat import java.util.*