diff --git a/.travis.yml b/.travis.yml
index 683422dc97..5e86714a89 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -4,7 +4,7 @@ before_install:
- echo "MAVEN_OPTS='-Xmx2048M -Xss128M -XX:+CMSClassUnloadingEnabled -XX:+UseG1GC -XX:-UseGCOverheadLimit'" > ~/.mavenrc
install: skip
-script: travis_wait 60 mvn -q install -Pdefault-first,default-second
+script: travis_wait 60 mvn -q install -Pdefault-first,default-second -Dgib.enabled=true
sudo: required
diff --git a/algorithms-genetic/pom.xml b/algorithms-genetic/pom.xml
index 2a10a81980..fc6d36dac1 100644
--- a/algorithms-genetic/pom.xml
+++ b/algorithms-genetic/pom.xml
@@ -1,10 +1,10 @@
4.0.0
- com.baeldung
algorithms-genetic
0.0.1-SNAPSHOT
-
+ algorithms-genetic
+
com.baeldung
parent-modules
@@ -61,4 +61,5 @@
1.11
-
\ No newline at end of file
+
+
diff --git a/algorithms-miscellaneous-1/pom.xml b/algorithms-miscellaneous-1/pom.xml
index 16749d452e..75b031282b 100644
--- a/algorithms-miscellaneous-1/pom.xml
+++ b/algorithms-miscellaneous-1/pom.xml
@@ -1,10 +1,10 @@
4.0.0
- com.baeldung
algorithms-miscellaneous-1
0.0.1-SNAPSHOT
-
+ algorithms-miscellaneous-1
+
com.baeldung
parent-modules
diff --git a/algorithms-miscellaneous-2/README.md b/algorithms-miscellaneous-2/README.md
index 6772a94a8d..d693a44f66 100644
--- a/algorithms-miscellaneous-2/README.md
+++ b/algorithms-miscellaneous-2/README.md
@@ -17,3 +17,4 @@
- [Round Up to the Nearest Hundred](https://www.baeldung.com/java-round-up-nearest-hundred)
- [Calculate Percentage in Java](https://www.baeldung.com/java-calculate-percentage)
- [Converting Between Byte Arrays and Hexadecimal Strings in Java](https://www.baeldung.com/java-byte-arrays-hex-strings)
+- [Convert Latitude and Longitude to a 2D Point in Java](https://www.baeldung.com/java-convert-latitude-longitude)
diff --git a/algorithms-miscellaneous-2/pom.xml b/algorithms-miscellaneous-2/pom.xml
index eeae544612..25472d4888 100644
--- a/algorithms-miscellaneous-2/pom.xml
+++ b/algorithms-miscellaneous-2/pom.xml
@@ -1,9 +1,9 @@
4.0.0
- com.baeldung
algorithms-miscellaneous-2
0.0.1-SNAPSHOT
+ algorithms-miscellaneous-2
com.baeldung
diff --git a/algorithms-sorting/README.md b/algorithms-sorting/README.md
index f88b93e25e..36460293b0 100644
--- a/algorithms-sorting/README.md
+++ b/algorithms-sorting/README.md
@@ -4,4 +4,4 @@
- [Merge Sort in Java](https://www.baeldung.com/java-merge-sort)
- [Quicksort Algorithm Implementation in Java](https://www.baeldung.com/java-quicksort)
- [Insertion Sort in Java](https://www.baeldung.com/java-insertion-sort)
-
+- [Heap Sort in Java](https://www.baeldung.com/java-heap-sort)
diff --git a/algorithms-sorting/pom.xml b/algorithms-sorting/pom.xml
index 60ae37f2a4..2aee6e9199 100644
--- a/algorithms-sorting/pom.xml
+++ b/algorithms-sorting/pom.xml
@@ -1,9 +1,9 @@
4.0.0
- com.baeldung
algorithms-sorting
0.0.1-SNAPSHOT
+ algorithms-sorting
com.baeldung
diff --git a/annotations/annotation-processing/pom.xml b/annotations/annotation-processing/pom.xml
index 8e53334521..d9aca6040d 100644
--- a/annotations/annotation-processing/pom.xml
+++ b/annotations/annotation-processing/pom.xml
@@ -3,7 +3,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
annotation-processing
-
+ annotation-processing
+
com.baeldung
1.0.0-SNAPSHOT
diff --git a/annotations/annotation-user/pom.xml b/annotations/annotation-user/pom.xml
index 07ea9a5b5a..422cc7f119 100644
--- a/annotations/annotation-user/pom.xml
+++ b/annotations/annotation-user/pom.xml
@@ -3,6 +3,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
annotation-user
+ annotation-user
annotations
diff --git a/annotations/pom.xml b/annotations/pom.xml
index 2c73d3d91b..6d83f5b057 100644
--- a/annotations/pom.xml
+++ b/annotations/pom.xml
@@ -4,7 +4,8 @@
4.0.0
annotations
pom
-
+ annotations
+
parent-modules
com.baeldung
diff --git a/apache-avro/pom.xml b/apache-avro/pom.xml
index ddf5844271..18f9c34d64 100644
--- a/apache-avro/pom.xml
+++ b/apache-avro/pom.xml
@@ -3,10 +3,9 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- com.baeldung
apache-avro
0.0.1-SNAPSHOT
- Apache Avro
+ apache-avro
UTF-8
diff --git a/apache-bval/pom.xml b/apache-bval/pom.xml
index 5ddb1ecb59..786f587fb1 100644
--- a/apache-bval/pom.xml
+++ b/apache-bval/pom.xml
@@ -4,7 +4,8 @@
apache-bval
apache-bval
0.0.1-SNAPSHOT
-
+ apache-bval
+
com.baeldung
parent-modules
diff --git a/apache-curator/pom.xml b/apache-curator/pom.xml
index ac10811e7a..bcca38b199 100644
--- a/apache-curator/pom.xml
+++ b/apache-curator/pom.xml
@@ -4,6 +4,7 @@
apache-curator
0.0.1-SNAPSHOT
jar
+ apache-curator
com.baeldung
diff --git a/apache-cxf/cxf-aegis/pom.xml b/apache-cxf/cxf-aegis/pom.xml
index b7e9e426a2..1d36178b82 100644
--- a/apache-cxf/cxf-aegis/pom.xml
+++ b/apache-cxf/cxf-aegis/pom.xml
@@ -2,7 +2,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
cxf-aegis
-
+ cxf-aegis
+
com.baeldung
apache-cxf
diff --git a/apache-cxf/cxf-introduction/pom.xml b/apache-cxf/cxf-introduction/pom.xml
index a9e82c16b3..17f03afd25 100644
--- a/apache-cxf/cxf-introduction/pom.xml
+++ b/apache-cxf/cxf-introduction/pom.xml
@@ -4,7 +4,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
cxf-introduction
-
+ cxf-introduction
+
com.baeldung
apache-cxf
diff --git a/apache-cxf/cxf-jaxrs-implementation/pom.xml b/apache-cxf/cxf-jaxrs-implementation/pom.xml
index 89acbdf1bd..03d0f67c90 100644
--- a/apache-cxf/cxf-jaxrs-implementation/pom.xml
+++ b/apache-cxf/cxf-jaxrs-implementation/pom.xml
@@ -4,7 +4,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
cxf-jaxrs-implementation
-
+ cxf-jaxrs-implementation
+
com.baeldung
apache-cxf
diff --git a/apache-cxf/cxf-spring/pom.xml b/apache-cxf/cxf-spring/pom.xml
index 31e75e7cdd..97715af54c 100644
--- a/apache-cxf/cxf-spring/pom.xml
+++ b/apache-cxf/cxf-spring/pom.xml
@@ -3,6 +3,7 @@
4.0.0
cxf-spring
war
+ cxf-spring
com.baeldung
diff --git a/apache-cxf/pom.xml b/apache-cxf/pom.xml
index 8918fd4450..0016f33d70 100644
--- a/apache-cxf/pom.xml
+++ b/apache-cxf/pom.xml
@@ -1,9 +1,9 @@
4.0.0
- com.baeldung
apache-cxf
0.0.1-SNAPSHOT
+ apache-cxf
pom
diff --git a/apache-cxf/sse-jaxrs/pom.xml b/apache-cxf/sse-jaxrs/pom.xml
index d4b6c19d03..cb5c96660a 100644
--- a/apache-cxf/sse-jaxrs/pom.xml
+++ b/apache-cxf/sse-jaxrs/pom.xml
@@ -3,8 +3,8 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
sse-jaxrs
+ sse-jaxrs
pom
diff --git a/apache-cxf/sse-jaxrs/sse-jaxrs-client/pom.xml b/apache-cxf/sse-jaxrs/sse-jaxrs-client/pom.xml
index 0f5406fbc7..c7acf22c32 100644
--- a/apache-cxf/sse-jaxrs/sse-jaxrs-client/pom.xml
+++ b/apache-cxf/sse-jaxrs/sse-jaxrs-client/pom.xml
@@ -3,15 +3,15 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
+ sse-jaxrs-client
+ sse-jaxrs-client
+
com.baeldung
sse-jaxrs
0.0.1-SNAPSHOT
- sse-jaxrs-client
-
3.2.0
@@ -21,7 +21,6 @@
org.codehaus.mojo
exec-maven-plugin
- 1.6.0
singleEvent
diff --git a/apache-cxf/sse-jaxrs/sse-jaxrs-server/pom.xml b/apache-cxf/sse-jaxrs/sse-jaxrs-server/pom.xml
index 2e82dc3829..eeb5726ee1 100644
--- a/apache-cxf/sse-jaxrs/sse-jaxrs-server/pom.xml
+++ b/apache-cxf/sse-jaxrs/sse-jaxrs-server/pom.xml
@@ -3,16 +3,16 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
+ sse-jaxrs-server
+ sse-jaxrs-server
+ war
+
com.baeldung
sse-jaxrs
0.0.1-SNAPSHOT
- sse-jaxrs-server
- war
-
2.4.2
false
diff --git a/apache-geode/pom.xml b/apache-geode/pom.xml
index a3f6604ac4..738accdcb8 100644
--- a/apache-geode/pom.xml
+++ b/apache-geode/pom.xml
@@ -3,11 +3,10 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
- com.baeldung
apache-geode
1.0-SNAPSHOT
-
+ apache-geode
+
com.baeldung
parent-modules
diff --git a/apache-opennlp/pom.xml b/apache-opennlp/pom.xml
index 985c9a2df2..6b2e6a9729 100644
--- a/apache-opennlp/pom.xml
+++ b/apache-opennlp/pom.xml
@@ -4,6 +4,7 @@
4.0.0
apache-opennlp
1.0-SNAPSHOT
+ apache-opennlp
jar
diff --git a/apache-poi/pom.xml b/apache-poi/pom.xml
index a1ec626d43..54c3e8e928 100644
--- a/apache-poi/pom.xml
+++ b/apache-poi/pom.xml
@@ -1,9 +1,9 @@
4.0.0
- com.baeldung
apache-poi
0.0.1-SNAPSHOT
+ apache-poi
com.baeldung
diff --git a/apache-pulsar/README.md b/apache-pulsar/README.md
new file mode 100644
index 0000000000..2970bc3d88
--- /dev/null
+++ b/apache-pulsar/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Introduction to Apache Pulsar](https://www.baeldung.com/apache-pulsar)
diff --git a/apache-pulsar/pom.xml b/apache-pulsar/pom.xml
index da004a7638..a4c09586eb 100644
--- a/apache-pulsar/pom.xml
+++ b/apache-pulsar/pom.xml
@@ -1,21 +1,22 @@
- 4.0.0
- com.baeldung.pulsar
- pulsar-java
- 0.0.1
+ 4.0.0
+ com.baeldung.pulsar
+ apache-pulsar
+ 0.0.1
+ apache-pulsar
-
-
- org.apache.pulsar
- pulsar-client
- 2.1.1-incubating
- compile
-
-
-
- 1.8
- 1.8
-
+
+
+ org.apache.pulsar
+ pulsar-client
+ 2.1.1-incubating
+ compile
+
+
+
+ 1.8
+ 1.8
+
diff --git a/apache-shiro/pom.xml b/apache-shiro/pom.xml
index 98d9563284..644d70b30a 100644
--- a/apache-shiro/pom.xml
+++ b/apache-shiro/pom.xml
@@ -5,7 +5,8 @@
4.0.0
apache-shiro
1.0-SNAPSHOT
-
+ apache-shiro
+
parent-boot-1
com.baeldung
diff --git a/apache-thrift/pom.xml b/apache-thrift/pom.xml
index b22364cb19..ab54fc2cef 100644
--- a/apache-thrift/pom.xml
+++ b/apache-thrift/pom.xml
@@ -1,9 +1,9 @@
4.0.0
- com.baeldung
apache-thrift
0.0.1-SNAPSHOT
+ apache-thrift
pom
diff --git a/apache-tika/pom.xml b/apache-tika/pom.xml
index 5a76fdeeda..0399914a5f 100644
--- a/apache-tika/pom.xml
+++ b/apache-tika/pom.xml
@@ -1,10 +1,10 @@
4.0.0
- com.baeldung
apache-tika
0.0.1-SNAPSHOT
-
+ apache-tika
+
com.baeldung
parent-modules
diff --git a/apache-zookeeper/pom.xml b/apache-zookeeper/pom.xml
index 0b29186ccc..53e4217358 100644
--- a/apache-zookeeper/pom.xml
+++ b/apache-zookeeper/pom.xml
@@ -1,9 +1,9 @@
4.0.0
- com.baeldung
apache-zookeeper
0.0.1-SNAPSHOT
+ apache-zookeeper
jar
diff --git a/asm/pom.xml b/asm/pom.xml
index 5aad2a0e37..e56438c808 100644
--- a/asm/pom.xml
+++ b/asm/pom.xml
@@ -5,6 +5,7 @@
com.baeldung.examples
asm
1.0
+ asm
jar
diff --git a/atomix/pom.xml b/atomix/pom.xml
index f85d2d7484..e50c1d867f 100644
--- a/atomix/pom.xml
+++ b/atomix/pom.xml
@@ -4,7 +4,8 @@
com.atomix.io
atomix
0.0.1-SNAPSHOT
-
+ atomix
+
com.baeldung
parent-modules
diff --git a/axon/pom.xml b/axon/pom.xml
index 915a04feb5..c643ea9e57 100644
--- a/axon/pom.xml
+++ b/axon/pom.xml
@@ -3,7 +3,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
axon
-
+ axon
+
parent-modules
com.baeldung
diff --git a/cas/cas-server/pom.xml b/cas/cas-server/pom.xml
index 9b61aaec3d..98f5f10493 100644
--- a/cas/cas-server/pom.xml
+++ b/cas/cas-server/pom.xml
@@ -3,8 +3,9 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd ">
4.0.0
cas-server
- war
1.0
+ cas-server
+ war
parent-boot-1
diff --git a/cdi/README.md b/cdi/README.md
index 0477ce85bd..bfb635be9e 100644
--- a/cdi/README.md
+++ b/cdi/README.md
@@ -1,3 +1,5 @@
### Relevant Articles:
- [CDI Interceptor vs Spring AspectJ](http://www.baeldung.com/cdi-interceptor-vs-spring-aspectj)
- [An Introduction to CDI (Contexts and Dependency Injection) in Java](http://www.baeldung.com/java-ee-cdi)
+- [Introduction to the Event Notification Model in CDI 2.0](https://www.baeldung.com/cdi-event-notification)
+
diff --git a/cdi/pom.xml b/cdi/pom.xml
index 2c719c1d7f..0cf5062ccc 100644
--- a/cdi/pom.xml
+++ b/cdi/pom.xml
@@ -2,10 +2,10 @@
4.0.0
- com.baeldung
cdi
1.0-SNAPSHOT
-
+ cdi
+
com.baeldung
parent-spring-4
@@ -14,6 +14,16 @@
+
+ javax.enterprise
+ cdi-api
+ ${cdi-api.version}
+
+
+ org.jboss.weld.se
+ weld-se-core
+ ${weld-se-core.version}
+
org.hamcrest
hamcrest-core
@@ -42,11 +52,6 @@
aspectjweaver
${aspectjweaver.version}
-
- org.jboss.weld.se
- weld-se-core
- ${weld-se-core.version}
-
org.springframework
spring-test
@@ -54,13 +59,13 @@
test
-
- 1.8.9
- 2.4.1.Final
+ 2.0.SP1
+ 3.0.5.Final
+ 1.9.2
1.3
3.10.0
4.12
+ 5.1.2.RELEASE
-
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java b/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java
new file mode 100644
index 0000000000..4896408502
--- /dev/null
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java
@@ -0,0 +1,15 @@
+package com.baeldung.cdi.cdi2observers.application;
+
+import com.baeldung.cdi.cdi2observers.events.ExampleEvent;
+import javax.enterprise.inject.se.SeContainer;
+import javax.enterprise.inject.se.SeContainerInitializer;
+
+public class BootstrappingApplication {
+
+ public static void main(String... args) {
+ SeContainerInitializer containerInitializer = SeContainerInitializer.newInstance();
+ try (SeContainer container = containerInitializer.initialize()) {
+ container.getBeanManager().fireEvent(new ExampleEvent("Welcome to Baeldung!"));
+ }
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java
new file mode 100644
index 0000000000..a2329d2ef1
--- /dev/null
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java
@@ -0,0 +1,14 @@
+package com.baeldung.cdi.cdi2observers.events;
+
+public class ExampleEvent {
+
+ private final String eventMessage;
+
+ public ExampleEvent(String eventMessage) {
+ this.eventMessage = eventMessage;
+ }
+
+ public String getEventMessage() {
+ return eventMessage;
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java
new file mode 100644
index 0000000000..f37030778a
--- /dev/null
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java
@@ -0,0 +1,14 @@
+package com.baeldung.cdi.cdi2observers.events;
+
+import javax.enterprise.event.Event;
+import javax.inject.Inject;
+
+public class ExampleEventSource {
+
+ @Inject
+ Event exampleEvent;
+
+ public void fireEvent() {
+ exampleEvent.fireAsync(new ExampleEvent("Welcome to Baeldung!"));
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java b/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java
new file mode 100644
index 0000000000..34520c2b3d
--- /dev/null
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java
@@ -0,0 +1,12 @@
+package com.baeldung.cdi.cdi2observers.observers;
+
+import com.baeldung.cdi.cdi2observers.events.ExampleEvent;
+import javax.annotation.Priority;
+import javax.enterprise.event.Observes;
+
+public class AnotherExampleEventObserver {
+
+ public String onEvent(@Observes @Priority(2) ExampleEvent event) {
+ return event.getEventMessage();
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java b/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java
new file mode 100644
index 0000000000..b3522b2ad0
--- /dev/null
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java
@@ -0,0 +1,13 @@
+package com.baeldung.cdi.cdi2observers.observers;
+
+import com.baeldung.cdi.cdi2observers.events.ExampleEvent;
+import com.baeldung.cdi.cdi2observers.services.TextService;
+import javax.annotation.Priority;
+import javax.enterprise.event.Observes;
+
+public class ExampleEventObserver {
+
+ public String onEvent(@Observes @Priority(1) ExampleEvent event, TextService textService) {
+ return textService.parseText(event.getEventMessage());
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java b/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java
new file mode 100644
index 0000000000..47788a0657
--- /dev/null
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java
@@ -0,0 +1,8 @@
+package com.baeldung.cdi.cdi2observers.services;
+
+public class TextService {
+
+ public String parseText(String text) {
+ return text.toUpperCase();
+ }
+}
diff --git a/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java b/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java
new file mode 100644
index 0000000000..deecf13f9a
--- /dev/null
+++ b/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java
@@ -0,0 +1,14 @@
+package com.baeldung.cdi.cdi2observers.tests;
+
+import com.baeldung.cdi.cdi2observers.services.TextService;
+import static org.assertj.core.api.Assertions.assertThat;
+import org.junit.Test;
+
+public class TextServiceUnitTest {
+
+ @Test
+ public void givenTextServiceInstance_whenCalledparseText_thenCorrect() {
+ TextService textService = new TextService();
+ assertThat(textService.parseText("Baeldung")).isEqualTo("BAELDUNG");
+ }
+}
diff --git a/core-groovy/pom.xml b/core-groovy/pom.xml
index 909250710e..e54c766280 100644
--- a/core-groovy/pom.xml
+++ b/core-groovy/pom.xml
@@ -4,6 +4,7 @@
4.0.0
core-groovy
1.0-SNAPSHOT
+ core-groovy
jar
diff --git a/core-java-10/README.md b/core-java-10/README.md
index 84fa381a26..f0a25712a7 100644
--- a/core-java-10/README.md
+++ b/core-java-10/README.md
@@ -4,3 +4,4 @@
- [Java 10 LocalVariable Type-Inference](http://www.baeldung.com/java-10-local-variable-type-inference)
- [Guide to Java 10](http://www.baeldung.com/java-10-overview)
- [Copy a List to Another List in Java](http://www.baeldung.com/java-copy-list-to-another)
+- [Deep Dive Into the New Java JIT Compiler – Graal](https://www.baeldung.com/graal-java-jit-compiler)
diff --git a/core-java-8/README.md b/core-java-8/README.md
index ffd629a170..6786b29120 100644
--- a/core-java-8/README.md
+++ b/core-java-8/README.md
@@ -33,3 +33,4 @@
- [An Overview of Regular Expressions Performance in Java](https://www.baeldung.com/java-regex-performance)
- [Java Primitives versus Objects](https://www.baeldung.com/java-primitives-vs-objects)
- [How to Use if/else Logic in Java 8 Streams](https://www.baeldung.com/java-8-streams-if-else-logic)
+- [How to Replace Many if Statements in Java](https://www.baeldung.com/java-replace-if-statements)
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddCommand.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddCommand.java
new file mode 100644
index 0000000000..279a3b2c55
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddCommand.java
@@ -0,0 +1,17 @@
+package com.baeldung.reducingIfElse;
+
+public class AddCommand implements Command {
+
+ private int a;
+ private int b;
+
+ public AddCommand(int a, int b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ @Override
+ public Integer execute() {
+ return a + b;
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddRule.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddRule.java
new file mode 100644
index 0000000000..f24c973ead
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddRule.java
@@ -0,0 +1,21 @@
+package com.baeldung.reducingIfElse;
+
+public class AddRule implements Rule {
+
+ private int result;
+
+ @Override
+ public boolean evaluate(Expression expression) {
+ boolean evalResult = false;
+ if (expression.getOperator() == Operator.ADD) {
+ this.result = expression.getX() + expression.getY();
+ evalResult = true;
+ }
+ return evalResult;
+ }
+
+ @Override
+ public Result getResult() {
+ return new Result(result);
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Addition.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Addition.java
new file mode 100644
index 0000000000..3174ea558c
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Addition.java
@@ -0,0 +1,8 @@
+package com.baeldung.reducingIfElse;
+
+public class Addition implements Operation {
+ @Override
+ public int apply(int a, int b) {
+ return a + b;
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Calculator.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Calculator.java
new file mode 100644
index 0000000000..550d92e183
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Calculator.java
@@ -0,0 +1,83 @@
+package com.baeldung.reducingIfElse;
+
+public class Calculator {
+
+ public int calculate(int a, int b, String operator) {
+ int result = Integer.MIN_VALUE;
+
+ if ("add".equals(operator)) {
+ result = a + b;
+ } else if ("multiply".equals(operator)) {
+ result = a * b;
+ } else if ("divide".equals(operator)) {
+ result = a / b;
+ } else if ("subtract".equals(operator)) {
+ result = a - b;
+ } else if ("modulo".equals(operator)) {
+ result = a % b;
+ }
+ return result;
+ }
+
+ public int calculateUsingSwitch(int a, int b, String operator) {
+ int result = 0;
+ switch (operator) {
+ case "add":
+ result = a + b;
+ break;
+ case "multiply":
+ result = a * b;
+ break;
+ case "divide":
+ result = a / b;
+ break;
+ case "subtract":
+ result = a - b;
+ break;
+ case "modulo":
+ result = a % b;
+ break;
+ default:
+ result = Integer.MIN_VALUE;
+ }
+ return result;
+ }
+
+ public int calculateUsingSwitch(int a, int b, Operator operator) {
+ int result = 0;
+ switch (operator) {
+ case ADD:
+ result = a + b;
+ break;
+ case MULTIPLY:
+ result = a * b;
+ break;
+ case DIVIDE:
+ result = a / b;
+ break;
+ case SUBTRACT:
+ result = a - b;
+ break;
+ case MODULO:
+ result = a % b;
+ break;
+ default:
+ result = Integer.MIN_VALUE;
+ }
+ return result;
+ }
+
+ public int calculate(int a, int b, Operator operator) {
+ return operator.apply(a, b);
+ }
+
+ public int calculateUsingFactory(int a, int b, String operation) {
+ Operation targetOperation = OperatorFactory.getOperation(operation)
+ .orElseThrow(() -> new IllegalArgumentException("Invalid Operator"));
+ return targetOperation.apply(a, b);
+ }
+
+ public int calculate(Command command) {
+ return command.execute();
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Command.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Command.java
new file mode 100644
index 0000000000..c084fcc6a0
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Command.java
@@ -0,0 +1,5 @@
+package com.baeldung.reducingIfElse;
+
+public interface Command {
+ Integer execute();
+}
\ No newline at end of file
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Division.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Division.java
new file mode 100644
index 0000000000..75b1297655
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Division.java
@@ -0,0 +1,7 @@
+package com.baeldung.reducingIfElse;
+
+public class Division implements Operation {
+ @Override public int apply(int a, int b) {
+ return a / b;
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Expression.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Expression.java
new file mode 100644
index 0000000000..4d3fe1b824
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Expression.java
@@ -0,0 +1,26 @@
+package com.baeldung.reducingIfElse;
+
+public class Expression {
+
+ private Integer x;
+ private Integer y;
+ private Operator operator;
+
+ public Expression(Integer x, Integer y, Operator operator) {
+ this.x = x;
+ this.y = y;
+ this.operator = operator;
+ }
+
+ public Integer getX() {
+ return x;
+ }
+
+ public Integer getY() {
+ return y;
+ }
+
+ public Operator getOperator() {
+ return operator;
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Modulo.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Modulo.java
new file mode 100644
index 0000000000..a7a081704c
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Modulo.java
@@ -0,0 +1,7 @@
+package com.baeldung.reducingIfElse;
+
+public class Modulo implements Operation {
+ @Override public int apply(int a, int b) {
+ return a % b;
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Multiplication.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Multiplication.java
new file mode 100644
index 0000000000..e1a39b33c4
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Multiplication.java
@@ -0,0 +1,7 @@
+package com.baeldung.reducingIfElse;
+
+public class Multiplication implements Operation {
+ @Override public int apply(int a, int b) {
+ return 0;
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operation.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operation.java
new file mode 100644
index 0000000000..41241fa810
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operation.java
@@ -0,0 +1,5 @@
+package com.baeldung.reducingIfElse;
+
+public interface Operation {
+ int apply(int a, int b);
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operator.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operator.java
new file mode 100644
index 0000000000..831b8fa146
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operator.java
@@ -0,0 +1,41 @@
+package com.baeldung.reducingIfElse;
+
+public enum Operator {
+
+ ADD {
+ @Override
+ public int apply(int a, int b) {
+ return a + b;
+ }
+ },
+
+ MULTIPLY {
+ @Override
+ public int apply(int a, int b) {
+ return a * b;
+ }
+ },
+
+ SUBTRACT {
+ @Override
+ public int apply(int a, int b) {
+ return a - b;
+ }
+ },
+
+ DIVIDE {
+ @Override
+ public int apply(int a, int b) {
+ return a / b;
+ }
+ },
+
+ MODULO {
+ @Override
+ public int apply(int a, int b) {
+ return a % b;
+ }
+ };
+
+ public abstract int apply(int a, int b);
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/OperatorFactory.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/OperatorFactory.java
new file mode 100644
index 0000000000..18ed63adbd
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/OperatorFactory.java
@@ -0,0 +1,21 @@
+package com.baeldung.reducingIfElse;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+public class OperatorFactory {
+
+ static Map operationMap = new HashMap<>();
+ static {
+ operationMap.put("add", new Addition());
+ operationMap.put("divide", new Division());
+ operationMap.put("multiply", new Multiplication());
+ operationMap.put("subtract", new Subtraction());
+ operationMap.put("modulo", new Modulo());
+ }
+
+ public static Optional getOperation(String operation) {
+ return Optional.ofNullable(operationMap.get(operation));
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Result.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Result.java
new file mode 100644
index 0000000000..d5ed12202e
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Result.java
@@ -0,0 +1,13 @@
+package com.baeldung.reducingIfElse;
+
+public class Result {
+ int value;
+
+ public Result(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Rule.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Rule.java
new file mode 100644
index 0000000000..5a6c84b0f9
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Rule.java
@@ -0,0 +1,8 @@
+package com.baeldung.reducingIfElse;
+
+public interface Rule {
+
+ boolean evaluate(Expression expression);
+
+ Result getResult();
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/RuleEngine.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/RuleEngine.java
new file mode 100644
index 0000000000..ac56915dee
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/RuleEngine.java
@@ -0,0 +1,24 @@
+package com.baeldung.reducingIfElse;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+public class RuleEngine {
+
+ private static List rules = new ArrayList<>();
+
+ static {
+ rules.add(new AddRule());
+ }
+
+ public Result process(Expression expression) {
+
+ Rule rule = rules.stream()
+ .filter(r -> r.evaluate(expression))
+ .findFirst()
+ .orElseThrow(() -> new IllegalArgumentException("Expression does not matches any Rule"));
+ return rule.getResult();
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/reducingIfElse/Subtraction.java b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Subtraction.java
new file mode 100644
index 0000000000..948998810e
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/reducingIfElse/Subtraction.java
@@ -0,0 +1,7 @@
+package com.baeldung.reducingIfElse;
+
+public class Subtraction implements Operation {
+ @Override public int apply(int a, int b) {
+ return a - b;
+ }
+}
diff --git a/core-java-8/src/test/java/com/baeldung/reduceIfelse/CalculatorUnitTest.java b/core-java-8/src/test/java/com/baeldung/reduceIfelse/CalculatorUnitTest.java
new file mode 100644
index 0000000000..fa351930d8
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/reduceIfelse/CalculatorUnitTest.java
@@ -0,0 +1,32 @@
+package com.baeldung.reduceIfelse;
+
+import com.baeldung.reducingIfElse.AddCommand;
+import com.baeldung.reducingIfElse.Calculator;
+import com.baeldung.reducingIfElse.Operator;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class CalculatorUnitTest {
+
+ @Test
+ public void whenCalculateUsingStringOperator_thenReturnCorrectResult() {
+ Calculator calculator = new Calculator();
+ int result = calculator.calculate(3, 4, "add");
+ assertEquals(7, result);
+ }
+
+ @Test
+ public void whenCalculateUsingEnumOperator_thenReturnCorrectResult() {
+ Calculator calculator = new Calculator();
+ int result = calculator.calculate(3, 4, Operator.valueOf("ADD"));
+ assertEquals(7, result);
+ }
+
+ @Test
+ public void whenCalculateUsingCommand_thenReturnCorrectResult() {
+ Calculator calculator = new Calculator();
+ int result = calculator.calculate(new AddCommand(3, 7));
+ assertEquals(10, result);
+ }
+}
diff --git a/core-java-8/src/test/java/com/baeldung/reduceIfelse/RuleEngineUnitTest.java b/core-java-8/src/test/java/com/baeldung/reduceIfelse/RuleEngineUnitTest.java
new file mode 100644
index 0000000000..4a30b3efac
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/reduceIfelse/RuleEngineUnitTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.reduceIfelse;
+
+import com.baeldung.reducingIfElse.Expression;
+import com.baeldung.reducingIfElse.Operator;
+import com.baeldung.reducingIfElse.Result;
+import com.baeldung.reducingIfElse.RuleEngine;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class RuleEngineUnitTest {
+
+ @Test
+ public void whenNumbersGivenToRuleEngine_thenReturnCorrectResult() {
+ Expression expression = new Expression(5, 5, Operator.ADD);
+ RuleEngine engine = new RuleEngine();
+ Result result = engine.process(expression);
+
+ assertNotNull(result);
+ assertEquals(10, result.getValue());
+ }
+}
diff --git a/core-java-9/pom.xml b/core-java-9/pom.xml
index f22d0a3ed9..cd1fa74dbb 100644
--- a/core-java-9/pom.xml
+++ b/core-java-9/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
core-java-9
0.2-SNAPSHOT
core-java-9
diff --git a/core-java-arrays/.gitignore b/core-java-arrays/.gitignore
new file mode 100644
index 0000000000..374c8bf907
--- /dev/null
+++ b/core-java-arrays/.gitignore
@@ -0,0 +1,25 @@
+*.class
+
+0.*
+
+#folders#
+/target
+/neoDb*
+/data
+/src/main/webapp/WEB-INF/classes
+*/META-INF/*
+.resourceCache
+
+# Packaged files #
+*.jar
+*.war
+*.ear
+
+# Files generated by integration tests
+backup-pom.xml
+/bin/
+/temp
+
+#IntelliJ specific
+.idea/
+*.iml
\ No newline at end of file
diff --git a/core-java-arrays/README.md b/core-java-arrays/README.md
new file mode 100644
index 0000000000..bda2cf90bf
--- /dev/null
+++ b/core-java-arrays/README.md
@@ -0,0 +1,15 @@
+=========
+
+## Core Java Arrays Cookbooks and Examples
+
+### Relevant Articles:
+- [How to Copy an Array in Java](http://www.baeldung.com/java-array-copy)
+- [Check if a Java Array Contains a Value](http://www.baeldung.com/java-array-contains-value)
+- [Initializing Arrays in Java](http://www.baeldung.com/java-initialize-array)
+- [Guide to the java.util.Arrays Class](http://www.baeldung.com/java-util-arrays)
+- [Jagged Arrays In Java](http://www.baeldung.com/java-jagged-arrays)
+- [Find Sum and Average in a Java Array](http://www.baeldung.com/java-array-sum-average)
+- [Arrays in Java: A Reference Guide](https://www.baeldung.com/java-arrays-guide)
+- [How to Invert an Array in Java](http://www.baeldung.com/java-invert-array)
+- [Array Operations in Java](http://www.baeldung.com/java-common-array-operations)
+
diff --git a/core-java-arrays/pom.xml b/core-java-arrays/pom.xml
new file mode 100644
index 0000000000..d2d0453e87
--- /dev/null
+++ b/core-java-arrays/pom.xml
@@ -0,0 +1,412 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-arrays
+ 0.1.0-SNAPSHOT
+ jar
+ core-java-arrays
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+ org.slf4j
+ log4j-over-slf4j
+ ${org.slf4j.version}
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator-annprocess.version}
+
+
+ org.springframework
+ spring-web
+ ${springframework.spring-web.version}
+
+
+
+
+ core-java-arrays
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ **/*LiveTest.java
+ **/*IntegrationTest.java
+ **/*IntTest.java
+ **/*LongRunningUnitTest.java
+ **/*ManualTest.java
+
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-dependencies
+ prepare-package
+
+ copy-dependencies
+
+
+ ${project.build.directory}/libs
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ ${maven-jar-plugin.version}
+
+
+
+ true
+ libs/
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+
+ package
+
+ single
+
+
+ ${project.basedir}
+
+
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+ jar-with-dependencies
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ ${maven-shade-plugin.version}
+
+
+
+ shade
+
+
+ true
+
+
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
+
+
+ com.jolira
+ onejar-maven-plugin
+ ${onejar-maven-plugin.version}
+
+
+
+ org.baeldung.executable.ExecutableMavenJar
+ true
+ ${project.build.finalName}-onejar.${project.packaging}
+
+
+ one-jar
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot-maven-plugin.version}
+
+
+
+ repackage
+
+
+ spring-boot
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ ${exec-maven-plugin.version}
+
+ java
+ com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
+
+ -Xmx300m
+ -XX:+UseParallelGC
+ -classpath
+
+ com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ ${maven-javadoc-plugin.version}
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+
+ integration
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ **/*ManualTest.java
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+
+
+
+
+ json
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ ${exec-maven-plugin.version}
+
+
+ run-benchmarks
+
+ none
+
+ exec
+
+
+ test
+ java
+
+ -classpath
+
+ org.openjdk.jmh.Main
+ .*
+
+
+
+
+
+
+
+
+
+
+
+ buildAgentLoader
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ package
+
+ jar
+
+
+ agentLoader
+ target/classes
+
+
+ true
+
+ ${project.build.outputDirectory}/META-INF/MANIFEST.MF
+
+
+
+ com/baeldung/instrumentation/application/AgentLoader.class
+ com/baeldung/instrumentation/application/Launcher.class
+
+
+
+
+
+
+
+
+
+ buildApplication
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ package
+
+ jar
+
+
+ application
+ target/classes
+
+
+ true
+
+ ${project.build.outputDirectory}/META-INF/MANIFEST.MF
+
+
+
+ com/baeldung/instrumentation/application/MyAtm.class
+ com/baeldung/instrumentation/application/MyAtmApplication.class
+ com/baeldung/instrumentation/application/Launcher.class
+
+
+
+
+
+
+
+
+
+ buildAgent
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ package
+
+ jar
+
+
+ agent
+ target/classes
+
+
+ true
+
+ ${project.build.outputDirectory}/META-INF/MANIFEST.MF
+
+
+
+ com/baeldung/instrumentation/agent/AtmTransformer.class
+ com/baeldung/instrumentation/agent/MyInstrumentationAgent.class
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.8.1
+ 1.16.12
+
+ 1.19
+ 1.19
+
+
+ 3.10.0
+
+
+ 2.21.0
+ 4.3.4.RELEASE
+ 3.0.0-M1
+ 3.0.2
+ 1.4.4
+ 3.1.1
+ 2.0.3.RELEASE
+ 1.6.0
+
+
+
diff --git a/core-java/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java b/core-java-arrays/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java
rename to core-java-arrays/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java
diff --git a/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java b/core-java-arrays/src/main/java/com/baeldung/array/ArrayInitializer.java
similarity index 97%
rename from core-java/src/main/java/com/baeldung/array/ArrayInitializer.java
rename to core-java-arrays/src/main/java/com/baeldung/array/ArrayInitializer.java
index 0ba6c342d9..d2b0428904 100644
--- a/core-java/src/main/java/com/baeldung/array/ArrayInitializer.java
+++ b/core-java-arrays/src/main/java/com/baeldung/array/ArrayInitializer.java
@@ -2,7 +2,7 @@ package com.baeldung.array;
import java.util.Arrays;
-import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang3.ArrayUtils;
public class ArrayInitializer {
diff --git a/core-java/src/main/java/com/baeldung/array/ArrayInverter.java b/core-java-arrays/src/main/java/com/baeldung/array/ArrayInverter.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/array/ArrayInverter.java
rename to core-java-arrays/src/main/java/com/baeldung/array/ArrayInverter.java
diff --git a/core-java/src/main/java/com/baeldung/array/ArrayReferenceGuide.java b/core-java-arrays/src/main/java/com/baeldung/array/ArrayReferenceGuide.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/array/ArrayReferenceGuide.java
rename to core-java-arrays/src/main/java/com/baeldung/array/ArrayReferenceGuide.java
diff --git a/core-java/src/main/java/com/baeldung/array/Find2ndLargestInArray.java b/core-java-arrays/src/main/java/com/baeldung/array/Find2ndLargestInArray.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/array/Find2ndLargestInArray.java
rename to core-java-arrays/src/main/java/com/baeldung/array/Find2ndLargestInArray.java
diff --git a/core-java/src/main/java/com/baeldung/array/FindElementInArray.java b/core-java-arrays/src/main/java/com/baeldung/array/FindElementInArray.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/array/FindElementInArray.java
rename to core-java-arrays/src/main/java/com/baeldung/array/FindElementInArray.java
diff --git a/core-java/src/main/java/com/baeldung/array/JaggedArray.java b/core-java-arrays/src/main/java/com/baeldung/array/JaggedArray.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/array/JaggedArray.java
rename to core-java-arrays/src/main/java/com/baeldung/array/JaggedArray.java
diff --git a/core-java/src/main/java/com/baeldung/array/SearchArrayUnitTest.java b/core-java-arrays/src/main/java/com/baeldung/array/SearchArrayUnitTest.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/array/SearchArrayUnitTest.java
rename to core-java-arrays/src/main/java/com/baeldung/array/SearchArrayUnitTest.java
diff --git a/core-java/src/main/java/com/baeldung/array/SumAndAverageInArray.java b/core-java-arrays/src/main/java/com/baeldung/array/SumAndAverageInArray.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/array/SumAndAverageInArray.java
rename to core-java-arrays/src/main/java/com/baeldung/array/SumAndAverageInArray.java
diff --git a/core-java-collections/src/main/java/com/baeldung/array/operations/ArrayOperations.java b/core-java-arrays/src/main/java/com/baeldung/array/operations/ArrayOperations.java
similarity index 91%
rename from core-java-collections/src/main/java/com/baeldung/array/operations/ArrayOperations.java
rename to core-java-arrays/src/main/java/com/baeldung/array/operations/ArrayOperations.java
index 98155ed952..d8cc0afd61 100644
--- a/core-java-collections/src/main/java/com/baeldung/array/operations/ArrayOperations.java
+++ b/core-java-arrays/src/main/java/com/baeldung/array/operations/ArrayOperations.java
@@ -4,11 +4,13 @@ import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashSet;
+import java.util.LinkedList;
import java.util.Random;
import java.util.Set;
import java.util.function.Function;
import java.util.function.IntPredicate;
import java.util.function.Predicate;
+import java.util.stream.Stream;
import org.apache.commons.lang3.ArrayUtils;
@@ -194,4 +196,16 @@ public class ArrayOperations {
public static T getRandomFromObjectArray(T[] array) {
return array[new Random().nextInt(array.length)];
}
+
+ public static Integer[] intersectionSimple(final Integer[] a, final Integer[] b){
+ return Stream.of(a).filter(Arrays.asList(b)::contains).toArray(Integer[]::new);
+ }
+
+ public static Integer[] intersectionSet(final Integer[] a, final Integer[] b){
+ return Stream.of(a).filter(Arrays.asList(b)::contains).distinct().toArray(Integer[]::new);
+ }
+
+ public static Integer[] intersectionMultiSet(final Integer[] a, final Integer[] b){
+ return Stream.of(a).filter(new LinkedList<>(Arrays.asList(b))::remove).toArray(Integer[]::new);
+ }
}
diff --git a/core-java/src/main/java/com/baeldung/arraycopy/model/Address.java b/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Address.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/arraycopy/model/Address.java
rename to core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Address.java
diff --git a/core-java/src/main/java/com/baeldung/arraycopy/model/Employee.java b/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Employee.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/arraycopy/model/Employee.java
rename to core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Employee.java
diff --git a/core-java/src/test/java/com/baeldung/array/ArrayInitializerUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/array/ArrayInitializerUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/array/ArrayInitializerUnitTest.java
rename to core-java-arrays/src/test/java/com/baeldung/array/ArrayInitializerUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java
rename to core-java-arrays/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/array/Find2ndLargestInArrayUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/array/Find2ndLargestInArrayUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/array/Find2ndLargestInArrayUnitTest.java
rename to core-java-arrays/src/test/java/com/baeldung/array/Find2ndLargestInArrayUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/array/FindElementInArrayUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/array/FindElementInArrayUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/array/FindElementInArrayUnitTest.java
rename to core-java-arrays/src/test/java/com/baeldung/array/FindElementInArrayUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/array/JaggedArrayUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/array/JaggedArrayUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/array/JaggedArrayUnitTest.java
rename to core-java-arrays/src/test/java/com/baeldung/array/JaggedArrayUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/array/SumAndAverageInArrayUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/array/SumAndAverageInArrayUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/array/SumAndAverageInArrayUnitTest.java
rename to core-java-arrays/src/test/java/com/baeldung/array/SumAndAverageInArrayUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
rename to core-java-arrays/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
diff --git a/core-java-arrays/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java
new file mode 100644
index 0000000000..3c61060ea8
--- /dev/null
+++ b/core-java-arrays/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java
@@ -0,0 +1,66 @@
+package com.baeldung.array.operations;
+
+import org.junit.jupiter.api.Test;
+
+import static com.baeldung.array.operations.ArrayOperations.intersectionMultiSet;
+import static com.baeldung.array.operations.ArrayOperations.intersectionSet;
+import static com.baeldung.array.operations.ArrayOperations.intersectionSimple;
+import static org.assertj.core.api.Assertions.assertThat;
+
+class IntersectionUnitTest {
+ private static final Integer[] a = { 1, 3, 2 };
+ private static final Integer[] b = { 4, 3, 2, 4, 2, 3, 4, 4, 3 };
+ private static final Integer[] c = { 1, 3, 2, 3, 3, 2 };
+
+ @Test
+ void whenIntersectionSimpleIsUsed_thenCommonEntriesAreInTheResult() {
+ assertThat(intersectionSimple(a, b)).isEqualTo(new Integer[] { 3, 2 });
+ assertThat(intersectionSimple(b, a)).isEqualTo(new Integer[] { 3, 2, 2, 3, 3 });
+ }
+
+ @Test
+ void whenIntersectionSimpleIsUsedWithAnArrayAndItself_thenTheResultIsTheIdentity() {
+ assertThat(intersectionSimple(b, b)).isEqualTo(b);
+ assertThat(intersectionSimple(a, a)).isEqualTo(a);
+ }
+
+ @Test
+ void whenIntersectionSetIsUsed_thenCommonEntriesAreInTheResult() {
+ assertThat(intersectionSet(b, a)).isEqualTo(new Integer[] { 3, 2 });
+ }
+
+ @Test
+ void whenIntersectionSetIsUsed_thenTheNumberOfEntriesDoesNotChangeWithTheParameterOrder() {
+ assertThat(intersectionSet(a, b)).isEqualTo(new Integer[] { 3, 2 });
+ assertThat(intersectionSet(b, a)).isEqualTo(new Integer[] { 3, 2 });
+ }
+
+ @Test
+ void whenIntersectionSetIsUsedWithAnArrayAndWithItself_andTheInputHasNoDuplicateEntries_ThenTheResultIsTheIdentity() {
+ assertThat(intersectionSet(a, a)).isEqualTo(a);
+ }
+
+ @Test
+ void whenIntersectionSetIsUsedWithAnArrayAndWithItself_andTheInputHasDuplicateEntries_ThenTheResultIsNotTheIdentity() {
+ assertThat(intersectionSet(b, b)).isNotEqualTo(b);
+ }
+
+ @Test
+ void whenMultiSetIsUsed_thenCommonEntriesAreInTheResult() {
+ assertThat(intersectionMultiSet(b, a)).isEqualTo(new Integer[] { 3, 2 });
+ }
+
+ @Test
+ void whenIntersectionMultiSetIsUsed_thenTheNumberOfEntriesDoesNotChangeWithTheParameterOrder() {
+ assertThat(intersectionMultiSet(a, b)).isEqualTo(new Integer[] { 3, 2 });
+ assertThat(intersectionMultiSet(b, a)).isEqualTo(new Integer[] { 3, 2 });
+ assertThat(intersectionMultiSet(b, c)).isEqualTo(new Integer[] { 3, 2, 2, 3, 3 });
+ assertThat(intersectionMultiSet(c, b)).isEqualTo(new Integer[] { 3, 2, 3, 3, 2 });
+ }
+
+ @Test
+ void whenIntersectionMultiSetIsUsedWithAnArrayAndWithItself_ThenTheResultIsTheIdentity() {
+ assertThat(intersectionMultiSet(b, b)).isEqualTo(b);
+ assertThat(intersectionMultiSet(a, a)).isEqualTo(a);
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java
rename to core-java-arrays/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/arrays/ArraysUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/arrays/ArraysUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/arrays/ArraysUnitTest.java
rename to core-java-arrays/src/test/java/com/baeldung/arrays/ArraysUnitTest.java
diff --git a/core-java-collections/README.md b/core-java-collections/README.md
index d0aaaa7182..858dbef0b3 100644
--- a/core-java-collections/README.md
+++ b/core-java-collections/README.md
@@ -39,3 +39,15 @@
- [Operating on and Removing an Item from Stream](https://www.baeldung.com/java-use-remove-item-stream)
- [An Introduction to Synchronized Java Collections](https://www.baeldung.com/java-synchronized-collections)
- [Guide to EnumSet](https://www.baeldung.com/java-enumset)
+- [Removing Elements from Java Collections](https://www.baeldung.com/java-collection-remove-elements)
+- [Converting a Collection to ArrayList in Java](https://www.baeldung.com/java-convert-collection-arraylist)
+- [Java 8 Streams: Find Items From One List Based On Values From Another List](https://www.baeldung.com/java-streams-find-list-items)
+- [Combining Different Types of Collections in Java](https://www.baeldung.com/java-combine-collections)
+- [Sorting in Java](http://www.baeldung.com/java-sorting)
+- [A Guide to the Java LinkedList](http://www.baeldung.com/java-linkedlist)
+- [Java List UnsupportedOperationException](http://www.baeldung.com/java-list-unsupported-operation-exception)
+- [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split)
+- [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality)
+- [Java List Initialization in One Line](https://www.baeldung.com/java-init-list-one-line)
+- [ClassCastException: Arrays$ArrayList cannot be cast to ArrayList](https://www.baeldung.com/java-classcastexception-arrays-arraylist)
+- [A Guide to EnumMap](https://www.baeldung.com/java-enum-map)
diff --git a/core-java-collections/pom.xml b/core-java-collections/pom.xml
index 31f0d7419f..2201ee8b15 100644
--- a/core-java-collections/pom.xml
+++ b/core-java-collections/pom.xml
@@ -56,6 +56,12 @@
commons-exec
1.3
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
@@ -67,5 +73,6 @@
1.7.0
3.11.1
7.1.0
+ 1.16.12
diff --git a/core-java/src/main/java/com/baeldung/classcastexception/ClassCastException.java b/core-java-collections/src/main/java/com/baeldung/classcastexception/ClassCastException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/classcastexception/ClassCastException.java
rename to core-java-collections/src/main/java/com/baeldung/classcastexception/ClassCastException.java
diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/WaysToIterate.java b/core-java-collections/src/main/java/com/baeldung/java/list/WaysToIterate.java
new file mode 100644
index 0000000000..3cce08eabb
--- /dev/null
+++ b/core-java-collections/src/main/java/com/baeldung/java/list/WaysToIterate.java
@@ -0,0 +1,67 @@
+package com.baeldung.java.list;
+
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+/**
+ * Demonstrates the different ways to loop over
+ * the elements of a list.
+ */
+public class WaysToIterate {
+
+ List countries = Arrays.asList("Germany", "Panama", "Australia");
+
+ /**
+ * Iterate over a list using a basic for loop
+ */
+ public void iterateWithForLoop() {
+ for (int i = 0; i < countries.size(); i++) {
+ System.out.println(countries.get(i));
+ }
+ }
+
+ /**
+ * Iterate over a list using the enhanced for loop
+ */
+ public void iterateWithEnhancedForLoop() {
+ for (String country : countries) {
+ System.out.println(country);
+ }
+ }
+
+ /**
+ * Iterate over a list using an Iterator
+ */
+ public void iterateWithIterator() {
+ Iterator countriesIterator = countries.iterator();
+ while(countriesIterator.hasNext()) {
+ System.out.println(countriesIterator.next());
+ }
+ }
+
+ /**
+ * Iterate over a list using a ListIterator
+ */
+ public void iterateWithListIterator() {
+ ListIterator listIterator = countries.listIterator();
+ while(listIterator.hasNext()) {
+ System.out.println(listIterator.next());
+ }
+ }
+
+ /**
+ * Iterate over a list using the Iterable.forEach() method
+ */
+ public void iterateWithForEach() {
+ countries.forEach(System.out::println);
+ }
+
+ /**
+ * Iterate over a list using the Stream.forEach() method
+ */
+ public void iterateWithStreamForEach() {
+ countries.stream().forEach((c) -> System.out.println(c));
+ }
+}
\ No newline at end of file
diff --git a/core-java-collections/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java b/core-java-collections/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java
new file mode 100644
index 0000000000..973c60b233
--- /dev/null
+++ b/core-java-collections/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java
@@ -0,0 +1,71 @@
+package com.baeldung.java.list;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+import org.junit.Test;
+
+public class WaysToIterateUnitTest {
+
+ List globalCountries = new ArrayList();
+ List europeanCountries = Arrays.asList("Germany", "Panama", "Australia");
+
+ @Test
+ public void whenIteratingUsingForLoop_thenReturnThreeAsSizeOfList() {
+ for (int i = 0; i < europeanCountries.size(); i++) {
+ globalCountries.add(europeanCountries.get(i));
+ }
+ assertEquals(globalCountries.size(), 3);
+ globalCountries.clear();
+ }
+
+ @Test
+ public void whenIteratingUsingEnhancedForLoop_thenReturnThreeAsSizeOfList() {
+ for (String country : europeanCountries) {
+ globalCountries.add(country);
+ }
+ assertEquals(globalCountries.size(), 3);
+ globalCountries.clear();
+ }
+
+ @Test
+ public void whenIteratingUsingIterator_thenReturnThreeAsSizeOfList() {
+ Iterator countriesIterator = europeanCountries.iterator();
+ while (countriesIterator.hasNext()) {
+ globalCountries.add(countriesIterator.next());
+ }
+
+ assertEquals(globalCountries.size(), 3);
+ globalCountries.clear();
+ }
+
+ @Test
+ public void whenIteratingUsingListIterator_thenReturnThreeAsSizeOfList() {
+ ListIterator countriesIterator = europeanCountries.listIterator();
+ while (countriesIterator.hasNext()) {
+ globalCountries.add(countriesIterator.next());
+ }
+
+ assertEquals(globalCountries.size(), 3);
+ globalCountries.clear();
+ }
+
+ @Test
+ public void whenIteratingUsingForEach_thenReturnThreeAsSizeOfList() {
+ europeanCountries.forEach(country -> globalCountries.add(country));
+ assertEquals(globalCountries.size(), 3);
+ globalCountries.clear();
+ }
+
+ @Test
+ public void whenIteratingUsingStreamForEach_thenReturnThreeAsSizeOfList() {
+ europeanCountries.stream().forEach((country) -> globalCountries.add(country));
+ assertEquals(globalCountries.size(), 3);
+ globalCountries.clear();
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java b/core-java-collections/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java
rename to core-java-collections/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java
diff --git a/core-java/src/test/java/org/baeldung/java/sorting/Employee.java b/core-java-collections/src/test/java/org/baeldung/java/sorting/Employee.java
similarity index 100%
rename from core-java/src/test/java/org/baeldung/java/sorting/Employee.java
rename to core-java-collections/src/test/java/org/baeldung/java/sorting/Employee.java
diff --git a/core-java/src/test/java/org/baeldung/java/sorting/JavaSortingUnitTest.java b/core-java-collections/src/test/java/org/baeldung/java/sorting/JavaSortingUnitTest.java
similarity index 100%
rename from core-java/src/test/java/org/baeldung/java/sorting/JavaSortingUnitTest.java
rename to core-java-collections/src/test/java/org/baeldung/java/sorting/JavaSortingUnitTest.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java
new file mode 100644
index 0000000000..08c7eeec03
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java
@@ -0,0 +1,33 @@
+package com.baeldung.concurrent.countdownlatch;
+
+import java.util.concurrent.CountDownLatch;
+
+public class CountdownLatchCountExample {
+
+ private int count;
+
+ public CountdownLatchCountExample(int count) {
+ this.count = count;
+ }
+
+ public boolean callTwiceInSameThread() {
+ CountDownLatch countDownLatch = new CountDownLatch(count);
+ Thread t = new Thread(() -> {
+ countDownLatch.countDown();
+ countDownLatch.countDown();
+ });
+ t.start();
+
+ try {
+ countDownLatch.await();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ return countDownLatch.getCount() == 0;
+ }
+
+ public static void main(String[] args) {
+ CountdownLatchCountExample ex = new CountdownLatchCountExample(2);
+ System.out.println("Is CountDown Completed : " + ex.callTwiceInSameThread());
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java
new file mode 100644
index 0000000000..1828b7f91e
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java
@@ -0,0 +1,41 @@
+package com.baeldung.concurrent.countdownlatch;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class CountdownLatchResetExample {
+
+ private int count;
+ private int threadCount;
+ private final AtomicInteger updateCount;
+
+ CountdownLatchResetExample(int count, int threadCount) {
+ updateCount = new AtomicInteger(0);
+ this.count = count;
+ this.threadCount = threadCount;
+ }
+
+ public int countWaits() {
+ CountDownLatch countDownLatch = new CountDownLatch(count);
+ ExecutorService es = Executors.newFixedThreadPool(threadCount);
+ for (int i = 0; i < threadCount; i++) {
+ es.execute(() -> {
+ long prevValue = countDownLatch.getCount();
+ countDownLatch.countDown();
+ if (countDownLatch.getCount() != prevValue) {
+ updateCount.incrementAndGet();
+ }
+ });
+ }
+
+ es.shutdown();
+ return updateCount.get();
+ }
+
+ public static void main(String[] args) {
+ CountdownLatchResetExample ex = new CountdownLatchResetExample(5, 20);
+ System.out.println("Count : " + ex.countWaits());
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java
new file mode 100644
index 0000000000..7c1299da62
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java
@@ -0,0 +1,45 @@
+package com.baeldung.concurrent.cyclicbarrier;
+
+import java.util.concurrent.BrokenBarrierException;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class CyclicBarrierCompletionMethodExample {
+
+ private int count;
+ private int threadCount;
+ private final AtomicInteger updateCount;
+
+ CyclicBarrierCompletionMethodExample(int count, int threadCount) {
+ updateCount = new AtomicInteger(0);
+ this.count = count;
+ this.threadCount = threadCount;
+ }
+
+ public int countTrips() {
+
+ CyclicBarrier cyclicBarrier = new CyclicBarrier(count, () -> {
+ updateCount.incrementAndGet();
+ });
+
+ ExecutorService es = Executors.newFixedThreadPool(threadCount);
+ for (int i = 0; i < threadCount; i++) {
+ es.execute(() -> {
+ try {
+ cyclicBarrier.await();
+ } catch (InterruptedException | BrokenBarrierException e) {
+ e.printStackTrace();
+ }
+ });
+ }
+ es.shutdown();
+ return updateCount.get();
+ }
+
+ public static void main(String[] args) {
+ CyclicBarrierCompletionMethodExample ex = new CyclicBarrierCompletionMethodExample(5, 20);
+ System.out.println("Count : " + ex.countTrips());
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java
new file mode 100644
index 0000000000..9d637b428b
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java
@@ -0,0 +1,32 @@
+package com.baeldung.concurrent.cyclicbarrier;
+
+import java.util.concurrent.BrokenBarrierException;
+import java.util.concurrent.CyclicBarrier;
+
+public class CyclicBarrierCountExample {
+
+ private int count;
+
+ public CyclicBarrierCountExample(int count) {
+ this.count = count;
+ }
+
+ public boolean callTwiceInSameThread() {
+ CyclicBarrier cyclicBarrier = new CyclicBarrier(count);
+ Thread t = new Thread(() -> {
+ try {
+ cyclicBarrier.await();
+ cyclicBarrier.await();
+ } catch (InterruptedException | BrokenBarrierException e) {
+ e.printStackTrace();
+ }
+ });
+ t.start();
+ return cyclicBarrier.isBroken();
+ }
+
+ public static void main(String[] args) {
+ CyclicBarrierCountExample ex = new CyclicBarrierCountExample(7);
+ System.out.println("Count : " + ex.callTwiceInSameThread());
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java
new file mode 100644
index 0000000000..76b6198bc4
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java
@@ -0,0 +1,46 @@
+package com.baeldung.concurrent.cyclicbarrier;
+
+import java.util.concurrent.BrokenBarrierException;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class CyclicBarrierResetExample {
+
+ private int count;
+ private int threadCount;
+ private final AtomicInteger updateCount;
+
+ CyclicBarrierResetExample(int count, int threadCount) {
+ updateCount = new AtomicInteger(0);
+ this.count = count;
+ this.threadCount = threadCount;
+ }
+
+ public int countWaits() {
+
+ CyclicBarrier cyclicBarrier = new CyclicBarrier(count);
+
+ ExecutorService es = Executors.newFixedThreadPool(threadCount);
+ for (int i = 0; i < threadCount; i++) {
+ es.execute(() -> {
+ try {
+ if (cyclicBarrier.getNumberWaiting() > 0) {
+ updateCount.incrementAndGet();
+ }
+ cyclicBarrier.await();
+ } catch (InterruptedException | BrokenBarrierException e) {
+ e.printStackTrace();
+ }
+ });
+ }
+ es.shutdown();
+ return updateCount.get();
+ }
+
+ public static void main(String[] args) {
+ CyclicBarrierResetExample ex = new CyclicBarrierResetExample(7, 20);
+ System.out.println("Count : " + ex.countWaits());
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/SemaphoreDemo.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java
similarity index 60%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/SemaphoreDemo.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java
index c3afba1f68..8b58916707 100644
--- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/SemaphoreDemo.java
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java
@@ -2,55 +2,47 @@ package com.baeldung.concurrent.evenandodd;
import java.util.concurrent.Semaphore;
-public class SemaphoreDemo {
+public class PrintEvenOddSemaphore {
public static void main(String[] args) {
-
SharedPrinter sp = new SharedPrinter();
- Thread odd = new Thread(new Odd(sp, 10));
- odd.setName("Odd");
- Thread even = new Thread(new Even(sp, 10));
- even.setName("Even");
+ Thread odd = new Thread(new Odd(sp, 10), "Odd");
+ Thread even = new Thread(new Even(sp, 10), "Even");
odd.start();
even.start();
-
}
-
}
class SharedPrinter {
- Semaphore semEven = new Semaphore(0);
- Semaphore semOdd = new Semaphore(1);
+ private final Semaphore semEven = new Semaphore(0);
+ private final Semaphore semOdd = new Semaphore(1);
- public void printEvenNum(int num) {
+ void printEvenNum(int num) {
try {
semEven.acquire();
} catch (InterruptedException e) {
- e.printStackTrace();
+ Thread.currentThread().interrupt();
}
- System.out.println(Thread.currentThread()
- .getName() + ":"+num);
+ System.out.println(Thread.currentThread().getName() + ":"+num);
semOdd.release();
}
- public void printOddNum(int num) {
+ void printOddNum(int num) {
try {
semOdd.acquire();
} catch (InterruptedException e) {
- e.printStackTrace();
+ Thread.currentThread().interrupt();
}
- System.out.println(Thread.currentThread()
- .getName() + ":"+ num);
+ System.out.println(Thread.currentThread().getName() + ":"+ num);
semEven.release();
-
}
}
class Even implements Runnable {
- SharedPrinter sp;
- int max;
+ private final SharedPrinter sp;
+ private final int max;
Even(SharedPrinter sp, int max) {
this.sp = sp;
@@ -66,8 +58,8 @@ class Even implements Runnable {
}
class Odd implements Runnable {
- SharedPrinter sp;
- int max;
+ private SharedPrinter sp;
+ private int max;
Odd(SharedPrinter sp, int max) {
this.sp = sp;
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOdd.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java
similarity index 64%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOdd.java
rename to core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java
index 54d89382b9..2b59f22a6e 100644
--- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOdd.java
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java
@@ -1,22 +1,20 @@
package com.baeldung.concurrent.evenandodd;
-public class PrintEvenOdd {
+public class PrintEvenOddWaitNotify {
public static void main(String... args) {
Printer print = new Printer();
- Thread t1 = new Thread(new TaskEvenOdd(print, 10, false));
- t1.setName("Odd");
- Thread t2 = new Thread(new TaskEvenOdd(print, 10, true));
- t2.setName("Even");
+ Thread t1 = new Thread(new TaskEvenOdd(print, 10, false), "Odd");
+ Thread t2 = new Thread(new TaskEvenOdd(print, 10, true), "Even");
t1.start();
t2.start();
}
}
class TaskEvenOdd implements Runnable {
- private int max;
- private Printer print;
- private boolean isEvenNumber;
+ private final int max;
+ private final Printer print;
+ private final boolean isEvenNumber;
TaskEvenOdd(Printer print, int max, boolean isEvenNumber) {
this.print = print;
@@ -26,7 +24,7 @@ class TaskEvenOdd implements Runnable {
@Override
public void run() {
- int number = isEvenNumber == true ? 2 : 1;
+ int number = isEvenNumber ? 2 : 1;
while (number <= max) {
if (isEvenNumber) {
print.printEven(number);
@@ -39,32 +37,30 @@ class TaskEvenOdd implements Runnable {
}
class Printer {
- boolean isOdd = false;
+ private volatile boolean isOdd;
synchronized void printEven(int number) {
- while (isOdd == false) {
+ while (!isOdd) {
try {
wait();
} catch (InterruptedException e) {
- e.printStackTrace();
+ Thread.currentThread().interrupt();
}
}
- System.out.println(Thread.currentThread()
- .getName() + ":" + number);
+ System.out.println(Thread.currentThread().getName() + ":" + number);
isOdd = false;
notify();
}
synchronized void printOdd(int number) {
- while (isOdd == true) {
+ while (isOdd) {
try {
wait();
} catch (InterruptedException e) {
- e.printStackTrace();
+ Thread.currentThread().interrupt();
}
}
- System.out.println(Thread.currentThread()
- .getName() + ":" + number);
+ System.out.println(Thread.currentThread().getName() + ":" + number);
isOdd = true;
notify();
}
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java
new file mode 100644
index 0000000000..835efa53f2
--- /dev/null
+++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.concurrent.countdownlatch;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class CountdownLatchCountExampleUnitTest {
+
+ @Test
+ public void whenCountDownLatch_completed() {
+ CountdownLatchCountExample ex = new CountdownLatchCountExample(2);
+ boolean isCompleted = ex.callTwiceInSameThread();
+ assertTrue(isCompleted);
+ }
+}
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java
new file mode 100644
index 0000000000..d2d43f6312
--- /dev/null
+++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.concurrent.countdownlatch;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class CountdownLatchResetExampleUnitTest {
+
+ @Test
+ public void whenCountDownLatch_noReset() {
+ CountdownLatchResetExample ex = new CountdownLatchResetExample(7,20);
+ int lineCount = ex.countWaits();
+ assertTrue(lineCount <= 7);
+ }
+}
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java
new file mode 100644
index 0000000000..310063c86c
--- /dev/null
+++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.concurrent.cyclicbarrier;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class CyclicBarrierCompletionMethodExampleUnitTest {
+
+ @Test
+ public void whenCyclicBarrier_countTrips() {
+ CyclicBarrierCompletionMethodExample ex = new CyclicBarrierCompletionMethodExample(7,20);
+ int lineCount = ex.countTrips();
+ assertEquals(2, lineCount);
+ }
+}
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java
new file mode 100644
index 0000000000..9b7f3d9945
--- /dev/null
+++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.concurrent.cyclicbarrier;
+
+import static org.junit.Assert.assertFalse;
+
+import org.junit.Test;
+
+public class CyclicBarrierCountExampleUnitTest {
+
+ @Test
+ public void whenCyclicBarrier_notCompleted() {
+ CyclicBarrierCountExample ex = new CyclicBarrierCountExample(2);
+ boolean isCompleted = ex.callTwiceInSameThread();
+ assertFalse(isCompleted);
+ }
+}
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java
new file mode 100644
index 0000000000..8d2b148f06
--- /dev/null
+++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.concurrent.cyclicbarrier;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class CyclicBarrierResetExampleUnitTest {
+
+ @Test
+ public void whenCyclicBarrier_reset() {
+ CyclicBarrierResetExample ex = new CyclicBarrierResetExample(7,20);
+ int lineCount = ex.countWaits();
+ assertTrue(lineCount > 7);
+ }
+}
diff --git a/core-java-io/README.md b/core-java-io/README.md
index ae4c267b8a..3d028783ed 100644
--- a/core-java-io/README.md
+++ b/core-java-io/README.md
@@ -33,3 +33,5 @@
- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
- [Read a File into an ArrayList](https://www.baeldung.com/java-file-to-arraylist)
- [Guide to Java OutputStream](https://www.baeldung.com/java-outputstream)
+- [Reading a CSV File into an Array](https://www.baeldung.com/java-csv-file-array)
+- [Guide to BufferedReader](https://www.baeldung.com/java-buffered-reader)
diff --git a/core-java-lang/.gitignore b/core-java-lang/.gitignore
new file mode 100644
index 0000000000..374c8bf907
--- /dev/null
+++ b/core-java-lang/.gitignore
@@ -0,0 +1,25 @@
+*.class
+
+0.*
+
+#folders#
+/target
+/neoDb*
+/data
+/src/main/webapp/WEB-INF/classes
+*/META-INF/*
+.resourceCache
+
+# Packaged files #
+*.jar
+*.war
+*.ear
+
+# Files generated by integration tests
+backup-pom.xml
+/bin/
+/temp
+
+#IntelliJ specific
+.idea/
+*.iml
\ No newline at end of file
diff --git a/core-java-lang/README.md b/core-java-lang/README.md
new file mode 100644
index 0000000000..79d2375c24
--- /dev/null
+++ b/core-java-lang/README.md
@@ -0,0 +1,61 @@
+=========
+
+## Core Java Lang Cookbooks and Examples
+
+### Relevant Articles:
+- [Guide to Java Reflection](http://www.baeldung.com/java-reflection)
+- [Introduction to Java Generics](http://www.baeldung.com/java-generics)
+- [Generate equals() and hashCode() with Eclipse](http://www.baeldung.com/java-eclipse-equals-and-hashcode)
+- [Chained Exceptions in Java](http://www.baeldung.com/java-chained-exceptions)
+- [Java Primitive Conversions](http://www.baeldung.com/java-primitive-conversions)
+- [Call Methods at Runtime Using Java Reflection](http://www.baeldung.com/java-method-reflection)
+- [Iterating Over Enum Values in Java](http://www.baeldung.com/java-enum-iteration)
+- [Changing Annotation Parameters At Runtime](http://www.baeldung.com/java-reflection-change-annotation-params)
+- [Dynamic Proxies in Java](http://www.baeldung.com/java-dynamic-proxies)
+- [Java Double Brace Initialization](http://www.baeldung.com/java-double-brace-initialization)
+- [Guide to hashCode() in Java](http://www.baeldung.com/java-hashcode)
+- [Guide to the Diamond Operator in Java](http://www.baeldung.com/java-diamond-operator)
+- [A Guide to the Static Keyword in Java](http://www.baeldung.com/java-static)
+- [Quick Example - Comparator vs Comparable in Java](http://www.baeldung.com/java-comparator-comparable)
+- [The Java continue and break Keywords](http://www.baeldung.com/java-continue-and-break)
+- [A Guide to Java Initialization](http://www.baeldung.com/java-initialization)
+- [Nested Classes in Java](http://www.baeldung.com/java-nested-classes)
+- [A Guide to Java Loops](http://www.baeldung.com/java-loops)
+- [Varargs in Java](http://www.baeldung.com/java-varargs)
+- [A Guide to Inner Interfaces in Java](http://www.baeldung.com/java-inner-interfaces)
+- [Polymorphism in Java](http://www.baeldung.com/java-polymorphism)
+- [Recursion In Java](http://www.baeldung.com/java-recursion)
+- [A Guide to the finalize Method in Java](http://www.baeldung.com/java-finalize)
+- [Method Overloading and Overriding in Java](http://www.baeldung.com/java-method-overload-override)
+- [How to Make a Deep Copy of an Object in Java](http://www.baeldung.com/java-deep-copy)
+- [Guide to Inheritance in Java](http://www.baeldung.com/java-inheritance)
+- [Object Type Casting in Java](http://www.baeldung.com/java-type-casting)
+- [The "final" Keyword in Java](http://www.baeldung.com/java-final)
+- [A Guide to Java Enums](http://www.baeldung.com/a-guide-to-java-enums)
+- [Infinite Loops in Java](http://www.baeldung.com/infinite-loops-java)
+- [Quick Guide to java.lang.System](http://www.baeldung.com/java-lang-system)
+- [Type Erasure in Java Explained](http://www.baeldung.com/java-type-erasure)
+- [Using Java Assertions](http://www.baeldung.com/java-assert)
+- [Pass-By-Value as a Parameter Passing Mechanism in Java](http://www.baeldung.com/java-pass-by-value-or-pass-by-reference)
+- [Variable and Method Hiding in Java](http://www.baeldung.com/java-variable-method-hiding)
+- [Access Modifiers in Java](http://www.baeldung.com/java-access-modifiers)
+- [Guide to the super Java Keyword](http://www.baeldung.com/java-super)
+- [Guide to the this Java Keyword](http://www.baeldung.com/java-this)
+- [Immutable Objects in Java](http://www.baeldung.com/java-immutable-object)
+- [ClassNotFoundException vs NoClassDefFoundError](http://www.baeldung.com/java-classnotfoundexception-and-noclassdeffounderror)
+- [The StackOverflowError in Java](http://www.baeldung.com/java-stack-overflow-error)
+- [Create a Custom Exception in Java](http://www.baeldung.com/java-new-custom-exception)
+- [Exception Handling in Java](http://www.baeldung.com/java-exceptions)
+- [Differences Between Final, Finally and Finalize in Java](https://www.baeldung.com/java-final-finally-finalize)
+- [Static and Dynamic Binding in Java](https://www.baeldung.com/java-static-dynamic-binding)
+- [Difference Between Throw and Throws in Java](https://www.baeldung.com/java-throw-throws)
+- [Synthetic Constructs in Java](https://www.baeldung.com/java-synthetic)
+- [Java Switch Statement](https://www.baeldung.com/java-switch)
+- [The Modulo Operator in Java](https://www.baeldung.com/modulo-java)
+- [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator)
+- [How to Separate Double into Integer and Decimal Parts](https://www.baeldung.com/java-separate-double-into-integer-decimal-parts)
+- [“Sneaky Throws” in Java](http://www.baeldung.com/java-sneaky-throws)
+- [Inheritance and Composition (Is-a vs Has-a relationship) in Java](http://www.baeldung.com/java-inheritance-composition)
+- [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors)
+- [Retrieving a Class Name in Java](https://www.baeldung.com/java-class-name)
+
diff --git a/core-java-lang/pom.xml b/core-java-lang/pom.xml
new file mode 100644
index 0000000000..2f307859f1
--- /dev/null
+++ b/core-java-lang/pom.xml
@@ -0,0 +1,436 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-lang
+ 0.1.0-SNAPSHOT
+ jar
+ core-java-lang
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+
+
+ com.google.code.gson
+ gson
+ ${gson.version}
+
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+ org.slf4j
+ log4j-over-slf4j
+ ${org.slf4j.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
+
+ org.springframework
+ spring-web
+ ${springframework.spring-web.version}
+
+
+ javax.mail
+ mail
+ ${javax.mail.version}
+
+
+ nl.jqno.equalsverifier
+ equalsverifier
+ ${equalsverifier.version}
+ test
+
+
+
+
+ core-java-lang
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ **/*LiveTest.java
+ **/*IntegrationTest.java
+ **/*IntTest.java
+ **/*LongRunningUnitTest.java
+ **/*ManualTest.java
+
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-dependencies
+ prepare-package
+
+ copy-dependencies
+
+
+ ${project.build.directory}/libs
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ ${maven-jar-plugin.version}
+
+
+
+ true
+ libs/
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+
+ package
+
+ single
+
+
+ ${project.basedir}
+
+
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+ jar-with-dependencies
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ ${maven-shade-plugin.version}
+
+
+
+ shade
+
+
+ true
+
+
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
+
+
+ com.jolira
+ onejar-maven-plugin
+ ${onejar-maven-plugin.version}
+
+
+
+ org.baeldung.executable.ExecutableMavenJar
+ true
+ ${project.build.finalName}-onejar.${project.packaging}
+
+
+ one-jar
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot-maven-plugin.version}
+
+
+
+ repackage
+
+
+ spring-boot
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ ${exec-maven-plugin.version}
+
+ java
+ com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
+
+ -Xmx300m
+ -XX:+UseParallelGC
+ -classpath
+
+ com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ ${maven-javadoc-plugin.version}
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+
+ integration
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ **/*ManualTest.java
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+
+
+
+
+ json
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ ${exec-maven-plugin.version}
+
+
+ run-benchmarks
+
+ none
+
+ exec
+
+
+ test
+ java
+
+ -classpath
+
+ org.openjdk.jmh.Main
+ .*
+
+
+
+
+
+
+
+
+
+
+
+ buildAgentLoader
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ package
+
+ jar
+
+
+ agentLoader
+ target/classes
+
+
+ true
+
+ ${project.build.outputDirectory}/META-INF/MANIFEST.MF
+
+
+
+ com/baeldung/instrumentation/application/AgentLoader.class
+ com/baeldung/instrumentation/application/Launcher.class
+
+
+
+
+
+
+
+
+
+ buildApplication
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ package
+
+ jar
+
+
+ application
+ target/classes
+
+
+ true
+
+ ${project.build.outputDirectory}/META-INF/MANIFEST.MF
+
+
+
+ com/baeldung/instrumentation/application/MyAtm.class
+ com/baeldung/instrumentation/application/MyAtmApplication.class
+ com/baeldung/instrumentation/application/Launcher.class
+
+
+
+
+
+
+
+
+
+ buildAgent
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ package
+
+ jar
+
+
+ agent
+ target/classes
+
+
+ true
+
+ ${project.build.outputDirectory}/META-INF/MANIFEST.MF
+
+
+
+ com/baeldung/instrumentation/agent/AtmTransformer.class
+ com/baeldung/instrumentation/agent/MyInstrumentationAgent.class
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2.8.5
+ 2.8.2
+
+
+ 3.5
+ 1.16.12
+
+ 1.5.0-b01
+
+
+ 3.10.0
+
+
+ 2.21.0
+ 4.3.4.RELEASE
+ 3.0.0-M1
+ 3.0.2
+ 1.4.4
+ 3.1.1
+ 2.0.3.RELEASE
+ 1.6.0
+ 3.0.3
+
+
+
diff --git a/core-java/src/main/java/com/baeldung/accessmodifiers/Public.java b/core-java-lang/src/main/java/com/baeldung/accessmodifiers/Public.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/accessmodifiers/Public.java
rename to core-java-lang/src/main/java/com/baeldung/accessmodifiers/Public.java
diff --git a/core-java/src/main/java/com/baeldung/accessmodifiers/SubClass.java b/core-java-lang/src/main/java/com/baeldung/accessmodifiers/SubClass.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/accessmodifiers/SubClass.java
rename to core-java-lang/src/main/java/com/baeldung/accessmodifiers/SubClass.java
diff --git a/core-java/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java b/core-java-lang/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
rename to core-java-lang/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
diff --git a/core-java/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java b/core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
rename to core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
diff --git a/core-java/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java b/core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
rename to core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
diff --git a/core-java/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java b/core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
rename to core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
diff --git a/core-java/src/main/java/com/baeldung/assertion/Assertion.java b/core-java-lang/src/main/java/com/baeldung/assertion/Assertion.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/assertion/Assertion.java
rename to core-java-lang/src/main/java/com/baeldung/assertion/Assertion.java
diff --git a/core-java/src/main/java/com/baeldung/binding/Animal.java b/core-java-lang/src/main/java/com/baeldung/binding/Animal.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/binding/Animal.java
rename to core-java-lang/src/main/java/com/baeldung/binding/Animal.java
diff --git a/core-java/src/main/java/com/baeldung/binding/AnimalActivity.java b/core-java-lang/src/main/java/com/baeldung/binding/AnimalActivity.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/binding/AnimalActivity.java
rename to core-java-lang/src/main/java/com/baeldung/binding/AnimalActivity.java
diff --git a/core-java/src/main/java/com/baeldung/binding/Cat.java b/core-java-lang/src/main/java/com/baeldung/binding/Cat.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/binding/Cat.java
rename to core-java-lang/src/main/java/com/baeldung/binding/Cat.java
diff --git a/core-java/src/main/java/com/baeldung/breakcontinue/BreakContinue.java b/core-java-lang/src/main/java/com/baeldung/breakcontinue/BreakContinue.java
similarity index 99%
rename from core-java/src/main/java/com/baeldung/breakcontinue/BreakContinue.java
rename to core-java-lang/src/main/java/com/baeldung/breakcontinue/BreakContinue.java
index ce85b487c1..23bb531273 100644
--- a/core-java/src/main/java/com/baeldung/breakcontinue/BreakContinue.java
+++ b/core-java-lang/src/main/java/com/baeldung/breakcontinue/BreakContinue.java
@@ -11,6 +11,7 @@ import java.util.Map.Entry;
* @author Santosh
*
*/
+
public class BreakContinue {
public static int unlabeledBreak() {
diff --git a/core-java/src/main/java/com/baeldung/casting/Animal.java b/core-java-lang/src/main/java/com/baeldung/casting/Animal.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/casting/Animal.java
rename to core-java-lang/src/main/java/com/baeldung/casting/Animal.java
diff --git a/core-java/src/main/java/com/baeldung/casting/AnimalFeeder.java b/core-java-lang/src/main/java/com/baeldung/casting/AnimalFeeder.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/casting/AnimalFeeder.java
rename to core-java-lang/src/main/java/com/baeldung/casting/AnimalFeeder.java
diff --git a/core-java/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java b/core-java-lang/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java
rename to core-java-lang/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java
diff --git a/core-java/src/main/java/com/baeldung/casting/Cat.java b/core-java-lang/src/main/java/com/baeldung/casting/Cat.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/casting/Cat.java
rename to core-java-lang/src/main/java/com/baeldung/casting/Cat.java
diff --git a/core-java/src/main/java/com/baeldung/casting/Dog.java b/core-java-lang/src/main/java/com/baeldung/casting/Dog.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/casting/Dog.java
rename to core-java-lang/src/main/java/com/baeldung/casting/Dog.java
diff --git a/core-java/src/main/java/com/baeldung/casting/Mew.java b/core-java-lang/src/main/java/com/baeldung/casting/Mew.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/casting/Mew.java
rename to core-java-lang/src/main/java/com/baeldung/casting/Mew.java
diff --git a/core-java/src/main/java/com/baeldung/chainedexception/LogWithChain.java b/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithChain.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/chainedexception/LogWithChain.java
rename to core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithChain.java
diff --git a/core-java/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java b/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java
rename to core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java
diff --git a/core-java/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java b/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java
rename to core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java
diff --git a/core-java/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java b/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java
rename to core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java
diff --git a/core-java/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java b/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java
rename to core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java
diff --git a/core-java/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java b/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java
rename to core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java
diff --git a/core-java-lang/src/main/java/com/baeldung/className/RetrievingClassName.java b/core-java-lang/src/main/java/com/baeldung/className/RetrievingClassName.java
new file mode 100644
index 0000000000..ab6c8a51ff
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/className/RetrievingClassName.java
@@ -0,0 +1,9 @@
+package com.baeldung.className;
+
+public class RetrievingClassName {
+
+ public class InnerClass {
+
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/comparable/Player.java b/core-java-lang/src/main/java/com/baeldung/comparable/Player.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/comparable/Player.java
rename to core-java-lang/src/main/java/com/baeldung/comparable/Player.java
diff --git a/core-java/src/main/java/com/baeldung/comparable/PlayerSorter.java b/core-java-lang/src/main/java/com/baeldung/comparable/PlayerSorter.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/comparable/PlayerSorter.java
rename to core-java-lang/src/main/java/com/baeldung/comparable/PlayerSorter.java
diff --git a/core-java/src/main/java/com/baeldung/comparator/Player.java b/core-java-lang/src/main/java/com/baeldung/comparator/Player.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/comparator/Player.java
rename to core-java-lang/src/main/java/com/baeldung/comparator/Player.java
diff --git a/core-java/src/main/java/com/baeldung/comparator/PlayerAgeComparator.java b/core-java-lang/src/main/java/com/baeldung/comparator/PlayerAgeComparator.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/comparator/PlayerAgeComparator.java
rename to core-java-lang/src/main/java/com/baeldung/comparator/PlayerAgeComparator.java
diff --git a/core-java/src/main/java/com/baeldung/comparator/PlayerAgeSorter.java b/core-java-lang/src/main/java/com/baeldung/comparator/PlayerAgeSorter.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/comparator/PlayerAgeSorter.java
rename to core-java-lang/src/main/java/com/baeldung/comparator/PlayerAgeSorter.java
diff --git a/core-java/src/main/java/com/baeldung/comparator/PlayerRankingComparator.java b/core-java-lang/src/main/java/com/baeldung/comparator/PlayerRankingComparator.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/comparator/PlayerRankingComparator.java
rename to core-java-lang/src/main/java/com/baeldung/comparator/PlayerRankingComparator.java
diff --git a/core-java/src/main/java/com/baeldung/comparator/PlayerRankingSorter.java b/core-java-lang/src/main/java/com/baeldung/comparator/PlayerRankingSorter.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/comparator/PlayerRankingSorter.java
rename to core-java-lang/src/main/java/com/baeldung/comparator/PlayerRankingSorter.java
diff --git a/core-java-lang/src/main/java/com/baeldung/constructors/BankAccount.java b/core-java-lang/src/main/java/com/baeldung/constructors/BankAccount.java
new file mode 100644
index 0000000000..3d50e85245
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/constructors/BankAccount.java
@@ -0,0 +1,56 @@
+package com.baeldung.constructors;
+
+import java.time.LocalDateTime;
+
+class BankAccount {
+ String name;
+ LocalDateTime opened;
+ double balance;
+
+ @Override
+ public String toString() {
+ return String.format("%s, %s, %f", this.name, this.opened.toString(), this.balance);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public LocalDateTime getOpened() {
+ return opened;
+ }
+
+ public double getBalance() {
+ return this.balance;
+ }
+}
+
+class BankAccountEmptyConstructor extends BankAccount {
+ public BankAccountEmptyConstructor() {
+ this.name = "";
+ this.opened = LocalDateTime.now();
+ this.balance = 0.0d;
+ }
+}
+
+class BankAccountParameterizedConstructor extends BankAccount {
+ public BankAccountParameterizedConstructor(String name, LocalDateTime opened, double balance) {
+ this.name = name;
+ this.opened = opened;
+ this.balance = balance;
+ }
+}
+
+class BankAccountCopyConstructor extends BankAccount {
+ public BankAccountCopyConstructor(String name, LocalDateTime opened, double balance) {
+ this.name = name;
+ this.opened = opened;
+ this.balance = balance;
+ }
+
+ public BankAccountCopyConstructor(BankAccount other) {
+ this.name = other.name;
+ this.opened = LocalDateTime.now();
+ this.balance = 0.0f;
+ }
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/constructors/Transaction.java b/core-java-lang/src/main/java/com/baeldung/constructors/Transaction.java
new file mode 100644
index 0000000000..14704f507a
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/constructors/Transaction.java
@@ -0,0 +1,25 @@
+package com.baeldung.constructors;
+
+import java.time.LocalDateTime;
+
+class Transaction {
+ final BankAccountEmptyConstructor bankAccount;
+ final LocalDateTime date;
+ final double amount;
+
+ public Transaction(BankAccountEmptyConstructor account, LocalDateTime date, double amount) {
+ this.bankAccount = account;
+ this.date = date;
+ this.amount = amount;
+ }
+
+ /*
+ * Compilation Error :'(, all final variables must be explicitly initialised.
+ * public Transaction() {
+ * }
+ */
+
+ public void invalidMethod() {
+ // this.amount = 102.03; // Results in a compiler error. You cannot change the value of a final variable.
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/customexception/FileManager.java b/core-java-lang/src/main/java/com/baeldung/customexception/FileManager.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/customexception/FileManager.java
rename to core-java-lang/src/main/java/com/baeldung/customexception/FileManager.java
diff --git a/core-java/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java b/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java
rename to core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java
diff --git a/core-java/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java b/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java
rename to core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java
diff --git a/core-java/src/main/java/com/baeldung/deepcopy/Address.java b/core-java-lang/src/main/java/com/baeldung/deepcopy/Address.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/deepcopy/Address.java
rename to core-java-lang/src/main/java/com/baeldung/deepcopy/Address.java
diff --git a/core-java/src/main/java/com/baeldung/deepcopy/User.java b/core-java-lang/src/main/java/com/baeldung/deepcopy/User.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/deepcopy/User.java
rename to core-java-lang/src/main/java/com/baeldung/deepcopy/User.java
diff --git a/core-java/src/main/java/com/baeldung/doubles/SplitFloatingPointNumbers.java b/core-java-lang/src/main/java/com/baeldung/doubles/SplitFloatingPointNumbers.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/doubles/SplitFloatingPointNumbers.java
rename to core-java-lang/src/main/java/com/baeldung/doubles/SplitFloatingPointNumbers.java
diff --git a/core-java/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java b/core-java-lang/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java
rename to core-java-lang/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java
diff --git a/core-java/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java b/core-java-lang/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java
rename to core-java-lang/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java
diff --git a/core-java/src/main/java/com/baeldung/enums/Pizza.java b/core-java-lang/src/main/java/com/baeldung/enums/Pizza.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/enums/Pizza.java
rename to core-java-lang/src/main/java/com/baeldung/enums/Pizza.java
diff --git a/core-java/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java b/core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java
rename to core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java
diff --git a/core-java/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java b/core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java
rename to core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java
diff --git a/core-java/src/main/java/com/baeldung/enums/README.md b/core-java-lang/src/main/java/com/baeldung/enums/README.md
similarity index 100%
rename from core-java/src/main/java/com/baeldung/enums/README.md
rename to core-java-lang/src/main/java/com/baeldung/enums/README.md
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/Money.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/Money.java
new file mode 100644
index 0000000000..60c043545d
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/equalshashcode/Money.java
@@ -0,0 +1,36 @@
+package com.baeldung.equalshashcode;
+
+class Money {
+
+ int amount;
+ String currencyCode;
+
+ Money(int amount, String currencyCode) {
+ this.amount = amount;
+ this.currencyCode = currencyCode;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this)
+ return true;
+ if (!(o instanceof Money))
+ return false;
+ Money other = (Money)o;
+ boolean currencyCodeEquals = (this.currencyCode == null && other.currencyCode == null)
+ || (this.currencyCode != null && this.currencyCode.equals(other.currencyCode));
+ return this.amount == other.amount
+ && currencyCodeEquals;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 17;
+ result = 31 * result + amount;
+ if (currencyCode != null) {
+ result = 31 * result + currencyCode.hashCode();
+ }
+ return result;
+ }
+
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/Team.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/Team.java
new file mode 100644
index 0000000000..c2dee1de6b
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/equalshashcode/Team.java
@@ -0,0 +1,39 @@
+package com.baeldung.equalshashcode;
+
+class Team {
+
+ final String city;
+ final String department;
+
+ Team(String city, String department) {
+ this.city = city;
+ this.department = department;
+ }
+
+ @Override
+ public final boolean equals(Object o) {
+ if (o == this)
+ return true;
+ if (!(o instanceof Team))
+ return false;
+ Team otherTeam = (Team)o;
+ boolean cityEquals = (this.city == null && otherTeam.city == null)
+ || this.city != null && this.city.equals(otherTeam.city);
+ boolean departmentEquals = (this.department == null && otherTeam.department == null)
+ || this.department != null && this.department.equals(otherTeam.department);
+ return cityEquals && departmentEquals;
+ }
+
+ @Override
+ public final int hashCode() {
+ int result = 17;
+ if (city != null) {
+ result = 31 * result + city.hashCode();
+ }
+ if (department != null) {
+ result = 31 * result + department.hashCode();
+ }
+ return result;
+ }
+
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/Voucher.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/Voucher.java
new file mode 100644
index 0000000000..19f46e0358
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/equalshashcode/Voucher.java
@@ -0,0 +1,38 @@
+package com.baeldung.equalshashcode;
+
+class Voucher {
+
+ private Money value;
+ private String store;
+
+ Voucher(int amount, String currencyCode, String store) {
+ this.value = new Money(amount, currencyCode);
+ this.store = store;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this)
+ return true;
+ if (!(o instanceof Voucher))
+ return false;
+ Voucher other = (Voucher)o;
+ boolean valueEquals = (this.value == null && other.value == null)
+ || (this.value != null && this.value.equals(other.value));
+ boolean storeEquals = (this.store == null && other.store == null)
+ || (this.store != null && this.store.equals(other.store));
+ return valueEquals && storeEquals;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 17;
+ if (this.value != null) {
+ result = 31 * result + value.hashCode();
+ }
+ if (this.store != null) {
+ result = 31 * result + store.hashCode();
+ }
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongTeam.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongTeam.java
new file mode 100644
index 0000000000..c4477aa790
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongTeam.java
@@ -0,0 +1,30 @@
+package com.baeldung.equalshashcode;
+
+/* (non-Javadoc)
+* This class overrides equals, but it doesn't override hashCode.
+*
+* To see which problems this leads to:
+* TeamUnitTest.givenMapKeyWithoutHashCode_whenSearched_thenReturnsWrongValue
+*/
+class WrongTeam {
+
+ String city;
+ String department;
+
+ WrongTeam(String city, String department) {
+ this.city = city;
+ this.department = department;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this)
+ return true;
+ if (!(o instanceof WrongTeam))
+ return false;
+ WrongTeam otherTeam = (WrongTeam)o;
+ return this.city == otherTeam.city
+ && this.department == otherTeam.department;
+ }
+
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java
new file mode 100644
index 0000000000..97935bf8de
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java
@@ -0,0 +1,47 @@
+package com.baeldung.equalshashcode;
+
+/* (non-Javadoc)
+* This class extends the Money class that has overridden the equals method and once again overrides the equals method.
+*
+* To see which problems this leads to:
+* MoneyUnitTest.givenMoneyAndVoucherInstances_whenEquals_thenReturnValuesArentSymmetric
+*/
+class WrongVoucher extends Money {
+
+ private String store;
+
+ WrongVoucher(int amount, String currencyCode, String store) {
+ super(amount, currencyCode);
+
+ this.store = store;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this)
+ return true;
+ if (!(o instanceof WrongVoucher))
+ return false;
+ WrongVoucher other = (WrongVoucher)o;
+ boolean currencyCodeEquals = (this.currencyCode == null && other.currencyCode == null)
+ || (this.currencyCode != null && this.currencyCode.equals(other.currencyCode));
+ boolean storeEquals = (this.store == null && other.store == null)
+ || (this.store != null && this.store.equals(other.store));
+ return this.amount == other.amount
+ && currencyCodeEquals
+ && storeEquals;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 17;
+ result = 31 * result + amount;
+ if (this.currencyCode != null) {
+ result = 31 * result + currencyCode.hashCode();
+ }
+ if (this.store != null) {
+ result = 31 * result + store.hashCode();
+ }
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java
rename to core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java
diff --git a/core-java/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java
rename to core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java
diff --git a/core-java/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java
rename to core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java
diff --git a/core-java/src/main/java/com/baeldung/equalshashcode/entities/Shape.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Shape.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/equalshashcode/entities/Shape.java
rename to core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Shape.java
diff --git a/core-java/src/main/java/com/baeldung/equalshashcode/entities/Square.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Square.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/equalshashcode/entities/Square.java
rename to core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Square.java
diff --git a/core-java/src/main/java/com/baeldung/exceptionhandling/Exceptions.java b/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Exceptions.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/exceptionhandling/Exceptions.java
rename to core-java-lang/src/main/java/com/baeldung/exceptionhandling/Exceptions.java
diff --git a/core-java/src/main/java/com/baeldung/exceptionhandling/MyException.java b/core-java-lang/src/main/java/com/baeldung/exceptionhandling/MyException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/exceptionhandling/MyException.java
rename to core-java-lang/src/main/java/com/baeldung/exceptionhandling/MyException.java
diff --git a/core-java/src/main/java/com/baeldung/exceptionhandling/Player.java b/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Player.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/exceptionhandling/Player.java
rename to core-java-lang/src/main/java/com/baeldung/exceptionhandling/Player.java
diff --git a/core-java/src/main/java/com/baeldung/exceptionhandling/PlayerLoadException.java b/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerLoadException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/exceptionhandling/PlayerLoadException.java
rename to core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerLoadException.java
diff --git a/core-java/src/main/java/com/baeldung/exceptionhandling/PlayerScoreException.java b/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerScoreException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/exceptionhandling/PlayerScoreException.java
rename to core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerScoreException.java
diff --git a/core-java/src/main/java/com/baeldung/exceptionhandling/TimeoutException.java b/core-java-lang/src/main/java/com/baeldung/exceptionhandling/TimeoutException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/exceptionhandling/TimeoutException.java
rename to core-java-lang/src/main/java/com/baeldung/exceptionhandling/TimeoutException.java
diff --git a/core-java/src/main/java/com/baeldung/finalize/CloseableResource.java b/core-java-lang/src/main/java/com/baeldung/finalize/CloseableResource.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/finalize/CloseableResource.java
rename to core-java-lang/src/main/java/com/baeldung/finalize/CloseableResource.java
diff --git a/core-java/src/main/java/com/baeldung/finalize/Finalizable.java b/core-java-lang/src/main/java/com/baeldung/finalize/Finalizable.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/finalize/Finalizable.java
rename to core-java-lang/src/main/java/com/baeldung/finalize/Finalizable.java
diff --git a/core-java/src/main/java/com/baeldung/finalkeyword/BlackCat.java b/core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackCat.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/finalkeyword/BlackCat.java
rename to core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackCat.java
diff --git a/core-java/src/main/java/com/baeldung/finalkeyword/BlackDog.java b/core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackDog.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/finalkeyword/BlackDog.java
rename to core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackDog.java
diff --git a/core-java/src/main/java/com/baeldung/finalkeyword/Cat.java b/core-java-lang/src/main/java/com/baeldung/finalkeyword/Cat.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/finalkeyword/Cat.java
rename to core-java-lang/src/main/java/com/baeldung/finalkeyword/Cat.java
diff --git a/core-java/src/main/java/com/baeldung/finalkeyword/Dog.java b/core-java-lang/src/main/java/com/baeldung/finalkeyword/Dog.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/finalkeyword/Dog.java
rename to core-java-lang/src/main/java/com/baeldung/finalkeyword/Dog.java
diff --git a/core-java/src/main/java/com/baeldung/generics/Building.java b/core-java-lang/src/main/java/com/baeldung/generics/Building.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/generics/Building.java
rename to core-java-lang/src/main/java/com/baeldung/generics/Building.java
diff --git a/core-java/src/main/java/com/baeldung/generics/Generics.java b/core-java-lang/src/main/java/com/baeldung/generics/Generics.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/generics/Generics.java
rename to core-java-lang/src/main/java/com/baeldung/generics/Generics.java
diff --git a/core-java/src/main/java/com/baeldung/generics/House.java b/core-java-lang/src/main/java/com/baeldung/generics/House.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/generics/House.java
rename to core-java-lang/src/main/java/com/baeldung/generics/House.java
diff --git a/core-java/src/main/java/com/baeldung/hashcode/entities/User.java b/core-java-lang/src/main/java/com/baeldung/hashcode/entities/User.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/hashcode/entities/User.java
rename to core-java-lang/src/main/java/com/baeldung/hashcode/entities/User.java
diff --git a/core-java/src/main/java/com/baeldung/immutableobjects/Currency.java b/core-java-lang/src/main/java/com/baeldung/immutableobjects/Currency.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/immutableobjects/Currency.java
rename to core-java-lang/src/main/java/com/baeldung/immutableobjects/Currency.java
diff --git a/core-java/src/main/java/com/baeldung/immutableobjects/Money.java b/core-java-lang/src/main/java/com/baeldung/immutableobjects/Money.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/immutableobjects/Money.java
rename to core-java-lang/src/main/java/com/baeldung/immutableobjects/Money.java
diff --git a/core-java/src/main/java/com/baeldung/inheritance/ArmoredCar.java b/core-java-lang/src/main/java/com/baeldung/inheritance/ArmoredCar.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritance/ArmoredCar.java
rename to core-java-lang/src/main/java/com/baeldung/inheritance/ArmoredCar.java
diff --git a/core-java/src/main/java/com/baeldung/inheritance/BMW.java b/core-java-lang/src/main/java/com/baeldung/inheritance/BMW.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritance/BMW.java
rename to core-java-lang/src/main/java/com/baeldung/inheritance/BMW.java
diff --git a/core-java/src/main/java/com/baeldung/inheritance/Car.java b/core-java-lang/src/main/java/com/baeldung/inheritance/Car.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritance/Car.java
rename to core-java-lang/src/main/java/com/baeldung/inheritance/Car.java
diff --git a/core-java/src/main/java/com/baeldung/inheritance/Employee.java b/core-java-lang/src/main/java/com/baeldung/inheritance/Employee.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritance/Employee.java
rename to core-java-lang/src/main/java/com/baeldung/inheritance/Employee.java
diff --git a/core-java/src/main/java/com/baeldung/inheritance/Floatable.java b/core-java-lang/src/main/java/com/baeldung/inheritance/Floatable.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritance/Floatable.java
rename to core-java-lang/src/main/java/com/baeldung/inheritance/Floatable.java
diff --git a/core-java/src/main/java/com/baeldung/inheritance/Flyable.java b/core-java-lang/src/main/java/com/baeldung/inheritance/Flyable.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritance/Flyable.java
rename to core-java-lang/src/main/java/com/baeldung/inheritance/Flyable.java
diff --git a/core-java/src/main/java/com/baeldung/inheritance/SpaceCar.java b/core-java-lang/src/main/java/com/baeldung/inheritance/SpaceCar.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritance/SpaceCar.java
rename to core-java-lang/src/main/java/com/baeldung/inheritance/SpaceCar.java
diff --git a/core-java/src/main/java/com/baeldung/inheritance/SpaceTraveller.java b/core-java-lang/src/main/java/com/baeldung/inheritance/SpaceTraveller.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritance/SpaceTraveller.java
rename to core-java-lang/src/main/java/com/baeldung/inheritance/SpaceTraveller.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/application/Application.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/Person.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
diff --git a/core-java/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java b/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
rename to core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
diff --git a/core-java/src/main/java/com/baeldung/initializationguide/User.java b/core-java-lang/src/main/java/com/baeldung/initializationguide/User.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/initializationguide/User.java
rename to core-java-lang/src/main/java/com/baeldung/initializationguide/User.java
diff --git a/core-java/src/main/java/com/baeldung/interfaces/CommaSeparatedCustomers.java b/core-java-lang/src/main/java/com/baeldung/interfaces/CommaSeparatedCustomers.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/interfaces/CommaSeparatedCustomers.java
rename to core-java-lang/src/main/java/com/baeldung/interfaces/CommaSeparatedCustomers.java
diff --git a/core-java/src/main/java/com/baeldung/interfaces/Customer.java b/core-java-lang/src/main/java/com/baeldung/interfaces/Customer.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/interfaces/Customer.java
rename to core-java-lang/src/main/java/com/baeldung/interfaces/Customer.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Animal.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/Animal.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/Animal.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/Animal.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Bird.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/Bird.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/Bird.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/Bird.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/DynamicGreeter.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/DynamicGreeter.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/DynamicGreeter.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/DynamicGreeter.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Eating.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/Eating.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/Eating.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/Eating.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Goat.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/Goat.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/Goat.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/Goat.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Greeter.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/Greeter.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/Greeter.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/Greeter.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/GreetingAnnotation.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/GreetingAnnotation.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/GreetingAnnotation.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/GreetingAnnotation.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Greetings.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/Greetings.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/Greetings.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/Greetings.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Locomotion.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/Locomotion.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/Locomotion.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/Locomotion.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Operations.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/Operations.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/Operations.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/Operations.java
diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Person.java b/core-java-lang/src/main/java/com/baeldung/java/reflection/Person.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/reflection/Person.java
rename to core-java-lang/src/main/java/com/baeldung/java/reflection/Person.java
diff --git a/core-java/src/main/java/com/baeldung/keyword/KeywordDemo.java b/core-java-lang/src/main/java/com/baeldung/keyword/KeywordDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/keyword/KeywordDemo.java
rename to core-java-lang/src/main/java/com/baeldung/keyword/KeywordDemo.java
diff --git a/core-java/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java b/core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
rename to core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
diff --git a/core-java/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java b/core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
rename to core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
diff --git a/core-java/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java b/core-java-lang/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
rename to core-java-lang/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
diff --git a/core-java/src/main/java/com/baeldung/keywords/finalize/FinalizeObject.java b/core-java-lang/src/main/java/com/baeldung/keywords/finalize/FinalizeObject.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/keywords/finalize/FinalizeObject.java
rename to core-java-lang/src/main/java/com/baeldung/keywords/finalize/FinalizeObject.java
diff --git a/core-java/src/main/java/com/baeldung/keywords/finalkeyword/Child.java b/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Child.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/keywords/finalkeyword/Child.java
rename to core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Child.java
diff --git a/core-java/src/main/java/com/baeldung/keywords/finalkeyword/GrandChild.java b/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/GrandChild.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/keywords/finalkeyword/GrandChild.java
rename to core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/GrandChild.java
diff --git a/core-java/src/main/java/com/baeldung/keywords/finalkeyword/Parent.java b/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Parent.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/keywords/finalkeyword/Parent.java
rename to core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Parent.java
diff --git a/core-java/src/main/java/com/baeldung/keywords/finallykeyword/FinallyExample.java b/core-java-lang/src/main/java/com/baeldung/keywords/finallykeyword/FinallyExample.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/keywords/finallykeyword/FinallyExample.java
rename to core-java-lang/src/main/java/com/baeldung/keywords/finallykeyword/FinallyExample.java
diff --git a/core-java/src/main/java/com/baeldung/loops/InfiniteLoops.java b/core-java-lang/src/main/java/com/baeldung/loops/InfiniteLoops.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/loops/InfiniteLoops.java
rename to core-java-lang/src/main/java/com/baeldung/loops/InfiniteLoops.java
diff --git a/core-java/src/main/java/com/baeldung/loops/LoopsInJava.java b/core-java-lang/src/main/java/com/baeldung/loops/LoopsInJava.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/loops/LoopsInJava.java
rename to core-java-lang/src/main/java/com/baeldung/loops/LoopsInJava.java
diff --git a/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java b/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java
rename to core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java
diff --git a/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java b/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java
rename to core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java
diff --git a/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java b/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java
rename to core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java
diff --git a/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java b/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java
rename to core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java
diff --git a/core-java/src/main/java/com/baeldung/noclassdeffounderror/ClassWithInitErrors.java b/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/ClassWithInitErrors.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/noclassdeffounderror/ClassWithInitErrors.java
rename to core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/ClassWithInitErrors.java
diff --git a/core-java/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java b/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java
rename to core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java
diff --git a/core-java/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java b/core-java-lang/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java
rename to core-java-lang/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java
diff --git a/core-java/src/main/java/com/baeldung/parameterpassing/Primitives.java b/core-java-lang/src/main/java/com/baeldung/parameterpassing/Primitives.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/parameterpassing/Primitives.java
rename to core-java-lang/src/main/java/com/baeldung/parameterpassing/Primitives.java
diff --git a/core-java/src/main/java/com/baeldung/polymorphism/FileManager.java b/core-java-lang/src/main/java/com/baeldung/polymorphism/FileManager.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/polymorphism/FileManager.java
rename to core-java-lang/src/main/java/com/baeldung/polymorphism/FileManager.java
diff --git a/core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java b/core-java-lang/src/main/java/com/baeldung/polymorphism/GenericFile.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java
rename to core-java-lang/src/main/java/com/baeldung/polymorphism/GenericFile.java
diff --git a/core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java b/core-java-lang/src/main/java/com/baeldung/polymorphism/ImageFile.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java
rename to core-java-lang/src/main/java/com/baeldung/polymorphism/ImageFile.java
diff --git a/core-java/src/main/java/com/baeldung/polymorphism/TextFile.java b/core-java-lang/src/main/java/com/baeldung/polymorphism/TextFile.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/polymorphism/TextFile.java
rename to core-java-lang/src/main/java/com/baeldung/polymorphism/TextFile.java
diff --git a/core-java/src/main/java/com/baeldung/recursion/BinaryNode.java b/core-java-lang/src/main/java/com/baeldung/recursion/BinaryNode.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/recursion/BinaryNode.java
rename to core-java-lang/src/main/java/com/baeldung/recursion/BinaryNode.java
diff --git a/core-java/src/main/java/com/baeldung/recursion/RecursionExample.java b/core-java-lang/src/main/java/com/baeldung/recursion/RecursionExample.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/recursion/RecursionExample.java
rename to core-java-lang/src/main/java/com/baeldung/recursion/RecursionExample.java
diff --git a/core-java/src/main/java/com/baeldung/scope/method/BaseMethodClass.java b/core-java-lang/src/main/java/com/baeldung/scope/method/BaseMethodClass.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/scope/method/BaseMethodClass.java
rename to core-java-lang/src/main/java/com/baeldung/scope/method/BaseMethodClass.java
diff --git a/core-java/src/main/java/com/baeldung/scope/method/ChildMethodClass.java b/core-java-lang/src/main/java/com/baeldung/scope/method/ChildMethodClass.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/scope/method/ChildMethodClass.java
rename to core-java-lang/src/main/java/com/baeldung/scope/method/ChildMethodClass.java
diff --git a/core-java/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java b/core-java-lang/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java
rename to core-java-lang/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java
diff --git a/core-java/src/main/java/com/baeldung/scope/variable/ChildVariable.java b/core-java-lang/src/main/java/com/baeldung/scope/variable/ChildVariable.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/scope/variable/ChildVariable.java
rename to core-java-lang/src/main/java/com/baeldung/scope/variable/ChildVariable.java
diff --git a/core-java/src/main/java/com/baeldung/scope/variable/HideVariable.java b/core-java-lang/src/main/java/com/baeldung/scope/variable/HideVariable.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/scope/variable/HideVariable.java
rename to core-java-lang/src/main/java/com/baeldung/scope/variable/HideVariable.java
diff --git a/core-java/src/main/java/com/baeldung/scope/variable/ParentVariable.java b/core-java-lang/src/main/java/com/baeldung/scope/variable/ParentVariable.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/scope/variable/ParentVariable.java
rename to core-java-lang/src/main/java/com/baeldung/scope/variable/ParentVariable.java
diff --git a/core-java/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java b/core-java-lang/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java
rename to core-java-lang/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java
diff --git a/core-java/src/main/java/com/baeldung/sneakythrows/SneakyRunnable.java b/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyRunnable.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/sneakythrows/SneakyRunnable.java
rename to core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyRunnable.java
diff --git a/core-java/src/main/java/com/baeldung/sneakythrows/SneakyThrows.java b/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyThrows.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/sneakythrows/SneakyThrows.java
rename to core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyThrows.java
diff --git a/core-java/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java b/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java
rename to core-java-lang/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java
diff --git a/core-java/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java b/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java
rename to core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java
diff --git a/core-java/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java b/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java
rename to core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java
diff --git a/core-java/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java b/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java
rename to core-java-lang/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java
diff --git a/core-java/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java b/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java
rename to core-java-lang/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java
diff --git a/core-java/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java b/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java
rename to core-java-lang/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java
diff --git a/core-java/src/main/java/com/baeldung/staticdemo/Car.java b/core-java-lang/src/main/java/com/baeldung/staticdemo/Car.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/staticdemo/Car.java
rename to core-java-lang/src/main/java/com/baeldung/staticdemo/Car.java
diff --git a/core-java/src/main/java/com/baeldung/staticdemo/Singleton.java b/core-java-lang/src/main/java/com/baeldung/staticdemo/Singleton.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/staticdemo/Singleton.java
rename to core-java-lang/src/main/java/com/baeldung/staticdemo/Singleton.java
diff --git a/core-java/src/main/java/com/baeldung/staticdemo/StaticBlock.java b/core-java-lang/src/main/java/com/baeldung/staticdemo/StaticBlock.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/staticdemo/StaticBlock.java
rename to core-java-lang/src/main/java/com/baeldung/staticdemo/StaticBlock.java
diff --git a/core-java/src/main/java/com/baeldung/switchstatement/SwitchStatement.java b/core-java-lang/src/main/java/com/baeldung/switchstatement/SwitchStatement.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/switchstatement/SwitchStatement.java
rename to core-java-lang/src/main/java/com/baeldung/switchstatement/SwitchStatement.java
diff --git a/core-java/src/main/java/com/baeldung/synthetic/BridgeMethodDemo.java b/core-java-lang/src/main/java/com/baeldung/synthetic/BridgeMethodDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/synthetic/BridgeMethodDemo.java
rename to core-java-lang/src/main/java/com/baeldung/synthetic/BridgeMethodDemo.java
diff --git a/core-java/src/main/java/com/baeldung/synthetic/SyntheticConstructorDemo.java b/core-java-lang/src/main/java/com/baeldung/synthetic/SyntheticConstructorDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/synthetic/SyntheticConstructorDemo.java
rename to core-java-lang/src/main/java/com/baeldung/synthetic/SyntheticConstructorDemo.java
diff --git a/core-java/src/main/java/com/baeldung/synthetic/SyntheticFieldDemo.java b/core-java-lang/src/main/java/com/baeldung/synthetic/SyntheticFieldDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/synthetic/SyntheticFieldDemo.java
rename to core-java-lang/src/main/java/com/baeldung/synthetic/SyntheticFieldDemo.java
diff --git a/core-java/src/main/java/com/baeldung/synthetic/SyntheticMethodDemo.java b/core-java-lang/src/main/java/com/baeldung/synthetic/SyntheticMethodDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/synthetic/SyntheticMethodDemo.java
rename to core-java-lang/src/main/java/com/baeldung/synthetic/SyntheticMethodDemo.java
diff --git a/core-java/src/main/java/com/baeldung/system/ChatWindow.java b/core-java-lang/src/main/java/com/baeldung/system/ChatWindow.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/system/ChatWindow.java
rename to core-java-lang/src/main/java/com/baeldung/system/ChatWindow.java
diff --git a/core-java/src/main/java/com/baeldung/system/DateTimeService.java b/core-java-lang/src/main/java/com/baeldung/system/DateTimeService.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/system/DateTimeService.java
rename to core-java-lang/src/main/java/com/baeldung/system/DateTimeService.java
diff --git a/core-java/src/main/java/com/baeldung/system/EnvironmentVariables.java b/core-java-lang/src/main/java/com/baeldung/system/EnvironmentVariables.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/system/EnvironmentVariables.java
rename to core-java-lang/src/main/java/com/baeldung/system/EnvironmentVariables.java
diff --git a/core-java/src/main/java/com/baeldung/system/SystemErrDemo.java b/core-java-lang/src/main/java/com/baeldung/system/SystemErrDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/system/SystemErrDemo.java
rename to core-java-lang/src/main/java/com/baeldung/system/SystemErrDemo.java
diff --git a/core-java/src/main/java/com/baeldung/system/SystemExitDemo.java b/core-java-lang/src/main/java/com/baeldung/system/SystemExitDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/system/SystemExitDemo.java
rename to core-java-lang/src/main/java/com/baeldung/system/SystemExitDemo.java
diff --git a/core-java/src/main/java/com/baeldung/system/SystemOutDemo.java b/core-java-lang/src/main/java/com/baeldung/system/SystemOutDemo.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/system/SystemOutDemo.java
rename to core-java-lang/src/main/java/com/baeldung/system/SystemOutDemo.java
diff --git a/core-java/src/main/java/com/baeldung/system/UserCredentials.java b/core-java-lang/src/main/java/com/baeldung/system/UserCredentials.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/system/UserCredentials.java
rename to core-java-lang/src/main/java/com/baeldung/system/UserCredentials.java
diff --git a/core-java/src/main/java/com/baeldung/throwsexception/DataAccessException.java b/core-java-lang/src/main/java/com/baeldung/throwsexception/DataAccessException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/throwsexception/DataAccessException.java
rename to core-java-lang/src/main/java/com/baeldung/throwsexception/DataAccessException.java
diff --git a/core-java/src/main/java/com/baeldung/throwsexception/Main.java b/core-java-lang/src/main/java/com/baeldung/throwsexception/Main.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/throwsexception/Main.java
rename to core-java-lang/src/main/java/com/baeldung/throwsexception/Main.java
diff --git a/core-java/src/main/java/com/baeldung/throwsexception/PersonRepository.java b/core-java-lang/src/main/java/com/baeldung/throwsexception/PersonRepository.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/throwsexception/PersonRepository.java
rename to core-java-lang/src/main/java/com/baeldung/throwsexception/PersonRepository.java
diff --git a/core-java/src/main/java/com/baeldung/throwsexception/SimpleService.java b/core-java-lang/src/main/java/com/baeldung/throwsexception/SimpleService.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/throwsexception/SimpleService.java
rename to core-java-lang/src/main/java/com/baeldung/throwsexception/SimpleService.java
diff --git a/core-java/src/main/java/com/baeldung/throwsexception/TryCatch.java b/core-java-lang/src/main/java/com/baeldung/throwsexception/TryCatch.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/throwsexception/TryCatch.java
rename to core-java-lang/src/main/java/com/baeldung/throwsexception/TryCatch.java
diff --git a/core-java/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java b/core-java-lang/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java
rename to core-java-lang/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java
diff --git a/core-java/src/main/java/com/baeldung/typeerasure/BoundStack.java b/core-java-lang/src/main/java/com/baeldung/typeerasure/BoundStack.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/typeerasure/BoundStack.java
rename to core-java-lang/src/main/java/com/baeldung/typeerasure/BoundStack.java
diff --git a/core-java/src/main/java/com/baeldung/typeerasure/IntegerStack.java b/core-java-lang/src/main/java/com/baeldung/typeerasure/IntegerStack.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/typeerasure/IntegerStack.java
rename to core-java-lang/src/main/java/com/baeldung/typeerasure/IntegerStack.java
diff --git a/core-java/src/main/java/com/baeldung/typeerasure/Stack.java b/core-java-lang/src/main/java/com/baeldung/typeerasure/Stack.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/typeerasure/Stack.java
rename to core-java-lang/src/main/java/com/baeldung/typeerasure/Stack.java
diff --git a/core-java/src/main/resources/file.txt b/core-java-lang/src/main/resources/file.txt
similarity index 100%
rename from core-java/src/main/resources/file.txt
rename to core-java-lang/src/main/resources/file.txt
diff --git a/core-java/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java b/core-java-lang/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/binding/AnimalUnitTest.java b/core-java-lang/src/test/java/com/baeldung/binding/AnimalUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/binding/AnimalUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/binding/AnimalUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/binding/CatUnitTest.java b/core-java-lang/src/test/java/com/baeldung/binding/CatUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/binding/CatUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/binding/CatUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java b/core-java-lang/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/casting/CastingUnitTest.java b/core-java-lang/src/test/java/com/baeldung/casting/CastingUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/casting/CastingUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/casting/CastingUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/className/RetrievingClassNameUnitTest.java b/core-java-lang/src/test/java/com/baeldung/className/RetrievingClassNameUnitTest.java
new file mode 100644
index 0000000000..f9dbf91d2c
--- /dev/null
+++ b/core-java-lang/src/test/java/com/baeldung/className/RetrievingClassNameUnitTest.java
@@ -0,0 +1,156 @@
+package com.baeldung.className;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+public class RetrievingClassNameUnitTest {
+
+ // Retrieving Simple Name
+ @Test
+ public void givenRetrievingClassName_whenGetSimpleName_thenRetrievingClassName() {
+ assertEquals("RetrievingClassName", RetrievingClassName.class.getSimpleName());
+ }
+
+ @Test
+ public void givenPrimitiveInt_whenGetSimpleName_thenInt() {
+ assertEquals("int", int.class.getSimpleName());
+ }
+
+ @Test
+ public void givenRetrievingClassNameArray_whenGetSimpleName_thenRetrievingClassNameWithBrackets() {
+ assertEquals("RetrievingClassName[]", RetrievingClassName[].class.getSimpleName());
+ assertEquals("RetrievingClassName[][]", RetrievingClassName[][].class.getSimpleName());
+ }
+
+ @Test
+ public void givenAnonymousClass_whenGetSimpleName_thenEmptyString() {
+ assertEquals("", new RetrievingClassName() {}.getClass().getSimpleName());
+ }
+
+ // Retrieving Other Names
+ // - Primitive Types
+ @Test
+ public void givenPrimitiveInt_whenGetName_thenInt() {
+ assertEquals("int", int.class.getName());
+ }
+
+ @Test
+ public void givenPrimitiveInt_whenGetTypeName_thenInt() {
+ assertEquals("int", int.class.getTypeName());
+ }
+
+ @Test
+ public void givenPrimitiveInt_whenGetCanonicalName_thenInt() {
+ assertEquals("int", int.class.getCanonicalName());
+ }
+
+ // - Object Types
+ @Test
+ public void givenRetrievingClassName_whenGetName_thenCanonicalName() {
+ assertEquals("com.baeldung.className.RetrievingClassName", RetrievingClassName.class.getName());
+ }
+
+ @Test
+ public void givenRetrievingClassName_whenGetTypeName_thenCanonicalName() {
+ assertEquals("com.baeldung.className.RetrievingClassName", RetrievingClassName.class.getTypeName());
+ }
+
+ @Test
+ public void givenRetrievingClassName_whenGetCanonicalName_thenCanonicalName() {
+ assertEquals("com.baeldung.className.RetrievingClassName", RetrievingClassName.class.getCanonicalName());
+ }
+
+ // - Inner Classes
+ @Test
+ public void givenRetrievingClassNameInnerClass_whenGetName_thenCanonicalNameWithDollarSeparator() {
+ assertEquals("com.baeldung.className.RetrievingClassName$InnerClass", RetrievingClassName.InnerClass.class.getName());
+ }
+
+ @Test
+ public void givenRetrievingClassNameInnerClass_whenGetTypeName_thenCanonicalNameWithDollarSeparator() {
+ assertEquals("com.baeldung.className.RetrievingClassName$InnerClass", RetrievingClassName.InnerClass.class.getTypeName());
+ }
+
+ @Test
+ public void givenRetrievingClassNameInnerClass_whenGetCanonicalName_thenCanonicalName() {
+ assertEquals("com.baeldung.className.RetrievingClassName.InnerClass", RetrievingClassName.InnerClass.class.getCanonicalName());
+ }
+
+ // - Anonymous Classes
+ @Test
+ public void givenAnonymousClass_whenGetName_thenCallingClassCanonicalNameWithDollarSeparatorAndCountNumber() {
+ // These are the second and third appearences of an anonymous class in RetrievingClassNameUnitTest, hence $2 and $3 expectations
+ assertEquals("com.baeldung.className.RetrievingClassNameUnitTest$2", new RetrievingClassName() {}.getClass().getName());
+ assertEquals("com.baeldung.className.RetrievingClassNameUnitTest$3", new RetrievingClassName() {}.getClass().getName());
+ }
+
+ @Test
+ public void givenAnonymousClass_whenGetTypeName_thenCallingClassCanonicalNameWithDollarSeparatorAndCountNumber() {
+ // These are the fourth and fifth appearences of an anonymous class in RetrievingClassNameUnitTest, hence $4 and $5 expectations
+ assertEquals("com.baeldung.className.RetrievingClassNameUnitTest$4", new RetrievingClassName() {}.getClass().getTypeName());
+ assertEquals("com.baeldung.className.RetrievingClassNameUnitTest$5", new RetrievingClassName() {}.getClass().getTypeName());
+ }
+
+ @Test
+ public void givenAnonymousClass_whenGetCanonicalName_thenNull() {
+ assertNull(new RetrievingClassName() {}.getClass().getCanonicalName());
+ }
+
+ // - Arrays
+ @Test
+ public void givenPrimitiveIntArray_whenGetName_thenOpeningBracketsAndPrimitiveIntLetter() {
+ assertEquals("[I", int[].class.getName());
+ assertEquals("[[I", int[][].class.getName());
+ }
+
+ @Test
+ public void givenRetrievingClassNameArray_whenGetName_thenOpeningBracketsLetterLAndRetrievingClassNameGetName() {
+ assertEquals("[Lcom.baeldung.className.RetrievingClassName;", RetrievingClassName[].class.getName());
+ assertEquals("[[Lcom.baeldung.className.RetrievingClassName;", RetrievingClassName[][].class.getName());
+ }
+
+ @Test
+ public void givenRetrievingClassNameInnerClassArray_whenGetName_thenOpeningBracketsLetterLAndRetrievingClassNameInnerClassGetName() {
+ assertEquals("[Lcom.baeldung.className.RetrievingClassName$InnerClass;", RetrievingClassName.InnerClass[].class.getName());
+ assertEquals("[[Lcom.baeldung.className.RetrievingClassName$InnerClass;", RetrievingClassName.InnerClass[][].class.getName());
+ }
+
+ @Test
+ public void givenPrimitiveIntArray_whenGetTypeName_thenPrimitiveIntGetTypeNameWithBrackets() {
+ assertEquals("int[]", int[].class.getTypeName());
+ assertEquals("int[][]", int[][].class.getTypeName());
+ }
+
+ @Test
+ public void givenRetrievingClassNameArray_whenGetTypeName_thenRetrievingClassNameGetTypeNameWithBrackets() {
+ assertEquals("com.baeldung.className.RetrievingClassName[]", RetrievingClassName[].class.getTypeName());
+ assertEquals("com.baeldung.className.RetrievingClassName[][]", RetrievingClassName[][].class.getTypeName());
+ }
+
+ @Test
+ public void givenRetrievingClassNameInnerClassArray_whenGetTypeName_thenRetrievingClassNameInnerClassGetTypeNameWithBrackets() {
+ assertEquals("com.baeldung.className.RetrievingClassName$InnerClass[]", RetrievingClassName.InnerClass[].class.getTypeName());
+ assertEquals("com.baeldung.className.RetrievingClassName$InnerClass[][]", RetrievingClassName.InnerClass[][].class.getTypeName());
+ }
+
+ @Test
+ public void givenPrimitiveIntArray_whenGetCanonicalName_thenPrimitiveIntGetCanonicalNameWithBrackets() {
+ assertEquals("int[]", int[].class.getCanonicalName());
+ assertEquals("int[][]", int[][].class.getCanonicalName());
+ }
+
+ @Test
+ public void givenRetrievingClassNameArray_whenGetCanonicalName_thenRetrievingClassNameGetCanonicalNameWithBrackets() {
+ assertEquals("com.baeldung.className.RetrievingClassName[]", RetrievingClassName[].class.getCanonicalName());
+ assertEquals("com.baeldung.className.RetrievingClassName[][]", RetrievingClassName[][].class.getCanonicalName());
+ }
+
+ @Test
+ public void givenRetrievingClassNameInnerClassArray_whenGetCanonicalName_thenRetrievingClassNameInnerClassGetCanonicalNameWithBrackets() {
+ assertEquals("com.baeldung.className.RetrievingClassName.InnerClass[]", RetrievingClassName.InnerClass[].class.getCanonicalName());
+ assertEquals("com.baeldung.className.RetrievingClassName.InnerClass[][]", RetrievingClassName.InnerClass[][].class.getCanonicalName());
+ }
+
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionUnitTest.java b/core-java-lang/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/comparable/ComparableUnitTest.java b/core-java-lang/src/test/java/com/baeldung/comparable/ComparableUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/comparable/ComparableUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/comparable/ComparableUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/comparator/ComparatorUnitTest.java b/core-java-lang/src/test/java/com/baeldung/comparator/ComparatorUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/comparator/ComparatorUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/comparator/ComparatorUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/comparator/Java8ComparatorUnitTest.java b/core-java-lang/src/test/java/com/baeldung/comparator/Java8ComparatorUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/comparator/Java8ComparatorUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/comparator/Java8ComparatorUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsUnitTest.java b/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsUnitTest.java
new file mode 100644
index 0000000000..532776edd4
--- /dev/null
+++ b/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsUnitTest.java
@@ -0,0 +1,111 @@
+package com.baeldung.compoundoperators;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class CompoundOperatorsUnitTest {
+
+ @Test
+ public void whenAssignmentOperatorIsUsed_thenValueIsAssigned() {
+ int x = 5;
+
+ assertEquals(5, x);
+ }
+
+ @Test
+ public void whenCompoundAssignmentUsed_thenSameAsSimpleAssignment() {
+ int a = 3, b = 3, c = -2;
+ a = a * c; // Simple assignment operator
+ b *= c; // Compound assignment operator
+
+ assertEquals(a, b);
+ }
+
+ @Test
+ public void whenAssignmentOperatorIsUsed_thenValueIsReturned() {
+ long x = 1;
+ long y = (x+=2);
+
+ assertEquals(3, y);
+ assertEquals(y, x);
+ }
+
+ @Test
+ public void whenCompoundOperatorsAreUsed_thenOperationsArePerformedAndAssigned() {
+ //Simple assignment
+ int x = 5; //x is 5
+
+ //Incrementation
+ x += 5; //x is 10
+ assertEquals(10, x);
+
+ //Decrementation
+ x -= 2; //x is 8
+ assertEquals(8, x);
+
+ //Multiplication
+ x *= 2; //x is 16
+ assertEquals(16, x);
+
+ //Division
+ x /= 4; //x is 4
+ assertEquals(4, x);
+
+ //Modulus
+ x %= 3; //x is 1
+ assertEquals(1, x);
+
+
+ //Binary AND
+ x &= 4; //x is 0
+ assertEquals(0, x);
+
+ //Binary exclusive OR
+ x ^= 4; //x is 4
+ assertEquals(4, x);
+
+ //Binary inclusive OR
+ x |= 8; //x is 12
+ assertEquals(12, x);
+
+
+ //Binary Left Shift
+ x <<= 2; //x is 48
+ assertEquals(48, x);
+
+ //Binary Right Shift
+ x >>= 2; //x is 12
+ assertEquals(12, x);
+
+ //Shift right zero fill
+ x >>>= 1; //x is 6
+ assertEquals(6, x);
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void whenArrayIsNull_thenThrowNullException() {
+ int[] numbers = null;
+
+ //Trying Incrementation
+ numbers[2] += 5;
+ }
+
+ @Test(expected = ArrayIndexOutOfBoundsException.class)
+ public void whenArrayIndexNotCorrect_thenThrowArrayIndexException() {
+ int[] numbers = {0, 1};
+
+ //Trying Incrementation
+ numbers[2] += 5;
+ }
+
+ @Test
+ public void whenArrayIndexIsCorrect_thenPerformOperation() {
+ int[] numbers = {0, 1};
+
+ //Incrementation
+ numbers[1] += 5;
+ assertEquals(6, numbers[1]);
+ }
+
+}
diff --git a/core-java-lang/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java b/core-java-lang/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
new file mode 100644
index 0000000000..2cd8832fbf
--- /dev/null
+++ b/core-java-lang/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
@@ -0,0 +1,53 @@
+package com.baeldung.constructors;
+
+import com.baeldung.constructors.*;
+
+import java.util.logging.Logger;
+import java.time.LocalDateTime;
+import java.time.Month;
+
+import org.junit.Test;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+public class ConstructorUnitTest {
+ final static Logger LOGGER = Logger.getLogger(ConstructorUnitTest.class.getName());
+
+ @Test
+ public void givenNoExplicitContructor_whenUsed_thenFails() {
+ BankAccount account = new BankAccount();
+ assertThatThrownBy(() -> { account.toString(); }).isInstanceOf(Exception.class);
+ }
+
+ @Test
+ public void givenNoArgumentConstructor_whenUsed_thenSucceeds() {
+ BankAccountEmptyConstructor account = new BankAccountEmptyConstructor();
+ assertThatCode(() -> {
+ account.toString();
+ }).doesNotThrowAnyException();
+ }
+
+ @Test
+ public void givenParameterisedConstructor_whenUsed_thenSucceeds() {
+ LocalDateTime opened = LocalDateTime.of(2018, Month.JUNE, 29, 06, 30, 00);
+ BankAccountParameterizedConstructor account =
+ new BankAccountParameterizedConstructor("Tom", opened, 1000.0f);
+
+ assertThatCode(() -> {
+ account.toString();
+ }).doesNotThrowAnyException();
+ }
+
+ @Test
+ public void givenCopyContructor_whenUser_thenMaintainsLogic() {
+ LocalDateTime opened = LocalDateTime.of(2018, Month.JUNE, 29, 06, 30, 00);
+ BankAccountCopyConstructor account = new BankAccountCopyConstructor("Tim", opened, 1000.0f);
+ BankAccountCopyConstructor newAccount = new BankAccountCopyConstructor(account);
+
+ assertThat(account.getName()).isEqualTo(newAccount.getName());
+ assertThat(account.getOpened()).isNotEqualTo(newAccount.getOpened());
+
+ assertThat(newAccount.getBalance()).isEqualTo(0.0f);
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java b/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java b/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java b/core-java-lang/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
similarity index 98%
rename from core-java/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
index 196b69fbf7..d6b1cd90b9 100644
--- a/core-java/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
+++ b/core-java-lang/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
@@ -4,7 +4,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import java.io.IOException;
-import org.apache.commons.lang.SerializationUtils;
+import org.apache.commons.lang3.SerializationUtils;
import org.junit.Ignore;
import org.junit.Test;
diff --git a/core-java/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java b/core-java-lang/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java b/core-java-lang/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java
rename to core-java-lang/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java
diff --git a/core-java/src/test/java/com/baeldung/enums/PizzaUnitTest.java b/core-java-lang/src/test/java/com/baeldung/enums/PizzaUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/enums/PizzaUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/enums/PizzaUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java b/core-java-lang/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
new file mode 100644
index 0000000000..60584fdb53
--- /dev/null
+++ b/core-java-lang/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.equalshashcode;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+import org.junit.Test;
+
+public class MoneyUnitTest {
+
+ @Test
+ public void givenMoneyInstancesWithSameAmountAndCurrency_whenEquals_thenReturnsTrue() {
+ Money income = new Money(55, "USD");
+ Money expenses = new Money(55, "USD");
+
+ assertTrue(income.equals(expenses));
+ }
+
+ @Test
+ public void givenMoneyAndVoucherInstances_whenEquals_thenReturnValuesArentSymmetric() {
+ Money cash = new Money(42, "USD");
+ WrongVoucher voucher = new WrongVoucher(42, "USD", "Amazon");
+
+ assertFalse(voucher.equals(cash));
+ assertTrue(cash.equals(voucher));
+ }
+
+}
diff --git a/core-java-lang/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java b/core-java-lang/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
new file mode 100644
index 0000000000..a2de408796
--- /dev/null
+++ b/core-java-lang/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
@@ -0,0 +1,46 @@
+package com.baeldung.equalshashcode;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Test;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+
+public class TeamUnitTest {
+
+ @Test
+ public void givenMapKeyWithHashCode_whenSearched_thenReturnsCorrectValue() {
+ Map leaders = new HashMap<>();
+ leaders.put(new Team("New York", "development"), "Anne");
+ leaders.put(new Team("Boston", "development"), "Brian");
+ leaders.put(new Team("Boston", "marketing"), "Charlie");
+
+ Team myTeam = new Team("New York", "development");
+ String myTeamleader = leaders.get(myTeam);
+
+ assertEquals("Anne", myTeamleader);
+ }
+
+ @Test
+ public void givenMapKeyWithoutHashCode_whenSearched_thenReturnsWrongValue() {
+ Map leaders = new HashMap<>();
+ leaders.put(new WrongTeam("New York", "development"), "Anne");
+ leaders.put(new WrongTeam("Boston", "development"), "Brian");
+ leaders.put(new WrongTeam("Boston", "marketing"), "Charlie");
+
+ WrongTeam myTeam = new WrongTeam("New York", "development");
+ String myTeamleader = leaders.get(myTeam);
+
+ assertFalse("Anne".equals(myTeamleader));
+ }
+
+ @Test
+ public void equalsContract() {
+ EqualsVerifier.forClass(Team.class).verify();
+ }
+
+}
diff --git a/core-java/src/test/java/org/baeldung/equalshashcode/entities/ComplexClassUnitTest.java b/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
similarity index 95%
rename from core-java/src/test/java/org/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
index 680a6d57b5..0cb4ace0ab 100644
--- a/core-java/src/test/java/org/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
+++ b/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.equalshashcode.entities;
+package com.baeldung.equalshashcode.entities;
import java.util.ArrayList;
import java.util.HashSet;
diff --git a/core-java/src/test/java/org/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java b/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
similarity index 85%
rename from core-java/src/test/java/org/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
index f4e9f2b99f..457d7a2b5e 100644
--- a/core-java/src/test/java/org/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
+++ b/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
@@ -1,10 +1,8 @@
-package org.baeldung.equalshashcode.entities;
+package com.baeldung.equalshashcode.entities;
import org.junit.Assert;
import org.junit.Test;
-import com.baeldung.equalshashcode.entities.PrimitiveClass;
-
public class PrimitiveClassUnitTest {
@Test
diff --git a/core-java/src/test/java/org/baeldung/equalshashcode/entities/SquareClassUnitTest.java b/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
similarity index 93%
rename from core-java/src/test/java/org/baeldung/equalshashcode/entities/SquareClassUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
index 5c860bd62d..a25e8bd486 100644
--- a/core-java/src/test/java/org/baeldung/equalshashcode/entities/SquareClassUnitTest.java
+++ b/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.equalshashcode.entities;
+package com.baeldung.equalshashcode.entities;
import java.awt.Color;
diff --git a/core-java/src/test/java/com/baeldung/exceptionhandling/ExceptionsUnitTest.java b/core-java-lang/src/test/java/com/baeldung/exceptionhandling/ExceptionsUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/exceptionhandling/ExceptionsUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/exceptionhandling/ExceptionsUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/finalize/FinalizeUnitTest.java b/core-java-lang/src/test/java/com/baeldung/finalize/FinalizeUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/finalize/FinalizeUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/finalize/FinalizeUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java b/core-java-lang/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/generics/GenericsUnitTest.java b/core-java-lang/src/test/java/com/baeldung/generics/GenericsUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/generics/GenericsUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/generics/GenericsUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java b/core-java-lang/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java b/core-java-lang/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java b/core-java-lang/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/inheritance/AppUnitTest.java b/core-java-lang/src/test/java/com/baeldung/inheritance/AppUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/inheritance/AppUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/inheritance/AppUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java b/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java b/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java b/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java b/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java b/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/initializationguide/UserUnitTest.java b/core-java-lang/src/test/java/com/baeldung/initializationguide/UserUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/initializationguide/UserUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/initializationguide/UserUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/interfaces/InnerInterfaceUnitTest.java b/core-java-lang/src/test/java/com/baeldung/interfaces/InnerInterfaceUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/interfaces/InnerInterfaceUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/interfaces/InnerInterfaceUnitTest.java
diff --git a/core-java/src/test/java/org/baeldung/java/diamond/Car.java b/core-java-lang/src/test/java/com/baeldung/java/diamond/Car.java
similarity index 64%
rename from core-java/src/test/java/org/baeldung/java/diamond/Car.java
rename to core-java-lang/src/test/java/com/baeldung/java/diamond/Car.java
index 9f923e0f3b..a680c4e670 100644
--- a/core-java/src/test/java/org/baeldung/java/diamond/Car.java
+++ b/core-java-lang/src/test/java/com/baeldung/java/diamond/Car.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.diamond;
+package com.baeldung.java.diamond;
public class Car implements Vehicle {
diff --git a/core-java/src/test/java/org/baeldung/java/diamond/DiamondOperatorUnitTest.java b/core-java-lang/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java
similarity index 88%
rename from core-java/src/test/java/org/baeldung/java/diamond/DiamondOperatorUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java
index f6c7f7162f..ee5f639926 100644
--- a/core-java/src/test/java/org/baeldung/java/diamond/DiamondOperatorUnitTest.java
+++ b/core-java-lang/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.diamond;
+package com.baeldung.java.diamond;
import static org.junit.Assert.assertNotNull;
diff --git a/core-java/src/test/java/org/baeldung/java/diamond/Diesel.java b/core-java-lang/src/test/java/com/baeldung/java/diamond/Diesel.java
similarity index 78%
rename from core-java/src/test/java/org/baeldung/java/diamond/Diesel.java
rename to core-java-lang/src/test/java/com/baeldung/java/diamond/Diesel.java
index dc4256cdae..90eb7d9340 100644
--- a/core-java/src/test/java/org/baeldung/java/diamond/Diesel.java
+++ b/core-java-lang/src/test/java/com/baeldung/java/diamond/Diesel.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.diamond;
+package com.baeldung.java.diamond;
public class Diesel implements Engine {
diff --git a/core-java/src/test/java/org/baeldung/java/diamond/Engine.java b/core-java-lang/src/test/java/com/baeldung/java/diamond/Engine.java
similarity index 56%
rename from core-java/src/test/java/org/baeldung/java/diamond/Engine.java
rename to core-java-lang/src/test/java/com/baeldung/java/diamond/Engine.java
index c18a8f64b5..746baf3254 100644
--- a/core-java/src/test/java/org/baeldung/java/diamond/Engine.java
+++ b/core-java-lang/src/test/java/com/baeldung/java/diamond/Engine.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.diamond;
+package com.baeldung.java.diamond;
public interface Engine {
diff --git a/core-java/src/test/java/org/baeldung/java/diamond/Vehicle.java b/core-java-lang/src/test/java/com/baeldung/java/diamond/Vehicle.java
similarity index 58%
rename from core-java/src/test/java/org/baeldung/java/diamond/Vehicle.java
rename to core-java-lang/src/test/java/com/baeldung/java/diamond/Vehicle.java
index f61cf59620..8395cdd970 100644
--- a/core-java/src/test/java/org/baeldung/java/diamond/Vehicle.java
+++ b/core-java-lang/src/test/java/com/baeldung/java/diamond/Vehicle.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.diamond;
+package com.baeldung.java.diamond;
public interface Vehicle {
diff --git a/core-java/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java b/core-java-lang/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java
diff --git a/core-java/src/main/java/com/baeldung/java/enumiteration/DaysOfWeekEnum.java b/core-java-lang/src/test/java/com/baeldung/java/enumiteration/DaysOfWeekEnum.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/enumiteration/DaysOfWeekEnum.java
rename to core-java-lang/src/test/java/com/baeldung/java/enumiteration/DaysOfWeekEnum.java
diff --git a/core-java/src/main/java/com/baeldung/java/enumiteration/EnumIterationExamples.java b/core-java-lang/src/test/java/com/baeldung/java/enumiteration/EnumIterationExamples.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java/enumiteration/EnumIterationExamples.java
rename to core-java-lang/src/test/java/com/baeldung/java/enumiteration/EnumIterationExamples.java
diff --git a/core-java/src/test/java/com/baeldung/java/reflection/OperationsUnitTest.java b/core-java-lang/src/test/java/com/baeldung/java/reflection/OperationsUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java/reflection/OperationsUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/java/reflection/OperationsUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/java/reflection/ReflectionUnitTest.java b/core-java-lang/src/test/java/com/baeldung/java/reflection/ReflectionUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java/reflection/ReflectionUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/java/reflection/ReflectionUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/loops/WhenUsingLoops.java b/core-java-lang/src/test/java/com/baeldung/loops/WhenUsingLoops.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/loops/WhenUsingLoops.java
rename to core-java-lang/src/test/java/com/baeldung/loops/WhenUsingLoops.java
diff --git a/core-java/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java b/core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java b/core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/modulo/ModuloUnitTest.java b/core-java-lang/src/test/java/com/baeldung/modulo/ModuloUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/modulo/ModuloUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/modulo/ModuloUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/nestedclass/AnonymousInner.java b/core-java-lang/src/test/java/com/baeldung/nestedclass/AnonymousInner.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/nestedclass/AnonymousInner.java
rename to core-java-lang/src/test/java/com/baeldung/nestedclass/AnonymousInner.java
diff --git a/core-java/src/test/java/com/baeldung/nestedclass/Enclosing.java b/core-java-lang/src/test/java/com/baeldung/nestedclass/Enclosing.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/nestedclass/Enclosing.java
rename to core-java-lang/src/test/java/com/baeldung/nestedclass/Enclosing.java
diff --git a/core-java/src/test/java/com/baeldung/nestedclass/NewEnclosing.java b/core-java-lang/src/test/java/com/baeldung/nestedclass/NewEnclosing.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/nestedclass/NewEnclosing.java
rename to core-java-lang/src/test/java/com/baeldung/nestedclass/NewEnclosing.java
diff --git a/core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java b/core-java-lang/src/test/java/com/baeldung/nestedclass/NewOuter.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java
rename to core-java-lang/src/test/java/com/baeldung/nestedclass/NewOuter.java
diff --git a/core-java/src/test/java/com/baeldung/nestedclass/Outer.java b/core-java-lang/src/test/java/com/baeldung/nestedclass/Outer.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/nestedclass/Outer.java
rename to core-java-lang/src/test/java/com/baeldung/nestedclass/Outer.java
diff --git a/core-java/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java b/core-java-lang/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java b/core-java-lang/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java b/core-java-lang/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java b/core-java-lang/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/PrimitiveConversionsJUnitTest.java b/core-java-lang/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java
similarity index 99%
rename from core-java/src/test/java/com/baeldung/PrimitiveConversionsJUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java
index 69a6c18dfd..cb83f4a5ed 100644
--- a/core-java/src/test/java/com/baeldung/PrimitiveConversionsJUnitTest.java
+++ b/core-java-lang/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung;
+package com.baeldung.primitiveconversion;
import org.junit.Test;
import org.slf4j.Logger;
diff --git a/core-java/src/test/java/com/baeldung/recursion/RecursionExampleUnitTest.java b/core-java-lang/src/test/java/com/baeldung/recursion/RecursionExampleUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/recursion/RecursionExampleUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/recursion/RecursionExampleUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/sneakythrows/SneakyRunnableUnitTest.java b/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyRunnableUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/sneakythrows/SneakyRunnableUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyRunnableUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/sneakythrows/SneakyThrowsUnitTest.java b/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyThrowsUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/sneakythrows/SneakyThrowsUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyThrowsUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/stackoverflowerror/AccountHolderManualTest.java b/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/AccountHolderManualTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/stackoverflowerror/AccountHolderManualTest.java
rename to core-java-lang/src/test/java/com/baeldung/stackoverflowerror/AccountHolderManualTest.java
diff --git a/core-java/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java b/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java
rename to core-java-lang/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java
diff --git a/core-java/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java b/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java
rename to core-java-lang/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java
diff --git a/core-java/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java b/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java
rename to core-java-lang/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java
diff --git a/core-java/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java b/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java
rename to core-java-lang/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java
diff --git a/core-java/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java b/core-java-lang/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java
rename to core-java-lang/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java
diff --git a/core-java/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java b/core-java-lang/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java
rename to core-java-lang/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java
diff --git a/core-java/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java b/core-java-lang/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java
rename to core-java-lang/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java
diff --git a/core-java/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java b/core-java-lang/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/synthetic/SyntheticUnitTest.java b/core-java-lang/src/test/java/com/baeldung/synthetic/SyntheticUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/synthetic/SyntheticUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/synthetic/SyntheticUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java b/core-java-lang/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java b/core-java-lang/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java b/core-java-lang/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/system/SystemNanoUnitTest.java b/core-java-lang/src/test/java/com/baeldung/system/SystemNanoUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/system/SystemNanoUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/system/SystemNanoUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java b/core-java-lang/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java b/core-java-lang/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/throwsexception/SimpleServiceUnitTest.java b/core-java-lang/src/test/java/com/baeldung/throwsexception/SimpleServiceUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/throwsexception/SimpleServiceUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/throwsexception/SimpleServiceUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java b/core-java-lang/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/varargs/FormatterUnitTest.java b/core-java-lang/src/test/java/com/baeldung/varargs/FormatterUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/varargs/FormatterUnitTest.java
rename to core-java-lang/src/test/java/com/baeldung/varargs/FormatterUnitTest.java
diff --git a/core-java/src/test/resources/correctFileNameWithoutProperExtension b/core-java-lang/src/test/resources/correctFileNameWithoutProperExtension
similarity index 100%
rename from core-java/src/test/resources/correctFileNameWithoutProperExtension
rename to core-java-lang/src/test/resources/correctFileNameWithoutProperExtension
diff --git a/core-java-net/.gitignore b/core-java-net/.gitignore
new file mode 100644
index 0000000000..374c8bf907
--- /dev/null
+++ b/core-java-net/.gitignore
@@ -0,0 +1,25 @@
+*.class
+
+0.*
+
+#folders#
+/target
+/neoDb*
+/data
+/src/main/webapp/WEB-INF/classes
+*/META-INF/*
+.resourceCache
+
+# Packaged files #
+*.jar
+*.war
+*.ear
+
+# Files generated by integration tests
+backup-pom.xml
+/bin/
+/temp
+
+#IntelliJ specific
+.idea/
+*.iml
\ No newline at end of file
diff --git a/core-java-net/README.md b/core-java-net/README.md
new file mode 100644
index 0000000000..b7a142ea27
--- /dev/null
+++ b/core-java-net/README.md
@@ -0,0 +1,3 @@
+=========
+
+## Core Java Net
diff --git a/core-java-net/pom.xml b/core-java-net/pom.xml
new file mode 100644
index 0000000000..28d5766a9a
--- /dev/null
+++ b/core-java-net/pom.xml
@@ -0,0 +1,19 @@
+
+ 4.0.0
+ core-java-net
+ 0.1.0-SNAPSHOT
+ jar
+ core-java-net
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+ core-java-net
+
+
diff --git a/core-java-net/src/main/java/com/baeldung/networking/proxies/CommandLineProxyDemo.java b/core-java-net/src/main/java/com/baeldung/networking/proxies/CommandLineProxyDemo.java
new file mode 100644
index 0000000000..bbc8a81c98
--- /dev/null
+++ b/core-java-net/src/main/java/com/baeldung/networking/proxies/CommandLineProxyDemo.java
@@ -0,0 +1,17 @@
+package com.baeldung.networking.proxies;
+
+import java.net.URL;
+import java.net.URLConnection;
+
+public class CommandLineProxyDemo {
+
+ public static final String RESOURCE_URL = "http://www.google.com";
+
+ public static void main(String[] args) throws Exception {
+
+ URL url = new URL(RESOURCE_URL);
+ URLConnection con = url.openConnection();
+ System.out.println(UrlConnectionUtils.contentAsString(con));
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-net/src/main/java/com/baeldung/networking/proxies/DirectProxyDemo.java b/core-java-net/src/main/java/com/baeldung/networking/proxies/DirectProxyDemo.java
new file mode 100644
index 0000000000..07a7880886
--- /dev/null
+++ b/core-java-net/src/main/java/com/baeldung/networking/proxies/DirectProxyDemo.java
@@ -0,0 +1,20 @@
+package com.baeldung.networking.proxies;
+
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.Proxy;
+import java.net.URL;
+
+public class DirectProxyDemo {
+
+ private static final String URL_STRING = "http://www.google.com";
+
+ public static void main(String... args) throws IOException {
+
+ URL weburl = new URL(URL_STRING);
+ HttpURLConnection directConnection
+ = (HttpURLConnection) weburl.openConnection(Proxy.NO_PROXY);
+ System.out.println(UrlConnectionUtils.contentAsString(directConnection));
+ }
+
+}
diff --git a/core-java-net/src/main/java/com/baeldung/networking/proxies/SocksProxyDemo.java b/core-java-net/src/main/java/com/baeldung/networking/proxies/SocksProxyDemo.java
new file mode 100644
index 0000000000..e7ac3c0264
--- /dev/null
+++ b/core-java-net/src/main/java/com/baeldung/networking/proxies/SocksProxyDemo.java
@@ -0,0 +1,32 @@
+package com.baeldung.networking.proxies;
+
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.Socket;
+import java.net.URL;
+
+public class SocksProxyDemo {
+
+ private static final String URL_STRING = "http://www.google.com";
+ private static final String SOCKET_SERVER_HOST = "someserver.baeldung.com";
+ private static final int SOCKET_SERVER_PORT = 1111;
+
+ public static void main(String... args) throws IOException {
+
+ URL weburl = new URL(URL_STRING);
+ Proxy socksProxy
+ = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 1080));
+ HttpURLConnection socksConnection
+ = (HttpURLConnection) weburl.openConnection(socksProxy);
+ System.out.println(UrlConnectionUtils.contentAsString(socksConnection));
+
+ Socket proxySocket = new Socket(socksProxy);
+ InetSocketAddress socketHost
+ = new InetSocketAddress(SOCKET_SERVER_HOST, SOCKET_SERVER_PORT);
+ proxySocket.connect(socketHost);
+ // do stuff with the socket
+ }
+
+}
diff --git a/core-java-net/src/main/java/com/baeldung/networking/proxies/SystemPropertyProxyDemo.java b/core-java-net/src/main/java/com/baeldung/networking/proxies/SystemPropertyProxyDemo.java
new file mode 100644
index 0000000000..1f589eac58
--- /dev/null
+++ b/core-java-net/src/main/java/com/baeldung/networking/proxies/SystemPropertyProxyDemo.java
@@ -0,0 +1,23 @@
+package com.baeldung.networking.proxies;
+
+import java.net.URL;
+import java.net.URLConnection;
+
+public class SystemPropertyProxyDemo {
+
+ public static final String RESOURCE_URL = "http://www.google.com";
+
+ public static void main(String[] args) throws Exception {
+
+ System.setProperty("http.proxyHost", "127.0.0.1");
+ System.setProperty("http.proxyPort", "3128");
+
+ URL url = new URL(RESOURCE_URL);
+ URLConnection con = url.openConnection();
+ System.out.println(UrlConnectionUtils.contentAsString(con));
+
+ System.setProperty("http.proxyHost", null);
+ // proxy will no longer be used for http connections
+ }
+
+}
diff --git a/core-java-net/src/main/java/com/baeldung/networking/proxies/UrlConnectionUtils.java b/core-java-net/src/main/java/com/baeldung/networking/proxies/UrlConnectionUtils.java
new file mode 100644
index 0000000000..aa12824a90
--- /dev/null
+++ b/core-java-net/src/main/java/com/baeldung/networking/proxies/UrlConnectionUtils.java
@@ -0,0 +1,21 @@
+package com.baeldung.networking.proxies;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URLConnection;
+
+class UrlConnectionUtils {
+
+ public static String contentAsString(URLConnection con) throws IOException {
+ StringBuilder builder = new StringBuilder();
+ try (BufferedReader reader
+ = new BufferedReader(new InputStreamReader(con.getInputStream()))){
+ while (reader.ready()) {
+ builder.append(reader.readLine());
+ }
+ }
+ return builder.toString();
+ }
+
+}
diff --git a/core-java-net/src/main/java/com/baeldung/networking/proxies/WebProxyDemo.java b/core-java-net/src/main/java/com/baeldung/networking/proxies/WebProxyDemo.java
new file mode 100644
index 0000000000..41caaf3439
--- /dev/null
+++ b/core-java-net/src/main/java/com/baeldung/networking/proxies/WebProxyDemo.java
@@ -0,0 +1,23 @@
+package com.baeldung.networking.proxies;
+
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.URL;
+
+public class WebProxyDemo {
+
+ private static final String URL_STRING = "http://www.google.com";
+
+ public static void main(String... args) throws IOException {
+
+ URL weburl = new URL(URL_STRING);
+ Proxy webProxy
+ = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 3128));
+ HttpURLConnection webProxyConnection
+ = (HttpURLConnection) weburl.openConnection(webProxy);
+ System.out.println(UrlConnectionUtils.contentAsString(webProxyConnection));
+ }
+
+}
diff --git a/core-java-net/src/test/resources/.gitignore b/core-java-net/src/test/resources/.gitignore
new file mode 100644
index 0000000000..83c05e60c8
--- /dev/null
+++ b/core-java-net/src/test/resources/.gitignore
@@ -0,0 +1,13 @@
+*.class
+
+#folders#
+/target
+/neoDb*
+/data
+/src/main/webapp/WEB-INF/classes
+*/META-INF/*
+
+# Packaged files #
+*.jar
+*.war
+*.ear
\ No newline at end of file
diff --git a/core-java/README.md b/core-java/README.md
index 856cc58097..b8ad28cc0c 100644
--- a/core-java/README.md
+++ b/core-java/README.md
@@ -6,114 +6,56 @@
- [Java Timer](http://www.baeldung.com/java-timer-and-timertask)
- [How to Run a Shell Command in Java](http://www.baeldung.com/run-shell-command-in-java)
- [MD5 Hashing in Java](http://www.baeldung.com/java-md5)
-- [Guide to Java Reflection](http://www.baeldung.com/java-reflection)
- [A Guide to Java Sockets](http://www.baeldung.com/a-guide-to-java-sockets)
-- [Java – Try with Resources](http://www.baeldung.com/java-try-with-resources)
- [Guide to the Fork/Join Framework in Java](http://www.baeldung.com/java-fork-join)
- [How to Print Screen in Java](http://www.baeldung.com/print-screen-in-java)
-- [Introduction to Java Generics](http://www.baeldung.com/java-generics)
-- [Generate equals() and hashCode() with Eclipse](http://www.baeldung.com/java-eclipse-equals-and-hashcode)
- [A Guide To Java Regular Expressions API](http://www.baeldung.com/regular-expressions-java)
-- [Sorting in Java](http://www.baeldung.com/java-sorting)
- [Getting Started with Java Properties](http://www.baeldung.com/java-properties)
-- [Grep in Java](http://www.baeldung.com/grep-in-java)
- [Pattern Search with Grep in Java](http://www.baeldung.com/grep-in-java)
- [URL Encoding and Decoding in Java](http://www.baeldung.com/java-url-encoding-decoding)
-- [The Basics of Java Generics](http://www.baeldung.com/java-generics)
- [How to Create an Executable JAR with Maven](http://www.baeldung.com/executable-jar-with-maven)
- [How to Design a Genetic Algorithm in Java](http://www.baeldung.com/java-genetic-algorithm)
- [Basic Introduction to JMX](http://www.baeldung.com/java-management-extensions)
- [AWS Lambda With Java](http://www.baeldung.com/java-aws-lambda)
- [Introduction to Nashorn](http://www.baeldung.com/java-nashorn)
-- [Chained Exceptions in Java](http://www.baeldung.com/java-chained-exceptions)
-- [Java Primitive Conversions](http://www.baeldung.com/java-primitive-conversions)
- [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency)
- [JVM Log Forging](http://www.baeldung.com/jvm-log-forging)
- [Guide to sun.misc.Unsafe](http://www.baeldung.com/java-unsafe)
- [How to Perform a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request)
-- [Call Methods at Runtime Using Java Reflection](http://www.baeldung.com/java-method-reflection)
- [How to Add a Single Element to a Stream](http://www.baeldung.com/java-stream-append-prepend)
-- [Iterating Over Enum Values in Java](http://www.baeldung.com/java-enum-iteration)
- [Kotlin Java Interoperability](http://www.baeldung.com/kotlin-java-interoperability)
-- [Changing Annotation Parameters At Runtime](http://www.baeldung.com/java-reflection-change-annotation-params)
- [How to Find all Getters Returning Null](http://www.baeldung.com/java-getters-returning-null)
-- [Changing the Order in a Sum Operation Can Produce Different Results?](http://www.baeldung.com/java-floating-point-sum-order)
- [How to Get a Name of a Method Being Executed?](http://www.baeldung.com/java-name-of-executing-method)
-- [Dynamic Proxies in Java](http://www.baeldung.com/java-dynamic-proxies)
-- [How to Copy an Array in Java](http://www.baeldung.com/java-array-copy)
- [Converting a Stack Trace to a String in Java](http://www.baeldung.com/java-stacktrace-to-string)
-- [Java Double Brace Initialization](http://www.baeldung.com/java-double-brace-initialization)
-- [The StackOverflowError in Java](http://www.baeldung.com/java-stack-overflow-error)
- [Introduction to Java Serialization](http://www.baeldung.com/java-serialization)
-- [ClassNotFoundException vs NoClassDefFoundError](http://www.baeldung.com/java-classnotfoundexception-and-noclassdeffounderror)
- [Guide to UUID in Java](http://www.baeldung.com/java-uuid)
- [Guide to Escaping Characters in Java RegExps](http://www.baeldung.com/java-regexp-escape-char)
-- [Guide to hashCode() in Java](http://www.baeldung.com/java-hashcode)
- [Difference between URL and URI](http://www.baeldung.com/java-url-vs-uri)
- [Broadcasting and Multicasting in Java](http://www.baeldung.com/java-broadcast-multicast)
- [Period and Duration in Java](http://www.baeldung.com/java-period-duration)
-- [Guide to the Diamond Operator in Java](http://www.baeldung.com/java-diamond-operator)
-- [“Sneaky Throws” in Java](http://www.baeldung.com/java-sneaky-throws)
- [OutOfMemoryError: GC Overhead Limit Exceeded](http://www.baeldung.com/java-gc-overhead-limit-exceeded)
- [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin)
-- [A Guide to the Static Keyword in Java](http://www.baeldung.com/java-static)
-- [Initializing Arrays in Java](http://www.baeldung.com/java-initialize-array)
-- [Quick Example - Comparator vs Comparable in Java](http://www.baeldung.com/java-comparator-comparable)
- [Quick Guide to Java Stack](http://www.baeldung.com/java-stack)
-- [The Java continue and break Keywords](http://www.baeldung.com/java-continue-and-break)
- [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter)
-- [Check if a Java Array Contains a Value](http://www.baeldung.com/java-array-contains-value)
-- [How to Invert an Array in Java](http://www.baeldung.com/java-invert-array)
- [Guide to the Cipher Class](http://www.baeldung.com/java-cipher-class)
-- [A Guide to Java Initialization](http://www.baeldung.com/java-initialization)
-- [Implementing a Binary Tree in Java](http://www.baeldung.com/java-binary-tree)
- [A Guide to ThreadLocalRandom in Java](http://www.baeldung.com/java-thread-local-random)
-- [Nested Classes in Java](http://www.baeldung.com/java-nested-classes)
-- [A Guide to Java Loops](http://www.baeldung.com/java-loops)
-- [Varargs in Java](http://www.baeldung.com/java-varargs)
-- [A Guide to Inner Interfaces in Java](http://www.baeldung.com/java-inner-interfaces)
-- [Polymorphism in Java](http://www.baeldung.com/java-polymorphism)
-- [Recursion In Java](http://www.baeldung.com/java-recursion)
-- [A Guide to the finalize Method in Java](http://www.baeldung.com/java-finalize)
- [Compiling Java *.class Files with javac](http://www.baeldung.com/javac)
-- [Method Overloading and Overriding in Java](http://www.baeldung.com/java-method-overload-override)
-- [Guide to ThreadLocalRandom in Java](http://www.baeldung.com/java-thread-local-random)
- [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator)
- [The Trie Data Structure in Java](http://www.baeldung.com/trie-java)
- [Introduction to Javadoc](http://www.baeldung.com/javadoc)
-- [How to Make a Deep Copy of an Object in Java](http://www.baeldung.com/java-deep-copy)
-- [Guide to Inheritance in Java](http://www.baeldung.com/java-inheritance)
- [Guide to Externalizable Interface in Java](http://www.baeldung.com/java-externalizable)
-- [Object Type Casting in Java](http://www.baeldung.com/java-type-casting)
- [A Practical Guide to DecimalFormat](http://www.baeldung.com/java-decimalformat)
- [How to Detect the OS Using Java](http://www.baeldung.com/java-detect-os)
- [ASCII Art in Java](http://www.baeldung.com/ascii-art-in-java)
-- [Inheritance and Composition (Is-a vs Has-a relationship) in Java](http://www.baeldung.com/java-inheritance-composition)
-- [Finding Max/Min of a List or Collection](http://www.baeldung.com/java-collection-min-max)
-- [The "final" Keyword in Java](http://www.baeldung.com/java-final)
- [What is the serialVersionUID?](http://www.baeldung.com/java-serial-version-uid)
- [A Guide To UDP In Java](http://www.baeldung.com/udp-in-java)
-- [A Guide to the Java LinkedList](http://www.baeldung.com/java-linkedlist)
-- [A Guide to Java Enums](http://www.baeldung.com/a-guide-to-java-enums)
- [A Guide to the ResourceBundle](http://www.baeldung.com/java-resourcebundle)
-- [Quick Guide to java.lang.System](http://www.baeldung.com/java-lang-system)
- [Class Loaders in Java](http://www.baeldung.com/java-classloaders)
-- [Find Sum and Average in a Java Array](http://www.baeldung.com/java-array-sum-average)
-- [Java List UnsupportedOperationException](http://www.baeldung.com/java-list-unsupported-operation-exception)
-- [Type Erasure in Java Explained](http://www.baeldung.com/java-type-erasure)
-- [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split)
-- [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality)
- [Sending Emails with Java](http://www.baeldung.com/java-email)
- [Introduction to SSL in Java](http://www.baeldung.com/java-ssl)
- [Java KeyStore API](http://www.baeldung.com/java-keystore)
- [Double-Checked Locking with Singleton](http://www.baeldung.com/java-singleton-double-checked-locking)
- [Guide to Java Clock Class](http://www.baeldung.com/java-clock)
-- [Infinite Loops in Java](http://www.baeldung.com/infinite-loops-java)
-- [Using Java Assertions](http://www.baeldung.com/java-assert)
-- [Pass-By-Value as a Parameter Passing Mechanism in Java](http://www.baeldung.com/java-pass-by-value-or-pass-by-reference)
-- [Variable and Method Hiding in Java](http://www.baeldung.com/java-variable-method-hiding)
-- [Access Modifiers in Java](http://www.baeldung.com/java-access-modifiers)
-- [Infinite Loops in Java](http://www.baeldung.com/infinite-loops-java)
- [Introduction to Creational Design Patterns](http://www.baeldung.com/creational-design-patterns)
- [Proxy, Decorator, Adapter and Bridge Patterns](http://www.baeldung.com/java-structural-design-patterns)
- [Singletons in Java](http://www.baeldung.com/java-singleton)
@@ -121,40 +63,29 @@
- [The Observer Pattern in Java](http://www.baeldung.com/java-observer-pattern)
- [Service Locator Pattern](http://www.baeldung.com/java-service-locator-pattern)
- [The Thread.join() Method in Java](http://www.baeldung.com/java-thread-join)
-- [Guide to the super Java Keyword](http://www.baeldung.com/java-super)
-- [Guide to the this Java Keyword](http://www.baeldung.com/java-this)
-- [Jagged Arrays In Java](http://www.baeldung.com/java-jagged-arrays)
- [Importance of Main Manifest Attribute in a Self-Executing JAR](http://www.baeldung.com/java-jar-executable-manifest-main-class)
- [How to Get the File Extension of a File in Java](http://www.baeldung.com/java-file-extension)
-- [Immutable Objects in Java](http://www.baeldung.com/java-immutable-object)
- [Console I/O in Java](http://www.baeldung.com/java-console-input-output)
-- [Guide to the java.util.Arrays Class](http://www.baeldung.com/java-util-arrays)
-- [Create a Custom Exception in Java](http://www.baeldung.com/java-new-custom-exception)
- [Java Global Exception Handler](http://www.baeldung.com/java-global-exception-handler)
- [Encrypting and Decrypting Files in Java](http://www.baeldung.com/java-cipher-input-output-stream)
- [How to Get the Size of an Object in Java](http://www.baeldung.com/java-size-of-object)
-- [Exception Handling in Java](http://www.baeldung.com/java-exceptions)
- [Guide to Java Instrumentation](http://www.baeldung.com/java-instrumentation)
- [Getting a File’s Mime Type in Java](http://www.baeldung.com/java-file-mime-type)
- [Common Java Exceptions](http://www.baeldung.com/java-common-exceptions)
- [Java Constructors vs Static Factory Methods](https://www.baeldung.com/java-constructors-vs-static-factory-methods)
-- [Differences Between Final, Finally and Finalize in Java](https://www.baeldung.com/java-final-finally-finalize)
-- [Static and Dynamic Binding in Java](https://www.baeldung.com/java-static-dynamic-binding)
-- [Java List Initialization in One Line](https://www.baeldung.com/java-init-list-one-line)
-- [Difference Between Throw and Throws in Java](https://www.baeldung.com/java-throw-throws)
-- [ClassCastException: Arrays$ArrayList cannot be cast to ArrayList](https://www.baeldung.com/java-classcastexception-arrays-arraylist)
- [Throw Exception in Optional in Java 8](https://www.baeldung.com/java-optional-throw-exception)
- [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string)
-- [Synthetic Constructs in Java](https://www.baeldung.com/java-synthetic)
- [Calculating the nth Root in Java](https://www.baeldung.com/java-nth-root)
- [Convert Double to String, Removing Decimal Places](https://www.baeldung.com/java-double-to-string)
- [Different Ways to Capture Java Heap Dumps](https://www.baeldung.com/java-heap-dump-capture)
-- [How to Separate Double into Integer and Decimal Parts](https://www.baeldung.com/java-separate-double-into-integer-decimal-parts)
- [ZoneOffset in Java](https://www.baeldung.com/java-zone-offset)
- [Hashing a Password in Java](https://www.baeldung.com/java-password-hashing)
-- [Java Switch Statement](https://www.baeldung.com/java-switch)
-- [The Modulo Operator in Java](https://www.baeldung.com/modulo-java)
-- [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator)
- [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties)
- [Understanding Memory Leaks in Java](https://www.baeldung.com/java-memory-leaks)
+- [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format)
- [SSL Handshake Failures](https://www.baeldung.com/java-ssl-handshake-failures)
+- [Implementing a Binary Tree in Java](https://www.baeldung.com/java-binary-tree)
+- [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order)
+- [Java – Try with Resources](https://www.baeldung.com/java-try-with-resources)
+- [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class)
+- [Guide to Character Encoding](https://www.baeldung.com/java-char-encoding)
diff --git a/core-java/pom.xml b/core-java/pom.xml
index 477a01375d..64345ab14c 100644
--- a/core-java/pom.xml
+++ b/core-java/pom.xml
@@ -1,11 +1,10 @@
4.0.0
- com.baeldung
core-java
0.1.0-SNAPSHOT
- jar
core-java
+ jar
com.baeldung
@@ -157,7 +156,7 @@
com.sun
tools
- 1.8.0
+ ${sun.tools.version}
system
${java.home}/../lib/tools.jar
@@ -173,21 +172,6 @@
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- **/*LiveTest.java
- **/*IntegrationTest.java
- **/*IntTest.java
- **/*LongRunningUnitTest.java
- **/*ManualTest.java
-
- true
-
-
-
org.apache.maven.plugins
maven-dependency-plugin
@@ -542,6 +526,7 @@
0.1.5
3.21.0-GA
+
+ 1.8.0
-
diff --git a/core-java/src/main/java/com/baeldung/abstractclasses/application/Application.java b/core-java/src/main/java/com/baeldung/abstractclasses/application/Application.java
index fe30c66484..3180762227 100644
--- a/core-java/src/main/java/com/baeldung/abstractclasses/application/Application.java
+++ b/core-java/src/main/java/com/baeldung/abstractclasses/application/Application.java
@@ -2,29 +2,28 @@ package com.baeldung.abstractclasses.application;
import com.baeldung.abstractclasses.filereaders.BaseFileReader;
import com.baeldung.abstractclasses.filereaders.LowercaseFileReader;
-import com.baeldung.abstractclasses.filereaders.StandardFileReader;
import com.baeldung.abstractclasses.filereaders.UppercaseFileReader;
import java.io.IOException;
+import java.net.URISyntaxException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
public class Application {
- public static void main(String[] args) throws IOException {
-
+ public static void main(String[] args) throws IOException, URISyntaxException {
+
Application application = new Application();
- String filePath = application.getFilePathFromResourcesFolder("files/test.txt");
-
- BaseFileReader lowercaseFileReader = new LowercaseFileReader(filePath);
+ Path path = application.getPathFromResourcesFile("files/test.txt");
+ BaseFileReader lowercaseFileReader = new LowercaseFileReader(path);
lowercaseFileReader.readFile().forEach(line -> System.out.println(line));
+
+ BaseFileReader uppercaseFileReader = new UppercaseFileReader(path);
+ uppercaseFileReader.readFile().forEach(line -> System.out.println(line));
- BaseFileReader upperCaseFileReader = new UppercaseFileReader(filePath);
- upperCaseFileReader.readFile().forEach(line -> System.out.println(line));
-
- BaseFileReader standardFileReader = new StandardFileReader(filePath);
- standardFileReader.readFile().forEach(line -> System.out.println(line));
-
}
- private String getFilePathFromResourcesFolder(String fileName) {
- return getClass().getClassLoader().getResource(fileName).getPath().substring(1);
+ private Path getPathFromResourcesFile(String filePath) throws URISyntaxException {
+ return Paths.get(getClass().getClassLoader().getResource(filePath).toURI());
+
}
}
diff --git a/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java b/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java
index 659913f046..97452a9eca 100644
--- a/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java
+++ b/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/BaseFileReader.java
@@ -1,19 +1,27 @@
package com.baeldung.abstractclasses.filereaders;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.List;
+import java.util.stream.Collectors;
public abstract class BaseFileReader {
- protected String filePath;
+ protected Path filePath;
- protected BaseFileReader(String filePath) {
+ protected BaseFileReader(Path filePath) {
this.filePath = filePath;
}
- public String getFilePath() {
+ public Path getFilePath() {
return filePath;
}
- public abstract List readFile() throws IOException;
+ public List readFile() throws IOException {
+ return Files.lines(filePath)
+ .map(this::mapFileLine).collect(Collectors.toList());
+ }
+
+ protected abstract String mapFileLine(String line);
}
diff --git a/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java b/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java
index 0bbef45eb8..53820d393c 100644
--- a/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java
+++ b/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/LowercaseFileReader.java
@@ -1,21 +1,15 @@
package com.baeldung.abstractclasses.filereaders;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.stream.Collectors;
+import java.nio.file.Path;
public class LowercaseFileReader extends BaseFileReader {
- public LowercaseFileReader(String filePath) {
+ public LowercaseFileReader(Path filePath) {
super(filePath);
}
-
+
@Override
- public List readFile() throws IOException {
- return Files.lines(Paths.get(filePath))
- .map(String::toLowerCase)
- .collect(Collectors.toList());
- }
+ public String mapFileLine(String line) {
+ return line.toLowerCase();
+ }
}
diff --git a/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/StandardFileReader.java b/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/StandardFileReader.java
deleted file mode 100644
index 0a90d53c38..0000000000
--- a/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/StandardFileReader.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.baeldung.abstractclasses.filereaders;
-
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.stream.Collectors;
-
-public class StandardFileReader extends BaseFileReader {
-
- public StandardFileReader(String filePath) {
- super(filePath);
- }
-
- @Override
- public List readFile() throws IOException {
- return Files.lines(Paths.get(filePath)).collect(Collectors.toList());
- }
-}
diff --git a/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java b/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java
index 4e8f150964..3144a4f27f 100644
--- a/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java
+++ b/core-java/src/main/java/com/baeldung/abstractclasses/filereaders/UppercaseFileReader.java
@@ -1,21 +1,15 @@
package com.baeldung.abstractclasses.filereaders;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.stream.Collectors;
+import java.nio.file.Path;
public class UppercaseFileReader extends BaseFileReader {
-
- public UppercaseFileReader(String filePath) {
+
+ public UppercaseFileReader(Path filePath) {
super(filePath);
}
-
+
@Override
- public List readFile() throws IOException {
- return Files.lines(Paths.get(filePath))
- .map(String::toUpperCase)
- .collect(Collectors.toList());
+ public String mapFileLine(String line) {
+ return line.toUpperCase();
}
}
diff --git a/core-java/src/main/java/com/baeldung/area/circle/Circle.java b/core-java/src/main/java/com/baeldung/area/circle/Circle.java
new file mode 100644
index 0000000000..40eed079e4
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/area/circle/Circle.java
@@ -0,0 +1,26 @@
+package com.baeldung.area.circle;
+
+public class Circle {
+
+ private double radius;
+
+ public Circle(double radius) {
+ this.radius = radius;
+ }
+
+ public double getRadius() {
+ return radius;
+ }
+
+ public void setRadius(double radius) {
+ this.radius = radius;
+ }
+
+ private double calculateArea() {
+ return radius * radius * Math.PI;
+ }
+
+ public String toString() {
+ return "The area of the circle [radius = " + radius + "]: " + calculateArea();
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/area/circle/CircleArea.java b/core-java/src/main/java/com/baeldung/area/circle/CircleArea.java
new file mode 100644
index 0000000000..4d78637af6
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/area/circle/CircleArea.java
@@ -0,0 +1,36 @@
+package com.baeldung.area.circle;
+
+import java.util.InputMismatchException;
+import java.util.Scanner;
+
+public class CircleArea {
+
+ public static void main(String[] args) {
+ if (args.length > 0) {
+ try {
+ double radius = Double.parseDouble(args[0]);
+ calculateArea(radius);
+ } catch (NumberFormatException nfe) {
+ System.out.println("Invalid value for radius");
+ System.exit(0);
+ }
+ }
+
+ try (Scanner scanner = new Scanner(System.in)) {
+ System.out.println("Please enter radius value: ");
+ double radius = scanner.nextDouble();
+ calculateArea(radius);
+ } catch (InputMismatchException e) {
+ System.out.println("Invalid value for radius");
+ System.exit(0);
+ }
+
+ Circle circle = new Circle(7);
+ System.out.println(circle);
+ }
+
+ private static void calculateArea(double radius) {
+ double area = radius * radius * Math.PI;
+ System.out.println("The area of the circle [radius = " + radius + "]: " + area);
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java b/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java
new file mode 100644
index 0000000000..bdd92e37f6
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java
@@ -0,0 +1,32 @@
+package com.baeldung.encoding;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+
+public class CharacterEncodingExamples {
+
+ static String readFile(String filePath, String encoding) throws IOException {
+ File file = new File(filePath);
+ StringBuffer buffer = new StringBuffer();
+ try (InputStreamReader isr = new InputStreamReader(new FileInputStream(file), encoding)) {
+ int data;
+ while ((data = isr.read()) != -1) {
+ buffer.append((char) data);
+ }
+ }
+ return buffer.toString();
+ }
+
+ static String convertToBinary(String input, String encoding) throws UnsupportedEncodingException {
+ byte[] bytes = input.getBytes(encoding);
+ StringBuffer buffer = new StringBuffer();
+ for (int b : bytes) {
+ buffer.append(Integer.toBinaryString((b + 256) % 256));
+ buffer.append(" ");
+ }
+ return buffer.toString();
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/graph/Graph.java b/core-java/src/main/java/com/baeldung/graph/Graph.java
new file mode 100644
index 0000000000..43b5c0aa08
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/graph/Graph.java
@@ -0,0 +1,76 @@
+package com.baeldung.graph;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public class Graph {
+ private Map> adjVertices;
+
+ Graph() {
+ this.adjVertices = new HashMap>();
+ }
+
+ void addVertex(String label) {
+ adjVertices.putIfAbsent(new Vertex(label), new ArrayList<>());
+ }
+
+ void removeVertex(String label) {
+ Vertex v = new Vertex(label);
+ adjVertices.values().stream().map(e -> e.remove(v)).collect(Collectors.toList());
+ adjVertices.remove(new Vertex(label));
+ }
+
+ void addEdge(String label1, String label2) {
+ Vertex v1 = new Vertex(label1);
+ Vertex v2 = new Vertex(label2);
+ adjVertices.get(v1).add(v2);
+ adjVertices.get(v2).add(v1);
+ }
+
+ void removeEdge(String label1, String label2) {
+ Vertex v1 = new Vertex(label1);
+ Vertex v2 = new Vertex(label2);
+ List eV1 = adjVertices.get(v1);
+ List eV2 = adjVertices.get(v2);
+ if (eV1 != null)
+ eV1.remove(v2);
+ if (eV2 != null)
+ eV2.remove(v1);
+ }
+
+ List getAdjVertices(String label) {
+ return adjVertices.get(new Vertex(label));
+ }
+
+ String printGraph() {
+ StringBuffer sb = new StringBuffer();
+ for(Vertex v : adjVertices.keySet()) {
+ sb.append(v);
+ sb.append(adjVertices.get(v));
+ }
+ return sb.toString();
+ }
+
+ class Vertex {
+ String label;
+ Vertex(String label) {
+ this.label = label;
+ }
+ @Override
+ public boolean equals(Object obj) {
+ Vertex vertex = (Vertex) obj;
+ return vertex.label == label;
+ }
+ @Override
+ public int hashCode() {
+ return label.hashCode();
+ }
+ @Override
+ public String toString() {
+ return label;
+ }
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/graph/GraphTraversal.java b/core-java/src/main/java/com/baeldung/graph/GraphTraversal.java
new file mode 100644
index 0000000000..479e653a5c
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/graph/GraphTraversal.java
@@ -0,0 +1,44 @@
+package com.baeldung.graph;
+
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.Set;
+import java.util.Stack;
+
+import com.baeldung.graph.Graph.Vertex;
+
+public class GraphTraversal {
+ static Set depthFirstTraversal(Graph graph, String root) {
+ Set visited = new LinkedHashSet();
+ Stack stack = new Stack();
+ stack.push(root);
+ while (!stack.isEmpty()) {
+ String vertex = stack.pop();
+ if (!visited.contains(vertex)) {
+ visited.add(vertex);
+ for (Vertex v : graph.getAdjVertices(vertex)) {
+ stack.push(v.label);
+ }
+ }
+ }
+ return visited;
+ }
+
+ static Set breadthFirstTraversal(Graph graph, String root) {
+ Set visited = new LinkedHashSet();
+ Queue queue = new LinkedList();
+ queue.add(root);
+ visited.add(root);
+ while (!queue.isEmpty()) {
+ String vertex = queue.poll();
+ for (Vertex v : graph.getAdjVertices(vertex)) {
+ if (!visited.contains(v.label)) {
+ visited.add(v.label);
+ queue.add(v.label);
+ }
+ }
+ }
+ return visited;
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/printf/PrintfExamples.java b/core-java/src/main/java/com/baeldung/printf/PrintfExamples.java
new file mode 100644
index 0000000000..3d451f6f50
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/printf/PrintfExamples.java
@@ -0,0 +1,61 @@
+package com.baeldung.printf;
+
+import java.util.Date;
+import java.util.Locale;
+
+public class PrintfExamples {
+
+ public static void main(String[] args) {
+
+ printfNewLine();
+ printfChar();
+ printfString();
+ printfNumber();
+ printfDateTime();
+ printfBoolean();
+ }
+
+ private static void printfNewLine() {
+ System.out.printf("baeldung%nline%nterminator");
+ }
+
+ private static void printfString() {
+ System.out.printf("'%s' %n", "baeldung");
+ System.out.printf("'%S' %n", "baeldung");
+ System.out.printf("'%15s' %n", "baeldung");
+ System.out.printf("'%-10s' %n", "baeldung");
+ }
+
+ private static void printfChar() {
+ System.out.printf("%c%n", 's');
+ System.out.printf("%C%n", 's');
+ }
+
+ private static void printfNumber() {
+ System.out.printf("simple integer: %d%n", 10000L);
+
+ System.out.printf(Locale.US, "%,d %n", 10000);
+ System.out.printf(Locale.ITALY, "%,d %n", 10000);
+
+ System.out.printf("%f%n", 5.1473);
+ System.out.printf("'%5.2f'%n", 5.1473);
+ System.out.printf("'%5.2e'%n", 5.1473);
+ }
+
+ private static void printfBoolean() {
+ System.out.printf("%b%n", null);
+ System.out.printf("%B%n", false);
+ System.out.printf("%B%n", 5.3);
+ System.out.printf("%b%n", "random text");
+ }
+
+ private static void printfDateTime() {
+ Date date = new Date();
+ System.out.printf("%tT%n", date);
+ System.out.printf("hours %tH: minutes %tM: seconds %tS%n", date, date, date);
+ System.out.printf("%1$tH:%1$tM:%1$tS %1$tp %1$tL %1$tN %1$tz %n", date);
+
+ System.out.printf("%1$tA %1$tB %1$tY %n", date);
+ System.out.printf("%1$td.%1$tm.%1$ty %n", date);
+ }
+}
diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/ComplexClass.java b/core-java/src/main/java/org/baeldung/equalshashcode/entities/ComplexClass.java
deleted file mode 100644
index 6329f41252..0000000000
--- a/core-java/src/main/java/org/baeldung/equalshashcode/entities/ComplexClass.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.baeldung.equalshashcode.entities;
-
-import java.util.List;
-import java.util.Set;
-
-public class ComplexClass {
-
- private List> genericList;
- private Set integerSet;
-
- public ComplexClass(List> genericArrayList, Set integerHashSet) {
- super();
- this.genericList = genericArrayList;
- this.integerSet = integerHashSet;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((genericList == null) ? 0 : genericList.hashCode());
- result = prime * result + ((integerSet == null) ? 0 : integerSet.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (!(obj instanceof ComplexClass))
- return false;
- ComplexClass other = (ComplexClass) obj;
- if (genericList == null) {
- if (other.genericList != null)
- return false;
- } else if (!genericList.equals(other.genericList))
- return false;
- if (integerSet == null) {
- if (other.integerSet != null)
- return false;
- } else if (!integerSet.equals(other.integerSet))
- return false;
- return true;
- }
-
- protected List> getGenericList() {
- return genericList;
- }
-
- protected void setGenericArrayList(List> genericList) {
- this.genericList = genericList;
- }
-
- protected Set getIntegerSet() {
- return integerSet;
- }
-
- protected void setIntegerSet(Set integerSet) {
- this.integerSet = integerSet;
- }
-}
diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/PrimitiveClass.java b/core-java/src/main/java/org/baeldung/equalshashcode/entities/PrimitiveClass.java
deleted file mode 100644
index ebe005688c..0000000000
--- a/core-java/src/main/java/org/baeldung/equalshashcode/entities/PrimitiveClass.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.baeldung.equalshashcode.entities;
-
-public class PrimitiveClass {
-
- private boolean primitiveBoolean;
- private int primitiveInt;
-
- public PrimitiveClass(boolean primitiveBoolean, int primitiveInt) {
- super();
- this.primitiveBoolean = primitiveBoolean;
- this.primitiveInt = primitiveInt;
- }
-
- protected boolean isPrimitiveBoolean() {
- return primitiveBoolean;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + (primitiveBoolean ? 1231 : 1237);
- result = prime * result + primitiveInt;
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- PrimitiveClass other = (PrimitiveClass) obj;
- if (primitiveBoolean != other.primitiveBoolean)
- return false;
- if (primitiveInt != other.primitiveInt)
- return false;
- return true;
- }
-
- protected void setPrimitiveBoolean(boolean primitiveBoolean) {
- this.primitiveBoolean = primitiveBoolean;
- }
-
- protected int getPrimitiveInt() {
- return primitiveInt;
- }
-
- protected void setPrimitiveInt(int primitiveInt) {
- this.primitiveInt = primitiveInt;
- }
-}
diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Rectangle.java b/core-java/src/main/java/org/baeldung/equalshashcode/entities/Rectangle.java
deleted file mode 100644
index 5e38eb6088..0000000000
--- a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Rectangle.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.baeldung.equalshashcode.entities;
-
-public class Rectangle extends Shape {
- private double width;
- private double length;
-
- Rectangle(double width, double length) {
- this.width = width;
- this.length = length;
- }
-
- @Override
- public double area() {
- return width * length;
- }
-
- @Override
- public double perimeter() {
- return 2 * (width + length);
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- long temp;
- temp = Double.doubleToLongBits(length);
- result = prime * result + (int) (temp ^ (temp >>> 32));
- temp = Double.doubleToLongBits(width);
- result = prime * result + (int) (temp ^ (temp >>> 32));
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- Rectangle other = (Rectangle) obj;
- if (Double.doubleToLongBits(length) != Double.doubleToLongBits(other.length))
- return false;
- if (Double.doubleToLongBits(width) != Double.doubleToLongBits(other.width))
- return false;
- return true;
- }
-
- protected double getWidth() {
- return width;
- }
-
- protected double getLength() {
- return length;
- }
-
-}
\ No newline at end of file
diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Shape.java b/core-java/src/main/java/org/baeldung/equalshashcode/entities/Shape.java
deleted file mode 100644
index 3bfc81da8f..0000000000
--- a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Shape.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.baeldung.equalshashcode.entities;
-
-public abstract class Shape {
- public abstract double area();
-
- public abstract double perimeter();
-}
diff --git a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Square.java b/core-java/src/main/java/org/baeldung/equalshashcode/entities/Square.java
deleted file mode 100644
index f11e34f0ba..0000000000
--- a/core-java/src/main/java/org/baeldung/equalshashcode/entities/Square.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.baeldung.equalshashcode.entities;
-
-import java.awt.Color;
-
-public class Square extends Rectangle {
-
- Color color;
-
- public Square(double width, Color color) {
- super(width, width);
- this.color = color;
- }
-
- /* (non-Javadoc)
- * @see java.lang.Object#hashCode()
- */
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = super.hashCode();
- result = prime * result + ((color == null) ? 0 : color.hashCode());
- return result;
- }
-
- /* (non-Javadoc)
- * @see java.lang.Object#equals(java.lang.Object)
- */
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (!super.equals(obj)) {
- return false;
- }
- if (!(obj instanceof Square)) {
- return false;
- }
- Square other = (Square) obj;
- if (color == null) {
- if (other.color != null) {
- return false;
- }
- } else if (!color.equals(other.color)) {
- return false;
- }
- return true;
- }
-
- protected Color getColor() {
- return color;
- }
-
- protected void setColor(Color color) {
- this.color = color;
- }
-
-}
diff --git a/core-java/src/test/java/com/baeldung/abstractclasses/StandardFileReaderUnitTest.java b/core-java/src/test/java/com/baeldung/abstractclasses/StandardFileReaderUnitTest.java
deleted file mode 100644
index e1c1435ef4..0000000000
--- a/core-java/src/test/java/com/baeldung/abstractclasses/StandardFileReaderUnitTest.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.baeldung.abstractclasses;
-
-import com.baeldung.abstractclasses.filereaders.BaseFileReader;
-import com.baeldung.abstractclasses.filereaders.StandardFileReader;
-import java.util.List;
-import static org.assertj.core.api.Assertions.assertThat;
-import org.junit.Test;
-
-public class StandardFileReaderUnitTest {
-
- @Test
- public void givenStandardFileReaderInstance_whenCalledreadFile_thenCorrect() throws Exception {
- String filePath = getClass().getClassLoader().getResource("files/test.txt").getPath().substring(1);
- BaseFileReader standardFileReader = new StandardFileReader(filePath);
-
- assertThat(standardFileReader.readFile()).isInstanceOf(List.class);
- }
-}
diff --git a/core-java/src/test/java/com/baeldung/abstractclasses/LowercaseFileReaderUnitTest.java b/core-java/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java
similarity index 70%
rename from core-java/src/test/java/com/baeldung/abstractclasses/LowercaseFileReaderUnitTest.java
rename to core-java/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java
index 4058f6f03b..4f0d3a7cd5 100644
--- a/core-java/src/test/java/com/baeldung/abstractclasses/LowercaseFileReaderUnitTest.java
+++ b/core-java/src/test/java/com/baeldung/abstractclasses/test/LowercaseFileReaderUnitTest.java
@@ -1,7 +1,9 @@
-package com.baeldung.abstractclasses;
+package com.baeldung.abstractclasses.test;
import com.baeldung.abstractclasses.filereaders.BaseFileReader;
import com.baeldung.abstractclasses.filereaders.LowercaseFileReader;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Test;
@@ -10,8 +12,8 @@ public class LowercaseFileReaderUnitTest {
@Test
public void givenLowercaseFileReaderInstance_whenCalledreadFile_thenCorrect() throws Exception {
- String filePath = getClass().getClassLoader().getResource("files/test.txt").getPath().substring(1);
- BaseFileReader lowercaseFileReader = new LowercaseFileReader(filePath);
+ Path path = Paths.get(getClass().getClassLoader().getResource("files/test.txt").toURI());
+ BaseFileReader lowercaseFileReader = new LowercaseFileReader(path);
assertThat(lowercaseFileReader.readFile()).isInstanceOf(List.class);
}
diff --git a/core-java/src/test/java/com/baeldung/abstractclasses/UppercaseFileReaderUnitTest.java b/core-java/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java
similarity index 69%
rename from core-java/src/test/java/com/baeldung/abstractclasses/UppercaseFileReaderUnitTest.java
rename to core-java/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java
index f9c5fbf94d..e11db57000 100644
--- a/core-java/src/test/java/com/baeldung/abstractclasses/UppercaseFileReaderUnitTest.java
+++ b/core-java/src/test/java/com/baeldung/abstractclasses/test/UppercaseFileReaderUnitTest.java
@@ -1,7 +1,9 @@
-package com.baeldung.abstractclasses;
+package com.baeldung.abstractclasses.test;
import com.baeldung.abstractclasses.filereaders.BaseFileReader;
import com.baeldung.abstractclasses.filereaders.UppercaseFileReader;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Test;
@@ -10,9 +12,9 @@ public class UppercaseFileReaderUnitTest {
@Test
public void givenUppercaseFileReaderInstance_whenCalledreadFile_thenCorrect() throws Exception {
- String filePath = getClass().getClassLoader().getResource("files/test.txt").getPath().substring(1);
- BaseFileReader uppercaseFileReader = new UppercaseFileReader(filePath);
+ Path path = Paths.get(getClass().getClassLoader().getResource("files/test.txt").toURI());
+ BaseFileReader uppercaseFileReader = new UppercaseFileReader(path);
assertThat(uppercaseFileReader.readFile()).isInstanceOf(List.class);
- }
+ }
}
diff --git a/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java b/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java
new file mode 100644
index 0000000000..95b3605d95
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java
@@ -0,0 +1,61 @@
+package com.baeldung.encoding;
+
+import java.io.IOException;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class CharacterEncodingExamplesUnitTest {
+
+ @Test
+ public void givenTextFile_whenCalledWithEncodingASCII_thenProduceIncorrectResult() throws IOException {
+ Assert.assertEquals(
+ CharacterEncodingExamples.readFile(
+ "src/test/resources/encoding.txt", "US-ASCII"),
+ "The fa��ade pattern is a software-design pattern commonly used with object-oriented programming.");
+ }
+
+ @Test
+ public void givenTextFile_whenCalledWithEncodingUTF8_thenProduceCorrectResult() throws IOException {
+ Assert.assertEquals(
+ CharacterEncodingExamples.readFile(
+ "src/test/resources/encoding.txt", "UTF-8"),
+ "The façade pattern is a software-design pattern commonly used with object-oriented programming.");
+ }
+
+ @Test
+ public void givenCharacterA_whenConvertedtoBinaryWithEncodingASCII_thenProduceResult() throws IOException {
+ Assert.assertEquals(
+ CharacterEncodingExamples.convertToBinary("A", "US-ASCII"),
+ "1000001 ");
+ }
+
+ @Test
+ public void givenCharacterA_whenConvertedtoBinaryWithEncodingUTF8_thenProduceResult() throws IOException {
+ Assert.assertEquals(
+ CharacterEncodingExamples.convertToBinary("A", "UTF-8"),
+ "1000001 ");
+ }
+
+ @Test
+ public void givenCharacterCh_whenConvertedtoBinaryWithEncodingBig5_thenProduceResult() throws IOException {
+ Assert.assertEquals(
+ CharacterEncodingExamples.convertToBinary("語", "Big5"),
+ "10111011 1111001 ");
+ }
+
+ @Test
+ public void givenCharacterCh_whenConvertedtoBinaryWithEncodingUTF8_thenProduceResult() throws IOException {
+ Assert.assertEquals(
+ CharacterEncodingExamples.convertToBinary("語", "UTF-8"),
+ "11101000 10101010 10011110 ");
+ }
+
+ @Test
+ public void givenCharacterCh_whenConvertedtoBinaryWithEncodingUTF32_thenProduceResult() throws IOException {
+ Assert.assertEquals(
+ CharacterEncodingExamples.convertToBinary("語", "UTF-32"),
+ "0 0 10001010 10011110 ");
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/graph/GraphTraversalUnitTest.java b/core-java/src/test/java/com/baeldung/graph/GraphTraversalUnitTest.java
new file mode 100644
index 0000000000..d955d56d95
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/graph/GraphTraversalUnitTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.graph;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class GraphTraversalUnitTest {
+ @Test
+ public void givenAGraph_whenTraversingDepthFirst_thenExpectedResult() {
+ Graph graph = createGraph();
+ Assert.assertEquals("[Bob, Rob, Maria, Alice, Mark]",
+ GraphTraversal.depthFirstTraversal(graph, "Bob").toString());
+ }
+
+ @Test
+ public void givenAGraph_whenTraversingBreadthFirst_thenExpectedResult() {
+ Graph graph = createGraph();
+ Assert.assertEquals("[Bob, Alice, Rob, Mark, Maria]",
+ GraphTraversal.breadthFirstTraversal(graph, "Bob").toString());
+ }
+
+ Graph createGraph() {
+ Graph graph = new Graph();
+ graph.addVertex("Bob");
+ graph.addVertex("Alice");
+ graph.addVertex("Mark");
+ graph.addVertex("Rob");
+ graph.addVertex("Maria");
+ graph.addEdge("Bob", "Alice");
+ graph.addEdge("Bob", "Rob");
+ graph.addEdge("Alice", "Mark");
+ graph.addEdge("Rob", "Mark");
+ graph.addEdge("Alice", "Maria");
+ graph.addEdge("Rob", "Maria");
+ return graph;
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/java/math/MathUnitTest.java b/core-java/src/test/java/com/baeldung/java/math/MathUnitTest.java
new file mode 100644
index 0000000000..6d1872f05f
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java/math/MathUnitTest.java
@@ -0,0 +1,175 @@
+package com.baeldung.java.math;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class MathUnitTest {
+
+ @Test
+ public void whenAbsInteger_thenReturnAbsoluteValue() {
+ assertEquals(5,Math.abs(-5));
+ }
+
+ @Test
+ public void whenMaxBetweenTwoValue_thenReturnMaximum() {
+ assertEquals(10, Math.max(5,10));
+ }
+
+ @Test
+ public void whenMinBetweenTwoValue_thenReturnMinimum() {
+ assertEquals(5, Math.min(5,10));
+ }
+
+ @Test
+ public void whenSignumWithNegativeNumber_thenReturnMinusOne() {
+ assertEquals(-1, Math.signum(-5), 0);
+ }
+
+ @Test
+ public void whenCopySignWithNegativeSign_thenReturnNegativeArgument() {
+ assertEquals(-5, Math.copySign(5,-1), 0);
+ }
+
+ @Test
+ public void whenPow_thenReturnPoweredValue() {
+ assertEquals(25, Math.pow(5,2),0);
+ }
+
+ @Test
+ public void whenSqrt_thenReturnSquareRoot() {
+ assertEquals(5, Math.sqrt(25),0);
+ }
+
+ @Test
+ public void whenCbrt_thenReturnCubeRoot() {
+ assertEquals(5, Math.cbrt(125),0);
+ }
+
+ @Test
+ public void whenExp_thenReturnEulerNumberRaised() {
+ assertEquals(2.718, Math.exp(1),0.1);
+ }
+
+ @Test
+ public void whenExpm1_thenReturnEulerNumberMinusOne() {
+ assertEquals(1.718, Math.expm1(1),0.1);
+ }
+
+ @Test
+ public void whenGetExponent_thenReturnUnbiasedExponent() {
+ assertEquals(8, Math.getExponent(333.3),0);
+ assertEquals(7, Math.getExponent(222.2f),0);
+ }
+
+ @Test
+ public void whenLog_thenReturnValue() {
+ assertEquals(1, Math.log(Math.E),0);
+ }
+
+ @Test
+ public void whenLog10_thenReturnValue() {
+ assertEquals(1, Math.log10(10),0);
+ }
+
+ @Test
+ public void whenLog1p_thenReturnValue() {
+ assertEquals(1.31, Math.log1p(Math.E),0.1);
+ }
+
+ @Test
+ public void whenSin_thenReturnValue() {
+ assertEquals(1, Math.sin(Math.PI/2),0);
+ }
+
+ @Test
+ public void whenCos_thenReturnValue() {
+ assertEquals(1, Math.cos(0),0);
+ }
+
+ @Test
+ public void whenTan_thenReturnValue() {
+ assertEquals(1, Math.tan(Math.PI/4),0.1);
+ }
+
+ @Test
+ public void whenAsin_thenReturnValue() {
+ assertEquals(Math.PI/2, Math.asin(1),0);
+ }
+
+ @Test
+ public void whenAcos_thenReturnValue() {
+ assertEquals(Math.PI/2, Math.acos(0),0);
+ }
+
+ @Test
+ public void whenAtan_thenReturnValue() {
+ assertEquals(Math.PI/4, Math.atan(1),0);
+ }
+
+ @Test
+ public void whenAtan2_thenReturnValue() {
+ assertEquals(Math.PI/4, Math.atan2(1,1),0);
+ }
+
+ @Test
+ public void whenToDegrees_thenReturnValue() {
+ assertEquals(180, Math.toDegrees(Math.PI),0);
+ }
+
+ @Test
+ public void whenToRadians_thenReturnValue() {
+ assertEquals(Math.PI, Math.toRadians(180),0);
+ }
+
+ @Test
+ public void whenCeil_thenReturnValue() {
+ assertEquals(4, Math.ceil(Math.PI),0);
+ }
+
+ @Test
+ public void whenFloor_thenReturnValue() {
+ assertEquals(3, Math.floor(Math.PI),0);
+ }
+
+ @Test
+ public void whenGetExponent_thenReturnValue() {
+ assertEquals(8, Math.getExponent(333.3),0);
+ }
+
+ @Test
+ public void whenIEEERemainder_thenReturnValue() {
+ assertEquals(1.0, Math.IEEEremainder(5,2),0);
+ }
+
+ @Test
+ public void whenNextAfter_thenReturnValue() {
+ assertEquals(1.9499999284744263, Math.nextAfter(1.95f,1),0.0000001);
+ }
+
+ @Test
+ public void whenNextUp_thenReturnValue() {
+ assertEquals(1.9500002, Math.nextUp(1.95f),0.0000001);
+ }
+
+ @Test
+ public void whenRint_thenReturnValue() {
+ assertEquals(2.0, Math.rint(1.95f),0.0);
+ }
+
+ @Test
+ public void whenRound_thenReturnValue() {
+ assertEquals(2.0, Math.round(1.95f),0.0);
+ }
+
+ @Test
+ public void whenScalb_thenReturnValue() {
+ assertEquals(48, Math.scalb(3, 4),0.0);
+ }
+
+ @Test
+ public void whenHypot_thenReturnValue() {
+ assertEquals(5, Math.hypot(4, 3),0.0);
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/java/reflection/operations/MoreOperationsUnitTest.java b/core-java/src/test/java/com/baeldung/java/reflection/operations/MoreOperationsUnitTest.java
deleted file mode 100644
index 2fe0a54664..0000000000
--- a/core-java/src/test/java/com/baeldung/java/reflection/operations/MoreOperationsUnitTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.baeldung.java.reflection.operations;
-
-import com.baeldung.java.reflection.*;
-import static org.hamcrest.CoreMatchers.equalTo;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import org.junit.Test;
-import static org.junit.Assert.assertThat;
-
-public class MoreOperationsUnitTest {
-
- public MoreOperationsUnitTest() {
- }
-
- @Test(expected = IllegalAccessException.class)
- public void givenObject_whenInvokeProtectedMethod_thenFail() throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
- Method maxProtectedMethod = Operations.class.getDeclaredMethod("protectedMax", int.class, int.class);
-
- Operations operationsInstance = new Operations();
- Integer result = (Integer) maxProtectedMethod.invoke(operationsInstance, 2, 4);
-
- assertThat(result, equalTo(4));
- }
-
- @Test
- public void givenObject_whenInvokeProtectedMethod_thenCorrect() throws Exception {
- Method maxProtectedMethod = Operations.class.getDeclaredMethod("protectedMax", int.class, int.class);
- maxProtectedMethod.setAccessible(true);
-
- Operations operationsInstance = new Operations();
- Integer result = (Integer) maxProtectedMethod.invoke(operationsInstance, 2, 4);
-
- assertThat(result, equalTo(4));
- }
-
-}
diff --git a/core-java/src/test/java/com/baeldung/regexp/optmization/OptimizedMatcherUnitTest.java b/core-java/src/test/java/com/baeldung/regexp/optmization/OptimizedMatcherManualTest.java
similarity index 65%
rename from core-java/src/test/java/com/baeldung/regexp/optmization/OptimizedMatcherUnitTest.java
rename to core-java/src/test/java/com/baeldung/regexp/optmization/OptimizedMatcherManualTest.java
index f21a755b01..f44968a5a7 100644
--- a/core-java/src/test/java/com/baeldung/regexp/optmization/OptimizedMatcherUnitTest.java
+++ b/core-java/src/test/java/com/baeldung/regexp/optmization/OptimizedMatcherManualTest.java
@@ -1,6 +1,5 @@
package com.baeldung.regexp.optmization;
-import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -12,15 +11,17 @@ import java.util.regex.Pattern;
import static org.junit.Assert.assertTrue;
-public class OptimizedMatcherUnitTest {
-
- private long time;
- private long mstimePreCompiled;
- private long mstimeNotPreCompiled;
+public class OptimizedMatcherManualTest {
private String action;
private List items;
+
+ private class TimeWrapper {
+ private long time;
+ private long mstimePreCompiled;
+ private long mstimeNotPreCompiled;
+ }
@Before
public void setup() {
@@ -48,27 +49,27 @@ public class OptimizedMatcherUnitTest {
@Test
public void givenANotPreCompiledAndAPreCompiledPatternA_whenMatcheItems_thenPreCompiledFasterThanNotPreCompiled() {
-
- testPatterns("A*");
- assertTrue(mstimePreCompiled < mstimeNotPreCompiled);
+ TimeWrapper timeObj = new TimeWrapper();
+ testPatterns("A*", timeObj);
+ assertTrue(timeObj.mstimePreCompiled < timeObj.mstimeNotPreCompiled);
}
@Test
public void givenANotPreCompiledAndAPreCompiledPatternABC_whenMatcheItems_thenPreCompiledFasterThanNotPreCompiled() {
-
- testPatterns("A*B*C*");
- assertTrue(mstimePreCompiled < mstimeNotPreCompiled);
+ TimeWrapper timeObj = new TimeWrapper();
+ testPatterns("A*B*C*", timeObj);
+ assertTrue(timeObj.mstimePreCompiled < timeObj.mstimeNotPreCompiled);
}
@Test
public void givenANotPreCompiledAndAPreCompiledPatternECWF_whenMatcheItems_thenPreCompiledFasterThanNotPreCompiled() {
-
- testPatterns("E*C*W*F*");
- assertTrue(mstimePreCompiled < mstimeNotPreCompiled);
+ TimeWrapper timeObj = new TimeWrapper();
+ testPatterns("E*C*W*F*", timeObj);
+ assertTrue(timeObj.mstimePreCompiled < timeObj.mstimeNotPreCompiled);
}
- private void testPatterns(String regex) {
- time = System.nanoTime();
+ private void testPatterns(String regex, TimeWrapper timeObj) {
+ timeObj.time = System.nanoTime();
int matched = 0;
int unmatched = 0;
@@ -83,10 +84,10 @@ public class OptimizedMatcherUnitTest {
this.action = "uncompiled: regex=" + regex + " matched=" + matched + " unmatched=" + unmatched;
- this.mstimeNotPreCompiled = (System.nanoTime() - time) / 1000000;
- System.out.println(this.action + ": " + mstimeNotPreCompiled + "ms");
+ timeObj.mstimeNotPreCompiled = (System.nanoTime() - timeObj.time) / 1000000;
+ System.out.println(this.action + ": " + timeObj.mstimeNotPreCompiled + "ms");
- time = System.nanoTime();
+ timeObj.time = System.nanoTime();
Matcher matcher = Pattern.compile(regex).matcher("");
matched = 0;
@@ -103,7 +104,7 @@ public class OptimizedMatcherUnitTest {
this.action = "compiled: regex=" + regex + " matched=" + matched + " unmatched=" + unmatched;
- this.mstimePreCompiled = (System.nanoTime() - time) / 1000000;
- System.out.println(this.action + ": " + mstimePreCompiled + "ms");
+ timeObj.mstimePreCompiled = (System.nanoTime() - timeObj.time) / 1000000;
+ System.out.println(this.action + ": " + timeObj.mstimePreCompiled + "ms");
}
}
diff --git a/core-java/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java b/core-java/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java
index 4ae7b77089..7e1fcd9b3d 100644
--- a/core-java/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java
+++ b/core-java/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java
@@ -25,7 +25,7 @@ public class SimpleDateFormatUnitTest {
@Test
public void givenSpecificDate_whenFormattedUsingDateFormat_thenCheckFormatCorrect() throws Exception {
- DateFormat formatter = DateFormat.getDateInstance(DateFormat.SHORT);
+ DateFormat formatter = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
assertEquals("5/24/77", formatter.format(new Date(233345223232L)));
}
diff --git a/core-java/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java b/core-java/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java
new file mode 100644
index 0000000000..d952d2383b
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java
@@ -0,0 +1,83 @@
+package com.baeldung.string;
+
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class StringReplaceAndRemoveUnitTest {
+
+
+ @Test
+ public void givenTestStrings_whenReplace_thenProcessedString() {
+
+ String master = "Hello World Baeldung!";
+ String target = "Baeldung";
+ String replacement = "Java";
+ String processed = master.replace(target, replacement);
+ assertTrue(processed.contains(replacement));
+ assertFalse(processed.contains(target));
+
+ }
+
+ @Test
+ public void givenTestStrings_whenReplaceAll_thenProcessedString() {
+
+ String master2 = "Welcome to Baeldung, Hello World Baeldung";
+ String regexTarget= "(Baeldung)$";
+ String replacement = "Java";
+ String processed2 = master2.replaceAll(regexTarget, replacement);
+ assertTrue(processed2.endsWith("Java"));
+
+ }
+
+ @Test
+ public void givenTestStrings_whenStringBuilderMethods_thenProcessedString() {
+
+ String master = "Hello World Baeldung!";
+ String target = "Baeldung";
+ String replacement = "Java";
+
+ int startIndex = master.indexOf(target);
+ int stopIndex = startIndex + target.length();
+
+ StringBuilder builder = new StringBuilder(master);
+
+
+ builder.delete(startIndex, stopIndex);
+ assertFalse(builder.toString().contains(target));
+
+
+ builder.replace(startIndex, stopIndex, replacement);
+ assertTrue(builder.toString().contains(replacement));
+
+
+ }
+
+
+ @Test
+ public void givenTestStrings_whenStringUtilsMethods_thenProcessedStrings() {
+
+ String master = "Hello World Baeldung!";
+ String target = "Baeldung";
+ String replacement = "Java";
+
+ String processed = StringUtils.replace(master, target, replacement);
+ assertTrue(processed.contains(replacement));
+
+ String master2 = "Hello World Baeldung!";
+ String target2 = "baeldung";
+ String processed2 = StringUtils.replaceIgnoreCase(master2, target2, replacement);
+ assertFalse(processed2.contains(target));
+
+ }
+
+
+
+
+
+
+
+}
diff --git a/core-java/src/test/resources/encoding.txt b/core-java/src/test/resources/encoding.txt
new file mode 100644
index 0000000000..e1cf027df0
--- /dev/null
+++ b/core-java/src/test/resources/encoding.txt
@@ -0,0 +1 @@
+The façade pattern is a software-design pattern commonly used with object-oriented programming.
\ No newline at end of file
diff --git a/core-kotlin/README.md b/core-kotlin/README.md
index ab9e96c2e1..1b04b71228 100644
--- a/core-kotlin/README.md
+++ b/core-kotlin/README.md
@@ -40,5 +40,10 @@
- [Converting Kotlin Data Class from JSON using GSON](https://www.baeldung.com/kotlin-json-convert-data-class)
- [Concatenate Strings in Kotlin](https://www.baeldung.com/kotlin-concatenate-strings)
- [Kotlin return, break, continue Keywords](https://www.baeldung.com/kotlin-return-break-continue)
-- [Mapping of Data Objects in Kotlin](https://www.baeldung.com/kotlin-data-objects-mapping)
+- [Mapping of Data Objects in Kotlin](https://www.baeldung.com/kotlin-data-objects)
- [Initializing Arrays in Kotlin](https://www.baeldung.com/kotlin-initialize-array)
+- [Threads vs Coroutines in Kotlin](https://www.baeldung.com/kotlin-threads-coroutines)
+- [Guide to Kotlin Interfaces](https://www.baeldung.com/kotlin-interfaces)
+- [Guide to Sorting in Kotlin](https://www.baeldung.com/kotlin-sort)
+- [Dependency Injection for Kotlin with Injekt](https://www.baeldung.com/kotlin-dependency-injection-with-injekt)
+- [Implementing a Binary Tree in Kotlin](https://www.baeldung.com/kotlin-binary-tree)
diff --git a/core-kotlin/pom.xml b/core-kotlin/pom.xml
index 5cdb5f700e..ed79ebc01b 100644
--- a/core-kotlin/pom.xml
+++ b/core-kotlin/pom.xml
@@ -3,6 +3,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
core-kotlin
+ core-kotlin
jar
@@ -18,6 +19,11 @@
commons-math3
${commons-math3.version}
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
org.junit.platform
junit-platform-runner
@@ -70,6 +76,7 @@
3.6.1
+ 3.8.1
1.1.1
5.2.0
3.10.0
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/generic/Reified.kt b/core-kotlin/src/main/kotlin/com/baeldung/generic/Reified.kt
new file mode 100644
index 0000000000..37a632fe41
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/generic/Reified.kt
@@ -0,0 +1,6 @@
+inline fun Iterable<*>.filterIsInstance() = filter { it is T }
+
+fun main(args: Array) {
+ val set = setOf("1984", 2, 3, "Brave new world", 11)
+ println(set.filterIsInstance())
+}
\ No newline at end of file
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/operators/Money.kt b/core-kotlin/src/main/kotlin/com/baeldung/operators/Money.kt
new file mode 100644
index 0000000000..93eb78c5b6
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/operators/Money.kt
@@ -0,0 +1,31 @@
+package com.baeldung.operators
+
+import java.math.BigDecimal
+
+enum class Currency {
+ DOLLARS, EURO
+}
+
+class Money(val amount: BigDecimal, val currency: Currency) : Comparable {
+
+ override fun compareTo(other: Money): Int =
+ convert(Currency.DOLLARS).compareTo(other.convert(Currency.DOLLARS))
+
+ fun convert(currency: Currency): BigDecimal = TODO()
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (other !is Money) return false
+
+ if (amount != other.amount) return false
+ if (currency != other.currency) return false
+
+ return true
+ }
+
+ override fun hashCode(): Int {
+ var result = amount.hashCode()
+ result = 31 * result + currency.hashCode()
+ return result
+ }
+}
\ No newline at end of file
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/operators/Page.kt b/core-kotlin/src/main/kotlin/com/baeldung/operators/Page.kt
new file mode 100644
index 0000000000..1077eb94f9
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/operators/Page.kt
@@ -0,0 +1,16 @@
+package com.baeldung.operators
+
+interface Page {
+ fun pageNumber(): Int
+ fun pageSize(): Int
+ fun elements(): MutableList
+}
+
+operator fun Page.get(index: Int): T = elements()[index]
+operator fun Page.get(start: Int, endExclusive: Int): List = elements().subList(start, endExclusive)
+operator fun Page.set(index: Int, value: T) {
+ elements()[index] = value
+}
+
+operator fun Page.contains(element: T): Boolean = element in elements()
+operator fun Page.iterator() = elements().iterator()
\ No newline at end of file
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/operators/Point.kt b/core-kotlin/src/main/kotlin/com/baeldung/operators/Point.kt
new file mode 100644
index 0000000000..e3282e64cc
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/operators/Point.kt
@@ -0,0 +1,31 @@
+package com.baeldung.operators
+
+data class Point(val x: Int, val y: Int)
+
+operator fun Point.unaryMinus() = Point(-x, -y)
+operator fun Point.not() = Point(y, x)
+operator fun Point.inc() = Point(x + 1, y + 1)
+operator fun Point.dec() = Point(x - 1, y - 1)
+
+operator fun Point.plus(other: Point): Point = Point(x + other.x, y + other.y)
+operator fun Point.minus(other: Point): Point = Point(x - other.x, y - other.y)
+operator fun Point.times(other: Point): Point = Point(x * other.x, y * other.y)
+operator fun Point.div(other: Point): Point = Point(x / other.x, y / other.y)
+operator fun Point.rem(other: Point): Point = Point(x % other.x, y % other.y)
+operator fun Point.times(factor: Int): Point = Point(x * factor, y * factor)
+operator fun Int.times(point: Point): Point = Point(point.x * this, point.y * this)
+
+class Shape {
+ val points = mutableListOf()
+
+ operator fun Point.unaryPlus() {
+ points.add(this)
+ }
+}
+
+fun shape(init: Shape.() -> Unit): Shape {
+ val shape = Shape()
+ shape.init()
+
+ return shape
+}
\ No newline at end of file
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/operators/Utils.kt b/core-kotlin/src/main/kotlin/com/baeldung/operators/Utils.kt
new file mode 100644
index 0000000000..0f16544f38
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/operators/Utils.kt
@@ -0,0 +1,8 @@
+package com.baeldung.operators
+
+import java.math.BigInteger
+
+operator fun MutableCollection.plusAssign(element: T) {
+ add(element)
+}
+operator fun BigInteger.plus(other: Int): BigInteger = add(BigInteger("$other"))
\ No newline at end of file
diff --git a/core-kotlin/src/test/kotlin/com/baeldung/operators/PageTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/operators/PageTest.kt
new file mode 100644
index 0000000000..4217fc0c08
--- /dev/null
+++ b/core-kotlin/src/test/kotlin/com/baeldung/operators/PageTest.kt
@@ -0,0 +1,28 @@
+package com.baeldung.operators
+
+import org.junit.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertTrue
+
+class PageTest {
+
+ private val page = PageImpl(1, 10, "Java", "Kotlin", "Scala")
+
+ @Test
+ fun `Get convention should work as expected`() {
+ assertEquals(page[1], "Kotlin")
+ assertEquals(page[1, 3], listOf("Kotlin", "Scala"))
+ }
+
+ @Test
+ fun `In convention should work on a page as expected`() {
+ assertTrue("Kotlin" in page)
+ }
+
+}
+
+private class PageImpl(val page: Int, val size: Int, vararg val elements: T) : Page {
+ override fun pageNumber(): Int = page
+ override fun pageSize(): Int = size
+ override fun elements(): MutableList = mutableListOf(*elements)
+}
\ No newline at end of file
diff --git a/core-kotlin/src/test/kotlin/com/baeldung/operators/PointTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/operators/PointTest.kt
new file mode 100644
index 0000000000..168ab6431d
--- /dev/null
+++ b/core-kotlin/src/test/kotlin/com/baeldung/operators/PointTest.kt
@@ -0,0 +1,48 @@
+package com.baeldung.operators
+
+import org.junit.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertTrue
+
+class PointTest {
+
+ private val p1 = Point(1, 2)
+ private val p2 = Point(2, 3)
+
+ @Test
+ fun `We should be able to add two points together using +`() {
+ assertEquals(p1 + p2, Point(3, 5))
+ }
+
+ @Test
+ fun `We shoud be able to subtract one point from another using -`() {
+ assertEquals(p1 - p2, Point(-1, -1))
+ }
+
+ @Test
+ fun `We should be able to multiply two points together with *`() {
+ assertEquals(p1 * p2, Point(2, 6))
+ }
+
+ @Test
+ fun `We should be able to divide one point by another`() {
+ assertEquals(p1 / p2, Point(0, 0))
+ }
+
+ @Test
+ fun `We should be able to scale a point by an integral factor`() {
+ assertEquals(p1 * 2, Point(2, 4))
+ assertEquals(2 * p1, Point(2, 4))
+ }
+
+ @Test
+ fun `We should be able to add points to an empty shape`() {
+ val line = shape {
+ +Point(0, 0)
+ +Point(1, 3)
+ }
+
+ assertTrue(Point(0, 0) in line.points)
+ assertTrue(Point(1, 3) in line.points)
+ }
+}
\ No newline at end of file
diff --git a/core-kotlin/src/test/kotlin/com/baeldung/operators/UtilsTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/operators/UtilsTest.kt
new file mode 100644
index 0000000000..4abe962cb5
--- /dev/null
+++ b/core-kotlin/src/test/kotlin/com/baeldung/operators/UtilsTest.kt
@@ -0,0 +1,13 @@
+package com.baeldung.operators
+
+import java.math.BigInteger
+import org.junit.Test
+import kotlin.test.assertEquals
+
+class UtilsTest {
+
+ @Test
+ fun `We should be able to add an int value to an existing BigInteger using +`() {
+ assertEquals(BigInteger.ZERO + 1, BigInteger.ONE)
+ }
+}
\ No newline at end of file
diff --git a/core-kotlin/src/test/kotlin/com/baeldung/random/RandomStringUnitTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/random/RandomStringUnitTest.kt
new file mode 100644
index 0000000000..62e8dfe720
--- /dev/null
+++ b/core-kotlin/src/test/kotlin/com/baeldung/random/RandomStringUnitTest.kt
@@ -0,0 +1,62 @@
+import org.apache.commons.lang3.RandomStringUtils
+import org.junit.Before
+import org.junit.jupiter.api.BeforeAll
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
+import java.security.SecureRandom
+import java.util.concurrent.ThreadLocalRandom
+import kotlin.experimental.and
+import kotlin.streams.asSequence
+import kotlin.test.assertEquals
+
+const val STRING_LENGTH = 10
+const val ALPHANUMERIC_REGEX = "[a-zA-Z0-9]+"
+
+class RandomStringUnitTest {
+ private val charPool : List = ('a'..'z') + ('A'..'Z') + ('0'..'9')
+
+ @Test
+ fun givenAStringLength_whenUsingJava_thenReturnAlphanumericString() {
+ var randomString = ThreadLocalRandom.current()
+ .ints(STRING_LENGTH.toLong(), 0, charPool.size)
+ .asSequence()
+ .map(charPool::get)
+ .joinToString("")
+
+ assert(randomString.matches(Regex(ALPHANUMERIC_REGEX)))
+ assertEquals(STRING_LENGTH, randomString.length)
+ }
+
+ @Test
+ fun givenAStringLength_whenUsingKotlin_thenReturnAlphanumericString() {
+ var randomString = (1..STRING_LENGTH).map { i -> kotlin.random.Random.nextInt(0, charPool.size) }
+ .map(charPool::get)
+ .joinToString("")
+
+ assert(randomString.matches(Regex(ALPHANUMERIC_REGEX)))
+ assertEquals(STRING_LENGTH, randomString.length)
+ }
+
+ @Test
+ fun givenAStringLength_whenUsingApacheCommon_thenReturnAlphanumericString() {
+ var randomString = RandomStringUtils.randomAlphanumeric(STRING_LENGTH)
+
+ assert(randomString.matches(Regex(ALPHANUMERIC_REGEX)))
+ assertEquals(STRING_LENGTH, randomString.length)
+ }
+
+ @Test
+ fun givenAStringLength_whenUsingRandomForBytes_thenReturnAlphanumericString() {
+ val random = SecureRandom()
+ val bytes = ByteArray(STRING_LENGTH)
+ random.nextBytes(bytes)
+
+ var randomString = (0..bytes.size - 1).map { i ->
+ charPool.get((bytes[i] and 0xFF.toByte() and (charPool.size-1).toByte()).toInt())
+ }.joinToString("")
+
+ assert(randomString.matches(Regex(ALPHANUMERIC_REGEX)))
+ assertEquals(STRING_LENGTH, randomString.length)
+ }
+
+}
\ No newline at end of file
diff --git a/core-scala/README.md b/core-scala/README.md
new file mode 100644
index 0000000000..eed344193f
--- /dev/null
+++ b/core-scala/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Introduction to Scala](https://www.baeldung.com/scala-intro)
diff --git a/core-scala/pom.xml b/core-scala/pom.xml
index eb7c1c3330..343f21484a 100644
--- a/core-scala/pom.xml
+++ b/core-scala/pom.xml
@@ -4,6 +4,7 @@
4.0.0
core-scala
1.0-SNAPSHOT
+ core-scala
jar
diff --git a/core-scala/src/main/scala/com/baeldung/scala/Employee.scala b/core-scala/src/main/scala/com/baeldung/scala/Employee.scala
index 397f166aa7..9291d958b3 100644
--- a/core-scala/src/main/scala/com/baeldung/scala/Employee.scala
+++ b/core-scala/src/main/scala/com/baeldung/scala/Employee.scala
@@ -22,6 +22,6 @@ class Employee(val name : String,
* A Trait which will make the toString return upper case value.
*/
trait UpperCasePrinter {
- override def toString = super.toString toUpperCase
+ override def toString: String = super.toString toUpperCase
}
diff --git a/core-scala/src/main/scala/com/baeldung/scala/HigherOrderFunctions.scala b/core-scala/src/main/scala/com/baeldung/scala/HigherOrderFunctions.scala
index df97013206..02c41a5f8c 100644
--- a/core-scala/src/main/scala/com/baeldung/scala/HigherOrderFunctions.scala
+++ b/core-scala/src/main/scala/com/baeldung/scala/HigherOrderFunctions.scala
@@ -11,7 +11,7 @@ object HigherOrderFunctions {
def mapReduce(r : (Int, Int) => Int,
i : Int,
m : Int => Int,
- a : Int, b : Int) = {
+ a : Int, b : Int): Int = {
def iter(a : Int, result : Int) : Int = {
if (a > b) result
else iter(a + 1, r(m(a), result))
diff --git a/core-scala/src/main/scala/com/baeldung/scala/Utils.scala b/core-scala/src/main/scala/com/baeldung/scala/Utils.scala
index 93cd3e697e..20bc413646 100644
--- a/core-scala/src/main/scala/com/baeldung/scala/Utils.scala
+++ b/core-scala/src/main/scala/com/baeldung/scala/Utils.scala
@@ -7,9 +7,9 @@ package com.baeldung.scala
*
*/
object Utils {
- def average(x : Double, y : Double) = (x + y) / 2
+ def average(x : Double, y : Double): Double = (x + y) / 2
- def randomLessThan(d : Double) = {
+ def randomLessThan(d : Double): Double = {
var random = 0d
do {
random = Math.random()
diff --git a/core-scala/src/test/scala/com/baeldung/scala/ControlStructuresDemoUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/ControlStructuresDemoUnitTest.scala
index 71422a8b4f..584038ee2c 100644
--- a/core-scala/src/test/scala/com/baeldung/scala/ControlStructuresDemoUnitTest.scala
+++ b/core-scala/src/test/scala/com/baeldung/scala/ControlStructuresDemoUnitTest.scala
@@ -1,32 +1,32 @@
package com.baeldung.scala
import com.baeldung.scala.ControlStructuresDemo._
-import org.junit.Test
import org.junit.Assert.assertEquals
+import org.junit.Test
class ControlStructuresDemoUnitTest {
@Test
- def givenTwoIntegers_whenGcdCalled_thenCorrectValueReturned = {
+ def givenTwoIntegers_whenGcdCalled_thenCorrectValueReturned() = {
assertEquals(3, gcd(15, 27))
}
@Test
- def givenTwoIntegers_whenGcdIterCalled_thenCorrectValueReturned = {
+ def givenTwoIntegers_whenGcdIterCalled_thenCorrectValueReturned() = {
assertEquals(3, gcdIter(15, 27))
}
@Test
- def givenTwoIntegers_whenRangeSumcalled_thenCorrectValueReturned = {
+ def givenTwoIntegers_whenRangeSumcalled_thenCorrectValueReturned() = {
assertEquals(55, rangeSum(1, 10))
}
@Test
- def givenPositiveInteger_whenFactorialInvoked_thenCorrectValueReturned = {
+ def givenPositiveInteger_whenFactorialInvoked_thenCorrectValueReturned() = {
assertEquals(720, factorial(6))
}
@Test
- def whenFactorialOf0Invoked_then1Returned = {
+ def whenFactorialOf0Invoked_then1Returned() = {
assertEquals(1, factorial(0))
}
diff --git a/core-scala/src/test/scala/com/baeldung/scala/EmployeeUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/EmployeeUnitTest.scala
index c51631dd2c..0828752a8a 100644
--- a/core-scala/src/test/scala/com/baeldung/scala/EmployeeUnitTest.scala
+++ b/core-scala/src/test/scala/com/baeldung/scala/EmployeeUnitTest.scala
@@ -6,20 +6,20 @@ import org.junit.Test
class EmployeeUnitTest {
@Test
- def whenEmployeeSalaryIncremented_thenCorrectSalary = {
+ def whenEmployeeSalaryIncremented_thenCorrectSalary() = {
val employee = new Employee("John Doe", 1000)
employee.incrementSalary()
assertEquals(1020, employee.salary)
}
@Test
- def givenEmployee_whenToStringCalled_thenCorrectStringReturned = {
+ def givenEmployee_whenToStringCalled_thenCorrectStringReturned() = {
val employee = new Employee("John Doe", 1000)
assertEquals("Employee(name=John Doe, salary=1000)", employee.toString)
}
@Test
- def givenEmployeeWithTrait_whenToStringCalled_thenCorrectStringReturned = {
+ def givenEmployeeWithTrait_whenToStringCalled_thenCorrectStringReturned() = {
val employee =
new Employee("John Doe", 1000) with UpperCasePrinter
assertEquals("EMPLOYEE(NAME=JOHN DOE, SALARY=1000)", employee.toString)
diff --git a/core-scala/src/test/scala/com/baeldung/scala/HigherOrderFunctionsUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/HigherOrderFunctionsUnitTest.scala
index 63530ecaf4..240c879d7f 100644
--- a/core-scala/src/test/scala/com/baeldung/scala/HigherOrderFunctionsUnitTest.scala
+++ b/core-scala/src/test/scala/com/baeldung/scala/HigherOrderFunctionsUnitTest.scala
@@ -1,14 +1,13 @@
package com.baeldung.scala
+import com.baeldung.scala.HigherOrderFunctions.mapReduce
import org.junit.Assert.assertEquals
import org.junit.Test
-import HigherOrderFunctions.mapReduce
-
class HigherOrderFunctionsUnitTest {
@Test
- def whenCalledWithSumAndSquareFunctions_thenCorrectValueReturned = {
+ def whenCalledWithSumAndSquareFunctions_thenCorrectValueReturned() = {
def square(x : Int) = x * x
def sum(x : Int, y : Int) = x + y
@@ -20,7 +19,7 @@ class HigherOrderFunctionsUnitTest {
}
@Test
- def whenComputingSumOfSquaresWithAnonymousFunctions_thenCorrectValueReturned = {
+ def whenComputingSumOfSquaresWithAnonymousFunctions_thenCorrectValueReturned() = {
def sumSquares(a : Int, b : Int) =
mapReduce((x, y) => x + y, 0, x => x * x, a, b)
@@ -28,7 +27,7 @@ class HigherOrderFunctionsUnitTest {
}
@Test
- def givenCurriedFunctions_whenInvoked_thenCorrectValueReturned = {
+ def givenCurriedFunctions_whenInvoked_thenCorrectValueReturned() = {
// a curried function
def sum(f : Int => Int)(a : Int,
b : Int) : Int =
diff --git a/core-scala/src/test/scala/com/baeldung/scala/IntSetUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/IntSetUnitTest.scala
index 5cc19e9215..ac27389d70 100644
--- a/core-scala/src/test/scala/com/baeldung/scala/IntSetUnitTest.scala
+++ b/core-scala/src/test/scala/com/baeldung/scala/IntSetUnitTest.scala
@@ -1,14 +1,12 @@
package com.baeldung.scala
-import scala.Range
-
import org.junit.Assert.assertFalse
import org.junit.Test
class IntSetUnitTest {
@Test
- def givenSetof1To10_whenContains11Called_thenFalse = {
+ def givenSetof1To10_whenContains11Called_thenFalse() = {
// Set up a set containing integers 1 to 10.
val set1To10 =
diff --git a/core-scala/src/test/scala/com/baeldung/scala/UtilsUnitTest.scala b/core-scala/src/test/scala/com/baeldung/scala/UtilsUnitTest.scala
index 47f9873aad..e4995201d8 100644
--- a/core-scala/src/test/scala/com/baeldung/scala/UtilsUnitTest.scala
+++ b/core-scala/src/test/scala/com/baeldung/scala/UtilsUnitTest.scala
@@ -1,34 +1,29 @@
package com.baeldung.scala
-import org.junit.Assert.assertEquals
-import org.junit.Assert.assertTrue
+import com.baeldung.scala.Utils.{average, fibonacci, power, randomLessThan}
+import org.junit.Assert.{assertEquals, assertTrue}
import org.junit.Test
-import Utils.average
-import Utils.fibonacci
-import Utils.power
-import Utils.randomLessThan
-
class UtilsUnitTest {
@Test
- def whenAverageCalled_thenCorrectValueReturned() = {
+ def whenAverageCalled_thenCorrectValueReturned(): Unit = {
assertEquals(15.0, average(10, 20), 1e-5)
}
@Test
- def whenRandomLessThanInvokedWithANumber_thenARandomLessThanItReturned = {
+ def whenRandomLessThanInvokedWithANumber_thenARandomLessThanItReturned: Unit = {
val d = 0.1
assertTrue(randomLessThan(d) < d)
}
@Test
- def whenPowerInvokedWith2And3_then8Returned = {
+ def whenPowerInvokedWith2And3_then8Returned: Unit = {
assertEquals(8, power(2, 3))
}
@Test
- def whenFibonacciCalled_thenCorrectValueReturned = {
+ def whenFibonacciCalled_thenCorrectValueReturned: Unit = {
assertEquals(1, fibonacci(0))
assertEquals(1, fibonacci(1))
assertEquals(fibonacci(6),
diff --git a/data-structures/pom.xml b/data-structures/pom.xml
index c1a1f1d371..4958598234 100644
--- a/data-structures/pom.xml
+++ b/data-structures/pom.xml
@@ -1,9 +1,9 @@
4.0.0
- com.baeldung
data-structures
0.0.1-SNAPSHOT
+ data-structures
com.baeldung
diff --git a/ddd/README.md b/ddd/README.md
new file mode 100644
index 0000000000..60f3a43086
--- /dev/null
+++ b/ddd/README.md
@@ -0,0 +1,3 @@
+### Relevant articles
+
+- [Persisting DDD Aggregates](https://www.baeldung.com/spring-persisting-ddd-aggregates)
diff --git a/ddd/pom.xml b/ddd/pom.xml
new file mode 100644
index 0000000000..a61ae24e92
--- /dev/null
+++ b/ddd/pom.xml
@@ -0,0 +1,91 @@
+
+ 4.0.0
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.6.RELEASE
+
+
+
+ com.baeldung.ddd
+ ddd
+ 0.0.1-SNAPSHOT
+ jar
+ ddd
+ DDD series examples
+
+
+ 1.0.1
+ 2.22.0
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-mongodb
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ test
+
+
+
+
+ org.junit.platform
+ junit-platform-launcher
+ ${junit-platform.version}
+ test
+
+
+ org.joda
+ joda-money
+ ${joda-money.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ com.h2database
+ h2
+ runtime
+
+
+ mysql
+ mysql-connector-java
+ runtime
+
+
+ org.postgresql
+ postgresql
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ de.flapdoodle.embed
+ de.flapdoodle.embed.mongo
+ test
+
+
+
\ No newline at end of file
diff --git a/ddd/src/main/java/com/baeldung/ddd/PersistingDddAggregatesApplication.java b/ddd/src/main/java/com/baeldung/ddd/PersistingDddAggregatesApplication.java
new file mode 100644
index 0000000000..cd9be34278
--- /dev/null
+++ b/ddd/src/main/java/com/baeldung/ddd/PersistingDddAggregatesApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.ddd;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class PersistingDddAggregatesApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(PersistingDddAggregatesApplication.class, args);
+ }
+}
diff --git a/ddd/src/main/java/com/baeldung/ddd/order/Order.java b/ddd/src/main/java/com/baeldung/ddd/order/Order.java
new file mode 100644
index 0000000000..125bc5fe2d
--- /dev/null
+++ b/ddd/src/main/java/com/baeldung/ddd/order/Order.java
@@ -0,0 +1,52 @@
+package com.baeldung.ddd.order;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.joda.money.Money;
+
+public class Order {
+ private final List orderLines;
+ private Money totalCost;
+
+ public Order(List orderLines) {
+ checkNotNull(orderLines);
+ if (orderLines.isEmpty()) {
+ throw new IllegalArgumentException("Order must have at least one order line item");
+ }
+ this.orderLines = new ArrayList<>(orderLines);
+ totalCost = calculateTotalCost();
+ }
+
+ public void addLineItem(OrderLine orderLine) {
+ checkNotNull(orderLine);
+ orderLines.add(orderLine);
+ totalCost = totalCost.plus(orderLine.cost());
+ }
+
+ public List getOrderLines() {
+ return new ArrayList<>(orderLines);
+ }
+
+ public void removeLineItem(int line) {
+ OrderLine removedLine = orderLines.remove(line);
+ totalCost = totalCost.minus(removedLine.cost());
+ }
+
+ public Money totalCost() {
+ return totalCost;
+ }
+
+ private Money calculateTotalCost() {
+ return orderLines.stream()
+ .map(OrderLine::cost)
+ .reduce(Money::plus)
+ .get();
+ }
+
+ private static void checkNotNull(Object par) {
+ if (par == null) {
+ throw new NullPointerException("Parameter cannot be null");
+ }
+ }
+}
diff --git a/ddd/src/main/java/com/baeldung/ddd/order/OrderLine.java b/ddd/src/main/java/com/baeldung/ddd/order/OrderLine.java
new file mode 100644
index 0000000000..000f55f2fb
--- /dev/null
+++ b/ddd/src/main/java/com/baeldung/ddd/order/OrderLine.java
@@ -0,0 +1,67 @@
+package com.baeldung.ddd.order;
+
+import org.joda.money.Money;
+
+public class OrderLine {
+ private final Product product;
+ private final int quantity;
+
+ public OrderLine(Product product, int quantity) {
+ super();
+ this.product = product;
+ this.quantity = quantity;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ OrderLine other = (OrderLine) obj;
+ if (product == null) {
+ if (other.product != null) {
+ return false;
+ }
+ } else if (!product.equals(other.product)) {
+ return false;
+ }
+ if (quantity != other.quantity) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((product == null) ? 0 : product.hashCode());
+ result = prime * result + quantity;
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "OrderLine [product=" + product + ", quantity=" + quantity + "]";
+ }
+
+ Money cost() {
+ return product.getPrice()
+ .multipliedBy(quantity);
+ }
+
+ Product getProduct() {
+ return product;
+ }
+
+ int getQuantity() {
+ return quantity;
+ }
+
+}
diff --git a/ddd/src/main/java/com/baeldung/ddd/order/Product.java b/ddd/src/main/java/com/baeldung/ddd/order/Product.java
new file mode 100644
index 0000000000..0afcaa434f
--- /dev/null
+++ b/ddd/src/main/java/com/baeldung/ddd/order/Product.java
@@ -0,0 +1,52 @@
+package com.baeldung.ddd.order;
+
+import org.joda.money.Money;
+
+public class Product {
+ private final Money price;
+
+ public Product(Money price) {
+ super();
+ this.price = price;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ Product other = (Product) obj;
+ if (price == null) {
+ if (other.price != null) {
+ return false;
+ }
+ } else if (!price.equals(other.price)) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((price == null) ? 0 : price.hashCode());
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "Product [price=" + price + "]";
+ }
+
+ Money getPrice() {
+ return price;
+ }
+
+}
diff --git a/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java b/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java
new file mode 100644
index 0000000000..ed11b0dca4
--- /dev/null
+++ b/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java
@@ -0,0 +1,111 @@
+package com.baeldung.ddd.order.jpa;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.ElementCollection;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "order_table")
+class JpaOrder {
+ private String currencyUnit;
+ @Id
+ @GeneratedValue
+ private Long id;
+ @ElementCollection(fetch = FetchType.EAGER)
+ private final List orderLines;
+ private BigDecimal totalCost;
+
+ JpaOrder() {
+ totalCost = null;
+ orderLines = new ArrayList<>();
+ }
+
+ JpaOrder(List orderLines) {
+ checkNotNull(orderLines);
+ if (orderLines.isEmpty()) {
+ throw new IllegalArgumentException("Order must have at least one order line item");
+ }
+ this.orderLines = new ArrayList<>(orderLines);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ JpaOrder other = (JpaOrder) obj;
+ if (id == null) {
+ if (other.id != null) {
+ return false;
+ }
+ } else if (!id.equals(other.id)) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "JpaOrder [currencyUnit=" + currencyUnit + ", id=" + id + ", orderLines=" + orderLines + ", totalCost=" + totalCost + "]";
+ }
+
+ void addLineItem(JpaOrderLine orderLine) {
+ checkNotNull(orderLine);
+ orderLines.add(orderLine);
+ }
+
+ String getCurrencyUnit() {
+ return currencyUnit;
+ }
+
+ Long getId() {
+ return id;
+ }
+
+ List getOrderLines() {
+ return new ArrayList<>(orderLines);
+ }
+
+ BigDecimal getTotalCost() {
+ return totalCost;
+ }
+
+ void removeLineItem(int line) {
+ JpaOrderLine removedLine = orderLines.remove(line);
+ }
+
+ void setCurrencyUnit(String currencyUnit) {
+ this.currencyUnit = currencyUnit;
+ }
+
+ void setTotalCost(BigDecimal totalCost) {
+ this.totalCost = totalCost;
+ }
+
+ private static void checkNotNull(Object par) {
+ if (par == null) {
+ throw new NullPointerException("Parameter cannot be null");
+ }
+ }
+}
diff --git a/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java b/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java
new file mode 100644
index 0000000000..a3b50f0502
--- /dev/null
+++ b/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java
@@ -0,0 +1,70 @@
+package com.baeldung.ddd.order.jpa;
+
+import javax.persistence.Embeddable;
+import javax.persistence.Embedded;
+
+@Embeddable
+class JpaOrderLine {
+ @Embedded
+ private final JpaProduct product;
+ private final int quantity;
+
+ JpaOrderLine() {
+ quantity = 0;
+ product = null;
+ }
+
+ JpaOrderLine(JpaProduct product, int quantity) {
+ super();
+ this.product = product;
+ this.quantity = quantity;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ JpaOrderLine other = (JpaOrderLine) obj;
+ if (product == null) {
+ if (other.product != null) {
+ return false;
+ }
+ } else if (!product.equals(other.product)) {
+ return false;
+ }
+ if (quantity != other.quantity) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((product == null) ? 0 : product.hashCode());
+ result = prime * result + quantity;
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "JpaOrderLine [product=" + product + ", quantity=" + quantity + "]";
+ }
+
+ JpaProduct getProduct() {
+ return product;
+ }
+
+ int getQuantity() {
+ return quantity;
+ }
+
+}
diff --git a/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderRepository.java b/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderRepository.java
new file mode 100644
index 0000000000..b6e08e8372
--- /dev/null
+++ b/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderRepository.java
@@ -0,0 +1,7 @@
+package com.baeldung.ddd.order.jpa;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface JpaOrderRepository extends JpaRepository {
+
+}
diff --git a/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java b/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java
new file mode 100644
index 0000000000..61e67fa12a
--- /dev/null
+++ b/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java
@@ -0,0 +1,79 @@
+package com.baeldung.ddd.order.jpa;
+
+import java.math.BigDecimal;
+
+import javax.persistence.Embeddable;
+
+@Embeddable
+class JpaProduct {
+ private String currencyUnit;
+ private BigDecimal price;
+
+ public JpaProduct() {
+ }
+
+ public JpaProduct(BigDecimal price, String currencyUnit) {
+ super();
+ this.price = price;
+ currencyUnit = currencyUnit;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ JpaProduct other = (JpaProduct) obj;
+ if (currencyUnit == null) {
+ if (other.currencyUnit != null) {
+ return false;
+ }
+ } else if (!currencyUnit.equals(other.currencyUnit)) {
+ return false;
+ }
+ if (price == null) {
+ if (other.price != null) {
+ return false;
+ }
+ } else if (!price.equals(other.price)) {
+ return false;
+ }
+ return true;
+ }
+
+ public String getCurrencyUnit() {
+ return currencyUnit;
+ }
+
+ public BigDecimal getPrice() {
+ return price;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((currencyUnit == null) ? 0 : currencyUnit.hashCode());
+ result = prime * result + ((price == null) ? 0 : price.hashCode());
+ return result;
+ }
+
+ public void setCurrencyUnit(String currencyUnit) {
+ this.currencyUnit = currencyUnit;
+ }
+
+ public void setPrice(BigDecimal price) {
+ this.price = price;
+ }
+
+ @Override
+ public String toString() {
+ return "JpaProduct [currencyUnit=" + currencyUnit + ", price=" + price + "]";
+ }
+}
diff --git a/ddd/src/main/java/com/baeldung/ddd/order/mongo/OrderMongoRepository.java b/ddd/src/main/java/com/baeldung/ddd/order/mongo/OrderMongoRepository.java
new file mode 100644
index 0000000000..79f9ec9f21
--- /dev/null
+++ b/ddd/src/main/java/com/baeldung/ddd/order/mongo/OrderMongoRepository.java
@@ -0,0 +1,9 @@
+package com.baeldung.ddd.order.mongo;
+
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+import com.baeldung.ddd.order.Order;
+
+public interface OrderMongoRepository extends MongoRepository {
+
+}
diff --git a/ddd/src/test/java/com/baeldung/ddd/order/OrderTest.java b/ddd/src/test/java/com/baeldung/ddd/order/OrderTest.java
new file mode 100644
index 0000000000..431a6a5293
--- /dev/null
+++ b/ddd/src/test/java/com/baeldung/ddd/order/OrderTest.java
@@ -0,0 +1,70 @@
+package com.baeldung.ddd.order;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.catchThrowable;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.joda.money.CurrencyUnit;
+import org.joda.money.Money;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+class OrderTest {
+ @DisplayName("given order with two items, when calculate total cost, then sum is returned")
+ @Test
+ void test0() throws Exception {
+ // given
+ OrderLine ol0 = new OrderLine(new Product(Money.of(CurrencyUnit.USD, 10.00)), 2);
+ OrderLine ol1 = new OrderLine(new Product(Money.of(CurrencyUnit.USD, 5.00)), 10);
+ Order order = new Order(Arrays.asList(ol0, ol1));
+
+ // when
+ Money totalCost = order.totalCost();
+
+ // then
+ assertThat(totalCost).isEqualTo(Money.of(CurrencyUnit.USD, 70.00));
+ }
+
+ @DisplayName("when create order without line items, then exception is thrown")
+ @Test
+ void test1() throws Exception {
+ // when
+ Throwable throwable = catchThrowable(() -> new Order(new ArrayList<>()));
+
+ // then
+ assertThat(throwable).isInstanceOf(IllegalArgumentException.class);
+ }
+
+ @DisplayName("given order with two line items, when add another line item, then total cost is updated")
+ @Test
+ void test2() throws Exception {
+ // given
+ OrderLine ol0 = new OrderLine(new Product(Money.of(CurrencyUnit.USD, 10.00)), 1);
+ OrderLine ol1 = new OrderLine(new Product(Money.of(CurrencyUnit.USD, 5.00)), 1);
+ Order order = new Order(Arrays.asList(ol0, ol1));
+
+ // when
+ order.addLineItem(new OrderLine(new Product(Money.of(CurrencyUnit.USD, 20.00)), 2));
+
+ // then
+ assertThat(order.totalCost()).isEqualTo(Money.of(CurrencyUnit.USD, 55));
+ }
+
+ @DisplayName("given order with three line items, when remove item, then total cost is updated")
+ @Test
+ void test3() throws Exception {
+ // given
+ OrderLine ol0 = new OrderLine(new Product(Money.of(CurrencyUnit.USD, 10.00)), 1);
+ OrderLine ol1 = new OrderLine(new Product(Money.of(CurrencyUnit.USD, 20.00)), 1);
+ OrderLine ol2 = new OrderLine(new Product(Money.of(CurrencyUnit.USD, 30.00)), 1);
+ Order order = new Order(Arrays.asList(ol0, ol1, ol2));
+
+ // when
+ order.removeLineItem(1);
+
+ // then
+ assertThat(order.totalCost()).isEqualTo(Money.of(CurrencyUnit.USD, 40.00));
+ }
+}
diff --git a/ddd/src/test/java/com/baeldung/ddd/order/jpa/PersistOrderIntegrationTest.java b/ddd/src/test/java/com/baeldung/ddd/order/jpa/PersistOrderIntegrationTest.java
new file mode 100644
index 0000000000..c503c9960b
--- /dev/null
+++ b/ddd/src/test/java/com/baeldung/ddd/order/jpa/PersistOrderIntegrationTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.ddd.order.jpa;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
+
+@SpringJUnitConfig
+@SpringBootTest
+public class PersistOrderIntegrationTest {
+ @Autowired
+ private JpaOrderRepository repository;
+
+ @DisplayName("given order with two line items, when persist, then order is saved")
+ @Test
+ public void test() throws Exception {
+ // given
+ JpaOrder order = prepareTestOrderWithTwoLineItems();
+
+ // when
+ JpaOrder savedOrder = repository.save(order);
+
+ // then
+ JpaOrder foundOrder = repository.findById(savedOrder.getId())
+ .get();
+ assertThat(foundOrder.getOrderLines()).hasSize(2);
+ }
+
+ private JpaOrder prepareTestOrderWithTwoLineItems() {
+ JpaOrderLine ol0 = new JpaOrderLine(new JpaProduct(BigDecimal.valueOf(10.00), "USD"), 2);
+ JpaOrderLine ol1 = new JpaOrderLine(new JpaProduct(BigDecimal.valueOf(5.00), "USD"), 10);
+ return new JpaOrder(Arrays.asList(ol0, ol1));
+ }
+}
diff --git a/ddd/src/test/java/com/baeldung/ddd/order/jpa/ViolateOrderBusinessRulesTest.java b/ddd/src/test/java/com/baeldung/ddd/order/jpa/ViolateOrderBusinessRulesTest.java
new file mode 100644
index 0000000000..3eda9250f9
--- /dev/null
+++ b/ddd/src/test/java/com/baeldung/ddd/order/jpa/ViolateOrderBusinessRulesTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.ddd.order.jpa;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.math.BigDecimal;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+public class ViolateOrderBusinessRulesTest {
+ @DisplayName("given two non-zero order line items, when create an order with them, it's possible to set total cost to zero")
+ @Test
+ void test() throws Exception {
+ // given
+ // available products
+ JpaProduct lungChingTea = new JpaProduct(BigDecimal.valueOf(10.00), "USD");
+ JpaProduct gyokuroMiyazakiTea = new JpaProduct(BigDecimal.valueOf(20.00), "USD");
+ // Lung Ching tea order line
+ JpaOrderLine orderLine0 = new JpaOrderLine(lungChingTea, 2);
+ // Gyokuro Miyazaki tea order line
+ JpaOrderLine orderLine1 = new JpaOrderLine(gyokuroMiyazakiTea, 3);
+
+ // when
+ // create the order
+ JpaOrder order = new JpaOrder();
+ order.addLineItem(orderLine0);
+ order.addLineItem(orderLine1);
+ order.setTotalCost(BigDecimal.ZERO);
+ order.setCurrencyUnit("USD");
+
+ // then
+ // this doesn't look good...
+ assertThat(order.getTotalCost()).isEqualTo(BigDecimal.ZERO);
+ }
+}
diff --git a/ddd/src/test/java/com/baeldung/ddd/order/mongo/OrderMongoIntegrationTest.java b/ddd/src/test/java/com/baeldung/ddd/order/mongo/OrderMongoIntegrationTest.java
new file mode 100644
index 0000000000..ca4315c416
--- /dev/null
+++ b/ddd/src/test/java/com/baeldung/ddd/order/mongo/OrderMongoIntegrationTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.ddd.order.mongo;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.joda.money.CurrencyUnit;
+import org.joda.money.Money;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
+
+import com.baeldung.ddd.order.Order;
+import com.baeldung.ddd.order.OrderLine;
+import com.baeldung.ddd.order.Product;
+
+@SpringJUnitConfig
+@SpringBootTest
+public class OrderMongoIntegrationTest {
+ @Autowired
+ private OrderMongoRepository repo;
+
+ @DisplayName("given order with two line items, when persist using mongo repository, then order is saved")
+ @Test
+ void test() throws Exception {
+ // given
+ Order order = prepareTestOrderWithTwoLineItems();
+
+ // when
+ repo.save(order);
+
+ // then
+ List foundOrders = repo.findAll();
+ assertThat(foundOrders).hasSize(1);
+ List foundOrderLines = foundOrders.iterator()
+ .next()
+ .getOrderLines();
+ assertThat(foundOrderLines).hasSize(2);
+ assertThat(foundOrderLines).containsOnlyElementsOf(order.getOrderLines());
+ }
+
+ private Order prepareTestOrderWithTwoLineItems() {
+ OrderLine ol0 = new OrderLine(new Product(Money.of(CurrencyUnit.USD, 10.00)), 2);
+ OrderLine ol1 = new OrderLine(new Product(Money.of(CurrencyUnit.USD, 5.00)), 10);
+ return new Order(Arrays.asList(ol0, ol1));
+ }
+}
diff --git a/drools/pom.xml b/drools/pom.xml
index 009ac8acec..b5cfc7d6dc 100644
--- a/drools/pom.xml
+++ b/drools/pom.xml
@@ -3,7 +3,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
drools
-
+ drools
+
com.baeldung
parent-spring-4
diff --git a/dubbo/pom.xml b/dubbo/pom.xml
index 6f81ec5cff..9fe228bf89 100644
--- a/dubbo/pom.xml
+++ b/dubbo/pom.xml
@@ -2,6 +2,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
dubbo
+ dubbo
parent-modules
diff --git a/ejb/README.md b/ejb/README.md
deleted file mode 100644
index f47277bf8f..0000000000
--- a/ejb/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-## Relevant articles:
-
-- [Guide to EJB Set-up](http://www.baeldung.com/ejb-intro)
-- [Java EE Session Beans](http://www.baeldung.com/ejb-session-beans)
-- [Introduction to EJB JNDI Lookup on WildFly Application Server](http://www.baeldung.com/wildfly-ejb-jndi)
-- [A Guide to Message Driven Beans in EJB](http://www.baeldung.com/ejb-message-driven-beans)
diff --git a/ejb/ejb-client/pom.xml b/ejb/ejb-client/pom.xml
deleted file mode 100755
index 6231030cec..0000000000
--- a/ejb/ejb-client/pom.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
- 4.0.0
- ejb-client
- EJB3 Client Maven
-
-
- com.baeldung.ejb
- ejb
- 1.0-SNAPSHOT
-
-
-
-
- org.wildfly
- wildfly-ejb-client-bom
- pom
-
-
- com.baeldung.ejb
- ejb-remote
- ejb
-
-
-
\ No newline at end of file
diff --git a/ejb/ejb-remote/src/main/resources/META-INF/ejb-jar.xml b/ejb/ejb-remote/src/main/resources/META-INF/ejb-jar.xml
deleted file mode 100755
index d6c2200198..0000000000
--- a/ejb/ejb-remote/src/main/resources/META-INF/ejb-jar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
- remote
-
-
diff --git a/ejb/ejb-session-beans/pom.xml b/ejb/ejb-session-beans/pom.xml
deleted file mode 100644
index da76169729..0000000000
--- a/ejb/ejb-session-beans/pom.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-
- 4.0.0
- ejb-session-beans
-
-
- com.baeldung.ejb
- ejb
- 1.0-SNAPSHOT
-
-
-
-
-
- org.jboss.arquillian
- arquillian-bom
- ${arquillian-bom.version}
- import
- pom
-
-
-
-
-
-
- javax
- javaee-api
- provided
-
-
- org.jboss.arquillian.junit
- arquillian-junit-container
- test
-
-
-
-
-
- arquillian-glassfish-embedded
-
- true
-
-
-
- org.jboss.arquillian.container
- arquillian-glassfish-embedded-3.1
- ${arquillian-glassfish-embedded-3.1.version}
- test
-
-
- org.glassfish.main.extras
- glassfish-embedded-all
- ${glassfish-embedded-all.version}
- test
-
-
-
-
-
-
-
-
- maven-war-plugin
- ${maven-war-plugin.version}
-
- false
-
-
-
-
-
-
- UTF-8
- 1.1.13.Final
- 2.2.6
- 1.1.12.Final
- 1.0.0.Final
- 4.12
- 7.0
- 1.0.0.CR4
- 3.1.2
-
-
-
\ No newline at end of file
diff --git a/ejb/pom.xml b/ejb/pom.xml
deleted file mode 100755
index 4cb700d087..0000000000
--- a/ejb/pom.xml
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
- 4.0.0
- com.baeldung.ejb
- ejb
- 1.0-SNAPSHOT
- pom
- ejb
- EJB Tutorial
-
-
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
-
-
-
- ejb-remote
- ejb-session-beans
-
-
-
-
-
- com.baeldung.ejb
- ejb-remote
- ${ejb-remote.version}
- ejb
-
-
- com.baeldung.ejb
- ejb-session-beans
- ${ejb-session-beans.version}
- ejb
-
-
- javax
- javaee-api
- ${javaee-api.version}
- provided
-
-
- org.wildfly
- wildfly-ejb-client-bom
- ${wildfly-ejb-client-bom.version}
- pom
- import
-
-
-
-
-
-
-
-
- maven-ejb-plugin
- ${maven-ejb-plugin.version}
-
- ${ejbVersion}
-
-
-
-
-
-
-
-
- jboss-public-repository-group
- JBoss Public Maven Repository Group
- http://repository.jboss.org/nexus/content/groups/public/
- default
-
- true
- never
-
-
- true
- never
-
-
-
-
-
- 2.5.7
- 3.4.11
- 0.10
- 2.19.1
- 1.0-SNAPSHOT
- 1.0-SNAPSHOT
- 7.0
- 2.4
- 3.2
- 10.1.0.Final
-
-
-
\ No newline at end of file
diff --git a/ejb/wildfly/wildfly-jpa/src/main/resources/logback.xml b/ejb/wildfly/wildfly-jpa/src/main/resources/logback.xml
deleted file mode 100644
index 7d900d8ea8..0000000000
--- a/ejb/wildfly/wildfly-jpa/src/main/resources/logback.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
- %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/flyway-cdi-extension/pom.xml b/flyway-cdi-extension/pom.xml
index c6ee26f783..dbb32f1e5a 100644
--- a/flyway-cdi-extension/pom.xml
+++ b/flyway-cdi-extension/pom.xml
@@ -3,10 +3,10 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
com.baeldung
flyway-cdi-extension
1.0-SNAPSHOT
+ flyway-cdi-extension
1.8
diff --git a/gradle/README.md b/gradle/README.md
index 229466dfec..a1f5c74c57 100644
--- a/gradle/README.md
+++ b/gradle/README.md
@@ -4,3 +4,4 @@
- [Creating a Fat Jar in Gradle](http://www.baeldung.com/gradle-fat-jar)
- [A Custom Task in Gradle](http://www.baeldung.com/gradle-custom-task)
- [Kotlin Dependency Injection with Kodein](http://www.baeldung.com/kotlin-kodein-dependency-injection)
+- [Using JUnit 5 with Gradle](https://www.baeldung.com/junit-5-gradle)
diff --git a/grpc/pom.xml b/grpc/pom.xml
index 949f26d376..725bec3e70 100644
--- a/grpc/pom.xml
+++ b/grpc/pom.xml
@@ -71,9 +71,8 @@
- 1.5.0
- 1.5.0.Final
- 0.5.0
+ 1.16.1
+ 1.6.1
+ 0.6.1
-
diff --git a/grpc/src/main/java/org/baeldung/grpc/client/GrpcClient.java b/grpc/src/main/java/org/baeldung/grpc/client/GrpcClient.java
index 1a1809387f..f653e17910 100644
--- a/grpc/src/main/java/org/baeldung/grpc/client/GrpcClient.java
+++ b/grpc/src/main/java/org/baeldung/grpc/client/GrpcClient.java
@@ -10,7 +10,7 @@ import io.grpc.ManagedChannelBuilder;
public class GrpcClient {
public static void main(String[] args) throws InterruptedException {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8080)
- .usePlaintext(true)
+ .usePlaintext()
.build();
HelloServiceGrpc.HelloServiceBlockingStub stub
diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaRangeMapUnitTest.java b/guava-collections/src/test/java/org/baeldung/guava/GuavaRangeMapUnitTest.java
index 81ba72373c..c0c5efea23 100644
--- a/guava-collections/src/test/java/org/baeldung/guava/GuavaRangeMapUnitTest.java
+++ b/guava-collections/src/test/java/org/baeldung/guava/GuavaRangeMapUnitTest.java
@@ -2,6 +2,9 @@ package org.baeldung.guava;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
import java.util.Map;
import org.junit.Test;
import com.google.common.collect.ImmutableRangeMap;
@@ -98,8 +101,9 @@ public class GuavaRangeMapUnitTest {
final RangeMap experiencedSubRangeDesignationMap = experienceRangeDesignationMap.subRangeMap(Range.closed(4, 14));
assertNull(experiencedSubRangeDesignationMap.get(3));
- assertEquals("Executive Director", experiencedSubRangeDesignationMap.get(14));
- assertEquals("Vice President", experiencedSubRangeDesignationMap.get(7));
+ assertTrue(experiencedSubRangeDesignationMap.asMapOfRanges().values()
+ .containsAll(Arrays.asList("Executive Director", "Vice President", "Executive Director")));
+
}
@Test
diff --git a/guava-modules/guava-18/pom.xml b/guava-modules/guava-18/pom.xml
index ce9395fbf4..d55aa9ce82 100644
--- a/guava-modules/guava-18/pom.xml
+++ b/guava-modules/guava-18/pom.xml
@@ -2,10 +2,10 @@
4.0.0
- com.baeldung
guava-18
0.1.0-SNAPSHOT
-
+ guava-18
+
com.baeldung
parent-java
diff --git a/guava-modules/guava-19/pom.xml b/guava-modules/guava-19/pom.xml
index 5dfb4d2cec..0548bb0c1f 100644
--- a/guava-modules/guava-19/pom.xml
+++ b/guava-modules/guava-19/pom.xml
@@ -2,10 +2,10 @@
4.0.0
- com.baeldung
guava-19
0.1.0-SNAPSHOT
-
+ guava-19
+
com.baeldung
parent-java
diff --git a/guava-modules/guava-21/pom.xml b/guava-modules/guava-21/pom.xml
index 945b7c27c1..bdb1058a48 100644
--- a/guava-modules/guava-21/pom.xml
+++ b/guava-modules/guava-21/pom.xml
@@ -4,7 +4,8 @@
4.0.0
guava-21
1.0-SNAPSHOT
-
+ guava-21
+
com.baeldung
parent-java
diff --git a/guest/core-java-9/pom.xml b/guest/core-java-9/pom.xml
index e9271b42ff..3847c19d16 100644
--- a/guest/core-java-9/pom.xml
+++ b/guest/core-java-9/pom.xml
@@ -4,7 +4,8 @@
com.stackify
core-java-9
0.0.1-SNAPSHOT
-
+ core-java-9
+
com.baeldung
parent-modules
diff --git a/guest/core-java/pom.xml b/guest/core-java/pom.xml
index 787dd764a1..5057f7eaed 100644
--- a/guest/core-java/pom.xml
+++ b/guest/core-java/pom.xml
@@ -4,6 +4,7 @@
com.stackify
core-java
0.0.1-SNAPSHOT
+ core-java
com.baeldung
diff --git a/guest/core-kotlin/pom.xml b/guest/core-kotlin/pom.xml
index 6b189143a4..a57dd28ffd 100644
--- a/guest/core-kotlin/pom.xml
+++ b/guest/core-kotlin/pom.xml
@@ -6,7 +6,8 @@
1.0-SNAPSHOT
com.stackify
jar
-
+ core-kotlin
+
jcenter
diff --git a/guest/deep-jsf/pom.xml b/guest/deep-jsf/pom.xml
index e09b5e0606..12426a8833 100644
--- a/guest/deep-jsf/pom.xml
+++ b/guest/deep-jsf/pom.xml
@@ -4,6 +4,7 @@
com.stackify
deep-jsf
0.0.1-SNAPSHOT
+ deep-jsf
war
diff --git a/guest/junit5-example/pom.xml b/guest/junit5-example/pom.xml
index 457fb1fcaa..7c0cc3e776 100644
--- a/guest/junit5-example/pom.xml
+++ b/guest/junit5-example/pom.xml
@@ -4,7 +4,8 @@
junit5-example
junit5-example
0.0.1-SNAPSHOT
-
+ junit5-example
+
com.baeldung
parent-modules
diff --git a/guest/log4j2-example/pom.xml b/guest/log4j2-example/pom.xml
index f64869879f..ab55e0b60e 100644
--- a/guest/log4j2-example/pom.xml
+++ b/guest/log4j2-example/pom.xml
@@ -4,7 +4,8 @@
log4j2-example
log4j2-example
0.0.1-SNAPSHOT
-
+ log4j2-example
+
com.baeldung
parent-modules
diff --git a/guest/logback-example/pom.xml b/guest/logback-example/pom.xml
index 04de6a00a2..6e9fe0ddea 100644
--- a/guest/logback-example/pom.xml
+++ b/guest/logback-example/pom.xml
@@ -4,6 +4,7 @@
com.stackify
logback-example
0.0.1-SNAPSHOT
+ logback-example
com.baeldung
diff --git a/guest/memory-leaks/pom.xml b/guest/memory-leaks/pom.xml
index 956ae9c408..f1d411acbc 100644
--- a/guest/memory-leaks/pom.xml
+++ b/guest/memory-leaks/pom.xml
@@ -1,10 +1,10 @@
4.0.0
- com.baeldung
memory-leaks
0.0.1-SNAPSHOT
-
+ memory-leaks
+
com.baeldung
parent-modules
diff --git a/guest/remote-debugging/pom.xml b/guest/remote-debugging/pom.xml
index 974421de97..07b9cc49d8 100644
--- a/guest/remote-debugging/pom.xml
+++ b/guest/remote-debugging/pom.xml
@@ -5,8 +5,8 @@
com.stackify
remote-debugging
0.0.1-SNAPSHOT
+ remote-debugging
war
- remote-debugging
org.springframework.boot
diff --git a/guest/slf4j/guide/pom.xml b/guest/slf4j/guide/pom.xml
index 0db9b46247..657ede73b6 100644
--- a/guest/slf4j/guide/pom.xml
+++ b/guest/slf4j/guide/pom.xml
@@ -2,13 +2,12 @@
4.0.0
-
com.stackify.slf4j.guide
slf4j-parent-module
1.0.0-SNAPSHOT
+ slf4j-parent-module
pom
-
org.springframework.boot
spring-boot-starter-parent
diff --git a/guest/slf4j/guide/slf4j-log4j/pom.xml b/guest/slf4j/guide/slf4j-log4j/pom.xml
index 0d08fa6191..bca5392f4d 100644
--- a/guest/slf4j/guide/slf4j-log4j/pom.xml
+++ b/guest/slf4j/guide/slf4j-log4j/pom.xml
@@ -2,9 +2,9 @@
4.0.0
-
slf4j-log4j
0.0.1-SNAPSHOT
+ slf4j-log4j
jar
diff --git a/guest/slf4j/guide/slf4j-log4j2/pom.xml b/guest/slf4j/guide/slf4j-log4j2/pom.xml
index 643649335f..9473362cb8 100644
--- a/guest/slf4j/guide/slf4j-log4j2/pom.xml
+++ b/guest/slf4j/guide/slf4j-log4j2/pom.xml
@@ -2,9 +2,9 @@
4.0.0
-
slf4j-log4j2
0.0.1-SNAPSHOT
+ slf4j-log4j2
jar
diff --git a/guest/slf4j/guide/slf4j-logback/pom.xml b/guest/slf4j/guide/slf4j-logback/pom.xml
index e8aebf0ef6..0327e79732 100644
--- a/guest/slf4j/guide/slf4j-logback/pom.xml
+++ b/guest/slf4j/guide/slf4j-logback/pom.xml
@@ -2,9 +2,9 @@
4.0.0
-
slf4j-logback
0.0.1-SNAPSHOT
+ slf4j-logback
jar
diff --git a/guest/spring-boot-app/pom.xml b/guest/spring-boot-app/pom.xml
index 7daa8f668e..423dadbb99 100644
--- a/guest/spring-boot-app/pom.xml
+++ b/guest/spring-boot-app/pom.xml
@@ -4,6 +4,7 @@
spring-boot-app
spring-boot-app
0.0.1-SNAPSHOT
+ spring-boot-app
war
diff --git a/guest/spring-mvc/pom.xml b/guest/spring-mvc/pom.xml
index c0ef451605..3bffb1530d 100644
--- a/guest/spring-mvc/pom.xml
+++ b/guest/spring-mvc/pom.xml
@@ -5,8 +5,8 @@
com.stackify.guest
spring-mvc
0.0.1-SNAPSHOT
- jar
spring-mvc
+ jar
Spring MVC sample project
diff --git a/guest/thread-pools/pom.xml b/guest/thread-pools/pom.xml
index db9a5ac89f..2591cb2746 100644
--- a/guest/thread-pools/pom.xml
+++ b/guest/thread-pools/pom.xml
@@ -4,7 +4,8 @@
com.stackify
thread-pools
0.0.1-SNAPSHOT
-
+ thread-pools
+
com.baeldung
parent-modules
diff --git a/guest/tomcat-app/pom.xml b/guest/tomcat-app/pom.xml
index 7fd27e869b..9ce77c758a 100644
--- a/guest/tomcat-app/pom.xml
+++ b/guest/tomcat-app/pom.xml
@@ -4,6 +4,7 @@
com.stackify
tomcat-app
0.0.1-SNAPSHOT
+ tomcat-app
war
diff --git a/guest/webservices/rest-client/pom.xml b/guest/webservices/rest-client/pom.xml
index 5e52b7161c..8508186e86 100644
--- a/guest/webservices/rest-client/pom.xml
+++ b/guest/webservices/rest-client/pom.xml
@@ -3,6 +3,7 @@
com.stackify
rest-client
0.0.1-SNAPSHOT
+ rest-client
war
diff --git a/guest/webservices/rest-server/pom.xml b/guest/webservices/rest-server/pom.xml
index 4b3d241293..c576924215 100644
--- a/guest/webservices/rest-server/pom.xml
+++ b/guest/webservices/rest-server/pom.xml
@@ -4,6 +4,7 @@
com.stackify
rest-server
0.0.1-SNAPSHOT
+ rest-server
war
diff --git a/guest/webservices/spring-rest-service/pom.xml b/guest/webservices/spring-rest-service/pom.xml
index 49d35766e8..fcec8a3e12 100644
--- a/guest/webservices/spring-rest-service/pom.xml
+++ b/guest/webservices/spring-rest-service/pom.xml
@@ -4,6 +4,7 @@
com.stackify
spring-rest-service
0.0.1-SNAPSHOT
+ spring-rest-service
war
diff --git a/helidon/helidon-mp/pom.xml b/helidon/helidon-mp/pom.xml
index 1ec1131a67..1f39431886 100644
--- a/helidon/helidon-mp/pom.xml
+++ b/helidon/helidon-mp/pom.xml
@@ -2,9 +2,9 @@
4.0.0
-
helidon-mp
-
+ helidon-mp
+
com.baeldung.helidon
helidon
diff --git a/helidon/helidon-se/pom.xml b/helidon/helidon-se/pom.xml
index 5e14ecb81c..8982bf048e 100644
--- a/helidon/helidon-se/pom.xml
+++ b/helidon/helidon-se/pom.xml
@@ -3,9 +3,9 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
helidon-se
-
+ helidon-se
+
com.baeldung.helidon
helidon
diff --git a/helidon/pom.xml b/helidon/pom.xml
index ea8cc52ee0..85bab4db42 100644
--- a/helidon/pom.xml
+++ b/helidon/pom.xml
@@ -2,10 +2,9 @@
4.0.0
-
com.baeldung.helidon
helidon
- 1.0.0-SNAPSHOT
+ helidon
pom
diff --git a/image-processing/pom.xml b/image-processing/pom.xml
index fe8001ae3a..ce75145dc7 100644
--- a/image-processing/pom.xml
+++ b/image-processing/pom.xml
@@ -2,10 +2,10 @@
4.0.0
- com.baeldung
image-processing
1.0-SNAPSHOT
-
+ image-processing
+
com.baeldung
parent-modules
diff --git a/immutables/pom.xml b/immutables/pom.xml
index 17510690b0..efb21e584a 100644
--- a/immutables/pom.xml
+++ b/immutables/pom.xml
@@ -3,8 +3,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
immutables
- 1.0.0-SNAPSHOT
-
+ immutables
+
com.baeldung
parent-modules
diff --git a/jackson/README.md b/jackson/README.md
index a05c95de94..04e88d0ea1 100644
--- a/jackson/README.md
+++ b/jackson/README.md
@@ -36,3 +36,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Jackson – Change Name of Field](http://www.baeldung.com/jackson-name-of-property)
- [Serialize Only Fields that meet a Custom Criteria with Jackson](http://www.baeldung.com/jackson-serialize-field-custom-criteria)
- [Mapping Nested Values with Jackson](http://www.baeldung.com/jackson-nested-values)
+- [Convert XML to JSON Using Jackson](https://www.baeldung.com/jackson-convert-xml-json)
diff --git a/java-collections-conversions/README.md b/java-collections-conversions/README.md
index 761a78d7b0..0f89e07d63 100644
--- a/java-collections-conversions/README.md
+++ b/java-collections-conversions/README.md
@@ -8,4 +8,5 @@
- [Converting between a List and a Set in Java](http://www.baeldung.com/convert-list-to-set-and-set-to-list)
- [Convert a Map to an Array, List or Set in Java](http://www.baeldung.com/convert-map-values-to-array-list-set)
- [Converting a List to String in Java](http://www.baeldung.com/java-list-to-string)
-- [How to Convert List to Map in Java](http://www.baeldung.com/java-list-to-map)
\ No newline at end of file
+- [How to Convert List to Map in Java](http://www.baeldung.com/java-list-to-map)
+- [Array to String Conversions](https://www.baeldung.com/java-array-to-string)
diff --git a/java-collections-conversions/src/test/java/org/baeldung/convertarraytostring/ArrayToStringUnitTest.java b/java-collections-conversions/src/test/java/org/baeldung/convertarraytostring/ArrayToStringUnitTest.java
new file mode 100644
index 0000000000..b563475997
--- /dev/null
+++ b/java-collections-conversions/src/test/java/org/baeldung/convertarraytostring/ArrayToStringUnitTest.java
@@ -0,0 +1,136 @@
+package org.baeldung.convertarraytostring;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
+
+public class ArrayToStringUnitTest {
+
+ // convert with Java
+
+ @Test
+ public void givenAStringArray_whenConvertBeforeJava8_thenReturnString() {
+
+ String[] strArray = { "Convert", "Array", "With", "Java" };
+ StringBuilder stringBuilder = new StringBuilder();
+
+ for (int i = 0; i < strArray.length; i++) {
+ stringBuilder.append(strArray[i]);
+ }
+ String joinedString = stringBuilder.toString();
+
+ assertThat(joinedString, instanceOf(String.class));
+ assertEquals("ConvertArrayWithJava", joinedString);
+ }
+
+ @Test
+ public void givenAString_whenConvertBeforeJava8_thenReturnStringArray() {
+
+ String input = "lorem ipsum dolor sit amet";
+ String[] strArray = input.split(" ");
+
+ assertThat(strArray, instanceOf(String[].class));
+ assertEquals(5, strArray.length);
+
+ input = "loremipsum";
+ strArray = input.split("");
+ assertThat(strArray, instanceOf(String[].class));
+ assertEquals(10, strArray.length);
+ }
+
+ @Test
+ public void givenAnIntArray_whenConvertBeforeJava8_thenReturnString() {
+
+ int[] strArray = { 1, 2, 3, 4, 5 };
+ StringBuilder stringBuilder = new StringBuilder();
+
+ for (int i = 0; i < strArray.length; i++) {
+ stringBuilder.append(Integer.valueOf(strArray[i]));
+ }
+ String joinedString = stringBuilder.toString();
+
+ assertThat(joinedString, instanceOf(String.class));
+ assertEquals("12345", joinedString);
+ }
+
+ // convert with Java Stream API
+
+ @Test
+ public void givenAStringArray_whenConvertWithJavaStream_thenReturnString() {
+
+ String[] strArray = { "Convert", "With", "Java", "Streams" };
+ String joinedString = Arrays.stream(strArray)
+ .collect(Collectors.joining());
+ assertThat(joinedString, instanceOf(String.class));
+ assertEquals("ConvertWithJavaStreams", joinedString);
+
+ joinedString = Arrays.stream(strArray)
+ .collect(Collectors.joining(","));
+ assertThat(joinedString, instanceOf(String.class));
+ assertEquals("Convert,With,Java,Streams", joinedString);
+ }
+
+
+ // convert with Apache Commons
+
+ @Test
+ public void givenAStringArray_whenConvertWithApacheCommons_thenReturnString() {
+
+ String[] strArray = { "Convert", "With", "Apache", "Commons" };
+ String joinedString = StringUtils.join(strArray);
+
+ assertThat(joinedString, instanceOf(String.class));
+ assertEquals("ConvertWithApacheCommons", joinedString);
+ }
+
+ @Test
+ public void givenAString_whenConvertWithApacheCommons_thenReturnStringArray() {
+
+ String input = "lorem ipsum dolor sit amet";
+ String[] strArray = StringUtils.split(input, " ");
+
+ assertThat(strArray, instanceOf(String[].class));
+ assertEquals(5, strArray.length);
+ }
+
+
+ // convert with Guava
+
+ @Test
+ public void givenAStringArray_whenConvertWithGuava_thenReturnString() {
+
+ String[] strArray = { "Convert", "With", "Guava", null };
+ String joinedString = Joiner.on("")
+ .skipNulls()
+ .join(strArray);
+
+ assertThat(joinedString, instanceOf(String.class));
+ assertEquals("ConvertWithGuava", joinedString);
+ }
+
+
+ @Test
+ public void givenAString_whenConvertWithGuava_thenReturnStringArray() {
+
+ String input = "lorem ipsum dolor sit amet";
+
+ List resultList = Splitter.on(' ')
+ .trimResults()
+ .omitEmptyStrings()
+ .splitToList(input);
+ String[] strArray = resultList.toArray(new String[0]);
+
+ assertThat(strArray, instanceOf(String[].class));
+ assertEquals(5, strArray.length);
+ }
+}
diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java
new file mode 100644
index 0000000000..b239ae07d8
--- /dev/null
+++ b/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java
@@ -0,0 +1,87 @@
+package com.baeldung.java.map;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.jupiter.api.Test;
+
+import com.google.common.collect.ImmutableMap;
+
+
+public class ImmutableMapUnitTest {
+
+ @Test
+ public void whenCollectionsUnModifiableMapMethod_thenOriginalCollectionChangesReflectInUnmodifiableMap() {
+
+ Map mutableMap = new HashMap<>();
+ mutableMap.put("USA", "North America");
+
+ Map unmodifiableMap = Collections.unmodifiableMap(mutableMap);
+ assertThrows(UnsupportedOperationException.class, () -> unmodifiableMap.put("Canada", "North America"));
+
+ mutableMap.remove("USA");
+ assertFalse(unmodifiableMap.containsKey("USA"));
+
+ mutableMap.put("Mexico", "North America");
+ assertTrue(unmodifiableMap.containsKey("Mexico"));
+ }
+
+ @Test
+ @SuppressWarnings("deprecation")
+ public void whenGuavaImmutableMapFromCopyOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() {
+
+ Map mutableMap = new HashMap<>();
+ mutableMap.put("USA", "North America");
+
+ ImmutableMap immutableMap = ImmutableMap.copyOf(mutableMap);
+ assertTrue(immutableMap.containsKey("USA"));
+
+ assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America"));
+
+ mutableMap.remove("USA");
+ assertTrue(immutableMap.containsKey("USA"));
+
+ mutableMap.put("Mexico", "North America");
+ assertFalse(immutableMap.containsKey("Mexico"));
+ }
+
+ @Test
+ @SuppressWarnings("deprecation")
+ public void whenGuavaImmutableMapFromBuilderMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() {
+
+ Map mutableMap = new HashMap<>();
+ mutableMap.put("USA", "North America");
+
+ ImmutableMap immutableMap = ImmutableMap.builder()
+ .putAll(mutableMap)
+ .put("Costa Rica", "North America")
+ .build();
+ assertTrue(immutableMap.containsKey("USA"));
+ assertTrue(immutableMap.containsKey("Costa Rica"));
+
+ assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America"));
+
+ mutableMap.remove("USA");
+ assertTrue(immutableMap.containsKey("USA"));
+
+ mutableMap.put("Mexico", "North America");
+ assertFalse(immutableMap.containsKey("Mexico"));
+ }
+
+ @Test
+ @SuppressWarnings("deprecation")
+ public void whenGuavaImmutableMapFromOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() {
+
+ ImmutableMap immutableMap = ImmutableMap.of("USA", "North America", "Costa Rica", "North America");
+ assertTrue(immutableMap.containsKey("USA"));
+ assertTrue(immutableMap.containsKey("Costa Rica"));
+
+ assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America"));
+ }
+
+}
diff --git a/java-dates/README.md b/java-dates/README.md
index f99bfeb861..3f6d7998b8 100644
--- a/java-dates/README.md
+++ b/java-dates/README.md
@@ -23,3 +23,5 @@
- [Increment Date in Java](http://www.baeldung.com/java-increment-date)
- [Add Hours To a Date In Java](http://www.baeldung.com/java-add-hours-date)
- [Guide to DateTimeFormatter](https://www.baeldung.com/java-datetimeformatter)
+- [Format ZonedDateTime to String](https://www.baeldung.com/java-format-zoned-datetime-string)
+- [Convert Between java.time.Instant and java.sql.Timestamp](Convert Between java.time.Instant and java.sql.Timestamp)
diff --git a/java-dates/src/test/java/com/baeldung/timestamp/StringToTimestampConverterUnitTest.java b/java-dates/src/test/java/com/baeldung/timestamp/StringToTimestampConverterUnitTest.java
new file mode 100644
index 0000000000..2be646eb51
--- /dev/null
+++ b/java-dates/src/test/java/com/baeldung/timestamp/StringToTimestampConverterUnitTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.timestamp;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.sql.Timestamp;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+public class StringToTimestampConverterUnitTest {
+
+ @Test
+ public void givenDatePattern_whenParsing_thenTimestampIsCorrect() {
+ String pattern = "MMM dd, yyyy HH:mm:ss.SSSSSSSS";
+ String timestampAsString = "Nov 12, 2018 13:02:56.12345678";
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
+ LocalDateTime localDateTime = LocalDateTime.from(formatter.parse(timestampAsString));
+
+ Timestamp timestamp = Timestamp.valueOf(localDateTime);
+ Assert.assertEquals("2018-11-12 13:02:56.12345678", timestamp.toString());
+ }
+}
\ No newline at end of file
diff --git a/java-dates/src/test/java/com/baeldung/timestamp/TimestampToStringConverterTest.java b/java-dates/src/test/java/com/baeldung/timestamp/TimestampToStringConverterTest.java
new file mode 100644
index 0000000000..b25ff2edb3
--- /dev/null
+++ b/java-dates/src/test/java/com/baeldung/timestamp/TimestampToStringConverterTest.java
@@ -0,0 +1,19 @@
+package com.baeldung.timestamp;
+
+import org.junit.Assert;
+import org.junit.jupiter.api.Test;
+
+import java.sql.Timestamp;
+import java.time.format.DateTimeFormatter;
+
+public class TimestampToStringConverterTest {
+
+ @Test
+ public void givenDatePattern_whenFormatting_thenResultingStringIsCorrect() {
+ Timestamp timestamp = Timestamp.valueOf("2018-12-12 01:02:03.123456789");
+ DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
+
+ String timestampAsString = formatter.format(timestamp.toLocalDateTime());
+ Assert.assertEquals("2018-12-12T01:02:03.123456789", timestampAsString);
+ }
+}
\ No newline at end of file
diff --git a/java-ee-8-security-api/app-auth-basic-store-db/pom.xml b/java-ee-8-security-api/app-auth-basic-store-db/pom.xml
index 6ecc9f7e80..cf92fe2ecd 100644
--- a/java-ee-8-security-api/app-auth-basic-store-db/pom.xml
+++ b/java-ee-8-security-api/app-auth-basic-store-db/pom.xml
@@ -2,8 +2,8 @@
4.0.0
-
app-auth-basic-store-db
+ app-auth-basic-store-db
war
diff --git a/java-ee-8-security-api/app-auth-custom-form-store-custom/pom.xml b/java-ee-8-security-api/app-auth-custom-form-store-custom/pom.xml
index bf5315e993..43809f1cd5 100644
--- a/java-ee-8-security-api/app-auth-custom-form-store-custom/pom.xml
+++ b/java-ee-8-security-api/app-auth-custom-form-store-custom/pom.xml
@@ -2,8 +2,8 @@
4.0.0
-
app-auth-custom-form-store-custom
+ app-auth-custom-form-store-custom
war
diff --git a/java-ee-8-security-api/app-auth-custom-no-store/pom.xml b/java-ee-8-security-api/app-auth-custom-no-store/pom.xml
index c05c0f19be..f9d63f8623 100644
--- a/java-ee-8-security-api/app-auth-custom-no-store/pom.xml
+++ b/java-ee-8-security-api/app-auth-custom-no-store/pom.xml
@@ -2,8 +2,8 @@
4.0.0
-
app-auth-custom-no-store
+ app-auth-custom-no-store
war
diff --git a/java-ee-8-security-api/app-auth-form-store-ldap/pom.xml b/java-ee-8-security-api/app-auth-form-store-ldap/pom.xml
index 570b36add5..6a7b97b2d7 100644
--- a/java-ee-8-security-api/app-auth-form-store-ldap/pom.xml
+++ b/java-ee-8-security-api/app-auth-form-store-ldap/pom.xml
@@ -3,8 +3,8 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
app-auth-form-store-ldap
+ app-auth-form-store-ldap
war
diff --git a/java-ee-8-security-api/pom.xml b/java-ee-8-security-api/pom.xml
index 3d235e10a8..ad33c74ad3 100644
--- a/java-ee-8-security-api/pom.xml
+++ b/java-ee-8-security-api/pom.xml
@@ -5,6 +5,7 @@
4.0.0
java-ee-8-security-api
1.0-SNAPSHOT
+ java-ee-8-security-api
pom
@@ -41,7 +42,7 @@
- https://public.dhe.ibm.com/ibmdl/export/pub/software/openliberty/runtime/nightly/2018-05-25_1422/openliberty-all-20180525-1300.zip
+ https://public.dhe.ibm.com/ibmdl/export/pub/software/openliberty/runtime/release/2018-09-05_2337/openliberty-18.0.0.3.zip
true
diff --git a/java-lite/pom.xml b/java-lite/pom.xml
index 5111cd2e7f..03f4e29f4e 100644
--- a/java-lite/pom.xml
+++ b/java-lite/pom.xml
@@ -5,6 +5,7 @@
org.baeldung
java-lite
1.0-SNAPSHOT
+ java-lite
war
diff --git a/java-rmi/pom.xml b/java-rmi/pom.xml
index 33931baedf..ad413b66ab 100644
--- a/java-rmi/pom.xml
+++ b/java-rmi/pom.xml
@@ -4,6 +4,7 @@
com.baeldung.rmi
java-rmi
1.0-SNAPSHOT
+ java-rmi
jar
diff --git a/java-spi/exchange-rate-api/pom.xml b/java-spi/exchange-rate-api/pom.xml
index b626916b56..fd3a7ae0a7 100644
--- a/java-spi/exchange-rate-api/pom.xml
+++ b/java-spi/exchange-rate-api/pom.xml
@@ -2,6 +2,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
exchange-rate-api
+ exchange-rate-api
jar
diff --git a/java-spi/exchange-rate-app/pom.xml b/java-spi/exchange-rate-app/pom.xml
index a42a30ceda..7a076d560c 100644
--- a/java-spi/exchange-rate-app/pom.xml
+++ b/java-spi/exchange-rate-app/pom.xml
@@ -2,6 +2,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
exchange-rate-app
+ exchange-rate-app
jar
diff --git a/java-spi/exchange-rate-impl/pom.xml b/java-spi/exchange-rate-impl/pom.xml
index 41c874c659..8a77b51793 100644
--- a/java-spi/exchange-rate-impl/pom.xml
+++ b/java-spi/exchange-rate-impl/pom.xml
@@ -2,6 +2,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
exchange-rate-impl
+ exchange-rate-impl
jar
diff --git a/java-spi/pom.xml b/java-spi/pom.xml
index 9ac87bf960..97a22024bd 100644
--- a/java-spi/pom.xml
+++ b/java-spi/pom.xml
@@ -2,6 +2,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
java-spi
+ java-spi
pom
diff --git a/java-strings/README.md b/java-strings/README.md
index a653087401..11893e68a2 100644
--- a/java-strings/README.md
+++ b/java-strings/README.md
@@ -35,3 +35,7 @@
- [String Not Empty Test Assertions in Java](https://www.baeldung.com/java-assert-string-not-empty)
- [String Performance Hints](https://www.baeldung.com/java-string-performance)
- [Using indexOf to Find All Occurrences of a Word in a String](https://www.baeldung.com/java-indexOf-find-string-occurrences)
+- [Java Base64 Encoding and Decoding](https://www.baeldung.com/java-base64-encode-and-decode)
+- [Generate a Secure Random Password in Java](https://www.baeldung.com/java-generate-secure-password)
+- [Removing Repeated Characters from a String](https://www.baeldung.com/java-remove-repeated-char)
+- [Join Array of Primitives with Separator in Java](https://www.baeldung.com/java-join-primitive-array)
diff --git a/java-strings/pom.xml b/java-strings/pom.xml
index ab94c28d4d..f4fb1c0865 100755
--- a/java-strings/pom.xml
+++ b/java-strings/pom.xml
@@ -122,13 +122,13 @@
- 3.5
+ 3.8.1
1.10
3.6.1
1.19
61.1
- 26.0-jre
+ 27.0.1-jre
diff --git a/java-strings/src/main/java/com/baeldung/string/AddingNewLineToString.java b/java-strings/src/main/java/com/baeldung/string/AddingNewLineToString.java
new file mode 100644
index 0000000000..b522f7337b
--- /dev/null
+++ b/java-strings/src/main/java/com/baeldung/string/AddingNewLineToString.java
@@ -0,0 +1,69 @@
+package com.baeldung.string;
+
+public class AddingNewLineToString {
+
+ public static void main(String[] args) {
+ String line1 = "Humpty Dumpty sat on a wall.";
+ String line2 = "Humpty Dumpty had a great fall.";
+ String rhyme = "";
+
+ System.out.println("***New Line in a String in Java***");
+ //1. Using "\n"
+ System.out.println("1. Using \\n");
+ rhyme = line1 + "\n" + line2;
+ System.out.println(rhyme);
+
+ //2. Using "\r\n"
+ System.out.println("2. Using \\r\\n");
+ rhyme = line1 + "\r\n" + line2;
+ System.out.println(rhyme);
+
+ //3. Using "\r"
+ System.out.println("3. Using \\r");
+ rhyme = line1 + "\r" + line2;
+ System.out.println(rhyme);
+
+ //4. Using "\n\r" Note that this is not same as "\r\n"
+ // Using "\n\r" is equivalent to adding two lines
+ System.out.println("4. Using \\n\\r");
+ rhyme = line1 + "\n\r" + line2;
+ System.out.println(rhyme);
+
+ //5. Using System.lineSeparator()
+ System.out.println("5. Using System.lineSeparator()");
+ rhyme = line1 + System.lineSeparator() + line2;
+ System.out.println(rhyme);
+
+ //6. Using System.getProperty("line.separator")
+ System.out.println("6. Using System.getProperty(\"line.separator\")");
+ rhyme = line1 + System.getProperty("line.separator") + line2;
+ System.out.println(rhyme);
+
+ System.out.println("***HTML to rendered in a browser***");
+ //1. Line break for HTML using
+ System.out.println("1. Line break for HTML using
");
+ rhyme = line1 + "
" + line2;
+ System.out.println(rhyme);
+
+ //2. Line break for HTML using “
”
+ System.out.println("2. Line break for HTML using
");
+ rhyme = line1 + "
" + line2;
+ System.out.println(rhyme);
+
+ //3. Line break for HTML using “
”
+ System.out.println("3. Line break for HTML using
");
+ rhyme = line1 + "
" + line2;
+ System.out.println(rhyme);
+
+ //4. Line break for HTML using “
;”
+ System.out.println("4. Line break for HTML using
");
+ rhyme = line1 + "
" + line2;
+ System.out.println(rhyme);
+
+ //5. Line break for HTML using \n”
+ System.out.println("5. Line break for HTML using \\n");
+ rhyme = line1 + "\n" + line2;
+ System.out.println(rhyme);
+ }
+
+}
\ No newline at end of file
diff --git a/java-strings/src/main/java/com/baeldung/string/checkinputs/CheckIntegerInput.java b/java-strings/src/main/java/com/baeldung/string/checkinputs/CheckIntegerInput.java
new file mode 100644
index 0000000000..9462244bbb
--- /dev/null
+++ b/java-strings/src/main/java/com/baeldung/string/checkinputs/CheckIntegerInput.java
@@ -0,0 +1,19 @@
+package com.baeldung.string.checkinputs;
+
+import java.util.Scanner;
+
+public class CheckIntegerInput {
+
+ public static void main(String[] args) {
+
+ try (Scanner scanner = new Scanner(System.in)) {
+ System.out.println("Enter an integer : ");
+
+ if (scanner.hasNextInt()) {
+ System.out.println("You entered : " + scanner.nextInt());
+ } else {
+ System.out.println("The input is not an integer");
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/java-strings/src/main/java/com/baeldung/string/padding/StringPaddingUtil.java b/java-strings/src/main/java/com/baeldung/string/padding/StringPaddingUtil.java
new file mode 100644
index 0000000000..80d05bb42a
--- /dev/null
+++ b/java-strings/src/main/java/com/baeldung/string/padding/StringPaddingUtil.java
@@ -0,0 +1,34 @@
+package com.baeldung.string.padding;
+
+public class StringPaddingUtil {
+
+ public static String padLeftSpaces(String inputString, int length) {
+ if (inputString.length() >= length) {
+ return inputString;
+ }
+ StringBuilder sb = new StringBuilder();
+ while (sb.length() < length - inputString.length()) {
+ sb.append(' ');
+ }
+ sb.append(inputString);
+
+ return sb.toString();
+ }
+
+ public static String padLeft(String inputString, int length) {
+ if (inputString.length() >= length) {
+ return inputString;
+ }
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < length; i++) {
+ sb.append(' ');
+ }
+ return sb.substring(inputString.length()) + inputString;
+ }
+
+ public static String padLeftZeros(String inputString, int length) {
+ return String
+ .format("%1$" + length + "s", inputString)
+ .replace(' ', '0');
+ }
+}
diff --git a/java-strings/src/main/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroes.java b/java-strings/src/main/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroes.java
new file mode 100644
index 0000000000..c9d748e897
--- /dev/null
+++ b/java-strings/src/main/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroes.java
@@ -0,0 +1,103 @@
+package com.baeldung.string.removeleadingtrailingchar;
+
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.google.common.base.CharMatcher;
+
+public class RemoveLeadingAndTrailingZeroes {
+
+ public static String removeLeadingZeroesWithStringBuilder(String s) {
+ StringBuilder sb = new StringBuilder(s);
+
+ while (sb.length() > 1 && sb.charAt(0) == '0') {
+ sb.deleteCharAt(0);
+ }
+
+ return sb.toString();
+ }
+
+ public static String removeTrailingZeroesWithStringBuilder(String s) {
+ StringBuilder sb = new StringBuilder(s);
+
+ while (sb.length() > 1 && sb.charAt(sb.length() - 1) == '0') {
+ sb.setLength(sb.length() - 1);
+ }
+
+ return sb.toString();
+ }
+
+ public static String removeLeadingZeroesWithSubstring(String s) {
+ int index = 0;
+
+ for (; index < s.length() - 1; index++) {
+ if (s.charAt(index) != '0') {
+ break;
+ }
+ }
+
+ return s.substring(index);
+ }
+
+ public static String removeTrailingZeroesWithSubstring(String s) {
+ int index = s.length() - 1;
+
+ for (; index > 0; index--) {
+ if (s.charAt(index) != '0') {
+ break;
+ }
+ }
+
+ return s.substring(0, index + 1);
+ }
+
+ public static String removeLeadingZeroesWithApacheCommonsStripStart(String s) {
+ String stripped = StringUtils.stripStart(s, "0");
+
+ if (stripped.isEmpty() && !s.isEmpty()) {
+ return "0";
+ }
+
+ return stripped;
+ }
+
+ public static String removeTrailingZeroesWithApacheCommonsStripEnd(String s) {
+ String stripped = StringUtils.stripEnd(s, "0");
+
+ if (stripped.isEmpty() && !s.isEmpty()) {
+ return "0";
+ }
+
+ return stripped;
+ }
+
+ public static String removeLeadingZeroesWithGuavaTrimLeadingFrom(String s) {
+ String stripped = CharMatcher.is('0')
+ .trimLeadingFrom(s);
+
+ if (stripped.isEmpty() && !s.isEmpty()) {
+ return "0";
+ }
+
+ return stripped;
+ }
+
+ public static String removeTrailingZeroesWithGuavaTrimTrailingFrom(String s) {
+ String stripped = CharMatcher.is('0')
+ .trimTrailingFrom(s);
+
+ if (stripped.isEmpty() && !s.isEmpty()) {
+ return "0";
+ }
+
+ return stripped;
+ }
+
+ public static String removeLeadingZeroesWithRegex(String s) {
+ return s.replaceAll("^0+(?!$)", "");
+ }
+
+ public static String removeTrailingZeroesWithRegex(String s) {
+ return s.replaceAll("(?!^)0+$", "");
+ }
+}
diff --git a/java-strings/src/main/java/com/baeldung/stringduplicates/RemoveDuplicateFromString.java b/java-strings/src/main/java/com/baeldung/stringduplicates/RemoveDuplicateFromString.java
new file mode 100644
index 0000000000..d8fd9c4b14
--- /dev/null
+++ b/java-strings/src/main/java/com/baeldung/stringduplicates/RemoveDuplicateFromString.java
@@ -0,0 +1,102 @@
+package com.baeldung.stringduplicates;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+public class RemoveDuplicateFromString {
+
+
+ String removeDuplicatesUsingCharArray(String str) {
+
+ char[] chars = str.toCharArray();
+ StringBuilder sb = new StringBuilder();
+ int repeatedCtr;
+ for (int i = 0; i < chars.length; i++) {
+ repeatedCtr = 0;
+ for (int j = i + 1; j < chars.length; j++) {
+ if (chars[i] == chars[j]) {
+ repeatedCtr++;
+ }
+ }
+ if (repeatedCtr == 0) {
+ sb.append(chars[i]);
+ }
+ }
+ return sb.toString();
+ }
+
+ String removeDuplicatesUsinglinkedHashSet(String str) {
+
+ StringBuilder sb = new StringBuilder();
+ Set linkedHashSet = new LinkedHashSet<>();
+
+ for (int i = 0; i < str.length(); i++) {
+ linkedHashSet.add(str.charAt(i));
+ }
+
+ for (Character c : linkedHashSet) {
+ sb.append(c);
+ }
+
+ return sb.toString();
+ }
+
+ String removeDuplicatesUsingSorting(String str) {
+ StringBuilder sb = new StringBuilder();
+ if(!str.isEmpty()) {
+ char[] chars = str.toCharArray();
+ Arrays.sort(chars);
+
+ sb.append(chars[0]);
+ for (int i = 1; i < chars.length; i++) {
+ if (chars[i] != chars[i - 1]) {
+ sb.append(chars[i]);
+ }
+ }
+ }
+
+ return sb.toString();
+ }
+
+ String removeDuplicatesUsingHashSet(String str) {
+
+ StringBuilder sb = new StringBuilder();
+ Set hashSet = new HashSet<>();
+
+ for (int i = 0; i < str.length(); i++) {
+ hashSet.add(str.charAt(i));
+ }
+
+ for (Character c : hashSet) {
+ sb.append(c);
+ }
+
+ return sb.toString();
+ }
+
+ String removeDuplicatesUsingIndexOf(String str) {
+
+ StringBuilder sb = new StringBuilder();
+ int idx;
+ for (int i = 0; i < str.length(); i++) {
+ char c = str.charAt(i);
+ idx = str.indexOf(c, i + 1);
+ if (idx == -1) {
+ sb.append(c);
+ }
+ }
+ return sb.toString();
+ }
+
+
+ String removeDuplicatesUsingDistinct(String str) {
+ StringBuilder sb = new StringBuilder();
+ str.chars().distinct().forEach(c -> sb.append((char) c));
+ return sb.toString();
+ }
+
+}
+
+
diff --git a/java-strings/src/test/java/com/baeldung/string/StringFromPrimitiveArrayUnitTest.java b/java-strings/src/test/java/com/baeldung/string/StringFromPrimitiveArrayUnitTest.java
new file mode 100644
index 0000000000..c93089e543
--- /dev/null
+++ b/java-strings/src/test/java/com/baeldung/string/StringFromPrimitiveArrayUnitTest.java
@@ -0,0 +1,129 @@
+package com.baeldung.string;
+
+import com.google.common.base.Joiner;
+import com.google.common.primitives.Chars;
+import com.google.common.primitives.Ints;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+
+import java.nio.CharBuffer;
+import java.util.Arrays;
+import java.util.StringJoiner;
+import java.util.stream.Collectors;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+
+public class StringFromPrimitiveArrayUnitTest {
+
+ private int[] intArray = {1, 2, 3, 4, 5, 6, 7, 8, 9};
+
+ private char[] charArray = {'a', 'b', 'c', 'd', 'e', 'f'};
+
+ private char separatorChar = '-';
+
+ private String separator = String.valueOf(separatorChar);
+
+ private String expectedIntString = "1-2-3-4-5-6-7-8-9";
+
+ private String expectedCharString = "a-b-c-d-e-f";
+
+ @Test
+ public void givenIntArray_whenJoinBySeparator_thenReturnsString_through_Java8CollectorsJoining() {
+ assertThat(Arrays.stream(intArray)
+ .mapToObj(String::valueOf)
+ .collect(Collectors.joining(separator)))
+ .isEqualTo(expectedIntString);
+ }
+
+ @Test
+ public void givenCharArray_whenJoinBySeparator_thenReturnsString_through_Java8CollectorsJoining() {
+ assertThat(CharBuffer.wrap(charArray).chars()
+ .mapToObj(intChar -> String.valueOf((char) intChar))
+ .collect(Collectors.joining(separator)))
+ .isEqualTo(expectedCharString);
+ }
+
+
+ @Test
+ public void giveIntArray_whenJoinBySeparator_thenReturnsString_through_Java8StringJoiner() {
+ StringJoiner intStringJoiner = new StringJoiner(separator);
+
+ Arrays.stream(intArray)
+ .mapToObj(String::valueOf)
+ .forEach(intStringJoiner::add);
+
+ assertThat(intStringJoiner.toString()).isEqualTo(expectedIntString);
+ }
+
+ @Test
+ public void givenCharArray_whenJoinBySeparator_thenReturnsString_through_Java8StringJoiner() {
+ StringJoiner charStringJoiner = new StringJoiner(separator);
+
+ CharBuffer.wrap(charArray).chars()
+ .mapToObj(intChar -> String.valueOf((char) intChar))
+ .forEach(charStringJoiner::add);
+
+ assertThat(charStringJoiner.toString()).isEqualTo(expectedCharString);
+ }
+
+ @Test
+ public void givenIntArray_whenJoinBySeparator_thenReturnsString_through_CommonsLang() {
+ assertThat(StringUtils.join(intArray, separatorChar)).isEqualTo(expectedIntString);
+ assertThat(StringUtils.join(ArrayUtils.toObject(intArray), separator)).isEqualTo(expectedIntString);
+ }
+
+ @Test
+ public void givenCharArray_whenJoinBySeparator_thenReturnsString_through_CommonsLang() {
+ assertThat(StringUtils.join(charArray, separatorChar)).isEqualTo(expectedCharString);
+ assertThat(StringUtils.join(ArrayUtils.toObject(charArray), separator)).isEqualTo(expectedCharString);
+ }
+
+ @Test
+ public void givenIntArray_whenJoinBySeparator_thenReturnsString_through_GuavaJoiner() {
+ assertThat(Joiner.on(separator).join(Ints.asList(intArray))).isEqualTo(expectedIntString);
+ }
+
+ @Test
+ public void givenCharArray_whenJoinBySeparator_thenReturnsString_through_GuavaJoiner() {
+ assertThat(Joiner.on(separator).join(Chars.asList(charArray))).isEqualTo(expectedCharString);
+ }
+
+ @Test
+ public void givenIntArray_whenJoinBySeparator_thenReturnsString_through_Java7StringBuilder() {
+ assertThat(joinIntArrayWithStringBuilder(intArray, separator)).isEqualTo(expectedIntString);
+ }
+
+ @Test
+ public void givenCharArray_whenJoinBySeparator_thenReturnsString_through_Java7StringBuilder() {
+ assertThat(joinCharArrayWithStringBuilder(charArray, separator)).isEqualTo(expectedCharString);
+ }
+
+ private String joinIntArrayWithStringBuilder(int[] array, String separator) {
+ if (array.length == 0) {
+ return "";
+ }
+ StringBuilder stringBuilder = new StringBuilder();
+ for (int i = 0; i < array.length - 1; i++) {
+ stringBuilder.append(array[i]);
+ stringBuilder.append(separator);
+ }
+ stringBuilder.append(array[array.length - 1]);
+ return stringBuilder.toString();
+ }
+
+ private String joinCharArrayWithStringBuilder(char[] array, String separator) {
+ if (array.length == 0) {
+ return "";
+ }
+ StringBuilder stringBuilder = new StringBuilder();
+ for (int i = 0; i < array.length - 1; i++) {
+ stringBuilder.append(array[i]);
+ stringBuilder.append(separator);
+ }
+ stringBuilder.append(array[array.length - 1]);
+ return stringBuilder.toString();
+ }
+
+}
diff --git a/java-strings/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java b/java-strings/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java
new file mode 100644
index 0000000000..d952d2383b
--- /dev/null
+++ b/java-strings/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java
@@ -0,0 +1,83 @@
+package com.baeldung.string;
+
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class StringReplaceAndRemoveUnitTest {
+
+
+ @Test
+ public void givenTestStrings_whenReplace_thenProcessedString() {
+
+ String master = "Hello World Baeldung!";
+ String target = "Baeldung";
+ String replacement = "Java";
+ String processed = master.replace(target, replacement);
+ assertTrue(processed.contains(replacement));
+ assertFalse(processed.contains(target));
+
+ }
+
+ @Test
+ public void givenTestStrings_whenReplaceAll_thenProcessedString() {
+
+ String master2 = "Welcome to Baeldung, Hello World Baeldung";
+ String regexTarget= "(Baeldung)$";
+ String replacement = "Java";
+ String processed2 = master2.replaceAll(regexTarget, replacement);
+ assertTrue(processed2.endsWith("Java"));
+
+ }
+
+ @Test
+ public void givenTestStrings_whenStringBuilderMethods_thenProcessedString() {
+
+ String master = "Hello World Baeldung!";
+ String target = "Baeldung";
+ String replacement = "Java";
+
+ int startIndex = master.indexOf(target);
+ int stopIndex = startIndex + target.length();
+
+ StringBuilder builder = new StringBuilder(master);
+
+
+ builder.delete(startIndex, stopIndex);
+ assertFalse(builder.toString().contains(target));
+
+
+ builder.replace(startIndex, stopIndex, replacement);
+ assertTrue(builder.toString().contains(replacement));
+
+
+ }
+
+
+ @Test
+ public void givenTestStrings_whenStringUtilsMethods_thenProcessedStrings() {
+
+ String master = "Hello World Baeldung!";
+ String target = "Baeldung";
+ String replacement = "Java";
+
+ String processed = StringUtils.replace(master, target, replacement);
+ assertTrue(processed.contains(replacement));
+
+ String master2 = "Hello World Baeldung!";
+ String target2 = "baeldung";
+ String processed2 = StringUtils.replaceIgnoreCase(master2, target2, replacement);
+ assertFalse(processed2.contains(target));
+
+ }
+
+
+
+
+
+
+
+}
diff --git a/java-strings/src/test/java/com/baeldung/string/SubstringUnitTest.java b/java-strings/src/test/java/com/baeldung/string/SubstringUnitTest.java
index 3a4e231828..eb397f2a3f 100644
--- a/java-strings/src/test/java/com/baeldung/string/SubstringUnitTest.java
+++ b/java-strings/src/test/java/com/baeldung/string/SubstringUnitTest.java
@@ -59,4 +59,14 @@ public class SubstringUnitTest {
Assert.assertEquals("United States of America", text.substring(text.indexOf('(') + 1, text.indexOf(')')));
}
+ @Test
+ public void givenAString_whenUsedSubstringWithLastIndexOf_ShouldReturnProperSubstring() {
+ Assert.assertEquals("1984", text.substring(text.lastIndexOf('-') + 1, text.indexOf('.')));
+ }
+
+ @Test
+ public void givenAString_whenUsedSubstringWithIndexOfAString_ShouldReturnProperSubstring() {
+ Assert.assertEquals("USA (United States of America)", text.substring(text.indexOf("USA"), text.indexOf(')') + 1));
+ }
+
}
diff --git a/java-strings/src/test/java/com/baeldung/string/padding/StringPaddingUtilUnitTest.java b/java-strings/src/test/java/com/baeldung/string/padding/StringPaddingUtilUnitTest.java
new file mode 100644
index 0000000000..f6a077a88e
--- /dev/null
+++ b/java-strings/src/test/java/com/baeldung/string/padding/StringPaddingUtilUnitTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.string.padding;
+
+import com.google.common.base.Strings;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class StringPaddingUtilUnitTest {
+
+ String inputString = "123456";
+ String expectedPaddedStringSpaces = " 123456";
+ String expectedPaddedStringZeros = "0000123456";
+ int minPaddedStringLength = 10;
+
+ @Test
+ public void givenString_whenPaddingWithSpaces_thenStringPaddedMatches() {
+ assertEquals(expectedPaddedStringSpaces, StringPaddingUtil.padLeftSpaces(inputString, minPaddedStringLength));
+ }
+
+ @Test
+ public void givenString_whenPaddingWithSpacesUsingSubstring_thenStringPaddedMatches() {
+ assertEquals(expectedPaddedStringSpaces, StringPaddingUtil.padLeft(inputString, minPaddedStringLength));
+ }
+
+ @Test
+ public void givenString_whenPaddingWithZeros_thenStringPaddedMatches() {
+ assertEquals(expectedPaddedStringZeros, StringPaddingUtil.padLeftZeros(inputString, minPaddedStringLength));
+ }
+
+ @Test
+ public void givenString_whenPaddingWithSpacesUsingStringUtils_thenStringPaddedMatches() {
+ assertEquals(expectedPaddedStringSpaces, StringUtils.leftPad(inputString, minPaddedStringLength));
+ }
+
+ @Test
+ public void givenString_whenPaddingWithZerosUsingStringUtils_thenStringPaddedMatches() {
+ assertEquals(expectedPaddedStringZeros, StringUtils.leftPad(inputString, minPaddedStringLength, "0"));
+ }
+
+ @Test
+ public void givenString_whenPaddingWithSpacesUsingGuavaStrings_thenStringPaddedMatches() {
+ assertEquals(expectedPaddedStringSpaces, Strings.padStart(inputString, minPaddedStringLength, ' '));
+ }
+
+ @Test
+ public void givenString_whenPaddingWithZerosUsingGuavaStrings_thenStringPaddedMatches() {
+ assertEquals(expectedPaddedStringZeros, Strings.padStart(inputString, minPaddedStringLength, '0'));
+ }
+}
diff --git a/java-strings/src/test/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroesUnitTest.java b/java-strings/src/test/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroesUnitTest.java
new file mode 100644
index 0000000000..55f932fea1
--- /dev/null
+++ b/java-strings/src/test/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroesUnitTest.java
@@ -0,0 +1,143 @@
+package com.baeldung.string.removeleadingtrailingchar;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.stream.Stream;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+public class RemoveLeadingAndTrailingZeroesUnitTest {
+
+ public static Stream leadingZeroTestProvider() {
+ return Stream.of(Arguments.of("", ""), Arguments.of("abc", "abc"), Arguments.of("123", "123"), Arguments.of("0abc", "abc"), Arguments.of("0123", "123"), Arguments.of("0000123", "123"), Arguments.of("1230", "1230"), Arguments.of("01230", "1230"), Arguments.of("01", "1"),
+ Arguments.of("0001", "1"), Arguments.of("0", "0"), Arguments.of("00", "0"), Arguments.of("0000", "0"), Arguments.of("12034", "12034"), Arguments.of("1200034", "1200034"), Arguments.of("0012034", "12034"), Arguments.of("1203400", "1203400"));
+ }
+
+ public static Stream trailingZeroTestProvider() {
+ return Stream.of(Arguments.of("", ""), Arguments.of("abc", "abc"), Arguments.of("123", "123"), Arguments.of("abc0", "abc"), Arguments.of("1230", "123"), Arguments.of("1230000", "123"), Arguments.of("0123", "0123"), Arguments.of("01230", "0123"), Arguments.of("10", "1"),
+ Arguments.of("1000", "1"), Arguments.of("0", "0"), Arguments.of("00", "0"), Arguments.of("0000", "0"), Arguments.of("12034", "12034"), Arguments.of("1200034", "1200034"), Arguments.of("0012034", "0012034"), Arguments.of("1203400", "12034"));
+ }
+
+ @ParameterizedTest
+ @MethodSource("leadingZeroTestProvider")
+ public void givenTestStrings_whenRemoveLeadingZeroesWithStringBuilder_thenReturnWithoutLeadingZeroes(String input, String expected) {
+ // given
+
+ // when
+ String result = RemoveLeadingAndTrailingZeroes.removeLeadingZeroesWithStringBuilder(input);
+
+ // then
+ assertThat(result).isEqualTo(expected);
+ }
+
+ @ParameterizedTest
+ @MethodSource("trailingZeroTestProvider")
+ public void givenTestStrings_whenRemoveTrailingZeroesWithStringBuilder_thenReturnWithoutTrailingZeroes(String input, String expected) {
+ // given
+
+ // when
+ String result = RemoveLeadingAndTrailingZeroes.removeTrailingZeroesWithStringBuilder(input);
+
+ // then
+ assertThat(result).isEqualTo(expected);
+ }
+
+ @ParameterizedTest
+ @MethodSource("leadingZeroTestProvider")
+ public void givenTestStrings_whenRemoveLeadingZeroesWithSubstring_thenReturnWithoutLeadingZeroes(String input, String expected) {
+ // given
+
+ // when
+ String result = RemoveLeadingAndTrailingZeroes.removeLeadingZeroesWithSubstring(input);
+
+ // then
+ assertThat(result).isEqualTo(expected);
+ }
+
+ @ParameterizedTest
+ @MethodSource("trailingZeroTestProvider")
+ public void givenTestStrings_whenRemoveTrailingZeroesWithSubstring_thenReturnWithoutTrailingZeroes(String input, String expected) {
+ // given
+
+ // when
+ String result = RemoveLeadingAndTrailingZeroes.removeTrailingZeroesWithSubstring(input);
+
+ // then
+ assertThat(result).isEqualTo(expected);
+ }
+
+ @ParameterizedTest
+ @MethodSource("leadingZeroTestProvider")
+ public void givenTestStrings_whenRemoveLeadingZeroesWithApacheCommonsStripStart_thenReturnWithoutLeadingZeroes(String input, String expected) {
+ // given
+
+ // when
+ String result = RemoveLeadingAndTrailingZeroes.removeLeadingZeroesWithApacheCommonsStripStart(input);
+
+ // then
+ assertThat(result).isEqualTo(expected);
+ }
+
+ @ParameterizedTest
+ @MethodSource("trailingZeroTestProvider")
+ public void givenTestStrings_whenRemoveTrailingZeroesWithApacheCommonsStripEnd_thenReturnWithoutTrailingZeroes(String input, String expected) {
+ // given
+
+ // when
+ String result = RemoveLeadingAndTrailingZeroes.removeTrailingZeroesWithApacheCommonsStripEnd(input);
+
+ // then
+ assertThat(result).isEqualTo(expected);
+ }
+
+ @ParameterizedTest
+ @MethodSource("leadingZeroTestProvider")
+ public void givenTestStrings_whenRemoveLeadingZeroesWithGuavaTrimLeadingFrom_thenReturnWithoutLeadingZeroes(String input, String expected) {
+ // given
+
+ // when
+ String result = RemoveLeadingAndTrailingZeroes.removeLeadingZeroesWithGuavaTrimLeadingFrom(input);
+
+ // then
+ assertThat(result).isEqualTo(expected);
+ }
+
+ @ParameterizedTest
+ @MethodSource("trailingZeroTestProvider")
+ public void givenTestStrings_whenRemoveTrailingZeroesWithGuavaTrimTrailingFrom_thenReturnWithoutTrailingZeroes(String input, String expected) {
+ // given
+
+ // when
+ String result = RemoveLeadingAndTrailingZeroes.removeTrailingZeroesWithGuavaTrimTrailingFrom(input);
+
+ // then
+ assertThat(result).isEqualTo(expected);
+ }
+
+ @ParameterizedTest
+ @MethodSource("leadingZeroTestProvider")
+ public void givenTestStrings_whenRemoveLeadingZeroesWithRegex_thenReturnWithoutLeadingZeroes(String input, String expected) {
+ // given
+
+ // when
+ String result = RemoveLeadingAndTrailingZeroes.removeLeadingZeroesWithRegex(input);
+
+ // then
+ assertThat(result).isEqualTo(expected);
+ }
+
+ @ParameterizedTest
+ @MethodSource("trailingZeroTestProvider")
+ public void givenTestStrings_whenRemoveTrailingZeroesWithRegex_thenReturnWithoutTrailingZeroes(String input, String expected) {
+ // given
+
+ // when
+ String result = RemoveLeadingAndTrailingZeroes.removeTrailingZeroesWithRegex(input);
+
+ // then
+ assertThat(result).isEqualTo(expected);
+ }
+
+}
diff --git a/java-strings/src/test/java/com/baeldung/stringduplicates/RemoveDuplicateFromStringUnitTest.java b/java-strings/src/test/java/com/baeldung/stringduplicates/RemoveDuplicateFromStringUnitTest.java
new file mode 100644
index 0000000000..895ecc4a3b
--- /dev/null
+++ b/java-strings/src/test/java/com/baeldung/stringduplicates/RemoveDuplicateFromStringUnitTest.java
@@ -0,0 +1,82 @@
+package com.baeldung.stringduplicates;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RemoveDuplicateFromStringUnitTest {
+
+ private final static String STR1 = "racecar";
+ private final static String STR2 = "J2ee programming";
+ private final static String STR_EMPTY = "";
+
+ private RemoveDuplicateFromString removeDuplicateFromString;
+
+ @Before
+ public void executedBeforeEach() {
+ removeDuplicateFromString = new RemoveDuplicateFromString();
+ }
+
+
+ @Test
+ public void whenUsingCharArray_DuplicatesShouldBeRemovedWithoutKeepingStringOrder() {
+ String str1 = removeDuplicateFromString.removeDuplicatesUsingCharArray(STR1);
+ String str2 = removeDuplicateFromString.removeDuplicatesUsingCharArray(STR2);
+ String strEmpty = removeDuplicateFromString.removeDuplicatesUsingCharArray(STR_EMPTY);
+ Assert.assertEquals("", strEmpty);
+ Assert.assertEquals("ecar", str1);
+ Assert.assertEquals("J2e poraming", str2);
+ }
+
+ @Test
+ public void whenUsingLinkedHashSet_DuplicatesShouldBeRemovedAndItKeepStringOrder() {
+ String str1 = removeDuplicateFromString.removeDuplicatesUsinglinkedHashSet(STR1);
+ String str2 = removeDuplicateFromString.removeDuplicatesUsinglinkedHashSet(STR2);
+
+ String strEmpty = removeDuplicateFromString.removeDuplicatesUsinglinkedHashSet(STR_EMPTY);
+ Assert.assertEquals("", strEmpty);
+ Assert.assertEquals("race", str1);
+ Assert.assertEquals("J2e progamin", str2);
+ }
+
+ @Test
+ public void whenUsingSorting_DuplicatesShouldBeRemovedWithoutKeepingStringOrder() {
+ String str1 = removeDuplicateFromString.removeDuplicatesUsingSorting(STR1);
+ String str2 = removeDuplicateFromString.removeDuplicatesUsingSorting(STR2);
+
+ String strEmpty = removeDuplicateFromString.removeDuplicatesUsingSorting(STR_EMPTY);
+ Assert.assertEquals("", strEmpty);
+ Assert.assertEquals("acer", str1);
+ Assert.assertEquals(" 2Jaegimnopr", str2);
+ }
+
+ @Test
+ public void whenUsingHashSet_DuplicatesShouldBeRemovedWithoutKeepingStringOrder() {
+ String str1 = removeDuplicateFromString.removeDuplicatesUsingHashSet(STR1);
+ String str2 = removeDuplicateFromString.removeDuplicatesUsingHashSet(STR2);
+ String strEmpty = removeDuplicateFromString.removeDuplicatesUsingHashSet(STR_EMPTY);
+ Assert.assertEquals("", strEmpty);
+ Assert.assertEquals("arce", str1);
+ Assert.assertEquals(" pa2regiJmno", str2);
+ }
+
+ @Test
+ public void whenUsingIndexOf_DuplicatesShouldBeRemovedWithoutKeepingStringOrder() {
+ String str1 = removeDuplicateFromString.removeDuplicatesUsingIndexOf(STR1);
+ String str2 = removeDuplicateFromString.removeDuplicatesUsingIndexOf(STR2);
+ String strEmpty = removeDuplicateFromString.removeDuplicatesUsingIndexOf(STR_EMPTY);
+ Assert.assertEquals("", strEmpty);
+ Assert.assertEquals("ecar", str1);
+ Assert.assertEquals("J2e poraming", str2);
+ }
+
+ @Test
+ public void whenUsingJava8_DuplicatesShouldBeRemovedAndItKeepStringOrder() {
+ String str1 = removeDuplicateFromString.removeDuplicatesUsingDistinct(STR1);
+ String str2 = removeDuplicateFromString.removeDuplicatesUsingDistinct(STR2);
+ String strEmpty = removeDuplicateFromString.removeDuplicatesUsingDistinct(STR_EMPTY);
+ Assert.assertEquals("", strEmpty);
+ Assert.assertEquals("race", str1);
+ Assert.assertEquals("J2e progamin", str2);
+ }
+}
diff --git a/java-vavr-stream/pom.xml b/java-vavr-stream/pom.xml
index 395d2c81ba..c92f3c8742 100644
--- a/java-vavr-stream/pom.xml
+++ b/java-vavr-stream/pom.xml
@@ -5,6 +5,7 @@
com.baeldung.samples
java-vavr-stream
1.0
+ java-vavr-stream
jar
diff --git a/java-websocket/pom.xml b/java-websocket/pom.xml
index e8ff8dfc36..7ba3ca61d0 100644
--- a/java-websocket/pom.xml
+++ b/java-websocket/pom.xml
@@ -1,10 +1,10 @@
4.0.0
- com.baeldung
java-websocket
- war
0.0.1-SNAPSHOT
+ java-websocket
+ war
com.baeldung
diff --git a/javafx/pom.xml b/javafx/pom.xml
index c9c5bc294e..44e6f7e8da 100644
--- a/javafx/pom.xml
+++ b/javafx/pom.xml
@@ -3,7 +3,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
javafx
-
+ javafx
+
parent-modules
com.baeldung
diff --git a/javax-servlets/pom.xml b/javax-servlets/pom.xml
index 7b4eecd880..f00dd0ebe8 100644
--- a/javax-servlets/pom.xml
+++ b/javax-servlets/pom.xml
@@ -5,6 +5,7 @@
com.baeldung.javax-servlets
javax-servlets
1.0-SNAPSHOT
+ javax-servlets
war
diff --git a/javaxval/pom.xml b/javaxval/pom.xml
index 22f1827213..5f2690b5b4 100644
--- a/javaxval/pom.xml
+++ b/javaxval/pom.xml
@@ -1,10 +1,10 @@
4.0.0
- com.baeldung
javaxval
0.1-SNAPSHOT
-
+ javaxval
+
com.baeldung
parent-modules
diff --git a/jee-7/pom.xml b/jee-7/pom.xml
index 4f6e6a20fb..97ed2cc51d 100644
--- a/jee-7/pom.xml
+++ b/jee-7/pom.xml
@@ -1,430 +1,538 @@
-
- 4.0.0
- jee-7
- 1.0-SNAPSHOT
- war
- JavaEE 7 Arquillian Archetype Sample
+
+ 4.0.0
+ jee-7
+ 1.0-SNAPSHOT
+ jee-7
+ war
+ JavaEE 7 Arquillian Archetype Sample
-
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
-
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
-
-
- javax
- javaee-api
- ${javaee_api.version}
- provided
-
+
+
+ javax
+ javaee-api
+ ${javaee_api.version}
+ provided
+
-
- org.jboss.arquillian.junit
- arquillian-junit-container
- test
-
-
- org.jboss.arquillian.graphene
- graphene-webdriver
- ${graphene-webdriver.version}
- pom
- test
-
-
- com.jayway.awaitility
- awaitility
- ${awaitility.version}
- test
-
+
+ org.jboss.arquillian.junit
+ arquillian-junit-container
+ test
+
+
+ org.jboss.arquillian.graphene
+ graphene-webdriver
+ ${graphene-webdriver.version}
+ pom
+ test
+
+
+ com.jayway.awaitility
+ awaitility
+ ${awaitility.version}
+ test
+
-
- org.jboss.shrinkwrap.resolver
- shrinkwrap-resolver-impl-maven
- test
- jar
-
+
+ org.jboss.shrinkwrap.resolver
+ shrinkwrap-resolver-impl-maven
+ test
+ jar
+
-
- org.jboss.shrinkwrap.resolver
- shrinkwrap-resolver-impl-maven-archive
- test
-
-
- org.apache.httpcomponents
- httpclient
- ${httpclient.version}
-
-
- commons-io
- commons-io
- ${commons-io.version}
-
-
- com.sun.faces
- jsf-api
- ${com.sun.faces.jsf.version}
-
-
- com.sun.faces
- jsf-impl
- ${com.sun.faces.jsf.version}
-
-
- javax.servlet
- jstl
- ${jstl.version}
-
-
- javax.servlet
- javax.servlet-api
- ${javax.servlet-api.version}
-
-
- javax.servlet.jsp
- jsp-api
- ${jsp-api.version}
- provided
-
-
- taglibs
- standard
- ${taglibs.standard.version}
-
+
+ org.jboss.shrinkwrap.resolver
+ shrinkwrap-resolver-impl-maven-archive
+ test
+
+
+ org.apache.httpcomponents
+ httpclient
+ ${httpclient.version}
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+ com.sun.faces
+ jsf-api
+ ${com.sun.faces.jsf.version}
+
+
+ com.sun.faces
+ jsf-impl
+ ${com.sun.faces.jsf.version}
+
+
+ javax.servlet
+ jstl
+ ${jstl.version}
+
+
+ javax.servlet
+ javax.servlet-api
+ ${javax.servlet-api.version}
+
+
+ javax.servlet.jsp
+ jsp-api
+ ${jsp-api.version}
+ provided
+
+
+ taglibs
+ standard
+ ${taglibs.standard.version}
+
-
- javax.mvc
- javax.mvc-api
- 20160715
-
-
- org.glassfish.ozark
- ozark
- ${ozark.version}
-
+
+ javax.mvc
+ javax.mvc-api
+ 20160715
+
+
+ org.glassfish.ozark
+ ozark
+ ${ozark.version}
+
-
- org.springframework.security
- spring-security-web
- ${org.springframework.security.version}
-
+
+ org.springframework.security
+ spring-security-web
+ ${org.springframework.security.version}
+
-
- org.springframework.security
- spring-security-config
- ${org.springframework.security.version}
-
-
- org.springframework.security
- spring-security-taglibs
- ${org.springframework.security.version}
-
-
+
+ org.springframework.security
+ spring-security-config
+ ${org.springframework.security.version}
+
+
+ org.springframework.security
+ spring-security-taglibs
+ ${org.springframework.security.version}
+
+
-
-
-
- org.apache.maven.plugins
- maven-war-plugin
- ${maven-war-plugin.version}
-
- src/main/webapp
- false
-
-
-
-
+
+ org.jboss.spec.javax.batch
+ jboss-batch-api_1.0_spec
+ 1.0.0.Final
+
+
+ org.jberet
+ jberet-core
+ 1.0.2.Final
+
+
+ org.jberet
+ jberet-support
+ 1.0.2.Final
+
+
+ org.jboss.spec.javax.transaction
+ jboss-transaction-api_1.2_spec
+ 1.0.0.Final
+
+
+ org.jboss.marshalling
+ jboss-marshalling
+ 1.4.2.Final
+
+
+ org.jboss.weld
+ weld-core
+ 2.1.1.Final
+
+
+ org.jboss.weld.se
+ weld-se
+ 2.1.1.Final
+
+
+ org.jberet
+ jberet-se
+ 1.0.2.Final
+
+
+ com.h2database
+ h2
+ 1.4.178
+
+
+ org.glassfish.jersey.containers
+ jersey-container-jetty-servlet
+ 2.22.1
+
+
-
-
-
- org.jboss.arquillian
- arquillian-bom
- ${arquillian_core.version}
- import
- pom
-
-
- org.jboss.arquillian.extension
- arquillian-drone-bom
- ${arquillian-drone-bom.version}
- pom
- import
-
-
-
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+ ${maven-war-plugin.version}
+
+ src/main/webapp
+ false
+
+
+
+
+
+
+
+ org.eclipse.m2e
+ lifecycle-mapping
+ 1.0.0
+
+
+
+
+
+
+ org.apache.maven.plugins
+
+
+ maven-pmd-plugin
+
+
+ [3.8,)
+
+
+ check
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
- wildfly-managed-arquillian
-
- true
-
-
- standalone-full.xml
- ${project.build.directory}/wildfly-${version.wildfly}
-
-
-
- io.undertow
- undertow-websockets-jsr
- ${undertow-websockets-jsr.version}
- test
-
-
- org.jboss.resteasy
- resteasy-client
- ${resteasy.version}
- test
-
-
- org.jboss.resteasy
- resteasy-jaxb-provider
- ${resteasy.version}
- test
-
-
- org.jboss.resteasy
- resteasy-json-p-provider
- ${resteasy.version}
- test
-
-
- org.wildfly
- wildfly-arquillian-container-managed
- ${wildfly.version}
- test
-
-
+
+
+
+ org.jboss.arquillian
+ arquillian-bom
+ ${arquillian_core.version}
+ import
+ pom
+
+
+ org.jboss.arquillian.extension
+ arquillian-drone-bom
+ ${arquillian-drone-bom.version}
+ pom
+ import
+
+
+
-
-
-
-
- maven-dependency-plugin
- ${maven-dependency-plugin.version}
-
- ${maven.test.skip}
-
-
-
- unpack
- process-test-classes
-
- unpack
-
-
-
-
- org.wildfly
- wildfly-dist
- ${wildfly.version}
- zip
- false
- ${project.build.directory}
-
-
-
-
-
-
-
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
-
- ${project.build.directory}/wildfly-${wildfly.version}
-
-
-
-
-
-
-
-
- wildfly-remote-arquillian
-
-
- io.undertow
- undertow-websockets-jsr
- ${undertow-websockets-jsr.version}
- test
-
-
- org.jboss.resteasy
- resteasy-client
- ${resteasy.version}
- test
-
-
- org.jboss.resteasy
- resteasy-jaxb-provider
- ${resteasy.version}
- test
-
-
- org.jboss.resteasy
- resteasy-json-p-provider
- ${resteasy.version}
- test
-
-
- org.wildfly
- wildfly-arquillian-container-remote
- ${wildfly.version}
- test
-
-
-
-
- glassfish-embedded-arquillian
-
-
- org.glassfish.main.extras
- glassfish-embedded-all
- ${glassfish-embedded-all.version}
- test
-
-
- org.glassfish
- javax.json
- ${javax.json.version}
- test
-
-
- org.glassfish.tyrus
- tyrus-client
- ${tyrus.version}
- test
-
-
- org.glassfish.tyrus
- tyrus-container-grizzly-client
- ${tyrus.version}
- test
-
-
- org.glassfish.jersey.core
- jersey-client
- ${jersey.version}
- test
-
-
- org.jboss.arquillian.container
- arquillian-glassfish-embedded-3.1
- ${arquillian-glassfish.version}
- test
-
-
-
-
- glassfish-remote-arquillian
-
-
- org.glassfish
- javax.json
- ${javax.json.version}
- test
-
-
- org.glassfish.tyrus
- tyrus-client
- ${tyrus.version}
- test
-
-
- org.glassfish.tyrus
- tyrus-container-grizzly-client
- ${tyrus.version}
- test
-
-
- org.glassfish.jersey.core
- jersey-client
- ${jersey.version}
- test
-
-
- org.glassfish.jersey.media
- jersey-media-json-jackson
- ${jersey.version}
- test
-
-
- org.glassfish.jersey.media
- jersey-media-json-processing
- ${jersey.version}
- test
-
-
- org.jboss.arquillian.container
- arquillian-glassfish-remote-3.1
- ${arquillian-glassfish.version}
- test
-
-
-
-
- webdriver-chrome
-
- true
-
-
- chrome
-
-
-
- webdriver-firefox
-
- firefox
-
-
-
+
+
+ wildfly-managed-arquillian
+
+ true
+
+
+ standalone-full.xml
+ ${project.build.directory}/wildfly-${version.wildfly}
+
+
+
+ io.undertow
+ undertow-websockets-jsr
+ ${undertow-websockets-jsr.version}
+ test
+
+
+ org.jboss.resteasy
+ resteasy-client
+ ${resteasy.version}
+ test
+
+
+ org.jboss.resteasy
+ resteasy-jaxb-provider
+ ${resteasy.version}
+ test
+
+
+ org.jboss.resteasy
+ resteasy-json-p-provider
+ ${resteasy.version}
+ test
+
+
+ org.wildfly
+ wildfly-arquillian-container-managed
+ ${wildfly.version}
+ test
+
+
+ sun.jdk
+ jconsole
+
+
+
+
-
-
- bintray-mvc-spec-maven
- bintray
- http://dl.bintray.com/mvc-spec/maven
-
- true
-
-
- false
-
-
-
+
+
+
+
+ maven-dependency-plugin
+ ${maven-dependency-plugin.version}
+
+ ${maven.test.skip}
+
+
+
+ unpack
+ process-test-classes
+
+ unpack
+
+
+
+
+ org.wildfly
+ wildfly-dist
+ ${wildfly.version}
+ zip
+ false
+ ${project.build.directory}
+
+
+ sun.jdk
+ jconsole
+
+
+
+
+
+
+
+
+
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+
+ ${project.build.directory}/wildfly-${wildfly.version}
+
+
+
+
+
+
+
+
+ wildfly-remote-arquillian
+
+
+ io.undertow
+ undertow-websockets-jsr
+ ${undertow-websockets-jsr.version}
+ test
+
+
+ org.jboss.resteasy
+ resteasy-client
+ ${resteasy.version}
+ test
+
+
+ org.jboss.resteasy
+ resteasy-jaxb-provider
+ ${resteasy.version}
+ test
+
+
+ org.jboss.resteasy
+ resteasy-json-p-provider
+ ${resteasy.version}
+ test
+
+
+ org.wildfly
+ wildfly-arquillian-container-remote
+ ${wildfly.version}
+ test
+
+
+ sun.jdk
+ jconsole
+
+
+
+
+
+
+ glassfish-embedded-arquillian
+
+
+ org.glassfish.main.extras
+ glassfish-embedded-all
+ ${glassfish-embedded-all.version}
+ test
+
+
+ org.glassfish
+ javax.json
+ ${javax.json.version}
+ test
+
+
+ org.glassfish.tyrus
+ tyrus-client
+ ${tyrus.version}
+ test
+
+
+ org.glassfish.tyrus
+ tyrus-container-grizzly-client
+ ${tyrus.version}
+ test
+
+
+ org.glassfish.jersey.core
+ jersey-client
+ ${jersey.version}
+ test
+
+
+ org.jboss.arquillian.container
+ arquillian-glassfish-embedded-3.1
+ ${arquillian-glassfish.version}
+ test
+
+
+
+
+ glassfish-remote-arquillian
+
+
+ org.glassfish
+ javax.json
+ ${javax.json.version}
+ test
+
+
+ org.glassfish.tyrus
+ tyrus-client
+ ${tyrus.version}
+ test
+
+
+ org.glassfish.tyrus
+ tyrus-container-grizzly-client
+ ${tyrus.version}
+ test
+
+
+ org.glassfish.jersey.core
+ jersey-client
+ ${jersey.version}
+ test
+
+
+ org.glassfish.jersey.media
+ jersey-media-json-jackson
+ ${jersey.version}
+ test
+
+
+ org.glassfish.jersey.media
+ jersey-media-json-processing
+ ${jersey.version}
+ test
+
+
+ org.jboss.arquillian.container
+ arquillian-glassfish-remote-3.1
+ ${arquillian-glassfish.version}
+ test
+
+
+
+
+ webdriver-chrome
+
+ true
+
+
+ chrome
+
+
+
+ webdriver-firefox
+
+ firefox
+
+
+
-
- 1.8
- 3.0.0
- 7.0
- 1.1.11.Final
- 8.2.1.Final
- 1.7.0
- 1.4.6.Final
- 3.0.19.Final
- 4.1.1
- 1.0.4
- 1.13
- 2.25
- 1.0.0.Final
- 2.6
- 4.2.3.RELEASE
- 2.21.0
- 1.1.2
- 2.4
- 2.2.14
- 4.5
- 2.0.1.Final
- 3.1.0
- 2.1.0.Final
- 2.8
- 1.2
- 2.2
- 20160715
-
+
+
+ bintray-mvc-spec-maven
+ bintray
+ http://dl.bintray.com/mvc-spec/maven
+
+ true
+
+
+ false
+
+
+
-
+
+ 1.8
+ 3.0.0
+ 7.0
+ 1.1.11.Final
+ 8.2.1.Final
+ 1.7.0
+ 1.4.6.Final
+ 3.0.19.Final
+ 4.1.1
+ 1.0.4
+ 1.13
+ 2.25
+ 1.0.0.Final
+ 2.6
+ 4.2.3.RELEASE
+ 2.21.0
+ 1.1.2
+ 2.4
+ 2.2.14
+ 4.5
+ 2.0.1.Final
+ 3.1.0
+ 2.1.0.Final
+ 2.8
+ 1.2
+ 2.2
+ 20160715
+
+
+
\ No newline at end of file
diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/ChunkExceptionSkipReadListener.java b/jee-7/src/main/java/com/baeldung/batch/understanding/ChunkExceptionSkipReadListener.java
new file mode 100644
index 0000000000..ce47de66af
--- /dev/null
+++ b/jee-7/src/main/java/com/baeldung/batch/understanding/ChunkExceptionSkipReadListener.java
@@ -0,0 +1,11 @@
+package com.baeldung.batch.understanding;
+
+import javax.batch.api.chunk.listener.SkipReadListener;
+import javax.inject.Named;
+
+@Named
+public class ChunkExceptionSkipReadListener implements SkipReadListener {
+ @Override
+ public void onSkipReadItem(Exception e) throws Exception {
+ }
+}
\ No newline at end of file
diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/CustomCheckPoint.java b/jee-7/src/main/java/com/baeldung/batch/understanding/CustomCheckPoint.java
new file mode 100644
index 0000000000..fe6759b365
--- /dev/null
+++ b/jee-7/src/main/java/com/baeldung/batch/understanding/CustomCheckPoint.java
@@ -0,0 +1,12 @@
+package com.baeldung.batch.understanding;
+
+import javax.batch.api.chunk.AbstractCheckpointAlgorithm;
+import javax.inject.Named;
+
+@Named
+public class CustomCheckPoint extends AbstractCheckpointAlgorithm {
+ @Override
+ public boolean isReadyToCheckpoint() throws Exception {
+ return SimpleChunkItemReader.COUNT % 5 == 0;
+ }
+}
diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/DeciderJobSequence.java b/jee-7/src/main/java/com/baeldung/batch/understanding/DeciderJobSequence.java
new file mode 100644
index 0000000000..6cc2012f23
--- /dev/null
+++ b/jee-7/src/main/java/com/baeldung/batch/understanding/DeciderJobSequence.java
@@ -0,0 +1,14 @@
+package com.baeldung.batch.understanding;
+
+import javax.batch.api.Decider;
+import javax.batch.runtime.StepExecution;
+import javax.inject.Named;
+
+@Named
+public class DeciderJobSequence implements Decider {
+ @Override
+ public String decide(StepExecution[] ses) throws Exception {
+ return "nothing";
+ }
+
+}
\ No newline at end of file
diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/InjectSimpleBatchLet.java b/jee-7/src/main/java/com/baeldung/batch/understanding/InjectSimpleBatchLet.java
new file mode 100644
index 0000000000..93eb20708d
--- /dev/null
+++ b/jee-7/src/main/java/com/baeldung/batch/understanding/InjectSimpleBatchLet.java
@@ -0,0 +1,20 @@
+package com.baeldung.batch.understanding;
+
+import javax.batch.api.AbstractBatchlet;
+import javax.batch.api.BatchProperty;
+import javax.batch.runtime.BatchStatus;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+@Named
+public class InjectSimpleBatchLet extends AbstractBatchlet {
+ @Inject
+ @BatchProperty(name = "name")
+ private String nameString;
+
+ @Override
+ public String process() throws Exception {
+ System.out.println("Value passed in = " + nameString);
+ return BatchStatus.COMPLETED.toString();
+ }
+}
diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleBatchLet.java b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleBatchLet.java
new file mode 100644
index 0000000000..6a367b064b
--- /dev/null
+++ b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleBatchLet.java
@@ -0,0 +1,13 @@
+package com.baeldung.batch.understanding;
+
+import javax.batch.api.AbstractBatchlet;
+import javax.batch.runtime.BatchStatus;
+import javax.inject.Named;
+
+@Named
+public class SimpleBatchLet extends AbstractBatchlet {
+ @Override
+ public String process() throws Exception {
+ return BatchStatus.FAILED.toString();
+ }
+}
diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemProcessor.java b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemProcessor.java
new file mode 100644
index 0000000000..3f8166b6d8
--- /dev/null
+++ b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemProcessor.java
@@ -0,0 +1,12 @@
+package com.baeldung.batch.understanding;
+
+import javax.batch.api.chunk.ItemProcessor;
+import javax.inject.Named;
+
+@Named
+public class SimpleChunkItemProcessor implements ItemProcessor {
+ @Override
+ public Integer processItem(Object t) {
+ return ((Integer) t).intValue() % 2 == 0 ? null : ((Integer) t).intValue();
+ }
+}
diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReader.java b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReader.java
new file mode 100644
index 0000000000..10f81d95d0
--- /dev/null
+++ b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReader.java
@@ -0,0 +1,27 @@
+package com.baeldung.batch.understanding;
+
+import java.io.Serializable;
+import java.util.StringTokenizer;
+import javax.batch.api.chunk.AbstractItemReader;
+import javax.inject.Named;
+
+@Named
+public class SimpleChunkItemReader extends AbstractItemReader {
+ private StringTokenizer tokens;
+ public static int COUNT = 0;
+
+ @Override
+ public Integer readItem() throws Exception {
+ if (tokens.hasMoreTokens()) {
+ COUNT++;
+ String tempTokenize = tokens.nextToken();
+ return Integer.valueOf(tempTokenize);
+ }
+ return null;
+ }
+
+ @Override
+ public void open(Serializable checkpoint) throws Exception {
+ tokens = new StringTokenizer("1,2,3,4,5,6,7,8,9,10", ",");
+ }
+}
diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReaderError.java b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReaderError.java
new file mode 100644
index 0000000000..92096d0571
--- /dev/null
+++ b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReaderError.java
@@ -0,0 +1,31 @@
+package com.baeldung.batch.understanding;
+
+import java.io.Serializable;
+import java.util.StringTokenizer;
+
+import javax.batch.api.chunk.AbstractItemReader;
+import javax.inject.Named;
+
+@Named
+public class SimpleChunkItemReaderError extends AbstractItemReader {
+ private StringTokenizer tokens;
+ public static int COUNT = 0;
+
+ @Override
+ public Integer readItem() throws Exception {
+ if (tokens.hasMoreTokens()) {
+ COUNT++;
+ int token = Integer.valueOf(tokens.nextToken());
+ if (token == 3) {
+ throw new RuntimeException("Something happened");
+ }
+ return Integer.valueOf(token);
+ }
+ return null;
+ }
+
+ @Override
+ public void open(Serializable checkpoint) throws Exception {
+ tokens = new StringTokenizer("1,2,3,4,5,6,7,8,9,10", ",");
+ }
+}
\ No newline at end of file
diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkWriter.java b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkWriter.java
new file mode 100644
index 0000000000..909596766d
--- /dev/null
+++ b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkWriter.java
@@ -0,0 +1,13 @@
+package com.baeldung.batch.understanding;
+
+import java.util.List;
+
+import javax.batch.api.chunk.AbstractItemWriter;
+import javax.inject.Named;
+
+@Named
+public class SimpleChunkWriter extends AbstractItemWriter {
+ @Override
+ public void writeItems(List
+
+
+ io.arrow-kt
+ arrow-core
+ 0.7.3
+
+
diff --git a/kotlin-libraries/src/main/kotlin/com/baeldung/kotlin/arrow/FunctionalErrorHandlingWithEither.kt b/kotlin-libraries/src/main/kotlin/com/baeldung/kotlin/arrow/FunctionalErrorHandlingWithEither.kt
new file mode 100644
index 0000000000..75dfb9a2a4
--- /dev/null
+++ b/kotlin-libraries/src/main/kotlin/com/baeldung/kotlin/arrow/FunctionalErrorHandlingWithEither.kt
@@ -0,0 +1,54 @@
+package com.baeldung.kotlin.arrow
+
+import arrow.core.Either
+import arrow.core.filterOrElse
+import kotlin.math.sqrt
+
+class FunctionalErrorHandlingWithEither {
+
+ sealed class ComputeProblem {
+ object OddNumber : ComputeProblem()
+ object NotANumber : ComputeProblem()
+ }
+
+ fun parseInput(s : String) : Either = Either.cond(s.toIntOrNull() != null, {-> s.toInt()}, {->ComputeProblem.NotANumber} )
+
+ fun isEven(x : Int) : Boolean = x % 2 == 0
+
+ fun biggestDivisor(x: Int) : Int = biggestDivisor(x, 2)
+
+ fun biggestDivisor(x : Int, y : Int) : Int {
+ if(x == y){
+ return 1;
+ }
+ if(x % y == 0){
+ return x / y;
+ }
+ return biggestDivisor(x, y+1)
+ }
+
+ fun isSquareNumber(x : Int) : Boolean {
+ val sqrt: Double = sqrt(x.toDouble())
+ return sqrt % 1.0 == 0.0
+ }
+
+ fun computeWithEither(input : String) : Either {
+ return parseInput(input)
+ .filterOrElse(::isEven) {->ComputeProblem.OddNumber}
+ .map (::biggestDivisor)
+ .map (::isSquareNumber)
+ }
+
+ fun computeWithEitherClient(input : String) {
+ val computeWithEither = computeWithEither(input)
+
+ when(computeWithEither){
+ is Either.Right -> "The greatest divisor is square number: ${computeWithEither.b}"
+ is Either.Left -> when(computeWithEither.a){
+ is ComputeProblem.NotANumber -> "Wrong input! Not a number!"
+ is ComputeProblem.OddNumber -> "It is an odd number!"
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/kotlin-libraries/src/main/kotlin/com/baeldung/kotlin/arrow/FunctionalErrorHandlingWithOption.kt b/kotlin-libraries/src/main/kotlin/com/baeldung/kotlin/arrow/FunctionalErrorHandlingWithOption.kt
new file mode 100644
index 0000000000..5fddd1d88e
--- /dev/null
+++ b/kotlin-libraries/src/main/kotlin/com/baeldung/kotlin/arrow/FunctionalErrorHandlingWithOption.kt
@@ -0,0 +1,46 @@
+package com.baeldung.kotlin.arrow
+
+import arrow.core.None
+import arrow.core.Option
+import arrow.core.Some
+import kotlin.math.sqrt
+
+class FunctionalErrorHandlingWithOption {
+
+ fun parseInput(s : String) : Option = Option.fromNullable(s.toIntOrNull())
+
+ fun isEven(x : Int) : Boolean = x % 2 == 0
+
+ fun biggestDivisor(x: Int) : Int = biggestDivisor(x, 2)
+
+ fun biggestDivisor(x : Int, y : Int) : Int {
+ if(x == y){
+ return 1;
+ }
+ if(x % y == 0){
+ return x / y;
+ }
+ return biggestDivisor(x, y+1)
+ }
+
+ fun isSquareNumber(x : Int) : Boolean {
+ val sqrt: Double = sqrt(x.toDouble())
+ return sqrt % 1.0 == 0.0
+ }
+
+ fun computeWithOption(input : String) : Option {
+ return parseInput(input)
+ .filter(::isEven)
+ .map(::biggestDivisor)
+ .map(::isSquareNumber)
+ }
+
+ fun computeWithOptionClient(input : String) : String{
+ val computeOption = computeWithOption(input)
+
+ return when(computeOption){
+ is None -> "Not an even number!"
+ is Some -> "The greatest divisor is square number: ${computeOption.t}"
+ }
+ }
+}
\ No newline at end of file
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/arrow/FunctionalDataTypes.kt b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/arrow/FunctionalDataTypes.kt
new file mode 100644
index 0000000000..692425ee07
--- /dev/null
+++ b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/arrow/FunctionalDataTypes.kt
@@ -0,0 +1,143 @@
+package com.baeldung.kotlin.arrow
+
+import arrow.core.*
+import org.junit.Assert
+import org.junit.Test
+
+class FunctionalDataTypes {
+
+ @Test
+ fun whenIdCreated_thanValueIsPresent(){
+ val id = Id("foo")
+ val justId = Id.just("foo");
+
+ Assert.assertEquals("foo", id.extract())
+ Assert.assertEquals(justId, id)
+ }
+
+ fun length(s : String) : Int = s.length
+
+ fun isBigEnough(i : Int) : Boolean = i > 10
+
+ @Test
+ fun whenIdCreated_thanMapIsAssociative(){
+ val foo = Id("foo")
+
+ val map1 = foo.map(::length)
+ .map(::isBigEnough)
+ val map2 = foo.map { s -> isBigEnough(length(s)) }
+
+ Assert.assertEquals(map1, map2)
+ }
+
+ fun lengthId(s : String) : Id = Id.just(length(s))
+
+ fun isBigEnoughId(i : Int) : Id = Id.just(isBigEnough(i))
+
+ @Test
+ fun whenIdCreated_thanFlatMapIsAssociative(){
+ val bar = Id("bar")
+
+ val flatMap = bar.flatMap(::lengthId)
+ .flatMap(::isBigEnoughId)
+ val flatMap1 = bar.flatMap { s -> lengthId(s).flatMap(::isBigEnoughId) }
+
+ Assert.assertEquals(flatMap, flatMap1)
+ }
+
+ @Test
+ fun whenOptionCreated_thanValueIsPresent(){
+ val factory = Option.just(42)
+ val constructor = Option(42)
+ val emptyOptional = Option.empty()
+ val fromNullable = Option.fromNullable(null)
+
+ Assert.assertEquals(42, factory.getOrElse { -1 })
+ Assert.assertEquals(factory, constructor)
+ Assert.assertEquals(emptyOptional, fromNullable)
+ }
+
+ @Test
+ fun whenOptionCreated_thanConstructorDifferFromFactory(){
+ val constructor : Option = Option(null)
+ val fromNullable : Option = Option.fromNullable(null)
+
+ try{
+ constructor.map { s -> s!!.length }
+ Assert.fail()
+ } catch (e : KotlinNullPointerException){
+ fromNullable.map { s->s!!.length }
+ }
+ Assert.assertNotEquals(constructor, fromNullable)
+ }
+
+ fun wrapper(x : Integer?) : Option = if (x == null) Option.just(-1) else Option.just(x.toInt())
+
+ @Test
+ fun whenOptionFromNullableCreated_thanItBreaksLeftIdentity(){
+ val optionFromNull = Option.fromNullable(null)
+
+ Assert.assertNotEquals(optionFromNull.flatMap(::wrapper), wrapper(null))
+ }
+
+ @Test
+ fun whenEitherCreated_thanOneValueIsPresent(){
+ val rightOnly : Either = Either.right(42)
+ val leftOnly : Either = Either.left("foo")
+
+ Assert.assertTrue(rightOnly.isRight())
+ Assert.assertTrue(leftOnly.isLeft())
+ Assert.assertEquals(42, rightOnly.getOrElse { -1 })
+ Assert.assertEquals(-1, leftOnly.getOrElse { -1 })
+
+ Assert.assertEquals(0, rightOnly.map { it % 2 }.getOrElse { -1 })
+ Assert.assertEquals(-1, leftOnly.map { it % 2 }.getOrElse { -1 })
+ Assert.assertTrue(rightOnly.flatMap { Either.Right(it % 2) }.isRight())
+ Assert.assertTrue(leftOnly.flatMap { Either.Right(it % 2) }.isLeft())
+ }
+
+ @Test
+ fun whenEvalNowUsed_thenMapEvaluatedLazily(){
+ val now = Eval.now(1)
+ Assert.assertEquals(1, now.value())
+
+ var counter : Int = 0
+ val map = now.map { x -> counter++; x+1 }
+ Assert.assertEquals(0, counter)
+
+ val value = map.value()
+ Assert.assertEquals(2, value)
+ Assert.assertEquals(1, counter)
+ }
+
+ @Test
+ fun whenEvalLaterUsed_theResultIsMemoized(){
+ var counter : Int = 0
+ val later = Eval.later { counter++; counter }
+ Assert.assertEquals(0, counter)
+
+ val firstValue = later.value()
+ Assert.assertEquals(1, firstValue)
+ Assert.assertEquals(1, counter)
+
+ val secondValue = later.value()
+ Assert.assertEquals(1, secondValue)
+ Assert.assertEquals(1, counter)
+ }
+
+ @Test
+ fun whenEvalAlwaysUsed_theResultIsNotMemoized(){
+ var counter : Int = 0
+ val later = Eval.always { counter++; counter }
+ Assert.assertEquals(0, counter)
+
+ val firstValue = later.value()
+ Assert.assertEquals(1, firstValue)
+ Assert.assertEquals(1, counter)
+
+ val secondValue = later.value()
+ Assert.assertEquals(2, secondValue)
+ Assert.assertEquals(2, counter)
+ }
+
+}
\ No newline at end of file
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/arrow/FunctionalErrorHandlingWithEitherTest.kt b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/arrow/FunctionalErrorHandlingWithEitherTest.kt
new file mode 100644
index 0000000000..47fbf825a0
--- /dev/null
+++ b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/arrow/FunctionalErrorHandlingWithEitherTest.kt
@@ -0,0 +1,68 @@
+package com.baeldung.kotlin.arrow
+
+import arrow.core.Either
+import com.baeldung.kotlin.arrow.FunctionalErrorHandlingWithEither.ComputeProblem.NotANumber
+import com.baeldung.kotlin.arrow.FunctionalErrorHandlingWithEither.ComputeProblem.OddNumber
+import org.junit.Assert
+import org.junit.Test
+
+class FunctionalErrorHandlingWithEitherTest {
+
+ val operator = FunctionalErrorHandlingWithEither()
+
+ @Test
+ fun givenInvalidInput_whenComputeInvoked_NotANumberIsPresent(){
+ val computeWithEither = operator.computeWithEither("bar")
+
+ Assert.assertTrue(computeWithEither.isLeft())
+ when(computeWithEither){
+ is Either.Left -> when(computeWithEither.a){
+ NotANumber -> "Ok."
+ else -> Assert.fail()
+ }
+ else -> Assert.fail()
+ }
+ }
+
+ @Test
+ fun givenOddNumberInput_whenComputeInvoked_OddNumberIsPresent(){
+ val computeWithEither = operator.computeWithEither("121")
+
+ Assert.assertTrue(computeWithEither.isLeft())
+ when(computeWithEither){
+ is Either.Left -> when(computeWithEither.a){
+ OddNumber -> "Ok."
+ else -> Assert.fail()
+ }
+ else -> Assert.fail()
+ }
+ }
+
+ @Test
+ fun givenEvenNumberWithoutSquare_whenComputeInvoked_OddNumberIsPresent(){
+ val computeWithEither = operator.computeWithEither("100")
+
+ Assert.assertTrue(computeWithEither.isRight())
+ when(computeWithEither){
+ is Either.Right -> when(computeWithEither.b){
+ false -> "Ok."
+ else -> Assert.fail()
+ }
+ else -> Assert.fail()
+ }
+ }
+
+ @Test
+ fun givenEvenNumberWithSquare_whenComputeInvoked_OddNumberIsPresent(){
+ val computeWithEither = operator.computeWithEither("98")
+
+ Assert.assertTrue(computeWithEither.isRight())
+ when(computeWithEither){
+ is Either.Right -> when(computeWithEither.b){
+ true -> "Ok."
+ else -> Assert.fail()
+ }
+ else -> Assert.fail()
+ }
+ }
+}
\ No newline at end of file
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/arrow/FunctionalErrorHandlingWithOptionTest.kt b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/arrow/FunctionalErrorHandlingWithOptionTest.kt
new file mode 100644
index 0000000000..3ca4cd033f
--- /dev/null
+++ b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/arrow/FunctionalErrorHandlingWithOptionTest.kt
@@ -0,0 +1,34 @@
+package com.baeldung.kotlin.arrow
+
+import org.junit.Assert
+import org.junit.Test
+
+class FunctionalErrorHandlingWithOptionTest {
+
+ val operator = FunctionalErrorHandlingWithOption()
+
+ @Test
+ fun givenInvalidInput_thenErrorMessageIsPresent(){
+ val useComputeOption = operator.computeWithOptionClient("foo")
+ Assert.assertEquals("Not an even number!", useComputeOption)
+ }
+
+ @Test
+ fun givenOddNumberInput_thenErrorMessageIsPresent(){
+ val useComputeOption = operator.computeWithOptionClient("539")
+ Assert.assertEquals("Not an even number!",useComputeOption)
+ }
+
+ @Test
+ fun givenEvenNumberInputWithNonSquareNum_thenFalseMessageIsPresent(){
+ val useComputeOption = operator.computeWithOptionClient("100")
+ Assert.assertEquals("The greatest divisor is square number: false",useComputeOption)
+ }
+
+ @Test
+ fun givenEvenNumberInputWithSquareNum_thenTrueMessageIsPresent(){
+ val useComputeOption = operator.computeWithOptionClient("242")
+ Assert.assertEquals("The greatest divisor is square number: true",useComputeOption)
+ }
+
+}
\ No newline at end of file
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/CreateDateUnitTest.kt b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/CreateDateUnitTest.kt
new file mode 100644
index 0000000000..d52a2f0f19
--- /dev/null
+++ b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/CreateDateUnitTest.kt
@@ -0,0 +1,34 @@
+package com.baeldung.kotlin.dates
+
+import org.assertj.core.api.Assertions.assertThat
+import org.junit.jupiter.api.Test
+import java.time.LocalDate
+import java.time.format.DateTimeFormatter
+
+class CreateDateUnitTest {
+
+ @Test
+ fun givenString_whenDefaultFormat_thenCreated() {
+
+ var date = LocalDate.parse("2018-12-31")
+
+ assertThat(date).isEqualTo("2018-12-31")
+ }
+
+ @Test
+ fun givenString_whenCustomFormat_thenCreated() {
+
+ var formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy")
+ var date = LocalDate.parse("31-12-2018", formatter)
+
+ assertThat(date).isEqualTo("2018-12-31")
+ }
+
+ @Test
+ fun givenYMD_whenUsingOf_thenCreated() {
+ var date = LocalDate.of(2018, 12, 31)
+
+ assertThat(date).isEqualTo("2018-12-31")
+ }
+
+}
\ No newline at end of file
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/ExtractDateUnitTest.kt b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/ExtractDateUnitTest.kt
new file mode 100644
index 0000000000..ef3841752b
--- /dev/null
+++ b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/ExtractDateUnitTest.kt
@@ -0,0 +1,29 @@
+package com.baeldung.kotlin.dates
+
+import org.assertj.core.api.Assertions.assertThat
+import org.junit.jupiter.api.Test
+import java.time.DayOfWeek
+import java.time.LocalDate
+import java.time.Month
+
+class ExtractDateUnitTest {
+
+ @Test
+ fun givenDate_thenExtractedYMD() {
+ var date = LocalDate.parse("2018-12-31")
+
+ assertThat(date.year).isEqualTo(2018)
+ assertThat(date.month).isEqualTo(Month.DECEMBER)
+ assertThat(date.dayOfMonth).isEqualTo(31)
+ }
+
+ @Test
+ fun givenDate_thenExtractedEraDowDoy() {
+ var date = LocalDate.parse("2018-12-31")
+
+ assertThat(date.era.toString()).isEqualTo("CE")
+ assertThat(date.dayOfWeek).isEqualTo(DayOfWeek.MONDAY)
+ assertThat(date.dayOfYear).isEqualTo(365)
+ }
+
+}
\ No newline at end of file
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/FormatDateUnitTest.kt b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/FormatDateUnitTest.kt
new file mode 100644
index 0000000000..11ff6ec9f0
--- /dev/null
+++ b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/FormatDateUnitTest.kt
@@ -0,0 +1,29 @@
+package com.baeldung.kotlin.dates
+
+import org.assertj.core.api.Assertions.assertThat
+import org.junit.jupiter.api.Test
+import java.time.LocalDate
+import java.time.format.DateTimeFormatter
+
+class FormatDateUnitTest {
+
+ @Test
+ fun givenDate_whenDefaultFormat_thenFormattedString() {
+
+ var date = LocalDate.parse("2018-12-31")
+
+ assertThat(date.toString()).isEqualTo("2018-12-31")
+ }
+
+ @Test
+ fun givenDate_whenCustomFormat_thenFormattedString() {
+
+ var date = LocalDate.parse("2018-12-31")
+
+ var formatter = DateTimeFormatter.ofPattern("dd-MMMM-yyyy")
+ var formattedDate = date.format(formatter)
+
+ assertThat(formattedDate).isEqualTo("31-December-2018")
+ }
+
+}
\ No newline at end of file
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/PeriodDateUnitTest.kt b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/PeriodDateUnitTest.kt
new file mode 100644
index 0000000000..e6b66634d3
--- /dev/null
+++ b/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/dates/PeriodDateUnitTest.kt
@@ -0,0 +1,48 @@
+package com.baeldung.kotlin.dates
+
+import org.assertj.core.api.Assertions.assertThat
+import org.junit.jupiter.api.Test
+import java.time.LocalDate
+import java.time.Period
+
+class PeriodDateUnitTest {
+
+ @Test
+ fun givenYMD_thenCreatePeriod() {
+ var period = Period.of(1, 2, 3)
+
+ assertThat(period.toString()).isEqualTo("P1Y2M3D")
+ }
+
+ @Test
+ fun givenPeriod_whenAdd_thenModifiedDate() {
+ var period = Period.of(1, 2, 3)
+
+ var date = LocalDate.of(2018, 6, 25)
+ var modifiedDate = date.plus(period)
+
+ assertThat(modifiedDate).isEqualTo("2019-08-28")
+ }
+
+ @Test
+ fun givenPeriod_whenSubtracted_thenModifiedDate() {
+ var period = Period.of(1, 2, 3)
+
+ var date = LocalDate.of(2018, 6, 25)
+ var modifiedDate = date.minus(period)
+
+ assertThat(modifiedDate).isEqualTo("2017-04-22")
+ }
+
+ @Test
+ fun givenTwoDate_whenUsingBetween_thenDiffOfDates() {
+
+ var date1 = LocalDate.parse("2018-06-25")
+ var date2 = LocalDate.parse("2018-12-25")
+
+ var period = Period.between(date1, date2)
+
+ assertThat(period.toString()).isEqualTo("P6M")
+ }
+
+}
\ No newline at end of file
diff --git a/libraries-data/README.md b/libraries-data/README.md
index 63ee5f9947..7e40a4a2e2 100644
--- a/libraries-data/README.md
+++ b/libraries-data/README.md
@@ -12,3 +12,5 @@
- [Guide to JMapper](https://www.baeldung.com/jmapper)
- [A Guide to Apache Crunch](https://www.baeldung.com/apache-crunch)
- [Building a Data Pipeline with Flink and Kafka](https://www.baeldung.com/kafka-flink-data-pipeline)
+- [Intro to Apache Storm](https://www.baeldung.com/apache-storm)
+- [Guide to Ebean ORM](https://www.baeldung.com/ebean-orm)
diff --git a/libraries-data/src/main/kafka-connect/01_Quick_Start/connect-file-sink.properties b/libraries-data/src/main/kafka-connect/01_Quick_Start/connect-file-sink.properties
new file mode 100644
index 0000000000..594ccc6e95
--- /dev/null
+++ b/libraries-data/src/main/kafka-connect/01_Quick_Start/connect-file-sink.properties
@@ -0,0 +1,20 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+name=local-file-sink
+connector.class=FileStreamSink
+tasks.max=1
+file=test.sink.txt
+topics=connect-test
\ No newline at end of file
diff --git a/libraries-data/src/main/kafka-connect/01_Quick_Start/connect-file-source.properties b/libraries-data/src/main/kafka-connect/01_Quick_Start/connect-file-source.properties
new file mode 100644
index 0000000000..599cf4cb2a
--- /dev/null
+++ b/libraries-data/src/main/kafka-connect/01_Quick_Start/connect-file-source.properties
@@ -0,0 +1,20 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+name=local-file-source
+connector.class=FileStreamSource
+tasks.max=1
+file=test.txt
+topic=connect-test
\ No newline at end of file
diff --git a/libraries-data/src/main/kafka-connect/01_Quick_Start/connect-standalone.properties b/libraries-data/src/main/kafka-connect/01_Quick_Start/connect-standalone.properties
new file mode 100644
index 0000000000..a2369fa144
--- /dev/null
+++ b/libraries-data/src/main/kafka-connect/01_Quick_Start/connect-standalone.properties
@@ -0,0 +1,44 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# These are defaults. This file just demonstrates how to override some settings.
+bootstrap.servers=localhost:9092
+
+# The converters specify the format of data in Kafka and how to translate it into Connect data. Every Connect user will
+# need to configure these based on the format they want their data in when loaded from or stored into Kafka
+key.converter=org.apache.kafka.connect.json.JsonConverter
+value.converter=org.apache.kafka.connect.json.JsonConverter
+# Converter-specific settings can be passed in by prefixing the Converter's setting with the converter we want to apply
+# it to
+key.converter.schemas.enable=false
+value.converter.schemas.enable=false
+
+offset.storage.file.filename=/tmp/connect.offsets
+# Flush much faster than normal, which is useful for testing/debugging
+offset.flush.interval.ms=10000
+
+# Set to a list of filesystem paths separated by commas (,) to enable class loading isolation for plugins
+# (connectors, converters, transformations). The list should consist of top level directories that include
+# any combination of:
+# a) directories immediately containing jars with plugins and their dependencies
+# b) uber-jars with plugins and their dependencies
+# c) directories immediately containing the package directory structure of classes of plugins and their dependencies
+# Note: symlinks will be followed to discover dependencies or plugins.
+# Examples:
+# plugin.path=/usr/local/share/java,/usr/local/share/kafka/plugins,/opt/connectors,
+# Replace the relative path below with an absolute path if you are planning to start Kafka Connect from within a
+# directory other than the home directory of Confluent Platform.
+plugin.path=C:\Software\confluent-5.0.0\share\java
+#plugin.path=./share/java
diff --git a/libraries-data/src/main/kafka-connect/02_Distributed/connect-distributed.properties b/libraries-data/src/main/kafka-connect/02_Distributed/connect-distributed.properties
new file mode 100644
index 0000000000..5b91baddbd
--- /dev/null
+++ b/libraries-data/src/main/kafka-connect/02_Distributed/connect-distributed.properties
@@ -0,0 +1,88 @@
+##
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+# This file contains some of the configurations for the Kafka Connect distributed worker. This file is intended
+# to be used with the examples, and some settings may differ from those used in a production system, especially
+# the `bootstrap.servers` and those specifying replication factors.
+
+# A list of host/port pairs to use for establishing the initial connection to the Kafka cluster.
+bootstrap.servers=localhost:9092
+
+# unique name for the cluster, used in forming the Connect cluster group. Note that this must not conflict with consumer group IDs
+group.id=connect-cluster
+
+# The converters specify the format of data in Kafka and how to translate it into Connect data. Every Connect user will
+# need to configure these based on the format they want their data in when loaded from or stored into Kafka
+key.converter=org.apache.kafka.connect.json.JsonConverter
+value.converter=org.apache.kafka.connect.json.JsonConverter
+# Converter-specific settings can be passed in by prefixing the Converter's setting with the converter we want to apply
+# it to
+key.converter.schemas.enable=true
+value.converter.schemas.enable=true
+
+# Topic to use for storing offsets. This topic should have many partitions and be replicated and compacted.
+# Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create
+# the topic before starting Kafka Connect if a specific topic configuration is needed.
+# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value.
+# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able
+# to run this example on a single-broker cluster and so here we instead set the replication factor to 1.
+offset.storage.topic=connect-offsets
+offset.storage.replication.factor=1
+#offset.storage.partitions=25
+
+# Topic to use for storing connector and task configurations; note that this should be a single partition, highly replicated,
+# and compacted topic. Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create
+# the topic before starting Kafka Connect if a specific topic configuration is needed.
+# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value.
+# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able
+# to run this example on a single-broker cluster and so here we instead set the replication factor to 1.
+config.storage.topic=connect-configs
+config.storage.replication.factor=1
+
+# Topic to use for storing statuses. This topic can have multiple partitions and should be replicated and compacted.
+# Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create
+# the topic before starting Kafka Connect if a specific topic configuration is needed.
+# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value.
+# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able
+# to run this example on a single-broker cluster and so here we instead set the replication factor to 1.
+status.storage.topic=connect-status
+status.storage.replication.factor=1
+#status.storage.partitions=5
+
+# Flush much faster than normal, which is useful for testing/debugging
+offset.flush.interval.ms=10000
+
+# These are provided to inform the user about the presence of the REST host and port configs
+# Hostname & Port for the REST API to listen on. If this is set, it will bind to the interface used to listen to requests.
+#rest.host.name=
+#rest.port=8083
+
+# The Hostname & Port that will be given out to other workers to connect to i.e. URLs that are routable from other servers.
+#rest.advertised.host.name=
+#rest.advertised.port=
+
+# Set to a list of filesystem paths separated by commas (,) to enable class loading isolation for plugins
+# (connectors, converters, transformations). The list should consist of top level directories that include
+# any combination of:
+# a) directories immediately containing jars with plugins and their dependencies
+# b) uber-jars with plugins and their dependencies
+# c) directories immediately containing the package directory structure of classes of plugins and their dependencies
+# Examples:
+# plugin.path=/usr/local/share/java,/usr/local/share/kafka/plugins,/opt/connectors,
+# Replace the relative path below with an absolute path if you are planning to start Kafka Connect from within a
+# directory other than the home directory of Confluent Platform.
+plugin.path=./share/java
diff --git a/libraries-data/src/main/kafka-connect/02_Distributed/connect-file-sink.json b/libraries-data/src/main/kafka-connect/02_Distributed/connect-file-sink.json
new file mode 100644
index 0000000000..8902ecce52
--- /dev/null
+++ b/libraries-data/src/main/kafka-connect/02_Distributed/connect-file-sink.json
@@ -0,0 +1,9 @@
+{
+ "name": "local-file-sink",
+ "config": {
+ "connector.class": "FileStreamSink",
+ "tasks.max": 1,
+ "file": "test-distributed.sink.txt",
+ "topics": "connect-distributed"
+ }
+}
diff --git a/libraries-data/src/main/kafka-connect/02_Distributed/connect-file-source.json b/libraries-data/src/main/kafka-connect/02_Distributed/connect-file-source.json
new file mode 100644
index 0000000000..77e949c91b
--- /dev/null
+++ b/libraries-data/src/main/kafka-connect/02_Distributed/connect-file-source.json
@@ -0,0 +1,9 @@
+{
+ "name": "local-file-source",
+ "config": {
+ "connector.class": "FileStreamSource",
+ "tasks.max": 1,
+ "file": "test-distributed.txt",
+ "topic": "connect-distributed"
+ }
+}
diff --git a/libraries-data/src/main/kafka-connect/03_Transform/connect-distributed.properties b/libraries-data/src/main/kafka-connect/03_Transform/connect-distributed.properties
new file mode 100644
index 0000000000..fa63be24b8
--- /dev/null
+++ b/libraries-data/src/main/kafka-connect/03_Transform/connect-distributed.properties
@@ -0,0 +1,88 @@
+##
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+# This file contains some of the configurations for the Kafka Connect distributed worker. This file is intended
+# to be used with the examples, and some settings may differ from those used in a production system, especially
+# the `bootstrap.servers` and those specifying replication factors.
+
+# A list of host/port pairs to use for establishing the initial connection to the Kafka cluster.
+bootstrap.servers=localhost:9092
+
+# unique name for the cluster, used in forming the Connect cluster group. Note that this must not conflict with consumer group IDs
+group.id=connect-cluster
+
+# The converters specify the format of data in Kafka and how to translate it into Connect data. Every Connect user will
+# need to configure these based on the format they want their data in when loaded from or stored into Kafka
+key.converter=org.apache.kafka.connect.json.JsonConverter
+value.converter=org.apache.kafka.connect.json.JsonConverter
+# Converter-specific settings can be passed in by prefixing the Converter's setting with the converter we want to apply
+# it to
+key.converter.schemas.enable=false
+value.converter.schemas.enable=false
+
+# Topic to use for storing offsets. This topic should have many partitions and be replicated and compacted.
+# Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create
+# the topic before starting Kafka Connect if a specific topic configuration is needed.
+# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value.
+# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able
+# to run this example on a single-broker cluster and so here we instead set the replication factor to 1.
+offset.storage.topic=connect-offsets
+offset.storage.replication.factor=1
+#offset.storage.partitions=25
+
+# Topic to use for storing connector and task configurations; note that this should be a single partition, highly replicated,
+# and compacted topic. Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create
+# the topic before starting Kafka Connect if a specific topic configuration is needed.
+# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value.
+# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able
+# to run this example on a single-broker cluster and so here we instead set the replication factor to 1.
+config.storage.topic=connect-configs
+config.storage.replication.factor=1
+
+# Topic to use for storing statuses. This topic can have multiple partitions and should be replicated and compacted.
+# Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create
+# the topic before starting Kafka Connect if a specific topic configuration is needed.
+# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value.
+# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able
+# to run this example on a single-broker cluster and so here we instead set the replication factor to 1.
+status.storage.topic=connect-status
+status.storage.replication.factor=1
+#status.storage.partitions=5
+
+# Flush much faster than normal, which is useful for testing/debugging
+offset.flush.interval.ms=10000
+
+# These are provided to inform the user about the presence of the REST host and port configs
+# Hostname & Port for the REST API to listen on. If this is set, it will bind to the interface used to listen to requests.
+#rest.host.name=
+#rest.port=8083
+
+# The Hostname & Port that will be given out to other workers to connect to i.e. URLs that are routable from other servers.
+#rest.advertised.host.name=
+#rest.advertised.port=
+
+# Set to a list of filesystem paths separated by commas (,) to enable class loading isolation for plugins
+# (connectors, converters, transformations). The list should consist of top level directories that include
+# any combination of:
+# a) directories immediately containing jars with plugins and their dependencies
+# b) uber-jars with plugins and their dependencies
+# c) directories immediately containing the package directory structure of classes of plugins and their dependencies
+# Examples:
+# plugin.path=/usr/local/share/java,/usr/local/share/kafka/plugins,/opt/connectors,
+# Replace the relative path below with an absolute path if you are planning to start Kafka Connect from within a
+# directory other than the home directory of Confluent Platform.
+plugin.path=./share/java
diff --git a/libraries-data/src/main/kafka-connect/03_Transform/connect-file-source-transform.json b/libraries-data/src/main/kafka-connect/03_Transform/connect-file-source-transform.json
new file mode 100644
index 0000000000..e5e21a0608
--- /dev/null
+++ b/libraries-data/src/main/kafka-connect/03_Transform/connect-file-source-transform.json
@@ -0,0 +1,15 @@
+{
+ "name": "local-file-source",
+ "config": {
+ "connector.class": "FileStreamSource",
+ "tasks.max": 1,
+ "file": "transformation.txt",
+ "topic": "connect-transformation",
+ "transforms": "MakeMap,InsertSource",
+ "transforms.MakeMap.type": "org.apache.kafka.connect.transforms.HoistField$Value",
+ "transforms.MakeMap.field": "line",
+ "transforms.InsertSource.type": "org.apache.kafka.connect.transforms.InsertField$Value",
+ "transforms.InsertSource.static.field": "data_source",
+ "transforms.InsertSource.static.value": "test-file-source"
+ }
+}
diff --git a/libraries-data/src/main/kafka-connect/04_Custom/connect-distributed.properties b/libraries-data/src/main/kafka-connect/04_Custom/connect-distributed.properties
new file mode 100644
index 0000000000..5b91baddbd
--- /dev/null
+++ b/libraries-data/src/main/kafka-connect/04_Custom/connect-distributed.properties
@@ -0,0 +1,88 @@
+##
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+# This file contains some of the configurations for the Kafka Connect distributed worker. This file is intended
+# to be used with the examples, and some settings may differ from those used in a production system, especially
+# the `bootstrap.servers` and those specifying replication factors.
+
+# A list of host/port pairs to use for establishing the initial connection to the Kafka cluster.
+bootstrap.servers=localhost:9092
+
+# unique name for the cluster, used in forming the Connect cluster group. Note that this must not conflict with consumer group IDs
+group.id=connect-cluster
+
+# The converters specify the format of data in Kafka and how to translate it into Connect data. Every Connect user will
+# need to configure these based on the format they want their data in when loaded from or stored into Kafka
+key.converter=org.apache.kafka.connect.json.JsonConverter
+value.converter=org.apache.kafka.connect.json.JsonConverter
+# Converter-specific settings can be passed in by prefixing the Converter's setting with the converter we want to apply
+# it to
+key.converter.schemas.enable=true
+value.converter.schemas.enable=true
+
+# Topic to use for storing offsets. This topic should have many partitions and be replicated and compacted.
+# Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create
+# the topic before starting Kafka Connect if a specific topic configuration is needed.
+# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value.
+# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able
+# to run this example on a single-broker cluster and so here we instead set the replication factor to 1.
+offset.storage.topic=connect-offsets
+offset.storage.replication.factor=1
+#offset.storage.partitions=25
+
+# Topic to use for storing connector and task configurations; note that this should be a single partition, highly replicated,
+# and compacted topic. Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create
+# the topic before starting Kafka Connect if a specific topic configuration is needed.
+# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value.
+# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able
+# to run this example on a single-broker cluster and so here we instead set the replication factor to 1.
+config.storage.topic=connect-configs
+config.storage.replication.factor=1
+
+# Topic to use for storing statuses. This topic can have multiple partitions and should be replicated and compacted.
+# Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create
+# the topic before starting Kafka Connect if a specific topic configuration is needed.
+# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value.
+# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able
+# to run this example on a single-broker cluster and so here we instead set the replication factor to 1.
+status.storage.topic=connect-status
+status.storage.replication.factor=1
+#status.storage.partitions=5
+
+# Flush much faster than normal, which is useful for testing/debugging
+offset.flush.interval.ms=10000
+
+# These are provided to inform the user about the presence of the REST host and port configs
+# Hostname & Port for the REST API to listen on. If this is set, it will bind to the interface used to listen to requests.
+#rest.host.name=
+#rest.port=8083
+
+# The Hostname & Port that will be given out to other workers to connect to i.e. URLs that are routable from other servers.
+#rest.advertised.host.name=
+#rest.advertised.port=
+
+# Set to a list of filesystem paths separated by commas (,) to enable class loading isolation for plugins
+# (connectors, converters, transformations). The list should consist of top level directories that include
+# any combination of:
+# a) directories immediately containing jars with plugins and their dependencies
+# b) uber-jars with plugins and their dependencies
+# c) directories immediately containing the package directory structure of classes of plugins and their dependencies
+# Examples:
+# plugin.path=/usr/local/share/java,/usr/local/share/kafka/plugins,/opt/connectors,
+# Replace the relative path below with an absolute path if you are planning to start Kafka Connect from within a
+# directory other than the home directory of Confluent Platform.
+plugin.path=./share/java
diff --git a/libraries-data/src/main/kafka-connect/04_Custom/connect-mongodb-sink.json b/libraries-data/src/main/kafka-connect/04_Custom/connect-mongodb-sink.json
new file mode 100644
index 0000000000..333768e4b7
--- /dev/null
+++ b/libraries-data/src/main/kafka-connect/04_Custom/connect-mongodb-sink.json
@@ -0,0 +1,22 @@
+{
+ "firstName": "John",
+ "lastName": "Smith",
+ "age": 25,
+ "address": {
+ "streetAddress": "21 2nd Street",
+ "city": "New York",
+ "state": "NY",
+ "postalCode": "10021"
+ },
+ "phoneNumber": [{
+ "type": "home",
+ "number": "212 555-1234"
+ }, {
+ "type": "fax",
+ "number": "646 555-4567"
+ }
+ ],
+ "gender": {
+ "type": "male"
+ }
+}
diff --git a/libraries-data/src/main/kafka-connect/04_Custom/connect-mqtt-source.json b/libraries-data/src/main/kafka-connect/04_Custom/connect-mqtt-source.json
new file mode 100644
index 0000000000..02d87c5ad7
--- /dev/null
+++ b/libraries-data/src/main/kafka-connect/04_Custom/connect-mqtt-source.json
@@ -0,0 +1,11 @@
+{
+ "name": "mqtt-source",
+ "config": {
+ "connector.class": "io.confluent.connect.mqtt.MqttSourceConnector",
+ "tasks.max": 1,
+ "mqtt.server.uri": "ws://broker.hivemq.com:8000/mqtt",
+ "mqtt.topics": "baeldung",
+ "kafka.topic": "connect-custom",
+ "value.converter": "org.apache.kafka.connect.converters.ByteArrayConverter"
+ }
+}
diff --git a/libraries-server/pom.xml b/libraries-server/pom.xml
index 6fca09faf4..661f5f01d5 100644
--- a/libraries-server/pom.xml
+++ b/libraries-server/pom.xml
@@ -1,9 +1,10 @@
4.0.0
- com.baeldung
libraries-server
0.0.1-SNAPSHOT
+ libraries-server
+
com.baeldung
parent-modules
diff --git a/libraries/README.md b/libraries/README.md
index fcf687d806..851e3a3d17 100644
--- a/libraries/README.md
+++ b/libraries/README.md
@@ -83,6 +83,7 @@
- [Guide to JMapper](http://www.baeldung.com/jmapper)
- [An Introduction to Apache Commons Lang 3](https://www.baeldung.com/java-commons-lang-3)
- [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once)
+- [An Introduction to SuanShu](https://www.baeldung.com/suanshu)
The libraries module contains examples related to small libraries that are relatively easy to use and does not require any separate module of its own.
diff --git a/libraries/pom.xml b/libraries/pom.xml
index 8ffd33272d..936e86873d 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -720,11 +720,11 @@
-
+
false
diff --git a/linkrest/pom.xml b/linkrest/pom.xml
index a27caea1ff..073a173aff 100644
--- a/linkrest/pom.xml
+++ b/linkrest/pom.xml
@@ -1,9 +1,9 @@
4.0.0
- com.baeldung
linkrest
0.0.1-SNAPSHOT
+ linkrest
war
diff --git a/logging-modules/log4j/pom.xml b/logging-modules/log4j/pom.xml
index 432295fc62..af97d812de 100644
--- a/logging-modules/log4j/pom.xml
+++ b/logging-modules/log4j/pom.xml
@@ -1,10 +1,12 @@
-
4.0.0
com.baeldung
log4j
1.0-SNAPSHOT
+ log4j
com.baeldung
diff --git a/logging-modules/log4j2/pom.xml b/logging-modules/log4j2/pom.xml
index 65da318636..d46f92dcd6 100644
--- a/logging-modules/log4j2/pom.xml
+++ b/logging-modules/log4j2/pom.xml
@@ -3,7 +3,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
log4j2
-
+ log4j2
+
com.baeldung
parent-modules
diff --git a/lombok/README.md b/lombok/README.md
index 34ec569e89..bd6282fd18 100644
--- a/lombok/README.md
+++ b/lombok/README.md
@@ -4,4 +4,4 @@
- [Using Lombok’s @Getter for Boolean Fields](https://www.baeldung.com/lombok-getter-boolean)
- [Lombok @Builder with Inheritance](https://www.baeldung.com/lombok-builder-inheritance)
- [Lombok Builder with Default Value](https://www.baeldung.com/lombok-builder-default-value)
-- [Lombok Builder with Custom Setter](https://www.baeldung.com/lombok-builder-with-custom-setter)
+- [Lombok Builder with Custom Setter](https://www.baeldung.com/lombok-builder-custom-setter)
diff --git a/maven-archetype/pom.xml b/maven-archetype/pom.xml
index f7871c81ea..73ddc78fc7 100644
--- a/maven-archetype/pom.xml
+++ b/maven-archetype/pom.xml
@@ -5,9 +5,10 @@
com.baeldung.archetypes
maven-archetype
1.0-SNAPSHOT
+ maven-archetype
maven-archetype
Archetype used to generate rest application based on jaxrs 2.1
-
+
diff --git a/maven-polyglot/maven-polyglot-json-extension/pom.xml b/maven-polyglot/maven-polyglot-json-extension/pom.xml
index d5c5b7ab55..fe1e025d1f 100644
--- a/maven-polyglot/maven-polyglot-json-extension/pom.xml
+++ b/maven-polyglot/maven-polyglot-json-extension/pom.xml
@@ -3,11 +3,11 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
com.baeldung.maven.polyglot
maven-polyglot-json-extension
1.0-SNAPSHOT
-
+ maven-polyglot-json-extension
+
1.8
1.8
diff --git a/maven/README.md b/maven/README.md
index 970250d142..1c0e50f95a 100644
--- a/maven/README.md
+++ b/maven/README.md
@@ -13,3 +13,4 @@
- [Apache Maven Standard Directory Layout](https://www.baeldung.com/maven-directory-structure)
- [Apache Maven Tutorial](https://www.baeldung.com/maven)
- [Use the Latest Version of a Dependency in Maven](https://www.baeldung.com/maven-dependency-latest-version)
+- [Multi-Module Project with Maven](https://www.baeldung.com/maven-multi-module)
diff --git a/maven/pom.xml b/maven/pom.xml
index 4bec533226..01fd28db74 100644
--- a/maven/pom.xml
+++ b/maven/pom.xml
@@ -4,6 +4,7 @@
com.baeldung
maven
0.0.1-SNAPSHOT
+ maven
war
diff --git a/maven/versions-maven-plugin/pom.xml b/maven/versions-maven-plugin/pom.xml
index 295c77b860..dc0cba75f9 100644
--- a/maven/versions-maven-plugin/pom.xml
+++ b/maven/versions-maven-plugin/pom.xml
@@ -3,9 +3,10 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung
- versions-maven-plugin-example
+ versions-maven-plugin
0.0.1-SNAPSHOT
-
+ versions-maven-plugin
+
1.15
diff --git a/mesos-marathon/pom.xml b/mesos-marathon/pom.xml
index f92c00892b..dee8eca10d 100644
--- a/mesos-marathon/pom.xml
+++ b/mesos-marathon/pom.xml
@@ -5,7 +5,8 @@
com.baeldung
mesos-marathon
0.0.1-SNAPSHOT
-
+ mesos-marathon
+
parent-boot-1
com.baeldung
diff --git a/metrics/pom.xml b/metrics/pom.xml
index 9cf1ec588f..79d340aa49 100644
--- a/metrics/pom.xml
+++ b/metrics/pom.xml
@@ -3,7 +3,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
metrics
-
+ metrics
+
parent-modules
com.baeldung
diff --git a/microprofile/pom.xml b/microprofile/pom.xml
index d75b6443ed..52df348ace 100644
--- a/microprofile/pom.xml
+++ b/microprofile/pom.xml
@@ -5,6 +5,7 @@
com.baeldung
microprofile
1.0-SNAPSHOT
+ microprofile
war
diff --git a/msf4j/pom.xml b/msf4j/pom.xml
index 9a6483772b..4a6f63159d 100644
--- a/msf4j/pom.xml
+++ b/msf4j/pom.xml
@@ -5,6 +5,7 @@
com.baeldung.msf4j
msf4j
0.0.1-SNAPSHOT
+ msf4j
parent-modules
diff --git a/muleesb/pom.xml b/muleesb/pom.xml
index b34123567a..4b74b6d4f4 100644
--- a/muleesb/pom.xml
+++ b/muleesb/pom.xml
@@ -6,9 +6,9 @@
com.mycompany
muleesb
1.0.0-SNAPSHOT
- mule
- Mule muleesb Application
-
+ muleesb
+ mule
+
com.baeldung
parent-modules
diff --git a/mybatis/pom.xml b/mybatis/pom.xml
index aa9ff9e288..4e63d14ded 100644
--- a/mybatis/pom.xml
+++ b/mybatis/pom.xml
@@ -5,7 +5,8 @@
com.baeldung
mybatis
1.0.0-SNAPSHOT
-
+ mybatis
+
com.baeldung
parent-modules
diff --git a/optaplanner/pom.xml b/optaplanner/pom.xml
index 22abbedc8c..fbce0ea072 100644
--- a/optaplanner/pom.xml
+++ b/optaplanner/pom.xml
@@ -2,14 +2,15 @@
+ 4.0.0
+ optaplanner
+ optaplanner
+
parent-modules
com.baeldung
1.0.0-SNAPSHOT
- 4.0.0
-
- optaplanner
diff --git a/parent-boot-1/README.md b/parent-boot-1/README.md
deleted file mode 100644
index ff12555376..0000000000
--- a/parent-boot-1/README.md
+++ /dev/null
@@ -1 +0,0 @@
-## Relevant articles:
diff --git a/parent-boot-1/pom.xml b/parent-boot-1/pom.xml
index 171806390d..53f91f975d 100644
--- a/parent-boot-1/pom.xml
+++ b/parent-boot-1/pom.xml
@@ -3,6 +3,7 @@
4.0.0
parent-boot-1
0.0.1-SNAPSHOT
+ parent-boot-1
pom
Parent for all Spring Boot 1.x modules
diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml
index 47d382f58d..89afd79bf4 100644
--- a/parent-boot-2/pom.xml
+++ b/parent-boot-2/pom.xml
@@ -3,6 +3,7 @@
4.0.0
parent-boot-2
0.0.1-SNAPSHOT
+ parent-boot-2
pom
Parent for all Spring Boot 2 modules
@@ -80,3 +81,5 @@
2.0.5.RELEASE
+
+
diff --git a/patterns/design-patterns/README.md b/patterns/design-patterns/README.md
index 75f7cec73a..e56872b3fd 100644
--- a/patterns/design-patterns/README.md
+++ b/patterns/design-patterns/README.md
@@ -12,3 +12,5 @@
- [The DAO Pattern in Java](http://www.baeldung.com/java-dao-pattern)
- [Interpreter Design Pattern in Java](http://www.baeldung.com/java-interpreter-pattern)
- [State Design Pattern in Java](https://www.baeldung.com/java-state-design-pattern)
+- [The Decorator Pattern in Java](https://www.baeldung.com/java-decorator-pattern)
+- [Abstract Factory Pattern in Java](https://www.baeldung.com/java-abstract-factory-pattern)
diff --git a/patterns/design-patterns/pom.xml b/patterns/design-patterns/pom.xml
index dc2631b36e..ac201ad653 100644
--- a/patterns/design-patterns/pom.xml
+++ b/patterns/design-patterns/pom.xml
@@ -4,7 +4,9 @@
4.0.0
design-patterns
1.0
- jar
+ design-patterns
+ jar
+
com.baeldung
patterns
diff --git a/patterns/front-controller/pom.xml b/patterns/front-controller/pom.xml
index 435b0dd9cd..bb003dd00a 100644
--- a/patterns/front-controller/pom.xml
+++ b/patterns/front-controller/pom.xml
@@ -3,6 +3,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
front-controller
+ front-controller
war
diff --git a/patterns/intercepting-filter/pom.xml b/patterns/intercepting-filter/pom.xml
index fa94d5d1fd..33589dc242 100644
--- a/patterns/intercepting-filter/pom.xml
+++ b/patterns/intercepting-filter/pom.xml
@@ -2,8 +2,8 @@
4.0.0
-
intercepting-filter
+ intercepting-filter
war
diff --git a/patterns/pom.xml b/patterns/pom.xml
index df09f1836a..bc1f5173e2 100644
--- a/patterns/pom.xml
+++ b/patterns/pom.xml
@@ -4,6 +4,7 @@
4.0.0
patterns
pom
+ patterns
com.baeldung
diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml
index 8c9d027724..7d77c2a0e3 100644
--- a/performance-tests/pom.xml
+++ b/performance-tests/pom.xml
@@ -4,7 +4,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
performance-tests
-
+ performance-tests
+
parent-modules
com.baeldung
diff --git a/performance-tests/src/test/java/com/baeldung/performancetests/benchmark/MappingFrameworksPerformance.java b/performance-tests/src/test/java/com/baeldung/performancetests/benchmark/MappingFrameworksPerformance.java
index e781f1fca1..1c9e4c5dc4 100644
--- a/performance-tests/src/test/java/com/baeldung/performancetests/benchmark/MappingFrameworksPerformance.java
+++ b/performance-tests/src/test/java/com/baeldung/performancetests/benchmark/MappingFrameworksPerformance.java
@@ -97,7 +97,7 @@ public class MappingFrameworksPerformance {
sourceCode = new SourceCode("This is source code!");
}
- public void main(String[] args) throws IOException, RunnerException {
+ public static void main(String[] args) throws IOException, RunnerException {
org.openjdk.jmh.Main.main(args);
}
diff --git a/persistence-modules/README.md b/persistence-modules/README.md
index f12163bd6a..75ccc749e5 100644
--- a/persistence-modules/README.md
+++ b/persistence-modules/README.md
@@ -9,3 +9,4 @@
- [Introduction to Lettuce – the Java Redis Client](http://www.baeldung.com/java-redis-lettuce)
- [A Guide to Jdbi](http://www.baeldung.com/jdbi)
- [Pessimistic Locking in JPA](http://www.baeldung.com/jpa-pessimistic-locking)
+- [Get All Data from a Table with Hibernate](https://www.baeldung.com/hibernate-select-all)
diff --git a/persistence-modules/hbase/pom.xml b/persistence-modules/hbase/pom.xml
index ffd1464482..daf0db5291 100644
--- a/persistence-modules/hbase/pom.xml
+++ b/persistence-modules/hbase/pom.xml
@@ -3,6 +3,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
hbase
+ hbase
parent-modules
diff --git a/persistence-modules/hibernate5/README.md b/persistence-modules/hibernate5/README.md
index 7f52531076..a94379b5cb 100644
--- a/persistence-modules/hibernate5/README.md
+++ b/persistence-modules/hibernate5/README.md
@@ -18,3 +18,4 @@
- [@JoinColumn Annotation Explained](https://www.baeldung.com/jpa-join-column)
- [Hibernate 5 Naming Strategy Configuration](https://www.baeldung.com/hibernate-naming-strategy)
- [Proxy in Hibernate load() Method](https://www.baeldung.com/hibernate-proxy-load-method)
+- [Custom Types in Hibernate](https://www.baeldung.com/hibernate-custom-types)
diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml
index 24f4055a82..363e2153b6 100644
--- a/persistence-modules/hibernate5/pom.xml
+++ b/persistence-modules/hibernate5/pom.xml
@@ -5,6 +5,7 @@
com.baeldung
hibernate5
0.0.1-SNAPSHOT
+ hibernate5
com.baeldung
diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java
index 27fff147b6..8b5d9c41f3 100644
--- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java
+++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java
@@ -10,7 +10,7 @@ public class DeptEmployee {
private String employeeNumber;
- private String designation;
+ private String title;
private String name;
@@ -23,11 +23,11 @@ public class DeptEmployee {
this.department = department;
}
- public DeptEmployee(String name, String employeeNumber, String designation, Department department) {
+ public DeptEmployee(String name, String employeeNumber, String title, Department department) {
super();
this.name = name;
this.employeeNumber = employeeNumber;
- this.designation = designation;
+ this.title = title;
this.department = department;
}
@@ -63,11 +63,11 @@ public class DeptEmployee {
this.department = department;
}
- public String getDesignation() {
- return designation;
+ public String getTitle() {
+ return title;
}
- public void setDesignation(String designation) {
- this.designation = designation;
+ public void setTitle(String title) {
+ this.title = title;
}
}
diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/findall/FindAll.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/findall/FindAll.java
new file mode 100644
index 0000000000..cc0c234df0
--- /dev/null
+++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/findall/FindAll.java
@@ -0,0 +1,35 @@
+package com.baeldung.hibernate.findall;
+
+import java.util.List;
+
+import javax.persistence.TypedQuery;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Root;
+
+import org.hibernate.Session;
+
+import com.baeldung.hibernate.pojo.Student;
+
+public class FindAll {
+
+ private Session session;
+
+ public FindAll(Session session) {
+ super();
+ this.session = session;
+ }
+
+ public List findAllWithJpql() {
+ return session.createQuery("SELECT a FROM Student a", Student.class).getResultList();
+ }
+
+ public List findAllWithCriteriaQuery() {
+ CriteriaBuilder cb = session.getCriteriaBuilder();
+ CriteriaQuery cq = cb.createQuery(Student.class);
+ Root rootEntry = cq.from(Student.class);
+ CriteriaQuery all = cq.select(rootEntry);
+ TypedQuery allQuery = session.createQuery(all);
+ return allQuery.getResultList();
+ }
+}
diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java
index 85cdffd54d..b7d1a537f0 100644
--- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java
+++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchService.java
@@ -6,9 +6,9 @@ import com.baeldung.hibernate.entities.DeptEmployee;
public interface EmployeeSearchService {
- List filterbyDesignationUsingCriteriaBuilder(List designaitons);
+ List filterbyTitleUsingCriteriaBuilder(List titles);
- List filterbyDesignationUsingExpression(List aurhors);
+ List filterbyTitleUsingExpression(List titles);
List searchByDepartmentQuery(String query);
diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java
index a9981b8066..e79168a451 100644
--- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java
+++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/jpacriteriabuilder/service/EmployeeSearchServiceImpl.java
@@ -25,12 +25,12 @@ public class EmployeeSearchServiceImpl implements EmployeeSearchService {
}
@Override
- public List filterbyDesignationUsingCriteriaBuilder(List designations) {
+ public List filterbyTitleUsingCriteriaBuilder(List titles) {
CriteriaQuery criteriaQuery = createCriteriaQuery(DeptEmployee.class);
Root root = criteriaQuery.from(DeptEmployee.class);
- In inClause = criteriaBuilder.in(root.get("designation"));
- for (String designaiton : designations) {
- inClause.value(designaiton);
+ In inClause = criteriaBuilder.in(root.get("title"));
+ for (String title : titles) {
+ inClause.value(title);
}
criteriaQuery.select(root)
.where(inClause);
@@ -39,12 +39,12 @@ public class EmployeeSearchServiceImpl implements EmployeeSearchService {
}
@Override
- public List filterbyDesignationUsingExpression(List designations) {
+ public List filterbyTitleUsingExpression(List titles) {
CriteriaQuery criteriaQuery = createCriteriaQuery(DeptEmployee.class);
Root root = criteriaQuery.from(DeptEmployee.class);
criteriaQuery.select(root)
- .where(root.get("designation")
- .in(designations));
+ .where(root.get("title")
+ .in(titles));
TypedQuery query = entityManager.createQuery(criteriaQuery);
return query.getResultList();
}
diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java
new file mode 100644
index 0000000000..8a1b9e9791
--- /dev/null
+++ b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java
@@ -0,0 +1,63 @@
+package com.baeldung.hibernate.findall;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.baeldung.hibernate.HibernateUtil;
+import com.baeldung.hibernate.pojo.Student;
+
+public class FindAllUnitTest {
+
+ private Session session;
+ private Transaction transaction;
+
+ private FindAll findAll;
+
+ @Before
+ public void setUp() throws IOException {
+
+ session = HibernateUtil.getSessionFactory().openSession();
+ transaction = session.beginTransaction();
+ findAll = new FindAll(session);
+
+ session.createNativeQuery("delete from Student").executeUpdate();
+
+ Student student1 = new Student();
+ session.persist(student1);
+
+ Student student2 = new Student();
+ session.persist(student2);
+
+ Student student3 = new Student();
+ session.persist(student3);
+
+ transaction.commit();
+ transaction = session.beginTransaction();
+ }
+
+ @After
+ public void tearDown() {
+ transaction.rollback();
+ session.close();
+ }
+
+ @Test
+ public void givenCriteriaQuery_WhenFindAll_ThenGetAllPersons() {
+ List list = findAll.findAllWithCriteriaQuery();
+ assertEquals(3, list.size());
+ }
+
+ @Test
+ public void givenJpql_WhenFindAll_ThenGetAllPersons() {
+ List list = findAll.findAllWithJpql();
+ assertEquals(3, list.size());
+ }
+}
diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java
index c7a1bc7b2a..2b12734a10 100644
--- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java
+++ b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/jpacriteriabuilder/EmployeeSearchServiceIntegrationTest.java
@@ -81,42 +81,41 @@ public class EmployeeSearchServiceIntegrationTest {
@Test
public final void givenCriteriaQuery_whenSearchedUsingCriteriaBuilderWithListofAuthors_thenResultIsFilteredByAuthorNames() {
- List designations = new ArrayList() {
+ List titles = new ArrayList() {
{
add("Manager");
add("Senior Manager");
add("Director");
}
};
- List result = searchService.filterbyDesignationUsingCriteriaBuilder(designations);
+ List result = searchService.filterbyTitleUsingCriteriaBuilder(titles);
assertEquals("Number of Employees does not match with expected.", 6, result.size());
assertThat(result.stream()
- .map(DeptEmployee::getDesignation)
+ .map(DeptEmployee::getTitle)
.distinct()
- .collect(Collectors.toList()), containsInAnyOrder(designations.toArray()));
+ .collect(Collectors.toList()), containsInAnyOrder(titles.toArray()));
}
@Test
public final void givenCriteriaQuery_whenSearchedUsingExpressionWithListofAuthors_thenResultIsFilteredByAuthorNames() {
- List designations = new ArrayList() {
+ List titles = new ArrayList() {
{
add("Manager");
add("Senior Manager");
add("Director");
}
};
- List result = searchService.filterbyDesignationUsingExpression(designations);
+ List result = searchService.filterbyTitleUsingExpression(titles);
assertEquals("Number of Employees does not match with expected.", 6, result.size());
assertThat(result.stream()
- .map(DeptEmployee::getDesignation)
+ .map(DeptEmployee::getTitle)
.distinct()
- .collect(Collectors.toList()), containsInAnyOrder(designations.toArray()));
+ .collect(Collectors.toList()), containsInAnyOrder(titles.toArray()));
}
@Test
public final void givenCriteriaQuery_whenSearchedDepartmentLike_thenResultIsFilteredByDepartment() {
List result = searchService.searchByDepartmentQuery("Sales");
assertEquals("Number of Employees does not match with expected.", 7, result.size());
- // assertThat(result.stream().map(DeptEmployee::getDesignation).distinct().collect(Collectors.toList()), containsInAnyOrder(designations.toArray()));
}
}
diff --git a/persistence-modules/java-cassandra/pom.xml b/persistence-modules/java-cassandra/pom.xml
index 36ec6b5ac8..aac5d49547 100644
--- a/persistence-modules/java-cassandra/pom.xml
+++ b/persistence-modules/java-cassandra/pom.xml
@@ -4,6 +4,7 @@
com.baeldung
java-cassandra
1.0.0-SNAPSHOT
+ java-cassandra
com.baeldung
diff --git a/persistence-modules/java-cockroachdb/pom.xml b/persistence-modules/java-cockroachdb/pom.xml
index 870707c750..2a92934a6e 100644
--- a/persistence-modules/java-cockroachdb/pom.xml
+++ b/persistence-modules/java-cockroachdb/pom.xml
@@ -5,6 +5,7 @@
com.baeldung
java-cockroachdb
1.0-SNAPSHOT
+ java-cockroachdb
parent-modules
diff --git a/persistence-modules/java-jdbi/pom.xml b/persistence-modules/java-jdbi/pom.xml
index 885906fcd0..9281f4fd9d 100644
--- a/persistence-modules/java-jdbi/pom.xml
+++ b/persistence-modules/java-jdbi/pom.xml
@@ -4,6 +4,7 @@
4.0.0
java-jdbi
1.0-SNAPSHOT
+ java-jdbi
parent-modules
diff --git a/persistence-modules/java-jpa/pom.xml b/persistence-modules/java-jpa/pom.xml
index 78764f7148..ddab51a2e2 100644
--- a/persistence-modules/java-jpa/pom.xml
+++ b/persistence-modules/java-jpa/pom.xml
@@ -2,15 +2,16 @@
+ 4.0.0
+ java-jpa
+ java-jpa
+
parent-modules
com.baeldung
1.0.0-SNAPSHOT
../../pom.xml
- 4.0.0
-
- java-jpa
diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/MainApp.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/MainApp.java
new file mode 100644
index 0000000000..88aa4389e9
--- /dev/null
+++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/MainApp.java
@@ -0,0 +1,26 @@
+package com.baeldung.jpa.entitygraph;
+
+import com.baeldung.jpa.entitygraph.model.Post;
+import com.baeldung.jpa.entitygraph.repo.PostRepository;
+
+public class MainApp {
+
+ public static void main(String... args) {
+ Long postId = 1L;
+ Post post = null;
+ PostRepository postRepository = new PostRepository();
+
+ //Using EntityManager.find().
+ post = postRepository.find(postId);
+ post = postRepository.findWithEntityGraph(postId);
+ post = postRepository.findWithEntityGraph2(postId);
+
+ //Using JPQL: Query and TypedQuery
+ post = postRepository.findUsingJpql(postId);
+
+ //Using Criteria API
+ post = postRepository.findUsingCriteria(postId);
+
+ postRepository.clean();
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/Comment.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/Comment.java
new file mode 100644
index 0000000000..40ecd3262b
--- /dev/null
+++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/Comment.java
@@ -0,0 +1,63 @@
+package com.baeldung.jpa.entitygraph.model;
+
+import javax.persistence.*;
+
+@Entity
+public class Comment {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ private String reply;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn
+ private Post post;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn
+ private User user;
+ //...
+
+ public Comment() {
+ }
+
+ public Comment(String reply, Post post, User user) {
+ this.reply = reply;
+ this.post = post;
+ this.user = user;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getReply() {
+ return reply;
+ }
+
+ public void setReply(String reply) {
+ this.reply = reply;
+ }
+
+ public Post getPost() {
+ return post;
+ }
+
+ public void setPost(Post post) {
+ this.post = post;
+ }
+
+ public User getUser() {
+ return user;
+ }
+
+ public void setUser(User user) {
+ this.user = user;
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/Post.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/Post.java
new file mode 100644
index 0000000000..59f17ae0c5
--- /dev/null
+++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/Post.java
@@ -0,0 +1,86 @@
+package com.baeldung.jpa.entitygraph.model;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@NamedEntityGraph(
+ name = "post-entity-graph",
+ attributeNodes = {
+ @NamedAttributeNode("subject"),
+ @NamedAttributeNode("user"),
+ @NamedAttributeNode("comments"),
+ }
+)
+@NamedEntityGraph(
+ name = "post-entity-graph-with-comment-users",
+ attributeNodes = {
+ @NamedAttributeNode("subject"),
+ @NamedAttributeNode("user"),
+ @NamedAttributeNode(value = "comments", subgraph = "comments-subgraph"),
+ },
+ subgraphs = {
+ @NamedSubgraph(
+ name = "comments-subgraph",
+ attributeNodes = {
+ @NamedAttributeNode("user")
+ }
+ )
+ }
+)
+@Entity
+public class Post {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+ private String subject;
+ @OneToMany(mappedBy = "post")
+ private List comments = new ArrayList<>();
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn
+ private User user;
+ //...
+
+ public Post() {
+ }
+
+ public Post(String subject, User user) {
+ this.subject = subject;
+ this.user = user;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getSubject() {
+ return subject;
+ }
+
+ public void setSubject(String subject) {
+ this.subject = subject;
+ }
+
+ public List getComments() {
+ return comments;
+ }
+
+ public void setComments(List comments) {
+ this.comments = comments;
+ }
+
+ public User getUser() {
+ return user;
+ }
+
+ public void setUser(User user) {
+ this.user = user;
+ }
+}
diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/User.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/User.java
new file mode 100644
index 0000000000..b712100d4e
--- /dev/null
+++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/User.java
@@ -0,0 +1,48 @@
+package com.baeldung.jpa.entitygraph.model;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+public class User {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+ private String name;
+ private String email;
+
+ //...
+
+ public User() {
+ }
+
+ public User(String email) {
+ this.email = email;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+}
diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/repo/PostRepository.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/repo/PostRepository.java
new file mode 100644
index 0000000000..28f1e1b93c
--- /dev/null
+++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/repo/PostRepository.java
@@ -0,0 +1,93 @@
+package com.baeldung.jpa.entitygraph.repo;
+
+import com.baeldung.jpa.entitygraph.model.Post;
+
+import javax.persistence.*;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Root;
+import java.util.HashMap;
+import java.util.Map;
+
+public class PostRepository {
+ private EntityManagerFactory emf = null;
+
+
+ public PostRepository() {
+ Map properties = new HashMap();
+ properties.put("hibernate.show_sql", "true");
+ properties.put("hibernate.format_sql", "true");
+ emf = Persistence.createEntityManagerFactory("entity-graph-pu", properties);
+ }
+
+ public Post find(Long id) {
+ EntityManager entityManager = emf.createEntityManager();
+
+ Post post = entityManager.find(Post.class, id);
+
+ entityManager.close();
+ return post;
+ }
+
+ public Post findWithEntityGraph(Long id) {
+ EntityManager entityManager = emf.createEntityManager();
+
+ EntityGraph entityGraph = entityManager.getEntityGraph("post-entity-graph");
+ Map properties = new HashMap<>();
+ properties.put("javax.persistence.fetchgraph", entityGraph);
+ Post post = entityManager.find(Post.class, id, properties);
+
+ entityManager.close();
+ return post;
+ }
+
+ public Post findWithEntityGraph2(Long id) {
+ EntityManager entityManager = emf.createEntityManager();
+
+ EntityGraph entityGraph = entityManager.createEntityGraph(Post.class);
+ entityGraph.addAttributeNodes("subject");
+ entityGraph.addAttributeNodes("user");
+ entityGraph.addSubgraph("comments")
+ .addAttributeNodes("user");
+
+ Map properties = new HashMap<>();
+ properties.put("javax.persistence.fetchgraph", entityGraph);
+ Post post = entityManager.find(Post.class, id, properties);
+
+ entityManager.close();
+ return post;
+ }
+
+ public Post findUsingJpql(Long id) {
+ EntityManager entityManager = emf.createEntityManager();
+
+ EntityGraph entityGraph = entityManager.getEntityGraph("post-entity-graph-with-comment-users");
+ Post post = entityManager.createQuery("Select p from Post p where p.id=:id", Post.class)
+ .setParameter("id", id)
+ .setHint("javax.persistence.fetchgraph", entityGraph)
+ .getSingleResult();
+
+ entityManager.close();
+ return post;
+ }
+
+ public Post findUsingCriteria(Long id) {
+ EntityManager entityManager = emf.createEntityManager();
+
+ EntityGraph entityGraph = entityManager.getEntityGraph("post-entity-graph-with-comment-users");
+ CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
+ CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Post.class);
+ Root root = criteriaQuery.from(Post.class);
+ criteriaQuery.where(criteriaBuilder.equal(root.get("id"), id));
+ TypedQuery typedQuery = entityManager.createQuery(criteriaQuery);
+ typedQuery.setHint("javax.persistence.loadgraph", entityGraph);
+ Post post = typedQuery.getSingleResult();
+
+ entityManager.close();
+ return post;
+ }
+
+ public void clean() {
+ emf.close();
+ }
+}
diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/Message.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/Message.java
new file mode 100644
index 0000000000..fb521cfea6
--- /dev/null
+++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/Message.java
@@ -0,0 +1,43 @@
+package com.baeldung.jpa.stringcast;
+
+import javax.persistence.*;
+
+@SqlResultSetMapping(name = "textQueryMapping", classes = {
+ @ConstructorResult(targetClass = Message.class, columns = {
+ @ColumnResult(name = "text")
+ })
+})
+@Entity
+public class Message {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ private String text;
+
+ public Message() {
+
+ }
+
+ public Message(String text) {
+ this.text = text;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+}
diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/QueryExecutor.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/QueryExecutor.java
new file mode 100644
index 0000000000..6f1e2ee5ca
--- /dev/null
+++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/QueryExecutor.java
@@ -0,0 +1,41 @@
+package com.baeldung.jpa.stringcast;
+
+import com.sun.istack.internal.Nullable;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class QueryExecutor {
+
+ public static List executeNativeQueryNoCastCheck(String statement, EntityManager em) {
+ Query query = em.createNativeQuery(statement);
+ return query.getResultList();
+ }
+
+ public static List executeNativeQueryWithCastCheck(String statement, EntityManager em) {
+ Query query = em.createNativeQuery(statement);
+ List results = query.getResultList();
+
+ if (results.isEmpty()) {
+ return new ArrayList<>();
+ }
+
+ if (results.get(0) instanceof String) {
+ return ((List) results)
+ .stream()
+ .map(s -> new String[] { s })
+ .collect(Collectors.toList());
+ } else {
+ return (List) results;
+ }
+ }
+
+ public static List executeNativeQueryGeneric(String statement, String mapping, EntityManager em) {
+ Query query = em.createNativeQuery(statement, mapping);
+ return query.getResultList();
+ }
+
+}
diff --git a/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml b/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml
index 3d881673b2..433d456cc9 100644
--- a/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml
+++ b/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml
@@ -9,29 +9,61 @@
org.hibernate.jpa.HibernatePersistenceProvider
com.baeldung.sqlresultsetmapping.ScheduledDay
-
+
-
-
-
+ value="jdbc:h2:mem:test;INIT=RUNSCRIPT FROM 'classpath:database.sql'"/>
+
+
+
-
+
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.stringcast.Message
+
+
+
+
+
+
+
+
+
+
+
+
org.hibernate.jpa.HibernatePersistenceProvider
com.baeldung.jpa.model.Car
-
-
-
-
-
-
+
+
+
+
+
+
-
+
+
+ com.baeldung.jpa.entitygraph.model.Post
+ com.baeldung.jpa.entitygraph.model.User
+ com.baeldung.jpa.entitygraph.model.Comment
+ true
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/java-jpa/src/main/resources/data-init.sql b/persistence-modules/java-jpa/src/main/resources/data-init.sql
new file mode 100644
index 0000000000..86c3f2a651
--- /dev/null
+++ b/persistence-modules/java-jpa/src/main/resources/data-init.sql
@@ -0,0 +1,8 @@
+INSERT INTO `USER` (`ID`,`NAME`,`EMAIL`) VALUES (1,'user1','user1@test.com');
+INSERT INTO `USER` (`ID`,`NAME`,`EMAIL`) VALUES (2,'user2','user2@test.com');
+INSERT INTO `USER` (`ID`,`NAME`,`EMAIL`) VALUES (3,'user3','user3@test.com');
+
+INSERT INTO `POST` (`ID`,`SUBJECT`,`USER_ID`) VALUES (1,'JPA Entity Graph In Action',1);
+
+INSERT INTO `COMMENT` (`ID`,`REPLY`,`POST_ID`,`USER_ID`) VALUES (1,'Nice !!',1,2);
+INSERT INTO `COMMENT` (`ID`,`REPLY`,`POST_ID`,`USER_ID`) VALUES (2,'Cool !!',1,3);
diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entitygraph/repo/PostRepositoryIntegrationTest.java b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entitygraph/repo/PostRepositoryIntegrationTest.java
new file mode 100644
index 0000000000..4724bb41ad
--- /dev/null
+++ b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entitygraph/repo/PostRepositoryIntegrationTest.java
@@ -0,0 +1,68 @@
+package com.baeldung.jpa.entitygraph.repo;
+
+import com.baeldung.jpa.entitygraph.model.Comment;
+import com.baeldung.jpa.entitygraph.model.Post;
+import com.baeldung.jpa.entitygraph.model.User;
+import org.hibernate.LazyInitializationException;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class PostRepositoryIntegrationTest {
+
+ private static PostRepository postRepository = null;
+
+ @BeforeClass
+ public static void once() {
+ postRepository = new PostRepository();
+ }
+
+ @Test(expected = LazyInitializationException.class)
+ public void find() {
+ Post post = postRepository.find(1L);
+ assertNotNull(post.getUser());
+ String email = post.getUser().getEmail();
+ assertNull(email);
+ }
+
+ @Test
+ public void findWithEntityGraph() {
+ Post post = postRepository.findWithEntityGraph(1L);
+ assertNotNull(post.getUser());
+ String email = post.getUser().getEmail();
+ assertNotNull(email);
+ }
+
+ @Test(expected = LazyInitializationException.class)
+ public void findWithEntityGraph_Comment_Without_User() {
+ Post post = postRepository.findWithEntityGraph(1L);
+ assertNotNull(post.getUser());
+ String email = post.getUser().getEmail();
+ assertNotNull(email);
+ assertNotNull(post.getComments());
+ assertEquals(post.getComments().size(), 2);
+ Comment comment = post.getComments().get(0);
+ assertNotNull(comment);
+ User user = comment.getUser();
+ user.getEmail();
+ }
+
+ @Test
+ public void findWithEntityGraph2_Comment_With_User() {
+ Post post = postRepository.findWithEntityGraph2(1L);
+ assertNotNull(post.getComments());
+ assertEquals(post.getComments().size(), 2);
+ Comment comment = post.getComments().get(0);
+ assertNotNull(comment);
+ User user = comment.getUser();
+ assertNotNull(user);
+ assertEquals(user.getEmail(), "user2@test.com");
+ }
+
+ @AfterClass
+ public static void destroy() {
+ postRepository.clean();
+ }
+}
diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastUnitTest.java b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastUnitTest.java
new file mode 100644
index 0000000000..0a11725fc3
--- /dev/null
+++ b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastUnitTest.java
@@ -0,0 +1,53 @@
+package com.baeldung.jpa.stringcast;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import javax.persistence.*;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class SpringCastUnitTest {
+
+ private static EntityManager em;
+ private static EntityManagerFactory emFactory;
+
+ @BeforeClass
+ public static void setup() {
+ emFactory = Persistence.createEntityManagerFactory("jpa-h2");
+ em = emFactory.createEntityManager();
+
+ // insert an object into the db
+ Message message = new Message();
+ message.setText("text");
+
+ EntityTransaction tr = em.getTransaction();
+ tr.begin();
+ em.persist(message);
+ tr.commit();
+ }
+
+ @Test(expected = ClassCastException.class)
+ public void givenExecutorNoCastCheck_whenQueryReturnsOneColumn_thenClassCastThrown() {
+ List results = QueryExecutor.executeNativeQueryNoCastCheck("select text from message", em);
+
+ // fails
+ for (String[] row : results) {
+ // do nothing
+ }
+ }
+
+ @Test
+ public void givenExecutorWithCastCheck_whenQueryReturnsOneColumn_thenNoClassCastThrown() {
+ List results = QueryExecutor.executeNativeQueryWithCastCheck("select text from message", em);
+ assertEquals("text", results.get(0)[0]);
+ }
+
+ @Test
+ public void givenExecutorGeneric_whenQueryReturnsOneColumn_thenNoClassCastThrown() {
+ List results = QueryExecutor.executeNativeQueryGeneric("select text from message", "textQueryMapping", em);
+ assertEquals("text", results.get(0).getText());
+ }
+
+}
diff --git a/persistence-modules/java-jpa/src/test/resources/persistence.xml b/persistence-modules/java-jpa/src/test/resources/persistence.xml
index d94221b54f..c902e0a320 100644
--- a/persistence-modules/java-jpa/src/test/resources/persistence.xml
+++ b/persistence-modules/java-jpa/src/test/resources/persistence.xml
@@ -17,5 +17,21 @@
+
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.stringcast.Message
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/persistence-modules/java-mongodb/pom.xml b/persistence-modules/java-mongodb/pom.xml
index bbc48f54c2..9658ef567f 100644
--- a/persistence-modules/java-mongodb/pom.xml
+++ b/persistence-modules/java-mongodb/pom.xml
@@ -5,6 +5,7 @@
com.baeldung
java-mongodb
1.0-SNAPSHOT
+ java-mongodb
com.baeldung
diff --git a/persistence-modules/jnosql/jnosql-artemis/pom.xml b/persistence-modules/jnosql/jnosql-artemis/pom.xml
index 9c2bfd1ba0..8a978fb179 100644
--- a/persistence-modules/jnosql/jnosql-artemis/pom.xml
+++ b/persistence-modules/jnosql/jnosql-artemis/pom.xml
@@ -3,6 +3,9 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ jnosql-artemis
+ jnosql-artemis
+ war
com.baeldung.jnosql
@@ -10,9 +13,6 @@
1.0-SNAPSHOT
- jnosql-artemis
- war
-
2.4.2
false
diff --git a/persistence-modules/jnosql/jnosql-diana/pom.xml b/persistence-modules/jnosql/jnosql-diana/pom.xml
index 767defb2a8..126f0314d9 100644
--- a/persistence-modules/jnosql/jnosql-diana/pom.xml
+++ b/persistence-modules/jnosql/jnosql-diana/pom.xml
@@ -3,15 +3,15 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
+ jnosql-diana
+ jnosql-diana
+
com.baeldung.jnosql
jnosql
1.0-SNAPSHOT
- jnosql-diana
-
diff --git a/persistence-modules/jnosql/pom.xml b/persistence-modules/jnosql/pom.xml
index c87ad3cf4b..5fb29a3b9c 100644
--- a/persistence-modules/jnosql/pom.xml
+++ b/persistence-modules/jnosql/pom.xml
@@ -3,10 +3,10 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
com.baeldung.jnosql
jnosql
1.0-SNAPSHOT
+ jnosql
pom
diff --git a/persistence-modules/liquibase/pom.xml b/persistence-modules/liquibase/pom.xml
index cb2bee8d48..b06d38e6a0 100644
--- a/persistence-modules/liquibase/pom.xml
+++ b/persistence-modules/liquibase/pom.xml
@@ -3,6 +3,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
liquibase
+ liquibase
parent-modules
diff --git a/persistence-modules/orientdb/pom.xml b/persistence-modules/orientdb/pom.xml
index e4bc9a0585..a8ac3fb789 100644
--- a/persistence-modules/orientdb/pom.xml
+++ b/persistence-modules/orientdb/pom.xml
@@ -4,8 +4,8 @@
4.0.0
orientdb
0.0.1-SNAPSHOT
+ orientdb
jar
- intro-orientdb
introduction to the OrientDB Java APIs
diff --git a/persistence-modules/spring-boot-h2/spring-boot-h2-database/pom.xml b/persistence-modules/spring-boot-h2/spring-boot-h2-database/pom.xml
index 4d677ab0d4..6ebc75de8d 100644
--- a/persistence-modules/spring-boot-h2/spring-boot-h2-database/pom.xml
+++ b/persistence-modules/spring-boot-h2/spring-boot-h2-database/pom.xml
@@ -3,10 +3,10 @@
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
com.baeldung.h2db
spring-boot-h2-database
0.0.1-SNAPSHOT
+ spring-boot-h2-database
jar
Demo Spring Boot applications that starts H2 in memory database
diff --git a/persistence-modules/spring-boot-persistence-mongodb/.gitignore b/persistence-modules/spring-boot-persistence-mongodb/.gitignore
new file mode 100644
index 0000000000..f96dae6a60
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-mongodb/.gitignore
@@ -0,0 +1,4 @@
+
+/.idea/
+/target/
+/spring-boot-persistence.iml
diff --git a/persistence-modules/spring-boot-persistence-mongodb/pom.xml b/persistence-modules/spring-boot-persistence-mongodb/pom.xml
new file mode 100644
index 0000000000..fc267eedf6
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-mongodb/pom.xml
@@ -0,0 +1,106 @@
+
+
+ 4.0.0
+
+
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+
+ spring-boot-persistence-mongodb
+ war
+ spring-boot-persistence-mongodb
+ This is simple boot application for Spring boot persistence mongodb test
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-mongodb
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ test
+
+
+
+
+ org.junit.platform
+ junit-platform-launcher
+ ${junit-platform.version}
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ spring-boot-persistence
+
+
+ src/main/resources
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+
+
+
+
+
+
+ autoconfiguration
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ **/*LiveTest.java
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+
+
+
+
+ json
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/SpringBootPersistenceApplication.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/SpringBootPersistenceApplication.java
new file mode 100644
index 0000000000..2dff3f37df
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/SpringBootPersistenceApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringBootPersistenceApplication {
+
+ public static void main(String ... args) {
+ SpringApplication.run(SpringBootPersistenceApplication.class, args);
+ }
+
+}
diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/daos/UserRepository.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/daos/UserRepository.java
new file mode 100755
index 0000000000..7f58fdd1c8
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/daos/UserRepository.java
@@ -0,0 +1,10 @@
+package com.baeldung.mongodb.daos;
+
+
+import com.baeldung.mongodb.models.User;
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+
+public interface UserRepository extends MongoRepository {
+
+}
diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/events/UserModelListener.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/events/UserModelListener.java
new file mode 100644
index 0000000000..24b53f3d2d
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/events/UserModelListener.java
@@ -0,0 +1,28 @@
+package com.baeldung.mongodb.events;
+
+
+import com.baeldung.mongodb.models.User;
+import com.baeldung.mongodb.services.SequenceGeneratorService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;
+import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent;
+import org.springframework.stereotype.Component;
+
+
+@Component
+public class UserModelListener extends AbstractMongoEventListener {
+
+ private SequenceGeneratorService sequenceGenerator;
+
+ @Autowired
+ public UserModelListener(SequenceGeneratorService sequenceGenerator) {
+ this.sequenceGenerator = sequenceGenerator;
+ }
+
+ @Override
+ public void onBeforeConvert(BeforeConvertEvent event) {
+ event.getSource().setId(sequenceGenerator.generateSequence(User.SEQUENCE_NAME));
+ }
+
+
+}
diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/models/DatabaseSequence.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/models/DatabaseSequence.java
new file mode 100755
index 0000000000..c2c04f7ee6
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/models/DatabaseSequence.java
@@ -0,0 +1,32 @@
+package com.baeldung.mongodb.models;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+
+@Document(collection = "database_sequences")
+public class DatabaseSequence {
+
+ @Id
+ private String id;
+
+ private long seq;
+
+ public DatabaseSequence() {}
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public long getSeq() {
+ return seq;
+ }
+
+ public void setSeq(long seq) {
+ this.seq = seq;
+ }
+}
diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/models/User.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/models/User.java
new file mode 100755
index 0000000000..1f08074313
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/models/User.java
@@ -0,0 +1,73 @@
+package com.baeldung.mongodb.models;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.annotation.Transient;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+
+@Document(collection = "users")
+public class User {
+
+ @Transient
+ public static final String SEQUENCE_NAME = "users_sequence";
+
+ @Id
+ private long id;
+
+ private String firstName;
+
+ private String lastName;
+
+ private String email;
+
+ public User() { }
+
+ public User(String firstName, String lastName, String email) {
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.email = email;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+
+ @Override
+ public String toString() {
+ return "User{" +
+ "id=" + id +
+ ", firstName='" + firstName + '\'' +
+ ", lastName='" + lastName + '\'' +
+ ", email='" + email + '\'' +
+ '}';
+ }
+}
diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/services/SequenceGeneratorService.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/services/SequenceGeneratorService.java
new file mode 100755
index 0000000000..52ece27d63
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/services/SequenceGeneratorService.java
@@ -0,0 +1,35 @@
+package com.baeldung.mongodb.services;
+
+import com.baeldung.mongodb.models.DatabaseSequence;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoOperations;
+import org.springframework.data.mongodb.core.query.Update;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+
+import static org.springframework.data.mongodb.core.FindAndModifyOptions.options;
+import static org.springframework.data.mongodb.core.query.Criteria.where;
+import static org.springframework.data.mongodb.core.query.Query.query;
+
+
+@Service
+public class SequenceGeneratorService {
+
+
+ private MongoOperations mongoOperations;
+
+ @Autowired
+ public SequenceGeneratorService(MongoOperations mongoOperations) {
+ this.mongoOperations = mongoOperations;
+ }
+
+ public long generateSequence(String seqName) {
+
+ DatabaseSequence counter = mongoOperations.findAndModify(query(where("_id").is(seqName)),
+ new Update().inc("seq",1), options().returnNew(true).upsert(true),
+ DatabaseSequence.class);
+ return !Objects.isNull(counter) ? counter.getSeq() : 1;
+
+ }
+}
diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/resources/application.properties b/persistence-modules/spring-boot-persistence-mongodb/src/main/resources/application.properties
new file mode 100644
index 0000000000..5b1b8000d0
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/resources/application.properties
@@ -0,0 +1,8 @@
+spring.application.name=spring-boot-persistence
+server.port=${PORT:0}
+
+#spring boot mongodb
+spring.data.mongodb.host=localhost
+spring.data.mongodb.port=27017
+spring.data.mongodb.database=springboot-mongo
+
diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/mongodb/MongoDbAutoGeneratedFieldIntegrationTest.java b/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/mongodb/MongoDbAutoGeneratedFieldIntegrationTest.java
new file mode 100644
index 0000000000..cec1ad5fea
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/mongodb/MongoDbAutoGeneratedFieldIntegrationTest.java
@@ -0,0 +1,37 @@
+package com.baeldung.mongodb;
+
+import com.baeldung.mongodb.daos.UserRepository;
+import com.baeldung.mongodb.models.User;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class MongoDbAutoGeneratedFieldIntegrationTest {
+
+ @Autowired
+ UserRepository userRepository;
+
+ @Test
+ public void contextLoads() {}
+
+ @Test
+ public void givenUserObject_whenSave_thenCreateNewUser() {
+
+ User user = new User();
+ user.setFirstName("John");
+ user.setLastName("Doe");
+ user.setEmail("john.doe@example.com");
+ userRepository.save(user);
+
+ assertThat(userRepository.findAll().size()).isGreaterThan(0);
+ }
+
+
+}
diff --git a/persistence-modules/spring-boot-persistence/README.MD b/persistence-modules/spring-boot-persistence/README.MD
index 6cf172426a..8988fb4ebd 100644
--- a/persistence-modules/spring-boot-persistence/README.MD
+++ b/persistence-modules/spring-boot-persistence/README.MD
@@ -4,3 +4,4 @@
- [Configuring Separate Spring DataSource for Tests](http://www.baeldung.com/spring-testing-separate-data-source)
- [Quick Guide on data.sql and schema.sql Files in Spring Boot](http://www.baeldung.com/spring-boot-data-sql-and-schema-sql)
- [Configuring a Tomcat Connection Pool in Spring Boot](https://www.baeldung.com/spring-boot-tomcat-connection-pool)
+- [Hibernate Field Naming with Spring Boot](https://www.baeldung.com/hibernate-field-naming-spring-boot)
diff --git a/persistence-modules/spring-boot-persistence/pom.xml b/persistence-modules/spring-boot-persistence/pom.xml
index 80472fdd57..0ea42b1cb7 100644
--- a/persistence-modules/spring-boot-persistence/pom.xml
+++ b/persistence-modules/spring-boot-persistence/pom.xml
@@ -2,11 +2,11 @@
- 4.0.0
-
+ 4.0.0
com.baeldung
spring-boot-persistence
0.1.0
+ spring-boot-persistence
parent-boot-2
diff --git a/persistence-modules/spring-data-cassandra-reactive/pom.xml b/persistence-modules/spring-data-cassandra-reactive/pom.xml
new file mode 100644
index 0000000000..037b1fd3c1
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-reactive/pom.xml
@@ -0,0 +1,70 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ spring-data-cassandra-reactive
+ 0.0.1-SNAPSHOT
+ jar
+
+ spring-data-cassandra-reactive
+ Spring Data Cassandra reactive
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.0.RELEASE
+
+
+
+
+ UTF-8
+ UTF-8
+
+ 1.8
+
+
+
+
+ org.springframework.data
+ spring-data-cassandra
+ 2.1.2.RELEASE
+
+
+ io.projectreactor
+ reactor-core
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ io.projectreactor
+ reactor-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
diff --git a/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/SpringDataCassandraReactiveApplication.java b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/SpringDataCassandraReactiveApplication.java
new file mode 100644
index 0000000000..5f467042a3
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/SpringDataCassandraReactiveApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.cassandra.reactive;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringDataCassandraReactiveApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringDataCassandraReactiveApplication.class, args);
+ }
+}
diff --git a/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/controller/EmployeeController.java b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/controller/EmployeeController.java
new file mode 100644
index 0000000000..e9de213e61
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/controller/EmployeeController.java
@@ -0,0 +1,49 @@
+package com.baeldung.cassandra.reactive.controller;
+
+import com.baeldung.cassandra.reactive.model.Employee;
+import com.baeldung.cassandra.reactive.service.EmployeeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import javax.annotation.PostConstruct;
+import java.util.ArrayList;
+import java.util.List;
+
+@RestController
+@RequestMapping("employee")
+public class EmployeeController {
+
+ @Autowired
+ EmployeeService employeeService;
+
+ @PostConstruct
+ public void saveEmployees() {
+ List employees = new ArrayList<>();
+ employees.add(new Employee(123, "John Doe", "Delaware", "jdoe@xyz.com", 31));
+ employees.add(new Employee(324, "Adam Smith", "North Carolina", "asmith@xyz.com", 43));
+ employees.add(new Employee(355, "Kevin Dunner", "Virginia", "kdunner@xyz.com", 24));
+ employees.add(new Employee(643, "Mike Lauren", "New York", "mlauren@xyz.com", 41));
+ employeeService.initializeEmployees(employees);
+ }
+
+ @GetMapping("/list")
+ public Flux getAllEmployees() {
+ Flux employees = employeeService.getAllEmployees();
+ return employees;
+ }
+
+ @GetMapping("/{id}")
+ public Mono getEmployeeById(@PathVariable int id) {
+ return employeeService.getEmployeeById(id);
+ }
+
+ @GetMapping("/filterByAge/{age}")
+ public Flux getEmployeesFilterByAge(@PathVariable int age) {
+ return employeeService.getEmployeesFilterByAge(age);
+ }
+}
diff --git a/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/model/Employee.java b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/model/Employee.java
new file mode 100644
index 0000000000..a78f884778
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/model/Employee.java
@@ -0,0 +1,20 @@
+package com.baeldung.cassandra.reactive.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.cassandra.core.mapping.PrimaryKey;
+import org.springframework.data.cassandra.core.mapping.Table;
+
+@Table
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Employee {
+ @PrimaryKey
+ private int id;
+ private String name;
+ private String address;
+ private String email;
+ private int age;
+}
diff --git a/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/repository/EmployeeRepository.java b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/repository/EmployeeRepository.java
new file mode 100644
index 0000000000..22dc2b4565
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/repository/EmployeeRepository.java
@@ -0,0 +1,11 @@
+package com.baeldung.cassandra.reactive.repository;
+
+import com.baeldung.cassandra.reactive.model.Employee;
+import org.springframework.data.cassandra.repository.AllowFiltering;
+import org.springframework.data.cassandra.repository.ReactiveCassandraRepository;
+import reactor.core.publisher.Flux;
+
+public interface EmployeeRepository extends ReactiveCassandraRepository {
+ @AllowFiltering
+ Flux findByAgeGreaterThan(int age);
+}
diff --git a/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/service/EmployeeService.java b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/service/EmployeeService.java
new file mode 100644
index 0000000000..40c330937a
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/service/EmployeeService.java
@@ -0,0 +1,35 @@
+package com.baeldung.cassandra.reactive.service;
+
+import com.baeldung.cassandra.reactive.model.Employee;
+import com.baeldung.cassandra.reactive.repository.EmployeeRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import java.util.List;
+
+@Service
+public class EmployeeService {
+
+ @Autowired
+ EmployeeRepository employeeRepository;
+
+ public void initializeEmployees(List employees) {
+ Flux savedEmployees = employeeRepository.saveAll(employees);
+ savedEmployees.subscribe();
+ }
+
+ public Flux getAllEmployees() {
+ Flux employees = employeeRepository.findAll();
+ return employees;
+ }
+
+ public Flux getEmployeesFilterByAge(int age) {
+ return employeeRepository.findByAgeGreaterThan(age);
+ }
+
+ public Mono getEmployeeById(int id) {
+ return employeeRepository.findById(id);
+ }
+}
diff --git a/persistence-modules/spring-data-cassandra-reactive/src/main/resources/application.properties b/persistence-modules/spring-data-cassandra-reactive/src/main/resources/application.properties
new file mode 100644
index 0000000000..7ed2f10131
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-reactive/src/main/resources/application.properties
@@ -0,0 +1,2 @@
+spring.data.cassandra.keyspace-name=practice
+spring.data.cassandra.port=9042
\ No newline at end of file
diff --git a/persistence-modules/spring-data-cassandra-reactive/src/test/java/com/baeldung/cassandra/reactive/ReactiveEmployeeRepositoryIntegrationTest.java b/persistence-modules/spring-data-cassandra-reactive/src/test/java/com/baeldung/cassandra/reactive/ReactiveEmployeeRepositoryIntegrationTest.java
new file mode 100644
index 0000000000..ad726fe969
--- /dev/null
+++ b/persistence-modules/spring-data-cassandra-reactive/src/test/java/com/baeldung/cassandra/reactive/ReactiveEmployeeRepositoryIntegrationTest.java
@@ -0,0 +1,55 @@
+package com.baeldung.cassandra.reactive;
+
+import com.baeldung.cassandra.reactive.model.Employee;
+import com.baeldung.cassandra.reactive.repository.EmployeeRepository;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+import reactor.test.StepVerifier;
+
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class ReactiveEmployeeRepositoryIntegrationTest {
+
+ @Autowired
+ EmployeeRepository repository;
+
+ @Before
+ public void setUp() {
+
+ Flux deleteAndInsert = repository.deleteAll() //
+ .thenMany(repository.saveAll(Flux.just(
+ new Employee(111, "John Doe", "Delaware", "jdoe@xyz.com", 31),
+ new Employee(222, "Adam Smith", "North Carolina", "asmith@xyz.com", 43),
+ new Employee(333, "Kevin Dunner", "Virginia", "kdunner@xyz.com", 24),
+ new Employee(444, "Mike Lauren", "New York", "mlauren@xyz.com", 41))));
+
+ StepVerifier.create(deleteAndInsert).expectNextCount(4).verifyComplete();
+ }
+
+ @Test
+ public void givenRecordsAreInserted_whenDbIsQueried_thenShouldIncludeNewRecords() {
+
+ Mono saveAndCount = repository.count()
+ .doOnNext(System.out::println)
+ .thenMany(repository.saveAll(Flux.just(new Employee(325, "Kim Jones", "Florida", "kjones@xyz.com", 42),
+ new Employee(654, "Tom Moody", "New Hampshire", "tmoody@xyz.com", 44))))
+ .last()
+ .flatMap(v -> repository.count())
+ .doOnNext(System.out::println);
+
+ StepVerifier.create(saveAndCount).expectNext(6L).verifyComplete();
+ }
+
+ @Test
+ public void givenAgeForFilter_whenDbIsQueried_thenShouldReturnFilteredRecords() {
+ StepVerifier.create(repository.findByAgeGreaterThan(35)).expectNextCount(2).verifyComplete();
+ }
+
+}
diff --git a/persistence-modules/spring-data-gemfire/pom.xml b/persistence-modules/spring-data-gemfire/pom.xml
index 34346c502f..292b7387ac 100644
--- a/persistence-modules/spring-data-gemfire/pom.xml
+++ b/persistence-modules/spring-data-gemfire/pom.xml
@@ -5,6 +5,7 @@
com.baeldung
spring-data-gemfire
1.0.0-SNAPSHOT
+ spring-data-gemfire
jar
diff --git a/persistence-modules/spring-data-jpa/README.md b/persistence-modules/spring-data-jpa/README.md
index 44ce240da3..a65b744944 100644
--- a/persistence-modules/spring-data-jpa/README.md
+++ b/persistence-modules/spring-data-jpa/README.md
@@ -15,6 +15,7 @@
- [Query Entities by Dates and Times with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-query-by-date)
- [DDD Aggregates and @DomainEvents](https://www.baeldung.com/spring-data-ddd)
- [Spring Data – CrudRepository save() Method](https://www.baeldung.com/spring-data-crud-repository-save)
+- [Limiting Query Results with JPA and Spring Data JPA](https://www.baeldung.com/jpa-limit-query-results)
### Eclipse Config
After importing the project into Eclipse, you may see the following error:
diff --git a/persistence-modules/spring-data-jpa/pom.xml b/persistence-modules/spring-data-jpa/pom.xml
index 643210ab89..786e587734 100644
--- a/persistence-modules/spring-data-jpa/pom.xml
+++ b/persistence-modules/spring-data-jpa/pom.xml
@@ -5,6 +5,7 @@
4.0.0
com.baeldung
spring-data-jpa
+ spring-data-jpa
parent-boot-2
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/PassengerRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/PassengerRepository.java
deleted file mode 100644
index 6301f6e307..0000000000
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/PassengerRepository.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.baeldung.limit;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-interface PassengerRepository extends JpaRepository, CustomPassengerRepository {
-
- Passenger findFirstByOrderBySeatNumberAsc();
-}
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/CustomPassengerRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/CustomPassengerRepository.java
similarity index 80%
rename from persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/CustomPassengerRepository.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/CustomPassengerRepository.java
index e9b5ba272f..7ae44bfbda 100644
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/CustomPassengerRepository.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/CustomPassengerRepository.java
@@ -1,4 +1,4 @@
-package com.baeldung.limit;
+package com.baeldung.passenger;
import java.util.List;
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/Passenger.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/Passenger.java
similarity index 80%
rename from persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/Passenger.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/Passenger.java
index e7eb3af10b..24ae47e597 100644
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/Passenger.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/Passenger.java
@@ -1,4 +1,4 @@
-package com.baeldung.limit;
+package com.baeldung.passenger;
import javax.persistence.Basic;
import javax.persistence.Column;
@@ -17,7 +17,7 @@ class Passenger {
@Basic(optional = false)
@Column(nullable = false)
- private String fistName;
+ private String firstName;
@Basic(optional = false)
@Column(nullable = false)
@@ -27,8 +27,8 @@ class Passenger {
@Column(nullable = false)
private int seatNumber;
- private Passenger(String fistName, String lastName, int seatNumber) {
- this.fistName = fistName;
+ private Passenger(String firstName, String lastName, int seatNumber) {
+ this.firstName = firstName;
this.lastName = lastName;
this.seatNumber = seatNumber;
}
@@ -44,20 +44,20 @@ class Passenger {
if (object == null || getClass() != object.getClass())
return false;
Passenger passenger = (Passenger) object;
- return getSeatNumber() == passenger.getSeatNumber() && Objects.equals(getFistName(), passenger.getFistName())
+ return getSeatNumber() == passenger.getSeatNumber() && Objects.equals(getFirstName(), passenger.getFirstName())
&& Objects.equals(getLastName(), passenger.getLastName());
}
@Override
public int hashCode() {
- return Objects.hash(getFistName(), getLastName(), getSeatNumber());
+ return Objects.hash(getFirstName(), getLastName(), getSeatNumber());
}
@Override
public String toString() {
final StringBuilder toStringBuilder = new StringBuilder(getClass().getSimpleName());
toStringBuilder.append("{ id=").append(id);
- toStringBuilder.append(", fistName='").append(fistName).append('\'');
+ toStringBuilder.append(", firstName='").append(firstName).append('\'');
toStringBuilder.append(", lastName='").append(lastName).append('\'');
toStringBuilder.append(", seatNumber=").append(seatNumber);
toStringBuilder.append('}');
@@ -68,8 +68,8 @@ class Passenger {
return id;
}
- String getFistName() {
- return fistName;
+ String getFirstName() {
+ return firstName;
}
String getLastName() {
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepository.java
new file mode 100644
index 0000000000..6ae6afb403
--- /dev/null
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepository.java
@@ -0,0 +1,17 @@
+package com.baeldung.passenger;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+interface PassengerRepository extends JpaRepository, CustomPassengerRepository {
+
+ Passenger findFirstByOrderBySeatNumberAsc();
+
+ List findByOrderBySeatNumberAsc();
+
+ List findByLastNameOrderBySeatNumberAsc(String lastName);
+
+ List findByLastName(String lastName, Sort sort);
+}
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/PassengerRepositoryImpl.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepositoryImpl.java
similarity index 94%
rename from persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/PassengerRepositoryImpl.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepositoryImpl.java
index 2d13eb7cad..bd6e535e3e 100644
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/PassengerRepositoryImpl.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepositoryImpl.java
@@ -1,4 +1,4 @@
-package com.baeldung.limit;
+package com.baeldung.passenger;
import org.springframework.stereotype.Repository;
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/limit/LimitIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/passenger/PassengerRepositoryIntegrationTest.java
similarity index 63%
rename from persistence-modules/spring-data-jpa/src/test/java/com/baeldung/limit/LimitIntegrationTest.java
rename to persistence-modules/spring-data-jpa/src/test/java/com/baeldung/passenger/PassengerRepositoryIntegrationTest.java
index 27e0ebdd9f..c57e771345 100644
--- a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/limit/LimitIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/passenger/PassengerRepositoryIntegrationTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.limit;
+package com.baeldung.passenger;
import org.junit.Before;
import org.junit.Test;
@@ -14,11 +14,13 @@ import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.List;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.contains;
import static org.junit.Assert.assertEquals;
@DataJpaTest
@RunWith(SpringRunner.class)
-public class LimitIntegrationTest {
+public class PassengerRepositoryIntegrationTest {
@PersistenceContext
private EntityManager entityManager;
@@ -66,4 +68,31 @@ public class LimitIntegrationTest {
Passenger actual = page.getContent().get(0);
assertEquals(expected, actual);
}
+
+ @Test
+ public void givenPassengers_whenOrderedBySeatNumberAsc_thenCorrectOrder() {
+ Passenger fred = Passenger.from("Fred", "Bloggs", 22);
+ Passenger ricki = Passenger.from("Ricki", "Bobbie", 36);
+ Passenger jill = Passenger.from("Jill", "Smith", 50);
+ Passenger siya = Passenger.from("Siya", "Kolisi", 85);
+ Passenger eve = Passenger.from("Eve", "Jackson", 95);
+
+ List passengers = repository.findByOrderBySeatNumberAsc();
+
+ assertThat(passengers, contains(fred, ricki, jill, siya, eve));
+ }
+
+ @Test
+ public void givenPassengers_whenFindAllWithSortBySeatNumberAsc_thenCorrectOrder() {
+ Passenger fred = Passenger.from("Fred", "Bloggs", 22);
+ Passenger ricki = Passenger.from("Ricki", "Bobbie", 36);
+ Passenger jill = Passenger.from("Jill", "Smith", 50);
+ Passenger siya = Passenger.from("Siya", "Kolisi", 85);
+ Passenger eve = Passenger.from("Eve", "Jackson", 95);
+
+ List passengers = repository.findAll(Sort.by(Sort.Direction.ASC, "seatNumber"));
+
+ assertThat(passengers, contains(fred, ricki, jill, siya, eve));
+ }
+
}
diff --git a/persistence-modules/spring-data-keyvalue/pom.xml b/persistence-modules/spring-data-keyvalue/pom.xml
index 6675595f2b..1fee0a88d4 100644
--- a/persistence-modules/spring-data-keyvalue/pom.xml
+++ b/persistence-modules/spring-data-keyvalue/pom.xml
@@ -2,6 +2,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-data-keyvalue
+ spring-data-keyvalue
parent-boot-2
diff --git a/persistence-modules/spring-data-mongodb/README.md b/persistence-modules/spring-data-mongodb/README.md
index c7bc7584be..c4f21dffc0 100644
--- a/persistence-modules/spring-data-mongodb/README.md
+++ b/persistence-modules/spring-data-mongodb/README.md
@@ -12,3 +12,4 @@
- [Spring Data MongoDB: Projections and Aggregations](http://www.baeldung.com/spring-data-mongodb-projections-aggregations)
- [Spring Data Annotations](http://www.baeldung.com/spring-data-annotations)
- [Spring Data MongoDB Transactions](https://www.baeldung.com/spring-data-mongodb-transactions )
+- [ZonedDateTime with Spring Data MongoDB](https://www.baeldung.com/spring-data-mongodb-zoneddatetime)
diff --git a/persistence-modules/spring-data-mongodb/pom.xml b/persistence-modules/spring-data-mongodb/pom.xml
index 466acf5a43..76ec5a96a6 100644
--- a/persistence-modules/spring-data-mongodb/pom.xml
+++ b/persistence-modules/spring-data-mongodb/pom.xml
@@ -109,7 +109,7 @@
- 2.1.0.RELEASE
+ 2.1.2.RELEASE
4.1.4
1.1.3
5.1.0.RELEASE
diff --git a/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/config/MongoConfig.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/config/MongoConfig.java
index f1048fa145..9fa90acf86 100644
--- a/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/config/MongoConfig.java
+++ b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/config/MongoConfig.java
@@ -3,6 +3,8 @@ package com.baeldung.config;
import java.util.ArrayList;
import java.util.List;
+import converter.ZonedDateTimeReadConverter;
+import converter.ZonedDateTimeWriteConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
@@ -52,6 +54,8 @@ public class MongoConfig extends AbstractMongoConfiguration {
@Override
public MongoCustomConversions customConversions() {
converters.add(new UserWriterConverter());
+ converters.add(new ZonedDateTimeReadConverter());
+ converters.add(new ZonedDateTimeWriteConverter());
return new MongoCustomConversions(converters);
}
@@ -64,5 +68,5 @@ public class MongoConfig extends AbstractMongoConfiguration {
MongoTransactionManager transactionManager(MongoDbFactory dbFactory) {
return new MongoTransactionManager(dbFactory);
}
-
+
}
diff --git a/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/model/Action.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/model/Action.java
new file mode 100644
index 0000000000..aa480dbdf7
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/model/Action.java
@@ -0,0 +1,51 @@
+package com.baeldung.model;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.time.ZonedDateTime;
+
+@Document
+public class Action {
+
+ @Id
+ private String id;
+
+ private String description;
+ private ZonedDateTime time;
+
+ public Action(String id, String description, ZonedDateTime time) {
+ this.id = id;
+ this.description = description;
+ this.time = time;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public ZonedDateTime getTime() {
+ return time;
+ }
+
+ public void setTime(ZonedDateTime time) {
+ this.time = time;
+ }
+
+ @Override
+ public String toString() {
+ return "Action{id='" + id + "', description='" + description + "', time=" + time + '}';
+ }
+}
diff --git a/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/repository/ActionRepository.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/repository/ActionRepository.java
new file mode 100644
index 0000000000..bdca490fe6
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/repository/ActionRepository.java
@@ -0,0 +1,6 @@
+package com.baeldung.repository;
+
+import com.baeldung.model.Action;
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+public interface ActionRepository extends MongoRepository { }
\ No newline at end of file
diff --git a/persistence-modules/spring-data-mongodb/src/main/java/converter/ZonedDateTimeReadConverter.java b/persistence-modules/spring-data-mongodb/src/main/java/converter/ZonedDateTimeReadConverter.java
new file mode 100644
index 0000000000..a2d847957b
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb/src/main/java/converter/ZonedDateTimeReadConverter.java
@@ -0,0 +1,14 @@
+package converter;
+
+import org.springframework.core.convert.converter.Converter;
+
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import java.util.Date;
+
+public class ZonedDateTimeReadConverter implements Converter {
+ @Override
+ public ZonedDateTime convert(Date date) {
+ return date.toInstant().atZone(ZoneOffset.UTC);
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-data-mongodb/src/main/java/converter/ZonedDateTimeWriteConverter.java b/persistence-modules/spring-data-mongodb/src/main/java/converter/ZonedDateTimeWriteConverter.java
new file mode 100644
index 0000000000..e13ac2d130
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb/src/main/java/converter/ZonedDateTimeWriteConverter.java
@@ -0,0 +1,13 @@
+package converter;
+
+import org.springframework.core.convert.converter.Converter;
+
+import java.time.ZonedDateTime;
+import java.util.Date;
+
+public class ZonedDateTimeWriteConverter implements Converter {
+ @Override
+ public Date convert(ZonedDateTime zonedDateTime) {
+ return Date.from(zonedDateTime.toInstant());
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/ActionRepositoryLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/ActionRepositoryLiveTest.java
new file mode 100644
index 0000000000..096015ca0a
--- /dev/null
+++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/ActionRepositoryLiveTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.repository;
+
+import com.baeldung.config.MongoConfig;
+import com.baeldung.model.Action;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoOperations;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = MongoConfig.class)
+public class ActionRepositoryLiveTest {
+
+ @Autowired
+ private MongoOperations mongoOps;
+
+ @Autowired
+ private ActionRepository actionRepository;
+
+ @Before
+ public void setup() {
+ if (!mongoOps.collectionExists(Action.class)) {
+ mongoOps.createCollection(Action.class);
+ }
+ }
+
+ @Test
+ public void givenSavedAction_TimeIsRetrievedCorrectly() {
+ String id = "testId";
+ ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC);
+
+ actionRepository.save(new Action(id, "click-action", now));
+ Action savedAction = actionRepository.findById(id).get();
+
+ Assert.assertEquals(now.withNano(0), savedAction.getTime().withNano(0));
+ }
+
+ @After
+ public void tearDown() {
+ mongoOps.dropCollection(Action.class);
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-data-neo4j/pom.xml b/persistence-modules/spring-data-neo4j/pom.xml
index 2be4df71be..1e5d51ddf2 100644
--- a/persistence-modules/spring-data-neo4j/pom.xml
+++ b/persistence-modules/spring-data-neo4j/pom.xml
@@ -3,7 +3,8 @@
4.0.0
spring-data-neo4j
1.0
-
+ spring-data-neo4j
+
com.baeldung
parent-modules
diff --git a/persistence-modules/spring-data-redis/README.md b/persistence-modules/spring-data-redis/README.md
index da44920e16..a20f5052f0 100644
--- a/persistence-modules/spring-data-redis/README.md
+++ b/persistence-modules/spring-data-redis/README.md
@@ -3,6 +3,7 @@
### Relevant Articles:
- [Introduction to Spring Data Redis](http://www.baeldung.com/spring-data-redis-tutorial)
- [PubSub Messaging with Spring Data Redis](http://www.baeldung.com/spring-data-redis-pub-sub)
+- [An Introduction to Spring Data Redis Reactive](https://www.baeldung.com/spring-data-redis-reactive)
### Build the Project with Tests Running
```
diff --git a/persistence-modules/spring-data-redis/pom.xml b/persistence-modules/spring-data-redis/pom.xml
index bee3d683b8..683f874b6c 100644
--- a/persistence-modules/spring-data-redis/pom.xml
+++ b/persistence-modules/spring-data-redis/pom.xml
@@ -4,6 +4,7 @@
com.baeldung
spring-data-redis
1.0
+ spring-data-redis
jar
diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java
new file mode 100644
index 0000000000..899fcde947
--- /dev/null
+++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java
@@ -0,0 +1,38 @@
+package com.baeldung.hibernate.onetoone;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.service.ServiceRegistry;
+
+public class HibernateUtil {
+ private static SessionFactory sessionFactory;
+
+ private static SessionFactory buildSessionFactory(Strategy strategy) {
+ try {
+ // Create the SessionFactory from hibernate-annotation.cfg.xml
+ Configuration configuration = new Configuration();
+
+ for (Class> entityClass : strategy.getEntityClasses()) {
+ configuration.addAnnotatedClass(entityClass);
+ }
+ configuration.configure("one-to-one.cfg.xml");
+
+ ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties())
+ .build();
+
+ SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
+
+ return sessionFactory;
+ } catch (Throwable ex) {
+ ex.printStackTrace();
+ throw new ExceptionInInitializerError(ex);
+ }
+ }
+
+ public static SessionFactory getSessionFactory(Strategy strategy) {
+ if (sessionFactory == null)
+ sessionFactory = buildSessionFactory(strategy);
+ return sessionFactory;
+ }
+}
diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java
new file mode 100644
index 0000000000..3180566ca5
--- /dev/null
+++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java
@@ -0,0 +1,25 @@
+package com.baeldung.hibernate.onetoone;
+
+
+import java.util.Arrays;
+import java.util.List;
+
+public enum Strategy {
+ //See that the classes belongs to different packages
+ FOREIGN_KEY(Arrays.asList(com.baeldung.hibernate.onetoone.foreignkeybased.User.class,
+ com.baeldung.hibernate.onetoone.foreignkeybased.Address.class)),
+ SHARED_PRIMARY_KEY(Arrays.asList(com.baeldung.hibernate.onetoone.sharedkeybased.User.class,
+ com.baeldung.hibernate.onetoone.sharedkeybased.Address.class)),
+ JOIN_TABLE_BASED(Arrays.asList(com.baeldung.hibernate.onetoone.jointablebased.Employee.class,
+ com.baeldung.hibernate.onetoone.jointablebased.WorkStation.class));
+
+ private List> entityClasses;
+
+ Strategy(List> entityClasses) {
+ this.entityClasses = entityClasses;
+ }
+
+ public List> getEntityClasses() {
+ return entityClasses;
+ }
+}
diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java
new file mode 100644
index 0000000000..e05eb46030
--- /dev/null
+++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java
@@ -0,0 +1,60 @@
+package com.baeldung.hibernate.onetoone.foreignkeybased;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "address")
+public class Address {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ @Column(name = "id")
+ private Long id;
+
+ @Column(name = "street")
+ private String street;
+
+ @Column(name = "city")
+ private String city;
+
+ @OneToOne(mappedBy = "address")
+ private User user;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getStreet() {
+ return street;
+ }
+
+ public void setStreet(String street) {
+ this.street = street;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public User getUser() {
+ return user;
+ }
+
+ public void setUser(User user) {
+ this.user = user;
+ }
+}
diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java
new file mode 100644
index 0000000000..56b108d0d1
--- /dev/null
+++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java
@@ -0,0 +1,51 @@
+package com.baeldung.hibernate.onetoone.foreignkeybased;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "users")
+public class User {
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ @Column(name = "id")
+ private Long id;
+
+ @Column(name = "username")
+ private String userName;
+
+ @OneToOne(cascade = CascadeType.ALL)
+ @JoinColumn(name = "address_id", referencedColumnName = "id")
+ private Address address;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public Address getAddress() {
+ return address;
+ }
+
+ public void setAddress(Address address) {
+ this.address = address;
+ }
+}
diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java
new file mode 100644
index 0000000000..a0bc101b9f
--- /dev/null
+++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java
@@ -0,0 +1,53 @@
+package com.baeldung.hibernate.onetoone.jointablebased;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "employee")
+public class Employee {
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ @Column(name = "id")
+ private Long id;
+
+ @Column(name = "ename")
+ private String name;
+
+ @OneToOne(cascade = CascadeType.ALL)
+ @JoinTable(name = "emp_workstation", joinColumns = {@JoinColumn(name = "employee_id", referencedColumnName = "id")},
+ inverseJoinColumns = {@JoinColumn(name = "workstation_id", referencedColumnName = "id")})
+ private WorkStation workStation;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public WorkStation getWorkStation() {
+ return workStation;
+ }
+
+ public void setWorkStation(WorkStation workStation) {
+ this.workStation = workStation;
+ }
+}
diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java
new file mode 100644
index 0000000000..f530611f6e
--- /dev/null
+++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java
@@ -0,0 +1,61 @@
+package com.baeldung.hibernate.onetoone.jointablebased;
+
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "workstation")
+public class WorkStation {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ @Column(name = "id")
+ private Long id;
+
+ @Column(name = "workstation_number")
+ private Integer workstationNumber;
+
+ @Column(name = "floor")
+ private String floor;
+
+ @OneToOne(mappedBy = "workStation")
+ private Employee employee;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Integer getWorkstationNumber() {
+ return workstationNumber;
+ }
+
+ public void setWorkstationNumber(Integer workstationNumber) {
+ this.workstationNumber = workstationNumber;
+ }
+
+ public String getFloor() {
+ return floor;
+ }
+
+ public void setFloor(String floor) {
+ this.floor = floor;
+ }
+
+ public Employee getEmployee() {
+ return employee;
+ }
+
+ public void setEmployee(Employee employee) {
+ this.employee = employee;
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java
new file mode 100644
index 0000000000..927516f6bb
--- /dev/null
+++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java
@@ -0,0 +1,60 @@
+package com.baeldung.hibernate.onetoone.sharedkeybased;
+
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.MapsId;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "address")
+public class Address {
+
+ @Id
+ @Column(name = "id")
+ private Long id;
+
+ @Column(name = "street")
+ private String street;
+
+ @Column(name = "city")
+ private String city;
+
+ @OneToOne
+ @MapsId
+ private User user;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getStreet() {
+ return street;
+ }
+
+ public void setStreet(String street) {
+ this.street = street;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public User getUser() {
+ return user;
+ }
+
+ public void setUser(User user) {
+ this.user = user;
+ }
+}
diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java
new file mode 100644
index 0000000000..fa00db1271
--- /dev/null
+++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java
@@ -0,0 +1,50 @@
+package com.baeldung.hibernate.onetoone.sharedkeybased;
+
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "users")
+public class User {
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ @Column(name = "id")
+ private Long id;
+
+ @Column(name = "username")
+ private String userName;
+
+ @OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
+ private Address address;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public Address getAddress() {
+ return address;
+ }
+
+ public void setAddress(Address address) {
+ this.address = address;
+ }
+}
diff --git a/persistence-modules/spring-hibernate-5/src/main/resources/one-to-one.cfg.xml b/persistence-modules/spring-hibernate-5/src/main/resources/one-to-one.cfg.xml
new file mode 100644
index 0000000000..7522036acb
--- /dev/null
+++ b/persistence-modules/spring-hibernate-5/src/main/resources/one-to-one.cfg.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ org.h2.Driver
+
+ jdbc:h2:mem:spring_hibernate_one_to_one
+ sa
+ org.hibernate.dialect.H2Dialect
+ thread
+ true
+ create-drop
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java
new file mode 100644
index 0000000000..475c93f6ff
--- /dev/null
+++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java
@@ -0,0 +1,80 @@
+package com.baeldung.hibernate.onetoone;
+
+import com.baeldung.hibernate.onetoone.foreignkeybased.Address;
+import com.baeldung.hibernate.onetoone.foreignkeybased.User;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class HibernateOneToOneAnnotationFKBasedIntegrationTest {
+
+ private static SessionFactory sessionFactory;
+
+ private Session session;
+
+ @BeforeClass
+ public static void beforeTests() {
+ sessionFactory = HibernateUtil.getSessionFactory(Strategy.FOREIGN_KEY);
+ }
+
+ @Before
+ public void setUp() {
+ session = sessionFactory.openSession();
+ session.beginTransaction();
+ }
+
+ @Test
+ public void givenData_whenInsert_thenCreates1to1relationship() {
+ User user = new User();
+ user.setUserName("alice@baeldung.com");
+
+ Address address = new Address();
+ address.setStreet("FK Street");
+ address.setCity("FK City");
+
+ address.setUser(user);
+ user.setAddress(address);
+
+ //Address entry will automatically be created by hibernate, since cascade type is specified as ALL
+ session.persist(user);
+ session.getTransaction().commit();
+
+ assert1to1InsertedData();
+ }
+
+ private void assert1to1InsertedData() {
+ @SuppressWarnings("unchecked")
+ List userList = session.createQuery("FROM User").list();
+
+ assertNotNull(userList);
+ assertEquals(1, userList.size());
+
+ User user = userList.get(0);
+ assertEquals("alice@baeldung.com", user.getUserName());
+
+ Address address = user.getAddress();
+ assertNotNull(address);
+ assertEquals("FK Street", address.getStreet());
+ assertEquals("FK City", address.getCity());
+
+ }
+
+ @After
+ public void tearDown() {
+ session.close();
+ }
+
+ @AfterClass
+ public static void afterTests() {
+ sessionFactory.close();
+ }
+}
diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java
new file mode 100644
index 0000000000..df4cd4d137
--- /dev/null
+++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java
@@ -0,0 +1,80 @@
+package com.baeldung.hibernate.onetoone;
+
+import com.baeldung.hibernate.onetoone.jointablebased.Employee;
+import com.baeldung.hibernate.onetoone.jointablebased.WorkStation;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class HibernateOneToOneAnnotationJTBasedIntegrationTest {
+
+ private static SessionFactory sessionFactory;
+
+ private Session session;
+
+ @BeforeClass
+ public static void beforeTests() {
+ sessionFactory = HibernateUtil.getSessionFactory(Strategy.JOIN_TABLE_BASED);
+ }
+
+ @Before
+ public void setUp() {
+ session = sessionFactory.openSession();
+ session.beginTransaction();
+ }
+
+ @Test
+ public void givenData_whenInsert_thenCreates1to1relationship() {
+ Employee employee = new Employee();
+ employee.setName("bob@baeldung.com");
+
+ WorkStation workStation = new WorkStation();
+ workStation.setWorkstationNumber(626);
+ workStation.setFloor("Sixth Floor");
+
+
+ employee.setWorkStation(workStation);
+ workStation.setEmployee(employee);
+
+ session.persist(employee);
+ session.getTransaction().commit();
+
+ assert1to1InsertedData();
+ }
+
+ private void assert1to1InsertedData() {
+ @SuppressWarnings("unchecked")
+ List employeeList = session.createQuery("FROM Employee").list();
+ assertNotNull(employeeList);
+ assertEquals(1, employeeList.size());
+
+ Employee employee = employeeList.get(0);
+ assertEquals("bob@baeldung.com", employee.getName());
+
+ WorkStation workStation = employee.getWorkStation();
+
+ assertNotNull(workStation);
+ assertEquals((long) 626, (long) workStation.getWorkstationNumber());
+ assertEquals("Sixth Floor", workStation.getFloor());
+
+ }
+
+ @After
+ public void tearDown() {
+ session.close();
+ }
+
+ @AfterClass
+ public static void afterTests() {
+ sessionFactory.close();
+ }
+}
diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java
new file mode 100644
index 0000000000..7931a8e3fe
--- /dev/null
+++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java
@@ -0,0 +1,79 @@
+package com.baeldung.hibernate.onetoone;
+
+import com.baeldung.hibernate.onetoone.sharedkeybased.Address;
+import com.baeldung.hibernate.onetoone.sharedkeybased.User;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class HibernateOneToOneAnnotationSPKBasedIntegrationTest {
+
+ private static SessionFactory sessionFactory;
+
+ private Session session;
+
+ @BeforeClass
+ public static void beforeTests() {
+ sessionFactory = HibernateUtil.getSessionFactory(Strategy.SHARED_PRIMARY_KEY);
+ }
+
+ @Before
+ public void setUp() {
+ session = sessionFactory.openSession();
+ session.beginTransaction();
+ }
+
+ @Test
+ public void givenData_whenInsert_thenCreates1to1relationship() {
+ User user = new User();
+ user.setUserName("alice@baeldung.com");
+
+ Address address = new Address();
+ address.setStreet("SPK Street");
+ address.setCity("SPK City");
+
+ address.setUser(user);
+ user.setAddress(address);
+
+ //Address entry will automatically be created by hibernate, since cascade type is specified as ALL
+ session.persist(user);
+ session.getTransaction().commit();
+
+ assert1to1InsertedData();
+ }
+
+
+ private void assert1to1InsertedData() {
+ @SuppressWarnings("unchecked")
+ List userList = session.createQuery("FROM User").list();
+ assertNotNull(userList);
+ assertEquals(1, userList.size());
+
+ User user = userList.get(0);
+ assertEquals("alice@baeldung.com", user.getUserName());
+
+ Address address = user.getAddress();
+ assertNotNull(address);
+ assertEquals("SPK Street", address.getStreet());
+ assertEquals("SPK City", address.getCity());
+ }
+
+ @After
+ public void tearDown() {
+ session.close();
+ }
+
+ @AfterClass
+ public static void afterTests() {
+ sessionFactory.close();
+ }
+}
diff --git a/persistence-modules/spring-hibernate-5/src/test/resources/one-to-one.cfg.xml b/persistence-modules/spring-hibernate-5/src/test/resources/one-to-one.cfg.xml
new file mode 100644
index 0000000000..60417e312d
--- /dev/null
+++ b/persistence-modules/spring-hibernate-5/src/test/resources/one-to-one.cfg.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ org.h2.Driver
+
+ jdbc:h2:mem:spring_hibernate_one_to_one
+ sa
+ org.hibernate.dialect.H2Dialect
+ thread
+ true
+ create-drop
+
+
diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/Course.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/Course.java
new file mode 100644
index 0000000000..bdfb8e890f
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/Course.java
@@ -0,0 +1,71 @@
+package com.baeldung.manytomany.model;
+
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "course")
+public class Course {
+
+ @Id
+ @Column(name = "id")
+ private Long id;
+
+ @ManyToMany(mappedBy = "likedCourses")
+ private Set likes;
+
+ @OneToMany(mappedBy = "course")
+ private Set ratings;
+
+ @OneToMany(mappedBy = "course")
+ private Set registrations;
+
+ // additional properties
+
+ public Course() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public Set getRatings() {
+ return ratings;
+ }
+
+ public Set getRegistrations() {
+ return registrations;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Course other = (Course) obj;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ return true;
+ }
+
+}
diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRating.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRating.java
new file mode 100644
index 0000000000..4951f766bc
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRating.java
@@ -0,0 +1,79 @@
+package com.baeldung.manytomany.model;
+
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.MapsId;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "course_rating")
+public class CourseRating {
+
+ @EmbeddedId
+ private CourseRatingKey id;
+
+ @ManyToOne
+ @MapsId("student_id")
+ @JoinColumn(name = "student_id")
+ private Student student;
+
+ @ManyToOne
+ @MapsId("course_id")
+ @JoinColumn(name = "course_id")
+ private Course course;
+
+ @Column(name = "rating")
+ private int rating;
+
+ public CourseRating() {
+ }
+
+ public int getRating() {
+ return rating;
+ }
+
+ public void setRating(int rating) {
+ this.rating = rating;
+ }
+
+ public CourseRatingKey getId() {
+ return id;
+ }
+
+ public Student getStudent() {
+ return student;
+ }
+
+ public Course getCourse() {
+ return course;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CourseRating other = (CourseRating) obj;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ return true;
+ }
+
+}
diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRatingKey.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRatingKey.java
new file mode 100644
index 0000000000..4e7430ed92
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRatingKey.java
@@ -0,0 +1,59 @@
+package com.baeldung.manytomany.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+@Embeddable
+public class CourseRatingKey implements Serializable {
+
+ @Column(name = "student_id")
+ private Long studentId;
+
+ @Column(name = "course_id")
+ private Long courseId;
+
+ public CourseRatingKey() {
+ }
+
+ public Long getStudentId() {
+ return studentId;
+ }
+
+ public Long getCourseId() {
+ return courseId;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((courseId == null) ? 0 : courseId.hashCode());
+ result = prime * result + ((studentId == null) ? 0 : studentId.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CourseRatingKey other = (CourseRatingKey) obj;
+ if (courseId == null) {
+ if (other.courseId != null)
+ return false;
+ } else if (!courseId.equals(other.courseId))
+ return false;
+ if (studentId == null) {
+ if (other.studentId != null)
+ return false;
+ } else if (!studentId.equals(other.studentId))
+ return false;
+ return true;
+ }
+
+}
diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRegistration.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRegistration.java
new file mode 100644
index 0000000000..e1f30af883
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRegistration.java
@@ -0,0 +1,100 @@
+package com.baeldung.manytomany.model;
+
+import java.time.LocalDateTime;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "course_registration")
+public class CourseRegistration {
+
+ @Id
+ @Column(name = "id")
+ private Long id;
+
+ @ManyToOne
+ @JoinColumn(name = "student_id")
+ private Student student;
+
+ @ManyToOne
+ @JoinColumn(name = "course_id")
+ private Course course;
+
+ @Column(name = "registered_at")
+ private LocalDateTime registeredAt;
+
+ @Column(name = "grade")
+ private int grade;
+
+ // additional properties
+
+ public CourseRegistration() {
+ }
+
+ public Student getStudent() {
+ return student;
+ }
+
+ public void setStudent(Student student) {
+ this.student = student;
+ }
+
+ public Course getCourse() {
+ return course;
+ }
+
+ public void setCourse(Course course) {
+ this.course = course;
+ }
+
+ public LocalDateTime getRegisteredAt() {
+ return registeredAt;
+ }
+
+ public void setRegisteredAt(LocalDateTime registeredAt) {
+ this.registeredAt = registeredAt;
+ }
+
+ public int getGrade() {
+ return grade;
+ }
+
+ public void setGrade(int grade) {
+ this.grade = grade;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CourseRegistration other = (CourseRegistration) obj;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ return true;
+ }
+
+}
diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/Student.java b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/Student.java
new file mode 100644
index 0000000000..00561593a6
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/Student.java
@@ -0,0 +1,78 @@
+package com.baeldung.manytomany.model;
+
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "student")
+public class Student {
+
+ @Id
+ @Column(name = "id")
+ private Long id;
+
+ @ManyToMany
+ @JoinTable(name = "course_like", joinColumns = @JoinColumn(name = "student_id"), inverseJoinColumns = @JoinColumn(name = "course_id"))
+ private Set likedCourses;
+
+ @OneToMany(mappedBy = "student")
+ private Set ratings;
+
+ @OneToMany(mappedBy = "student")
+ private Set registrations;
+
+ // additional properties
+
+ public Student() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public Set getLikedCourses() {
+ return likedCourses;
+ }
+
+ public Set getRatings() {
+ return ratings;
+ }
+
+ public Set getRegistrations() {
+ return registrations;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Student other = (Student) obj;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ return true;
+ }
+
+}
diff --git a/persistence-modules/spring-jpa/src/test/java/com/baeldung/manytomany/ManyToManyIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/com/baeldung/manytomany/ManyToManyIntegrationTest.java
new file mode 100644
index 0000000000..5e4334f5d4
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/test/java/com/baeldung/manytomany/ManyToManyIntegrationTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.manytomany;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes = ManyToManyTestConfiguration.class)
+@DirtiesContext
+public class ManyToManyIntegrationTest {
+
+ @PersistenceContext
+ EntityManager entityManager;
+
+ @Test
+ public void contextStarted() {
+ }
+
+}
diff --git a/persistence-modules/spring-jpa/src/test/java/com/baeldung/manytomany/ManyToManyTestConfiguration.java b/persistence-modules/spring-jpa/src/test/java/com/baeldung/manytomany/ManyToManyTestConfiguration.java
new file mode 100644
index 0000000000..f4635b563a
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/test/java/com/baeldung/manytomany/ManyToManyTestConfiguration.java
@@ -0,0 +1,51 @@
+package com.baeldung.manytomany;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.sql.DataSource;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+import org.springframework.orm.jpa.JpaVendorAdapter;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
+
+@Configuration
+@PropertySource("classpath:/manytomany/test.properties")
+public class ManyToManyTestConfiguration {
+
+ @Bean
+ public DataSource dataSource() {
+ EmbeddedDatabaseBuilder dbBuilder = new EmbeddedDatabaseBuilder();
+ return dbBuilder.setType(EmbeddedDatabaseType.H2)
+ .addScript("classpath:/manytomany/db.sql")
+ .build();
+ }
+
+ @Bean
+ public LocalContainerEntityManagerFactoryBean entityManagerFactory(@Value("${hibernate.hbm2ddl.auto}") String hbm2ddlType, @Value("${hibernate.dialect}") String dialect, @Value("${hibernate.show_sql}") boolean showSql) {
+ LocalContainerEntityManagerFactoryBean result = new LocalContainerEntityManagerFactoryBean();
+
+ result.setDataSource(dataSource());
+ result.setPackagesToScan("com.baeldung.manytomany.model");
+ result.setJpaVendorAdapter(jpaVendorAdapter());
+
+ Map jpaProperties = new HashMap<>();
+ jpaProperties.put("hibernate.hbm2ddl.auto", hbm2ddlType);
+ jpaProperties.put("hibernate.dialect", dialect);
+ jpaProperties.put("hibernate.show_sql", showSql);
+ result.setJpaPropertyMap(jpaProperties);
+
+ return result;
+ }
+
+ public JpaVendorAdapter jpaVendorAdapter() {
+ return new HibernateJpaVendorAdapter();
+ }
+
+}
diff --git a/persistence-modules/spring-jpa/src/test/resources/manytomany/db.sql b/persistence-modules/spring-jpa/src/test/resources/manytomany/db.sql
new file mode 100644
index 0000000000..02905e41ee
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/test/resources/manytomany/db.sql
@@ -0,0 +1,44 @@
+CREATE TABLE course (
+ id bigint(20) NOT NULL,
+ PRIMARY KEY (id)
+);
+
+
+CREATE TABLE student (
+ id bigint(20) NOT NULL,
+ PRIMARY KEY (id)
+);
+
+
+CREATE TABLE course_like (
+ student_id bigint(20) NOT NULL,
+ course_id bigint(20) NOT NULL,
+ PRIMARY KEY (student_id, course_id),
+ CONSTRAINT fk_course_like__student FOREIGN KEY (student_id) REFERENCES student (id),
+ CONSTRAINT fk_course_like__course FOREIGN KEY (course_id) REFERENCES course (id)
+);
+
+
+
+CREATE TABLE course_rating (
+ course_id bigint(20) NOT NULL,
+ student_id bigint(20) NOT NULL,
+ rating int(11) NOT NULL,
+ PRIMARY KEY (course_id, student_id),
+ CONSTRAINT fk_course_rating__student FOREIGN KEY (student_id) REFERENCES student (id),
+ CONSTRAINT fk_course_rating__course FOREIGN KEY (course_id) REFERENCES course (id)
+);
+
+
+
+CREATE TABLE course_registration (
+ id bigint(20) NOT NULL,
+ grade int(11),
+ registered_at datetime NOT NULL,
+ course_id bigint(20) NOT NULL,
+ student_id bigint(20) NOT NULL,
+ PRIMARY KEY (id),
+ CONSTRAINT fk_course_registration__student FOREIGN KEY (student_id) REFERENCES student (id),
+ CONSTRAINT fk_course_registration__course FOREIGN KEY (course_id) REFERENCES course (id)
+);
+
diff --git a/persistence-modules/spring-jpa/src/test/resources/manytomany/test.properties b/persistence-modules/spring-jpa/src/test/resources/manytomany/test.properties
new file mode 100644
index 0000000000..9e4236a6c2
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/test/resources/manytomany/test.properties
@@ -0,0 +1,6 @@
+jdbc.driverClassName=org.h2.Driver
+jdbc.url=jdbc:h2:mem:myDb;DB_CLOSE_DELAY=-1
+
+hibernate.dialect=org.hibernate.dialect.H2Dialect
+hibernate.show_sql=true
+hibernate.hbm2ddl.auto=validate
diff --git a/pom.xml b/pom.xml
index 62e3e58e66..dabb4a9628 100644
--- a/pom.xml
+++ b/pom.xml
@@ -323,206 +323,170 @@
parent-boot-1
- parent-boot-2
- parent-spring-4
- parent-spring-5
- parent-java
- parent-kotlin
- asm
- atomix
- persistence-modules/apache-cayenne
- aws
- aws-lambda
- akka-streams
- algorithms-genetic
- algorithms-miscellaneous-1
- algorithms-miscellaneous-2
- algorithms-sorting
- annotations
- apache-cxf
- apache-fop
- apache-geode
- apache-poi
- apache-tika
- apache-thrift
- apache-curator
- apache-zookeeper
- apache-opennlp
- autovalue
- axon
- azure
- bootique
- cdi
- java-strings
-
- core-java
- core-java-collections
- java-collections-conversions
- java-collections-maps
- core-java-io
- core-java-8
- java-streams
- persistence-modules/core-java-persistence
- core-kotlin
- kotlin-libraries
- core-groovy
- core-java-concurrency
- core-java-concurrency-collections
- couchbase
- persistence-modules/deltaspike
- dozer
- ethereum
- ejb
- ejb/ejb-client
- feign
- flips
- testing-modules/gatling
- geotools
- testing-modules/groovy-spock
- google-cloud
- google-web-toolkit
- gson
- guava
- guava-collections
- guava-modules/guava-18
- guava-modules/guava-19
- guava-modules/guava-21
- guice
- disruptor
- core-scala
- spring-static-resources
- hazelcast
- persistence-modules/hbase
- persistence-modules/hibernate5
- httpclient
- hystrix
- image-processing
- immutables
- persistence-modules/influxdb
- jackson
- persistence-modules/java-cassandra
- vavr
- java-lite
- java-numbers
- java-rmi
- java-vavr-stream
- javax-servlets
- javaxval
- jaxb
- javafx
- jgroups
- jee-7
- jee-7-security
- jhipster
- jjwt
- jsf
- json-path
- json
- jsoup
- testing-modules/junit-5
-
- libraries
- libraries-data
- libraries-security
- libraries-server
- linkrest
- logging-modules/log-mdc
- logging-modules/log4j
- logging-modules/log4j2
- logging-modules/logback
- lombok
- mapstruct
- metrics
- maven
- mesos-marathon
- msf4j
- testing-modules/mockito
- testing-modules/mockito-2
- testing-modules/mocks
- mustache
- mvn-wrapper
- noexception
- persistence-modules/orientdb
- osgi
- orika
- patterns
- pdf
- protobuffer
- persistence-modules/querydsl
- reactor-core
- persistence-modules/redis
- testing-modules/rest-assured
- testing-modules/rest-testing
- resteasy
- rxjava
- rxjava-2
- spring-swagger-codegen
- testing-modules/selenium-junit-testng
- persistence-modules/solr
- spark-java
- spring-4
- spring-5
- spring-5-data-reactive
- spring-5-reactive
- spring-5-reactive-security
- spring-5-reactive-client
- spring-5-mvc
- spring-5-security
- spring-5-reactive-oauth
- spring-activiti
- spring-akka
- spring-amqp
- spring-all
- spring-amqp-simple
- spring-apache-camel
- spring-batch
- spring-bom
- spring-boot
- spring-boot-client
- spring-boot-keycloak
- spring-boot-bootstrap
- spring-boot-admin
- spring-boot-camel
- spring-boot-ops
- persistence-modules/spring-boot-persistence
- spring-boot-security
- spring-boot-mvc
- spring-boot-vue
- spring-boot-logging-log4j2
- spring-boot-disable-console-logging
- spring-cloud-data-flow
- spring-cloud
- spring-cloud-bus
- spring-core
- spring-cucumber
- spring-ejb
- spring-aop
- persistence-modules/spring-data-cassandra
- persistence-modules/spring-data-couchbase-2
- persistence-modules/spring-data-dynamodb
- persistence-modules/spring-data-elasticsearch
- persistence-modules/spring-data-jpa
- persistence-modules/spring-data-keyvalue
- persistence-modules/spring-data-mongodb
- persistence-modules/spring-data-neo4j
- persistence-modules/spring-data-redis
- spring-data-rest
- persistence-modules/spring-data-solr
- spring-dispatcher-servlet
- spring-exceptions
- spring-freemarker
- persistence-modules/spring-hibernate-3
- persistence-modules/spring-hibernate4
- persistence-modules/spring-hibernate-5
- persistence-modules/spring-data-eclipselink
- spring-integration
- spring-jenkins-pipeline
- spring-jersey
- jmeter
- spring-jms
- spring-jooq
- persistence-modules/spring-jpa
-
+ parent-boot-2
+ parent-spring-4
+ parent-spring-5
+ parent-java
+ parent-kotlin
+
+ asm
+ atomix
+ aws
+ aws-lambda
+ akka-streams
+ algorithms-genetic
+ algorithms-miscellaneous-1
+ algorithms-miscellaneous-2
+ algorithms-sorting
+ annotations
+ apache-cxf
+ apache-fop
+ apache-poi
+ apache-tika
+ apache-thrift
+ apache-curator
+ apache-zookeeper
+ apache-opennlp
+ autovalue
+ axon
+ azure
+ apache-velocity
+ apache-solrj
+ apache-meecrowave
+ antlr
+
+ bootique
+
+ cdi
+ core-java-collections
+ core-java-io
+ core-java-8
+ core-groovy
+ couchbase
+
+
+ core-java
+ core-java-net
+
+ dozer
+ disruptor
+ drools
+ deeplearning4j
+
+ ethereum
+
+ feign
+ flips
+
+ google-cloud
+ gson
+ guava
+ guava-collections
+ guava-modules/guava-18
+ guava-modules/guava-19
+ guava-modules/guava-21
+ guice
+
+ hazelcast
+ hystrix
+ httpclient
+
+ image-processing
+ immutables
+
+ jackson
+ java-strings
+
+ java-collections-conversions
+ java-collections-maps
+ java-streams
+ java-lite
+ java-numbers
+ java-rmi
+ java-vavr-stream
+ javax-servlets
+ javaxval
+ jaxb
+ javafx
+ jgroups
+
+ jee-7-security
+ jjwt
+ jsf
+ json-path
+ json
+ jsoup
+ jta
+ jws
+ jersey
+ java-spi
+ java-ee-8-security-api
+
+
+ libraries-data
+ linkrest
+ logging-modules/log-mdc
+ logging-modules/log4j
+ logging-modules/logback
+ lombok
+ lucene
+
+ mapstruct
+ maven
+ mesos-marathon
+ msf4j
+ mustache
+ mvn-wrapper
+ mybatis
+ metrics
+ maven-archetype
+
+ noexception
+
+ osgi
+ orika
+
+ patterns
+ pdf
+ protobuffer
+ performance-tests
+
+ persistence-modules/java-jdbi
+ persistence-modules/redis
+ persistence-modules/orientdb
+ persistence-modules/querydsl
+ persistence-modules/apache-cayenne
+ persistence-modules/solr
+ persistence-modules/spring-data-dynamodb
+ persistence-modules/spring-data-keyvalue
+ persistence-modules/spring-data-neo4j
+ persistence-modules/spring-data-solr
+ persistence-modules/spring-hibernate-5
+ persistence-modules/spring-data-eclipselink
+ persistence-modules/spring-jpa
+ persistence-modules/spring-hibernate-3
+ persistence-modules/spring-data-gemfire
+ persistence-modules/spring-boot-persistence
+ persistence-modules/liquibase
+ persistence-modules/java-cockroachdb
+ persistence-modules/deltaspike
+ persistence-modules/hbase
+ persistence-modules/influxdb
+ persistence-modules/spring-hibernate4
+ persistence-modules/spring-data-mongodb
+ persistence-modules/java-cassandra
+ persistence-modules/spring-data-cassandra
+ persistence-modules/spring-data-couchbase-2
+ persistence-modules/spring-data-redis
+ persistence-modules/spring-boot-persistence-mongodb
+
+ reactor-core
+ resteasy
+ rxjava
+ rxjava-2
+ rabbitmq
+
@@ -544,7 +508,7 @@
**/*IntTest.java
**/*LongRunningUnitTest.java
**/*ManualTest.java
- **/JdbcTest.java
+ **/*JdbcTest.java
**/*LiveTest.java
@@ -561,6 +525,78 @@
parent-java
parent-kotlin
+ spring-4
+ spring-5
+ spring-5-reactive
+ spring-5-reactive-security
+ spring-5-reactive-client
+ spring-5-mvc
+ spring-5-security
+ spring-5-security-oauth
+
+ spring-aop
+ spring-activiti
+ spring-akka
+ spring-amqp
+ spring-all
+ spring-apache-camel
+ spring-batch
+ spring-bom
+ spring-boot-keycloak
+ spring-boot-bootstrap
+ spring-boot-admin
+ spring-boot-camel
+ spring-boot-security
+ spring-boot-mvc
+ spring-boot-logging-log4j2
+ spring-boot-disable-console-logging
+ spring-boot-property-exp
+ spring-boot-ctx-fluent
+ spring-boot
+ spring-boot-ops
+
+ spring-cloud-data-flow
+ spring-cloud
+ spring-cloud-bus
+ spring-core
+ spring-cucumber
+ spring-data-rest
+ spring-drools
+ spring-dispatcher-servlet
+ spring-ejb
+ spring-exceptions
+
+ spring-freemarker
+ spring-integration
+
+ spring-jinq
+ spring-jenkins-pipeline
+ spring-jersey
+ spring-jms
+ spring-jooq
+ spring-kafka
+ spring-katharsis
+ spring-ldap
+
+ spring-mockito
+ spring-mvc-forms-jsp
+ spring-mvc-forms-thymeleaf
+ spring-mvc-java
+ spring-mvc-velocity
+ spring-mvc-webflow
+ spring-mvc-xml
+ spring-mvc-kotlin
+
+ spring-protobuf
+ spring-quartz
+ spring-rest-angular
+ spring-rest-full
+ spring-rest-query-language
+ spring-rest
+ spring-resttemplate
+ spring-rest-simple
+ spring-remoting
+
spring-session
spring-sleuth
spring-social-login
@@ -568,129 +604,17 @@
spring-state-machine
spring-thymeleaf
spring-userservice
+
spring-zuul
- spring-remoting
spring-reactor
spring-vertx
- spring-jinq
+ spring-vault
spring-rest-embedded-tomcat
- testing-modules/testing
- testing-modules/testng
- video-tutorials
- xml
- xmlunit-2
- struts-2
- apache-velocity
- apache-solrj
- rabbitmq
- vertx
- persistence-modules/spring-data-gemfire
- mybatis
- spring-drools
- drools
- persistence-modules/liquibase
- spring-boot-property-exp
- testing-modules/mockserver
- testing-modules/test-containers
- undertow
- vaadin
- vertx-and-rxjava
- saas
- deeplearning4j
- lucene
- vraptor
- persistence-modules/java-cockroachdb
- spring-security-thymeleaf
- persistence-modules/java-jdbi
- jersey
- java-spi
- performance-tests
- twilio
- spring-boot-ctx-fluent
- java-ee-8-security-api
- spring-webflux-amqp
- antlr
- maven-archetype
- optaplanner
- apache-meecrowave
- spring-reactive-kotlin
- persistence-modules/jnosql
- spring-boot-angular-ecommerce
- jta
-
- java-websocket
- persistence-modules/activejdbc
- animal-sniffer-mvn-plugin
- apache-avro
- apache-bval
- apache-shiro
- apache-spark
- asciidoctor
- checker-plugin
-
-
- core-java-sun
- custom-pmd
- dagger
- data-structures
- dubbo
- persistence-modules/flyway
-
-
- jni
- jooby
-
-
-
- ratpack
- rest-with-spark-java
- spring-boot-autoconfiguration
- spring-boot-custom-starter
- spring-boot-jasypt
- spring-data-rest-querydsl
- spring-groovy
- spring-mobile
- spring-mustache
- spring-mvc-simple
- spring-mybatis
- spring-rest-hal-browser
- spring-rest-shell
- spring-rest-template
- spring-roo
- spring-security-stormpath
- sse-jaxrs
- static-analysis
- stripe
-
- Twitter4J
- wicket
- xstream
- cas/cas-secured-app
- cas/cas-server
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- spring-boot-custom-starter/greeter
- persistence-modules/spring-boot-h2/spring-boot-h2-database
-
-
-
-
- flyway-cdi-extension
+ spring-swagger-codegen
+ spring-webflux-amqp
+ spring-static-resources
+ spring-security-thymeleaf
spring-security-acl
spring-security-cache-control
spring-security-client/spring-security-jsp-authentication
@@ -702,7 +626,6 @@
spring-security-client/spring-security-thymeleaf-config
spring-security-core
spring-security-mvc-boot
- spring-security-mvc-custom
spring-security-mvc-digest-auth
spring-security-mvc-ldap
spring-security-mvc-login
@@ -710,33 +633,67 @@
spring-security-mvc-session
spring-security-mvc-socket
spring-security-openid
-
+
spring-security-rest-basic-auth
spring-security-rest-custom
spring-security-rest
spring-security-sso
spring-security-x509
+ spring-security-mvc-custom
+
+ spark-java
+ saas
+ struts-2
+
+ testing-modules/selenium-junit-testng
+ testing-modules/groovy-spock
+ testing-modules/mockito
+ testing-modules/mockito-2
+ testing-modules/mocks
+ testing-modules/rest-assured
+ testing-modules/rest-testing
+ testing-modules/junit-5
+ testing-modules/junit5-migration
+ testing-modules/testing
+ testing-modules/testng
+ testing-modules/mockserver
+ testing-modules/test-containers
+ twilio
+
+ undertow
+
+ video-tutorials
+ vaadin
+ vertx-and-rxjava
+ vraptor
+ vertx
+ vavr
+
+ xmlunit-2
+ xml
+
+
+
+
+
+
+
+
+
- spring-kafka
- spring-katharsis
- spring-ldap
- spring-mockito
- spring-mvc-forms-jsp
- spring-mvc-forms-thymeleaf
- spring-mvc-java
- spring-mvc-velocity
- spring-mvc-webflow
- spring-mvc-xml
- spring-mvc-kotlin
- spring-protobuf
- spring-quartz
- spring-rest-angular
- spring-rest-full
- spring-rest-query-language
-
-
- spring-resttemplate
- helidon
@@ -769,6 +726,7 @@
spring-5-reactive-client
spring-5-reactive-security
spring-5-security
+ spring-5-security-oauth
spring-activiti
spring-akka
spring-all
@@ -895,667 +853,399 @@
-
- integration
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- integration-test
-
- test
-
-
-
- **/*ManualTest.java
- **/*LiveTest.java
-
-
- **/*IntegrationTest.java
- **/*IntTest.java
-
-
-
-
-
-
- json
-
-
-
-
-
+
+ integration-lite-first
-
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ **/*ManualTest.java
+ **/*LiveTest.java
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+
+
+
- parent-boot-1
- parent-boot-2
- parent-spring-4
- parent-spring-5
- parent-java
- parent-kotlin
-
-
-
-
-
-
-
-
-
- testing-modules/mockito
- testing-modules/mockito-2
- testing-modules/mocks
- mustache
- mvn-wrapper
- noexception
- persistence-modules/orientdb
- osgi
- orika
- patterns
- pdf
- protobuffer
- persistence-modules/querydsl
- reactor-core
- persistence-modules/redis
- testing-modules/rest-assured
- testing-modules/rest-testing
- resteasy
- rxjava
- rxjava-2
- spring-swagger-codegen
- testing-modules/selenium-junit-testng
- persistence-modules/solr
- spark-java
- spring-4
- spring-5
- spring-5-data-reactive
- spring-5-reactive
- spring-5-reactive-security
- spring-5-reactive-client
- spring-5-mvc
- spring-5-security
- spring-activiti
- spring-akka
- spring-amqp
- spring-all
- spring-amqp-simple
- spring-apache-camel
- spring-batch
- jmh
-
-
-
-
-
- spring-bom
- spring-boot
- spring-boot-client
- spring-boot-keycloak
- spring-boot-bootstrap
- spring-boot-admin
- spring-boot-camel
- spring-boot-ops
- persistence-modules/spring-boot-persistence
- spring-boot-security
- spring-boot-mvc
- spring-boot-logging-log4j2
- spring-boot-disable-console-logging
- spring-cloud-data-flow
- spring-cloud
- spring-cloud-bus
- spring-core
- spring-cucumber
- spring-ejb
- spring-aop
- persistence-modules/spring-data-cassandra
- persistence-modules/spring-data-couchbase-2
- persistence-modules/spring-data-dynamodb
- persistence-modules/spring-data-elasticsearch
- persistence-modules/spring-data-keyvalue
- persistence-modules/spring-data-mongodb
- persistence-modules/spring-data-jpa
- persistence-modules/spring-data-neo4j
- persistence-modules/spring-data-redis
- spring-data-rest
-
-
-
-
-
-
- persistence-modules/spring-data-solr
- spring-dispatcher-servlet
- spring-exceptions
- spring-freemarker
- persistence-modules/spring-hibernate-3
- persistence-modules/spring-hibernate4
- persistence-modules/spring-hibernate-5
- persistence-modules/spring-data-eclipselink
- spring-integration
- spring-jenkins-pipeline
- spring-jersey
- spring-jms
- spring-jooq
- persistence-modules/spring-jpa
- spring-kafka
- spring-katharsis
- spring-ldap
- spring-mockito
- spring-mvc-forms-jsp
- spring-mvc-forms-thymeleaf
- spring-mvc-java
- spring-mvc-velocity
- spring-mvc-webflow
- spring-mvc-xml
- spring-mvc-kotlin
- spring-protobuf
- spring-quartz
- spring-rest-angular
- spring-rest-full
- spring-rest-query-language
- spring-rest
- spring-resttemplate
- spring-rest-simple
- spring-reactive-kotlin
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- java-websocket
- persistence-modules/activejdbc
- animal-sniffer-mvn-plugin
- apache-avro
- apache-bval
- apache-shiro
- apache-spark
- asciidoctor
- checker-plugin
-
-
- core-java-sun
- custom-pmd
- dagger
- data-structures
- dubbo
- persistence-modules/flyway
-
-
- jni
- jooby
-
-
-
- ratpack
- rest-with-spark-java
- spring-boot-autoconfiguration
- spring-boot-custom-starter
- spring-boot-jasypt
- spring-data-rest-querydsl
- spring-groovy
- spring-mobile
- spring-mustache
- spring-mvc-simple
- spring-mybatis
- spring-rest-hal-browser
- spring-rest-shell
- spring-rest-template
- spring-roo
- spring-security-stormpath
- sse-jaxrs
- static-analysis
- stripe
-
-
- wicket
- xstream
- cas/cas-secured-app
-
-
-
-
-
-
-
-
-
-
-
-
-
- jenkins/hello-world
-
-
-
- spring-boot-custom-starter/greeter
- persistence-modules/spring-boot-h2/spring-boot-h2-database
-
-
-
-
-
-
-
-
-
- integration-lite
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- integration-test
-
- test
-
-
-
- **/*ManualTest.java
- **/*LiveTest.java
-
-
- **/*IntegrationTest.java
- **/*IntTest.java
-
-
-
-
-
-
- json
-
-
-
-
-
-
-
- parent-boot-1
- parent-boot-2
- parent-spring-4
- parent-spring-5
- parent-java
- parent-kotlin
- asm
- atomix
- persistence-modules/apache-cayenne
- aws
- aws-lambda
- akka-streams
- algorithms-genetic
- algorithms-miscellaneous-1
- algorithms-miscellaneous-2
- algorithms-sorting
- annotations
- apache-cxf
- apache-fop
- apache-poi
- apache-tika
- apache-thrift
- apache-curator
- apache-zookeeper
- apache-opennlp
- autovalue
- axon
- azure
- bootique
- cdi
- java-strings
-
- core-java-collections
- java-collections-conversions
- java-collections-maps
- core-java-io
- core-java-8
- java-streams
- core-groovy
-
- couchbase
- persistence-modules/deltaspike
- dozer
- ethereum
- feign
- flips
- testing-modules/groovy-spock
- google-cloud
- gson
- guava
- guava-collections
- guava-modules/guava-18
- guava-modules/guava-19
- guava-modules/guava-21
- guice
- disruptor
- spring-static-resources
- hazelcast
- persistence-modules/hbase
-
- hystrix
- image-processing
- immutables
- persistence-modules/influxdb
- jackson
- vavr
- java-lite
- java-numbers
- java-rmi
- java-vavr-stream
- javax-servlets
- javaxval
- jaxb
- javafx
- jgroups
- jee-7
- jee-7-security
- jjwt
- jsf
- json-path
- json
- jsoup
- jta
- testing-modules/junit-5
- testing-modules/junit5-migration
- jws
- libraries-data
- linkrest
- logging-modules/log-mdc
- logging-modules/log4j
-
- logging-modules/logback
- lombok
- mapstruct
-
- maven
- mesos-marathon
- msf4j
- testing-modules/mockito
- testing-modules/mockito-2
- testing-modules/mocks
- mustache
- mvn-wrapper
- noexception
- persistence-modules/orientdb
- osgi
- orika
- patterns
- pdf
- protobuffer
- persistence-modules/querydsl
- reactor-core
- persistence-modules/redis
- testing-modules/rest-assured
- testing-modules/rest-testing
- resteasy
- rxjava
- rxjava-2
- spring-swagger-codegen
- testing-modules/selenium-junit-testng
- persistence-modules/solr
- spark-java
- spring-4
- spring-5-data-reactive
- spring-5-reactive
- spring-5-reactive-security
- spring-5-reactive-client
- spring-5-mvc
- spring-5-security
- spring-activiti
- spring-akka
- spring-amqp
- spring-all
- spring-amqp-simple
- spring-apache-camel
- spring-batch
- spring-bom
- spring-boot-keycloak
- spring-boot-bootstrap
- spring-boot-admin
- spring-boot-camel
- persistence-modules/spring-boot-persistence
- spring-boot-security
- spring-boot-mvc
- spring-boot-logging-log4j2
- spring-boot-disable-console-logging
- spring-cloud-data-flow
- spring-cloud
- spring-cloud-bus
- spring-core
- spring-cucumber
- spring-ejb
- spring-aop
-
- persistence-modules/spring-data-dynamodb
- persistence-modules/spring-data-keyvalue
- persistence-modules/spring-data-mongodb
- persistence-modules/spring-data-neo4j
-
- spring-data-rest
- persistence-modules/spring-data-solr
- spring-dispatcher-servlet
- spring-exceptions
- spring-freemarker
- persistence-modules/spring-hibernate-3
-
- persistence-modules/spring-hibernate-5
- persistence-modules/spring-data-eclipselink
- spring-integration
- spring-jenkins-pipeline
- spring-jersey
-
- spring-jms
- spring-jooq
- persistence-modules/spring-jpa
- spring-kafka
- spring-katharsis
- spring-ldap
- spring-mockito
- spring-mvc-forms-jsp
- spring-mvc-forms-thymeleaf
- spring-mvc-java
- spring-mvc-velocity
- spring-mvc-webflow
- spring-mvc-xml
- spring-mvc-kotlin
- spring-protobuf
- spring-quartz
- spring-rest-angular
- spring-rest-full
- spring-rest-query-language
- spring-rest
- spring-resttemplate
- spring-rest-simple
- spring-security-acl
- spring-security-cache-control
- spring-security-client/spring-security-jsp-authentication
- spring-security-client/spring-security-jsp-authorize
- spring-security-client/spring-security-jsp-config
- spring-security-client/spring-security-mvc
- spring-security-client/spring-security-thymeleaf-authentication
- spring-security-client/spring-security-thymeleaf-authorize
- spring-security-client/spring-security-thymeleaf-config
- spring-security-core
- spring-security-mvc-boot
- spring-security-mvc-digest-auth
- spring-security-mvc-ldap
- spring-security-mvc-login
- spring-security-mvc-persisted-remember-me
- spring-security-mvc-session
- spring-security-mvc-socket
- spring-security-openid
-
- spring-security-rest-basic-auth
- spring-security-rest-custom
- spring-security-rest
- spring-security-sso
- spring-security-x509
- spring-session
- spring-sleuth
- spring-social-login
- spring-spel
- spring-state-machine
- spring-thymeleaf
- spring-userservice
- spring-zuul
- spring-remoting
- spring-reactor
- spring-vertx
- spring-vault
- spring-jinq
- spring-rest-embedded-tomcat
- testing-modules/testing
- testing-modules/testng
- video-tutorials
-
- xmlunit-2
- struts-2
- apache-velocity
- apache-solrj
- rabbitmq
-
- persistence-modules/spring-data-gemfire
- mybatis
- spring-drools
- drools
- persistence-modules/liquibase
- spring-boot-property-exp
- testing-modules/mockserver
- testing-modules/test-containers
- undertow
- vaadin
- vertx-and-rxjava
- saas
- deeplearning4j
- lucene
- vraptor
- persistence-modules/java-cockroachdb
- spring-security-thymeleaf
- persistence-modules/java-jdbi
- jersey
- java-spi
- performance-tests
- twilio
- spring-boot-ctx-fluent
- java-ee-8-security-api
- spring-webflux-amqp
- antlr
- maven-archetype
- apache-meecrowave
-
- persistence-modules/spring-hibernate4
- xml
- vertx
- metrics
+
+ parent-boot-1
+ parent-boot-2
+ parent-spring-4
+ parent-spring-5
+ parent-java
+ parent-kotlin
+
+ asm
+ atomix
+ aws
+ aws-lambda
+ akka-streams
+ algorithms-genetic
+ algorithms-miscellaneous-1
+ algorithms-miscellaneous-2
+ algorithms-sorting
+ annotations
+ apache-cxf
+ apache-fop
+ apache-poi
+ apache-tika
+ apache-thrift
+ apache-curator
+ apache-zookeeper
+ apache-opennlp
+ autovalue
+ axon
+ azure
+ apache-velocity
+ apache-solrj
+ apache-meecrowave
+ antlr
+
+ bootique
+
+ cdi
+ core-java-collections
+ core-java-io
+ core-java-8
+ core-groovy
+ couchbase
+
+
+ core-java
+ core-java-net
+
+ dozer
+ disruptor
+ drools
+ deeplearning4j
+
+ ethereum
+
+ feign
+ flips
+
+ google-cloud
+ gson
+ guava
+ guava-collections
+ guava-modules/guava-18
+ guava-modules/guava-19
+ guava-modules/guava-21
+ guice
+
+ hazelcast
+ hystrix
httpclient
-
-
-
+ java-collections-conversions
+ java-collections-maps
+ java-streams
+ java-lite
+ java-numbers
+ java-rmi
+ java-vavr-stream
+ javax-servlets
+ javaxval
+ jaxb
+ javafx
+ jgroups
+
+ jee-7-security
+ jjwt
+ jsf
+ json-path
+ json
+ jsoup
+ jta
+ jws
+ jersey
+ java-spi
+ java-ee-8-security-api
+
+
+ libraries-data
+ linkrest
+ logging-modules/log-mdc
+ logging-modules/log4j
+ logging-modules/logback
+ lombok
+ lucene
+
+ mapstruct
+ maven
+ mesos-marathon
+ msf4j
+ mustache
+ mvn-wrapper
+ mybatis
+ metrics
+ maven-archetype
+
+ noexception
+
+ osgi
+ orika
+
+ patterns
+ pdf
+ protobuffer
+ performance-tests
+
+ persistence-modules/java-jdbi
+ persistence-modules/redis
+ persistence-modules/orientdb
+ persistence-modules/querydsl
+ persistence-modules/apache-cayenne
+ persistence-modules/solr
+ persistence-modules/spring-data-dynamodb
+ persistence-modules/spring-data-keyvalue
+ persistence-modules/spring-data-neo4j
+ persistence-modules/spring-data-solr
+ persistence-modules/spring-hibernate-5
+ persistence-modules/spring-data-eclipselink
+ persistence-modules/spring-jpa
+ persistence-modules/spring-hibernate-3
+ persistence-modules/spring-data-gemfire
+ persistence-modules/spring-boot-persistence
+ persistence-modules/liquibase
+ persistence-modules/java-cockroachdb
+ persistence-modules/deltaspike
+ persistence-modules/hbase
+ persistence-modules/influxdb
+ persistence-modules/spring-hibernate4
+ persistence-modules/spring-data-mongodb
persistence-modules/java-cassandra
persistence-modules/spring-data-cassandra
- logging-modules/log4j2
persistence-modules/spring-data-couchbase-2
persistence-modules/spring-data-redis
+
+ reactor-core
+ resteasy
+ rxjava
+ rxjava-2
+ rabbitmq
+
+
- jmeter
- -->
+
-
-
+
+ spring-static-resources
+ spring-security-thymeleaf
+ spring-security-acl
+ spring-security-cache-control
+ spring-security-client/spring-security-jsp-authentication
+ spring-security-client/spring-security-jsp-authorize
+ spring-security-client/spring-security-jsp-config
+ spring-security-client/spring-security-mvc
+ spring-security-client/spring-security-thymeleaf-authentication
+ spring-security-client/spring-security-thymeleaf-authorize
+ spring-security-client/spring-security-thymeleaf-config
+ spring-security-core
+ spring-security-mvc-boot
+ spring-security-mvc-digest-auth
+ spring-security-mvc-ldap
+ spring-security-mvc-login
+ spring-security-mvc-persisted-remember-me
+ spring-security-mvc-session
+ spring-security-mvc-socket
+ spring-security-openid
+
+ spring-security-rest-basic-auth
+ spring-security-rest-custom
+ spring-security-rest
+ spring-security-sso
+ spring-security-x509
spring-security-mvc-custom
- core-java-concurrency
- -->
+
+ spark-java
+ saas
+ struts-2
+
+ testing-modules/selenium-junit-testng
+ testing-modules/groovy-spock
+ testing-modules/mockito
+ testing-modules/mockito-2
+ testing-modules/mocks
+ testing-modules/rest-assured
+ testing-modules/rest-testing
+ testing-modules/junit-5
+ testing-modules/junit5-migration
+ testing-modules/testing
+ testing-modules/testng
+ testing-modules/mockserver
+ testing-modules/test-containers
+ twilio
+
+ undertow
+
+ video-tutorials
+ vaadin
+ vertx-and-rxjava
+ vraptor
+ vertx
+ vavr
+
+ xmlunit-2
+ xml
+
+
+
-
-
+
+
+
+
+
+
+
-
+
integration-heavy
@@ -1565,28 +1255,15 @@
org.apache.maven.plugins
maven-surefire-plugin
-
-
- integration-test
-
- test
-
-
-
- **/*ManualTest.java
- **/*LiveTest.java
-
-
- **/*IntegrationTest.java
- **/*IntTest.java
-
-
-
-
-
- json
-
+
+ **/*ManualTest.java
+ **/*LiveTest.java
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
@@ -1599,22 +1276,8 @@
parent-spring-5
parent-java
parent-kotlin
- libraries
- geotools
- jhipster
- testing-modules/gatling
- spring-boot
- spring-boot-ops
- spring-5
- core-kotlin
- kotlin-libraries
- core-java
- google-web-toolkit
- spring-security-mvc-custom
- persistence-modules/hibernate5
- persistence-modules/spring-data-elasticsearch
- core-java-concurrency
- core-java-concurrency-collections
+
+
@@ -1639,13 +1302,16 @@
true
false
false
-
+ false
+
4.12
1.3
2.21.0
+
1.7.21
1.1.7
+
2.21.0
3.7.0
diff --git a/protobuffer/pom.xml b/protobuffer/pom.xml
index ff443a1615..d9e6cb26e4 100644
--- a/protobuffer/pom.xml
+++ b/protobuffer/pom.xml
@@ -3,7 +3,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
protobuffer
-
+ protobuffer
+
parent-modules
com.baeldung
diff --git a/reactor-core/pom.xml b/reactor-core/pom.xml
index cf720ad6ea..db9550df7b 100644
--- a/reactor-core/pom.xml
+++ b/reactor-core/pom.xml
@@ -1,11 +1,11 @@
4.0.0
-
org.baeldung
reactor-core
0.0.1-SNAPSHOT
-
+ reactor-core
+
com.baeldung
parent-modules
diff --git a/restx/README.md b/restx/README.md
new file mode 100644
index 0000000000..665f7ea82d
--- /dev/null
+++ b/restx/README.md
@@ -0,0 +1,4 @@
+# Relevant Articles
+
+* [Introduction to RESTX](https://www.baeldung.com/java-restx)
+
diff --git a/restx/data/credentials.json b/restx/data/credentials.json
new file mode 100644
index 0000000000..c1a4fcf531
--- /dev/null
+++ b/restx/data/credentials.json
@@ -0,0 +1,12 @@
+{
+ "//": "lines with // keys are just comments (we don't have real comments in json)",
+ "//": "this file stores password passed through md5+bcrypt hash",
+ "//": "you can use `restx hash md5+bcrypt {password}` shell command to get hashed passwords to put here",
+
+ "//": "to help startup with restx, there are comments with clear text passwords,",
+ "//": "which should obviously not be stored here.",
+ "user1": "$2a$10$iZluFUJShbjb1ue68bLrDuGCeJL9EMLHelVIf8u0SUbCseDOvKnoe",
+ "//": "user 1 password is 'user1-pwd'",
+ "user2": "$2a$10$oym3SYMFXf/9gGfDKKHO4eM1vWNqAZMsRZCL.BORCaP4yp5cdiCXu",
+ "//": "user 2 password is 'user2-pwd'"
+}
\ No newline at end of file
diff --git a/restx/data/users.json b/restx/data/users.json
new file mode 100644
index 0000000000..834e03c4b4
--- /dev/null
+++ b/restx/data/users.json
@@ -0,0 +1,4 @@
+[
+ {"name":"user1", "roles": ["hello"]},
+ {"name":"user2", "roles": []}
+]
\ No newline at end of file
diff --git a/restx/md.restx.json b/restx/md.restx.json
new file mode 100644
index 0000000000..c87244001c
--- /dev/null
+++ b/restx/md.restx.json
@@ -0,0 +1,38 @@
+{
+ "module": "restx-demo:restx-demo:0.1-SNAPSHOT",
+ "packaging": "war",
+
+ "properties": {
+ "java.version": "1.8",
+ "restx.version": "0.35-rc4"
+ },
+ "fragments": {
+ "maven": [
+ "classpath:///restx/build/fragments/maven/javadoc-apidoclet.xml" ]
+ },
+ "dependencies": {
+ "compile": [
+ "io.restx:restx-core:${restx.version}",
+ "io.restx:restx-security-basic:${restx.version}",
+ "io.restx:restx-core-annotation-processor:${restx.version}",
+ "io.restx:restx-factory:${restx.version}",
+ "io.restx:restx-factory-admin:${restx.version}",
+ "io.restx:restx-validation:${restx.version}",
+ "io.restx:restx-monitor-codahale:${restx.version}",
+ "io.restx:restx-monitor-admin:${restx.version}",
+ "io.restx:restx-log-admin:${restx.version}",
+ "io.restx:restx-i18n-admin:${restx.version}",
+ "io.restx:restx-stats-admin:${restx.version}",
+ "io.restx:restx-servlet:${restx.version}",
+ "io.restx:restx-server-jetty8:${restx.version}!optional",
+ "io.restx:restx-apidocs:${restx.version}",
+ "io.restx:restx-specs-admin:${restx.version}",
+ "io.restx:restx-admin:${restx.version}",
+ "ch.qos.logback:logback-classic:1.0.13"
+ ],
+ "test": [
+ "io.restx:restx-specs-tests:${restx.version}",
+ "junit:junit:4.11"
+ ]
+ }
+}
diff --git a/restx/pom.xml b/restx/pom.xml
new file mode 100644
index 0000000000..c6233b968c
--- /dev/null
+++ b/restx/pom.xml
@@ -0,0 +1,155 @@
+
+
+ 4.0.0
+
+ restx
+ 0.1-SNAPSHOT
+ war
+ restx-demo
+
+
+ 1.8
+ 1.8
+ 0.35-rc4
+
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ io.restx
+ restx-core
+ ${restx.version}
+
+
+ io.restx
+ restx-security-basic
+ ${restx.version}
+
+
+ io.restx
+ restx-core-annotation-processor
+ ${restx.version}
+
+
+ io.restx
+ restx-factory
+ ${restx.version}
+
+
+ io.restx
+ restx-factory-admin
+ ${restx.version}
+
+
+ io.restx
+ restx-validation
+ ${restx.version}
+
+
+ io.restx
+ restx-monitor-codahale
+ ${restx.version}
+
+
+ io.restx
+ restx-monitor-admin
+ ${restx.version}
+
+
+ io.restx
+ restx-log-admin
+ ${restx.version}
+
+
+ io.restx
+ restx-i18n-admin
+ ${restx.version}
+
+
+ io.restx
+ restx-stats-admin
+ ${restx.version}
+
+
+ io.restx
+ restx-servlet
+ ${restx.version}
+
+
+ io.restx
+ restx-server-jetty8
+ ${restx.version}
+ true
+
+
+ io.restx
+ restx-apidocs
+ ${restx.version}
+
+
+ io.restx
+ restx-specs-admin
+ ${restx.version}
+
+
+ io.restx
+ restx-admin
+ ${restx.version}
+
+
+ ch.qos.logback
+ logback-classic
+ 1.0.13
+
+
+ io.restx
+ restx-specs-tests
+ ${restx.version}
+ test
+
+
+ junit
+ junit
+ 4.11
+ test
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+
+
+ attach-docs
+
+ prepare-package
+
+ jar
+
+
+
+
+ ${maven.compiler.source}
+ restx.apidocs.doclet.ApidocsDoclet
+
+ io.restx
+ restx-apidocs-doclet
+ ${restx.version}
+
+ -restx-target-dir ${project.basedir}/target/classes
+
+
+
+
+
diff --git a/restx/src/main/java/restx/demo/AppModule.java b/restx/src/main/java/restx/demo/AppModule.java
new file mode 100644
index 0000000000..26bc681481
--- /dev/null
+++ b/restx/src/main/java/restx/demo/AppModule.java
@@ -0,0 +1,74 @@
+package restx.demo;
+
+import restx.config.ConfigLoader;
+import restx.config.ConfigSupplier;
+import restx.factory.Provides;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.base.Charsets;
+import com.google.common.collect.ImmutableSet;
+import restx.security.*;
+import restx.factory.Module;
+import restx.factory.Provides;
+import javax.inject.Named;
+
+import java.nio.file.Paths;
+
+@Module
+public class AppModule {
+ @Provides
+ public SignatureKey signatureKey() {
+ return new SignatureKey("restx-demo -447494532235718370 restx-demo 801c9eaf-4116-48f2-906b-e979fba72757".getBytes(Charsets.UTF_8));
+ }
+
+ @Provides
+ @Named("restx.admin.password")
+ public String restxAdminPassword() {
+ return "4780";
+ }
+
+ @Provides
+ public ConfigSupplier appConfigSupplier(ConfigLoader configLoader) {
+ // Load settings.properties in restx.demo package as a set of config entries
+ return configLoader.fromResource("restx/demo/settings");
+ }
+
+ @Provides
+ public CredentialsStrategy credentialsStrategy() {
+ return new BCryptCredentialsStrategy();
+ }
+
+ @Provides
+ public BasicPrincipalAuthenticator basicPrincipalAuthenticator(
+ SecuritySettings securitySettings, CredentialsStrategy credentialsStrategy,
+ @Named("restx.admin.passwordHash") String defaultAdminPasswordHash, ObjectMapper mapper) {
+ return new StdBasicPrincipalAuthenticator(new StdUserService<>(
+ // use file based users repository.
+ // Developer's note: prefer another storage mechanism for your users if you need real user management
+ // and better perf
+ new FileBasedUserRepository<>(
+ StdUser.class, // this is the class for the User objects, that you can get in your app code
+ // with RestxSession.current().getPrincipal().get()
+ // it can be a custom user class, it just need to be json deserializable
+ mapper,
+
+ // this is the default restx admin, useful to access the restx admin console.
+ // if one user with restx-admin role is defined in the repository, this default user won't be
+ // available anymore
+ new StdUser("admin", ImmutableSet.of("*")),
+
+ // the path where users are stored
+ Paths.get("data/users.json"),
+
+ // the path where credentials are stored. isolating both is a good practice in terms of security
+ // it is strongly recommended to follow this approach even if you use your own repository
+ Paths.get("data/credentials.json"),
+
+ // tells that we want to reload the files dynamically if they are touched.
+ // this has a performance impact, if you know your users / credentials never change without a
+ // restart you can disable this to get better perfs
+ true),
+ credentialsStrategy, defaultAdminPasswordHash),
+ securitySettings);
+ }
+}
diff --git a/restx/src/main/java/restx/demo/AppServer.java b/restx/src/main/java/restx/demo/AppServer.java
new file mode 100644
index 0000000000..d66aadac68
--- /dev/null
+++ b/restx/src/main/java/restx/demo/AppServer.java
@@ -0,0 +1,32 @@
+package restx.demo;
+
+import com.google.common.base.Optional;
+import restx.server.WebServer;
+import restx.server.Jetty8WebServer;
+
+/**
+ * This class can be used to run the app.
+ *
+ * Alternatively, you can deploy the app as a war in a regular container like tomcat or jetty.
+ *
+ * Reading the port from system env PORT makes it compatible with heroku.
+ */
+public class AppServer {
+ public static final String WEB_INF_LOCATION = "src/main/webapp/WEB-INF/web.xml";
+ public static final String WEB_APP_LOCATION = "src/main/webapp";
+
+ public static void main(String[] args) throws Exception {
+ int port = Integer.valueOf(Optional.fromNullable(System.getenv("PORT")).or("8080"));
+ WebServer server = new Jetty8WebServer(WEB_INF_LOCATION, WEB_APP_LOCATION, port, "0.0.0.0");
+
+ /*
+ * load mode from system property if defined, or default to dev
+ * be careful with that setting, if you use this class to launch your server in production, make sure to launch
+ * it with -Drestx.mode=prod or change the default here
+ */
+ System.setProperty("restx.mode", System.getProperty("restx.mode", "dev"));
+ System.setProperty("restx.app.package", "restx.demo");
+
+ server.startAndAwait();
+ }
+}
diff --git a/restx/src/main/java/restx/demo/Roles.java b/restx/src/main/java/restx/demo/Roles.java
new file mode 100644
index 0000000000..1240da70d1
--- /dev/null
+++ b/restx/src/main/java/restx/demo/Roles.java
@@ -0,0 +1,10 @@
+package restx.demo;
+
+/**
+ * A list of roles for the application.
+ *
+ * We don't use an enum here because it must be used inside an annotation.
+ */
+public final class Roles {
+ public static final String HELLO_ROLE = "hello";
+}
diff --git a/restx/src/main/java/restx/demo/domain/Message.java b/restx/src/main/java/restx/demo/domain/Message.java
new file mode 100644
index 0000000000..733c00deff
--- /dev/null
+++ b/restx/src/main/java/restx/demo/domain/Message.java
@@ -0,0 +1,21 @@
+package restx.demo.domain;
+
+public class Message {
+ private String message;
+
+ public String getMessage() {
+ return message;
+ }
+
+ public Message setMessage(final String message) {
+ this.message = message;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return "Message{" +
+ "message='" + message + '\'' +
+ '}';
+ }
+}
diff --git a/restx/src/main/java/restx/demo/rest/HelloResource.java b/restx/src/main/java/restx/demo/rest/HelloResource.java
new file mode 100644
index 0000000000..5cb2c2a5e6
--- /dev/null
+++ b/restx/src/main/java/restx/demo/rest/HelloResource.java
@@ -0,0 +1,62 @@
+package restx.demo.rest;
+
+import restx.demo.domain.Message;
+import restx.demo.Roles;
+import org.joda.time.DateTime;
+import restx.annotations.GET;
+import restx.annotations.POST;
+import restx.annotations.RestxResource;
+import restx.factory.Component;
+import restx.security.PermitAll;
+import restx.security.RolesAllowed;
+import restx.security.RestxSession;
+
+import javax.validation.constraints.NotNull;
+
+@Component @RestxResource
+public class HelloResource {
+
+ /**
+ * Say hello to currently logged in user.
+ *
+ * Authorized only for principals with Roles.HELLO_ROLE role.
+ *
+ * @return a Message to say hello
+ */
+ @GET("/message")
+ @RolesAllowed(Roles.HELLO_ROLE)
+ public Message sayHello() {
+ return new Message().setMessage(String.format(
+ "hello %s, it's %s",
+ RestxSession.current().getPrincipal().get().getName(),
+ DateTime.now().toString("HH:mm:ss")));
+ }
+
+ /**
+ * Say hello to anybody.
+ *
+ * Does not require authentication.
+ *
+ * @return a Message to say hello
+ */
+ @GET("/hello")
+ @PermitAll
+ public Message helloPublic(String who) {
+ return new Message().setMessage(String.format(
+ "hello %s, it's %s",
+ who, DateTime.now().toString("HH:mm:ss")));
+ }
+
+ public static class MyPOJO {
+ @NotNull
+ String value;
+ public String getValue(){ return value; }
+ public void setValue(String value){ this.value = value; }
+ }
+ @POST("/mypojo")
+ @PermitAll
+ public MyPOJO helloPojo(MyPOJO pojo){
+ pojo.setValue("hello "+pojo.getValue());
+ return pojo;
+ }
+}
diff --git a/restx/src/main/resources/logback.xml b/restx/src/main/resources/logback.xml
new file mode 100644
index 0000000000..524bca6b1f
--- /dev/null
+++ b/restx/src/main/resources/logback.xml
@@ -0,0 +1,94 @@
+
+
+ true
+
+
+
+
+ ${LOGS_FOLDER}/errors.log
+
+ ERROR
+
+
+ %d [%-16thread] [%-10X{principal}] %-5level %logger{36} - %msg%n
+
+
+ ${LOGS_FOLDER}/errors.%d.log
+ 30
+
+
+
+
+
+
+
+ ${LOGS_FOLDER}/app.log
+
+ INFO
+
+
+ %d [%-16thread] [%-10X{principal}] %-5level %logger{36} - %msg%n
+
+
+ ${LOGS_FOLDER}/app.%d.log
+ 10
+
+
+
+ ${LOGS_FOLDER}/debug.log
+
+ %d [%-16thread] [%-10X{principal}] %-5level %logger{36} - %msg%n
+
+
+ ${LOGS_FOLDER}/debug.%i.log.zip
+ 1
+ 3
+
+
+
+ 50MB
+
+
+
+
+
+
+
+
+
+
+
+ %d [%-16thread] [%-10X{principal}] %-5level %logger{36} - %msg%n
+
+
+
+ ${LOGS_FOLDER}/app.log
+
+ %d [%-16thread] [%-10X{principal}] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/restx/src/main/resources/restx/demo/settings.properties b/restx/src/main/resources/restx/demo/settings.properties
new file mode 100644
index 0000000000..a03c2eea97
--- /dev/null
+++ b/restx/src/main/resources/restx/demo/settings.properties
@@ -0,0 +1 @@
+app.name=restx-demo
\ No newline at end of file
diff --git a/restx/src/main/webapp/WEB-INF/web.xml b/restx/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..c651794526
--- /dev/null
+++ b/restx/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,15 @@
+
+
+
+ restx
+ restx.servlet.RestxMainRouterServlet
+ 1
+
+
+ restx
+ /api/*
+
+
diff --git a/restx/src/test/java/restx/demo/rest/HelloResourceSpecUnitTest.java b/restx/src/test/java/restx/demo/rest/HelloResourceSpecUnitTest.java
new file mode 100644
index 0000000000..f67e4565b3
--- /dev/null
+++ b/restx/src/test/java/restx/demo/rest/HelloResourceSpecUnitTest.java
@@ -0,0 +1,23 @@
+package restx.demo.rest;
+
+import org.junit.runner.RunWith;
+
+import restx.tests.FindSpecsIn;
+import restx.tests.RestxSpecTestsRunner;
+
+@RunWith(RestxSpecTestsRunner.class)
+@FindSpecsIn("specs/hello")
+public class HelloResourceSpecUnitTest {
+
+ /**
+ * Useless, thanks to both @RunWith(RestxSpecTestsRunner.class) & @FindSpecsIn()
+ *
+ * @Rule
+ * public RestxSpecRule rule = new RestxSpecRule();
+ *
+ * @Test
+ * public void test_spec() throws Exception {
+ * rule.runTest(specTestPath);
+ * }
+ */
+}
diff --git a/restx/src/test/resources/specs/hello/should_admin_say_hello.spec.yaml b/restx/src/test/resources/specs/hello/should_admin_say_hello.spec.yaml
new file mode 100644
index 0000000000..1b7b8f0f90
--- /dev/null
+++ b/restx/src/test/resources/specs/hello/should_admin_say_hello.spec.yaml
@@ -0,0 +1,10 @@
+title: should admin say hello
+given:
+ - time: 2013-08-28T01:18:00.822+02:00
+ - uuids: [ "e2b4430f-9541-4602-9a3a-413d17c56a6b" ]
+wts:
+ - when: |
+ GET message
+ $RestxSession: {"_expires":"2013-09-27T01:18:00.822+02:00","principal":"admin","sessionKey":"e2b4430f-9541-4602-9a3a-413d17c56a6b"}
+ then: |
+ {"message":"hello admin, it's 01:18:00"}
diff --git a/restx/src/test/resources/specs/hello/should_anyone_say_hello.spec.yaml b/restx/src/test/resources/specs/hello/should_anyone_say_hello.spec.yaml
new file mode 100644
index 0000000000..29b6faca34
--- /dev/null
+++ b/restx/src/test/resources/specs/hello/should_anyone_say_hello.spec.yaml
@@ -0,0 +1,8 @@
+title: should admin say hello
+given:
+ - time: 2013-08-28T01:18:00.822+02:00
+wts:
+ - when: |
+ GET hello?who=xavier
+ then: |
+ {"message":"hello xavier, it's 01:18:00"}
diff --git a/restx/src/test/resources/specs/hello/should_missing_value_triggers_validation_error.spec.yaml b/restx/src/test/resources/specs/hello/should_missing_value_triggers_validation_error.spec.yaml
new file mode 100644
index 0000000000..d0c6323caf
--- /dev/null
+++ b/restx/src/test/resources/specs/hello/should_missing_value_triggers_validation_error.spec.yaml
@@ -0,0 +1,17 @@
+title: should missing post value triggers a validation error
+given:
+ - time: 2013-08-28T01:18:00.822+02:00
+ - uuids: [ "e2b4430f-9541-4602-9a3a-413d17c56a6b" ]
+wts:
+ - when: |
+ POST mypojo
+ $RestxSession: {"_expires":"2013-09-27T01:18:00.822+02:00","principal":"user1","sessionKey":"e2b4430f-9541-4602-9a3a-413d17c56a6b"}
+ {}
+ then: |
+ 400
+ - when: |
+ POST mypojo
+ $RestxSession: {"_expires":"2013-09-27T01:18:00.822+02:00","principal":"user1","sessionKey":"e2b4430f-9541-4602-9a3a-413d17c56a6b"}
+ {"value":"world"}
+ then: |
+ {"value":"hello world"}
diff --git a/restx/src/test/resources/specs/hello/should_user1_say_hello.spec.yaml b/restx/src/test/resources/specs/hello/should_user1_say_hello.spec.yaml
new file mode 100644
index 0000000000..791a3a2776
--- /dev/null
+++ b/restx/src/test/resources/specs/hello/should_user1_say_hello.spec.yaml
@@ -0,0 +1,10 @@
+title: should user1 say hello
+given:
+ - time: 2013-08-28T01:18:00.822+02:00
+ - uuids: [ "e2b4430f-9541-4602-9a3a-413d17c56a6b" ]
+wts:
+ - when: |
+ GET message
+ $RestxSession: {"_expires":"2013-09-27T01:18:00.822+02:00","principal":"user1","sessionKey":"e2b4430f-9541-4602-9a3a-413d17c56a6b"}
+ then: |
+ {"message":"hello user1, it's 01:18:00"}
diff --git a/restx/src/test/resources/specs/hello/should_user2_not_say_hello.spec.yaml b/restx/src/test/resources/specs/hello/should_user2_not_say_hello.spec.yaml
new file mode 100644
index 0000000000..ead5af8d0c
--- /dev/null
+++ b/restx/src/test/resources/specs/hello/should_user2_not_say_hello.spec.yaml
@@ -0,0 +1,10 @@
+title: should user2 not say hello
+given:
+ - time: 2013-08-28T01:19:44.770+02:00
+ - uuids: [ "56f71fcc-42d3-422f-9458-8ad37fc4a0b5" ]
+wts:
+ - when: |
+ GET message
+ $RestxSession: {"_expires":"2013-09-27T01:19:44.770+02:00","principal":"user2","sessionKey":"56f71fcc-42d3-422f-9458-8ad37fc4a0b5"}
+ then: |
+ 403
diff --git a/rxjava-2/README.md b/rxjava-2/README.md
index 78eb6e6428..f9528bb1d5 100644
--- a/rxjava-2/README.md
+++ b/rxjava-2/README.md
@@ -5,3 +5,4 @@
- [RxJava 2 - Completable](http://www.baeldung.com/rxjava-completable)
- [RxJava Maybe](http://www.baeldung.com/rxjava-maybe)
- [Introduction to RxRelay for RxJava](http://www.baeldung.com/rx-relay)
+- [Combining RxJava Completables](https://www.baeldung.com/rxjava-completable)
diff --git a/rxjava-2/pom.xml b/rxjava-2/pom.xml
index a18b096b6d..3b4c167f3a 100644
--- a/rxjava-2/pom.xml
+++ b/rxjava-2/pom.xml
@@ -2,10 +2,10 @@
4.0.0
-
rxjava-2
1.0-SNAPSHOT
-
+ rxjava-2
+
com.baeldung
parent-java
diff --git a/rxjava/pom.xml b/rxjava/pom.xml
index b316001d87..596a5196da 100644
--- a/rxjava/pom.xml
+++ b/rxjava/pom.xml
@@ -2,10 +2,10 @@
4.0.0
-
rxjava
1.0-SNAPSHOT
-
+ rxjava
+
com.baeldung
parent-java
diff --git a/spring-5-data-reactive/pom.xml b/spring-5-data-reactive/pom.xml
index 5c723c6e29..aa73cf11ae 100644
--- a/spring-5-data-reactive/pom.xml
+++ b/spring-5-data-reactive/pom.xml
@@ -3,6 +3,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-5-data-reactive
+ spring-5-data-reactive
jar
diff --git a/spring-5-reactive-oauth/README.md b/spring-5-reactive-oauth/README.md
new file mode 100644
index 0000000000..0f27cf5d20
--- /dev/null
+++ b/spring-5-reactive-oauth/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Spring Security OAuth Login with WebFlux](https://www.baeldung.com/spring-oauth-login-webflux)
diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md
index 1431554882..fc898a56dc 100644
--- a/spring-5-reactive/README.md
+++ b/spring-5-reactive/README.md
@@ -14,4 +14,7 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Spring Webflux and CORS](http://www.baeldung.com/spring-webflux-cors)
- [Handling Errors in Spring WebFlux](http://www.baeldung.com/spring-webflux-errors)
- [Server-Sent Events in Spring](https://www.baeldung.com/spring-server-sent-events)
-- [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/a-guide-to-spring-session-reactive-support-websession/)
\ No newline at end of file
+- [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/spring-session-reactive)
+- [Validation for Functional Endpoints in Spring 5](https://www.baeldung.com/spring-functional-endpoints-validation)
+- [Logging a Reactive Sequence](https://www.baeldung.com/spring-reactive-sequence-logging)
+
diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/ConsumerSSEApplication.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/ConsumerSSEApplication.java
new file mode 100644
index 0000000000..55db3d7392
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/ConsumerSSEApplication.java
@@ -0,0 +1,33 @@
+package com.baeldung.debugging.consumer;
+
+import java.util.Collections;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.security.config.web.server.ServerHttpSecurity;
+import org.springframework.security.web.server.SecurityWebFilterChain;
+
+import reactor.core.publisher.Hooks;
+
+@SpringBootApplication(exclude = MongoReactiveAutoConfiguration.class)
+@EnableScheduling
+public class ConsumerSSEApplication {
+
+ public static void main(String[] args) {
+ Hooks.onOperatorDebug();
+ SpringApplication app = new SpringApplication(ConsumerSSEApplication.class);
+ app.setDefaultProperties(Collections.singletonMap("server.port", "8082"));
+ app.run(args);
+ }
+
+ @Bean
+ public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
+ http.authorizeExchange()
+ .anyExchange()
+ .permitAll();
+ return http.build();
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java
new file mode 100644
index 0000000000..09cbc34a6f
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java
@@ -0,0 +1,122 @@
+package com.baeldung.debugging.consumer.chronjobs;
+
+import java.time.Duration;
+import java.util.concurrent.ThreadLocalRandom;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.web.reactive.function.client.WebClient;
+
+import com.baeldung.debugging.consumer.model.Foo;
+import com.baeldung.debugging.consumer.model.FooDto;
+import com.baeldung.debugging.consumer.service.FooService;
+
+import reactor.core.publisher.Flux;
+
+@Component
+public class ChronJobs {
+
+ private static Logger logger = LoggerFactory.getLogger(ChronJobs.class);
+ private WebClient client = WebClient.create("http://localhost:8081");
+
+ @Autowired
+ private FooService service;
+
+ @Scheduled(fixedRate = 10000)
+ public void consumeInfiniteFlux() {
+ Flux fluxFoo = client.get()
+ .uri("/functional-reactive/periodic-foo")
+ .accept(MediaType.TEXT_EVENT_STREAM)
+ .retrieve()
+ .bodyToFlux(FooDto.class)
+ .delayElements(Duration.ofMillis(100))
+ .map(dto -> {
+ logger.debug("process 1 with dto id {} name{}", dto.getId(), dto.getName());
+ return new Foo(dto);
+ });
+ Integer random = ThreadLocalRandom.current()
+ .nextInt(0, 3);
+ switch (random) {
+ case 0:
+ logger.info("process 1 with approach 1");
+ service.processFoo(fluxFoo);
+ break;
+ case 1:
+ logger.info("process 1 with approach 1 EH");
+ service.processUsingApproachOneWithErrorHandling(fluxFoo);
+ break;
+ default:
+ logger.info("process 1 with approach 2");
+ service.processFooInAnotherScenario(fluxFoo);
+ break;
+
+ }
+ }
+
+ @Scheduled(fixedRate = 20000)
+ public void consumeFiniteFlux2() {
+ Flux fluxFoo = client.get()
+ .uri("/functional-reactive/periodic-foo-2")
+ .accept(MediaType.TEXT_EVENT_STREAM)
+ .retrieve()
+ .bodyToFlux(FooDto.class)
+ .delayElements(Duration.ofMillis(100))
+ .map(dto -> {
+ logger.debug("process 2 with dto id {} name{}", dto.getId(), dto.getName());
+ return new Foo(dto);
+ });
+ Integer random = ThreadLocalRandom.current()
+ .nextInt(0, 3);
+ switch (random) {
+ case 0:
+ logger.info("process 2 with approach 1");
+ service.processFoo(fluxFoo);
+ break;
+ case 1:
+ logger.info("process 2 with approach 1 EH");
+ service.processUsingApproachOneWithErrorHandling(fluxFoo);
+ break;
+ default:
+ logger.info("process 2 with approach 2");
+ service.processFooInAnotherScenario(fluxFoo);
+ break;
+
+ }
+ }
+
+ @Scheduled(fixedRate = 20000)
+ public void consumeFiniteFlux3() {
+ Flux fluxFoo = client.get()
+ .uri("/functional-reactive/periodic-foo-2")
+ .accept(MediaType.TEXT_EVENT_STREAM)
+ .retrieve()
+ .bodyToFlux(FooDto.class)
+ .delayElements(Duration.ofMillis(100))
+ .map(dto -> {
+ logger.debug("process 3 with dto id {} name{}", dto.getId(), dto.getName());
+ return new Foo(dto);
+ });
+ logger.info("process 3 with approach 3");
+ service.processUsingApproachThree(fluxFoo);
+ }
+
+ @Scheduled(fixedRate = 20000)
+ public void consumeFiniteFluxWithCheckpoint4() {
+ Flux fluxFoo = client.get()
+ .uri("/functional-reactive/periodic-foo-2")
+ .accept(MediaType.TEXT_EVENT_STREAM)
+ .retrieve()
+ .bodyToFlux(FooDto.class)
+ .delayElements(Duration.ofMillis(100))
+ .map(dto -> {
+ logger.debug("process 4 with dto id {} name{}", dto.getId(), dto.getName());
+ return new Foo(dto);
+ });
+ logger.info("process 4 with approach 4");
+ service.processUsingApproachFourWithCheckpoint(fluxFoo);
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/controllers/ReactiveConfigsToggleRestController.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/controllers/ReactiveConfigsToggleRestController.java
new file mode 100644
index 0000000000..3dcdc6c7c0
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/controllers/ReactiveConfigsToggleRestController.java
@@ -0,0 +1,23 @@
+package com.baeldung.debugging.consumer.controllers;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import reactor.core.publisher.Hooks;
+
+@RestController
+public class ReactiveConfigsToggleRestController {
+
+ @GetMapping("/debug-hook-on")
+ public String setReactiveDebugOn() {
+ Hooks.onOperatorDebug();
+ return "DEBUG HOOK ON";
+ }
+
+ @GetMapping("/debug-hook-off")
+ public String setReactiveDebugOff() {
+ Hooks.resetOnOperatorDebug();
+ return "DEBUG HOOK OFF";
+ }
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/Foo.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/Foo.java
new file mode 100644
index 0000000000..e101457b84
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/Foo.java
@@ -0,0 +1,26 @@
+package com.baeldung.debugging.consumer.model;
+
+import java.util.concurrent.ThreadLocalRandom;
+
+import org.springframework.data.annotation.Id;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class Foo {
+
+ @Id
+ private Integer id;
+ private String formattedName;
+ private Integer quantity;
+
+ public Foo(FooDto dto) {
+ this.id = (ThreadLocalRandom.current()
+ .nextInt(0, 100) == 0) ? null : dto.getId();
+ this.formattedName = dto.getName();
+ this.quantity = ThreadLocalRandom.current()
+ .nextInt(0, 10);
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java
new file mode 100644
index 0000000000..50508fd216
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java
@@ -0,0 +1,12 @@
+package com.baeldung.debugging.consumer.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class FooDto {
+
+ private Integer id;
+ private String name;
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooNameHelper.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooNameHelper.java
new file mode 100644
index 0000000000..772b360437
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooNameHelper.java
@@ -0,0 +1,45 @@
+package com.baeldung.debugging.consumer.service;
+
+import java.util.concurrent.ThreadLocalRandom;
+
+import com.baeldung.debugging.consumer.model.Foo;
+
+import reactor.core.publisher.Flux;
+
+public class FooNameHelper {
+
+ public static Flux concatAndSubstringFooName(Flux flux) {
+ flux = concatFooName(flux);
+ flux = substringFooName(flux);
+ return flux;
+ }
+
+ public static Flux concatFooName(Flux flux) {
+ flux = flux.map(foo -> {
+ String processedName = null;
+ Integer random = ThreadLocalRandom.current()
+ .nextInt(0, 80);
+ processedName = (random != 0) ? foo.getFormattedName() : foo.getFormattedName() + "-bael";
+ foo.setFormattedName(processedName);
+ return foo;
+ });
+ return flux;
+ }
+
+ public static Flux substringFooName(Flux flux) {
+ return flux.map(foo -> {
+ String processedName;
+ Integer random = ThreadLocalRandom.current()
+ .nextInt(0, 100);
+
+ processedName = (random == 0) ? foo.getFormattedName()
+ .substring(10, 15)
+ : foo.getFormattedName()
+ .substring(0, 5);
+
+ foo.setFormattedName(processedName);
+ return foo;
+ });
+ }
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooQuantityHelper.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooQuantityHelper.java
new file mode 100644
index 0000000000..615239313d
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooQuantityHelper.java
@@ -0,0 +1,31 @@
+package com.baeldung.debugging.consumer.service;
+
+import java.util.concurrent.ThreadLocalRandom;
+
+import com.baeldung.debugging.consumer.model.Foo;
+
+import reactor.core.publisher.Flux;
+
+public class FooQuantityHelper {
+
+ public static Flux processFooReducingQuantity(Flux flux) {
+ flux = flux.map(foo -> {
+ Integer result;
+ Integer random = ThreadLocalRandom.current()
+ .nextInt(0, 90);
+ result = (random == 0) ? result = 0 : foo.getQuantity() + 2;
+ foo.setQuantity(result);
+ return foo;
+ });
+ return divideFooQuantity(flux);
+ }
+
+ public static Flux divideFooQuantity(Flux flux) {
+ return flux.map(foo -> {
+ Integer result = Math.round(5 / foo.getQuantity());
+ foo.setQuantity(result);
+ return foo;
+ });
+ }
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooReporter.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooReporter.java
new file mode 100644
index 0000000000..f53cd238e0
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooReporter.java
@@ -0,0 +1,26 @@
+package com.baeldung.debugging.consumer.service;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.baeldung.debugging.consumer.model.Foo;
+
+import reactor.core.publisher.Flux;
+
+public class FooReporter {
+
+ private static Logger logger = LoggerFactory.getLogger(FooReporter.class);
+
+ public static Flux reportResult(Flux input, String approach) {
+ return input.map(foo -> {
+ if (foo.getId() == null)
+ throw new IllegalArgumentException("Null id is not valid!");
+ logger.info("Reporting for approach {}: Foo with id '{}' name '{}' and quantity '{}'", approach, foo.getId(), foo.getFormattedName(), foo.getQuantity());
+ return foo;
+ });
+ }
+
+ public static Flux reportResult(Flux input) {
+ return reportResult(input, "default");
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooService.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooService.java
new file mode 100644
index 0000000000..937e445ef5
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooService.java
@@ -0,0 +1,91 @@
+package com.baeldung.debugging.consumer.service;
+
+import static com.baeldung.debugging.consumer.service.FooNameHelper.concatAndSubstringFooName;
+import static com.baeldung.debugging.consumer.service.FooNameHelper.substringFooName;
+import static com.baeldung.debugging.consumer.service.FooQuantityHelper.divideFooQuantity;
+import static com.baeldung.debugging.consumer.service.FooQuantityHelper.processFooReducingQuantity;
+import static com.baeldung.debugging.consumer.service.FooReporter.reportResult;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import com.baeldung.debugging.consumer.model.Foo;
+
+import reactor.core.publisher.Flux;
+
+@Component
+public class FooService {
+
+ private static Logger logger = LoggerFactory.getLogger(FooService.class);
+
+ public void processFoo(Flux flux) {
+ flux = FooNameHelper.concatFooName(flux);
+ flux = FooNameHelper.substringFooName(flux);
+ flux = flux.log();
+ flux = FooReporter.reportResult(flux);
+ flux = flux.doOnError(error -> {
+ logger.error("The following error happened on processFoo method!", error);
+ });
+ flux.subscribe();
+ }
+
+ public void processFooInAnotherScenario(Flux flux) {
+ flux = FooNameHelper.substringFooName(flux);
+ flux = FooQuantityHelper.divideFooQuantity(flux);
+ flux.subscribe();
+ }
+
+ public void processUsingApproachOneWithErrorHandling(Flux flux) {
+ logger.info("starting approach one w error handling!");
+ flux = concatAndSubstringFooName(flux);
+ flux = concatAndSubstringFooName(flux);
+ flux = substringFooName(flux);
+ flux = processFooReducingQuantity(flux);
+ flux = processFooReducingQuantity(flux);
+ flux = processFooReducingQuantity(flux);
+ flux = reportResult(flux, "ONE w/ EH");
+ flux = flux.doOnError(error -> {
+ logger.error("Approach 1 with Error Handling failed!", error);
+ });
+ flux.subscribe();
+ }
+
+ public void processUsingApproachThree(Flux flux) {
+ logger.info("starting approach three!");
+ flux = concatAndSubstringFooName(flux);
+ flux = reportResult(flux, "THREE");
+ flux = flux.doOnError(error -> {
+ logger.error("Approach 3 failed!", error);
+ });
+ flux.subscribe();
+ }
+
+ public void processUsingApproachFourWithCheckpoint(Flux flux) {
+ logger.info("starting approach four!");
+ flux = concatAndSubstringFooName(flux);
+ flux = flux.checkpoint("CHECKPOINT 1");
+ flux = concatAndSubstringFooName(flux);
+ flux = divideFooQuantity(flux);
+ flux = flux.checkpoint("CHECKPOINT 2", true);
+ flux = reportResult(flux, "FOUR");
+ flux = concatAndSubstringFooName(flux).doOnError(error -> {
+ logger.error("Approach 4 failed!", error);
+ });
+ flux.subscribe();
+ }
+
+ public void processUsingApproachFourWithInitialCheckpoint(Flux flux) {
+ logger.info("starting approach four!");
+ flux = concatAndSubstringFooName(flux);
+ flux = flux.checkpoint("CHECKPOINT 1", true);
+ flux = concatAndSubstringFooName(flux);
+ flux = divideFooQuantity(flux);
+ flux = reportResult(flux, "FOUR");
+ flux = flux.doOnError(error -> {
+ logger.error("Approach 4-2 failed!", error);
+ });
+ flux.subscribe();
+ }
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/server/ServerSSEApplication.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/server/ServerSSEApplication.java
new file mode 100644
index 0000000000..6b24ee39f0
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/server/ServerSSEApplication.java
@@ -0,0 +1,29 @@
+package com.baeldung.debugging.server;
+
+import java.util.Collections;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.security.config.web.server.ServerHttpSecurity;
+import org.springframework.security.web.server.SecurityWebFilterChain;
+import org.springframework.web.reactive.config.EnableWebFlux;
+
+@EnableWebFlux
+@SpringBootApplication
+public class ServerSSEApplication {
+
+ public static void main(String[] args) {
+ SpringApplication app = new SpringApplication(ServerSSEApplication.class);
+ app.setDefaultProperties(Collections.singletonMap("server.port", "8081"));
+ app.run(args);
+ }
+
+ @Bean
+ public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
+ http.authorizeExchange()
+ .anyExchange()
+ .permitAll();
+ return http.build();
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/server/handlers/ServerHandler.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/server/handlers/ServerHandler.java
new file mode 100644
index 0000000000..759cd9b01d
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/server/handlers/ServerHandler.java
@@ -0,0 +1,47 @@
+package com.baeldung.debugging.server.handlers;
+
+import java.time.Duration;
+import java.util.concurrent.ThreadLocalRandom;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.web.reactive.function.server.ServerRequest;
+import org.springframework.web.reactive.function.server.ServerResponse;
+
+import com.baeldung.debugging.server.model.Foo;
+
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+@Component
+public class ServerHandler {
+
+ private static Logger logger = LoggerFactory.getLogger(ServerHandler.class);
+
+ public Mono useHandler(final ServerRequest request) {
+ // there are chances that something goes wrong here...
+ return ServerResponse.ok()
+ .contentType(MediaType.TEXT_EVENT_STREAM)
+ .body(Flux.interval(Duration.ofSeconds(1))
+ .map(sequence -> {
+ logger.info("retrieving Foo. Sequence: {}", sequence);
+ if (ThreadLocalRandom.current()
+ .nextInt(0, 50) == 1) {
+ throw new RuntimeException("There was an error retrieving the Foo!");
+ }
+ return new Foo(sequence, "name" + sequence);
+
+ }), Foo.class);
+ }
+
+ public Mono useHandlerFinite(final ServerRequest request) {
+ return ServerResponse.ok()
+ .contentType(MediaType.TEXT_EVENT_STREAM)
+ .body(Flux.range(0, 50)
+ .map(sequence -> {
+ return new Foo(new Long(sequence), "theFooNameNumber" + sequence);
+ }), Foo.class);
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/server/model/Foo.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/server/model/Foo.java
new file mode 100644
index 0000000000..a60e468e7f
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/server/model/Foo.java
@@ -0,0 +1,16 @@
+package com.baeldung.debugging.server.model;
+
+import org.springframework.data.annotation.Id;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class Foo {
+
+ @Id
+ private Long id;
+ private String name;
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/server/routers/ServerRouter.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/server/routers/ServerRouter.java
new file mode 100644
index 0000000000..6378b2213d
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/server/routers/ServerRouter.java
@@ -0,0 +1,22 @@
+package com.baeldung.debugging.server.routers;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.reactive.function.server.RequestPredicates;
+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.debugging.server.handlers.ServerHandler;
+
+@Configuration
+public class ServerRouter {
+
+ @Bean
+ public RouterFunction responseRoute(@Autowired ServerHandler handler) {
+ return RouterFunctions.route(RequestPredicates.GET("/functional-reactive/periodic-foo"), handler::useHandler)
+ .andRoute(RequestPredicates.GET("/functional-reactive/periodic-foo-2"), handler::useHandlerFinite);
+ }
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/webflux/logging/WebFluxLoggingExample.java b/spring-5-reactive/src/main/java/com/baeldung/webflux/logging/WebFluxLoggingExample.java
new file mode 100644
index 0000000000..c4881b2296
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/webflux/logging/WebFluxLoggingExample.java
@@ -0,0 +1,21 @@
+package com.baeldung.webflux.logging;
+
+import reactor.core.publisher.Flux;
+
+public class WebFluxLoggingExample {
+
+ public static void main(String[] args) {
+ Flux reactiveStream = Flux.range(1, 5).log();
+
+ reactiveStream.subscribe();
+
+ reactiveStream = Flux.range(1, 5).log().take(3);
+
+ reactiveStream.subscribe();
+
+ reactiveStream = Flux.range(1, 5).take(3).log();
+
+ reactiveStream.subscribe();
+ }
+
+}
diff --git a/spring-5-reactive/src/main/resources/application.properties b/spring-5-reactive/src/main/resources/application.properties
index 92f3116f84..4b49e8e8a2 100644
--- a/spring-5-reactive/src/main/resources/application.properties
+++ b/spring-5-reactive/src/main/resources/application.properties
@@ -1,2 +1 @@
-logging.level.root=INFO
-
+logging.level.root=INFO
\ No newline at end of file
diff --git a/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java
new file mode 100644
index 0000000000..b7ed031ec7
--- /dev/null
+++ b/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java
@@ -0,0 +1,65 @@
+package com.baeldung.debugging.consumer;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import com.baeldung.debugging.consumer.model.Foo;
+import com.baeldung.debugging.consumer.service.FooService;
+import com.baeldung.debugging.consumer.utils.ListAppender;
+
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.classic.spi.IThrowableProxy;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Hooks;
+
+public class ConsumerFooServiceIntegrationTest {
+
+ FooService service = new FooService();
+
+ @BeforeEach
+ public void clearLogList() {
+ Hooks.onOperatorDebug();
+ ListAppender.clearEventList();
+ }
+
+ @Test
+ public void givenFooWithNullId_whenProcessFoo_thenLogsWithDebugTrace() {
+ Foo one = new Foo(1, "nameverylong", 8);
+ Foo two = new Foo(null, "nameverylong", 4);
+ Flux flux = Flux.just(one, two);
+
+ service.processFoo(flux);
+
+ Collection allLoggedEntries = ListAppender.getEvents()
+ .stream()
+ .map(ILoggingEvent::getFormattedMessage)
+ .collect(Collectors.toList());
+
+ Collection allSuppressedEntries = ListAppender.getEvents()
+ .stream()
+ .map(ILoggingEvent::getThrowableProxy)
+ .flatMap(t -> {
+ return Optional.ofNullable(t)
+ .map(IThrowableProxy::getSuppressed)
+ .map(Arrays::stream)
+ .orElse(Stream.empty());
+ })
+ .map(IThrowableProxy::getMessage)
+ .collect(Collectors.toList());
+ assertThat(allLoggedEntries).anyMatch(entry -> entry.contains("The following error happened on processFoo method!"))
+ .anyMatch(entry -> entry.contains("| onSubscribe"))
+ .anyMatch(entry -> entry.contains("| cancel()"));
+
+ assertThat(allSuppressedEntries).anyMatch(entry -> entry.contains("Assembly trace from producer"))
+ .anyMatch(entry -> entry.contains("Error has been observed by the following operator(s)"));
+ }
+
+}
diff --git a/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java b/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java
new file mode 100644
index 0000000000..af9bdfbc9b
--- /dev/null
+++ b/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java
@@ -0,0 +1,49 @@
+package com.baeldung.debugging.consumer;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.springframework.test.web.reactive.server.WebTestClient;
+import org.springframework.test.web.reactive.server.WebTestClient.ResponseSpec;
+
+import com.baeldung.debugging.consumer.service.FooService;
+
+public class ConsumerFooServiceLiveTest {
+
+ FooService service = new FooService();
+
+ private static final String BASE_URL = "http://localhost:8082";
+ private static final String DEBUG_HOOK_ON = BASE_URL + "/debug-hook-on";
+ private static final String DEBUG_HOOK_OFF = BASE_URL + "/debug-hook-off";
+
+ private static WebTestClient client;
+
+ @BeforeAll
+ public static void setup() {
+ client = WebTestClient.bindToServer()
+ .baseUrl(BASE_URL)
+ .build();
+ }
+
+ @Test
+ public void whenRequestingDebugHookOn_thenObtainExpectedMessage() {
+ ResponseSpec response = client.get()
+ .uri(DEBUG_HOOK_ON)
+ .exchange();
+ response.expectStatus()
+ .isOk()
+ .expectBody(String.class)
+ .isEqualTo("DEBUG HOOK ON");
+ }
+
+ @Test
+ public void whenRequestingDebugHookOff_thenObtainExpectedMessage() {
+ ResponseSpec response = client.get()
+ .uri(DEBUG_HOOK_OFF)
+ .exchange();
+ response.expectStatus()
+ .isOk()
+ .expectBody(String.class)
+ .isEqualTo("DEBUG HOOK OFF");
+ }
+
+}
diff --git a/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/utils/ListAppender.java b/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/utils/ListAppender.java
new file mode 100644
index 0000000000..c8c1c110bb
--- /dev/null
+++ b/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/utils/ListAppender.java
@@ -0,0 +1,25 @@
+package com.baeldung.debugging.consumer.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.AppenderBase;
+
+public class ListAppender extends AppenderBase {
+
+ static private List events = new ArrayList<>();
+
+ @Override
+ protected void append(ILoggingEvent eventObject) {
+ events.add(eventObject);
+ }
+
+ public static List getEvents() {
+ return events;
+ }
+
+ public static void clearEventList() {
+ events.clear();
+ }
+}
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 8707c27fb3..5ebfa39358 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
@@ -1,5 +1,6 @@
package com.baeldung.reactive;
+import com.baeldung.web.reactive.Task;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.springframework.http.server.reactive.HttpHandler;
@@ -7,9 +8,6 @@ import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter;
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.ipc.netty.NettyContext;
@@ -21,7 +19,6 @@ import static org.springframework.web.reactive.function.server.RequestPredicates
import static org.springframework.web.reactive.function.server.RequestPredicates.POST;
public class Spring5ReactiveServerClientIntegrationTest {
-
private static NettyContext nettyContext;
@BeforeAll
diff --git a/spring-5-reactive/src/test/resources/logback-test.xml b/spring-5-reactive/src/test/resources/logback-test.xml
new file mode 100644
index 0000000000..514029e402
--- /dev/null
+++ b/spring-5-reactive/src/test/resources/logback-test.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-5-security-oauth/README.md b/spring-5-security-oauth/README.md
new file mode 100644
index 0000000000..f13925992b
--- /dev/null
+++ b/spring-5-security-oauth/README.md
@@ -0,0 +1,4 @@
+## Relevant articles:
+
+- [Spring Security 5 -OAuth2 Login](http://www.baeldung.com/spring-security-5-oauth2-login)
+- [Extracting Principal and Authorities using Spring Security OAuth](https://www.baeldung.com/spring-security-oauth-principal-authorities-extractor)
diff --git a/spring-5-security-oauth/pom.xml b/spring-5-security-oauth/pom.xml
new file mode 100644
index 0000000000..59150a153f
--- /dev/null
+++ b/spring-5-security-oauth/pom.xml
@@ -0,0 +1,74 @@
+
+ 4.0.0
+ com.baeldung
+ spring-5-security-oauth
+ 0.0.1-SNAPSHOT
+ jar
+ spring-5-security-oauth
+ spring 5 security oauth sample project
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+ org.thymeleaf.extras
+ thymeleaf-extras-springsecurity5
+
+
+
+
+ org.springframework.security.oauth.boot
+ spring-security-oauth2-autoconfigure
+ ${oauth-auto.version}
+
+
+ org.springframework.security
+ spring-security-oauth2-client
+
+
+ org.springframework.security
+ spring-security-oauth2-jose
+
+
+
+ org.springframework
+ spring-test
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.security
+ spring-security-test
+ test
+
+
+
+
+ 2.1.0.RELEASE
+ 2.1.0.RELEASE
+ com.baeldung.oauth2.SpringOAuthApplication
+
+
+
diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomRequestSecurityConfig.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomRequestSecurityConfig.java
new file mode 100644
index 0000000000..2aba5a82ac
--- /dev/null
+++ b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomRequestSecurityConfig.java
@@ -0,0 +1,118 @@
+package com.baeldung.oauth2;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.core.env.Environment;
+import org.springframework.http.converter.FormHttpMessageConverter;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.config.oauth2.client.CommonOAuth2Provider;
+import org.springframework.security.oauth2.client.endpoint.DefaultAuthorizationCodeTokenResponseClient;
+import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient;
+import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest;
+import org.springframework.security.oauth2.client.http.OAuth2ErrorResponseErrorHandler;
+import org.springframework.security.oauth2.client.registration.ClientRegistration;
+import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
+import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository;
+import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository;
+import org.springframework.security.oauth2.client.web.HttpSessionOAuth2AuthorizationRequestRepository;
+import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest;
+import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter;
+import org.springframework.web.client.RestTemplate;
+
+import com.baeldung.oauth2request.CustomAuthorizationRequestResolver;
+import com.baeldung.oauth2request.CustomRequestEntityConverter;
+import com.baeldung.oauth2request.CustomTokenResponseConverter;
+
+//@Configuration
+@PropertySource("application-oauth2.properties")
+public class CustomRequestSecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http.authorizeRequests()
+ .antMatchers("/oauth_login", "/loginFailure", "/")
+ .permitAll()
+ .anyRequest()
+ .authenticated()
+ .and()
+ .oauth2Login()
+ .loginPage("/oauth_login")
+ .authorizationEndpoint()
+ .authorizationRequestResolver( new CustomAuthorizationRequestResolver(clientRegistrationRepository(),"/oauth2/authorize-client"))
+
+ .baseUri("/oauth2/authorize-client")
+ .authorizationRequestRepository(authorizationRequestRepository())
+ .and()
+ .tokenEndpoint()
+ .accessTokenResponseClient(accessTokenResponseClient())
+ .and()
+ .defaultSuccessUrl("/loginSuccess")
+ .failureUrl("/loginFailure");
+ }
+
+ @Bean
+ public AuthorizationRequestRepository authorizationRequestRepository() {
+ return new HttpSessionOAuth2AuthorizationRequestRepository();
+ }
+
+ @Bean
+ public OAuth2AccessTokenResponseClient accessTokenResponseClient() {
+ DefaultAuthorizationCodeTokenResponseClient accessTokenResponseClient = new DefaultAuthorizationCodeTokenResponseClient();
+ accessTokenResponseClient.setRequestEntityConverter(new CustomRequestEntityConverter());
+
+ OAuth2AccessTokenResponseHttpMessageConverter tokenResponseHttpMessageConverter = new OAuth2AccessTokenResponseHttpMessageConverter();
+ tokenResponseHttpMessageConverter.setTokenResponseConverter(new CustomTokenResponseConverter());
+ RestTemplate restTemplate = new RestTemplate(Arrays.asList(new FormHttpMessageConverter(), tokenResponseHttpMessageConverter));
+ restTemplate.setErrorHandler(new OAuth2ErrorResponseErrorHandler());
+ accessTokenResponseClient.setRestOperations(restTemplate);
+ return accessTokenResponseClient;
+ }
+
+
+ // additional configuration for non-Spring Boot projects
+ private static List clients = Arrays.asList("google", "facebook");
+
+ //@Bean
+ public ClientRegistrationRepository clientRegistrationRepository() {
+ List registrations = clients.stream()
+ .map(c -> getRegistration(c))
+ .filter(registration -> registration != null)
+ .collect(Collectors.toList());
+
+ return new InMemoryClientRegistrationRepository(registrations);
+ }
+
+ private static String CLIENT_PROPERTY_KEY = "spring.security.oauth2.client.registration.";
+
+ @Autowired
+ private Environment env;
+
+ private ClientRegistration getRegistration(String client) {
+ String clientId = env.getProperty(CLIENT_PROPERTY_KEY + client + ".client-id");
+
+ if (clientId == null) {
+ return null;
+ }
+
+ String clientSecret = env.getProperty(CLIENT_PROPERTY_KEY + client + ".client-secret");
+ if (client.equals("google")) {
+ return CommonOAuth2Provider.GOOGLE.getBuilder(client)
+ .clientId(clientId)
+ .clientSecret(clientSecret)
+ .build();
+ }
+ if (client.equals("facebook")) {
+ return CommonOAuth2Provider.FACEBOOK.getBuilder(client)
+ .clientId(clientId)
+ .clientSecret(clientSecret)
+ .build();
+ }
+ return null;
+ }
+}
diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2/LoginController.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/LoginController.java
similarity index 100%
rename from spring-5-security/src/main/java/com/baeldung/oauth2/LoginController.java
rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2/LoginController.java
diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2/MvcConfig.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/MvcConfig.java
similarity index 100%
rename from spring-5-security/src/main/java/com/baeldung/oauth2/MvcConfig.java
rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2/MvcConfig.java
diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2/SecurityConfig.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SecurityConfig.java
similarity index 93%
rename from spring-5-security/src/main/java/com/baeldung/oauth2/SecurityConfig.java
rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SecurityConfig.java
index b45f325767..e17e339142 100644
--- a/spring-5-security/src/main/java/com/baeldung/oauth2/SecurityConfig.java
+++ b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SecurityConfig.java
@@ -12,7 +12,7 @@ import org.springframework.core.env.Environment;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.oauth2.client.CommonOAuth2Provider;
-import org.springframework.security.oauth2.client.endpoint.NimbusAuthorizationCodeTokenResponseClient;
+import org.springframework.security.oauth2.client.endpoint.DefaultAuthorizationCodeTokenResponseClient;
import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient;
import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest;
import org.springframework.security.oauth2.client.registration.ClientRegistration;
@@ -54,7 +54,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public OAuth2AccessTokenResponseClient accessTokenResponseClient() {
- return new NimbusAuthorizationCodeTokenResponseClient();
+ DefaultAuthorizationCodeTokenResponseClient accessTokenResponseClient = new DefaultAuthorizationCodeTokenResponseClient();
+ return accessTokenResponseClient;
}
diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java
similarity index 100%
rename from spring-5-security/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java
rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java
diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2extractors/ExtractorsApplication.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/ExtractorsApplication.java
similarity index 100%
rename from spring-5-security/src/main/java/com/baeldung/oauth2extractors/ExtractorsApplication.java
rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/ExtractorsApplication.java
diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2extractors/configuration/SecurityConfig.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/configuration/SecurityConfig.java
similarity index 100%
rename from spring-5-security/src/main/java/com/baeldung/oauth2extractors/configuration/SecurityConfig.java
rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/configuration/SecurityConfig.java
diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungAuthoritiesExtractor.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungAuthoritiesExtractor.java
similarity index 100%
rename from spring-5-security/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungAuthoritiesExtractor.java
rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungAuthoritiesExtractor.java
diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungPrincipalExtractor.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungPrincipalExtractor.java
similarity index 100%
rename from spring-5-security/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungPrincipalExtractor.java
rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungPrincipalExtractor.java
diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubAuthoritiesExtractor.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubAuthoritiesExtractor.java
similarity index 100%
rename from spring-5-security/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubAuthoritiesExtractor.java
rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubAuthoritiesExtractor.java
diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubPrincipalExtractor.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubPrincipalExtractor.java
similarity index 100%
rename from spring-5-security/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubPrincipalExtractor.java
rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubPrincipalExtractor.java
diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomAuthorizationRequestResolver.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomAuthorizationRequestResolver.java
new file mode 100644
index 0000000000..47aacf9c06
--- /dev/null
+++ b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomAuthorizationRequestResolver.java
@@ -0,0 +1,57 @@
+package com.baeldung.oauth2request;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
+import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizationRequestResolver;
+import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestResolver;
+import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest;
+
+public class CustomAuthorizationRequestResolver implements OAuth2AuthorizationRequestResolver {
+
+ private OAuth2AuthorizationRequestResolver defaultResolver;
+
+ public CustomAuthorizationRequestResolver(ClientRegistrationRepository repo, String authorizationRequestBaseUri){
+ defaultResolver = new DefaultOAuth2AuthorizationRequestResolver(repo, authorizationRequestBaseUri);
+ }
+
+ @Override
+ public OAuth2AuthorizationRequest resolve(HttpServletRequest request) {
+ OAuth2AuthorizationRequest req = defaultResolver.resolve(request);
+ if(req != null){
+ req = customizeAuthorizationRequest(req);
+ }
+ return req;
+ }
+
+ @Override
+ public OAuth2AuthorizationRequest resolve(HttpServletRequest request, String clientRegistrationId) {
+ OAuth2AuthorizationRequest req = defaultResolver.resolve(request, clientRegistrationId);
+ if(req != null){
+ req = customizeAuthorizationRequest(req);
+ }
+ return req;
+ }
+
+ private OAuth2AuthorizationRequest customizeAuthorizationRequest(OAuth2AuthorizationRequest req) {
+ Map extraParams = new HashMap();
+ extraParams.putAll(req.getAdditionalParameters()); //VIP note
+ extraParams.put("test", "extra");
+ System.out.println("here =====================");
+ return OAuth2AuthorizationRequest.from(req).additionalParameters(extraParams).build();
+ }
+
+ private OAuth2AuthorizationRequest customizeAuthorizationRequest1(OAuth2AuthorizationRequest req) {
+ return OAuth2AuthorizationRequest.from(req).state("xyz").build();
+ }
+
+ private OAuth2AuthorizationRequest customizeOktaReq(OAuth2AuthorizationRequest req) {
+ Map extraParams = new HashMap();
+ extraParams.putAll(req.getAdditionalParameters());
+ extraParams.put("idp", "https://idprovider.com");
+ return OAuth2AuthorizationRequest.from(req).additionalParameters(extraParams).build();
+ }
+}
diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomRequestEntityConverter.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomRequestEntityConverter.java
new file mode 100644
index 0000000000..5486105c34
--- /dev/null
+++ b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomRequestEntityConverter.java
@@ -0,0 +1,26 @@
+package com.baeldung.oauth2request;
+
+import org.springframework.core.convert.converter.Converter;
+import org.springframework.http.RequestEntity;
+import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest;
+import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequestEntityConverter;
+import org.springframework.util.MultiValueMap;
+
+public class CustomRequestEntityConverter implements Converter> {
+
+ private OAuth2AuthorizationCodeGrantRequestEntityConverter defaultConverter;
+
+ public CustomRequestEntityConverter() {
+ defaultConverter = new OAuth2AuthorizationCodeGrantRequestEntityConverter();
+ }
+
+ @Override
+ public RequestEntity> convert(OAuth2AuthorizationCodeGrantRequest req) {
+ RequestEntity> entity = defaultConverter.convert(req);
+ MultiValueMap params = (MultiValueMap) entity.getBody();
+ params.add("test2", "extra2");
+ System.out.println(params.entrySet());
+ return new RequestEntity<>(params, entity.getHeaders(), entity.getMethod(), entity.getUrl());
+ }
+
+}
diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomTokenResponseConverter.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomTokenResponseConverter.java
new file mode 100644
index 0000000000..b9775d674a
--- /dev/null
+++ b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomTokenResponseConverter.java
@@ -0,0 +1,67 @@
+package com.baeldung.oauth2request;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.springframework.core.convert.converter.Converter;
+import org.springframework.security.oauth2.core.OAuth2AccessToken;
+import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse;
+import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
+import org.springframework.util.StringUtils;
+
+public class CustomTokenResponseConverter implements Converter
\ No newline at end of file
+
diff --git a/spring-all/README.md b/spring-all/README.md
index ded5e26285..0d78efdcf2 100644
--- a/spring-all/README.md
+++ b/spring-all/README.md
@@ -4,10 +4,12 @@
This project is used to replicate Spring Exceptions only.
-###The Course
+### The Course
+
The "REST With Spring" Classes: http://bit.ly/restwithspring
-
-### Relevant articles:
+
+### Relevant articles:
+
- [Guide to Spring @Autowired](http://www.baeldung.com/spring-autowire)
- [Properties with Spring](http://www.baeldung.com/properties-with-spring) - checkout the `org.baeldung.properties` package for all scenarios of properties injection and usage
- [Spring Profiles](http://www.baeldung.com/spring-profiles)
@@ -30,3 +32,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Spring Web Contexts](http://www.baeldung.com/spring-web-contexts)
- [Spring Cache – Creating a Custom KeyGenerator](http://www.baeldung.com/spring-cache-custom-keygenerator)
- [Spring @Primary Annotation](http://www.baeldung.com/spring-primary)
+- [Spring Events](https://www.baeldung.com/spring-events)
+- [Spring Null-Safety Annotations](https://www.baeldung.com/spring-null-safety-annotations)
diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/AnnotationDrivenEventListener.java b/spring-all/src/main/java/org/baeldung/springevents/synchronous/AnnotationDrivenEventListener.java
new file mode 100644
index 0000000000..f750c40a6e
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/springevents/synchronous/AnnotationDrivenEventListener.java
@@ -0,0 +1,46 @@
+package org.baeldung.springevents.synchronous;
+
+import org.springframework.context.event.ContextStartedEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.event.TransactionPhase;
+import org.springframework.transaction.event.TransactionalEventListener;
+
+@Component
+public class AnnotationDrivenEventListener {
+
+ // for tests
+ private boolean hitContextStartedHandler = false;
+ private boolean hitSuccessfulEventHandler = false;
+ private boolean hitCustomEventHandler = false;
+
+ @EventListener
+ public void handleContextStart(final ContextStartedEvent cse) {
+ System.out.println("Handling context started event.");
+ hitContextStartedHandler = true;
+ }
+
+ @EventListener(condition = "#event.success")
+ public void handleSuccessful(final GenericSpringEvent event) {
+ System.out.println("Handling generic event (conditional): " + event.getWhat());
+ hitSuccessfulEventHandler = true;
+ }
+
+ @TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)
+ public void handleCustom(final CustomSpringEvent event) {
+ System.out.println("Handling event inside a transaction BEFORE COMMIT.");
+ hitCustomEventHandler = true;
+ }
+
+ boolean isHitContextStartedHandler() {
+ return hitContextStartedHandler;
+ }
+
+ boolean isHitSuccessfulEventHandler() {
+ return hitSuccessfulEventHandler;
+ }
+
+ boolean isHitCustomEventHandler() {
+ return hitCustomEventHandler;
+ }
+}
diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/ContextRefreshedListener.java b/spring-all/src/main/java/org/baeldung/springevents/synchronous/ContextRefreshedListener.java
index 052437e555..9f8b2e6e83 100644
--- a/spring-all/src/main/java/org/baeldung/springevents/synchronous/ContextRefreshedListener.java
+++ b/spring-all/src/main/java/org/baeldung/springevents/synchronous/ContextRefreshedListener.java
@@ -7,9 +7,16 @@ import org.springframework.stereotype.Component;
@Component
public class ContextRefreshedListener implements ApplicationListener {
+ // for tests
+ private boolean hitContextRefreshedHandler = false;
+
@Override
public void onApplicationEvent(final ContextRefreshedEvent cse) {
System.out.println("Handling context re-freshed event. ");
+ hitContextRefreshedHandler = true;
}
+ boolean isHitContextRefreshedHandler() {
+ return hitContextRefreshedHandler;
+ }
}
\ No newline at end of file
diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEventPublisher.java b/spring-all/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEventPublisher.java
index 4569de1d5e..3182090d5d 100644
--- a/spring-all/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEventPublisher.java
+++ b/spring-all/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEventPublisher.java
@@ -16,4 +16,16 @@ public class CustomSpringEventPublisher {
applicationEventPublisher.publishEvent(customSpringEvent);
}
+ public void publishGenericEvent(final String message, boolean success) {
+ System.out.println("Publishing generic event.");
+ final GenericSpringEvent genericSpringEvent = new GenericStringSpringEvent(message, success);
+ applicationEventPublisher.publishEvent(genericSpringEvent);
+ }
+
+ public void publishGenericAppEvent(final String message) {
+ System.out.println("Publishing generic event.");
+ final GenericSpringAppEvent genericSpringEvent = new GenericStringSpringAppEvent(this, message);
+ applicationEventPublisher.publishEvent(genericSpringEvent);
+ }
+
}
diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringAppEvent.java b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringAppEvent.java
new file mode 100644
index 0000000000..6804312189
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringAppEvent.java
@@ -0,0 +1,18 @@
+package org.baeldung.springevents.synchronous;
+
+import org.springframework.context.ApplicationEvent;
+
+public class GenericSpringAppEvent extends ApplicationEvent {
+
+ private final T what;
+
+ public GenericSpringAppEvent(final Object source, final T what) {
+ super(source);
+ this.what = what;
+ }
+
+ public T getWhat() {
+ return what;
+ }
+
+}
diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEvent.java b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEvent.java
new file mode 100644
index 0000000000..ce2c223fec
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEvent.java
@@ -0,0 +1,21 @@
+package org.baeldung.springevents.synchronous;
+
+public class GenericSpringEvent {
+
+ private final T what;
+ protected final boolean success;
+
+ public GenericSpringEvent(final T what, final boolean success) {
+ this.what = what;
+ this.success = success;
+ }
+
+ public T getWhat() {
+ return what;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+}
diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEventListener.java b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEventListener.java
new file mode 100644
index 0000000000..1f5e3e7068
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEventListener.java
@@ -0,0 +1,22 @@
+package org.baeldung.springevents.synchronous;
+
+import org.springframework.context.ApplicationListener;
+import org.springframework.lang.NonNull;
+import org.springframework.stereotype.Component;
+
+@Component
+public class GenericSpringEventListener implements ApplicationListener> {
+
+ // for testing
+ private boolean hitEventHandler = false;
+
+ @Override
+ public void onApplicationEvent(@NonNull final GenericSpringAppEvent event) {
+ System.out.println("Received spring generic event - " + event.getWhat());
+ hitEventHandler = true;
+ }
+
+ boolean isHitEventHandler() {
+ return hitEventHandler;
+ }
+}
\ No newline at end of file
diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringAppEvent.java b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringAppEvent.java
new file mode 100644
index 0000000000..fd214696e7
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringAppEvent.java
@@ -0,0 +1,9 @@
+package org.baeldung.springevents.synchronous;
+
+class GenericStringSpringAppEvent extends GenericSpringAppEvent {
+
+ GenericStringSpringAppEvent(final Object source, final String what) {
+ super(source, what);
+ }
+
+}
diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringEvent.java b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringEvent.java
new file mode 100644
index 0000000000..dd4e4e3ed4
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringEvent.java
@@ -0,0 +1,9 @@
+package org.baeldung.springevents.synchronous;
+
+public class GenericStringSpringEvent extends GenericSpringEvent {
+
+ GenericStringSpringEvent(final String what, final boolean success) {
+ super(what, success);
+ }
+
+}
diff --git a/spring-all/src/test/java/org/baeldung/springevents/synchronous/ContextRefreshedListenerIntegrationTest.java b/spring-all/src/test/java/org/baeldung/springevents/synchronous/ContextRefreshedListenerIntegrationTest.java
index ac8758bbf6..e8e6f91b06 100644
--- a/spring-all/src/test/java/org/baeldung/springevents/synchronous/ContextRefreshedListenerIntegrationTest.java
+++ b/spring-all/src/test/java/org/baeldung/springevents/synchronous/ContextRefreshedListenerIntegrationTest.java
@@ -3,16 +3,23 @@ package org.baeldung.springevents.synchronous;
import org.baeldung.springevents.synchronous.SynchronousSpringEventsConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import static org.springframework.util.Assert.isTrue;
+
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { SynchronousSpringEventsConfig.class }, loader = AnnotationConfigContextLoader.class)
public class ContextRefreshedListenerIntegrationTest {
+ @Autowired
+ private ContextRefreshedListener listener;
+
@Test
- public void testContextRefreshedListener() throws InterruptedException {
+ public void testContextRefreshedListener() {
System.out.println("Test context re-freshed listener.");
+ isTrue(listener.isHitContextRefreshedHandler(), "Refresh should be called once");
}
}
\ No newline at end of file
diff --git a/spring-all/src/test/java/org/baeldung/springevents/synchronous/GenericAppEventListenerIntegrationTest.java b/spring-all/src/test/java/org/baeldung/springevents/synchronous/GenericAppEventListenerIntegrationTest.java
new file mode 100644
index 0000000000..f183314b6d
--- /dev/null
+++ b/spring-all/src/test/java/org/baeldung/springevents/synchronous/GenericAppEventListenerIntegrationTest.java
@@ -0,0 +1,28 @@
+package org.baeldung.springevents.synchronous;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+
+import static org.springframework.util.Assert.isTrue;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { SynchronousSpringEventsConfig.class }, loader = AnnotationConfigContextLoader.class)
+public class GenericAppEventListenerIntegrationTest {
+
+ @Autowired
+ private CustomSpringEventPublisher publisher;
+ @Autowired
+ private GenericSpringEventListener listener;
+
+ @Test
+ public void testGenericSpringEvent() {
+ isTrue(!listener.isHitEventHandler(), "The initial value should be false");
+ publisher.publishGenericAppEvent("Hello world!!!");
+ isTrue(listener.isHitEventHandler(), "Now the value should be changed to true");
+ }
+
+}
\ No newline at end of file
diff --git a/spring-all/src/test/java/org/baeldung/springevents/synchronous/SynchronousCustomSpringEventsIntegrationTest.java b/spring-all/src/test/java/org/baeldung/springevents/synchronous/SynchronousCustomSpringEventsIntegrationTest.java
index f9783f57dc..b169cfec36 100644
--- a/spring-all/src/test/java/org/baeldung/springevents/synchronous/SynchronousCustomSpringEventsIntegrationTest.java
+++ b/spring-all/src/test/java/org/baeldung/springevents/synchronous/SynchronousCustomSpringEventsIntegrationTest.java
@@ -1,5 +1,6 @@
package org.baeldung.springevents.synchronous;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
@@ -7,16 +8,42 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import static org.springframework.util.Assert.isTrue;
+
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { SynchronousSpringEventsConfig.class }, loader = AnnotationConfigContextLoader.class)
public class SynchronousCustomSpringEventsIntegrationTest {
@Autowired
private CustomSpringEventPublisher publisher;
+ @Autowired
+ private AnnotationDrivenEventListener listener;
@Test
- public void testCustomSpringEvents() throws InterruptedException {
+ public void testCustomSpringEvents() {
+ isTrue(!listener.isHitCustomEventHandler(), "The value should be false");
publisher.publishEvent("Hello world!!");
System.out.println("Done publishing synchronous custom event. ");
+ isTrue(listener.isHitCustomEventHandler(), "Now the value should be changed to true");
+ }
+
+ @Test
+ public void testGenericSpringEvent() {
+ isTrue(!listener.isHitSuccessfulEventHandler(), "The initial value should be false");
+ publisher.publishGenericEvent("Hello world!!!", true);
+ isTrue(listener.isHitSuccessfulEventHandler(), "Now the value should be changed to true");
+ }
+
+ @Test
+ public void testGenericSpringEventNotProcessed() {
+ isTrue(!listener.isHitSuccessfulEventHandler(), "The initial value should be false");
+ publisher.publishGenericEvent("Hello world!!!", false);
+ isTrue(!listener.isHitSuccessfulEventHandler(), "The value should still be false");
+ }
+
+ @Ignore("fix me")
+ @Test
+ public void testContextStartedEvent() {
+ isTrue(listener.isHitContextStartedHandler(), "Start should be called once");
}
}
diff --git a/spring-amqp-simple/pom.xml b/spring-amqp-simple/pom.xml
index 3d9ea55cfa..57d84acee6 100644
--- a/spring-amqp-simple/pom.xml
+++ b/spring-amqp-simple/pom.xml
@@ -5,7 +5,7 @@
com.baeldung
spring-amqp-simple
1.0.0-SNAPSHOT
- Spring AMQP Simple App
+ spring-amqp-simple
parent-boot-1
diff --git a/spring-boot-admin/pom.xml b/spring-boot-admin/pom.xml
index 58cea728cc..23852dee57 100644
--- a/spring-boot-admin/pom.xml
+++ b/spring-boot-admin/pom.xml
@@ -3,6 +3,7 @@
4.0.0
spring-boot-admin
0.0.1-SNAPSHOT
+ spring-boot-admin
pom
diff --git a/spring-boot-autoconfiguration/pom.xml b/spring-boot-autoconfiguration/pom.xml
index b88587f731..1c3d8796ed 100644
--- a/spring-boot-autoconfiguration/pom.xml
+++ b/spring-boot-autoconfiguration/pom.xml
@@ -5,7 +5,7 @@
spring-boot-autoconfiguration
0.0.1-SNAPSHOT
war
- spring-boot-auto-configuration
+ spring-boot-autoconfiguration
This is simple boot application demonstrating a custom auto-configuration
diff --git a/spring-boot-autoconfiguration/src/main/resources/META-INF/spring.factories b/spring-boot-autoconfiguration/src/main/resources/META-INF/spring.factories
index 5f55544eff..11c775fc6c 100644
--- a/spring-boot-autoconfiguration/src/main/resources/META-INF/spring.factories
+++ b/spring-boot-autoconfiguration/src/main/resources/META-INF/spring.factories
@@ -1,3 +1 @@
-org.springframework.boot.diagnostics.FailureAnalyzer=com.baeldung.failureanalyzer.MyBeanNotOfRequiredTypeFailureAnalyzer
-
-org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.baeldung.autoconfiguration.MySQLAutoconfiguration
\ No newline at end of file
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.baeldung.autoconfiguration.MySQLAutoconfiguration
diff --git a/spring-boot-camel/pom.xml b/spring-boot-camel/pom.xml
index 19a0bec809..8bab0ed5c8 100644
--- a/spring-boot-camel/pom.xml
+++ b/spring-boot-camel/pom.xml
@@ -5,7 +5,8 @@
com.example
spring-boot-camel
0.0.1-SNAPSHOT
-
+ spring-boot-camel
+
com.baeldung
parent-modules
diff --git a/spring-boot-crud/pom.xml b/spring-boot-crud/pom.xml
index f803a7e70b..749bf9cb5a 100644
--- a/spring-boot-crud/pom.xml
+++ b/spring-boot-crud/pom.xml
@@ -3,10 +3,10 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
4.0.0
-
com.baeldung.spring-boot-crud
spring-boot-crud
0.1.0
+ spring-boot-crud
org.springframework.boot
diff --git a/spring-boot-crud/src/main/java/com/baeldung/crud/Application.java b/spring-boot-crud/src/main/java/com/baeldung/crud/Application.java
index 436cccb964..0b686e90e9 100644
--- a/spring-boot-crud/src/main/java/com/baeldung/crud/Application.java
+++ b/spring-boot-crud/src/main/java/com/baeldung/crud/Application.java
@@ -14,11 +14,10 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableJpaRepositories(basePackages="com.baeldung.crud.repositories")
@EnableTransactionManagement
@EntityScan(basePackages="com.baeldung.crud.entities")
-
-@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
+
}
diff --git a/spring-boot-crud/src/main/java/com/baeldung/crud/controllers/UserController.java b/spring-boot-crud/src/main/java/com/baeldung/crud/controllers/UserController.java
index 1b7185c2fd..9a6cb477aa 100644
--- a/spring-boot-crud/src/main/java/com/baeldung/crud/controllers/UserController.java
+++ b/spring-boot-crud/src/main/java/com/baeldung/crud/controllers/UserController.java
@@ -1,8 +1,7 @@
package com.baeldung.crud.controllers;
-import com.baeldung.crud.UserRepository;
-import com.baeldung.crud.entities.User;
import javax.validation.Valid;
+
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
@@ -11,6 +10,9 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
+import com.baeldung.crud.entities.User;
+import com.baeldung.crud.repositories.UserRepository;
+
@Controller
public class UserController {
diff --git a/spring-boot-crud/src/test/java/com/baeldung/crud/UserControllerUnitTest.java b/spring-boot-crud/src/test/java/com/baeldung/crud/UserControllerUnitTest.java
index 7773a962fb..2de0828ae5 100644
--- a/spring-boot-crud/src/test/java/com/baeldung/crud/UserControllerUnitTest.java
+++ b/spring-boot-crud/src/test/java/com/baeldung/crud/UserControllerUnitTest.java
@@ -1,16 +1,18 @@
package com.baeldung.crud;
-import com.baeldung.crud.UserController;
-import com.baeldung.crud.entities.User;
-import com.baeldung.crud.UserRepository;
import static org.assertj.core.api.Assertions.assertThat;
-import org.junit.BeforeClass;
-import org.junit.Test;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
+import com.baeldung.crud.controllers.UserController;
+import com.baeldung.crud.entities.User;
+import com.baeldung.crud.repositories.UserRepository;
+
public class UserControllerUnitTest {
private static UserController userController;
diff --git a/spring-boot-crud/src/test/java/com/baeldung/crud/UserUnitTest.java b/spring-boot-crud/src/test/java/com/baeldung/crud/UserUnitTest.java
index a3c6a922d8..565f6727c3 100644
--- a/spring-boot-crud/src/test/java/com/baeldung/crud/UserUnitTest.java
+++ b/spring-boot-crud/src/test/java/com/baeldung/crud/UserUnitTest.java
@@ -1,9 +1,11 @@
package com.baeldung.crud;
-import com.baeldung.crud.User;
import static org.assertj.core.api.Assertions.assertThat;
+
import org.junit.Test;
+import com.baeldung.crud.entities.User;
+
public class UserUnitTest {
@Test
diff --git a/spring-boot-ctx-fluent/pom.xml b/spring-boot-ctx-fluent/pom.xml
index f9b691aea7..b238374612 100644
--- a/spring-boot-ctx-fluent/pom.xml
+++ b/spring-boot-ctx-fluent/pom.xml
@@ -1,10 +1,10 @@
4.0.0
-
com.baeldung
spring-boot-ctx-fluent
0.0.1-SNAPSHOT
+ spring-boot-ctx-fluent
jar
diff --git a/spring-boot-custom-starter/greeter-library/pom.xml b/spring-boot-custom-starter/greeter-library/pom.xml
index 3717ba005c..7e0c5c4d22 100644
--- a/spring-boot-custom-starter/greeter-library/pom.xml
+++ b/spring-boot-custom-starter/greeter-library/pom.xml
@@ -1,10 +1,11 @@
4.0.0
-
com.baeldung
greeter-library
0.0.1-SNAPSHOT
+ greeter-library
+
spring-boot-custom-starter
com.baeldung
diff --git a/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml
index 5862bdd6c8..1e4ee698c6 100644
--- a/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml
+++ b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml
@@ -1,10 +1,10 @@
4.0.0
-
com.baeldung
greeter-spring-boot-autoconfigure
0.0.1-SNAPSHOT
+ greeter-spring-boot-autoconfigure
spring-boot-custom-starter
diff --git a/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml b/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml
index 88c5d1caf5..91cc41d669 100644
--- a/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml
+++ b/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml
@@ -1,10 +1,10 @@
4.0.0
-
com.baeldung
greeter-spring-boot-sample-app
0.0.1-SNAPSHOT
+ greeter-spring-boot-sample-app
spring-boot-custom-starter
diff --git a/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml b/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml
index e71882db29..560d6fa79b 100644
--- a/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml
+++ b/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml
@@ -1,10 +1,10 @@
4.0.0
-
com.baeldung
greeter-spring-boot-starter
0.0.1-SNAPSHOT
+ greeter-spring-boot-starter
spring-boot-custom-starter
diff --git a/spring-boot-custom-starter/greeter/pom.xml b/spring-boot-custom-starter/greeter/pom.xml
index 3cfd6da09e..95fcaa66c8 100644
--- a/spring-boot-custom-starter/greeter/pom.xml
+++ b/spring-boot-custom-starter/greeter/pom.xml
@@ -1,10 +1,11 @@
4.0.0
-
com.baeldung
greeter
0.0.1-SNAPSHOT
+ greeter
+
parent-boot-1
com.baeldung
diff --git a/spring-boot-custom-starter/pom.xml b/spring-boot-custom-starter/pom.xml
index 97b33ce2b8..9c03cfdd0e 100644
--- a/spring-boot-custom-starter/pom.xml
+++ b/spring-boot-custom-starter/pom.xml
@@ -4,6 +4,7 @@
com.baeldung
spring-boot-custom-starter
0.0.1-SNAPSHOT
+ spring-boot-custom-starter
pom
diff --git a/spring-boot-disable-console-logging/disabling-console-jul/pom.xml b/spring-boot-disable-console-logging/disabling-console-jul/pom.xml
index ceac0616e9..fbcd0768f9 100644
--- a/spring-boot-disable-console-logging/disabling-console-jul/pom.xml
+++ b/spring-boot-disable-console-logging/disabling-console-jul/pom.xml
@@ -2,7 +2,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
disabling-console-jul
-
+ disabling-console-jul
diff --git a/spring-boot-disable-console-logging/disabling-console-log4j2/pom.xml b/spring-boot-disable-console-logging/disabling-console-log4j2/pom.xml
index d6e9a8b5e5..6f3f01669e 100644
--- a/spring-boot-disable-console-logging/disabling-console-log4j2/pom.xml
+++ b/spring-boot-disable-console-logging/disabling-console-log4j2/pom.xml
@@ -2,7 +2,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
disabling-console-log4j2
-
+ disabling-console-log4j2
diff --git a/spring-boot-disable-console-logging/disabling-console-logback/pom.xml b/spring-boot-disable-console-logging/disabling-console-logback/pom.xml
index f18066ea03..fef0a1f4c6 100644
--- a/spring-boot-disable-console-logging/disabling-console-logback/pom.xml
+++ b/spring-boot-disable-console-logging/disabling-console-logback/pom.xml
@@ -1,11 +1,13 @@
4.0.0
+ disabling-console-logback
+ disabling-console-logback
+
com.baeldung
spring-boot-disable-console-logging
0.0.1-SNAPSHOT
- disabling-console-logback
diff --git a/spring-boot-disable-console-logging/pom.xml b/spring-boot-disable-console-logging/pom.xml
index ec84372f99..63ed129347 100644
--- a/spring-boot-disable-console-logging/pom.xml
+++ b/spring-boot-disable-console-logging/pom.xml
@@ -2,6 +2,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-boot-disable-console-logging
+ spring-boot-disable-console-logging
pom
Projects for Disabling Spring Boot Console Logging tutorials
diff --git a/spring-boot-logging-log4j2/pom.xml b/spring-boot-logging-log4j2/pom.xml
index 38dc5fb341..ad678a14cf 100644
--- a/spring-boot-logging-log4j2/pom.xml
+++ b/spring-boot-logging-log4j2/pom.xml
@@ -2,9 +2,9 @@
4.0.0
-
spring-boot-logging-log4j2
jar
+ spring-boot-logging-log4j2
Demo project for Spring Boot Logging with Log4J2
diff --git a/spring-boot-mvc/README.md b/spring-boot-mvc/README.md
index e7b42f8f50..bf32e4fc7c 100644
--- a/spring-boot-mvc/README.md
+++ b/spring-boot-mvc/README.md
@@ -9,3 +9,4 @@
- [Display RSS Feed with Spring MVC](http://www.baeldung.com/spring-mvc-rss-feed)
- [A Controller, Service and DAO Example with Spring Boot and JSF](https://www.baeldung.com/jsf-spring-boot-controller-service-dao)
- [Cache Eviction in Spring Boot](https://www.baeldung.com/spring-boot-evict-cache)
+- [Setting Up Swagger 2 with a Spring REST API](http://www.baeldung.com/swagger-2-documentation-for-spring-rest-api)
\ No newline at end of file
diff --git a/spring-boot-mvc/pom.xml b/spring-boot-mvc/pom.xml
index 5f6cdff85b..b219e53431 100644
--- a/spring-boot-mvc/pom.xml
+++ b/spring-boot-mvc/pom.xml
@@ -15,6 +15,7 @@
+
org.springframework.boot
spring-boot-starter-web
@@ -23,6 +24,7 @@
org.apache.tomcat.embed
tomcat-embed-jasper
+
org.glassfish
@@ -30,17 +32,13 @@
2.3.7
+
org.springframework.boot
spring-boot-starter-test
test
-
- org.springframework.boot
- spring-boot-starter-validation
-
-
com.rometools
@@ -48,6 +46,7 @@
${rome.version}
+
org.hibernate.validator
hibernate-validator
@@ -56,6 +55,23 @@
javax.validation
validation-api
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+
+
+ io.springfox
+ springfox-swagger2
+ ${spring.fox.version}
+
+
+ io.springfox
+ springfox-swagger-ui
+ ${spring.fox.version}
+
+
@@ -72,6 +88,7 @@
+ 2.9.2
1.10.0
com.baeldung.springbootmvc.SpringBootMvcApplication
diff --git a/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/Application.java b/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/Application.java
new file mode 100644
index 0000000000..14e46b2306
--- /dev/null
+++ b/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/Application.java
@@ -0,0 +1,13 @@
+package com.baeldung.swaggerboot;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
\ No newline at end of file
diff --git a/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/configuration/SpringFoxConfig.java b/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/configuration/SpringFoxConfig.java
new file mode 100644
index 0000000000..3041dfdcc8
--- /dev/null
+++ b/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/configuration/SpringFoxConfig.java
@@ -0,0 +1,68 @@
+package com.baeldung.swaggerboot.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger.web.*;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.Collections;
+
+@Configuration
+@EnableSwagger2
+@ComponentScan("com.baeldung.swaggerboot.controller")
+public class SpringFoxConfig {
+
+ private ApiInfo apiInfo() {
+ return new ApiInfo(
+ "My REST API",
+ "Some custom description of API.",
+ "API TOS",
+ "Terms of service",
+ new Contact("John Doe", "www.example.com", "myeaddress@company.com"),
+ "License of API",
+ "API license URL",
+ Collections.emptyList());
+ }
+
+ @Bean
+ public Docket api() {
+ return new Docket(DocumentationType.SWAGGER_2)
+ .apiInfo(apiInfo())
+ .select()
+ .apis(RequestHandlerSelectors.any())
+ .paths(PathSelectors.any())
+ .build();
+ }
+
+ /**
+ * SwaggerUI information
+ */
+
+ @Bean
+ UiConfiguration uiConfig() {
+ return UiConfigurationBuilder.builder()
+ .deepLinking(true)
+ .displayOperationId(false)
+ .defaultModelsExpandDepth(1)
+ .defaultModelExpandDepth(1)
+ .defaultModelRendering(ModelRendering.EXAMPLE)
+ .displayRequestDuration(false)
+ .docExpansion(DocExpansion.NONE)
+ .filter(false)
+ .maxDisplayedTags(null)
+ .operationsSorter(OperationsSorter.ALPHA)
+ .showExtensions(false)
+ .tagsSorter(TagsSorter.ALPHA)
+ .supportedSubmitMethods(UiConfiguration.Constants.DEFAULT_SUBMIT_METHODS)
+ .validatorUrl(null)
+ .build();
+ }
+
+}
diff --git a/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/controller/RegularRestController.java b/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/controller/RegularRestController.java
new file mode 100644
index 0000000000..676937f7d7
--- /dev/null
+++ b/spring-boot-mvc/src/main/java/com/baeldung/swaggerboot/controller/RegularRestController.java
@@ -0,0 +1,14 @@
+package com.baeldung.swaggerboot.controller;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class RegularRestController {
+
+ @GetMapping("home")
+ public String getSession() {
+ return "Hello";
+ }
+
+}
\ No newline at end of file
diff --git a/spring-boot-mvc/src/main/resources/application.properties b/spring-boot-mvc/src/main/resources/application.properties
index e69de29bb2..709574239b 100644
--- a/spring-boot-mvc/src/main/resources/application.properties
+++ b/spring-boot-mvc/src/main/resources/application.properties
@@ -0,0 +1 @@
+spring.main.allow-bean-definition-overriding=true
\ No newline at end of file
diff --git a/spring-boot-property-exp/property-exp-custom-config/pom.xml b/spring-boot-property-exp/property-exp-custom-config/pom.xml
index ab22c5ad30..9988924408 100644
--- a/spring-boot-property-exp/property-exp-custom-config/pom.xml
+++ b/spring-boot-property-exp/property-exp-custom-config/pom.xml
@@ -1,11 +1,10 @@
4.0.0
- property-exp-custom
-
com.baeldung
property-exp-custom-config
0.0.1-SNAPSHOT
+ property-exp-custom-config
jar
diff --git a/spring-boot-property-exp/property-exp-default-config/pom.xml b/spring-boot-property-exp/property-exp-default-config/pom.xml
index 4ede36e61a..7892288f45 100644
--- a/spring-boot-property-exp/property-exp-default-config/pom.xml
+++ b/spring-boot-property-exp/property-exp-default-config/pom.xml
@@ -1,11 +1,10 @@
4.0.0
- property-exp-default
-
com.baeldung
property-exp-default-config
0.0.1-SNAPSHOT
+ property-exp-default-config
jar
diff --git a/spring-boot/.attach_pid12812 b/spring-boot/.attach_pid12812
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-boot/README.MD b/spring-boot/README.MD
index f09ab27fb5..016d2841d7 100644
--- a/spring-boot/README.MD
+++ b/spring-boot/README.MD
@@ -34,4 +34,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Introduction to Chaos Monkey](https://www.baeldung.com/spring-boot-chaos-monkey)
- [Spring Component Scanning](https://www.baeldung.com/spring-component-scanning)
- [Load Spring Boot Properties From a JSON File](https://www.baeldung.com/spring-boot-json-properties)
-- [Display Auto-Configuration Report in Spring Boot](https://www.baeldung.com/spring-boot-auto-configuration-report)
\ No newline at end of file
+- [Display Auto-Configuration Report in Spring Boot](https://www.baeldung.com/spring-boot-auto-configuration-report)
+- [Injecting Git Information Into Spring](https://www.baeldung.com/spring-git-information)
diff --git a/spring-boot/pom.xml b/spring-boot/pom.xml
index f16460b7c3..87c782b044 100644
--- a/spring-boot/pom.xml
+++ b/spring-boot/pom.xml
@@ -1,4 +1,5 @@
-
4.0.0
spring-boot
@@ -55,6 +56,14 @@
org.springframework.boot
spring-boot-starter-data-jpa
+
+ org.ehcache
+ ehcache
+
+
+ org.hibernate
+ hibernate-ehcache
+
org.springframework.boot
spring-boot-starter-actuator
@@ -70,6 +79,11 @@
graphql-java-tools
${graphql-java-tools.version}
+
+ com.graphql-java
+ graphiql-spring-boot-starter
+ ${graphiql-spring-boot-starter.version}
+
org.springframework.boot
@@ -143,10 +157,10 @@
chaos-monkey-spring-boot
${chaos.monkey.version}
-
+
- javax.validation
- validation-api
+ javax.validation
+ validation-api
@@ -170,6 +184,26 @@
pl.project13.maven
git-commit-id-plugin
${git-commit-id-plugin.version}
+
+
+ get-the-git-infos
+
+ revision
+
+ initialize
+
+
+ validate-the-git-infos
+
+ validateRevision
+
+ package
+
+
+
+ true
+ ${project.build.outputDirectory}/git.properties
+
@@ -220,10 +254,11 @@
2.4.1.Final
1.9.0
2.0.0
- 3.6.0
- 3.2.0
+ 5.0.2
+ 5.0.2
+ 5.2.4
18.0
- 2.2.4
+ 2.2.4
diff --git a/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java b/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java
index e079b9a665..cc05fd4fbd 100644
--- a/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java
+++ b/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java
@@ -30,7 +30,7 @@ public class ContactInfoValidator implements ConstraintValidator {
- Optional findOne(String id);
+ Optional findById(String id);
}
diff --git a/spring-boot/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java b/spring-boot/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java
index 3489732b6f..7bd5c36786 100644
--- a/spring-boot/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java
+++ b/spring-boot/src/main/java/com/baeldung/failureanalyzer/FailureAnalyzerApplication.java
@@ -9,7 +9,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
public class FailureAnalyzerApplication {
@RolesAllowed("*")
public static void main(String[] args) {
- System.setProperty("security.basic.enabled", "false");
SpringApplication.run(FailureAnalyzerApplication.class, args);
}
}
diff --git a/spring-boot/src/main/java/com/baeldung/internationalization/InternationalizationApp.java b/spring-boot/src/main/java/com/baeldung/internationalization/InternationalizationApp.java
index c92d1c32e6..c3af611f3b 100644
--- a/spring-boot/src/main/java/com/baeldung/internationalization/InternationalizationApp.java
+++ b/spring-boot/src/main/java/com/baeldung/internationalization/InternationalizationApp.java
@@ -9,7 +9,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
public class InternationalizationApp {
@RolesAllowed("*")
public static void main(String[] args) {
- System.setProperty("security.basic.enabled", "false");
SpringApplication.run(InternationalizationApp.class, args);
}
}
diff --git a/spring-boot/src/main/java/com/baeldung/rss/RssApp.java b/spring-boot/src/main/java/com/baeldung/rss/RssApp.java
index d3d3d0241f..e067d3cfd1 100644
--- a/spring-boot/src/main/java/com/baeldung/rss/RssApp.java
+++ b/spring-boot/src/main/java/com/baeldung/rss/RssApp.java
@@ -1,18 +1,17 @@
package com.baeldung.rss;
+import javax.annotation.security.RolesAllowed;
+
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
-import javax.annotation.security.RolesAllowed;
-
@SpringBootApplication
@ComponentScan(basePackages = "com.baeldung.rss")
public class RssApp {
@RolesAllowed("*")
public static void main(String[] args) {
- System.setProperty("security.basic.enabled", "false");
SpringApplication.run(RssApp.class, args);
}
diff --git a/spring-boot/src/main/java/com/baeldung/toggle/ToggleApplication.java b/spring-boot/src/main/java/com/baeldung/toggle/ToggleApplication.java
index 27be6b7cca..fa84cf0d9b 100644
--- a/spring-boot/src/main/java/com/baeldung/toggle/ToggleApplication.java
+++ b/spring-boot/src/main/java/com/baeldung/toggle/ToggleApplication.java
@@ -9,7 +9,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
public class ToggleApplication {
@RolesAllowed("*")
public static void main(String[] args) {
- System.setProperty("security.basic.enabled", "false");
SpringApplication.run(ToggleApplication.class, args);
}
}
diff --git a/spring-boot/src/main/java/org/baeldung/session/exception/Application.java b/spring-boot/src/main/java/org/baeldung/session/exception/Application.java
index 9132e710d1..354c64c258 100644
--- a/spring-boot/src/main/java/org/baeldung/session/exception/Application.java
+++ b/spring-boot/src/main/java/org/baeldung/session/exception/Application.java
@@ -4,8 +4,6 @@ import org.baeldung.demo.model.Foo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
-import org.springframework.context.annotation.Bean;
-import org.springframework.orm.jpa.vendor.HibernateJpaSessionFactoryBean;
@EntityScan(basePackageClasses = Foo.class)
@SpringBootApplication
@@ -15,9 +13,4 @@ public class Application {
System.setProperty("spring.profiles.active", "exception");
SpringApplication.run(Application.class, args);
}
-
- @Bean
- public HibernateJpaSessionFactoryBean sessionFactory() {
- return new HibernateJpaSessionFactoryBean();
- }
}
diff --git a/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepositoryImpl.java b/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepositoryImpl.java
index 52407a2117..607bae83ba 100644
--- a/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepositoryImpl.java
+++ b/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepositoryImpl.java
@@ -1,5 +1,7 @@
package org.baeldung.session.exception.repository;
+import javax.persistence.EntityManagerFactory;
+
import org.baeldung.demo.model.Foo;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -10,16 +12,15 @@ import org.springframework.stereotype.Repository;
@Repository
public class FooRepositoryImpl implements FooRepository {
@Autowired
- private SessionFactory sessionFactory;
+ private EntityManagerFactory emf;
@Override
public void save(Foo foo) {
- sessionFactory.getCurrentSession().saveOrUpdate(foo);
+ emf.unwrap(SessionFactory.class).getCurrentSession().saveOrUpdate(foo);
}
@Override
public Foo get(Integer id) {
- return sessionFactory.getCurrentSession().get(Foo.class, id);
+ return emf.unwrap(SessionFactory.class).getCurrentSession().get(Foo.class, id);
}
-
}
\ No newline at end of file
diff --git a/spring-boot/src/main/resources/META-INF/spring.factories b/spring-boot/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000000..e3d3aa4c8e
--- /dev/null
+++ b/spring-boot/src/main/resources/META-INF/spring.factories
@@ -0,0 +1 @@
+org.springframework.boot.diagnostics.FailureAnalyzer=com.baeldung.failureanalyzer.MyBeanNotOfRequiredTypeFailureAnalyzer
\ No newline at end of file
diff --git a/spring-boot/src/main/resources/application.properties b/spring-boot/src/main/resources/application.properties
index 629e880940..6a52dd1f70 100644
--- a/spring-boot/src/main/resources/application.properties
+++ b/spring-boot/src/main/resources/application.properties
@@ -7,7 +7,7 @@ spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto = update
management.endpoints.jmx.domain=Spring Sample Application
-management.endpoints.jmx.uniqueNames=true
+spring.jmx.unique-names=true
management.endpoints.web.exposure.include=*
management.endpoint.shutdown.enabled=true
@@ -17,7 +17,6 @@ management.endpoint.shutdown.enabled=true
##endpoints.jolokia.path=jolokia
spring.jmx.enabled=true
-management.endpoints.jmx.enabled=true
## for pretty printing of json when endpoints accessed over HTTP
http.mappers.jsonPrettyPrint=true
diff --git a/spring-boot/src/main/resources/demo.properties b/spring-boot/src/main/resources/demo.properties
index 649b64f59b..6b4cbeb7a0 100644
--- a/spring-boot/src/main/resources/demo.properties
+++ b/spring-boot/src/main/resources/demo.properties
@@ -1,6 +1,2 @@
spring.output.ansi.enabled=never
server.port=7070
-
-# Security
-security.user.name=admin
-security.user.password=password
\ No newline at end of file
diff --git a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentIntegrationTest.java
index 2c3ac2e159..8c85934fac 100644
--- a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentIntegrationTest.java
+++ b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentIntegrationTest.java
@@ -20,7 +20,6 @@ import static org.junit.Assert.assertTrue;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringBootAnnotatedApp.class)
-@TestPropertySource(properties = { "security.basic.enabled=false" })
public class SpringBootWithServletComponentIntegrationTest {
@Autowired
diff --git a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentIntegrationTest.java
index a30d3ed3f2..c29cd75e9d 100644
--- a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentIntegrationTest.java
+++ b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithoutServletComponentIntegrationTest.java
@@ -19,7 +19,6 @@ import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringBootPlainApp.class)
-@TestPropertySource(properties = { "security.basic.enabled=false" })
public class SpringBootWithoutServletComponentIntegrationTest {
@Autowired
diff --git a/spring-boot/src/test/java/com/baeldung/displayallbeans/DisplayBeanIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/displayallbeans/DisplayBeanIntegrationTest.java
index aab4836b6f..e933920a96 100644
--- a/spring-boot/src/test/java/com/baeldung/displayallbeans/DisplayBeanIntegrationTest.java
+++ b/spring-boot/src/test/java/com/baeldung/displayallbeans/DisplayBeanIntegrationTest.java
@@ -1,31 +1,34 @@
package com.baeldung.displayallbeans;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.BDDAssertions.then;
+
+import java.net.URI;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.actuate.beans.BeansEndpoint.ContextBeans;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.web.context.WebApplicationContext;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import static org.assertj.core.api.BDDAssertions.then;
-import static org.hamcrest.CoreMatchers.hasItem;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
-@TestPropertySource(properties = { "management.port=0", "endpoints.beans.id=springbeans", "endpoints.beans.sensitive=false" })
+@TestPropertySource(properties = { "management.port=0", "management.endpoints.web.exposure.include=*" })
public class DisplayBeanIntegrationTest {
@LocalServerPort
@@ -40,6 +43,8 @@ public class DisplayBeanIntegrationTest {
@Autowired
private WebApplicationContext context;
+ private static final String ACTUATOR_PATH = "/actuator";
+
@Test
public void givenRestTemplate_whenAccessServerUrl_thenHttpStatusOK() throws Exception {
ResponseEntity entity = this.testRestTemplate.getForEntity("http://localhost:" + this.port + "/displayallbeans", String.class);
@@ -49,22 +54,27 @@ public class DisplayBeanIntegrationTest {
@Test
public void givenRestTemplate_whenAccessEndpointUrl_thenHttpStatusOK() throws Exception {
- @SuppressWarnings("rawtypes")
- ResponseEntity entity = this.testRestTemplate.getForEntity("http://localhost:" + this.mgt + "/springbeans", List.class);
+ ParameterizedTypeReference> responseType = new ParameterizedTypeReference>() {
+ };
+ RequestEntity requestEntity = RequestEntity.get(new URI("http://localhost:" + this.mgt + ACTUATOR_PATH + "/beans"))
+ .accept(MediaType.APPLICATION_JSON)
+ .build();
+ ResponseEntity> entity = this.testRestTemplate.exchange(requestEntity, responseType);
then(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
}
@Test
public void givenRestTemplate_whenAccessEndpointUrl_thenReturnsBeanNames() throws Exception {
- @SuppressWarnings("rawtypes")
- ResponseEntity entity = this.testRestTemplate.getForEntity("http://localhost:" + this.mgt + "/springbeans", List.class);
+ RequestEntity requestEntity = RequestEntity.get(new URI("http://localhost:" + this.mgt + ACTUATOR_PATH + "/beans"))
+ .accept(MediaType.APPLICATION_JSON)
+ .build();
+ ResponseEntity entity = this.testRestTemplate.exchange(requestEntity, BeanActuatorResponse.class);
- List> allBeans = (List) ((Map) entity.getBody().get(0)).get("beans");
- List beanNamesList = allBeans.stream().map(x -> (String) x.get("bean")).collect(Collectors.toList());
+ Collection beanNamesList = entity.getBody()
+ .getBeans();
- assertThat(beanNamesList, hasItem("fooController"));
- assertThat(beanNamesList, hasItem("fooService"));
+ assertThat(beanNamesList).contains("fooController", "fooService");
}
@Test
@@ -72,7 +82,20 @@ public class DisplayBeanIntegrationTest {
String[] beanNames = context.getBeanDefinitionNames();
List beanNamesList = Arrays.asList(beanNames);
- assertTrue(beanNamesList.contains("fooController"));
- assertTrue(beanNamesList.contains("fooService"));
+ assertThat(beanNamesList).contains("fooController", "fooService");
+ }
+
+ private static class BeanActuatorResponse {
+ private Map>>> contexts;
+
+ public Collection getBeans() {
+ return this.contexts.get("application")
+ .get("beans")
+ .keySet();
+ }
+
+ public Map>>> getContexts() {
+ return contexts;
+ }
}
}
diff --git a/spring-boot/src/test/java/com/baeldung/failureanalyzer/FailureAnalyzerAppIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/failureanalyzer/FailureAnalyzerAppIntegrationTest.java
new file mode 100644
index 0000000000..b3555f55da
--- /dev/null
+++ b/spring-boot/src/test/java/com/baeldung/failureanalyzer/FailureAnalyzerAppIntegrationTest.java
@@ -0,0 +1,47 @@
+package com.baeldung.failureanalyzer;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Collection;
+import java.util.stream.Collectors;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.BeanCreationException;
+import org.springframework.boot.SpringApplication;
+
+import com.baeldung.failureanalyzer.utils.ListAppender;
+
+import ch.qos.logback.classic.spi.ILoggingEvent;
+
+public class FailureAnalyzerAppIntegrationTest {
+
+ private static final String EXPECTED_ANALYSIS_DESCRIPTION_TITLE = "Description:";
+ private static final String EXPECTED_ANALYSIS_DESCRIPTION_CONTENT = "The bean myDAO could not be injected as com.baeldung.failureanalyzer.MyDAO because it is of type com.baeldung.failureanalyzer.MySecondDAO";
+ private static final String EXPECTED_ANALYSIS_ACTION_TITLE = "Action:";
+ private static final String EXPECTED_ANALYSIS_ACTION_CONTENT = "Consider creating a bean with name myDAO of type com.baeldung.failureanalyzer.MyDAO";
+
+ @BeforeEach
+ public void clearLogList() {
+ ListAppender.clearEventList();
+ }
+
+ @Test
+ public void givenBeanCreationErrorInContext_whenContextLoaded_thenFailureAnalyzerLogsReport() {
+ try {
+ SpringApplication.run(FailureAnalyzerApplication.class);
+ } catch (BeanCreationException e) {
+ Collection allLoggedEntries = ListAppender.getEvents()
+ .stream()
+ .map(ILoggingEvent::getFormattedMessage)
+ .collect(Collectors.toList());
+ assertThat(allLoggedEntries).anyMatch(entry -> entry.contains(EXPECTED_ANALYSIS_DESCRIPTION_TITLE))
+ .anyMatch(entry -> entry.contains(EXPECTED_ANALYSIS_DESCRIPTION_CONTENT))
+ .anyMatch(entry -> entry.contains(EXPECTED_ANALYSIS_ACTION_TITLE))
+ .anyMatch(entry -> entry.contains(EXPECTED_ANALYSIS_ACTION_CONTENT));
+ return;
+ }
+ throw new IllegalStateException("Context load should be failing due to a BeanCreationException!");
+ }
+
+}
diff --git a/spring-boot/src/test/java/com/baeldung/failureanalyzer/utils/ListAppender.java b/spring-boot/src/test/java/com/baeldung/failureanalyzer/utils/ListAppender.java
new file mode 100644
index 0000000000..a298f49ff5
--- /dev/null
+++ b/spring-boot/src/test/java/com/baeldung/failureanalyzer/utils/ListAppender.java
@@ -0,0 +1,25 @@
+package com.baeldung.failureanalyzer.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.AppenderBase;
+
+public class ListAppender extends AppenderBase {
+
+ static private List events = new ArrayList<>();
+
+ @Override
+ protected void append(ILoggingEvent eventObject) {
+ events.add(eventObject);
+ }
+
+ public static List getEvents() {
+ return events;
+ }
+
+ public static void clearEventList() {
+ events.clear();
+ }
+}
\ No newline at end of file
diff --git a/spring-boot/src/test/java/com/baeldung/git/CommitIdIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/git/CommitIdIntegrationTest.java
index 348d594c05..d7399a4ff5 100644
--- a/spring-boot/src/test/java/com/baeldung/git/CommitIdIntegrationTest.java
+++ b/spring-boot/src/test/java/com/baeldung/git/CommitIdIntegrationTest.java
@@ -1,17 +1,19 @@
package com.baeldung.git;
+import static org.assertj.core.api.Assertions.assertThat;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
-import static org.assertj.core.api.Assertions.assertThat;
-
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = CommitIdApplication.class)
+@TestPropertySource(properties = { "spring.jmx.default-domain=test" })
public class CommitIdIntegrationTest {
private static final Logger LOG = LoggerFactory.getLogger(CommitIdIntegrationTest.class);
diff --git a/spring-boot/src/test/java/com/baeldung/intro/AppLiveTest.java b/spring-boot/src/test/java/com/baeldung/intro/AppLiveTest.java
index 83b893ae5c..44461c0cf6 100644
--- a/spring-boot/src/test/java/com/baeldung/intro/AppLiveTest.java
+++ b/spring-boot/src/test/java/com/baeldung/intro/AppLiveTest.java
@@ -18,7 +18,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc
-@TestPropertySource(properties = { "security.basic.enabled=false" })
public class AppLiveTest {
@Autowired
diff --git a/spring-boot/src/test/java/com/baeldung/kong/KongAdminAPILiveTest.java b/spring-boot/src/test/java/com/baeldung/kong/KongAdminAPILiveTest.java
index 5cf19dd1db..92d2286518 100644
--- a/spring-boot/src/test/java/com/baeldung/kong/KongAdminAPILiveTest.java
+++ b/spring-boot/src/test/java/com/baeldung/kong/KongAdminAPILiveTest.java
@@ -55,7 +55,7 @@ public class KongAdminAPILiveTest {
public void givenKongAdminAPI_whenAddAPI_thenAPIAccessibleViaKong() throws Exception {
restTemplate.delete("http://localhost:8001/apis/stock-api");
- APIObject stockAPI = new APIObject("stock-api", "stock.api", "http://localhost:8080", "/");
+ APIObject stockAPI = new APIObject("stock-api", "stock.api", "http://localhost:9090", "/");
HttpEntity apiEntity = new HttpEntity<>(stockAPI);
ResponseEntity addAPIResp = restTemplate.postForEntity("http://localhost:8001/apis", apiEntity, String.class);
@@ -69,7 +69,7 @@ public class KongAdminAPILiveTest {
HttpHeaders headers = new HttpHeaders();
headers.set("Host", "stock.api");
- RequestEntity requestEntity = new RequestEntity<>(headers, HttpMethod.GET, new URI("http://localhost:8000/stock/btc"));
+ RequestEntity requestEntity = new RequestEntity<>(headers, HttpMethod.GET, new URI("http://localhost:8000/springbootapp/stock/btc"));
ResponseEntity stockPriceResp = restTemplate.exchange(requestEntity, String.class);
assertEquals("10000", stockPriceResp.getBody());
@@ -126,22 +126,26 @@ public class KongAdminAPILiveTest {
givenKongAdminAPI_whenAddAPIConsumer_thenAdded();
}
+ PluginObject authPlugin = new PluginObject("key-auth");
+ ResponseEntity enableAuthResp = restTemplate.postForEntity("http://localhost:8001/apis/stock-api/plugins", new HttpEntity<>(authPlugin), String.class);
+ assertTrue(HttpStatus.CREATED == enableAuthResp.getStatusCode() || HttpStatus.CONFLICT == enableAuthResp.getStatusCode());
+
final String consumerKey = "eugenp.pass";
KeyAuthObject keyAuth = new KeyAuthObject(consumerKey);
ResponseEntity keyAuthResp = restTemplate.postForEntity("http://localhost:8001/consumers/eugenp/key-auth", new HttpEntity<>(keyAuth), String.class);
-
+
assertTrue(HttpStatus.CREATED == keyAuthResp.getStatusCode() || HttpStatus.CONFLICT == keyAuthResp.getStatusCode());
HttpHeaders headers = new HttpHeaders();
headers.set("Host", "stock.api");
headers.set("apikey", consumerKey);
- RequestEntity requestEntity = new RequestEntity<>(headers, HttpMethod.GET, new URI("http://localhost:8000/stock/btc"));
+ RequestEntity requestEntity = new RequestEntity<>(headers, HttpMethod.GET, new URI("http://localhost:8000/springbootapp/stock/btc"));
ResponseEntity stockPriceResp = restTemplate.exchange(requestEntity, String.class);
assertEquals("10000", stockPriceResp.getBody());
headers.set("apikey", "wrongpass");
- requestEntity = new RequestEntity<>(headers, HttpMethod.GET, new URI("http://localhost:8000/stock/btc"));
+ requestEntity = new RequestEntity<>(headers, HttpMethod.GET, new URI("http://localhost:8000/springbootapp/stock/btc"));
stockPriceResp = restTemplate.exchange(requestEntity, String.class);
assertEquals(HttpStatus.FORBIDDEN, stockPriceResp.getStatusCode());
}
diff --git a/spring-boot/src/test/java/com/baeldung/kong/KongLoadBalanceLiveTest.java b/spring-boot/src/test/java/com/baeldung/kong/KongLoadBalanceLiveTest.java
index abc7151720..7cf67453a6 100644
--- a/spring-boot/src/test/java/com/baeldung/kong/KongLoadBalanceLiveTest.java
+++ b/spring-boot/src/test/java/com/baeldung/kong/KongLoadBalanceLiveTest.java
@@ -1,28 +1,34 @@
package com.baeldung.kong;
-import com.baeldung.kong.domain.APIObject;
-import com.baeldung.kong.domain.TargetObject;
-import com.baeldung.kong.domain.UpstreamObject;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.DEFINED_PORT;
+
+import java.net.URI;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
-import org.springframework.http.*;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.RequestEntity;
+import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;
-import java.net.URI;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.DEFINED_PORT;
+import com.baeldung.kong.domain.APIObject;
+import com.baeldung.kong.domain.TargetObject;
+import com.baeldung.kong.domain.UpstreamObject;
/**
* @author aiet
*/
@RunWith(SpringRunner.class)
-@SpringBootTest(webEnvironment = DEFINED_PORT, classes = StockApp.class)
+@SpringBootTest(webEnvironment = DEFINED_PORT, classes = StockApp.class, properties = "server.servlet.contextPath=/springbootapp")
public class KongLoadBalanceLiveTest {
@Before
@@ -55,13 +61,13 @@ public class KongLoadBalanceLiveTest {
HttpHeaders headers = new HttpHeaders();
headers.set("Host", "balanced.stock.api");
for (int i = 0; i < 1000; i++) {
- RequestEntity requestEntity = new RequestEntity<>(headers, HttpMethod.GET, new URI("http://localhost:8000/stock/btc"));
+ RequestEntity requestEntity = new RequestEntity<>(headers, HttpMethod.GET, new URI("http://localhost:8000/springbootapp/stock/btc"));
ResponseEntity stockPriceResp = restTemplate.exchange(requestEntity, String.class);
assertEquals("10000", stockPriceResp.getBody());
}
- int releaseCount = restTemplate.getForObject("http://localhost:9090/stock/reqcount", Integer.class);
- int testCount = restTemplate.getForObject("http://localhost:8080/stock/reqcount", Integer.class);
+ int releaseCount = restTemplate.getForObject("http://localhost:9090/springbootapp/stock/reqcount", Integer.class);
+ int testCount = restTemplate.getForObject("http://localhost:8080/springbootapp/stock/reqcount", Integer.class);
assertTrue(Math.round(releaseCount * 1.0 / testCount) == 4);
}
diff --git a/spring-boot/src/test/java/com/baeldung/mongodb/ManualEmbeddedMongoDbIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/mongodb/ManualEmbeddedMongoDbIntegrationTest.java
index 30a4d61fbd..c49b99ed99 100644
--- a/spring-boot/src/test/java/com/baeldung/mongodb/ManualEmbeddedMongoDbIntegrationTest.java
+++ b/spring-boot/src/test/java/com/baeldung/mongodb/ManualEmbeddedMongoDbIntegrationTest.java
@@ -7,6 +7,7 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.util.SocketUtils;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DBObject;
@@ -32,16 +33,16 @@ class ManualEmbeddedMongoDbIntegrationTest {
@BeforeEach
void setup() throws Exception {
String ip = "localhost";
- int port = 27017;
+ int randomPort = SocketUtils.findAvailableTcpPort();
IMongodConfig mongodConfig = new MongodConfigBuilder().version(Version.Main.PRODUCTION)
- .net(new Net(ip, port, Network.localhostIsIPv6()))
+ .net(new Net(ip, randomPort, Network.localhostIsIPv6()))
.build();
MongodStarter starter = MongodStarter.getDefaultInstance();
mongodExecutable = starter.prepare(mongodConfig);
mongodExecutable.start();
- mongoTemplate = new MongoTemplate(new MongoClient(ip, port), "test");
+ mongoTemplate = new MongoTemplate(new MongoClient(ip, randomPort), "test");
}
@DisplayName("Given object When save object using MongoDB template Then object can be found")
diff --git a/spring-boot/src/test/java/com/baeldung/mongodb/MongoDbSpringIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/mongodb/MongoDbSpringIntegrationTest.java
index 5431217c3e..39127f62e9 100644
--- a/spring-boot/src/test/java/com/baeldung/mongodb/MongoDbSpringIntegrationTest.java
+++ b/spring-boot/src/test/java/com/baeldung/mongodb/MongoDbSpringIntegrationTest.java
@@ -2,6 +2,7 @@ package com.baeldung.mongodb;
import static org.assertj.core.api.Assertions.assertThat;
+import org.baeldung.boot.Application;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
diff --git a/spring-boot/src/test/resources/application.properties b/spring-boot/src/test/resources/application.properties
index 85e4e6e66f..9ad65e1815 100644
--- a/spring-boot/src/test/resources/application.properties
+++ b/spring-boot/src/test/resources/application.properties
@@ -2,7 +2,6 @@ spring.mail.host=localhost
spring.mail.port=8025
spring.mail.properties.mail.smtp.auth=false
-security.basic.enabled=false
# spring.datasource.x
spring.datasource.driver-class-name=org.h2.Driver
@@ -11,9 +10,10 @@ spring.datasource.username=sa
spring.datasource.password=sa
# hibernate.X
-hibernate.dialect=org.hibernate.dialect.H2Dialect
-hibernate.show_sql=true
-hibernate.hbm2ddl.auto=create-drop
-hibernate.cache.use_second_level_cache=true
-hibernate.cache.use_query_cache=true
-hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
\ No newline at end of file
+spring.jpa.hibernate.dialect=org.hibernate.dialect.H2Dialect
+spring.jpa.hibernate.ddl-auto=create-drop
+spring.jpa.hibernate.show_sql=true
+spring.jpa.hibernate.hbm2ddl.auto=create-drop
+spring.jpa.hibernate.cache.use_second_level_cache=true
+spring.jpa.hibernate.cache.use_query_cache=true
+spring.jpa.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
diff --git a/spring-boot/src/test/resources/exception.properties b/spring-boot/src/test/resources/exception.properties
index c55e415a3a..2d17b64a25 100644
--- a/spring-boot/src/test/resources/exception.properties
+++ b/spring-boot/src/test/resources/exception.properties
@@ -1,6 +1,2 @@
-# Security
-security.user.name=admin
-security.user.password=password
-
spring.dao.exceptiontranslation.enabled=false
-spring.profiles.active=exception
\ No newline at end of file
+spring.profiles.active=exception
diff --git a/spring-boot/src/test/resources/logback-test.xml b/spring-boot/src/test/resources/logback-test.xml
new file mode 100644
index 0000000000..9e0f4e221f
--- /dev/null
+++ b/spring-boot/src/test/resources/logback-test.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-cloud-bus/pom.xml b/spring-cloud-bus/pom.xml
index d493c4e984..784e4cbae6 100644
--- a/spring-cloud-bus/pom.xml
+++ b/spring-cloud-bus/pom.xml
@@ -7,6 +7,7 @@
spring-cloud-bus
1.0.0-SNAPSHOT
pom
+ spring-cloud-bus
parent-boot-1
diff --git a/spring-cloud-data-flow/data-flow-server/pom.xml b/spring-cloud-data-flow/data-flow-server/pom.xml
index 0133d65978..a02d2984c1 100644
--- a/spring-cloud-data-flow/data-flow-server/pom.xml
+++ b/spring-cloud-data-flow/data-flow-server/pom.xml
@@ -3,7 +3,6 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- org.baeldung.spring.cloud
data-flow-server
0.0.1-SNAPSHOT
jar
diff --git a/spring-cloud-data-flow/data-flow-shell/pom.xml b/spring-cloud-data-flow/data-flow-shell/pom.xml
index e4ec145277..3b155736c3 100644
--- a/spring-cloud-data-flow/data-flow-shell/pom.xml
+++ b/spring-cloud-data-flow/data-flow-shell/pom.xml
@@ -3,7 +3,6 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- org.baeldung.spring.cloud
data-flow-shell
0.0.1-SNAPSHOT
jar
diff --git a/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml b/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml
index 468d8e17d0..779a4a803a 100644
--- a/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml
+++ b/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml
@@ -4,7 +4,6 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- com.customer
customer-mongodb-sink
jar
diff --git a/spring-cloud-data-flow/etl/customer-transform/pom.xml b/spring-cloud-data-flow/etl/customer-transform/pom.xml
index bc4b648907..c344b0fc57 100644
--- a/spring-cloud-data-flow/etl/customer-transform/pom.xml
+++ b/spring-cloud-data-flow/etl/customer-transform/pom.xml
@@ -4,7 +4,6 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- com.customer
customer-transform
0.0.1-SNAPSHOT
jar
diff --git a/spring-cloud-data-flow/etl/pom.xml b/spring-cloud-data-flow/etl/pom.xml
index 2b904f6e0d..7d5040e8ad 100644
--- a/spring-cloud-data-flow/etl/pom.xml
+++ b/spring-cloud-data-flow/etl/pom.xml
@@ -1,13 +1,13 @@
4.0.0
- org.baeldung.spring.cloud
- etl-spring-cloud-data-flow
+ etl
+ etl
0.0.1-SNAPSHOT
pom
-
+
- org.baeldung.spring.cloud
+ com.baeldung
spring-cloud-data-flow
0.0.1-SNAPSHOT
diff --git a/spring-cloud-data-flow/log-sink/pom.xml b/spring-cloud-data-flow/log-sink/pom.xml
index 33a0a4df45..69de679c2a 100644
--- a/spring-cloud-data-flow/log-sink/pom.xml
+++ b/spring-cloud-data-flow/log-sink/pom.xml
@@ -3,7 +3,6 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- org.baeldung.spring.cloud
log-sink
0.0.1-SNAPSHOT
jar
diff --git a/spring-cloud-data-flow/pom.xml b/spring-cloud-data-flow/pom.xml
index 5a007f3c7d..b5ef5d2c2a 100644
--- a/spring-cloud-data-flow/pom.xml
+++ b/spring-cloud-data-flow/pom.xml
@@ -1,11 +1,11 @@
4.0.0
- org.baeldung.spring.cloud
spring-cloud-data-flow
0.0.1-SNAPSHOT
pom
-
+ spring-cloud-data-flow
+
com.baeldung
parent-modules
diff --git a/spring-cloud-data-flow/time-processor/pom.xml b/spring-cloud-data-flow/time-processor/pom.xml
index 4f31e55b96..e630df1865 100644
--- a/spring-cloud-data-flow/time-processor/pom.xml
+++ b/spring-cloud-data-flow/time-processor/pom.xml
@@ -3,7 +3,6 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- org.baeldung.spring.cloud
time-processor
0.0.1-SNAPSHOT
jar
diff --git a/spring-cloud-data-flow/time-source/pom.xml b/spring-cloud-data-flow/time-source/pom.xml
index dc593fdb14..649af32cf0 100644
--- a/spring-cloud-data-flow/time-source/pom.xml
+++ b/spring-cloud-data-flow/time-source/pom.xml
@@ -3,7 +3,6 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- org.baeldung.spring.cloud
time-source
0.0.1-SNAPSHOT
jar
diff --git a/spring-cloud/README.md b/spring-cloud/README.md
index 16bc2d110a..dc43bd1a66 100644
--- a/spring-cloud/README.md
+++ b/spring-cloud/README.md
@@ -30,3 +30,4 @@
- [Introduction to Netflix Archaius with Spring Cloud](https://www.baeldung.com/netflix-archaius-spring-cloud-integration)
- [An Intro to Spring Cloud Vault](https://www.baeldung.com/spring-cloud-vault)
- [Netflix Archaius with Various Database Configurations](https://www.baeldung.com/netflix-archaius-database-configurations)
+- [Rate Limiting in Spring Cloud Netflix Zuul](https://www.baeldung.com/spring-cloud-zuul-rate-limit)
diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml
index 2fd15202e6..28db4a7a3d 100644
--- a/spring-cloud/pom.xml
+++ b/spring-cloud/pom.xml
@@ -57,8 +57,8 @@
Brixton.SR7
1.2.2.RELEASE
1.2.2.RELEASE
- 1.2.3.RELEASE
- 1.2.3.RELEASE
+ 2.0.2.RELEASE
+ 1.4.6.RELEASE
1.2.3.RELEASE
1.3.0.RELEASE
1.4.2.RELEASE
diff --git a/spring-cloud/spring-cloud-archaius/dynamodb-config/pom.xml b/spring-cloud/spring-cloud-archaius/dynamodb-config/pom.xml
index 3ffbf8f619..96f6c8711e 100644
--- a/spring-cloud/spring-cloud-archaius/dynamodb-config/pom.xml
+++ b/spring-cloud/spring-cloud-archaius/dynamodb-config/pom.xml
@@ -3,6 +3,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
dynamodb-config
+ dynamodb-config
jar
diff --git a/spring-cloud/spring-cloud-archaius/jdbc-config/pom.xml b/spring-cloud/spring-cloud-archaius/jdbc-config/pom.xml
index bb283576d8..59dea4890e 100644
--- a/spring-cloud/spring-cloud-archaius/jdbc-config/pom.xml
+++ b/spring-cloud/spring-cloud-archaius/jdbc-config/pom.xml
@@ -3,6 +3,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
jdbc-config
+ jdbc-config
jar
diff --git a/spring-cloud/spring-cloud-archaius/zookeeper-config/pom.xml b/spring-cloud/spring-cloud-archaius/zookeeper-config/pom.xml
index 8f8ec99ad8..51010eefb2 100644
--- a/spring-cloud/spring-cloud-archaius/zookeeper-config/pom.xml
+++ b/spring-cloud/spring-cloud-archaius/zookeeper-config/pom.xml
@@ -3,6 +3,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
zookeeper-config
+ zookeeper-config
jar
diff --git a/spring-cloud/spring-cloud-aws/pom.xml b/spring-cloud/spring-cloud-aws/pom.xml
index 09518483a4..7edabd03f5 100644
--- a/spring-cloud/spring-cloud-aws/pom.xml
+++ b/spring-cloud/spring-cloud-aws/pom.xml
@@ -5,7 +5,7 @@
com.baeldung.spring.cloud
spring-cloud-aws
jar
- Spring Cloud AWS
+ spring-cloud-aws
Spring Cloud AWS Examples
diff --git a/spring-cloud/spring-cloud-bootstrap/config/pom.xml b/spring-cloud/spring-cloud-bootstrap/config/pom.xml
index 14a926fc2c..1379af0b05 100644
--- a/spring-cloud/spring-cloud-bootstrap/config/pom.xml
+++ b/spring-cloud/spring-cloud-bootstrap/config/pom.xml
@@ -4,6 +4,7 @@
4.0.0
config
1.0.0-SNAPSHOT
+ config
parent-boot-1
diff --git a/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml b/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml
index f94d8829f6..735d3745d7 100644
--- a/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml
+++ b/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml
@@ -2,9 +2,9 @@
4.0.0
-
discovery
1.0.0-SNAPSHOT
+ discovery
parent-boot-1
diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml b/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml
index fc69c16738..2efa926e3a 100644
--- a/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml
+++ b/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml
@@ -4,6 +4,7 @@
4.0.0
gateway
1.0.0-SNAPSHOT
+ gateway
parent-boot-1
diff --git a/spring-cloud/spring-cloud-bootstrap/pom.xml b/spring-cloud/spring-cloud-bootstrap/pom.xml
index 74801159eb..46460c0d74 100644
--- a/spring-cloud/spring-cloud-bootstrap/pom.xml
+++ b/spring-cloud/spring-cloud-bootstrap/pom.xml
@@ -4,6 +4,7 @@
4.0.0
spring-cloud-bootstrap
1.0.0-SNAPSHOT
+ spring-cloud-bootstrap
pom
diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml b/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml
index c0d920d373..eb855a91e3 100644
--- a/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml
+++ b/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml
@@ -2,10 +2,10 @@
4.0.0
-
com.baeldung.spring.cloud
svc-book
1.0.0-SNAPSHOT
+ svc-book
parent-boot-1
diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml b/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml
index 3aa2db8f65..7c1e93bad1 100644
--- a/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml
+++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml
@@ -2,10 +2,10 @@
4.0.0
-
com.baeldung.spring.cloud
svc-rating
1.0.0-SNAPSHOT
+ svc-rating
parent-boot-1
diff --git a/spring-cloud/spring-cloud-bootstrap/zipkin/pom.xml b/spring-cloud/spring-cloud-bootstrap/zipkin/pom.xml
index 8735e24d48..1bf9ecb9e7 100644
--- a/spring-cloud/spring-cloud-bootstrap/zipkin/pom.xml
+++ b/spring-cloud/spring-cloud-bootstrap/zipkin/pom.xml
@@ -4,6 +4,7 @@
4.0.0
zipkin
1.0.0-SNAPSHOT
+ zipkin
parent-boot-1
diff --git a/spring-cloud/spring-cloud-config/client/pom.xml b/spring-cloud/spring-cloud-config/client/pom.xml
index 800a496a82..c55f9bc471 100644
--- a/spring-cloud/spring-cloud-config/client/pom.xml
+++ b/spring-cloud/spring-cloud-config/client/pom.xml
@@ -3,13 +3,14 @@
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
+ client
+ client
+
com.baeldung.spring.cloud
spring-cloud-config
1.0-SNAPSHOT
- client
diff --git a/spring-cloud/spring-cloud-config/pom.xml b/spring-cloud/spring-cloud-config/pom.xml
index b28828bf37..1a4efc7a60 100644
--- a/spring-cloud/spring-cloud-config/pom.xml
+++ b/spring-cloud/spring-cloud-config/pom.xml
@@ -5,6 +5,7 @@
com.baeldung.spring.cloud
spring-cloud-config
1.0-SNAPSHOT
+ spring-cloud-config
pom
diff --git a/spring-cloud/spring-cloud-config/server/pom.xml b/spring-cloud/spring-cloud-config/server/pom.xml
index 7bbb903cf9..b4be7663e2 100644
--- a/spring-cloud/spring-cloud-config/server/pom.xml
+++ b/spring-cloud/spring-cloud-config/server/pom.xml
@@ -3,13 +3,14 @@
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
+ server
+ server
+
com.baeldung.spring.cloud
spring-cloud-config
1.0-SNAPSHOT
- server
diff --git a/spring-cloud/spring-cloud-connectors-heroku/pom.xml b/spring-cloud/spring-cloud-connectors-heroku/pom.xml
index f00c9eb1fc..d2e9292511 100644
--- a/spring-cloud/spring-cloud-connectors-heroku/pom.xml
+++ b/spring-cloud/spring-cloud-connectors-heroku/pom.xml
@@ -5,6 +5,7 @@
com.baeldung.spring.cloud
spring-cloud-connectors-heroku
1.0.0-SNAPSHOT
+ spring-cloud-connectors-heroku
parent-boot-1
diff --git a/spring-cloud/spring-cloud-contract/pom.xml b/spring-cloud/spring-cloud-contract/pom.xml
index 5dde6a7a99..3563d0ee58 100644
--- a/spring-cloud/spring-cloud-contract/pom.xml
+++ b/spring-cloud/spring-cloud-contract/pom.xml
@@ -6,6 +6,7 @@
com.baeldung.spring.cloud
spring-cloud-contract
1.0.0-SNAPSHOT
+ spring-cloud-contract
com.baeldung.spring.cloud
diff --git a/spring-cloud/spring-cloud-eureka/pom.xml b/spring-cloud/spring-cloud-eureka/pom.xml
index 37571bc29a..99d8c0ed40 100644
--- a/spring-cloud/spring-cloud-eureka/pom.xml
+++ b/spring-cloud/spring-cloud-eureka/pom.xml
@@ -6,7 +6,7 @@
spring-cloud-eureka
1.0.0-SNAPSHOT
pom
- Spring Cloud Eureka
+ spring-cloud-eureka
Spring Cloud Eureka Server and Sample Clients
@@ -23,7 +23,8 @@
- 1.4.2.RELEASE
+ 2.0.1.RELEASE
+ Finchley.SR2
diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/pom.xml b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/pom.xml
index 8bc51adcab..5378095af0 100644
--- a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/pom.xml
+++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/pom.xml
@@ -2,12 +2,10 @@
4.0.0
-
spring-cloud-eureka-client
1.0.0-SNAPSHOT
jar
-
- Spring Cloud Eureka Client
+ spring-cloud-eureka-client
Spring Cloud Eureka Sample Client
@@ -20,32 +18,20 @@
org.springframework.cloud
- spring-cloud-starter-eureka
+ spring-cloud-starter-netflix-eureka-client
${spring-cloud-starter-eureka.version}
org.springframework.boot
spring-boot-starter-web
- ${spring-boot-starter-web.version}
+ ${spring-boot.version}
org.springframework.boot
spring-boot-starter-test
- 1.5.10.RELEASE
+ ${spring-boot.version}
test
-
- org.springframework.boot
- spring-boot-test
- 1.5.10.RELEASE
- test
-
-
- org.springframework
- spring-test
- 4.0.5.RELEASE
- test
-
diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/src/main/java/com/baeldung/spring/cloud/eureka/client/EurekaClientApplication.java b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/src/main/java/com/baeldung/spring/cloud/eureka/client/EurekaClientApplication.java
index 48099eeaa2..82b5f6acb1 100644
--- a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/src/main/java/com/baeldung/spring/cloud/eureka/client/EurekaClientApplication.java
+++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/src/main/java/com/baeldung/spring/cloud/eureka/client/EurekaClientApplication.java
@@ -5,13 +5,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Lazy;
-import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
-@EnableEurekaClient
@RestController
public class EurekaClientApplication implements GreetingController {
@Autowired
diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/pom.xml b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/pom.xml
index 4552c458ec..f2057c8a76 100644
--- a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/pom.xml
+++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-eureka-feign-client
1.0.0-SNAPSHOT
jar
- Spring Cloud Eureka Feign Client
+ spring-cloud-eureka-feign-client
Spring Cloud Eureka - Sample Feign Client
@@ -16,25 +16,25 @@
-
- com.baeldung.spring.cloud
- spring-cloud-eureka-client
- ${spring-cloud-eureka-client.version}
-
org.springframework.cloud
spring-cloud-starter-feign
${spring-cloud-starter-feign.version}
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-eureka-client
+ ${spring-cloud-starter-eureka.version}
+
org.springframework.boot
spring-boot-starter-web
- ${spring-boot-starter-web.version}
+ ${spring-boot.version}
org.springframework.boot
spring-boot-starter-thymeleaf
- ${spring-boot-starter-web.version}
+ ${spring-boot.version}
diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/src/main/java/com/baeldung/spring/cloud/feign/client/FeignClientApplication.java b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/src/main/java/com/baeldung/spring/cloud/feign/client/FeignClientApplication.java
index 7beb51d1ac..b8a6c8232d 100644
--- a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/src/main/java/com/baeldung/spring/cloud/feign/client/FeignClientApplication.java
+++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/src/main/java/com/baeldung/spring/cloud/feign/client/FeignClientApplication.java
@@ -3,14 +3,12 @@ package com.baeldung.spring.cloud.feign.client;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
-import org.springframework.cloud.netflix.feign.EnableFeignClients;
+import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@SpringBootApplication
-@EnableEurekaClient
@EnableFeignClients
@Controller
public class FeignClientApplication {
diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/src/main/java/com/baeldung/spring/cloud/feign/client/GreetingClient.java b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/src/main/java/com/baeldung/spring/cloud/feign/client/GreetingClient.java
index 6bd444b347..a9977d86d6 100644
--- a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/src/main/java/com/baeldung/spring/cloud/feign/client/GreetingClient.java
+++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/src/main/java/com/baeldung/spring/cloud/feign/client/GreetingClient.java
@@ -1,8 +1,10 @@
package com.baeldung.spring.cloud.feign.client;
-import com.baeldung.spring.cloud.eureka.client.GreetingController;
-import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient("spring-cloud-eureka-client")
-public interface GreetingClient extends GreetingController {
+public interface GreetingClient {
+ @RequestMapping("/greeting")
+ String greeting();
}
diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-server/pom.xml b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-server/pom.xml
index 8082b30c33..587aed6c49 100644
--- a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-server/pom.xml
+++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-server/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-eureka-server
1.0.0-SNAPSHOT
jar
- Spring Cloud Eureka Server
+ spring-cloud-eureka-server
Spring Cloud Eureka Server Demo
@@ -18,7 +18,7 @@
org.springframework.cloud
- spring-cloud-starter-eureka-server
+ spring-cloud-starter-netflix-eureka-server
${spring-cloud-starter-eureka.version}
diff --git a/spring-cloud/spring-cloud-functions/pom.xml b/spring-cloud/spring-cloud-functions/pom.xml
index 8b2b0ad385..5686fc8c64 100644
--- a/spring-cloud/spring-cloud-functions/pom.xml
+++ b/spring-cloud/spring-cloud-functions/pom.xml
@@ -3,13 +3,11 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
com.baeldung.spring
- cloudfunction-aws
+ spring-cloud-functions
0.0.1-SNAPSHOT
jar
-
- cloudfunction-aws
+ spring-cloud-functions
Demo project for Spring Cloud Function
diff --git a/spring-cloud/spring-cloud-gateway/pom.xml b/spring-cloud/spring-cloud-gateway/pom.xml
index 4d8b57d4cf..c297d90896 100644
--- a/spring-cloud/spring-cloud-gateway/pom.xml
+++ b/spring-cloud/spring-cloud-gateway/pom.xml
@@ -4,7 +4,7 @@
4.0.0
spring-cloud-gateway
jar
- Spring Cloud Gateway
+ spring-cloud-gateway
com.baeldung.spring.cloud
diff --git a/spring-cloud/spring-cloud-kubernetes/demo-backend/pom.xml b/spring-cloud/spring-cloud-kubernetes/demo-backend/pom.xml
index 308a81fd74..f7b04baec3 100644
--- a/spring-cloud/spring-cloud-kubernetes/demo-backend/pom.xml
+++ b/spring-cloud/spring-cloud-kubernetes/demo-backend/pom.xml
@@ -3,7 +3,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
demo-backend
-
+ demo-backend
+
com.baeldung.spring.cloud
spring-cloud-kubernetes
diff --git a/spring-cloud/spring-cloud-kubernetes/demo-frontend/pom.xml b/spring-cloud/spring-cloud-kubernetes/demo-frontend/pom.xml
index 968529c648..da55ca5034 100644
--- a/spring-cloud/spring-cloud-kubernetes/demo-frontend/pom.xml
+++ b/spring-cloud/spring-cloud-kubernetes/demo-frontend/pom.xml
@@ -3,7 +3,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
demo-frontend
-
+ demo-frontend
+
com.baeldung.spring.cloud
spring-cloud-kubernetes
diff --git a/spring-cloud/spring-cloud-kubernetes/pom.xml b/spring-cloud/spring-cloud-kubernetes/pom.xml
index fd9f7b5876..984b3811dd 100644
--- a/spring-cloud/spring-cloud-kubernetes/pom.xml
+++ b/spring-cloud/spring-cloud-kubernetes/pom.xml
@@ -2,11 +2,11 @@
4.0.0
-
com.baeldung.spring.cloud
spring-cloud-kubernetes
1.0-SNAPSHOT
pom
+ spring-cloud-kubernetes
demo-frontend
diff --git a/spring-cloud/spring-cloud-security/auth-server/pom.xml b/spring-cloud/spring-cloud-security/auth-server/pom.xml
index 92f92808f6..4b3f94b825 100644
--- a/spring-cloud/spring-cloud-security/auth-server/pom.xml
+++ b/spring-cloud/spring-cloud-security/auth-server/pom.xml
@@ -3,6 +3,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
auth-server
+ auth-server
Spring Cloud Security APP Server Module
diff --git a/spring-cloud/spring-cloud-task/pom.xml b/spring-cloud/spring-cloud-task/pom.xml
index ef76d464bc..748cc378f1 100644
--- a/spring-cloud/spring-cloud-task/pom.xml
+++ b/spring-cloud/spring-cloud-task/pom.xml
@@ -6,6 +6,7 @@
spring-cloud-task
1.0.0-SNAPSHOT
pom
+ spring-cloud-task
parent-boot-1
diff --git a/spring-cloud/spring-cloud-zookeeper/pom.xml b/spring-cloud/spring-cloud-zookeeper/pom.xml
index 4535c2072d..9661f2b71a 100644
--- a/spring-cloud/spring-cloud-zookeeper/pom.xml
+++ b/spring-cloud/spring-cloud-zookeeper/pom.xml
@@ -4,7 +4,8 @@
4.0.0
spring-cloud-zookeeper
pom
-
+ spring-cloud-zookeeper
+
com.baeldung.spring.cloud
spring-cloud
diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/pom.xml
index 9c27affb8b..c4f7ae704a 100644
--- a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/pom.xml
+++ b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/pom.xml
@@ -5,7 +5,7 @@
eureka-client
1.0.0-SNAPSHOT
jar
- Spring Cloud Eureka Client
+ eureka-client
Spring Cloud Eureka Sample Client
@@ -17,7 +17,7 @@
org.springframework.cloud
- spring-cloud-starter-eureka
+ spring-cloud-starter-netflix-eureka-client
${spring-cloud-starter-eureka.version}
diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/pom.xml
index d694c9058b..0256ee7000 100644
--- a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/pom.xml
+++ b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/pom.xml
@@ -5,7 +5,7 @@
eureka-server
1.0.0-SNAPSHOT
jar
- Spring Cloud Eureka Server
+ eureka-server
Spring Cloud Eureka Server Demo
@@ -17,7 +17,7 @@
org.springframework.cloud
- spring-cloud-starter-eureka-server
+ spring-cloud-starter-netflix-eureka-server
${spring-cloud-starter-eureka.version}
diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/pom.xml
index f4166c7d34..edd7b9d99e 100644
--- a/spring-cloud/spring-cloud-zuul-eureka-integration/pom.xml
+++ b/spring-cloud/spring-cloud-zuul-eureka-integration/pom.xml
@@ -7,7 +7,7 @@
spring-cloud-zuul-eureka-integration
1.0.0-SNAPSHOT
pom
- Spring Cloud Zuul and Eureka Integration
+ spring-cloud-zuul-eureka-integration
Spring Cloud Zuul and Eureka Integration
@@ -24,9 +24,11 @@
- 1.4.2.RELEASE
+ 2.0.1.RELEASE
1.10
1.2.10
+ 2.0.1.RELEASE
+ Finchley.SR2
diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/pom.xml
index 103b8334d3..39f94efdf0 100644
--- a/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/pom.xml
+++ b/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/pom.xml
@@ -2,6 +2,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
zuul-server
+ zuul-server
com.baeldung.spring.cloud
@@ -16,11 +17,11 @@
org.springframework.cloud
- spring-cloud-starter-zuul
+ spring-cloud-starter-netflix-zuul
org.springframework.cloud
- spring-cloud-starter-eureka
+ spring-cloud-starter-netflix-eureka-client
commons-configuration
@@ -32,10 +33,6 @@
rxjava
${rxjava.version}
-
- org.springframework.boot
- spring-boot-starter-security
-
diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/src/main/resources/application.properties b/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/src/main/resources/application.properties
index cb1dca78c2..42b4f5eee4 100644
--- a/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/src/main/resources/application.properties
+++ b/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/src/main/resources/application.properties
@@ -3,7 +3,4 @@ spring.application.name=zuul-server
eureka.instance.preferIpAddress=true
eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=true
-eureka.serviceurl.defaultzone=http://localhost:8761/eureka/
-management.security.enabled=false
-security.basic.enabled=false
-hystrix.command.default.execution.timeout.enabled=false
+eureka.client.serviceUrl.defaultZone=${EUREKA_URI:http://localhost:8761/eureka}
\ No newline at end of file
diff --git a/spring-data-rest/README.md b/spring-data-rest/README.md
index 09f8391406..db94a86a6f 100644
--- a/spring-data-rest/README.md
+++ b/spring-data-rest/README.md
@@ -20,3 +20,4 @@ To view the running application, visit [http://localhost:8080](http://localhost:
- [List of In-Memory Databases](http://www.baeldung.com/java-in-memory-databases)
- [Projections and Excerpts in Spring Data REST](http://www.baeldung.com/spring-data-rest-projections-excerpts)
- [Spring Data REST Events with @RepositoryEventHandler](http://www.baeldung.com/spring-data-rest-events)
+- [Customizing HTTP Endpoints in Spring Data REST](https://www.baeldung.com/spring-data-rest-customize-http-endpoints)
diff --git a/spring-data-rest/pom.xml b/spring-data-rest/pom.xml
index a756ef0497..2fe4715bac 100644
--- a/spring-data-rest/pom.xml
+++ b/spring-data-rest/pom.xml
@@ -33,6 +33,15 @@
com.h2database
h2
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+
+
+ org.xerial
+ sqlite-jdbc
+ ${sqlite.version}
+
@@ -42,4 +51,10 @@
${project.artifactId}
+
+ com.baeldung.SpringDataRestApplication
+ 3.25.2
+ 2.1.0.RELEASE
+
+
diff --git a/spring-data-rest/src/main/java/com/baeldung/config/DbConfig.java b/spring-data-rest/src/main/java/com/baeldung/config/DbConfig.java
index 8d1f9de497..26d882d6a0 100644
--- a/spring-data-rest/src/main/java/com/baeldung/config/DbConfig.java
+++ b/spring-data-rest/src/main/java/com/baeldung/config/DbConfig.java
@@ -7,6 +7,7 @@ import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@@ -14,11 +15,12 @@ import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
-//@Configuration
+@Configuration
@EnableJpaRepositories(basePackages = "com.baeldung.repositories")
// @PropertySource("persistence-h2.properties")
// @PropertySource("persistence-hsqldb.properties")
// @PropertySource("persistence-derby.properties")
+//@PropertySource("persistence-sqlite.properties")
public class DbConfig {
@Autowired
@@ -59,3 +61,25 @@ public class DbConfig {
}
}
+
+@Configuration
+@Profile("h2")
+@PropertySource("persistence-h2.properties")
+class H2Config {}
+
+@Configuration
+@Profile("hsqldb")
+@PropertySource("persistence-hsqldb.properties")
+class HsqldbConfig {}
+
+
+@Configuration
+@Profile("derby")
+@PropertySource("persistence-derby.properties")
+class DerbyConfig {}
+
+
+@Configuration
+@Profile("sqlite")
+@PropertySource("persistence-sqlite.properties")
+class SqliteConfig {}
diff --git a/spring-data-rest/src/main/java/com/baeldung/config/RestConfig.java b/spring-data-rest/src/main/java/com/baeldung/config/RestConfig.java
index 7434dde394..39f90e867b 100644
--- a/spring-data-rest/src/main/java/com/baeldung/config/RestConfig.java
+++ b/spring-data-rest/src/main/java/com/baeldung/config/RestConfig.java
@@ -1,17 +1,21 @@
package com.baeldung.config;
+import com.baeldung.models.WebsiteUser;
+import com.baeldung.projections.CustomBook;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
-import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter;
-
-import com.baeldung.projections.CustomBook;
-
+import org.springframework.data.rest.core.mapping.ExposureConfiguration;
+import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer;
+import org.springframework.http.HttpMethod;
@Configuration
-public class RestConfig extends RepositoryRestConfigurerAdapter{
+public class RestConfig implements RepositoryRestConfigurer {
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration repositoryRestConfiguration){
repositoryRestConfiguration.getProjectionConfiguration().addProjection(CustomBook.class);
+ ExposureConfiguration config = repositoryRestConfiguration.getExposureConfiguration();
+ config.forDomainType(WebsiteUser.class).withItemExposure((metadata, httpMethods) ->
+ httpMethods.disable(HttpMethod.PATCH));
}
}
diff --git a/spring-data-rest/src/main/java/com/baeldung/dialect/SQLiteDialect.java b/spring-data-rest/src/main/java/com/baeldung/dialect/SQLiteDialect.java
new file mode 100644
index 0000000000..4512f7d34d
--- /dev/null
+++ b/spring-data-rest/src/main/java/com/baeldung/dialect/SQLiteDialect.java
@@ -0,0 +1,78 @@
+package com.baeldung.dialect;
+
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.identity.IdentityColumnSupport;
+
+import java.sql.Types;
+
+public class SQLiteDialect extends Dialect {
+
+ public SQLiteDialect() {
+ registerColumnType(Types.BIT, "integer");
+ registerColumnType(Types.TINYINT, "tinyint");
+ registerColumnType(Types.SMALLINT, "smallint");
+ registerColumnType(Types.INTEGER, "integer");
+ registerColumnType(Types.BIGINT, "bigint");
+ registerColumnType(Types.FLOAT, "float");
+ registerColumnType(Types.REAL, "real");
+ registerColumnType(Types.DOUBLE, "double");
+ registerColumnType(Types.NUMERIC, "numeric");
+ registerColumnType(Types.DECIMAL, "decimal");
+ registerColumnType(Types.CHAR, "char");
+ registerColumnType(Types.VARCHAR, "varchar");
+ registerColumnType(Types.LONGVARCHAR, "longvarchar");
+ registerColumnType(Types.DATE, "date");
+ registerColumnType(Types.TIME, "time");
+ registerColumnType(Types.TIMESTAMP, "timestamp");
+ registerColumnType(Types.BINARY, "blob");
+ registerColumnType(Types.VARBINARY, "blob");
+ registerColumnType(Types.LONGVARBINARY, "blob");
+ registerColumnType(Types.BLOB, "blob");
+ registerColumnType(Types.CLOB, "clob");
+ registerColumnType(Types.BOOLEAN, "integer");
+ }
+
+ public IdentityColumnSupport getIdentityColumnSupport() {
+ return new SQLiteIdentityColumnSupport();
+ }
+
+ public boolean hasAlterTable() {
+ return false;
+ }
+
+ public boolean dropConstraints() {
+ return false;
+ }
+
+ public String getDropForeignKeyString() {
+ return "";
+ }
+
+ public String getAddForeignKeyConstraintString(String constraintName, String[] foreignKey, String referencedTable, String[] primaryKey, boolean referencesPrimaryKey) {
+ return "";
+ }
+
+ public String getAddPrimaryKeyConstraintString(String constraintName) {
+ return "";
+ }
+
+ public String getForUpdateString() {
+ return "";
+ }
+
+ public String getAddColumnString() {
+ return "add column";
+ }
+
+ public boolean supportsOuterJoinForUpdate() {
+ return false;
+ }
+
+ public boolean supportsIfExistsBeforeTableName() {
+ return true;
+ }
+
+ public boolean supportsCascadeDelete() {
+ return false;
+ }
+}
diff --git a/spring-data-rest/src/main/java/com/baeldung/dialect/SQLiteIdentityColumnSupport.java b/spring-data-rest/src/main/java/com/baeldung/dialect/SQLiteIdentityColumnSupport.java
new file mode 100644
index 0000000000..cf6e3a9a97
--- /dev/null
+++ b/spring-data-rest/src/main/java/com/baeldung/dialect/SQLiteIdentityColumnSupport.java
@@ -0,0 +1,22 @@
+package com.baeldung.dialect;
+
+import org.hibernate.MappingException;
+import org.hibernate.dialect.identity.IdentityColumnSupportImpl;
+
+public class SQLiteIdentityColumnSupport extends IdentityColumnSupportImpl {
+
+ @Override
+ public boolean supportsIdentityColumns() {
+ return true;
+ }
+
+ @Override
+ public String getIdentitySelectString(String table, String column, int type) throws MappingException {
+ return "select last_insert_rowid()";
+ }
+
+ @Override
+ public String getIdentityColumnString(int type) throws MappingException {
+ return "integer";
+ }
+}
diff --git a/spring-data-rest/src/main/java/com/baeldung/repositories/UserRepository.java b/spring-data-rest/src/main/java/com/baeldung/repositories/UserRepository.java
index 2bd9c025dd..a3fed1c318 100644
--- a/spring-data-rest/src/main/java/com/baeldung/repositories/UserRepository.java
+++ b/spring-data-rest/src/main/java/com/baeldung/repositories/UserRepository.java
@@ -1,12 +1,32 @@
package com.baeldung.repositories;
import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
+import org.springframework.data.rest.core.annotation.RestResource;
import org.springframework.web.bind.annotation.CrossOrigin;
import com.baeldung.models.WebsiteUser;
@CrossOrigin
@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRepository extends CrudRepository {
-
+
+ @Override
+ @RestResource(exported = false)
+ void delete(WebsiteUser entity);
+
+ @Override
+ @RestResource(exported = false)
+ void deleteAll();
+
+ @Override
+ @RestResource(exported = false)
+ void deleteAll(Iterable extends WebsiteUser> entities);
+
+ @Override
+ @RestResource(exported = false)
+ void deleteById(Long aLong);
+
+ @RestResource(path = "byEmail", rel = "customFindMethod")
+ WebsiteUser findByEmail(@Param("email") String email);
}
diff --git a/spring-data-rest/src/main/resources/application.properties b/spring-data-rest/src/main/resources/application.properties
index e69de29bb2..06cb22a4fe 100644
--- a/spring-data-rest/src/main/resources/application.properties
+++ b/spring-data-rest/src/main/resources/application.properties
@@ -0,0 +1 @@
+spring.profiles.default=h2
\ No newline at end of file
diff --git a/spring-data-rest/src/main/resources/persistence-sqlite.properties b/spring-data-rest/src/main/resources/persistence-sqlite.properties
index 018c2cbaca..b6b5f4e4d6 100644
--- a/spring-data-rest/src/main/resources/persistence-sqlite.properties
+++ b/spring-data-rest/src/main/resources/persistence-sqlite.properties
@@ -1,4 +1,7 @@
driverClassName=org.sqlite.JDBC
-url=jdbc:sqlite:memory:myDb
+url=jdbc:sqlite:memory:myDb?cache=shared
username=sa
-password=sa
\ No newline at end of file
+password=sa
+hibernate.dialect=com.baeldung.dialect.SQLiteDialect
+hibernate.hbm2ddl.auto=create-drop
+hibernate.show_sql=true
diff --git a/spring-data-rest/src/test/java/com/baeldung/validator/SpringDataRestValidatorIntegrationTest.java b/spring-data-rest/src/test/java/com/baeldung/validator/SpringDataRestValidatorIntegrationTest.java
index 4c936ffc1c..d41736e434 100644
--- a/spring-data-rest/src/test/java/com/baeldung/validator/SpringDataRestValidatorIntegrationTest.java
+++ b/spring-data-rest/src/test/java/com/baeldung/validator/SpringDataRestValidatorIntegrationTest.java
@@ -1,11 +1,8 @@
package com.baeldung.validator;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup;
-
+import com.baeldung.SpringDataRestApplication;
+import com.baeldung.models.WebsiteUser;
+import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -17,9 +14,10 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.web.context.WebApplicationContext;
-import com.baeldung.SpringDataRestApplication;
-import com.baeldung.models.WebsiteUser;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = SpringDataRestApplication.class, webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@@ -84,4 +82,30 @@ public class SpringDataRestValidatorIntegrationTest {
mockMvc.perform(post("/users", user).contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(user))).andExpect(status().isNotAcceptable()).andExpect(redirectedUrl(null));
}
+ @Test
+ public void whenDeletingCorrectUser_thenCorrectStatusCodeAndResponse() throws Exception {
+ WebsiteUser user = new WebsiteUser();
+ user.setEmail("john.doe@john.com");
+ user.setName("John Doe");
+ mockMvc.perform(post("/users", user).contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(user))).andExpect(status().is2xxSuccessful()).andExpect(redirectedUrl("http://localhost/users/1"));
+ mockMvc.perform(delete("/users/1").contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(user))).andExpect(status().isMethodNotAllowed());
+ }
+
+ @Test
+ public void whenSearchingByEmail_thenCorrectStatusCodeAndResponse() throws Exception {
+ WebsiteUser user = new WebsiteUser();
+ user.setEmail("john.doe@john.com");
+ user.setName("John Doe");
+ mockMvc.perform(post("/users", user).contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(user))).andExpect(status().is2xxSuccessful()).andExpect(redirectedUrl("http://localhost/users/1"));
+ mockMvc.perform(get("/users/search/byEmail").param("email", user.getEmail()).contentType(MediaType.APPLICATION_JSON)).andExpect(status().is2xxSuccessful());
+ }
+
+ @Test
+ public void whenSearchingByEmailWithOriginalMethodName_thenErrorStatusCodeAndResponse() throws Exception {
+ WebsiteUser user = new WebsiteUser();
+ user.setEmail("john.doe@john.com");
+ user.setName("John Doe");
+ mockMvc.perform(post("/users", user).contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(user))).andExpect(status().is2xxSuccessful()).andExpect(redirectedUrl("http://localhost/users/1"));
+ mockMvc.perform(get("/users/search/findByEmail").param("email", user.getEmail()).contentType(MediaType.APPLICATION_JSON)).andExpect(status().isNotFound());
+ }
}
diff --git a/spring-drools/pom.xml b/spring-drools/pom.xml
index 8c65d5e34e..5bb2d6a8e9 100644
--- a/spring-drools/pom.xml
+++ b/spring-drools/pom.xml
@@ -5,7 +5,8 @@
com.baeldung
spring-drools
1.0.0-SNAPSHOT
-
+ spring-drools
+
com.baeldung
parent-modules
diff --git a/spring-ejb/README.md b/spring-ejb/README.md
index d09b27db27..58ccb20e70 100644
--- a/spring-ejb/README.md
+++ b/spring-ejb/README.md
@@ -1,4 +1,9 @@
### Relevant Articles
+- [Guide to EJB Set-up](http://www.baeldung.com/ejb-intro)
+- [Java EE Session Beans](http://www.baeldung.com/ejb-session-beans)
+- [Introduction to EJB JNDI Lookup on WildFly Application Server](http://www.baeldung.com/wildfly-ejb-jndi)
+- [A Guide to Message Driven Beans in EJB](http://www.baeldung.com/ejb-message-driven-beans)
- [Integration Guide for Spring and EJB](http://www.baeldung.com/spring-ejb)
- [Singleton Session Bean in Java EE](http://www.baeldung.com/java-ee-singleton-session-bean)
+
diff --git a/spring-ejb/ejb-beans/pom.xml b/spring-ejb/ejb-beans/pom.xml
index 76c0afadee..168809ee6d 100644
--- a/spring-ejb/ejb-beans/pom.xml
+++ b/spring-ejb/ejb-beans/pom.xml
@@ -3,21 +3,31 @@
4.0.0
com.baeldung.singletonsession
ejb-beans
- 1.0.0-SNAPSHOT
- EJB Beans
+ spring-ejb-beans
com.baeldung.spring.ejb
spring-ejb
- 1.0.1
+ 1.0.0-SNAPSHOT
+
+
+
+ org.jboss.arquillian
+ arquillian-bom
+ ${arquillian-bom.version}
+ import
+ pom
+
+
+
+
javax
javaee-api
- ${javaee.version}
provided
@@ -26,10 +36,49 @@
tomee-embedded
${tomee-embedded.version}
+
+ org.jboss.arquillian.junit
+ arquillian-junit-container
+ test
+
+
+
+ arquillian-glassfish-embedded
+
+
+ org.jboss.arquillian.container
+ arquillian-glassfish-embedded-3.1
+ ${arquillian-glassfish-embedded-3.1.version}
+ test
+
+
+ org.glassfish.main.extras
+ glassfish-embedded-all
+ ${glassfish-embedded-all.version}
+ test
+
+
+
+
+
+
+
+
+ maven-war-plugin
+ ${maven-war-plugin.version}
+
+ false
+
+
+
+
+ 1.1.13.Final
1.7.5
+ 3.1.2
+ 1.0.0.CR4
diff --git a/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/EJBClient1.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/stateful/EJBClient1.java
similarity index 100%
rename from ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/EJBClient1.java
rename to spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/stateful/EJBClient1.java
diff --git a/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/EJBClient2.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/stateful/EJBClient2.java
similarity index 100%
rename from ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/EJBClient2.java
rename to spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/stateful/EJBClient2.java
diff --git a/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/StatefulEJB.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/stateful/StatefulEJB.java
similarity index 100%
rename from ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/StatefulEJB.java
rename to spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/stateful/StatefulEJB.java
diff --git a/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/EJBClient1.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/stateless/EJBClient1.java
similarity index 100%
rename from ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/EJBClient1.java
rename to spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/stateless/EJBClient1.java
diff --git a/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/EJBClient2.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/stateless/EJBClient2.java
similarity index 100%
rename from ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/EJBClient2.java
rename to spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/stateless/EJBClient2.java
diff --git a/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/StatelessEJB.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/stateless/StatelessEJB.java
similarity index 100%
rename from ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/StatelessEJB.java
rename to spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/stateless/StatelessEJB.java
diff --git a/ejb/ejb-session-beans/src/test/java/com/baeldung/ejb/test/stateful/StatefulEJBIntegrationTest.java b/spring-ejb/ejb-beans/src/test/java/com/baeldung/ejb/stateful/StatefulEJBIntegrationTest.java
similarity index 97%
rename from ejb/ejb-session-beans/src/test/java/com/baeldung/ejb/test/stateful/StatefulEJBIntegrationTest.java
rename to spring-ejb/ejb-beans/src/test/java/com/baeldung/ejb/stateful/StatefulEJBIntegrationTest.java
index cc35921e45..75f7132c62 100644
--- a/ejb/ejb-session-beans/src/test/java/com/baeldung/ejb/test/stateful/StatefulEJBIntegrationTest.java
+++ b/spring-ejb/ejb-beans/src/test/java/com/baeldung/ejb/stateful/StatefulEJBIntegrationTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.ejb.test.stateful;
+package com.baeldung.ejb.stateful;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
diff --git a/ejb/ejb-session-beans/src/test/java/com/baeldung/ejb/test/stateless/StatelessEJBIntegrationTest.java b/spring-ejb/ejb-beans/src/test/java/com/baeldung/ejb/stateless/StatelessEJBIntegrationTest.java
similarity index 97%
rename from ejb/ejb-session-beans/src/test/java/com/baeldung/ejb/test/stateless/StatelessEJBIntegrationTest.java
rename to spring-ejb/ejb-beans/src/test/java/com/baeldung/ejb/stateless/StatelessEJBIntegrationTest.java
index c80ca93c0d..a970ef90ae 100644
--- a/ejb/ejb-session-beans/src/test/java/com/baeldung/ejb/test/stateless/StatelessEJBIntegrationTest.java
+++ b/spring-ejb/ejb-beans/src/test/java/com/baeldung/ejb/stateless/StatelessEJBIntegrationTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.ejb.test.stateless;
+package com.baeldung.ejb.stateless;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
diff --git a/spring-ejb/ejb-beans/src/test/java/com/baeldung/singletonbean/CountryStateCacheBeanUnitTest.java b/spring-ejb/ejb-beans/src/test/java/com/baeldung/singletonbean/CountryStateCacheBeanUnitTest.java
index 4cec01a4f7..615ddd1422 100644
--- a/spring-ejb/ejb-beans/src/test/java/com/baeldung/singletonbean/CountryStateCacheBeanUnitTest.java
+++ b/spring-ejb/ejb-beans/src/test/java/com/baeldung/singletonbean/CountryStateCacheBeanUnitTest.java
@@ -4,7 +4,6 @@ import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertNotNull;
import java.util.Arrays;
-import java.util.Collections;
import java.util.List;
import javax.ejb.embeddable.EJBContainer;
@@ -22,7 +21,6 @@ public class CountryStateCacheBeanUnitTest {
@Before
public void init() {
-
ejbContainer = EJBContainer.createEJBContainer();
context = ejbContainer.getContext();
}
diff --git a/spring-ejb/ejb-remote-for-spring/pom.xml b/spring-ejb/ejb-remote-for-spring/pom.xml
deleted file mode 100755
index 21256fa801..0000000000
--- a/spring-ejb/ejb-remote-for-spring/pom.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
- 4.0.0
- ejb-remote-for-spring
- ejb
-
-
- com.baeldung.spring.ejb
- spring-ejb
- 1.0.1
-
-
-
-
- javax
- javaee-api
- provided
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
-
-
-
-
-
- wildfly-standalone
-
- false
-
-
-
-
- org.codehaus.cargo
- cargo-maven2-plugin
- ${cargo-maven2-plugin.version}
-
-
-
-
- wildfly10x
-
- http://download.jboss.org/wildfly/12.0.0.Final/wildfly-12.0.0.Final.zip
-
-
-
-
-
- 127.0.0.1
- standalone-full
- 9990
- testUser:admin1234!
-
-
-
-
-
-
-
-
-
-
-
- 3.9.0
- 1.6.1
-
-
-
-
-
diff --git a/spring-ejb/ejb-remote-for-spring/src/main/resources/logback.xml b/spring-ejb/ejb-remote-for-spring/src/main/resources/logback.xml
deleted file mode 100644
index 7d900d8ea8..0000000000
--- a/spring-ejb/ejb-remote-for-spring/src/main/resources/logback.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
- %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/spring-ejb/pom.xml b/spring-ejb/pom.xml
index 055df9ea04..688f692757 100755
--- a/spring-ejb/pom.xml
+++ b/spring-ejb/pom.xml
@@ -4,7 +4,6 @@
4.0.0
com.baeldung.spring.ejb
spring-ejb
- 1.0.1
pom
spring-ejb
Spring EJB Tutorial
@@ -36,8 +35,8 @@
com.baeldung.spring.ejb
- ejb-remote-for-spring
- ${ejb-remote-for-spring.version}
+ spring-ejb-remote
+ ${spring-ejb-remote.version}
ejb
@@ -71,13 +70,14 @@
- ejb-remote-for-spring
+ spring-ejb-remote
ejb-beans
spring-ejb-client
+ wildfly
- 1.0.1
+ 1.0.0-SNAPSHOT
8.0
12.0.0.Final
2.4
diff --git a/spring-ejb/spring-ejb-client/pom.xml b/spring-ejb/spring-ejb-client/pom.xml
index 50337e8b21..3d8003cbba 100644
--- a/spring-ejb/spring-ejb-client/pom.xml
+++ b/spring-ejb/spring-ejb-client/pom.xml
@@ -12,7 +12,7 @@
com.baeldung.spring.ejb
spring-ejb
- 1.0.1
+ 1.0.0-SNAPSHOT
@@ -36,14 +36,12 @@
org.wildfly
wildfly-ejb-client-bom
- ${wildfly-ejb.version}
pom
com.baeldung.spring.ejb
- ejb-remote-for-spring
- ${ejb-remote-for-spring.version}
+ spring-ejb-remote
ejb
@@ -70,9 +68,4 @@
-
- 1.0.1
- 12.0.0.Final
-
-
diff --git a/ejb/ejb-client/src/main/java/com/baeldung/ejb/client/EJBClient.java b/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/ejb/client/EJBClient.java
old mode 100755
new mode 100644
similarity index 97%
rename from ejb/ejb-client/src/main/java/com/baeldung/ejb/client/EJBClient.java
rename to spring-ejb/spring-ejb-client/src/main/java/com/baeldung/ejb/client/EJBClient.java
index ebd6ef1b97..0c87e927a6
--- a/ejb/ejb-client/src/main/java/com/baeldung/ejb/client/EJBClient.java
+++ b/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/ejb/client/EJBClient.java
@@ -41,7 +41,7 @@ public class EJBClient {
// Since we haven't deployed the application as a .ear, the app name for
// us will be an empty string
final String appName = "";
- final String moduleName = "remote";
+ final String moduleName = "spring-ejb-remote";
final String distinctName = "";
final String beanName = "HelloWorld";
final String viewClassName = HelloWorld.class.getName();
diff --git a/ejb/ejb-client/src/main/java/com/baeldung/ejb/wildfly/TextApplication.java b/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/ejb/wildfly/TextApplication.java
similarity index 96%
rename from ejb/ejb-client/src/main/java/com/baeldung/ejb/wildfly/TextApplication.java
rename to spring-ejb/spring-ejb-client/src/main/java/com/baeldung/ejb/wildfly/TextApplication.java
index 3b63761c73..40264ff5e2 100644
--- a/ejb/ejb-client/src/main/java/com/baeldung/ejb/wildfly/TextApplication.java
+++ b/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/ejb/wildfly/TextApplication.java
@@ -21,7 +21,7 @@ public class TextApplication {
private static TextProcessorRemote lookupTextProcessorBean(String namespace) throws NamingException {
Context ctx = createInitialContext();
final String appName = "";
- final String moduleName = "EJBModule";
+ final String moduleName = "spring-ejb-remote";
final String distinctName = "";
final String beanName = TextProcessorBean.class.getSimpleName();
final String viewClassName = TextProcessorRemote.class.getName();
diff --git a/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/springejbclient/SpringEjbClientApplication.java b/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/springejbclient/SpringEjbClientApplication.java
index 0a1e389113..554fac3417 100644
--- a/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/springejbclient/SpringEjbClientApplication.java
+++ b/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/springejbclient/SpringEjbClientApplication.java
@@ -37,7 +37,7 @@ public class SpringEjbClientApplication {
@SuppressWarnings("rawtypes")
private String getFullName(Class classType) {
- String moduleName = "ejb-remote-for-spring/";
+ String moduleName = "spring-ejb-remote/";
String beanName = classType.getSimpleName();
String viewClassName = classType.getName();
diff --git a/ejb/ejb-client/src/main/resources/jboss-ejb-client.properties b/spring-ejb/spring-ejb-client/src/main/resources/jboss-ejb-client.properties
old mode 100755
new mode 100644
similarity index 100%
rename from ejb/ejb-client/src/main/resources/jboss-ejb-client.properties
rename to spring-ejb/spring-ejb-client/src/main/resources/jboss-ejb-client.properties
diff --git a/ejb/ejb-client/src/test/java/com/baeldung/ejb/setup/test/EJBSetupIntegrationTest.java b/spring-ejb/spring-ejb-client/src/test/java/com/baeldung/ejb/setup/test/EJBSetupIntegrationTest.java
old mode 100755
new mode 100644
similarity index 100%
rename from ejb/ejb-client/src/test/java/com/baeldung/ejb/setup/test/EJBSetupIntegrationTest.java
rename to spring-ejb/spring-ejb-client/src/test/java/com/baeldung/ejb/setup/test/EJBSetupIntegrationTest.java
diff --git a/ejb/ejb-client/src/test/java/com/baeldung/ejb/wildfly/TextApplicationIntegrationTest.java b/spring-ejb/spring-ejb-client/src/test/java/com/baeldung/ejb/wildfly/TextApplicationIntegrationTest.java
similarity index 100%
rename from ejb/ejb-client/src/test/java/com/baeldung/ejb/wildfly/TextApplicationIntegrationTest.java
rename to spring-ejb/spring-ejb-client/src/test/java/com/baeldung/ejb/wildfly/TextApplicationIntegrationTest.java
diff --git a/ejb/ejb-remote/pom.xml b/spring-ejb/spring-ejb-remote/pom.xml
old mode 100755
new mode 100644
similarity index 80%
rename from ejb/ejb-remote/pom.xml
rename to spring-ejb/spring-ejb-remote/pom.xml
index dac2fefb84..797cc3ac68
--- a/ejb/ejb-remote/pom.xml
+++ b/spring-ejb/spring-ejb-remote/pom.xml
@@ -2,13 +2,14 @@
4.0.0
- ejb-remote
+ spring-ejb-remote
ejb
-
+ spring-ejb-remote
+
- com.baeldung.ejb
- ejb
- 1.0-SNAPSHOT
+ com.baeldung.spring.ejb
+ spring-ejb
+ 1.0.0-SNAPSHOT
@@ -17,14 +18,21 @@
javaee-api
provided
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
-
+
wildfly-standalone
- true
+ false
@@ -38,13 +46,14 @@
wildfly10x
- http://download.jboss.org/wildfly/10.1.0.Final/wildfly-10.1.0.Final.zip
+ http://download.jboss.org/wildfly/12.0.0.Final/wildfly-12.0.0.Final.zip
127.0.0.1
+ standalone-full
9990
testUser:admin1234!
@@ -82,7 +91,7 @@
- 7.0
+ 3.9.0
1.6.1
1.1.0.Alpha5
diff --git a/spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatefulWorld.java b/spring-ejb/spring-ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloStatefulWorld.java
similarity index 100%
rename from spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatefulWorld.java
rename to spring-ejb/spring-ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloStatefulWorld.java
diff --git a/spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatefulWorldBean.java b/spring-ejb/spring-ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloStatefulWorldBean.java
similarity index 100%
rename from spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatefulWorldBean.java
rename to spring-ejb/spring-ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloStatefulWorldBean.java
diff --git a/spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatelessWorld.java b/spring-ejb/spring-ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloStatelessWorld.java
old mode 100755
new mode 100644
similarity index 100%
rename from spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatelessWorld.java
rename to spring-ejb/spring-ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloStatelessWorld.java
diff --git a/spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatelessWorldBean.java b/spring-ejb/spring-ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloStatelessWorldBean.java
old mode 100755
new mode 100644
similarity index 100%
rename from spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatelessWorldBean.java
rename to spring-ejb/spring-ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloStatelessWorldBean.java
diff --git a/ejb/ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloWorld.java b/spring-ejb/spring-ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloWorld.java
old mode 100755
new mode 100644
similarity index 100%
rename from ejb/ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloWorld.java
rename to spring-ejb/spring-ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloWorld.java
diff --git a/ejb/ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloWorldBean.java b/spring-ejb/spring-ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloWorldBean.java
old mode 100755
new mode 100644
similarity index 100%
rename from ejb/ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloWorldBean.java
rename to spring-ejb/spring-ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloWorldBean.java
diff --git a/ejb/ejb-remote/src/main/java/com/baeldung/ejb/wildfly/TextProcessorBean.java b/spring-ejb/spring-ejb-remote/src/main/java/com/baeldung/ejb/wildfly/TextProcessorBean.java
similarity index 100%
rename from ejb/ejb-remote/src/main/java/com/baeldung/ejb/wildfly/TextProcessorBean.java
rename to spring-ejb/spring-ejb-remote/src/main/java/com/baeldung/ejb/wildfly/TextProcessorBean.java
diff --git a/ejb/ejb-remote/src/main/java/com/baeldung/ejb/wildfly/TextProcessorRemote.java b/spring-ejb/spring-ejb-remote/src/main/java/com/baeldung/ejb/wildfly/TextProcessorRemote.java
similarity index 100%
rename from ejb/ejb-remote/src/main/java/com/baeldung/ejb/wildfly/TextProcessorRemote.java
rename to spring-ejb/spring-ejb-remote/src/main/java/com/baeldung/ejb/wildfly/TextProcessorRemote.java
diff --git a/spring-ejb/ejb-remote-for-spring/src/main/resources/META-INF/ejb-jar.xml b/spring-ejb/spring-ejb-remote/src/main/resources/META-INF/ejb-jar.xml
old mode 100755
new mode 100644
similarity index 84%
rename from spring-ejb/ejb-remote-for-spring/src/main/resources/META-INF/ejb-jar.xml
rename to spring-ejb/spring-ejb-remote/src/main/resources/META-INF/ejb-jar.xml
index f51523ac14..e53ed00e98
--- a/spring-ejb/ejb-remote-for-spring/src/main/resources/META-INF/ejb-jar.xml
+++ b/spring-ejb/spring-ejb-remote/src/main/resources/META-INF/ejb-jar.xml
@@ -2,6 +2,6 @@
- ejb-remote-for-spring
+ spring-ejb-remote
diff --git a/ejb/ejb-remote/src/main/resources/logback.xml b/spring-ejb/spring-ejb-remote/src/main/resources/logback.xml
similarity index 100%
rename from ejb/ejb-remote/src/main/resources/logback.xml
rename to spring-ejb/spring-ejb-remote/src/main/resources/logback.xml
diff --git a/spring-ejb/ejb-remote-for-spring/src/test/java/com/baeldung/ejb/tutorial/HelloStatefulWorldTestUnitTest.java b/spring-ejb/spring-ejb-remote/src/test/java/com/baeldung/ejb/tutorial/HelloStatefulWorldTestUnitTest.java
similarity index 100%
rename from spring-ejb/ejb-remote-for-spring/src/test/java/com/baeldung/ejb/tutorial/HelloStatefulWorldTestUnitTest.java
rename to spring-ejb/spring-ejb-remote/src/test/java/com/baeldung/ejb/tutorial/HelloStatefulWorldTestUnitTest.java
diff --git a/spring-ejb/ejb-remote-for-spring/src/test/java/com/baeldung/ejb/tutorial/HelloStatelessWorldTestUnitTest.java b/spring-ejb/spring-ejb-remote/src/test/java/com/baeldung/ejb/tutorial/HelloStatelessWorldTestUnitTest.java
similarity index 100%
rename from spring-ejb/ejb-remote-for-spring/src/test/java/com/baeldung/ejb/tutorial/HelloStatelessWorldTestUnitTest.java
rename to spring-ejb/spring-ejb-remote/src/test/java/com/baeldung/ejb/tutorial/HelloStatelessWorldTestUnitTest.java
diff --git a/ejb/wildfly/pom.xml b/spring-ejb/wildfly/pom.xml
similarity index 96%
rename from ejb/wildfly/pom.xml
rename to spring-ejb/wildfly/pom.xml
index 53d10a90ed..f50dad82f1 100644
--- a/ejb/wildfly/pom.xml
+++ b/spring-ejb/wildfly/pom.xml
@@ -8,9 +8,9 @@
wildfly
- com.baeldung.ejb
- ejb
- 1.0-SNAPSHOT
+ com.baeldung.spring.ejb
+ spring-ejb
+ 1.0.0-SNAPSHOT
diff --git a/ejb/wildfly/widlfly-web/pom.xml b/spring-ejb/wildfly/widlfly-web/pom.xml
similarity index 94%
rename from ejb/wildfly/widlfly-web/pom.xml
rename to spring-ejb/wildfly/widlfly-web/pom.xml
index 559c5f1755..f0baac10dd 100644
--- a/ejb/wildfly/widlfly-web/pom.xml
+++ b/spring-ejb/wildfly/widlfly-web/pom.xml
@@ -3,10 +3,11 @@
4.0.0
widlfly-web
war
-
+ widlfly-web
+
com.baeldung.wildfly
- wildfly-example
+ wildfly
0.0.1-SNAPSHOT
diff --git a/ejb/wildfly/widlfly-web/src/main/java/TestEJBServlet.java b/spring-ejb/wildfly/widlfly-web/src/main/java/TestEJBServlet.java
similarity index 100%
rename from ejb/wildfly/widlfly-web/src/main/java/TestEJBServlet.java
rename to spring-ejb/wildfly/widlfly-web/src/main/java/TestEJBServlet.java
diff --git a/ejb/wildfly/widlfly-web/src/main/java/TestJPAServlet.java b/spring-ejb/wildfly/widlfly-web/src/main/java/TestJPAServlet.java
similarity index 100%
rename from ejb/wildfly/widlfly-web/src/main/java/TestJPAServlet.java
rename to spring-ejb/wildfly/widlfly-web/src/main/java/TestJPAServlet.java
diff --git a/ejb/ejb-session-beans/src/main/resources/logback.xml b/spring-ejb/wildfly/widlfly-web/src/main/resources/logback.xml
similarity index 100%
rename from ejb/ejb-session-beans/src/main/resources/logback.xml
rename to spring-ejb/wildfly/widlfly-web/src/main/resources/logback.xml
diff --git a/ejb/wildfly/widlfly-web/src/main/webapp/WEB-INF/web.xml b/spring-ejb/wildfly/widlfly-web/src/main/webapp/WEB-INF/web.xml
similarity index 100%
rename from ejb/wildfly/widlfly-web/src/main/webapp/WEB-INF/web.xml
rename to spring-ejb/wildfly/widlfly-web/src/main/webapp/WEB-INF/web.xml
diff --git a/ejb/wildfly/wildfly-ear/pom.xml b/spring-ejb/wildfly/wildfly-ear/pom.xml
similarity index 96%
rename from ejb/wildfly/wildfly-ear/pom.xml
rename to spring-ejb/wildfly/wildfly-ear/pom.xml
index d1e47ecd0f..93d6df96e5 100644
--- a/ejb/wildfly/wildfly-ear/pom.xml
+++ b/spring-ejb/wildfly/wildfly-ear/pom.xml
@@ -3,10 +3,11 @@
4.0.0
wildfly-ear
ear
-
+ wildfly-ear
+
com.baeldung.wildfly
- wildfly-example
+ wildfly
0.0.1-SNAPSHOT
diff --git a/ejb/wildfly/wildfly-ejb-interfaces/pom.xml b/spring-ejb/wildfly/wildfly-ejb-interfaces/pom.xml
similarity index 92%
rename from ejb/wildfly/wildfly-ejb-interfaces/pom.xml
rename to spring-ejb/wildfly/wildfly-ejb-interfaces/pom.xml
index ec502f2ab3..41c7012ea9 100644
--- a/ejb/wildfly/wildfly-ejb-interfaces/pom.xml
+++ b/spring-ejb/wildfly/wildfly-ejb-interfaces/pom.xml
@@ -2,10 +2,11 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
wildfly-ejb-interfaces
-
+ wildfly-ejb-interfaces
+
com.baeldung.wildfly
- wildfly-example
+ wildfly
0.0.1-SNAPSHOT
diff --git a/ejb/wildfly/wildfly-ejb-interfaces/src/main/java/wildfly/beans/UserBeanLocal.java b/spring-ejb/wildfly/wildfly-ejb-interfaces/src/main/java/wildfly/beans/UserBeanLocal.java
similarity index 100%
rename from ejb/wildfly/wildfly-ejb-interfaces/src/main/java/wildfly/beans/UserBeanLocal.java
rename to spring-ejb/wildfly/wildfly-ejb-interfaces/src/main/java/wildfly/beans/UserBeanLocal.java
diff --git a/ejb/wildfly/wildfly-ejb-interfaces/src/main/java/wildfly/beans/UserBeanRemote.java b/spring-ejb/wildfly/wildfly-ejb-interfaces/src/main/java/wildfly/beans/UserBeanRemote.java
similarity index 100%
rename from ejb/wildfly/wildfly-ejb-interfaces/src/main/java/wildfly/beans/UserBeanRemote.java
rename to spring-ejb/wildfly/wildfly-ejb-interfaces/src/main/java/wildfly/beans/UserBeanRemote.java
diff --git a/ejb/wildfly/widlfly-web/src/main/resources/logback.xml b/spring-ejb/wildfly/wildfly-ejb-interfaces/src/main/resources/logback.xml
similarity index 100%
rename from ejb/wildfly/widlfly-web/src/main/resources/logback.xml
rename to spring-ejb/wildfly/wildfly-ejb-interfaces/src/main/resources/logback.xml
diff --git a/ejb/wildfly/wildfly-ejb/pom.xml b/spring-ejb/wildfly/wildfly-ejb/pom.xml
similarity index 95%
rename from ejb/wildfly/wildfly-ejb/pom.xml
rename to spring-ejb/wildfly/wildfly-ejb/pom.xml
index 2c87ec8449..12bfc9c1bf 100644
--- a/ejb/wildfly/wildfly-ejb/pom.xml
+++ b/spring-ejb/wildfly/wildfly-ejb/pom.xml
@@ -3,10 +3,11 @@
4.0.0
wildfly-ejb
ejb
-
+ wildfly-ejb
+
com.baeldung.wildfly
- wildfly-example
+ wildfly
0.0.1-SNAPSHOT
diff --git a/ejb/wildfly/wildfly-ejb/src/main/java/wildfly/beans/UserBean.java b/spring-ejb/wildfly/wildfly-ejb/src/main/java/wildfly/beans/UserBean.java
similarity index 100%
rename from ejb/wildfly/wildfly-ejb/src/main/java/wildfly/beans/UserBean.java
rename to spring-ejb/wildfly/wildfly-ejb/src/main/java/wildfly/beans/UserBean.java
diff --git a/ejb/wildfly/wildfly-ejb-interfaces/src/main/resources/logback.xml b/spring-ejb/wildfly/wildfly-ejb/src/main/resources/logback.xml
similarity index 100%
rename from ejb/wildfly/wildfly-ejb-interfaces/src/main/resources/logback.xml
rename to spring-ejb/wildfly/wildfly-ejb/src/main/resources/logback.xml
diff --git a/ejb/wildfly/wildfly-jpa/pom.xml b/spring-ejb/wildfly/wildfly-jpa/pom.xml
similarity index 89%
rename from ejb/wildfly/wildfly-jpa/pom.xml
rename to spring-ejb/wildfly/wildfly-jpa/pom.xml
index 12cf2c81e4..3005ab714c 100644
--- a/ejb/wildfly/wildfly-jpa/pom.xml
+++ b/spring-ejb/wildfly/wildfly-jpa/pom.xml
@@ -2,10 +2,11 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
wildfly-jpa
-
+ wildfly-jpa
+
com.baeldung.wildfly
- wildfly-example
+ wildfly
0.0.1-SNAPSHOT
diff --git a/ejb/wildfly/wildfly-jpa/src/main/java/model/User.java b/spring-ejb/wildfly/wildfly-jpa/src/main/java/model/User.java
similarity index 100%
rename from ejb/wildfly/wildfly-jpa/src/main/java/model/User.java
rename to spring-ejb/wildfly/wildfly-jpa/src/main/java/model/User.java
diff --git a/ejb/wildfly/wildfly-jpa/src/main/resources/META-INF/persistence.xml b/spring-ejb/wildfly/wildfly-jpa/src/main/resources/META-INF/persistence.xml
similarity index 100%
rename from ejb/wildfly/wildfly-jpa/src/main/resources/META-INF/persistence.xml
rename to spring-ejb/wildfly/wildfly-jpa/src/main/resources/META-INF/persistence.xml
diff --git a/ejb/wildfly/wildfly-jpa/src/main/resources/data.sql b/spring-ejb/wildfly/wildfly-jpa/src/main/resources/data.sql
similarity index 100%
rename from ejb/wildfly/wildfly-jpa/src/main/resources/data.sql
rename to spring-ejb/wildfly/wildfly-jpa/src/main/resources/data.sql
diff --git a/ejb/wildfly/wildfly-ejb/src/main/resources/logback.xml b/spring-ejb/wildfly/wildfly-jpa/src/main/resources/logback.xml
similarity index 100%
rename from ejb/wildfly/wildfly-ejb/src/main/resources/logback.xml
rename to spring-ejb/wildfly/wildfly-jpa/src/main/resources/logback.xml
diff --git a/ejb/wildfly/wildfly-mdb/pom.xml b/spring-ejb/wildfly/wildfly-mdb/pom.xml
similarity index 92%
rename from ejb/wildfly/wildfly-mdb/pom.xml
rename to spring-ejb/wildfly/wildfly-mdb/pom.xml
index 186ddc50c0..a2ffca2fc5 100644
--- a/ejb/wildfly/wildfly-mdb/pom.xml
+++ b/spring-ejb/wildfly/wildfly-mdb/pom.xml
@@ -6,7 +6,7 @@
com.baeldung.wildfly
- wildfly-example
+ wildfly
0.0.1-SNAPSHOT
diff --git a/ejb/wildfly/wildfly-mdb/src/com/baeldung/wildfly/mdb/ReadMessageMDB.java b/spring-ejb/wildfly/wildfly-mdb/src/com/baeldung/wildfly/mdb/ReadMessageMDB.java
similarity index 100%
rename from ejb/wildfly/wildfly-mdb/src/com/baeldung/wildfly/mdb/ReadMessageMDB.java
rename to spring-ejb/wildfly/wildfly-mdb/src/com/baeldung/wildfly/mdb/ReadMessageMDB.java
diff --git a/ejb/wildfly/wildfly-mdb/src/com/baeldung/wildfly/mdb/SendMessageServlet.java b/spring-ejb/wildfly/wildfly-mdb/src/com/baeldung/wildfly/mdb/SendMessageServlet.java
similarity index 100%
rename from ejb/wildfly/wildfly-mdb/src/com/baeldung/wildfly/mdb/SendMessageServlet.java
rename to spring-ejb/wildfly/wildfly-mdb/src/com/baeldung/wildfly/mdb/SendMessageServlet.java
diff --git a/spring-freemarker/pom.xml b/spring-freemarker/pom.xml
index 4ff57e27f0..02f2a3fd06 100644
--- a/spring-freemarker/pom.xml
+++ b/spring-freemarker/pom.xml
@@ -5,7 +5,7 @@
spring-freemarker
war
1.0-SNAPSHOT
- Spring Freemarker Example
+ spring-freemarker
com.baeldung
diff --git a/spring-integration/src/main/java/com/baeldung/subflows/discardflow/FilterExample.java b/spring-integration/src/main/java/com/baeldung/subflows/discardflow/FilterExample.java
new file mode 100644
index 0000000000..f0e12f9333
--- /dev/null
+++ b/spring-integration/src/main/java/com/baeldung/subflows/discardflow/FilterExample.java
@@ -0,0 +1,57 @@
+package com.baeldung.subflows.discardflow;
+
+import java.util.Collection;
+import org.springframework.context.annotation.Bean;
+import org.springframework.integration.annotation.Gateway;
+import org.springframework.integration.annotation.IntegrationComponentScan;
+import org.springframework.integration.annotation.MessagingGateway;
+import org.springframework.integration.channel.QueueChannel;
+import org.springframework.integration.config.EnableIntegration;
+import org.springframework.integration.dsl.IntegrationFlow;
+
+@EnableIntegration
+@IntegrationComponentScan
+public class FilterExample {
+ @MessagingGateway
+ public interface NumbersClassifier {
+ @Gateway(requestChannel = "classify.input")
+ void classify(Collection numbers);
+ }
+
+ @Bean
+ QueueChannel multipleofThreeChannel() {
+ return new QueueChannel();
+ }
+
+ @Bean
+ QueueChannel remainderIsOneChannel() {
+ return new QueueChannel();
+ }
+
+ @Bean
+ QueueChannel remainderIsTwoChannel() {
+ return new QueueChannel();
+ }
+ boolean isMultipleOfThree(Integer number) {
+ return number % 3 == 0;
+ }
+
+ boolean isRemainderOne(Integer number) {
+ return number % 3 == 1;
+ }
+
+ boolean isRemainderTwo(Integer number) {
+ return number % 3 == 2;
+ }
+ @Bean
+ public IntegrationFlow classify() {
+ return flow -> flow.split()
+ . filter(this::isMultipleOfThree, notMultiple -> notMultiple
+ .discardFlow(oneflow -> oneflow
+ . filter(this::isRemainderOne,
+ twoflow -> twoflow .discardChannel("remainderIsTwoChannel"))
+ .channel("remainderIsOneChannel")))
+ .channel("multipleofThreeChannel");
+ }
+
+}
\ No newline at end of file
diff --git a/spring-integration/src/main/java/com/baeldung/subflows/publishsubscribechannel/PublishSubscibeChannelExample.java b/spring-integration/src/main/java/com/baeldung/subflows/publishsubscribechannel/PublishSubscibeChannelExample.java
new file mode 100644
index 0000000000..a1a448fc03
--- /dev/null
+++ b/spring-integration/src/main/java/com/baeldung/subflows/publishsubscribechannel/PublishSubscibeChannelExample.java
@@ -0,0 +1,60 @@
+package com.baeldung.subflows.publishsubscribechannel;
+
+import java.util.Collection;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.integration.annotation.Gateway;
+import org.springframework.integration.annotation.IntegrationComponentScan;
+import org.springframework.integration.annotation.MessagingGateway;
+
+import org.springframework.integration.channel.QueueChannel;
+import org.springframework.integration.config.EnableIntegration;
+import org.springframework.integration.dsl.IntegrationFlow;
+
+@EnableIntegration
+@IntegrationComponentScan
+public class PublishSubscibeChannelExample {
+ @MessagingGateway
+ public interface NumbersClassifier {
+ @Gateway(requestChannel = "classify.input")
+ void classify(Collection numbers);
+ }
+
+ @Bean
+ QueueChannel multipleofThreeChannel() {
+ return new QueueChannel();
+ }
+
+ @Bean
+ QueueChannel remainderIsOneChannel() {
+ return new QueueChannel();
+ }
+
+ @Bean
+ QueueChannel remainderIsTwoChannel() {
+ return new QueueChannel();
+ }
+ boolean isMultipleOfThree(Integer number) {
+ return number % 3 == 0;
+ }
+
+ boolean isRemainderOne(Integer number) {
+ return number % 3 == 1;
+ }
+
+ boolean isRemainderTwo(Integer number) {
+ return number % 3 == 2;
+ }
+ @Bean
+ public IntegrationFlow classify() {
+ return flow -> flow.split()
+ .publishSubscribeChannel(subscription -> subscription.subscribe(subflow -> subflow. filter(this::isMultipleOfThree)
+ .channel("multipleofThreeChannel"))
+ .subscribe(subflow -> subflow. filter(this::isRemainderOne)
+ .channel("remainderIsOneChannel"))
+ .subscribe(subflow -> subflow. filter(this::isRemainderTwo)
+ .channel("remainderIsTwoChannel")));
+ }
+
+
+}
diff --git a/spring-integration/src/main/java/com/baeldung/subflows/routeToRecipients/RouteToRecipientsExample.java b/spring-integration/src/main/java/com/baeldung/subflows/routeToRecipients/RouteToRecipientsExample.java
new file mode 100644
index 0000000000..e0b4841736
--- /dev/null
+++ b/spring-integration/src/main/java/com/baeldung/subflows/routeToRecipients/RouteToRecipientsExample.java
@@ -0,0 +1,60 @@
+package com.baeldung.subflows.routetorecipients;
+
+import java.util.Collection;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.integration.annotation.Gateway;
+import org.springframework.integration.annotation.IntegrationComponentScan;
+import org.springframework.integration.annotation.MessagingGateway;
+import org.springframework.integration.channel.QueueChannel;
+import org.springframework.integration.config.EnableIntegration;
+import org.springframework.integration.dsl.IntegrationFlow;
+
+@EnableIntegration
+@IntegrationComponentScan
+public class RouteToRecipientsExample {
+ @MessagingGateway
+ public interface NumbersClassifier {
+ @Gateway(requestChannel = "classify.input")
+ void classify(Collection numbers);
+ }
+
+ @Bean
+ QueueChannel multipleofThreeChannel() {
+ return new QueueChannel();
+ }
+
+ @Bean
+ QueueChannel remainderIsOneChannel() {
+ return new QueueChannel();
+ }
+
+ @Bean
+ QueueChannel remainderIsTwoChannel() {
+ return new QueueChannel();
+ }
+ boolean isMultipleOfThree(Integer number) {
+ return number % 3 == 0;
+ }
+
+ boolean isRemainderOne(Integer number) {
+ return number % 3 == 1;
+ }
+
+ boolean isRemainderTwo(Integer number) {
+ return number % 3 == 2;
+ }
+
+ @Bean
+ public IntegrationFlow classify() {
+ return flow -> flow.split()
+ .routeToRecipients(route -> route
+ .recipientFlow(subflow -> subflow
+ . filter(this::isMultipleOfThree)
+ .channel("multipleofThreeChannel"))
+ . recipient("remainderIsOneChannel",this::isRemainderOne)
+ . recipient("remainderIsTwoChannel",this::isRemainderTwo));
+ }
+
+
+}
\ No newline at end of file
diff --git a/spring-integration/src/main/java/com/baeldung/subflows/separateflows/SeparateFlowsExample.java b/spring-integration/src/main/java/com/baeldung/subflows/separateflows/SeparateFlowsExample.java
new file mode 100644
index 0000000000..457b8045c5
--- /dev/null
+++ b/spring-integration/src/main/java/com/baeldung/subflows/separateflows/SeparateFlowsExample.java
@@ -0,0 +1,77 @@
+package com.baeldung.subflows.separateflows;
+
+import java.util.Collection;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.integration.annotation.Gateway;
+import org.springframework.integration.annotation.IntegrationComponentScan;
+import org.springframework.integration.annotation.MessagingGateway;
+
+import org.springframework.integration.channel.QueueChannel;
+import org.springframework.integration.config.EnableIntegration;
+import org.springframework.integration.dsl.IntegrationFlow;
+
+@EnableIntegration
+@IntegrationComponentScan
+public class SeparateFlowsExample {
+ @MessagingGateway
+ public interface NumbersClassifier {
+ @Gateway(requestChannel = "multipleOfThreeFlow.input")
+ void multipleofThree(Collection numbers);
+
+ @Gateway(requestChannel = "remainderIsOneFlow.input")
+ void remainderIsOne(Collection numbers);
+
+ @Gateway(requestChannel = "remainderIsTwoFlow.input")
+ void remainderIsTwo(Collection numbers);
+ }
+
+ @Bean
+ QueueChannel multipleOfThreeChannel() {
+ return new QueueChannel();
+ }
+
+ @Bean
+ QueueChannel remainderIsOneChannel() {
+ return new QueueChannel();
+ }
+
+ @Bean
+ QueueChannel remainderIsTwoChannel() {
+ return new QueueChannel();
+ }
+
+ boolean isMultipleOfThree(Integer number) {
+ return number % 3 == 0;
+ }
+
+ boolean isRemainderOne(Integer number) {
+ return number % 3 == 1;
+ }
+
+ boolean isRemainderTwo(Integer number) {
+ return number % 3 == 2;
+ }
+
+ @Bean
+ public IntegrationFlow multipleOfThreeFlow() {
+ return flow -> flow.split()
+ . filter(this::isMultipleOfThree)
+ .channel("multipleOfThreeChannel");
+ }
+
+ @Bean
+ public IntegrationFlow remainderIsOneFlow() {
+ return flow -> flow.split()
+ . filter(this::isRemainderOne)
+ .channel("remainderIsOneChannel");
+ }
+
+ @Bean
+ public IntegrationFlow remainderIsTwoFlow() {
+ return flow -> flow.split()
+ . filter(this::isRemainderTwo)
+ .channel("remainderIsTwoChannel");
+ }
+
+}
\ No newline at end of file
diff --git a/spring-integration/src/main/java/com/baeldung/subflows/subflowmapping/RouterExample.java b/spring-integration/src/main/java/com/baeldung/subflows/subflowmapping/RouterExample.java
new file mode 100644
index 0000000000..c0e902e739
--- /dev/null
+++ b/spring-integration/src/main/java/com/baeldung/subflows/subflowmapping/RouterExample.java
@@ -0,0 +1,62 @@
+package com.baeldung.subflows.subflowmapping;
+
+import java.util.Collection;
+import org.springframework.context.annotation.Bean;
+import org.springframework.integration.annotation.Gateway;
+import org.springframework.integration.annotation.IntegrationComponentScan;
+import org.springframework.integration.annotation.MessagingGateway;
+import org.springframework.integration.channel.QueueChannel;
+import org.springframework.integration.config.EnableIntegration;
+import org.springframework.integration.dsl.IntegrationFlow;
+
+@EnableIntegration
+@IntegrationComponentScan
+public class RouterExample {
+ @MessagingGateway
+ public interface NumbersClassifier {
+ @Gateway(requestChannel = "classify.input")
+ void classify(Collection numbers);
+ }
+
+ @Bean
+ QueueChannel multipleofThreeChannel() {
+ return new QueueChannel();
+ }
+
+ @Bean
+ QueueChannel remainderIsOneChannel() {
+ return new QueueChannel();
+ }
+
+ @Bean
+ QueueChannel remainderIsTwoChannel() {
+ return new QueueChannel();
+ }
+
+ boolean isMultipleOfThree(Integer number) {
+ return number % 3 == 0;
+ }
+
+ boolean isRemainderOne(Integer number) {
+ return number % 3 == 1;
+ }
+
+ boolean isRemainderTwo(Integer number) {
+ return number % 3 == 2;
+ }
+
+ @Bean
+ public IntegrationFlow classify() {
+ return flow -> flow.split()
+ . route(number -> number % 3,
+ mapping -> mapping
+ .channelMapping(0, "multipleofThreeChannel")
+ .subFlowMapping(1, subflow -> subflow.channel("remainderIsOneChannel"))
+ .subFlowMapping(2, subflow -> subflow
+ . handle((payload, headers) -> {
+ // do extra work on the payload
+ return payload;
+ }))).channel("remainderIsTwoChannel");
+ }
+
+}
\ No newline at end of file
diff --git a/spring-integration/src/test/java/com/baeldung/subflows/discardflow/FilterUnitTest.java b/spring-integration/src/test/java/com/baeldung/subflows/discardflow/FilterUnitTest.java
new file mode 100644
index 0000000000..3b3106212b
--- /dev/null
+++ b/spring-integration/src/test/java/com/baeldung/subflows/discardflow/FilterUnitTest.java
@@ -0,0 +1,62 @@
+package com.baeldung.subflows.discardflow;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.integration.channel.QueueChannel;
+import org.springframework.messaging.Message;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.baeldung.subflows.discardflow.FilterExample.NumbersClassifier;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { FilterExample.class })
+public class FilterUnitTest {
+ @Autowired
+ private QueueChannel multipleofThreeChannel;
+
+ @Autowired
+ private QueueChannel remainderIsOneChannel;
+
+ @Autowired
+ private QueueChannel remainderIsTwoChannel;
+
+ @Autowired
+ private NumbersClassifier numbersClassifier;
+
+ @Test
+ public void whenSendMessagesToFlow_thenNumbersAreClassified() {
+
+ numbersClassifier.classify(Arrays.asList(1, 2, 3, 4, 5, 6));
+
+ Message> outMessage = multipleofThreeChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 3);
+
+ outMessage = multipleofThreeChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 6);
+
+ outMessage = remainderIsOneChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 1);
+ outMessage = remainderIsOneChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 4);
+
+ outMessage = remainderIsTwoChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 2);
+
+ outMessage = remainderIsTwoChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 5);
+
+ }
+
+}
diff --git a/spring-integration/src/test/java/com/baeldung/subflows/publishsubscribechannel/PublishSubscribeChannelUnitTest.java b/spring-integration/src/test/java/com/baeldung/subflows/publishsubscribechannel/PublishSubscribeChannelUnitTest.java
new file mode 100644
index 0000000000..91bf38c626
--- /dev/null
+++ b/spring-integration/src/test/java/com/baeldung/subflows/publishsubscribechannel/PublishSubscribeChannelUnitTest.java
@@ -0,0 +1,62 @@
+package com.baeldung.subflows.publishsubscribechannel;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.integration.channel.QueueChannel;
+import org.springframework.messaging.Message;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.baeldung.subflows.publishsubscribechannel.PublishSubscibeChannelExample.NumbersClassifier;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { PublishSubscibeChannelExample.class })
+public class PublishSubscribeChannelUnitTest {
+ @Autowired
+ private QueueChannel multipleofThreeChannel;
+
+ @Autowired
+ private QueueChannel remainderIsOneChannel;
+
+ @Autowired
+ private QueueChannel remainderIsTwoChannel;
+
+ @Autowired
+ private NumbersClassifier numbersClassifier;
+
+ @Test
+ public void whenSendMessagesToFlow_thenNumbersAreClassified() {
+
+ numbersClassifier.classify(Arrays.asList(1, 2, 3, 4, 5, 6));
+
+ Message> outMessage = multipleofThreeChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 3);
+
+ outMessage = multipleofThreeChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 6);
+
+ outMessage = remainderIsOneChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 1);
+ outMessage = remainderIsOneChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 4);
+
+ outMessage = remainderIsTwoChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 2);
+
+ outMessage = remainderIsTwoChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 5);
+
+ }
+
+}
diff --git a/spring-integration/src/test/java/com/baeldung/subflows/routetorecipients/RouteToRecipientsUnitTest.java b/spring-integration/src/test/java/com/baeldung/subflows/routetorecipients/RouteToRecipientsUnitTest.java
new file mode 100644
index 0000000000..d7a768dcd9
--- /dev/null
+++ b/spring-integration/src/test/java/com/baeldung/subflows/routetorecipients/RouteToRecipientsUnitTest.java
@@ -0,0 +1,63 @@
+package com.baeldung.subflows.routetorecipients;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.integration.channel.QueueChannel;
+import org.springframework.messaging.Message;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.baeldung.subflows.routetorecipients.RouteToRecipientsExample;
+import com.baeldung.subflows.routetorecipients.RouteToRecipientsExample.NumbersClassifier;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { RouteToRecipientsExample.class })
+public class RouteToRecipientsUnitTest {
+ @Autowired
+ private QueueChannel multipleofThreeChannel;
+
+ @Autowired
+ private QueueChannel remainderIsOneChannel;
+
+ @Autowired
+ private QueueChannel remainderIsTwoChannel;
+
+ @Autowired
+ private NumbersClassifier numbersClassifier;
+
+ @Test
+ public void whenSendMessagesToFlow_thenNumbersAreClassified() {
+
+ numbersClassifier.classify(Arrays.asList(1, 2, 3, 4, 5, 6));
+
+ Message> outMessage = multipleofThreeChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 3);
+
+ outMessage = multipleofThreeChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 6);
+
+ outMessage = remainderIsOneChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 1);
+ outMessage = remainderIsOneChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 4);
+
+ outMessage = remainderIsTwoChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 2);
+
+ outMessage = remainderIsTwoChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 5);
+
+ }
+
+}
diff --git a/spring-integration/src/test/java/com/baeldung/subflows/separateflows/SeparateFlowsUnitTest.java b/spring-integration/src/test/java/com/baeldung/subflows/separateflows/SeparateFlowsUnitTest.java
new file mode 100644
index 0000000000..c02badcb1a
--- /dev/null
+++ b/spring-integration/src/test/java/com/baeldung/subflows/separateflows/SeparateFlowsUnitTest.java
@@ -0,0 +1,75 @@
+package com.baeldung.subflows.separateflows;
+
+import java.util.Arrays;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.integration.channel.QueueChannel;
+import org.springframework.messaging.Message;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import com.baeldung.subflows.separateflows.SeparateFlowsExample.NumbersClassifier;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { SeparateFlowsExample.class })
+public class SeparateFlowsUnitTest {
+ @Autowired
+ private QueueChannel multipleOfThreeChannel;
+ @Autowired
+ private QueueChannel remainderIsOneChannel;
+ @Autowired
+ private QueueChannel remainderIsTwoChannel;
+
+ @Autowired
+ private NumbersClassifier numbersClassifier;
+
+ @Test
+ public void whenSendMessagesToMultipleOf3Flow_thenOutputMultiplesOf3() {
+
+ numbersClassifier.multipleofThree(Arrays.asList(1, 2, 3, 4, 5, 6));
+
+ Message> outMessage = multipleOfThreeChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 3);
+
+ outMessage = multipleOfThreeChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 6);
+ outMessage = multipleOfThreeChannel.receive(0);
+ assertNull(outMessage);
+ }
+
+ @Test
+ public void whenSendMessagesToRemainderIs1Flow_thenOutputRemainderIs1() {
+
+ numbersClassifier.remainderIsOne(Arrays.asList(1, 2, 3, 4, 5, 6));
+
+ Message> outMessage = remainderIsOneChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 1);
+
+ outMessage = remainderIsOneChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 4);
+
+ }
+
+ @Test
+ public void whenSendMessagesToRemainderIs2Flow_thenOutputRemainderIs2() {
+
+ numbersClassifier.remainderIsTwo(Arrays.asList(1, 2, 3, 4, 5, 6));
+
+ Message> outMessage = remainderIsTwoChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 2);
+
+ outMessage = remainderIsTwoChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 5);
+
+ }
+
+}
diff --git a/spring-integration/src/test/java/com/baeldung/subflows/subflowmapping/RouterUnitTest.java b/spring-integration/src/test/java/com/baeldung/subflows/subflowmapping/RouterUnitTest.java
new file mode 100644
index 0000000000..9ecbb22a9b
--- /dev/null
+++ b/spring-integration/src/test/java/com/baeldung/subflows/subflowmapping/RouterUnitTest.java
@@ -0,0 +1,62 @@
+package com.baeldung.subflows.subflowmapping;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.integration.channel.QueueChannel;
+import org.springframework.messaging.Message;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.baeldung.subflows.subflowmapping.RouterExample.NumbersClassifier;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { RouterExample.class })
+public class RouterUnitTest {
+ @Autowired
+ private QueueChannel multipleofThreeChannel;
+
+ @Autowired
+ private QueueChannel remainderIsOneChannel;
+
+ @Autowired
+ private QueueChannel remainderIsTwoChannel;
+
+ @Autowired
+ private NumbersClassifier numbersClassifier;
+
+ @Test
+ public void whenSendMessagesToFlow_thenNumbersAreClassified() {
+
+ numbersClassifier.classify(Arrays.asList(1, 2, 3, 4, 5, 6));
+
+ Message> outMessage = multipleofThreeChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 3);
+
+ outMessage = multipleofThreeChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 6);
+
+ outMessage = remainderIsOneChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 1);
+ outMessage = remainderIsOneChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 4);
+
+ outMessage = remainderIsTwoChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 2);
+
+ outMessage = remainderIsTwoChannel.receive(0);
+
+ assertEquals(outMessage.getPayload(), 5);
+
+ }
+
+}
diff --git a/spring-jenkins-pipeline/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-jenkins-pipeline/src/test/java/org/baeldung/SpringContextIntegrationTest.java
index 8eb1589de7..0354f7211c 100644
--- a/spring-jenkins-pipeline/src/test/java/org/baeldung/SpringContextIntegrationTest.java
+++ b/spring-jenkins-pipeline/src/test/java/org/baeldung/SpringContextIntegrationTest.java
@@ -3,12 +3,14 @@ package org.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.junit4.SpringRunner;
import com.baeldung.SpringJenkinsPipelineApplication;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringJenkinsPipelineApplication.class)
+@DirtiesContext
public class SpringContextIntegrationTest {
@Test
diff --git a/spring-jersey/pom.xml b/spring-jersey/pom.xml
index 872835177d..5e7b50d291 100644
--- a/spring-jersey/pom.xml
+++ b/spring-jersey/pom.xml
@@ -6,7 +6,8 @@
spring-jersey
0.1-SNAPSHOT
war
-
+ spring-jersey
+
com.baeldung
parent-modules
diff --git a/spring-jooq/pom.xml b/spring-jooq/pom.xml
index 744ae34cc8..bbd6025418 100644
--- a/spring-jooq/pom.xml
+++ b/spring-jooq/pom.xml
@@ -2,7 +2,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-jooq
-
+ spring-jooq
+
parent-boot-1
com.baeldung
diff --git a/spring-katharsis/pom.xml b/spring-katharsis/pom.xml
index 39648a982c..756aae93d3 100644
--- a/spring-katharsis/pom.xml
+++ b/spring-katharsis/pom.xml
@@ -5,7 +5,8 @@
spring-katharsis
0.0.1-SNAPSHOT
war
-
+ spring-katharsis
+
parent-boot-1
com.baeldung
diff --git a/spring-ldap/pom.xml b/spring-ldap/pom.xml
index 3b2525d899..7399a84c2b 100644
--- a/spring-ldap/pom.xml
+++ b/spring-ldap/pom.xml
@@ -5,6 +5,7 @@
spring-ldap
0.1-SNAPSHOT
jar
+ spring-ldap
com.baeldung
diff --git a/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeConfig.java b/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeConfig.java
new file mode 100644
index 0000000000..8a5d1c71af
--- /dev/null
+++ b/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeConfig.java
@@ -0,0 +1,29 @@
+package com.baeldung.datetime;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar;
+import org.springframework.format.number.NumberFormatAnnotationFormatterFactory;
+import org.springframework.format.support.DefaultFormattingConversionService;
+import org.springframework.format.support.FormattingConversionService;
+
+import java.time.format.DateTimeFormatter;
+
+@Configuration
+class DateTimeConfig {
+
+ @Bean
+ public FormattingConversionService conversionService() {
+ DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(false);
+
+ conversionService.addFormatterForFieldAnnotation(new NumberFormatAnnotationFormatterFactory());
+
+ DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
+ registrar.setDateFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy"));
+ registrar.setDateTimeFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
+ registrar.registerFormatters(conversionService);
+
+ return conversionService;
+ }
+
+}
\ No newline at end of file
diff --git a/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeController.java b/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeController.java
new file mode 100644
index 0000000000..5741b35530
--- /dev/null
+++ b/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeController.java
@@ -0,0 +1,29 @@
+package com.baeldung.datetime;
+
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+@RestController
+public class DateTimeController {
+
+ @PostMapping("/date")
+ public void date(@RequestParam("date") @DateTimeFormat(pattern = "dd.MM.yyyy") Date date) {
+ // ...
+ }
+
+ @PostMapping("/localdate")
+ public void localDate(@RequestParam("localDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate localDate) {
+ // ...
+ }
+
+ @PostMapping("/localdatetime")
+ public void dateTime(@RequestParam("localDateTime") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime localDateTime) {
+ // ...
+ }
+}
\ No newline at end of file
diff --git a/spring-mvc-simple/README.md b/spring-mvc-simple/README.md
index 39053534fa..a9b002afd7 100644
--- a/spring-mvc-simple/README.md
+++ b/spring-mvc-simple/README.md
@@ -6,3 +6,4 @@
- [Servlet Redirect vs Forward](http://www.baeldung.com/servlet-redirect-forward)
- [Apache Tiles Integration with Spring MVC](http://www.baeldung.com/spring-mvc-apache-tiles)
- [Guide to Spring Email](http://www.baeldung.com/spring-email)
+- [Request Method Not Supported (405) in Spring](https://www.baeldung.com/spring-request-method-not-supported-405)
diff --git a/spring-mvc-simple/pom.xml b/spring-mvc-simple/pom.xml
index bd63b5ed1c..8d7ad0fa7f 100644
--- a/spring-mvc-simple/pom.xml
+++ b/spring-mvc-simple/pom.xml
@@ -4,8 +4,7 @@
spring-mvc-simple
war
0.0.1-SNAPSHOT
- Spring MVC simple Maven Webapp
- http://maven.apache.org
+ spring-mvc-simple
com.baeldung
@@ -20,10 +19,6 @@
spring-oxm
${spring-oxm.version}
-
- org.springframework
- spring-context-support
-
com.sun.mail
javax.mail
diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/ApplicationConfiguration.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/ApplicationConfiguration.java
index 284be6c212..941a984684 100644
--- a/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/ApplicationConfiguration.java
+++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/ApplicationConfiguration.java
@@ -1,7 +1,9 @@
package com.baeldung.spring.configuration;
-import com.baeldung.spring.controller.rss.ArticleRssFeedViewResolver;
-import com.baeldung.spring.controller.rss.JsonChannelHttpMessageConverter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@@ -21,13 +23,12 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
+import com.baeldung.spring.controller.rss.ArticleRssFeedViewResolver;
+import com.baeldung.spring.controller.rss.JsonChannelHttpMessageConverter;
@Configuration
@EnableWebMvc
-@ComponentScan(basePackages = { "com.baeldung.springmvcforms", "com.baeldung.spring.controller", "com.baeldung.spring.validator", "com.baeldung.spring.mail" })
+@ComponentScan(basePackages = { "com.baeldung.springmvcforms", "com.baeldung.spring.controller", "com.baeldung.spring.validator", "com.baeldung.spring.mail", "com.baeldung.spring.service" })
public class ApplicationConfiguration implements WebMvcConfigurer {
@Override
diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/PushConfiguration.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/PushConfiguration.java
index 3072501cfa..3aba7e9d89 100644
--- a/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/PushConfiguration.java
+++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/PushConfiguration.java
@@ -8,9 +8,10 @@ import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
+// needs HTTP 2 https://github.com/spring-projects/spring-framework/wiki/HTTP-2-support
@Configuration
@EnableWebMvc
-@ComponentScan(basePackages = "com.baeldung.spring.controller.push")
+@ComponentScan(basePackages = "com.baeldung.spring.push.controller")
public class PushConfiguration implements WebMvcConfigurer {
@Bean
diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/RequestParamController.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/RequestParamController.java
new file mode 100644
index 0000000000..a9846f1ba9
--- /dev/null
+++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/RequestParamController.java
@@ -0,0 +1,79 @@
+package com.baeldung.spring.controller;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+
+@Controller
+public class RequestParamController {
+
+ @GetMapping("/api/foos")
+ @ResponseBody
+ public String getFoos(@RequestParam String id){
+ return "ID: " + id;
+ }
+
+ @PostMapping("/api/foos")
+ @ResponseBody
+ public String addFoo(@RequestParam(name = "id") String fooId, @RequestParam String name){
+ return "ID: " + fooId;
+ }
+
+ @GetMapping("/api/foos2")
+ @ResponseBody
+ public String getFoos2(@RequestParam(required = false) String id){
+ return "ID: " + id;
+ }
+
+ @GetMapping("/api/foos3")
+ @ResponseBody
+ public String getFoos3(@RequestParam(defaultValue = "test") String id){
+ return "ID: " + id;
+ }
+
+ @PostMapping("/api/foos1")
+ @ResponseBody
+ public String updateFoos(@RequestParam Map allParams){
+ return "Parameters are " + allParams.entrySet();
+ }
+
+ @GetMapping("/api/foos4")
+ @ResponseBody
+ public String getFoos4(@RequestParam List id){
+ return "ID are " + id;
+ }
+
+ @GetMapping("/foos/{id}")
+ @ResponseBody
+ public String getFooById(@PathVariable String id){
+ return "ID: " + id;
+ }
+
+ @GetMapping("/foos")
+ @ResponseBody
+ public String getFooByIdUsingQueryParam(@RequestParam String id){
+ return "ID: " + id;
+ }
+
+ @GetMapping({"/myfoos/optional", "/myfoos/optional/{id}"})
+ @ResponseBody
+ public String getFooByOptionalId(@PathVariable(required = false) String id){
+ return "ID: " + id;
+ }
+
+ @GetMapping("/myfoos/optionalParam")
+ @ResponseBody
+ public String getFooByOptionalIdUsingQueryParam(@RequestParam(required = false) String id){
+ return "ID: " + id;
+ }
+
+
+
+}
diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/push/PushController.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/push/controller/PushController.java
similarity index 92%
rename from spring-mvc-simple/src/main/java/com/baeldung/spring/controller/push/PushController.java
rename to spring-mvc-simple/src/main/java/com/baeldung/spring/push/controller/PushController.java
index 88448d4885..e812e5df90 100644
--- a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/push/PushController.java
+++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/push/controller/PushController.java
@@ -1,4 +1,4 @@
-package com.baeldung.spring.controller.push;
+package com.baeldung.spring.push.controller;
import javax.servlet.http.PushBuilder;
diff --git a/spring-mybatis/pom.xml b/spring-mybatis/pom.xml
index 7b8b66fef1..af70cb6377 100644
--- a/spring-mybatis/pom.xml
+++ b/spring-mybatis/pom.xml
@@ -5,8 +5,7 @@
spring-mybatis
jar
0.0.1-SNAPSHOT
- spring-mybatis Maven Webapp
- http://maven.apache.org
+ spring-mybatis
com.baeldung
diff --git a/spring-reactive-kotlin/pom.xml b/spring-reactive-kotlin/pom.xml
index bff39984e0..7bd31396f7 100644
--- a/spring-reactive-kotlin/pom.xml
+++ b/spring-reactive-kotlin/pom.xml
@@ -4,7 +4,7 @@
4.0.0
spring-reactive-kotlin
jar
- Spring Reactive Kotlin
+ spring-reactive-kotlin
Demo project for Spring Boot
diff --git a/spring-remoting/remoting-hessian-burlap/pom.xml b/spring-remoting/remoting-hessian-burlap/pom.xml
index 6cb5a51812..e63d0ee22e 100644
--- a/spring-remoting/remoting-hessian-burlap/pom.xml
+++ b/spring-remoting/remoting-hessian-burlap/pom.xml
@@ -5,6 +5,7 @@
4.0.0
remoting-hessian-burlap
pom
+ remoting-hessian-burlap
spring-remoting
diff --git a/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/pom.xml b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/pom.xml
index f337d5e51f..104712c3d7 100644
--- a/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/pom.xml
+++ b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/pom.xml
@@ -2,15 +2,16 @@
-
+ 4.0.0
+ spring-remoting-hessian-burlap-client
+ spring-remoting-hessian-burlap-client
+
+
remoting-hessian-burlap
com.baeldung
1.0-SNAPSHOT
- 4.0.0
-
- spring-remoting-hessian-burlap-client
-
+
org.springframework.boot
diff --git a/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-server/pom.xml b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-server/pom.xml
index 5b6e03348f..33b824442f 100644
--- a/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-server/pom.xml
+++ b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-server/pom.xml
@@ -2,14 +2,15 @@
+ 4.0.0
+ remoting-hessian-burlap-server
+ remoting-hessian-burlap-server
+
remoting-hessian-burlap
com.baeldung
1.0-SNAPSHOT
- 4.0.0
-
- remoting-hessian-burlap-server
diff --git a/spring-remoting/remoting-http/pom.xml b/spring-remoting/remoting-http/pom.xml
index 3262736ec8..886a28b886 100644
--- a/spring-remoting/remoting-http/pom.xml
+++ b/spring-remoting/remoting-http/pom.xml
@@ -4,8 +4,10 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
remoting-http
- Parent for all modules related to HTTP Spring Remoting.
pom
+
+ remoting-http
+ Parent for all modules related to HTTP Spring Remoting.
com.baeldung
diff --git a/spring-remoting/remoting-http/remoting-http-client/pom.xml b/spring-remoting/remoting-http/remoting-http-client/pom.xml
index 9a6e98ffdd..56412d3cdf 100644
--- a/spring-remoting/remoting-http/remoting-http-client/pom.xml
+++ b/spring-remoting/remoting-http/remoting-http-client/pom.xml
@@ -4,6 +4,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
remoting-http-client
+ remoting-http-client
Shows how to invoke a remote service using Spring Remoting HTTP.
diff --git a/spring-remoting/remoting-http/remoting-http-server/pom.xml b/spring-remoting/remoting-http/remoting-http-server/pom.xml
index 53d27a5efa..c3f87e776e 100644
--- a/spring-remoting/remoting-http/remoting-http-server/pom.xml
+++ b/spring-remoting/remoting-http/remoting-http-server/pom.xml
@@ -4,6 +4,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
remoting-http-server
+ remoting-http-server
Shows how to expose a service using Spring Remoting HTTP.
diff --git a/spring-remoting/remoting-jms/pom.xml b/spring-remoting/remoting-jms/pom.xml
index fe36431423..e24b5b7929 100644
--- a/spring-remoting/remoting-jms/pom.xml
+++ b/spring-remoting/remoting-jms/pom.xml
@@ -2,18 +2,20 @@
+ 4.0.0
+ remoting-jms
+ remoting-jms
+ pom
+
spring-remoting
com.baeldung
1.0-SNAPSHOT
- 4.0.0
- pom
+
remoting-jms-client
remoting-jms-server
- remoting-jms
-
\ No newline at end of file
diff --git a/spring-remoting/remoting-jms/remoting-jms-client/pom.xml b/spring-remoting/remoting-jms/remoting-jms-client/pom.xml
index ed27282a38..b7b1af5a1a 100644
--- a/spring-remoting/remoting-jms/remoting-jms-client/pom.xml
+++ b/spring-remoting/remoting-jms/remoting-jms-client/pom.xml
@@ -2,14 +2,15 @@
+ 4.0.0
+ remoting-jms-client
+ remoting-jms-client
+
remoting-jms
com.baeldung
1.0-SNAPSHOT
- 4.0.0
-
- remoting-jms-client
UTF-8
diff --git a/spring-remoting/remoting-jms/remoting-jms-server/pom.xml b/spring-remoting/remoting-jms/remoting-jms-server/pom.xml
index 7657267f1d..8a17cdb0a9 100644
--- a/spring-remoting/remoting-jms/remoting-jms-server/pom.xml
+++ b/spring-remoting/remoting-jms/remoting-jms-server/pom.xml
@@ -2,14 +2,15 @@
+ 4.0.0
+ remoting-jms-server
+ remoting-jms-server
+
remoting-jms
com.baeldung
1.0-SNAPSHOT
- 4.0.0
-
- remoting-jms-server
UTF-8
diff --git a/spring-remoting/remoting-rmi/pom.xml b/spring-remoting/remoting-rmi/pom.xml
index cd15a6ec60..b3b84786b8 100644
--- a/spring-remoting/remoting-rmi/pom.xml
+++ b/spring-remoting/remoting-rmi/pom.xml
@@ -3,8 +3,9 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- pom
remoting-rmi
+ pom
+ remoting-rmi
spring-remoting
diff --git a/spring-remoting/remoting-rmi/remoting-rmi-client/pom.xml b/spring-remoting/remoting-rmi/remoting-rmi-client/pom.xml
index 1e3cd4b977..4ac0283e94 100644
--- a/spring-remoting/remoting-rmi/remoting-rmi-client/pom.xml
+++ b/spring-remoting/remoting-rmi/remoting-rmi-client/pom.xml
@@ -2,15 +2,16 @@
+ 4.0.0
+ remoting-rmi-client
+ remoting-rmi-client
+
remoting-rmi
com.baeldung
1.0-SNAPSHOT
- 4.0.0
-
- remoting-rmi-client
-
+
org.springframework.boot
diff --git a/spring-remoting/remoting-rmi/remoting-rmi-server/pom.xml b/spring-remoting/remoting-rmi/remoting-rmi-server/pom.xml
index 68b01829e1..7fb4d2c1bc 100644
--- a/spring-remoting/remoting-rmi/remoting-rmi-server/pom.xml
+++ b/spring-remoting/remoting-rmi/remoting-rmi-server/pom.xml
@@ -2,14 +2,15 @@
+ 4.0.0
+ remoting-rmi-server
+ remoting-rmi-server
+
remoting-rmi
com.baeldung
1.0-SNAPSHOT
- 4.0.0
-
- remoting-rmi-server
UTF-8
diff --git a/spring-rest-angular/README.md b/spring-rest-angular/README.md
index 7ead9442fd..d2c2879649 100644
--- a/spring-rest-angular/README.md
+++ b/spring-rest-angular/README.md
@@ -2,5 +2,4 @@
### Relevant Articles:
-- [Spring’s RequestBody and ResponseBody Annotations](http://www.baeldung.com/spring-request-response-body)
- [Pagination with Spring REST and AngularJS table](http://www.baeldung.com/pagination-with-a-spring-rest-api-and-an-angularjs-table)
diff --git a/spring-rest-angular/pom.xml b/spring-rest-angular/pom.xml
index 7aedfa486b..5240ae24e7 100644
--- a/spring-rest-angular/pom.xml
+++ b/spring-rest-angular/pom.xml
@@ -8,10 +8,10 @@
war
- parent-boot-1
+ parent-boot-2
com.baeldung
0.0.1-SNAPSHOT
- ../parent-boot-1
+ ../parent-boot-2
diff --git a/spring-rest-angular/src/main/resources/application.properties b/spring-rest-angular/src/main/resources/application.properties
index e24db89c8f..2571d286a3 100644
--- a/spring-rest-angular/src/main/resources/application.properties
+++ b/spring-rest-angular/src/main/resources/application.properties
@@ -1,4 +1,4 @@
-server.contextPath=/
+server.servlet.contextPath=/
spring.h2.console.enabled=true
logging.level.org.hibernate.SQL=info
spring.jpa.hibernate.ddl-auto=none
\ No newline at end of file
diff --git a/spring-rest-hal-browser/pom.xml b/spring-rest-hal-browser/pom.xml
index 6c56faf0b2..ee0a2c043d 100644
--- a/spring-rest-hal-browser/pom.xml
+++ b/spring-rest-hal-browser/pom.xml
@@ -3,10 +3,11 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
com.baeldung
spring-rest-hal-browser
1.0-SNAPSHOT
+ spring-rest-hal-browser
+
diff --git a/spring-rest-query-language/pom.xml b/spring-rest-query-language/pom.xml
index 8b24c7b8fb..70fea91f31 100644
--- a/spring-rest-query-language/pom.xml
+++ b/spring-rest-query-language/pom.xml
@@ -1,17 +1,16 @@
4.0.0
- com.baeldung
spring-rest-query-language
0.1-SNAPSHOT
spring-rest-query-language
war
- parent-boot-1
+ parent-boot-2
com.baeldung
0.0.1-SNAPSHOT
- ../parent-boot-1
+ ../parent-boot-2
@@ -149,6 +148,7 @@
org.javassist
javassist
+ ${javassist.version}
mysql
@@ -349,13 +349,14 @@
1.4.9
-
+ 3.21.0-GA
+
19.0
3.5
-
+
- 1.6.1
+ 1.7.0
1.1.3
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/GenericSpecificationsBuilder.java b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/GenericSpecificationsBuilder.java
similarity index 86%
rename from spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/GenericSpecificationsBuilder.java
rename to spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/GenericSpecificationsBuilder.java
index 64bab9a435..75fb4456c4 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/GenericSpecificationsBuilder.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/GenericSpecificationsBuilder.java
@@ -1,4 +1,4 @@
-package org.baeldung.persistence.dao;
+package com.baeldung.persistence.dao;
import java.util.ArrayList;
import java.util.Collections;
@@ -8,10 +8,10 @@ import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
-import org.baeldung.web.util.SearchOperation;
-import org.baeldung.web.util.SpecSearchCriteria;
import org.springframework.data.jpa.domain.Specification;
-import org.springframework.data.jpa.domain.Specifications;
+
+import com.baeldung.web.util.SearchOperation;
+import com.baeldung.web.util.SpecSearchCriteria;
public class GenericSpecificationsBuilder {
@@ -61,11 +61,12 @@ public class GenericSpecificationsBuilder {
for (int idx = 1; idx < specs.size(); idx++) {
result = params.get(idx)
.isOrPredicate()
- ? Specifications.where(result)
+ ? Specification.where(result)
.or(specs.get(idx))
- : Specifications.where(result)
+ : Specification.where(result)
.and(specs.get(idx));
}
+
return result;
}
@@ -84,10 +85,10 @@ public class GenericSpecificationsBuilder {
Specification operand1 = specStack.pop();
Specification operand2 = specStack.pop();
if (mayBeOperand.equals(SearchOperation.AND_OPERATOR))
- specStack.push(Specifications.where(operand1)
+ specStack.push(Specification.where(operand1)
.and(operand2));
else if (mayBeOperand.equals(SearchOperation.OR_OPERATOR))
- specStack.push(Specifications.where(operand1)
+ specStack.push(Specification.where(operand1)
.or(operand2));
}
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/IUserDAO.java b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/IUserDAO.java
similarity index 52%
rename from spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/IUserDAO.java
rename to spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/IUserDAO.java
index 4e74e94925..4837795792 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/IUserDAO.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/IUserDAO.java
@@ -1,9 +1,9 @@
-package org.baeldung.persistence.dao;
+package com.baeldung.persistence.dao;
import java.util.List;
-import org.baeldung.persistence.model.User;
-import org.baeldung.web.util.SearchCriteria;
+import com.baeldung.persistence.model.User;
+import com.baeldung.web.util.SearchCriteria;
public interface IUserDAO {
List searchUser(List params);
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/MyUserPredicate.java b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserPredicate.java
similarity index 92%
rename from spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/MyUserPredicate.java
rename to spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserPredicate.java
index 5dd4cdd17e..0c3a4a51f9 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/MyUserPredicate.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserPredicate.java
@@ -1,8 +1,7 @@
-package org.baeldung.persistence.dao;
-
-import org.baeldung.persistence.model.MyUser;
-import org.baeldung.web.util.SearchCriteria;
+package com.baeldung.persistence.dao;
+import com.baeldung.persistence.model.MyUser;
+import com.baeldung.web.util.SearchCriteria;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.core.types.dsl.NumberPath;
import com.querydsl.core.types.dsl.PathBuilder;
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/MyUserPredicatesBuilder.java b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserPredicatesBuilder.java
similarity index 95%
rename from spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/MyUserPredicatesBuilder.java
rename to spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserPredicatesBuilder.java
index 7be37c7155..6aad1a3bab 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/MyUserPredicatesBuilder.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserPredicatesBuilder.java
@@ -1,12 +1,11 @@
-package org.baeldung.persistence.dao;
+package com.baeldung.persistence.dao;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
-import org.baeldung.web.util.SearchCriteria;
-
+import com.baeldung.web.util.SearchCriteria;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.core.types.dsl.Expressions;
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/MyUserRepository.java b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserRepository.java
similarity index 74%
rename from spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/MyUserRepository.java
rename to spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserRepository.java
index 82ae1ee841..3be361e85a 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/MyUserRepository.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/MyUserRepository.java
@@ -1,17 +1,17 @@
-package org.baeldung.persistence.dao;
+package com.baeldung.persistence.dao;
-import com.querydsl.core.types.dsl.StringExpression;
-import org.baeldung.persistence.model.MyUser;
-import org.baeldung.persistence.model.QMyUser;
+import com.baeldung.persistence.model.QMyUser;
import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.querydsl.QueryDslPredicateExecutor;
+import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.data.querydsl.binding.QuerydslBinderCustomizer;
import org.springframework.data.querydsl.binding.QuerydslBindings;
-
-import com.querydsl.core.types.dsl.StringPath;
import org.springframework.data.querydsl.binding.SingleValueBinding;
-public interface MyUserRepository extends JpaRepository, QueryDslPredicateExecutor, QuerydslBinderCustomizer {
+import com.baeldung.persistence.model.MyUser;
+import com.querydsl.core.types.dsl.StringExpression;
+import com.querydsl.core.types.dsl.StringPath;
+
+public interface MyUserRepository extends JpaRepository, QuerydslPredicateExecutor, QuerydslBinderCustomizer {
@Override
default public void customize(final QuerydslBindings bindings, final QMyUser root) {
bindings.bind(String.class)
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/UserDAO.java b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserDAO.java
similarity index 90%
rename from spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/UserDAO.java
rename to spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserDAO.java
index 4f2f6003e4..6bc899176a 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/UserDAO.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserDAO.java
@@ -1,4 +1,4 @@
-package org.baeldung.persistence.dao;
+package com.baeldung.persistence.dao;
import java.util.List;
@@ -9,10 +9,11 @@ import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
-import org.baeldung.persistence.model.User;
-import org.baeldung.web.util.SearchCriteria;
import org.springframework.stereotype.Repository;
+import com.baeldung.persistence.model.User;
+import com.baeldung.web.util.SearchCriteria;
+
@Repository
public class UserDAO implements IUserDAO {
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/UserRepository.java b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserRepository.java
similarity index 74%
rename from spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/UserRepository.java
rename to spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserRepository.java
index de7acf60d5..1a7eda07ed 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/UserRepository.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserRepository.java
@@ -1,9 +1,10 @@
-package org.baeldung.persistence.dao;
+package com.baeldung.persistence.dao;
-import org.baeldung.persistence.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import com.baeldung.persistence.model.User;
+
public interface UserRepository extends JpaRepository, JpaSpecificationExecutor {
}
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/UserSearchQueryCriteriaConsumer.java b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSearchQueryCriteriaConsumer.java
similarity index 94%
rename from spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/UserSearchQueryCriteriaConsumer.java
rename to spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSearchQueryCriteriaConsumer.java
index 8b15ef1605..a3e619ad21 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/UserSearchQueryCriteriaConsumer.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSearchQueryCriteriaConsumer.java
@@ -1,4 +1,4 @@
-package org.baeldung.persistence.dao;
+package com.baeldung.persistence.dao;
import java.util.function.Consumer;
@@ -6,7 +6,7 @@ import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
-import org.baeldung.web.util.SearchCriteria;
+import com.baeldung.web.util.SearchCriteria;
public class UserSearchQueryCriteriaConsumer implements Consumer{
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/UserSpecification.java b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSpecification.java
similarity index 92%
rename from spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/UserSpecification.java
rename to spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSpecification.java
index b2d9394500..928e75aea7 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/UserSpecification.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSpecification.java
@@ -1,9 +1,10 @@
-package org.baeldung.persistence.dao;
+package com.baeldung.persistence.dao;
-import org.baeldung.persistence.model.User;
-import org.baeldung.web.util.SpecSearchCriteria;
import org.springframework.data.jpa.domain.Specification;
+import com.baeldung.persistence.model.User;
+import com.baeldung.web.util.SpecSearchCriteria;
+
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/UserSpecificationsBuilder.java b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSpecificationsBuilder.java
similarity index 81%
rename from spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/UserSpecificationsBuilder.java
rename to spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSpecificationsBuilder.java
index 28097d500a..72d7274226 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/UserSpecificationsBuilder.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/UserSpecificationsBuilder.java
@@ -1,14 +1,13 @@
-package org.baeldung.persistence.dao;
+package com.baeldung.persistence.dao;
import java.util.ArrayList;
import java.util.List;
-import java.util.stream.Collectors;
-import org.baeldung.persistence.model.User;
-import org.baeldung.web.util.SearchOperation;
-import org.baeldung.web.util.SpecSearchCriteria;
import org.springframework.data.jpa.domain.Specification;
-import org.springframework.data.jpa.domain.Specifications;
+
+import com.baeldung.persistence.model.User;
+import com.baeldung.web.util.SearchOperation;
+import com.baeldung.web.util.SpecSearchCriteria;
public final class UserSpecificationsBuilder {
@@ -52,8 +51,8 @@ public final class UserSpecificationsBuilder {
for (int i = 1; i < params.size(); i++) {
result = params.get(i).isOrPredicate()
- ? Specifications.where(result).or(new UserSpecification(params.get(i)))
- : Specifications.where(result).and(new UserSpecification(params.get(i)));
+ ? Specification.where(result).or(new UserSpecification(params.get(i)))
+ : Specification.where(result).and(new UserSpecification(params.get(i)));
}
return result;
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/rsql/CustomRsqlVisitor.java b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/CustomRsqlVisitor.java
similarity index 95%
rename from spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/rsql/CustomRsqlVisitor.java
rename to spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/CustomRsqlVisitor.java
index 89cec89951..9c399e97ed 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/rsql/CustomRsqlVisitor.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/CustomRsqlVisitor.java
@@ -1,4 +1,4 @@
-package org.baeldung.persistence.dao.rsql;
+package com.baeldung.persistence.dao.rsql;
import org.springframework.data.jpa.domain.Specification;
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/rsql/GenericRsqlSpecBuilder.java b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/GenericRsqlSpecBuilder.java
similarity index 59%
rename from spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/rsql/GenericRsqlSpecBuilder.java
rename to spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/GenericRsqlSpecBuilder.java
index ce5a4410b9..e81e9ab916 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/rsql/GenericRsqlSpecBuilder.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/GenericRsqlSpecBuilder.java
@@ -1,10 +1,10 @@
-package org.baeldung.persistence.dao.rsql;
+package com.baeldung.persistence.dao.rsql;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
-import org.springframework.data.jpa.domain.Specifications;
+import org.springframework.data.jpa.domain.Specification;
import cz.jirutka.rsql.parser.ast.ComparisonNode;
import cz.jirutka.rsql.parser.ast.LogicalNode;
@@ -13,7 +13,7 @@ import cz.jirutka.rsql.parser.ast.Node;
public class GenericRsqlSpecBuilder {
- public Specifications createSpecification(final Node node) {
+ public Specification createSpecification(final Node node) {
if (node instanceof LogicalNode) {
return createSpecification((LogicalNode) node);
}
@@ -23,31 +23,31 @@ public class GenericRsqlSpecBuilder {
return null;
}
- public Specifications createSpecification(final LogicalNode logicalNode) {
+ public Specification createSpecification(final LogicalNode logicalNode) {
- List> specs = logicalNode.getChildren()
+ List> specs = logicalNode.getChildren()
.stream()
.map(node -> createSpecification(node))
.filter(Objects::nonNull)
.collect(Collectors.toList());
- Specifications result = specs.get(0);
+ Specification result = specs.get(0);
if (logicalNode.getOperator() == LogicalOperator.AND) {
for (int i = 1; i < specs.size(); i++) {
- result = Specifications.where(result).and(specs.get(i));
+ result = Specification.where(result).and(specs.get(i));
}
}
else if (logicalNode.getOperator() == LogicalOperator.OR) {
for (int i = 1; i < specs.size(); i++) {
- result = Specifications.where(result).or(specs.get(i));
+ result = Specification.where(result).or(specs.get(i));
}
}
return result;
}
- public Specifications createSpecification(final ComparisonNode comparisonNode) {
- return Specifications.where(new GenericRsqlSpecification(comparisonNode.getSelector(), comparisonNode.getOperator(), comparisonNode.getArguments()));
+ public Specification createSpecification(final ComparisonNode comparisonNode) {
+ return Specification.where(new GenericRsqlSpecification(comparisonNode.getSelector(), comparisonNode.getOperator(), comparisonNode.getArguments()));
}
}
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/rsql/GenericRsqlSpecification.java b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/GenericRsqlSpecification.java
similarity index 98%
rename from spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/rsql/GenericRsqlSpecification.java
rename to spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/GenericRsqlSpecification.java
index 8055e959a6..87a46d4a85 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/rsql/GenericRsqlSpecification.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/GenericRsqlSpecification.java
@@ -1,4 +1,4 @@
-package org.baeldung.persistence.dao.rsql;
+package com.baeldung.persistence.dao.rsql;
import java.util.List;
import java.util.stream.Collectors;
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/rsql/RsqlSearchOperation.java b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/RsqlSearchOperation.java
similarity index 95%
rename from spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/rsql/RsqlSearchOperation.java
rename to spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/RsqlSearchOperation.java
index 673e78fbb4..81441fa609 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/persistence/dao/rsql/RsqlSearchOperation.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/persistence/dao/rsql/RsqlSearchOperation.java
@@ -1,4 +1,4 @@
-package org.baeldung.persistence.dao.rsql;
+package com.baeldung.persistence.dao.rsql;
import cz.jirutka.rsql.parser.ast.ComparisonOperator;
import cz.jirutka.rsql.parser.ast.RSQLOperators;
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/persistence/model/MyUser.java b/spring-rest-query-language/src/main/java/com/baeldung/persistence/model/MyUser.java
similarity index 98%
rename from spring-rest-query-language/src/main/java/org/baeldung/persistence/model/MyUser.java
rename to spring-rest-query-language/src/main/java/com/baeldung/persistence/model/MyUser.java
index 9a7bb4da3d..f3b9dc3810 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/persistence/model/MyUser.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/persistence/model/MyUser.java
@@ -1,4 +1,4 @@
-package org.baeldung.persistence.model;
+package com.baeldung.persistence.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/persistence/model/User.java b/spring-rest-query-language/src/main/java/com/baeldung/persistence/model/User.java
similarity index 97%
rename from spring-rest-query-language/src/main/java/org/baeldung/persistence/model/User.java
rename to spring-rest-query-language/src/main/java/com/baeldung/persistence/model/User.java
index 670d4a2e74..dbc2b9360f 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/persistence/model/User.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/persistence/model/User.java
@@ -1,4 +1,4 @@
-package org.baeldung.persistence.model;
+package com.baeldung.persistence.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/persistence/model/User_.java b/spring-rest-query-language/src/main/java/com/baeldung/persistence/model/User_.java
similarity index 92%
rename from spring-rest-query-language/src/main/java/org/baeldung/persistence/model/User_.java
rename to spring-rest-query-language/src/main/java/com/baeldung/persistence/model/User_.java
index b705c51ff8..c101b1d9b3 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/persistence/model/User_.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/persistence/model/User_.java
@@ -1,4 +1,4 @@
-package org.baeldung.persistence.model;
+package com.baeldung.persistence.model;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/spring/Application.java b/spring-rest-query-language/src/main/java/com/baeldung/spring/Application.java
similarity index 90%
rename from spring-rest-query-language/src/main/java/org/baeldung/spring/Application.java
rename to spring-rest-query-language/src/main/java/com/baeldung/spring/Application.java
index 7aa9ea5bc3..371377021a 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/spring/Application.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/spring/Application.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring;
+package com.baeldung.spring;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
@@ -7,7 +7,7 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
-import org.springframework.boot.web.support.SpringBootServletInitializer;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.context.request.RequestContextListener;
@@ -19,7 +19,7 @@ import org.springframework.web.context.request.RequestContextListener;
*/
@EnableScheduling
@EnableAutoConfiguration
-@ComponentScan("org.baeldung")
+@ComponentScan("com.baeldung")
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/spring/PersistenceConfig.java b/spring-rest-query-language/src/main/java/com/baeldung/spring/PersistenceConfig.java
similarity index 94%
rename from spring-rest-query-language/src/main/java/org/baeldung/spring/PersistenceConfig.java
rename to spring-rest-query-language/src/main/java/com/baeldung/spring/PersistenceConfig.java
index f3a87b189e..4a4b9eee3f 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/spring/PersistenceConfig.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/spring/PersistenceConfig.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring;
+package com.baeldung.spring;
import java.util.Properties;
@@ -24,9 +24,9 @@ import com.google.common.base.Preconditions;
@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:persistence-${envTarget:h2}.properties" })
-@ComponentScan({ "org.baeldung.persistence" })
+@ComponentScan({ "com.baeldung.persistence" })
// @ImportResource("classpath*:springDataPersistenceConfig.xml")
-@EnableJpaRepositories(basePackages = "org.baeldung.persistence.dao")
+@EnableJpaRepositories(basePackages = "com.baeldung.persistence.dao")
public class PersistenceConfig {
@Autowired
@@ -40,7 +40,7 @@ public class PersistenceConfig {
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
- em.setPackagesToScan(new String[] { "org.baeldung.persistence.model" });
+ em.setPackagesToScan(new String[] { "com.baeldung.persistence.model" });
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
// vendorAdapter.set
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/spring/WebConfig.java b/spring-rest-query-language/src/main/java/com/baeldung/spring/WebConfig.java
similarity index 80%
rename from spring-rest-query-language/src/main/java/org/baeldung/spring/WebConfig.java
rename to spring-rest-query-language/src/main/java/com/baeldung/spring/WebConfig.java
index 41711ee1ad..f5a5bc4b5e 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/spring/WebConfig.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/spring/WebConfig.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring;
+package com.baeldung.spring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
@@ -6,17 +6,13 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
-@ComponentScan("org.baeldung.web")
+@ComponentScan("com.baeldung.web")
@EnableWebMvc
-public class WebConfig extends WebMvcConfigurerAdapter {
-
- public WebConfig() {
- super();
- }
+public class WebConfig implements WebMvcConfigurer {
@Bean
public ViewResolver viewResolver() {
@@ -29,7 +25,6 @@ public class WebConfig extends WebMvcConfigurerAdapter {
// API
@Override
public void addViewControllers(final ViewControllerRegistry registry) {
- super.addViewControllers(registry);
registry.addViewController("/homepage.html");
}
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/web/controller/HomeController.java b/spring-rest-query-language/src/main/java/com/baeldung/web/controller/HomeController.java
similarity index 87%
rename from spring-rest-query-language/src/main/java/org/baeldung/web/controller/HomeController.java
rename to spring-rest-query-language/src/main/java/com/baeldung/web/controller/HomeController.java
index 9c4d14cae3..c82911211a 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/web/controller/HomeController.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/web/controller/HomeController.java
@@ -1,4 +1,4 @@
-package org.baeldung.web.controller;
+package com.baeldung.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/web/controller/UserController.java b/spring-rest-query-language/src/main/java/com/baeldung/web/controller/UserController.java
similarity index 87%
rename from spring-rest-query-language/src/main/java/org/baeldung/web/controller/UserController.java
rename to spring-rest-query-language/src/main/java/com/baeldung/web/controller/UserController.java
index 8953a52a1b..101231c7ab 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/web/controller/UserController.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/web/controller/UserController.java
@@ -1,23 +1,10 @@
-package org.baeldung.web.controller;
+package com.baeldung.web.controller;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import org.baeldung.persistence.dao.GenericSpecificationsBuilder;
-import org.baeldung.persistence.dao.IUserDAO;
-import org.baeldung.persistence.dao.MyUserPredicatesBuilder;
-import org.baeldung.persistence.dao.MyUserRepository;
-import org.baeldung.persistence.dao.UserRepository;
-import org.baeldung.persistence.dao.UserSpecification;
-import org.baeldung.persistence.dao.UserSpecificationsBuilder;
-import org.baeldung.persistence.dao.rsql.CustomRsqlVisitor;
-import org.baeldung.persistence.model.MyUser;
-import org.baeldung.persistence.model.User;
-import org.baeldung.web.util.CriteriaParser;
-import org.baeldung.web.util.SearchCriteria;
-import org.baeldung.web.util.SearchOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.querydsl.binding.QuerydslPredicate;
@@ -31,6 +18,19 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
+import com.baeldung.persistence.dao.GenericSpecificationsBuilder;
+import com.baeldung.persistence.dao.IUserDAO;
+import com.baeldung.persistence.dao.MyUserPredicatesBuilder;
+import com.baeldung.persistence.dao.MyUserRepository;
+import com.baeldung.persistence.dao.UserRepository;
+import com.baeldung.persistence.dao.UserSpecification;
+import com.baeldung.persistence.dao.UserSpecificationsBuilder;
+import com.baeldung.persistence.dao.rsql.CustomRsqlVisitor;
+import com.baeldung.persistence.model.MyUser;
+import com.baeldung.persistence.model.User;
+import com.baeldung.web.util.CriteriaParser;
+import com.baeldung.web.util.SearchCriteria;
+import com.baeldung.web.util.SearchOperation;
import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
import com.querydsl.core.types.Predicate;
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/web/error/RestResponseEntityExceptionHandler.java b/spring-rest-query-language/src/main/java/com/baeldung/web/error/RestResponseEntityExceptionHandler.java
similarity index 97%
rename from spring-rest-query-language/src/main/java/org/baeldung/web/error/RestResponseEntityExceptionHandler.java
rename to spring-rest-query-language/src/main/java/com/baeldung/web/error/RestResponseEntityExceptionHandler.java
index b593116c4a..b30f435ee4 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/web/error/RestResponseEntityExceptionHandler.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/web/error/RestResponseEntityExceptionHandler.java
@@ -1,8 +1,7 @@
-package org.baeldung.web.error;
+package com.baeldung.web.error;
import javax.persistence.EntityNotFoundException;
-import org.baeldung.web.exception.MyResourceNotFoundException;
import org.hibernate.exception.ConstraintViolationException;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataIntegrityViolationException;
@@ -17,6 +16,8 @@ import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
+import com.baeldung.web.exception.MyResourceNotFoundException;
+
@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/web/exception/MyResourceNotFoundException.java b/spring-rest-query-language/src/main/java/com/baeldung/web/exception/MyResourceNotFoundException.java
similarity index 92%
rename from spring-rest-query-language/src/main/java/org/baeldung/web/exception/MyResourceNotFoundException.java
rename to spring-rest-query-language/src/main/java/com/baeldung/web/exception/MyResourceNotFoundException.java
index 14b61f9832..fd002efc28 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/web/exception/MyResourceNotFoundException.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/web/exception/MyResourceNotFoundException.java
@@ -1,4 +1,4 @@
-package org.baeldung.web.exception;
+package com.baeldung.web.exception;
public final class MyResourceNotFoundException extends RuntimeException {
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/web/util/CriteriaParser.java b/spring-rest-query-language/src/main/java/com/baeldung/web/util/CriteriaParser.java
similarity index 98%
rename from spring-rest-query-language/src/main/java/org/baeldung/web/util/CriteriaParser.java
rename to spring-rest-query-language/src/main/java/com/baeldung/web/util/CriteriaParser.java
index a72d07f440..26bfb7a78d 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/web/util/CriteriaParser.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/web/util/CriteriaParser.java
@@ -1,4 +1,4 @@
-package org.baeldung.web.util;
+package com.baeldung.web.util;
import java.util.Arrays;
import java.util.Collections;
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/web/util/SearchCriteria.java b/spring-rest-query-language/src/main/java/com/baeldung/web/util/SearchCriteria.java
similarity index 96%
rename from spring-rest-query-language/src/main/java/org/baeldung/web/util/SearchCriteria.java
rename to spring-rest-query-language/src/main/java/com/baeldung/web/util/SearchCriteria.java
index cbe1fe539e..75ecefb653 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/web/util/SearchCriteria.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/web/util/SearchCriteria.java
@@ -1,4 +1,4 @@
-package org.baeldung.web.util;
+package com.baeldung.web.util;
public class SearchCriteria {
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/web/util/SearchOperation.java b/spring-rest-query-language/src/main/java/com/baeldung/web/util/SearchOperation.java
similarity index 93%
rename from spring-rest-query-language/src/main/java/org/baeldung/web/util/SearchOperation.java
rename to spring-rest-query-language/src/main/java/com/baeldung/web/util/SearchOperation.java
index db2c0133cf..acc9e0c0a8 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/web/util/SearchOperation.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/web/util/SearchOperation.java
@@ -1,4 +1,4 @@
-package org.baeldung.web.util;
+package com.baeldung.web.util;
public enum SearchOperation {
EQUALITY, NEGATION, GREATER_THAN, LESS_THAN, LIKE, STARTS_WITH, ENDS_WITH, CONTAINS;
diff --git a/spring-rest-query-language/src/main/java/org/baeldung/web/util/SpecSearchCriteria.java b/spring-rest-query-language/src/main/java/com/baeldung/web/util/SpecSearchCriteria.java
similarity index 95%
rename from spring-rest-query-language/src/main/java/org/baeldung/web/util/SpecSearchCriteria.java
rename to spring-rest-query-language/src/main/java/com/baeldung/web/util/SpecSearchCriteria.java
index 3435ff3342..73b690673b 100644
--- a/spring-rest-query-language/src/main/java/org/baeldung/web/util/SpecSearchCriteria.java
+++ b/spring-rest-query-language/src/main/java/com/baeldung/web/util/SpecSearchCriteria.java
@@ -1,4 +1,4 @@
-package org.baeldung.web.util;
+package com.baeldung.web.util;
public class SpecSearchCriteria {
diff --git a/spring-rest-query-language/src/main/resources/application.properties b/spring-rest-query-language/src/main/resources/application.properties
index 01eaee7040..4bbf3ed4fc 100644
--- a/spring-rest-query-language/src/main/resources/application.properties
+++ b/spring-rest-query-language/src/main/resources/application.properties
@@ -1,2 +1,2 @@
server.port=8082
-server.context-path=/spring-rest-query-language
\ No newline at end of file
+server.servlet.context-path=/spring-rest-query-language
\ No newline at end of file
diff --git a/spring-rest-query-language/src/main/resources/springDataPersistenceConfig.xml b/spring-rest-query-language/src/main/resources/springDataPersistenceConfig.xml
index d6d0ec6e47..5ea2d9c05b 100644
--- a/spring-rest-query-language/src/main/resources/springDataPersistenceConfig.xml
+++ b/spring-rest-query-language/src/main/resources/springDataPersistenceConfig.xml
@@ -7,6 +7,6 @@
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"
>
-
+
\ No newline at end of file
diff --git a/spring-rest-query-language/src/main/webapp/WEB-INF/web.xml b/spring-rest-query-language/src/main/webapp/WEB-INF/web.xml
index 4472afd112..23869f5e4e 100644
--- a/spring-rest-query-language/src/main/webapp/WEB-INF/web.xml
+++ b/spring-rest-query-language/src/main/webapp/WEB-INF/web.xml
@@ -16,7 +16,7 @@
contextConfigLocation
- org.baeldung.spring
+ com.baeldung.spring
diff --git a/spring-rest-query-language/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-rest-query-language/src/test/java/com/baeldung/SpringContextIntegrationTest.java
similarity index 85%
rename from spring-rest-query-language/src/test/java/org/baeldung/SpringContextIntegrationTest.java
rename to spring-rest-query-language/src/test/java/com/baeldung/SpringContextIntegrationTest.java
index 35939c992f..18fabce5ca 100644
--- a/spring-rest-query-language/src/test/java/org/baeldung/SpringContextIntegrationTest.java
+++ b/spring-rest-query-language/src/test/java/com/baeldung/SpringContextIntegrationTest.java
@@ -1,11 +1,12 @@
-package org.baeldung;
+package com.baeldung;
-import org.baeldung.spring.Application;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
+import com.baeldung.spring.Application;
+
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class SpringContextIntegrationTest {
diff --git a/spring-rest-query-language/src/test/java/org/baeldung/persistence/query/JPACriteriaQueryIntegrationTest.java b/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPACriteriaQueryIntegrationTest.java
similarity index 93%
rename from spring-rest-query-language/src/test/java/org/baeldung/persistence/query/JPACriteriaQueryIntegrationTest.java
rename to spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPACriteriaQueryIntegrationTest.java
index e8e98074c6..6caabef628 100644
--- a/spring-rest-query-language/src/test/java/org/baeldung/persistence/query/JPACriteriaQueryIntegrationTest.java
+++ b/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPACriteriaQueryIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.persistence.query;
+package com.baeldung.persistence.query;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.collection.IsIn.isIn;
@@ -7,10 +7,6 @@ import static org.hamcrest.core.IsNot.not;
import java.util.ArrayList;
import java.util.List;
-import org.baeldung.persistence.dao.IUserDAO;
-import org.baeldung.persistence.model.User;
-import org.baeldung.spring.PersistenceConfig;
-import org.baeldung.web.util.SearchCriteria;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -20,6 +16,11 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
+import com.baeldung.persistence.dao.IUserDAO;
+import com.baeldung.persistence.model.User;
+import com.baeldung.spring.PersistenceConfig;
+import com.baeldung.web.util.SearchCriteria;
+
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { PersistenceConfig.class })
@Transactional
diff --git a/spring-rest-query-language/src/test/java/org/baeldung/persistence/query/JPAQuerydslIntegrationTest.java b/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPAQuerydslIntegrationTest.java
similarity index 93%
rename from spring-rest-query-language/src/test/java/org/baeldung/persistence/query/JPAQuerydslIntegrationTest.java
rename to spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPAQuerydslIntegrationTest.java
index d397c3aac4..c4c5d23ab5 100644
--- a/spring-rest-query-language/src/test/java/org/baeldung/persistence/query/JPAQuerydslIntegrationTest.java
+++ b/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPAQuerydslIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.persistence.query;
+package com.baeldung.persistence.query;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.collection.IsEmptyIterable.emptyIterable;
@@ -6,10 +6,6 @@ import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInA
import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
import static org.hamcrest.core.IsNot.not;
-import org.baeldung.persistence.dao.MyUserPredicatesBuilder;
-import org.baeldung.persistence.dao.MyUserRepository;
-import org.baeldung.persistence.model.MyUser;
-import org.baeldung.spring.PersistenceConfig;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -19,6 +15,11 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
+import com.baeldung.persistence.dao.MyUserPredicatesBuilder;
+import com.baeldung.persistence.dao.MyUserRepository;
+import com.baeldung.persistence.model.MyUser;
+import com.baeldung.spring.PersistenceConfig;
+
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { PersistenceConfig.class })
@Transactional
diff --git a/spring-rest-query-language/src/test/java/org/baeldung/persistence/query/JPASpecificationIntegrationTest.java b/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPASpecificationIntegrationTest.java
similarity index 89%
rename from spring-rest-query-language/src/test/java/org/baeldung/persistence/query/JPASpecificationIntegrationTest.java
rename to spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPASpecificationIntegrationTest.java
index d9ae95c876..707426769e 100644
--- a/spring-rest-query-language/src/test/java/org/baeldung/persistence/query/JPASpecificationIntegrationTest.java
+++ b/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPASpecificationIntegrationTest.java
@@ -1,25 +1,25 @@
-package org.baeldung.persistence.query;
+package com.baeldung.persistence.query;
-import org.baeldung.persistence.dao.GenericSpecificationsBuilder;
-import org.baeldung.persistence.dao.UserRepository;
-import org.baeldung.persistence.dao.UserSpecification;
-import org.baeldung.persistence.dao.UserSpecificationsBuilder;
-import org.baeldung.persistence.model.User;
-import org.baeldung.spring.PersistenceConfig;
-import org.baeldung.web.util.CriteriaParser;
-import org.baeldung.web.util.SearchOperation;
-import org.baeldung.web.util.SpecSearchCriteria;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
-import org.springframework.data.jpa.domain.Specifications;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
+import com.baeldung.persistence.dao.GenericSpecificationsBuilder;
+import com.baeldung.persistence.dao.UserRepository;
+import com.baeldung.persistence.dao.UserSpecification;
+import com.baeldung.persistence.dao.UserSpecificationsBuilder;
+import com.baeldung.persistence.model.User;
+import com.baeldung.spring.PersistenceConfig;
+import com.baeldung.web.util.CriteriaParser;
+import com.baeldung.web.util.SearchOperation;
+import com.baeldung.web.util.SpecSearchCriteria;
+
import java.util.List;
import java.util.function.Function;
@@ -71,7 +71,7 @@ public class JPASpecificationIntegrationTest {
public void givenFirstAndLastName_whenGettingListOfUsers_thenCorrect() {
final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.EQUALITY, "john"));
final UserSpecification spec1 = new UserSpecification(new SpecSearchCriteria("lastName", SearchOperation.EQUALITY, "doe"));
- final List results = repository.findAll(Specifications
+ final List results = repository.findAll(Specification
.where(spec)
.and(spec1));
@@ -127,7 +127,7 @@ public class JPASpecificationIntegrationTest {
@Test
public void givenFirstNameInverse_whenGettingListOfUsers_thenCorrect() {
final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("firstName", SearchOperation.NEGATION, "john"));
- final List results = repository.findAll(Specifications.where(spec));
+ final List results = repository.findAll(Specification.where(spec));
assertThat(userTom, isIn(results));
assertThat(userJohn, not(isIn(results)));
@@ -136,7 +136,7 @@ public class JPASpecificationIntegrationTest {
@Test
public void givenMinAge_whenGettingListOfUsers_thenCorrect() {
final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("age", SearchOperation.GREATER_THAN, "25"));
- final List results = repository.findAll(Specifications.where(spec));
+ final List results = repository.findAll(Specification.where(spec));
assertThat(userTom, isIn(results));
assertThat(userJohn, not(isIn(results)));
}
@@ -170,7 +170,7 @@ public class JPASpecificationIntegrationTest {
public void givenAgeRange_whenGettingListOfUsers_thenCorrect() {
final UserSpecification spec = new UserSpecification(new SpecSearchCriteria("age", SearchOperation.GREATER_THAN, "20"));
final UserSpecification spec1 = new UserSpecification(new SpecSearchCriteria("age", SearchOperation.LESS_THAN, "25"));
- final List results = repository.findAll(Specifications
+ final List results = repository.findAll(Specification
.where(spec)
.and(spec1));
diff --git a/spring-rest-query-language/src/test/java/org/baeldung/persistence/query/JPASpecificationLiveTest.java b/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPASpecificationLiveTest.java
similarity index 95%
rename from spring-rest-query-language/src/test/java/org/baeldung/persistence/query/JPASpecificationLiveTest.java
rename to spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPASpecificationLiveTest.java
index 044029c679..ad6a4259e7 100644
--- a/spring-rest-query-language/src/test/java/org/baeldung/persistence/query/JPASpecificationLiveTest.java
+++ b/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/JPASpecificationLiveTest.java
@@ -1,15 +1,16 @@
-package org.baeldung.persistence.query;
+package com.baeldung.persistence.query;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import io.restassured.RestAssured;
import io.restassured.response.Response;
-import org.baeldung.persistence.model.User;
import org.junit.Before;
import org.junit.Test;
import org.springframework.test.context.ActiveProfiles;
+import com.baeldung.persistence.model.User;
+
//@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(classes = { ConfigTest.class,
// PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
diff --git a/spring-rest-query-language/src/test/java/org/baeldung/persistence/query/RsqlIntegrationTest.java b/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/RsqlIntegrationTest.java
similarity index 93%
rename from spring-rest-query-language/src/test/java/org/baeldung/persistence/query/RsqlIntegrationTest.java
rename to spring-rest-query-language/src/test/java/com/baeldung/persistence/query/RsqlIntegrationTest.java
index 16dfa8a12f..b7b454892a 100644
--- a/spring-rest-query-language/src/test/java/org/baeldung/persistence/query/RsqlIntegrationTest.java
+++ b/spring-rest-query-language/src/test/java/com/baeldung/persistence/query/RsqlIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.persistence.query;
+package com.baeldung.persistence.query;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.collection.IsIn.isIn;
@@ -6,10 +6,6 @@ import static org.hamcrest.core.IsNot.not;
import java.util.List;
-import org.baeldung.persistence.dao.UserRepository;
-import org.baeldung.persistence.dao.rsql.CustomRsqlVisitor;
-import org.baeldung.persistence.model.User;
-import org.baeldung.spring.PersistenceConfig;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -20,6 +16,11 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
+import com.baeldung.persistence.dao.UserRepository;
+import com.baeldung.persistence.dao.rsql.CustomRsqlVisitor;
+import com.baeldung.persistence.model.User;
+import com.baeldung.spring.PersistenceConfig;
+
import cz.jirutka.rsql.parser.RSQLParser;
import cz.jirutka.rsql.parser.ast.Node;
diff --git a/spring-rest-query-language/src/test/java/org/baeldung/web/MyUserLiveTest.java b/spring-rest-query-language/src/test/java/com/baeldung/web/MyUserLiveTest.java
similarity index 95%
rename from spring-rest-query-language/src/test/java/org/baeldung/web/MyUserLiveTest.java
rename to spring-rest-query-language/src/test/java/com/baeldung/web/MyUserLiveTest.java
index a478016280..1d74ff1982 100644
--- a/spring-rest-query-language/src/test/java/org/baeldung/web/MyUserLiveTest.java
+++ b/spring-rest-query-language/src/test/java/com/baeldung/web/MyUserLiveTest.java
@@ -1,14 +1,15 @@
-package org.baeldung.web;
+package com.baeldung.web;
import static org.junit.Assert.assertEquals;
import io.restassured.RestAssured;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;
-import org.baeldung.persistence.model.MyUser;
import org.junit.Test;
import org.springframework.test.context.ActiveProfiles;
+import com.baeldung.persistence.model.MyUser;
+
@ActiveProfiles("test")
public class MyUserLiveTest {
diff --git a/spring-rest-shell/pom.xml b/spring-rest-shell/pom.xml
index 7a604946b6..540b3d08eb 100644
--- a/spring-rest-shell/pom.xml
+++ b/spring-rest-shell/pom.xml
@@ -8,10 +8,10 @@
A simple project to demonstrate Spring REST Shell features.
- parent-boot-1
+ parent-boot-2
com.baeldung
0.0.1-SNAPSHOT
- ../parent-boot-1
+ ../parent-boot-2
diff --git a/spring-rest-simple/README.md b/spring-rest-simple/README.md
index 57d6f50887..179e556202 100644
--- a/spring-rest-simple/README.md
+++ b/spring-rest-simple/README.md
@@ -2,7 +2,6 @@
- [Guide to UriComponentsBuilder in Spring](http://www.baeldung.com/spring-uricomponentsbuilder)
- [Returning Custom Status Codes from Spring Controllers](http://www.baeldung.com/spring-mvc-controller-custom-http-status-code)
-- [The Guide to RestTemplate](http://www.baeldung.com/rest-template)
- [Spring RequestMapping](http://www.baeldung.com/spring-requestmapping)
- [ETags for REST with Spring](http://www.baeldung.com/etags-for-rest-with-spring)
- [Spring and Apache FileUpload](http://www.baeldung.com/spring-apache-file-upload)
diff --git a/spring-rest-simple/pom.xml b/spring-rest-simple/pom.xml
index d39e3a43c1..d301957eb9 100644
--- a/spring-rest-simple/pom.xml
+++ b/spring-rest-simple/pom.xml
@@ -8,10 +8,10 @@
war
- parent-boot-1
+ parent-boot-2
com.baeldung
0.0.1-SNAPSHOT
- ../parent-boot-1
+ ../parent-boot-2
@@ -34,6 +34,10 @@
spring-boot-starter-test
test
+
+ org.springframework.boot
+ spring-boot-starter-web
+
diff --git a/spring-rest-simple/src/main/java/org/baeldung/config/Application.java b/spring-rest-simple/src/main/java/org/baeldung/config/Application.java
index 3a98da82c9..5c9a186619 100644
--- a/spring-rest-simple/src/main/java/org/baeldung/config/Application.java
+++ b/spring-rest-simple/src/main/java/org/baeldung/config/Application.java
@@ -3,7 +3,7 @@ package org.baeldung.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.web.support.SpringBootServletInitializer;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
@EnableAutoConfiguration
diff --git a/spring-rest-simple/src/main/java/org/baeldung/config/WebConfig.java b/spring-rest-simple/src/main/java/org/baeldung/config/WebConfig.java
index 309a36609a..191b87a8f2 100644
--- a/spring-rest-simple/src/main/java/org/baeldung/config/WebConfig.java
+++ b/spring-rest-simple/src/main/java/org/baeldung/config/WebConfig.java
@@ -14,7 +14,7 @@ import org.springframework.http.converter.xml.MarshallingHttpMessageConverter;
import org.springframework.oxm.xstream.XStreamMarshaller;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.text.SimpleDateFormat;
import java.util.List;
@@ -25,7 +25,7 @@ import java.util.List;
@Configuration
@EnableWebMvc
@ComponentScan({ "org.baeldung.web" })
-public class WebConfig extends WebMvcConfigurerAdapter {
+public class WebConfig implements WebMvcConfigurer {
public WebConfig() {
super();
@@ -48,7 +48,6 @@ public class WebConfig extends WebMvcConfigurerAdapter {
messageConverters.add(new ProtobufHttpMessageConverter());
messageConverters.add(new KryoHttpMessageConverter());
messageConverters.add(new StringHttpMessageConverter());
- super.configureMessageConverters(messageConverters);
}
private HttpMessageConverter createXmlHttpMessageConverter() {
diff --git a/spring-rest-simple/src/main/resources/application.properties b/spring-rest-simple/src/main/resources/application.properties
index 300589f561..dd7e4e2f2d 100644
--- a/spring-rest-simple/src/main/resources/application.properties
+++ b/spring-rest-simple/src/main/resources/application.properties
@@ -1,2 +1,2 @@
server.port= 8082
-server.context-path=/spring-rest
\ No newline at end of file
+server.servlet.context-path=/spring-rest
\ No newline at end of file
diff --git a/spring-rest-template/README.md b/spring-rest-template/README.md
index d69d5c01c7..2c31796080 100644
--- a/spring-rest-template/README.md
+++ b/spring-rest-template/README.md
@@ -5,3 +5,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
### Relevant Articles:
- [Uploading MultipartFile with Spring RestTemplate](http://www.baeldung.com/spring-rest-template-multipart-upload)
+- [Mocking a RestTemplate in Spring](https://www.baeldung.com/spring-mock-rest-template)
diff --git a/spring-rest/README.md b/spring-rest/README.md
index d449a4d92a..5b8a35a4a5 100644
--- a/spring-rest/README.md
+++ b/spring-rest/README.md
@@ -23,3 +23,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Using the Spring RestTemplate Interceptor](http://www.baeldung.com/spring-rest-template-interceptor)
- [Get and Post Lists of Objects with RestTemplate](http://www.baeldung.com/spring-rest-template-list)
- [How to Set a Header on a Response with Spring 5](http://www.baeldung.com/spring-response-header)
+- [Spring’s RequestBody and ResponseBody Annotations](https://www.baeldung.com/spring-request-response-body)
diff --git a/spring-resttemplate/pom.xml b/spring-resttemplate/pom.xml
index 481104372a..9a0978f120 100644
--- a/spring-resttemplate/pom.xml
+++ b/spring-resttemplate/pom.xml
@@ -8,10 +8,10 @@
war
- parent-boot-1
+ parent-boot-2
com.baeldung
0.0.1-SNAPSHOT
- ../parent-boot-1
+ ../parent-boot-2
diff --git a/spring-resttemplate/src/main/java/org/baeldung/web/model/Employee.java b/spring-resttemplate/src/main/java/org/baeldung/web/model/Employee.java
new file mode 100644
index 0000000000..7cab4a0430
--- /dev/null
+++ b/spring-resttemplate/src/main/java/org/baeldung/web/model/Employee.java
@@ -0,0 +1,48 @@
+package org.baeldung.web.model;
+
+import java.util.Date;
+import java.util.Objects;
+
+public class Employee {
+
+ private String id;
+ private String name;
+
+ public Employee(String id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public Employee() {
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+ Employee employee = (Employee) o;
+ return Objects.equals(id, employee.id);
+ }
+
+ @Override public int hashCode() {
+
+ return Objects.hash(id);
+ }
+}
diff --git a/spring-resttemplate/src/main/java/org/baeldung/web/service/EmployeeService.java b/spring-resttemplate/src/main/java/org/baeldung/web/service/EmployeeService.java
new file mode 100644
index 0000000000..91614e90ad
--- /dev/null
+++ b/spring-resttemplate/src/main/java/org/baeldung/web/service/EmployeeService.java
@@ -0,0 +1,29 @@
+package org.baeldung.web.service;
+
+import org.baeldung.web.model.Employee;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+@Service
+public class EmployeeService {
+
+ static final String EMP_URL_PREFIX = "http://localhost:8080/employee";
+ static final String URL_SEP = "/";
+
+ private static final Logger logger = LoggerFactory.getLogger(EmployeeService.class);
+
+ @Autowired
+ private RestTemplate restTemplate;
+
+ public Employee getEmployee(String id) {
+
+ ResponseEntity resp = restTemplate.getForEntity("http://localhost:8080/employee/" + id,
+ Employee.class);
+ return resp.getStatusCode() == HttpStatus.OK ? resp.getBody() : null;
+ }
+}
diff --git a/spring-resttemplate/src/test/java/org/baeldung/SpringTestConfig.java b/spring-resttemplate/src/test/java/org/baeldung/SpringTestConfig.java
new file mode 100644
index 0000000000..7c4bbb4e5e
--- /dev/null
+++ b/spring-resttemplate/src/test/java/org/baeldung/SpringTestConfig.java
@@ -0,0 +1,19 @@
+package org.baeldung;
+
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+@EnableAutoConfiguration
+@ComponentScan("org.baeldung")
+public class SpringTestConfig {
+
+ @Bean
+ public RestTemplate restTemplate() {
+ return new RestTemplate();
+ }
+
+}
diff --git a/spring-resttemplate/src/test/java/org/baeldung/client/TestRestTemplateBasicLiveTest.java b/spring-resttemplate/src/test/java/org/baeldung/client/TestRestTemplateBasicLiveTest.java
index 012221efb7..e303c75a28 100644
--- a/spring-resttemplate/src/test/java/org/baeldung/client/TestRestTemplateBasicLiveTest.java
+++ b/spring-resttemplate/src/test/java/org/baeldung/client/TestRestTemplateBasicLiveTest.java
@@ -1,7 +1,9 @@
package org.baeldung.client;
-import okhttp3.Request;
-import okhttp3.RequestBody;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertTrue;
+
import org.junit.Before;
import org.junit.Test;
import org.springframework.boot.test.web.client.TestRestTemplate;
@@ -12,9 +14,8 @@ import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertTrue;
+import okhttp3.Request;
+import okhttp3.RequestBody;
public class TestRestTemplateBasicLiveTest {
@@ -39,7 +40,9 @@ public class TestRestTemplateBasicLiveTest {
@Test
public void givenRestTemplateWrapper_whenSendGetForEntity_thenStatusOk() {
- TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplate);
+ RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder();
+ restTemplateBuilder.configure(restTemplate);
+ TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplateBuilder);
ResponseEntity response = testRestTemplate.getForEntity(FOO_RESOURCE_URL + "/1", String.class);
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
}
@@ -55,7 +58,9 @@ public class TestRestTemplateBasicLiveTest {
@Test
public void givenRestTemplateWrapperWithCredentials_whenSendGetForEntity_thenStatusOk() {
- TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplate, "user", "passwd");
+ RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder();
+ restTemplateBuilder.configure(restTemplate);
+ TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplateBuilder, "user", "passwd");
ResponseEntity response = testRestTemplate.getForEntity(URL_SECURED_BY_AUTHENTICATION,
String.class);
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
diff --git a/spring-resttemplate/src/test/java/org/baeldung/web/service/EmployeeServiceMockRestServiceServerUnitTest.java b/spring-resttemplate/src/test/java/org/baeldung/web/service/EmployeeServiceMockRestServiceServerUnitTest.java
new file mode 100644
index 0000000000..a45af318f1
--- /dev/null
+++ b/spring-resttemplate/src/test/java/org/baeldung/web/service/EmployeeServiceMockRestServiceServerUnitTest.java
@@ -0,0 +1,66 @@
+package org.baeldung.web.service;
+
+import static org.springframework.test.web.client.match.MockRestRequestMatchers.method;
+import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo;
+import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus;
+
+import java.net.URI;
+
+import org.baeldung.SpringTestConfig;
+import org.baeldung.web.model.Employee;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.client.ExpectedCount;
+import org.springframework.test.web.client.MockRestServiceServer;
+import org.springframework.web.client.RestTemplate;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes = SpringTestConfig.class)
+public class EmployeeServiceMockRestServiceServerUnitTest {
+
+ private static final Logger logger = LoggerFactory.getLogger(EmployeeServiceMockRestServiceServerUnitTest.class);
+
+ @Autowired
+ private EmployeeService empService;
+
+ @Autowired
+ private RestTemplate restTemplate;
+
+ private MockRestServiceServer mockServer;
+
+ private ObjectMapper mapper = new ObjectMapper();
+
+ @Before
+ public void init() {
+ mockServer = MockRestServiceServer.createServer(restTemplate);
+ }
+
+ @Test
+ public void givenMockingIsDoneByMockRestServiceServer_whenGetIsCalled_shouldReturnMockedObject() throws Exception {
+ Employee emp = new Employee("E001", "Eric Simmons");
+
+ mockServer.expect(ExpectedCount.once(),
+ requestTo(new URI("http://localhost:8080/employee/E001")))
+ .andExpect(method(HttpMethod.GET))
+ .andRespond(withStatus(HttpStatus.OK)
+ .contentType(MediaType.APPLICATION_JSON)
+ .body(mapper.writeValueAsString(emp)));
+
+ Employee employee = empService.getEmployee("E001");
+ mockServer.verify();
+ Assert.assertEquals(emp, employee);
+ }
+
+}
diff --git a/spring-resttemplate/src/test/java/org/baeldung/web/service/EmployeeServiceUnitTest.java b/spring-resttemplate/src/test/java/org/baeldung/web/service/EmployeeServiceUnitTest.java
new file mode 100644
index 0000000000..23cd9a8fd2
--- /dev/null
+++ b/spring-resttemplate/src/test/java/org/baeldung/web/service/EmployeeServiceUnitTest.java
@@ -0,0 +1,41 @@
+package org.baeldung.web.service;
+
+import org.baeldung.web.model.Employee;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.RestTemplate;
+
+@RunWith(MockitoJUnitRunner.class)
+public class EmployeeServiceUnitTest {
+
+ private static final Logger logger = LoggerFactory.getLogger(EmployeeServiceUnitTest.class);
+
+ @Mock
+ private RestTemplate restTemplate;
+
+ @InjectMocks
+ private EmployeeService empService = new EmployeeService();
+
+ @Test
+ public void givenMockingIsDoneByMockito_whenGetIsCalled_shouldReturnMockedObject() throws Exception {
+ Employee emp = new Employee("E001", "Eric Simmons");
+ Mockito.when(restTemplate.getForEntity("http://localhost:8080/employee/E001", Employee.class))
+ .thenReturn(new ResponseEntity(emp, HttpStatus.OK));
+
+ Employee employee = empService.getEmployee("E001");
+
+ Assert.assertEquals(emp, employee);
+ }
+
+}
diff --git a/spring-resttemplate/src/test/resources/logback-test.xml b/spring-resttemplate/src/test/resources/logback-test.xml
new file mode 100644
index 0000000000..9f48d36486
--- /dev/null
+++ b/spring-resttemplate/src/test/resources/logback-test.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-roo/pom.xml b/spring-roo/pom.xml
index c205c98dc0..baa0e7f5e6 100644
--- a/spring-roo/pom.xml
+++ b/spring-roo/pom.xml
@@ -6,7 +6,7 @@
com.baeldung
spring-roo
1.0.0.BUILD-SNAPSHOT
- Spring Roo
+ spring-roo
jar
diff --git a/spring-security-angular/server/pom.xml b/spring-security-angular/server/pom.xml
index c1faecca55..55269bb35f 100644
--- a/spring-security-angular/server/pom.xml
+++ b/spring-security-angular/server/pom.xml
@@ -3,10 +3,10 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung
- spring-security-angular
+ server
0.0.1-SNAPSHOT
jar
- spring-security-angular
+ server
Spring Security Angular
diff --git a/spring-security-cache-control/pom.xml b/spring-security-cache-control/pom.xml
index b7dfc9db3a..c630774849 100644
--- a/spring-security-cache-control/pom.xml
+++ b/spring-security-cache-control/pom.xml
@@ -2,10 +2,10 @@
4.0.0
-
com.baeldung
spring-security-cache-control
1.0-SNAPSHOT
+ spring-security-cache-control
parent-boot-1
diff --git a/spring-security-client/spring-security-jsp-authentication/pom.xml b/spring-security-client/spring-security-jsp-authentication/pom.xml
index 0e564b47b8..9bb58863d9 100644
--- a/spring-security-client/spring-security-jsp-authentication/pom.xml
+++ b/spring-security-client/spring-security-jsp-authentication/pom.xml
@@ -6,7 +6,7 @@
spring-security-jsp-authentication
0.0.1-SNAPSHOT
war
- spring-security-jsp-authenticate
+ spring-security-jsp-authentication
Spring Security JSP Authentication tag sample
diff --git a/spring-security-mvc-boot/README.MD b/spring-security-mvc-boot/README.MD
index 6f01bfdc65..20036283a3 100644
--- a/spring-security-mvc-boot/README.MD
+++ b/spring-security-mvc-boot/README.MD
@@ -12,3 +12,4 @@ The "REST With Spring" Classes: http://github.learnspringsecurity.com
- [Spring Data with Spring Security](https://www.baeldung.com/spring-data-security)
- [Spring Security – Whitelist IP Range](https://www.baeldung.com/spring-security-whitelist-ip-range)
- [Find the Registered Spring Security Filters](https://www.baeldung.com/spring-security-registered-filters)
+- [HTTPS using Self-Signed Certificate in Spring Boot](https://www.baeldung.com/spring-boot-https-self-signed-certificate)
diff --git a/spring-security-mvc-login/src/main/java/com/baeldung/AppInitializer.java b/spring-security-mvc-login/src/main/java/com/baeldung/AppInitializer.java
new file mode 100644
index 0000000000..4f38d190eb
--- /dev/null
+++ b/spring-security-mvc-login/src/main/java/com/baeldung/AppInitializer.java
@@ -0,0 +1,33 @@
+package com.baeldung;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRegistration;
+
+import org.springframework.web.WebApplicationInitializer;
+import org.springframework.web.context.ContextLoaderListener;
+import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
+import org.springframework.web.context.support.GenericWebApplicationContext;
+import org.springframework.web.filter.DelegatingFilterProxy;
+import org.springframework.web.servlet.DispatcherServlet;
+
+public class AppInitializer implements WebApplicationInitializer {
+
+ @Override
+ public void onStartup(final ServletContext sc) throws ServletException {
+
+ AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext();
+
+ root.scan("com.baeldung");
+ sc.addListener(new ContextLoaderListener(root));
+
+ ServletRegistration.Dynamic appServlet = sc.addServlet("mvc", new DispatcherServlet(new GenericWebApplicationContext()));
+ appServlet.setLoadOnStartup(1);
+ appServlet.addMapping("/");
+
+ sc.addFilter("securityFilter", new DelegatingFilterProxy("springSecurityFilterChain"))
+ .addMappingForUrlPatterns(null, false, "/*");
+
+ }
+
+}
diff --git a/spring-security-mvc-login/src/main/java/org/baeldung/controller/SecuredResourceController.java b/spring-security-mvc-login/src/main/java/com/baeldung/controller/SecuredResourceController.java
similarity index 93%
rename from spring-security-mvc-login/src/main/java/org/baeldung/controller/SecuredResourceController.java
rename to spring-security-mvc-login/src/main/java/com/baeldung/controller/SecuredResourceController.java
index 4b68eee983..a458a5aeac 100644
--- a/spring-security-mvc-login/src/main/java/org/baeldung/controller/SecuredResourceController.java
+++ b/spring-security-mvc-login/src/main/java/com/baeldung/controller/SecuredResourceController.java
@@ -1,4 +1,4 @@
-package org.baeldung.controller;
+package com.baeldung.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
diff --git a/spring-security-mvc-login/src/main/java/org/baeldung/security/CustomAccessDeniedHandler.java b/spring-security-mvc-login/src/main/java/com/baeldung/security/CustomAccessDeniedHandler.java
similarity index 97%
rename from spring-security-mvc-login/src/main/java/org/baeldung/security/CustomAccessDeniedHandler.java
rename to spring-security-mvc-login/src/main/java/com/baeldung/security/CustomAccessDeniedHandler.java
index 64698072bc..9d9fa81dc0 100644
--- a/spring-security-mvc-login/src/main/java/org/baeldung/security/CustomAccessDeniedHandler.java
+++ b/spring-security-mvc-login/src/main/java/com/baeldung/security/CustomAccessDeniedHandler.java
@@ -1,4 +1,4 @@
-package org.baeldung.security;
+package com.baeldung.security;
import java.io.IOException;
diff --git a/spring-security-mvc-login/src/main/java/org/baeldung/security/CustomAuthenticationFailureHandler.java b/spring-security-mvc-login/src/main/java/com/baeldung/security/CustomAuthenticationFailureHandler.java
similarity index 96%
rename from spring-security-mvc-login/src/main/java/org/baeldung/security/CustomAuthenticationFailureHandler.java
rename to spring-security-mvc-login/src/main/java/com/baeldung/security/CustomAuthenticationFailureHandler.java
index 5eddf3883e..410d3f1ce9 100644
--- a/spring-security-mvc-login/src/main/java/org/baeldung/security/CustomAuthenticationFailureHandler.java
+++ b/spring-security-mvc-login/src/main/java/com/baeldung/security/CustomAuthenticationFailureHandler.java
@@ -1,4 +1,4 @@
-package org.baeldung.security;
+package com.baeldung.security;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.AuthenticationException;
diff --git a/spring-security-mvc-login/src/main/java/org/baeldung/security/CustomLogoutSuccessHandler.java b/spring-security-mvc-login/src/main/java/com/baeldung/security/CustomLogoutSuccessHandler.java
similarity index 96%
rename from spring-security-mvc-login/src/main/java/org/baeldung/security/CustomLogoutSuccessHandler.java
rename to spring-security-mvc-login/src/main/java/com/baeldung/security/CustomLogoutSuccessHandler.java
index 7360b4e03f..7949eee69a 100644
--- a/spring-security-mvc-login/src/main/java/org/baeldung/security/CustomLogoutSuccessHandler.java
+++ b/spring-security-mvc-login/src/main/java/com/baeldung/security/CustomLogoutSuccessHandler.java
@@ -1,4 +1,4 @@
-package org.baeldung.security;
+package com.baeldung.security;
import java.io.IOException;
diff --git a/spring-security-mvc-login/src/main/java/org/baeldung/security/RefererAuthenticationSuccessHandler.java b/spring-security-mvc-login/src/main/java/com/baeldung/security/RefererAuthenticationSuccessHandler.java
similarity index 92%
rename from spring-security-mvc-login/src/main/java/org/baeldung/security/RefererAuthenticationSuccessHandler.java
rename to spring-security-mvc-login/src/main/java/com/baeldung/security/RefererAuthenticationSuccessHandler.java
index 5b025d9fd1..05a2463699 100644
--- a/spring-security-mvc-login/src/main/java/org/baeldung/security/RefererAuthenticationSuccessHandler.java
+++ b/spring-security-mvc-login/src/main/java/com/baeldung/security/RefererAuthenticationSuccessHandler.java
@@ -1,4 +1,4 @@
-package org.baeldung.security;
+package com.baeldung.security;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
diff --git a/spring-security-mvc-login/src/main/java/org/baeldung/spring/ChannelSecSecurityConfig.java b/spring-security-mvc-login/src/main/java/com/baeldung/spring/ChannelSecSecurityConfig.java
similarity index 96%
rename from spring-security-mvc-login/src/main/java/org/baeldung/spring/ChannelSecSecurityConfig.java
rename to spring-security-mvc-login/src/main/java/com/baeldung/spring/ChannelSecSecurityConfig.java
index 4f736360b9..e9a6a9e120 100644
--- a/spring-security-mvc-login/src/main/java/org/baeldung/spring/ChannelSecSecurityConfig.java
+++ b/spring-security-mvc-login/src/main/java/com/baeldung/spring/ChannelSecSecurityConfig.java
@@ -1,6 +1,5 @@
-package org.baeldung.spring;
+package com.baeldung.spring;
-import org.baeldung.security.CustomLogoutSuccessHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@@ -10,6 +9,8 @@ import org.springframework.security.config.annotation.web.configuration.EnableWe
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
+import com.baeldung.security.CustomLogoutSuccessHandler;
+
@Configuration
// @ImportResource({ "classpath:channelWebSecurityConfig.xml" })
@EnableWebSecurity
diff --git a/spring-security-mvc-login/src/main/java/org/baeldung/spring/MvcConfig.java b/spring-security-mvc-login/src/main/java/com/baeldung/spring/MvcConfig.java
similarity index 97%
rename from spring-security-mvc-login/src/main/java/org/baeldung/spring/MvcConfig.java
rename to spring-security-mvc-login/src/main/java/com/baeldung/spring/MvcConfig.java
index b529048685..a9c7e0cf15 100644
--- a/spring-security-mvc-login/src/main/java/org/baeldung/spring/MvcConfig.java
+++ b/spring-security-mvc-login/src/main/java/com/baeldung/spring/MvcConfig.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring;
+package com.baeldung.spring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
diff --git a/spring-security-mvc-login/src/main/java/org/baeldung/spring/RedirectionSecurityConfig.java b/spring-security-mvc-login/src/main/java/com/baeldung/spring/RedirectionSecurityConfig.java
similarity index 97%
rename from spring-security-mvc-login/src/main/java/org/baeldung/spring/RedirectionSecurityConfig.java
rename to spring-security-mvc-login/src/main/java/com/baeldung/spring/RedirectionSecurityConfig.java
index 1472a1f89c..3516438a6e 100644
--- a/spring-security-mvc-login/src/main/java/org/baeldung/spring/RedirectionSecurityConfig.java
+++ b/spring-security-mvc-login/src/main/java/com/baeldung/spring/RedirectionSecurityConfig.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring;
+package com.baeldung.spring;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
diff --git a/spring-security-mvc-login/src/main/java/org/baeldung/spring/SecSecurityConfig.java b/spring-security-mvc-login/src/main/java/com/baeldung/spring/SecSecurityConfig.java
similarity index 94%
rename from spring-security-mvc-login/src/main/java/org/baeldung/spring/SecSecurityConfig.java
rename to spring-security-mvc-login/src/main/java/com/baeldung/spring/SecSecurityConfig.java
index 97ce6b5bc2..08a83f8633 100644
--- a/spring-security-mvc-login/src/main/java/org/baeldung/spring/SecSecurityConfig.java
+++ b/spring-security-mvc-login/src/main/java/com/baeldung/spring/SecSecurityConfig.java
@@ -1,8 +1,5 @@
-package org.baeldung.spring;
+package com.baeldung.spring;
-import org.baeldung.security.CustomAccessDeniedHandler;
-import org.baeldung.security.CustomAuthenticationFailureHandler;
-import org.baeldung.security.CustomLogoutSuccessHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@@ -16,6 +13,10 @@ import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
+import com.baeldung.security.CustomAccessDeniedHandler;
+import com.baeldung.security.CustomAuthenticationFailureHandler;
+import com.baeldung.security.CustomLogoutSuccessHandler;
+
@Configuration
// @ImportResource({ "classpath:webSecurityConfig.xml" })
@EnableWebSecurity
diff --git a/spring-security-mvc-login/src/main/webapp/WEB-INF/web.xml b/spring-security-mvc-login/src/main/webapp/WEB-INF/web-old.xml
similarity index 96%
rename from spring-security-mvc-login/src/main/webapp/WEB-INF/web.xml
rename to spring-security-mvc-login/src/main/webapp/WEB-INF/web-old.xml
index eef48ec9b3..bc6f310147 100644
--- a/spring-security-mvc-login/src/main/webapp/WEB-INF/web.xml
+++ b/spring-security-mvc-login/src/main/webapp/WEB-INF/web-old.xml
@@ -15,7 +15,7 @@
contextConfigLocation
- org.baeldung.spring
+ com.baeldung.spring
diff --git a/spring-security-mvc-login/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-security-mvc-login/src/test/java/com/baeldung/SpringContextIntegrationTest.java
similarity index 95%
rename from spring-security-mvc-login/src/test/java/org/baeldung/SpringContextIntegrationTest.java
rename to spring-security-mvc-login/src/test/java/com/baeldung/SpringContextIntegrationTest.java
index 1d7f9ae497..20de02d5c5 100644
--- a/spring-security-mvc-login/src/test/java/org/baeldung/SpringContextIntegrationTest.java
+++ b/spring-security-mvc-login/src/test/java/com/baeldung/SpringContextIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-security-mvc-login/src/test/java/org/baeldung/security/FormLoginUnitTest.java b/spring-security-mvc-login/src/test/java/com/baeldung/security/FormLoginUnitTest.java
similarity index 96%
rename from spring-security-mvc-login/src/test/java/org/baeldung/security/FormLoginUnitTest.java
rename to spring-security-mvc-login/src/test/java/com/baeldung/security/FormLoginUnitTest.java
index 4b3a091e6c..b7d959bf36 100644
--- a/spring-security-mvc-login/src/test/java/org/baeldung/security/FormLoginUnitTest.java
+++ b/spring-security-mvc-login/src/test/java/com/baeldung/security/FormLoginUnitTest.java
@@ -1,6 +1,5 @@
-package org.baeldung.security;
+package com.baeldung.security;
-import org.baeldung.spring.SecSecurityConfig;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -13,6 +12,8 @@ import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
+import com.baeldung.spring.SecSecurityConfig;
+
import javax.servlet.Filter;
import static org.junit.Assert.assertTrue;
diff --git a/spring-security-mvc-login/src/test/java/org/baeldung/security/RedirectionSecurityIntegrationTest.java b/spring-security-mvc-login/src/test/java/com/baeldung/security/RedirectionSecurityIntegrationTest.java
similarity index 99%
rename from spring-security-mvc-login/src/test/java/org/baeldung/security/RedirectionSecurityIntegrationTest.java
rename to spring-security-mvc-login/src/test/java/com/baeldung/security/RedirectionSecurityIntegrationTest.java
index 2b7a8ce5b9..1235e2e69f 100644
--- a/spring-security-mvc-login/src/test/java/org/baeldung/security/RedirectionSecurityIntegrationTest.java
+++ b/spring-security-mvc-login/src/test/java/com/baeldung/security/RedirectionSecurityIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.security;
+package com.baeldung.security;
import org.junit.Before;
import org.junit.Test;
diff --git a/spring-security-sso/pom.xml b/spring-security-sso/pom.xml
index 764e899640..6e61da1519 100644
--- a/spring-security-sso/pom.xml
+++ b/spring-security-sso/pom.xml
@@ -24,7 +24,7 @@
3.1.0
2.3.3.RELEASE
- 2.0.1.RELEASE
+ 2.0.1.RELEASE
-
\ No newline at end of file
+
diff --git a/spring-security-sso/spring-security-sso-auth-server/pom.xml b/spring-security-sso/spring-security-sso-auth-server/pom.xml
index 1d57248b30..ff76f377c6 100644
--- a/spring-security-sso/spring-security-sso-auth-server/pom.xml
+++ b/spring-security-sso/spring-security-sso-auth-server/pom.xml
@@ -24,7 +24,6 @@
spring-security-oauth2
${oauth.version}
-
-
\ No newline at end of file
+
diff --git a/spring-security-sso/spring-security-sso-ui-2/pom.xml b/spring-security-sso/spring-security-sso-ui-2/pom.xml
index afe7b59822..1f9a5754ae 100644
--- a/spring-security-sso/spring-security-sso-ui-2/pom.xml
+++ b/spring-security-sso/spring-security-sso-ui-2/pom.xml
@@ -42,4 +42,4 @@
-
\ No newline at end of file
+
diff --git a/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiWebConfig.java b/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiWebConfig.java
index 24d6c9b5d8..c17bb85173 100644
--- a/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiWebConfig.java
+++ b/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiWebConfig.java
@@ -3,15 +3,11 @@ package org.baeldung.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
-import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
-import org.springframework.web.servlet.config.annotation.EnableWebMvc;
-import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
-import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.springframework.web.servlet.config.annotation.*;
@Configuration
@EnableWebMvc
-public class UiWebConfig extends WebMvcConfigurerAdapter {
+public class UiWebConfig implements WebMvcConfigurer {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
@@ -25,7 +21,6 @@ public class UiWebConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(final ViewControllerRegistry registry) {
- super.addViewControllers(registry);
registry.addViewController("/")
.setViewName("forward:/index");
registry.addViewController("/index");
diff --git a/spring-security-sso/spring-security-sso-ui/pom.xml b/spring-security-sso/spring-security-sso-ui/pom.xml
index deb0e081be..56131749ba 100644
--- a/spring-security-sso/spring-security-sso-ui/pom.xml
+++ b/spring-security-sso/spring-security-sso-ui/pom.xml
@@ -43,4 +43,4 @@
-
\ No newline at end of file
+
diff --git a/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiWebConfig.java b/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiWebConfig.java
index 24d6c9b5d8..c17bb85173 100644
--- a/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiWebConfig.java
+++ b/spring-security-sso/spring-security-sso-ui/src/main/java/org/baeldung/config/UiWebConfig.java
@@ -3,15 +3,11 @@ package org.baeldung.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
-import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
-import org.springframework.web.servlet.config.annotation.EnableWebMvc;
-import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
-import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.springframework.web.servlet.config.annotation.*;
@Configuration
@EnableWebMvc
-public class UiWebConfig extends WebMvcConfigurerAdapter {
+public class UiWebConfig implements WebMvcConfigurer {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
@@ -25,7 +21,6 @@ public class UiWebConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(final ViewControllerRegistry registry) {
- super.addViewControllers(registry);
registry.addViewController("/")
.setViewName("forward:/index");
registry.addViewController("/index");
diff --git a/spring-security-x509/pom.xml b/spring-security-x509/pom.xml
index 0cee3b3129..658840e866 100644
--- a/spring-security-x509/pom.xml
+++ b/spring-security-x509/pom.xml
@@ -6,7 +6,8 @@
spring-security-x509
0.0.1-SNAPSHOT
pom
-
+ spring-security-x509
+
parent-boot-1
com.baeldung
diff --git a/spring-security-x509/spring-security-x509-basic-auth/pom.xml b/spring-security-x509/spring-security-x509-basic-auth/pom.xml
index 67f2b4fbcd..5b68a8e63b 100644
--- a/spring-security-x509/spring-security-x509-basic-auth/pom.xml
+++ b/spring-security-x509/spring-security-x509-basic-auth/pom.xml
@@ -2,11 +2,10 @@
4.0.0
-
spring-security-x509-basic-auth
0.0.1-SNAPSHOT
jar
- Spring Security x.509 Basic Authentication
+ spring-security-x509-basic-auth
Spring x.509 Authentication Demo
diff --git a/spring-security-x509/spring-security-x509-client-auth/pom.xml b/spring-security-x509/spring-security-x509-client-auth/pom.xml
index 5cb4001a94..47ec7f971d 100644
--- a/spring-security-x509/spring-security-x509-client-auth/pom.xml
+++ b/spring-security-x509/spring-security-x509-client-auth/pom.xml
@@ -2,11 +2,10 @@
4.0.0
-
spring-security-x509-client-auth
0.0.1-SNAPSHOT
jar
- Spring Security x.509 Client Authentication
+ spring-security-x509-client-auth
Spring x.509 Client Authentication Demo
diff --git a/spring-session/spring-session-redis/pom.xml b/spring-session/spring-session-redis/pom.xml
index 00da656226..96d90b2776 100644
--- a/spring-session/spring-session-redis/pom.xml
+++ b/spring-session/spring-session-redis/pom.xml
@@ -5,6 +5,7 @@
spring-session-redis
1.0.0-SNAPSHOT
jar
+ spring-session-redis
parent-boot-1
diff --git a/spring-sleuth/pom.xml b/spring-sleuth/pom.xml
index a9a8d3e96e..5ce9e07858 100644
--- a/spring-sleuth/pom.xml
+++ b/spring-sleuth/pom.xml
@@ -6,7 +6,8 @@
spring-sleuth
1.0.0-SNAPSHOT
jar
-
+ spring-sleuth
+
parent-boot-1
com.baeldung
diff --git a/spring-spel/pom.xml b/spring-spel/pom.xml
index 4af318fde2..aa6eb45158 100644
--- a/spring-spel/pom.xml
+++ b/spring-spel/pom.xml
@@ -5,7 +5,7 @@
com.baeldung
spring-spel
1.0-SNAPSHOT
- Spring SpEL
+ spring-spel
com.baeldung
diff --git a/spring-state-machine/pom.xml b/spring-state-machine/pom.xml
index 5d15e4dfad..b911b5b5ee 100644
--- a/spring-state-machine/pom.xml
+++ b/spring-state-machine/pom.xml
@@ -3,7 +3,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-state-machine
-
+ spring-state-machine
+
parent-modules
com.baeldung
diff --git a/spring-swagger-codegen/pom.xml b/spring-swagger-codegen/pom.xml
index 8e551d850f..e1bb98360e 100644
--- a/spring-swagger-codegen/pom.xml
+++ b/spring-swagger-codegen/pom.xml
@@ -4,6 +4,7 @@
spring-swagger-codegen
0.0.1-SNAPSHOT
pom
+ spring-swagger-codegen
com.baeldung
diff --git a/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml
index 4aff696828..f9410b6865 100644
--- a/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml
+++ b/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml
@@ -2,7 +2,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-swagger-codegen-app
-
+ spring-swagger-codegen-app
+
com.baeldung
spring-swagger-codegen
diff --git a/spring-thymeleaf/pom.xml b/spring-thymeleaf/pom.xml
index 0926728aba..78f95fe1df 100644
--- a/spring-thymeleaf/pom.xml
+++ b/spring-thymeleaf/pom.xml
@@ -5,6 +5,7 @@
spring-thymeleaf
0.1-SNAPSHOT
war
+ spring-thymeleaf
com.baeldung
diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java
index b8132cddc8..d10caee9e7 100644
--- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java
+++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java
@@ -21,16 +21,13 @@ import com.baeldung.thymeleaf.service.BookService;
@Controller
public class BookController {
- private static int currentPage = 1;
- private static int pageSize = 5;
-
@Autowired
private BookService bookService;
-
+
@RequestMapping(value = "/listBooks", method = RequestMethod.GET)
public String listBooks(Model model, @RequestParam("page") Optional page, @RequestParam("size") Optional size) {
- page.ifPresent(p -> currentPage = p);
- size.ifPresent(s -> pageSize = s);
+ final int currentPage = page.orElse(1);
+ final int pageSize = size.orElse(5);
Page bookPage = bookService.findPaginated(PageRequest.of(currentPage - 1, pageSize));
diff --git a/spring-userservice/pom.xml b/spring-userservice/pom.xml
index 7144a57ca6..e562171103 100644
--- a/spring-userservice/pom.xml
+++ b/spring-userservice/pom.xml
@@ -1,12 +1,12 @@
4.0.0
-
spring-userservice
spring-userservice
0.0.1-SNAPSHOT
war
-
+ spring-userservice
+
com.baeldung
parent-spring-4
diff --git a/spring-vertx/pom.xml b/spring-vertx/pom.xml
index 790eeff128..14ed77d359 100644
--- a/spring-vertx/pom.xml
+++ b/spring-vertx/pom.xml
@@ -2,10 +2,9 @@
4.0.0
-
spring-vertx
jar
- Spring Vertx
+ spring-vertx
A demo project with vertx spring integration
diff --git a/sse-jaxrs/pom.xml b/sse-jaxrs/pom.xml
index ac9bff937f..68d1b1bc2b 100644
--- a/sse-jaxrs/pom.xml
+++ b/sse-jaxrs/pom.xml
@@ -3,10 +3,10 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
com.baeldung.sse
sse-jaxrs
1.0-SNAPSHOT
+ sse-jaxrs
pom
diff --git a/sse-jaxrs/sse-jaxrs-client/pom.xml b/sse-jaxrs/sse-jaxrs-client/pom.xml
index a9068e133f..15a991bfc0 100644
--- a/sse-jaxrs/sse-jaxrs-client/pom.xml
+++ b/sse-jaxrs/sse-jaxrs-client/pom.xml
@@ -3,6 +3,8 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ sse-jaxrs-client
+ sse-jaxrs-client
com.baeldung.sse
@@ -10,8 +12,6 @@
1.0-SNAPSHOT
- sse-jaxrs-client
-
3.2.0
diff --git a/sse-jaxrs/sse-jaxrs-server/pom.xml b/sse-jaxrs/sse-jaxrs-server/pom.xml
index 1e89c70e13..825dcddbdf 100644
--- a/sse-jaxrs/sse-jaxrs-server/pom.xml
+++ b/sse-jaxrs/sse-jaxrs-server/pom.xml
@@ -3,16 +3,16 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
+ sse-jaxrs-server
+ war
+ sse-jaxrs-server
+
com.baeldung.sse
sse-jaxrs
1.0-SNAPSHOT
- sse-jaxrs-server
- war
-
2.4.2
false
diff --git a/static-analysis/pom.xml b/static-analysis/pom.xml
index 14853d81f7..94d68f895b 100644
--- a/static-analysis/pom.xml
+++ b/static-analysis/pom.xml
@@ -2,10 +2,10 @@
4.0.0
-
com.baeldung
static-analysis
1.0-SNAPSHOT
+ static-analysis
com.baeldung
diff --git a/structurizr/pom.xml b/structurizr/pom.xml
index cbbbf8d68c..76b1e355f1 100644
--- a/structurizr/pom.xml
+++ b/structurizr/pom.xml
@@ -2,9 +2,9 @@
4.0.0
-
com.baeldung
structurizr
+ structurizr
com.baeldung
diff --git a/struts-2/pom.xml b/struts-2/pom.xml
index fee68c8303..ac8579d9e0 100644
--- a/struts-2/pom.xml
+++ b/struts-2/pom.xml
@@ -5,7 +5,7 @@
struts-2
0.0.1-SNAPSHOT
pom
- Struts 2
+ struts-2
com.baeldung
diff --git a/testing-modules/gatling/pom.xml b/testing-modules/gatling/pom.xml
index 8d4c89ec62..158da176c6 100644
--- a/testing-modules/gatling/pom.xml
+++ b/testing-modules/gatling/pom.xml
@@ -6,7 +6,8 @@
org.baeldung
gatling
1.0-SNAPSHOT
-
+ gatling
+
com.baeldung
parent-modules
diff --git a/testing-modules/groovy-spock/pom.xml b/testing-modules/groovy-spock/pom.xml
index e0da345eb4..3dd01c29ab 100644
--- a/testing-modules/groovy-spock/pom.xml
+++ b/testing-modules/groovy-spock/pom.xml
@@ -6,6 +6,7 @@
groovy-spock
1.0-SNAPSHOT
jar
+ groovy-spock
com.baeldung
diff --git a/testing-modules/load-testing-comparison/pom.xml b/testing-modules/load-testing-comparison/pom.xml
new file mode 100644
index 0000000000..42614d310b
--- /dev/null
+++ b/testing-modules/load-testing-comparison/pom.xml
@@ -0,0 +1,149 @@
+
+
+ 4.0.0
+ load-testing-comparison
+ load-testing-comparison
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+ ../../pom.xml
+
+
+
+ 1.8
+ 1.8
+ UTF-8
+ 2.11.12
+ 2.2.5
+ 3.2.2
+ 2.2.1
+ 5.0
+ 3.11
+ 2.0.5.RELEASE
+
+
+
+
+ io.gatling
+ gatling-app
+ ${gatling.version}
+
+
+ io.gatling
+ gatling-recorder
+ ${gatling.version}
+
+
+ io.gatling.highcharts
+ gatling-charts-highcharts
+ ${gatling.version}
+
+
+ org.scala-lang
+ scala-library
+ ${scala.version}
+
+
+
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.9.4
+
+
+ org.springframework.boot
+ spring-boot-starter
+ ${spring.boot.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ ${spring.boot.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+ ${spring.boot.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ ${spring.boot.version}
+ test
+
+
+ com.h2database
+ h2
+ 1.4.197
+
+
+ org.projectlombok
+ lombok
+ 1.18.2
+ compile
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ 2.0.5.RELEASE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-boot/src/main/java/com/baeldung/mongodb/Application.java b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/Application.java
similarity index 88%
rename from spring-boot/src/main/java/com/baeldung/mongodb/Application.java
rename to testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/Application.java
index 092ce3352b..6647bcb640 100644
--- a/spring-boot/src/main/java/com/baeldung/mongodb/Application.java
+++ b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/Application.java
@@ -1,10 +1,11 @@
-package com.baeldung.mongodb;
+package com.baeldung.loadtesting;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
+
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
diff --git a/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/RewardsController.java b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/RewardsController.java
new file mode 100644
index 0000000000..50cc6fb7ab
--- /dev/null
+++ b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/RewardsController.java
@@ -0,0 +1,51 @@
+package com.baeldung.loadtesting;
+
+import com.baeldung.loadtesting.model.CustomerRewardsAccount;
+import com.baeldung.loadtesting.model.Transaction;
+import com.baeldung.loadtesting.repository.CustomerRewardsRepository;
+import com.baeldung.loadtesting.repository.TransactionRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Calendar;
+import java.util.List;
+import java.util.Optional;
+
+@RestController
+public class RewardsController {
+
+ @Autowired
+ private CustomerRewardsRepository customerRewardsRepository;
+
+ @Autowired
+ private TransactionRepository transactionRepository;
+
+ @PostMapping(path="/transactions/add")
+ public @ResponseBody Transaction saveTransactions(@RequestBody Transaction trnsctn){
+ trnsctn.setTransactionDate(Calendar.getInstance().getTime());
+ Transaction result = transactionRepository.save(trnsctn);
+ return result;
+ }
+
+ @GetMapping(path="/transactions/findAll/{rewardId}")
+ public @ResponseBody Iterable getTransactions(@PathVariable Integer rewardId){
+ return transactionRepository.findByCustomerRewardsId(rewardId);
+ }
+
+ @PostMapping(path="/rewards/add")
+ public @ResponseBody CustomerRewardsAccount addRewardsAcount(@RequestBody CustomerRewardsAccount body) {
+ Optional acct = customerRewardsRepository.findByCustomerId(body.getCustomerId());
+ return !acct.isPresent() ? customerRewardsRepository.save(body) : acct.get();
+ }
+
+ @GetMapping(path="/rewards/find/{customerId}")
+ public @ResponseBody
+ Optional find(@PathVariable Integer customerId) {
+ return customerRewardsRepository.findByCustomerId(customerId);
+ }
+
+ @GetMapping(path="/rewards/all")
+ public @ResponseBody List findAll() {
+ return customerRewardsRepository.findAll();
+ }
+}
diff --git a/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/TransactionController.java b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/TransactionController.java
new file mode 100644
index 0000000000..2ea2c06a41
--- /dev/null
+++ b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/TransactionController.java
@@ -0,0 +1,26 @@
+package com.baeldung.loadtesting;
+
+import com.baeldung.loadtesting.model.Transaction;
+import com.baeldung.loadtesting.repository.TransactionRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@Deprecated
+public class TransactionController {
+
+ @Autowired
+ private TransactionRepository transactionRepository;
+
+ @PostMapping(path="/addTransaction")
+ public @ResponseBody
+ String saveTransactions(@RequestBody Transaction trnsctn){
+ transactionRepository.save(trnsctn);
+ return "Saved Transaction.";
+ }
+
+ @GetMapping(path="/findAll/{rewardId}")
+ public @ResponseBody Iterable getTransactions(@RequestParam Integer id){
+ return transactionRepository.findByCustomerRewardsId(id);
+ }
+}
diff --git a/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/CustomerRewardsAccount.java b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/CustomerRewardsAccount.java
new file mode 100644
index 0000000000..2c6742fbaf
--- /dev/null
+++ b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/CustomerRewardsAccount.java
@@ -0,0 +1,22 @@
+package com.baeldung.loadtesting.model;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+import lombok.Data;
+
+@Entity
+@Data
+public class CustomerRewardsAccount {
+
+ @Id
+ @GeneratedValue(strategy= GenerationType.AUTO)
+ private Integer id;
+ private Integer customerId;
+
+ public Integer getCustomerId(){
+ return this.customerId;
+ }
+}
diff --git a/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/Transaction.java b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/Transaction.java
new file mode 100644
index 0000000000..312f52f4ab
--- /dev/null
+++ b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/Transaction.java
@@ -0,0 +1,30 @@
+package com.baeldung.loadtesting.model;
+
+import lombok.Data;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import java.util.Date;
+import java.util.Calendar;
+
+@Entity
+@Data
+public class Transaction {
+
+ @Id
+ @GeneratedValue(strategy= GenerationType.AUTO)
+ private Integer id;
+ private Integer customerRewardsId;
+ private Integer customerId;
+ private Date transactionDate;
+
+ public Transaction(){
+ transactionDate = Calendar.getInstance().getTime();
+ }
+
+ public void setTransactionDate(Date transactionDate){
+ this.transactionDate = transactionDate;
+ }
+}
diff --git a/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/CustomerRewardsRepository.java b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/CustomerRewardsRepository.java
new file mode 100644
index 0000000000..f945359eb8
--- /dev/null
+++ b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/CustomerRewardsRepository.java
@@ -0,0 +1,11 @@
+package com.baeldung.loadtesting.repository;
+
+import com.baeldung.loadtesting.model.CustomerRewardsAccount;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.Optional;
+
+public interface CustomerRewardsRepository extends JpaRepository {
+
+ Optional findByCustomerId(Integer customerId);
+}
diff --git a/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/TransactionRepository.java b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/TransactionRepository.java
new file mode 100644
index 0000000000..af0b343c10
--- /dev/null
+++ b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/TransactionRepository.java
@@ -0,0 +1,11 @@
+package com.baeldung.loadtesting.repository;
+
+import com.baeldung.loadtesting.model.Transaction;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface TransactionRepository extends JpaRepository {
+
+ List findByCustomerRewardsId(Integer rewardsId);
+}
diff --git a/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala b/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala
new file mode 100644
index 0000000000..f9b3837759
--- /dev/null
+++ b/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala
@@ -0,0 +1,52 @@
+package com.baeldung
+
+import scala.util._
+import io.gatling.core.Predef._
+import io.gatling.http.Predef._
+import scala.concurrent.duration._
+
+class RewardsScenario extends Simulation {
+
+ def randCustId() = Random.nextInt(99)
+
+ val httpProtocol = http.baseUrl("http://localhost:8080")
+ .acceptHeader("text/html,application/json;q=0.9,*/*;q=0.8")
+ .doNotTrackHeader("1")
+ .acceptLanguageHeader("en-US,en;q=0.5")
+ .acceptEncodingHeader("gzip, deflate")
+ .userAgentHeader("Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0")
+
+ val scn = scenario("RewardsScenario")
+ .repeat(10){
+ exec(http("transactions_add")
+ .post("/transactions/add/")
+ .body(StringBody("""{ "customerRewardsId":null,"customerId":""""+ randCustId() + """","transactionDate":null }""")).asJson
+ .check(jsonPath("$.id").saveAs("txnId"))
+ .check(jsonPath("$.transactionDate").saveAs("txtDate"))
+ .check(jsonPath("$.customerId").saveAs("custId")))
+ .pause(1)
+
+ .exec(http("get_reward")
+ .get("/rewards/find/${custId}")
+ .check(jsonPath("$.id").saveAs("rwdId")))
+ .pause(1)
+
+ .doIf("${rwdId.isUndefined()}"){
+ exec(http("rewards_add")
+ .post("/rewards/add")
+ .body(StringBody("""{ "customerId": "${custId}" }""")).asJson
+ .check(jsonPath("$.id").saveAs("rwdId")))
+ }
+
+ .exec(http("transactions_add")
+ .post("/transactions/add/")
+ .body(StringBody("""{ "customerRewardsId":"${rwdId}","customerId":"${custId}","transactionDate":"${txtDate}" }""")).asJson)
+ .pause(1)
+
+ .exec(http("get_reward")
+ .get("/transactions/findAll/${rwdId}"))
+ }
+ setUp(
+ scn.inject(atOnceUsers(100))
+ ).protocols(httpProtocol)
+}
\ No newline at end of file
diff --git a/testing-modules/load-testing-comparison/src/main/resources/scripts/JMeter/Test Plan.jmx b/testing-modules/load-testing-comparison/src/main/resources/scripts/JMeter/Test Plan.jmx
new file mode 100644
index 0000000000..da32a13a22
--- /dev/null
+++ b/testing-modules/load-testing-comparison/src/main/resources/scripts/JMeter/Test Plan.jmx
@@ -0,0 +1,293 @@
+
+
+
+
+
+ false
+ true
+ false
+
+
+
+
+
+
+
+ continue
+
+ false
+ 10
+
+ 100
+ 0
+ false
+
+
+
+
+
+ true
+ 1
+
+
+
+
+
+ Content-Type
+ application/json
+
+
+
+
+
+ true
+
+
+
+ false
+ {"customerRewardsId":null,"customerId":${random},"transactionDate":null}
+ =
+
+
+
+ localhost
+ 8080
+ http
+
+ /transactions/add
+ POST
+ true
+ false
+ true
+ false
+
+
+
+
+
+
+ txnId
+ $.id
+ 1
+ all
+ foo
+
+
+
+ txnDate
+ $.transactionDate
+ 1
+ Never
+
+
+
+ custId
+ $.customerId
+ 1
+ all
+ bob
+
+
+
+
+
+
+
+ localhost
+ 8080
+
+
+ /rewards/find/${custId}
+ GET
+ true
+ false
+ true
+ false
+
+
+
+
+
+
+ rwdId
+ $.id
+ 1
+ 0
+ all
+
+
+
+
+ ${rwdId} == 0
+ true
+
+
+
+ true
+
+
+
+ false
+ {"customerId":${custId}}
+ =
+
+
+
+ localhost
+ 8080
+
+
+ /rewards/add
+ POST
+ true
+ false
+ true
+ false
+
+
+
+
+
+
+ rwdId
+ $.id
+ 1
+ bar
+ all
+
+
+
+
+
+ true
+
+
+
+ false
+ {"id":${txnId},"customerRewardsId":${rwdId},"customerId":${custId},"transactionDate":"${txnDate}"}
+ =
+
+
+
+ localhost
+ 8080
+
+
+ /transactions/add
+ POST
+ true
+ false
+ true
+ false
+
+
+
+
+
+
+
+
+
+ localhost
+ 8080
+
+
+ /transactions/findAll/${rwdId}
+ GET
+ true
+ false
+ true
+ false
+
+
+
+
+
+
+
+ 10000
+ 1
+
+ false
+ 67
+ random
+
+
+
+ false
+
+ saveConfig
+
+
+ true
+ true
+ true
+
+ true
+ true
+ true
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+ true
+ 0
+ true
+ true
+ true
+ true
+ true
+ true
+
+
+
+
+
+
+ false
+
+ saveConfig
+
+
+ true
+ true
+ true
+
+ true
+ true
+ true
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+ true
+ 0
+ true
+ true
+ true
+ true
+ true
+ true
+
+
+
+
+
+
+
+
+
diff --git a/testing-modules/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.properties b/testing-modules/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.properties
new file mode 100644
index 0000000000..68adf90856
--- /dev/null
+++ b/testing-modules/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.properties
@@ -0,0 +1,5 @@
+grinder.script = grinder.py
+grinder.threads = 100
+grinder.processes = 1
+grinder.runs = 10
+grinder.logDirectory = /logs
diff --git a/testing-modules/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.py b/testing-modules/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.py
new file mode 100644
index 0000000000..025f90d38b
--- /dev/null
+++ b/testing-modules/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.py
@@ -0,0 +1,40 @@
+import java.util.Random
+from net.grinder.script import Test
+from net.grinder.script.Grinder import grinder
+from net.grinder.plugin.http import HTTPRequest, HTTPPluginControl, HTTPUtilities
+from HTTPClient import NVPair
+
+def parseJsonString(json, element):
+ for x in json.split(","):
+ pc = x.replace('"','').split(":")
+ if pc[0].replace("{","") == element:
+ ele = pc[1].replace("}","")
+ return ele
+ else:
+ return ""
+
+test1 = Test(1, "Request resource")
+request1 = HTTPRequest()
+headers = \
+( NVPair('Content-Type', 'application/json'), )
+request1.setHeaders(headers)
+utilities = HTTPPluginControl.getHTTPUtilities()
+test1.record(request1)
+random=java.util.Random()
+
+class TestRunner:
+ def __call__(self):
+ customerId = str(random.nextInt());
+
+ result = request1.POST("http://localhost:8080/transactions/add", "{"'"customerRewardsId"'":null,"'"customerId"'":"+ customerId + ","'"transactionDate"'":null}")
+ txnId = parseJsonString(result.getText(), "id")
+
+ result = request1.GET("http://localhost:8080/rewards/find/"+ customerId)
+ rwdId = parseJsonString(result.getText(), "id")
+
+ if rwdId == "":
+ result = request1.POST("http://localhost:8080/rewards/add", "{"'"customerId"'":"+ customerId + "}")
+ rwdId = parseJsonString(result.getText(), "id")
+
+ result = request1.POST("http://localhost:8080/transactions/add", "{"'"id"'":" + txnId + ","'"customerRewardsId"'":" + rwdId + ","'"customerId"'":"+ customerId + ","'"transactionDate"'":null}")
+ result = request1.GET("http://localhost:8080/transactions/findAll/" + rwdId)
\ No newline at end of file
diff --git a/testing-modules/mockito-2/pom.xml b/testing-modules/mockito-2/pom.xml
index cab4d7977b..5f60566566 100644
--- a/testing-modules/mockito-2/pom.xml
+++ b/testing-modules/mockito-2/pom.xml
@@ -5,7 +5,7 @@
mockito-2
0.0.1-SNAPSHOT
jar
- mockito-2-with-java8
+ mockito-2
com.baeldung
diff --git a/testing-modules/mockserver/pom.xml b/testing-modules/mockserver/pom.xml
index c2fa2870e2..1db409bd7c 100644
--- a/testing-modules/mockserver/pom.xml
+++ b/testing-modules/mockserver/pom.xml
@@ -5,7 +5,8 @@
com.baeldung
mockserver
1.0.0-SNAPSHOT
-
+ mockserver
+
com.baeldung
parent-modules
diff --git a/testing-modules/parallel-tests-junit/pom.xml b/testing-modules/parallel-tests-junit/pom.xml
index 3fd4e695e5..ecca8b3930 100644
--- a/testing-modules/parallel-tests-junit/pom.xml
+++ b/testing-modules/parallel-tests-junit/pom.xml
@@ -5,6 +5,8 @@
parallel-tests-junit
0.0.1-SNAPSHOT
pom
+ parallel-tests-junit
+
math-test-functions
string-test-functions
diff --git a/testing-modules/selenium-junit-testng/pom.xml b/testing-modules/selenium-junit-testng/pom.xml
index e22f7421cf..ae15fc97c0 100644
--- a/testing-modules/selenium-junit-testng/pom.xml
+++ b/testing-modules/selenium-junit-testng/pom.xml
@@ -4,7 +4,8 @@
com.baeldung
selenium-junit-testng
0.0.1-SNAPSHOT
-
+ selenium-junit-testng
+
com.baeldung
parent-modules
diff --git a/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/Employee.java b/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/Employee.java
new file mode 100644
index 0000000000..0677b05d66
--- /dev/null
+++ b/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/Employee.java
@@ -0,0 +1,23 @@
+package org.baeldung.reflectiontestutils.repository;
+
+public class Employee {
+ private Integer id;
+ private String name;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ private String employeeToString() {
+ return "id: " + getId() + "; name: " + getName();
+ }
+
+}
diff --git a/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/EmployeeService.java b/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/EmployeeService.java
new file mode 100644
index 0000000000..699ec3236c
--- /dev/null
+++ b/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/EmployeeService.java
@@ -0,0 +1,14 @@
+package org.baeldung.reflectiontestutils.repository;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class EmployeeService {
+ @Autowired
+ private HRService hrService;
+
+ public String findEmployeeStatus(Integer employeeId) {
+ return "Employee " + employeeId + " status: " + hrService.getEmployeeStatus(employeeId);
+ }
+}
diff --git a/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/HRService.java b/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/HRService.java
new file mode 100644
index 0000000000..e693aca764
--- /dev/null
+++ b/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/HRService.java
@@ -0,0 +1,11 @@
+package org.baeldung.reflectiontestutils.repository;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class HRService {
+
+ public String getEmployeeStatus(Integer employeeId) {
+ return "Inactive";
+ }
+}
diff --git a/testing-modules/spring-testing/src/test/java/org/baeldung/reflectiontestutils/ReflectionTestUtilsUnitTest.java b/testing-modules/spring-testing/src/test/java/org/baeldung/reflectiontestutils/ReflectionTestUtilsUnitTest.java
new file mode 100644
index 0000000000..64c7ca19ef
--- /dev/null
+++ b/testing-modules/spring-testing/src/test/java/org/baeldung/reflectiontestutils/ReflectionTestUtilsUnitTest.java
@@ -0,0 +1,46 @@
+package org.baeldung.reflectiontestutils;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.mock;
+
+import org.baeldung.reflectiontestutils.repository.Employee;
+import org.baeldung.reflectiontestutils.repository.EmployeeService;
+import org.baeldung.reflectiontestutils.repository.HRService;
+import org.junit.Test;
+import org.springframework.test.util.ReflectionTestUtils;
+
+import static org.mockito.Mockito.when;
+
+public class ReflectionTestUtilsUnitTest {
+
+ @Test
+ public void whenNonPublicField_thenReflectionTestUtilsSetField() {
+ Employee employee = new Employee();
+ ReflectionTestUtils.setField(employee, "id", 1);
+ assertTrue(employee.getId().equals(1));
+
+ }
+
+ @Test
+ public void whenNonPublicMethod_thenReflectionTestUtilsInvokeMethod() {
+ Employee employee = new Employee();
+ ReflectionTestUtils.setField(employee, "id", 1);
+ employee.setName("Smith, John");
+ assertTrue(ReflectionTestUtils.invokeMethod(employee, "employeeToString").equals("id: 1; name: Smith, John"));
+ }
+
+ @Test
+ public void whenInjectingMockOfDependency_thenReflectionTestUtilsSetField() {
+ Employee employee = new Employee();
+ ReflectionTestUtils.setField(employee, "id", 1);
+ employee.setName("Smith, John");
+
+ HRService hrService = mock(HRService.class);
+ when(hrService.getEmployeeStatus(employee.getId())).thenReturn("Active");
+ EmployeeService employeeService = new EmployeeService();
+
+ // Inject mock into the private field
+ ReflectionTestUtils.setField(employeeService, "hrService", hrService);
+ assertEquals("Employee " + employee.getId() + " status: Active", employeeService.findEmployeeStatus(employee.getId()));
+ }
+}
diff --git a/twilio/pom.xml b/twilio/pom.xml
index 610cc04b60..81fbf8ab20 100644
--- a/twilio/pom.xml
+++ b/twilio/pom.xml
@@ -4,7 +4,8 @@
4.0.0
twilio
1.0-SNAPSHOT
-
+ twilio
+
parent-modules
com.baeldung
diff --git a/vertx-and-rxjava/pom.xml b/vertx-and-rxjava/pom.xml
index cbc94dd8f1..389eaf687b 100644
--- a/vertx-and-rxjava/pom.xml
+++ b/vertx-and-rxjava/pom.xml
@@ -3,7 +3,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
vertx-and-rxjava
-
+ vertx-and-rxjava
+
com.baeldung
parent-modules
diff --git a/video-tutorials/jackson-annotations/pom.xml b/video-tutorials/jackson-annotations/pom.xml
index 748721b83c..121609ad4d 100644
--- a/video-tutorials/jackson-annotations/pom.xml
+++ b/video-tutorials/jackson-annotations/pom.xml
@@ -1,11 +1,10 @@
4.0.0
-
com.baeldung
jackson-annotations
1.0.0-SNAPSHOT
- jacksonannotation
+ jackson-annotations
com.baeldung
diff --git a/vraptor/pom.xml b/vraptor/pom.xml
index ae43d8e083..97005bd158 100644
--- a/vraptor/pom.xml
+++ b/vraptor/pom.xml
@@ -1,11 +1,11 @@
4.0.0
-
com.baeldung
vraptor
1.0.0
war
+ vraptor
A demo project to start using VRaptor 4
diff --git a/xmlunit-2/pom.xml b/xmlunit-2/pom.xml
index 806ebb6c0e..faefeca7a1 100644
--- a/xmlunit-2/pom.xml
+++ b/xmlunit-2/pom.xml
@@ -4,6 +4,7 @@
com.baeldung
xmlunit-2
1.0
+ xmlunit-2
com.baeldung