diff --git a/activejdbc/pom.xml b/activejdbc/pom.xml
index 7a49d37411..3a3a711d05 100644
--- a/activejdbc/pom.xml
+++ b/activejdbc/pom.xml
@@ -1,129 +1,129 @@
- 4.0.0
- com.baeldung
- activejdbc
- 1.0-SNAPSHOT
- jar
- activejdbc
- http://maven.apache.org
-
- UTF-8
- 1.4.13
- development.test,development
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.6.0
-
- 1.8
- 1.8
- UTF-8
-
-
-
- org.javalite
- activejdbc-instrumentation
- ${activejdbc.version}
-
-
- process-classes
-
- instrument
-
-
-
-
-
- org.javalite
- db-migrator-maven-plugin
- ${activejdbc.version}
-
- ${project.basedir}/src/main/resources/database.properties
- ${environments}
-
-
-
+ 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
+ activejdbc
+ 1.0-SNAPSHOT
+ jar
+ activejdbc
+ http://maven.apache.org
+
+ UTF-8
+ 1.4.13
+ development.test,development
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.6.0
+
+ 1.8
+ 1.8
+ UTF-8
+
+
+
+ org.javalite
+ activejdbc-instrumentation
+ ${activejdbc.version}
+
+
+ process-classes
+
+ instrument
+
+
+
+
+
+ org.javalite
+ db-migrator-maven-plugin
+ ${activejdbc.version}
+
+ ${project.basedir}/src/main/resources/database.properties
+ ${environments}
+
+
+
+ mysql
+ mysql-connector-java
+ 5.1.34
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.18.1
+
+ brief
+ true
+ false
+
+ **/*Spec*.java
+ **/*Test*.java
+
+
+ **/helpers/*
+ **/*$*
+
+
+
+
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.javalite
+ activejdbc
+ ${activejdbc.version}
+
+
+ opensymphony
+ oscache
+
+
+
+
mysql
mysql-connector-java
5.1.34
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.18.1
-
- brief
- true
- false
-
- **/*Spec*.java
- **/*Test*.java
-
-
- **/helpers/*
- **/*$*
-
-
-
-
-
-
-
- junit
- junit
- 4.12
- test
-
-
- org.javalite
- activejdbc
- ${activejdbc.version}
-
-
- opensymphony
- oscache
-
-
-
-
- mysql
- mysql-connector-java
- 5.1.34
-
-
- org.slf4j
- slf4j-simple
- 1.7.9
-
-
-
-
- snapshots1
- JavaLite Snapshots1
- http://repo.javalite.io/
-
- true
- always
- warn
-
-
-
-
-
- snapshots2
- JavaLite Snapshots2
- http://repo.javalite.io/
-
- true
- always
- warn
-
-
-
+
+
+ org.slf4j
+ slf4j-simple
+ 1.7.9
+
+
+
+
+ snapshots1
+ JavaLite Snapshots1
+ http://repo.javalite.io/
+
+ true
+ always
+ warn
+
+
+
+
+
+ snapshots2
+ JavaLite Snapshots2
+ http://repo.javalite.io/
+
+ true
+ always
+ warn
+
+
+
diff --git a/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationIntegrationTest.java
similarity index 99%
rename from apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java
rename to apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationIntegrationTest.java
index cd563b6270..546b8fe45c 100644
--- a/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java
+++ b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationIntegrationTest.java
@@ -19,7 +19,7 @@ import java.util.List;
import static junit.framework.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
-public class CayenneAdvancedOperationTests {
+public class CayenneAdvancedOperationIntegrationTest {
private static ObjectContext context = null;
@BeforeClass
diff --git a/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationTests.java b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationIntegrationTest.java
similarity index 98%
rename from apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationTests.java
rename to apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationIntegrationTest.java
index 8a0d210d8d..85f06d5538 100644
--- a/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationTests.java
+++ b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneOperationIntegrationTest.java
@@ -16,7 +16,7 @@ import static junit.framework.Assert.assertEquals;
import static org.junit.Assert.assertNull;
-public class CayenneOperationTests {
+public class CayenneOperationIntegrationTest {
private static ObjectContext context = null;
@BeforeClass
diff --git a/asm/pom.xml b/asm/pom.xml
index 407ceab458..ac0a6ccc6f 100644
--- a/asm/pom.xml
+++ b/asm/pom.xml
@@ -1,10 +1,12 @@
-
+
4.0.0
com.baeldung.examples
asm
1.0
jar
+
org.ow2.asm
@@ -17,12 +19,14 @@
5.2
+
UTF-8
1.8
1.8
-
+
+
org.apache.maven.plugins
diff --git a/aws/src/test/java/com/baeldung/dynamodb/ProductInfoRepositoryIntegrationTest.java b/aws/src/test/java/com/baeldung/dynamodb/ProductInfoRepositoryIntegrationTest.java
index 929a985067..18f55544cd 100644
--- a/aws/src/test/java/com/baeldung/dynamodb/ProductInfoRepositoryIntegrationTest.java
+++ b/aws/src/test/java/com/baeldung/dynamodb/ProductInfoRepositoryIntegrationTest.java
@@ -17,7 +17,6 @@ import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
-import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
diff --git a/aws/src/test/java/com/baeldung/s3/MultipartUploadTest.java b/aws/src/test/java/com/baeldung/s3/MultipartUploadLiveTest.java
similarity index 98%
rename from aws/src/test/java/com/baeldung/s3/MultipartUploadTest.java
rename to aws/src/test/java/com/baeldung/s3/MultipartUploadLiveTest.java
index bc8d517a0e..e2a34b1c39 100644
--- a/aws/src/test/java/com/baeldung/s3/MultipartUploadTest.java
+++ b/aws/src/test/java/com/baeldung/s3/MultipartUploadLiveTest.java
@@ -20,7 +20,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-public class MultipartUploadTest {
+public class MultipartUploadLiveTest {
private static final String BUCKET_NAME = "bucket_name";
private static final String KEY_NAME = "picture.jpg";
diff --git a/camel-api/pom.xml b/camel-api/pom.xml
index c342a73150..3f96e2209c 100644
--- a/camel-api/pom.xml
+++ b/camel-api/pom.xml
@@ -1,80 +1,79 @@
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ com.example
+ spring-boot-camel
+ 0.0.1-SNAPSHOT
+ Spring-Boot - Camel API
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
- 4.0.0
+
+
+ org.apache.camel
+ camel-servlet-starter
+ ${camel.version}
+
+
+ org.apache.camel
+ camel-jackson-starter
+ ${camel.version}
+
+
+ org.apache.camel
+ camel-swagger-java-starter
+ ${camel.version}
+
+
+ org.apache.camel
+ camel-spring-boot-starter
+ ${camel.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ ${spring-boot-starter.version}
+
+
- com.example
- spring-boot-camel
- 0.0.1-SNAPSHOT
+
+ spring-boot:run
- Spring-Boot - Camel API
+
+
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ 1.8
+ 1.8
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot-starter.version}
+
+
+
+ repackage
+
+
+
+
+
+
-
- UTF-8
- 3.7.0
- 2.19.1
- 2.19.1
- 1.5.4.RELEASE
-
+
+ UTF-8
+ 3.7.0
+ 2.19.1
+ 2.19.1
+ 1.5.4.RELEASE
+
-
-
- org.apache.camel
- camel-servlet-starter
- ${camel.version}
-
-
- org.apache.camel
- camel-jackson-starter
- ${camel.version}
-
-
- org.apache.camel
- camel-swagger-java-starter
- ${camel.version}
-
-
- org.apache.camel
- camel-spring-boot-starter
- ${camel.version}
-
-
- org.springframework.boot
- spring-boot-starter-web
- ${spring-boot-starter.version}
-
-
-
-
- spring-boot:run
-
-
-
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
- 1.8
- 1.8
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
-
- org.springframework.boot
- spring-boot-maven-plugin
- ${spring-boot-starter.version}
-
-
-
- repackage
-
-
-
-
-
-
diff --git a/core-groovy/src/test/groovy/com/baeldung/json/JsonParserTest.groovy b/core-groovy/src/test/groovy/com/baeldung/json/JsonParserTest.groovy
index c3842340a5..e65550a3be 100644
--- a/core-groovy/src/test/groovy/com/baeldung/json/JsonParserTest.groovy
+++ b/core-groovy/src/test/groovy/com/baeldung/json/JsonParserTest.groovy
@@ -24,7 +24,7 @@ class JsonParserTest extends Specification {
account.value == 15.6
}
- def 'Should parse to Account given Json String with date property' () {
+ /*def 'Should parse to Account given Json String with date property' () {
given:
def json = '{"id":"1234","value":15.6,"createdAt":"2018-01-01T00:00:00+0000"}'
when:
@@ -36,9 +36,9 @@ class JsonParserTest extends Specification {
account.value == 15.6
println account.createdAt
account.createdAt == Date.parse('yyyy-MM-dd', '2018-01-01')
- }
+ }*/
- def 'Should parse to Json given an Account object' () {
+ /*def 'Should parse to Json given an Account object' () {
given:
Account account = new Account(
id: '123',
@@ -50,7 +50,7 @@ class JsonParserTest extends Specification {
then:
json
json == '{"value":15.6,"createdAt":"2018-01-01T00:00:00+0000","id":"123"}'
- }
+ }*/
def 'Should prettify given a json string' () {
given:
diff --git a/core-java-8/pom.xml b/core-java-8/pom.xml
index 75728ecd13..924773cd02 100644
--- a/core-java-8/pom.xml
+++ b/core-java-8/pom.xml
@@ -8,7 +8,6 @@
core-java-8
-
com.baeldung
parent-modules
diff --git a/core-java-8/src/test/java/com/baeldung/time/ElapsedTimeUnitTest.java b/core-java-8/src/test/java/com/baeldung/time/ElapsedTimeUnitTest.java
new file mode 100644
index 0000000000..1d92684ef4
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/time/ElapsedTimeUnitTest.java
@@ -0,0 +1,76 @@
+package com.baeldung.time;
+
+import static org.junit.Assert.assertEquals;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.lang3.time.StopWatch;
+import org.junit.Test;
+
+public class ElapsedTimeUnitTest {
+
+ @Test
+ public void givenRunningTask_whenMeasuringTimeWithCurrentTimeMillis_thenGetElapsedTime() throws InterruptedException {
+ long start = System.currentTimeMillis();
+
+ simulateRunningTask();
+
+ long finish = System.currentTimeMillis();
+
+ long timeElapsed = finish - start;
+
+ assertEquals(true, (2000L <= timeElapsed) && (timeElapsed <= 3000L));
+ }
+
+ @Test
+ public void giveRunningTask_whenMeasuringTimeWithNanoTime_thenGetElapsedTime() throws InterruptedException {
+ long start = System.nanoTime();
+
+ simulateRunningTask();
+
+ long finish = System.nanoTime();
+
+ long timeElapsed = finish - start;
+
+ assertEquals(true, (2000000000L <= timeElapsed) && (timeElapsed <= 3000000000L));
+ }
+
+ @Test
+ public void givenRunningTask_whenMeasuringTimeWithStopWatch_thenGetElapsedTime() throws InterruptedException {
+ StopWatch watch = new StopWatch();
+ watch.start();
+
+ simulateRunningTask();
+
+ watch.stop();
+
+ long timeElapsed = watch.getTime();
+
+ assertEquals(true, (2000L <= timeElapsed) && (timeElapsed <= 3000L));
+ }
+
+ @Test
+ public void givenRunningTask_whenMeasuringTimeWithInstantClass_thenGetElapsedTime() throws InterruptedException {
+ Instant start = Instant.now();
+
+ simulateRunningTask();
+
+ Instant finish = Instant.now();
+
+ long timeElapsed = Duration.between(start, finish).toMillis();
+
+ assertEquals(true, (2000L <= timeElapsed) && (timeElapsed <= 3000L));
+ }
+
+ /**
+ * Simulate task running for 2.5 seconds.
+ *
+ * @throws InterruptedException
+ */
+ private static void simulateRunningTask() throws InterruptedException {
+ TimeUnit.MILLISECONDS.sleep(2500); // 2.5 seconds
+
+ }
+}
diff --git a/core-java/README.md b/core-java/README.md
index baf98a69fd..be2deffc4c 100644
--- a/core-java/README.md
+++ b/core-java/README.md
@@ -142,4 +142,5 @@
- [Guide to Inheritance in Java](http://www.baeldung.com/java-inheritance)
- [Guide to Externalizable Interface in Java](http://www.baeldung.com/java-externalizable)
- [The “final” Keyword in Java](http://www.baeldung.com/java-final)
+- [Inheritance and Composition (Is-a vs Has-a relationship) in Java](http://www.baeldung.com/java-inheritance-composition)
diff --git a/core-java/src/main/java/com/baeldung/system/ChatWindow.java b/core-java/src/main/java/com/baeldung/system/ChatWindow.java
new file mode 100644
index 0000000000..38bb9c63be
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/system/ChatWindow.java
@@ -0,0 +1,17 @@
+package com.baeldung.system;
+
+import java.awt.event.WindowEvent;
+
+/**
+ * Note: This class is not meant for unit-testing since it uses system
+ * features at low level and that it uses 'System' gc() which suggests
+ * JVM for garbage collection. But the usage below demonstrates how the
+ * method can be used.
+ */
+public class ChatWindow {
+ public void windowStateChanged(WindowEvent event) {
+ if (event.getNewState() == WindowEvent.WINDOW_DEACTIVATED ) {
+ System.gc(); // if it ends up running, great!
+ }
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/system/DateTimeService.java b/core-java/src/main/java/com/baeldung/system/DateTimeService.java
new file mode 100644
index 0000000000..ee13462d8a
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/system/DateTimeService.java
@@ -0,0 +1,16 @@
+package com.baeldung.system;
+
+import java.util.Date;
+
+public class DateTimeService {
+
+ // One hour from now
+ public long nowPlusOneHour() {
+ return System.currentTimeMillis() + 3600 * 1000L;
+ }
+
+ // Human-readable format
+ public String nowPrettyPrinted() {
+ return new Date(System.currentTimeMillis()).toString();
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/system/EnvironmentVariables.java b/core-java/src/main/java/com/baeldung/system/EnvironmentVariables.java
new file mode 100644
index 0000000000..53dc02a6f0
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/system/EnvironmentVariables.java
@@ -0,0 +1,7 @@
+package com.baeldung.system;
+
+public class EnvironmentVariables {
+ public String getPath() {
+ return System.getenv("PATH");
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/system/SystemErrDemo.java b/core-java/src/main/java/com/baeldung/system/SystemErrDemo.java
new file mode 100644
index 0000000000..0b1aeb95be
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/system/SystemErrDemo.java
@@ -0,0 +1,18 @@
+package com.baeldung.system;
+
+/**
+ * Note: This class is not meant for unit-testing since it uses system
+ * features at low level and that it uses 'System' standard error stream
+ * methods to show output on screen. Also unit-tests in CI environments
+ * don't have console output for user to see messages. But the usage below
+ * demonstrates how the methods can be used.
+ */
+public class SystemErrDemo {
+ public static void main(String[] args) {
+ // Print without 'hitting' return
+ System.err.print("some inline error message");
+
+ // Print and then 'hit' return
+ System.err.println("an error message having new line at the end");
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/system/SystemExitDemo.java b/core-java/src/main/java/com/baeldung/system/SystemExitDemo.java
new file mode 100644
index 0000000000..245d5724b8
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/system/SystemExitDemo.java
@@ -0,0 +1,24 @@
+package com.baeldung.system;
+
+/**
+ * Note: This class is not meant for unit-testing since it uses system
+ * features at low level and that it uses 'System' exit() which will
+ * exit the JVM. Also unit-tests in CI environments are not meant to
+ * exit unit tests like that. But the usage below demonstrates how the
+ * method can be used.
+ */
+public class SystemExitDemo {
+ public static void main(String[] args) {
+ boolean error = false;
+
+ // do something and set error value
+
+ if (error) {
+ System.exit(1); // error case exit
+ } else {
+ System.exit(0); // normal case exit
+ }
+
+ // Will not do anything after exit()
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/system/SystemOutDemo.java b/core-java/src/main/java/com/baeldung/system/SystemOutDemo.java
new file mode 100644
index 0000000000..474c4649c9
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/system/SystemOutDemo.java
@@ -0,0 +1,25 @@
+package com.baeldung.system;
+
+import java.io.FileNotFoundException;
+import java.io.PrintStream;
+
+/**
+ * Note: This class is not meant for unit-testing since it uses system
+ * features at low level and that it uses 'System' standard output stream
+ * methods to show output on screen. Also unit-tests in CI environments
+ * don't have console output for user to see messages. But the usage below
+ * demonstrates how the methods can be used.
+ */
+public class SystemOutDemo {
+
+ public static void main(String[] args) throws FileNotFoundException {
+ // Print without 'hitting' return
+ System.out.print("some inline message");
+
+ // Print and then 'hit' return
+ System.out.println("a message having new line at the end");
+
+ // Changes output stream to send messages to file.
+ System.setOut(new PrintStream("file.txt"));
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/system/UserCredentials.java b/core-java/src/main/java/com/baeldung/system/UserCredentials.java
new file mode 100644
index 0000000000..6f7debab24
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/system/UserCredentials.java
@@ -0,0 +1,35 @@
+package com.baeldung.system;
+
+import java.io.BufferedReader;
+import java.io.Console;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+/**
+ * Note: This class is not meant for unit-testing since it uses system
+ * features at low level and that it uses 'System' standard input stream
+ * methods to read text from user. Also unit-tests in CI environments
+ * don't have console input for user to type in text. But the usage below
+ * demonstrates how the methods can be used.
+ */
+public class UserCredentials {
+
+ public String readUsername(int length) throws IOException {
+ byte[] name = new byte[length];
+ System.in.read(name, 0, length); // by default, from the console
+ return new String(name);
+ }
+
+ public String readUsername() throws IOException {
+ BufferedReader reader =
+ new BufferedReader(new InputStreamReader(System.in));
+ return reader.readLine();
+ }
+
+ public String readUsernameWithPrompt() {
+ Console console = System.console();
+
+ return console == null ? null : // Console not available
+ console.readLine("%s", "Enter your name: ");
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/system/DateTimeServiceTest.java b/core-java/src/test/java/com/baeldung/system/DateTimeServiceTest.java
new file mode 100644
index 0000000000..587cd4ef20
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/system/DateTimeServiceTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.system;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class DateTimeServiceTest {
+
+ @Test
+ public void givenClass_whenCalledMethods_thenNotNullInResult() {
+ DateTimeService dateTimeService = new DateTimeService();
+
+ Assert.assertNotNull(dateTimeService.nowPlusOneHour());
+ Assert.assertNotNull(dateTimeService.nowPrettyPrinted());
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/system/EnvironmentVariablesTest.java b/core-java/src/test/java/com/baeldung/system/EnvironmentVariablesTest.java
new file mode 100644
index 0000000000..3722fea88f
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/system/EnvironmentVariablesTest.java
@@ -0,0 +1,14 @@
+package com.baeldung.system;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class EnvironmentVariablesTest {
+
+ @Test
+ public void givenEnvVars_whenReadPath_thenGetValueinResult() {
+ EnvironmentVariables environmentVariables = new EnvironmentVariables();
+
+ Assert.assertNotNull(environmentVariables.getPath());
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/system/SystemArrayCopyTest.java b/core-java/src/test/java/com/baeldung/system/SystemArrayCopyTest.java
new file mode 100644
index 0000000000..f54e3702c8
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/system/SystemArrayCopyTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.system;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SystemArrayCopyTest {
+
+ @Test
+ public void givenTwoArraysAB_whenUseArrayCopy_thenArrayCopiedFromAToBInResult() {
+ int[] a = {34, 22, 44, 2, 55, 3};
+ int[] b = new int[a.length];
+
+ // copy all elements from a to b
+ System.arraycopy(a, 0, b, 0, a.length);
+ Assert.assertArrayEquals(a, b);
+ }
+
+ @Test
+ public void givenTwoArraysAB_whenUseArrayCopyPosition_thenArrayCopiedFromAToBInResult() {
+ int[] a = {34, 22, 44, 2, 55, 3};
+ int[] b = new int[a.length];
+
+ // copy 2 elements from a, starting at a[1] to b, starting at b[3]
+ System.arraycopy(a, 1, b, 3, 2);
+ Assert.assertArrayEquals(new int[] {0, 0, 0, 22, 44, 0}, b);
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/system/SystemNanoTest.java b/core-java/src/test/java/com/baeldung/system/SystemNanoTest.java
new file mode 100644
index 0000000000..bf6590da0a
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/system/SystemNanoTest.java
@@ -0,0 +1,16 @@
+package com.baeldung.system;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SystemNanoTest {
+
+ @Test
+ public void givenSystem_whenCalledNanoTime_thenGivesTimeinResult() {
+ long startTime = System.nanoTime();
+ // do something that takes time
+ long endTime = System.nanoTime();
+
+ Assert.assertTrue(endTime - startTime < 10000);
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/system/SystemPropertiesTest.java b/core-java/src/test/java/com/baeldung/system/SystemPropertiesTest.java
new file mode 100644
index 0000000000..bbae75091a
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/system/SystemPropertiesTest.java
@@ -0,0 +1,54 @@
+package com.baeldung.system;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Properties;
+
+public class SystemPropertiesTest {
+
+ @Test
+ public void givenSystem_whenCalledGetProperty_thenReturnPropertyinResult() {
+ Assert.assertNotNull(System.getProperty("java.vm.vendor"));
+ }
+
+ @Test
+ public void givenSystem_whenCalledSetProperty_thenSetPropertyasResult() {
+
+ // set a particular property
+ System.setProperty("abckey", "abcvaluefoo");
+ Assert.assertEquals("abcvaluefoo", System.getProperty("abckey"));
+ }
+
+ @Test
+ public void givenSystem_whenCalledClearProperty_thenDeletePropertyasResult() {
+
+ // Delete a property
+ System.clearProperty("abckey");
+ Assert.assertNull(System.getProperty("abckey"));
+ }
+
+ @Test
+ public void givenSystem_whenCalledGetPropertyDefaultValue_thenReturnPropertyinResult() {
+
+ System.clearProperty("dbHost");
+ String myKey = System.getProperty("dbHost", "db.host.com");
+ Assert.assertEquals("db.host.com", myKey);
+ }
+
+ @Test
+ public void givenSystem_whenCalledGetProperties_thenReturnPropertiesinResult() {
+ Properties properties = System.getProperties();
+
+ Assert.assertNotNull(properties);
+ }
+
+ @Test
+ public void givenSystem_whenCalledClearProperties_thenDeleteAllPropertiesasResult() {
+
+ // Clears all system properties. Use with care!
+ System.getProperties().clear();
+
+ Assert.assertTrue(System.getProperties().isEmpty());
+ }
+}
diff --git a/core-kotlin/README.md b/core-kotlin/README.md
index b8cea19c58..2f693bdffa 100644
--- a/core-kotlin/README.md
+++ b/core-kotlin/README.md
@@ -21,3 +21,4 @@
- [Try-with-resources in Kotlin](http://www.baeldung.com/kotlin-try-with-resources)
- [HTTP Requests with Kotlin and khttp](http://www.baeldung.com/kotlin-khttp)
- [Kotlin Dependency Injection with Kodein](http://www.baeldung.com/kotlin-kodein-dependency-injection)
+- [Objects in Kotlin](http://www.baeldung.com/kotlin-objects)
diff --git a/javafx/.gitignore b/javafx/.gitignore
new file mode 100644
index 0000000000..dfbd063287
--- /dev/null
+++ b/javafx/.gitignore
@@ -0,0 +1,6 @@
+# Created by .ignore support plugin (hsz.mobi)
+.idea
+classes
+target
+*.iml
+out
\ No newline at end of file
diff --git a/javafx/README.md b/javafx/README.md
new file mode 100644
index 0000000000..483c556ca7
--- /dev/null
+++ b/javafx/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+-
+
diff --git a/javafx/pom.xml b/javafx/pom.xml
new file mode 100644
index 0000000000..bcad64aca5
--- /dev/null
+++ b/javafx/pom.xml
@@ -0,0 +1,15 @@
+
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+ 4.0.0
+
+ javafx
+
+
+
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/javafx/Main.java b/javafx/src/main/java/com/baeldung/Main.java
similarity index 96%
rename from core-java/src/main/java/com/baeldung/javafx/Main.java
rename to javafx/src/main/java/com/baeldung/Main.java
index f68121b394..59e24209b5 100644
--- a/core-java/src/main/java/com/baeldung/javafx/Main.java
+++ b/javafx/src/main/java/com/baeldung/Main.java
@@ -1,4 +1,4 @@
-package com.baeldung.javafx;
+package com.baeldung;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
diff --git a/core-java/src/main/java/com/baeldung/javafx/model/Person.java b/javafx/src/main/java/com/baeldung/model/Person.java
similarity index 97%
rename from core-java/src/main/java/com/baeldung/javafx/model/Person.java
rename to javafx/src/main/java/com/baeldung/model/Person.java
index dd473e84b4..0b915832ce 100644
--- a/core-java/src/main/java/com/baeldung/javafx/model/Person.java
+++ b/javafx/src/main/java/com/baeldung/model/Person.java
@@ -1,4 +1,4 @@
-package com.baeldung.javafx.model;
+package com.baeldung.model;
import javafx.beans.property.*;
diff --git a/core-java/src/main/java/com/baeldung/javafx/view/SearchController.java b/javafx/src/main/java/com/baeldung/view/SearchController.java
similarity index 96%
rename from core-java/src/main/java/com/baeldung/javafx/view/SearchController.java
rename to javafx/src/main/java/com/baeldung/view/SearchController.java
index f506981714..430580f8b5 100644
--- a/core-java/src/main/java/com/baeldung/javafx/view/SearchController.java
+++ b/javafx/src/main/java/com/baeldung/view/SearchController.java
@@ -1,7 +1,7 @@
-package com.baeldung.javafx.view;
+package com.baeldung.view;
-import com.baeldung.javafx.model.Person;
+import com.baeldung.model.Person;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.Task;
@@ -11,7 +11,6 @@ import javafx.scene.control.*;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.VBox;
-import java.util.List;
import java.util.stream.Collectors;
public class SearchController {
diff --git a/core-java/src/main/resources/SearchController.fxml b/javafx/src/main/resources/SearchController.fxml
similarity index 93%
rename from core-java/src/main/resources/SearchController.fxml
rename to javafx/src/main/resources/SearchController.fxml
index a894b0260b..5e83024d03 100644
--- a/core-java/src/main/resources/SearchController.fxml
+++ b/javafx/src/main/resources/SearchController.fxml
@@ -7,7 +7,7 @@
diff --git a/core-java/src/main/resources/search.css b/javafx/src/main/resources/search.css
similarity index 100%
rename from core-java/src/main/resources/search.css
rename to javafx/src/main/resources/search.css
diff --git a/libraries/helloWorld.docx b/libraries/helloWorld.docx
index 12eba0a6c8..e5b13448a9 100644
Binary files a/libraries/helloWorld.docx and b/libraries/helloWorld.docx differ
diff --git a/libraries/pom.xml b/libraries/pom.xml
index 0054051448..3a43c12c41 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -270,6 +270,12 @@
net.openhft
chronicle
3.6.4
+
+
+ com.sun.java
+ tools
+
+
org.springframework
@@ -675,6 +681,7 @@
4.5.1
+
maven2-repository.dev.java.net
@@ -772,17 +779,6 @@
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.18.1
-
-
- **/*IntegrationTest.java
- **/*LiveTest.java
-
-
-
diff --git a/libraries/src/main/java/com/baeldung/netty/CalculatorOperationHandler.java b/libraries/src/main/java/com/baeldung/netty/CalculatorOperationHandler.java
new file mode 100644
index 0000000000..4d4cba259b
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/netty/CalculatorOperationHandler.java
@@ -0,0 +1,49 @@
+package com.baeldung.netty;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.SimpleChannelInboundHandler;
+import io.netty.handler.codec.http.*;
+import io.netty.util.CharsetUtil;
+
+public class CalculatorOperationHandler extends SimpleChannelInboundHandler {
+
+ protected void channelRead0(ChannelHandlerContext ctx, Operation msg) throws Exception {
+ Long result = calculateEndpoint(msg);
+ sendHttpResponse(ctx, new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.CREATED), result.toString());
+ ctx.fireChannelRead(result);
+ }
+
+ private long calculateEndpoint(Operation operation) {
+
+ String operator = operation.getOperator().toLowerCase().trim();
+ switch (operator) {
+ case "add":
+ return operation.getNumber1() + operation.getNumber2();
+ case "multiply":
+ return operation.getNumber1() * operation.getNumber2();
+ default:
+ throw new IllegalArgumentException("Operation not defined");
+ }
+ }
+
+ public static void sendHttpResponse(ChannelHandlerContext ctx, FullHttpResponse res, String content) {
+
+ // Generate an error page if response getStatus code is not OK (200).
+ ByteBuf buf = Unpooled.copiedBuffer(content, CharsetUtil.UTF_8);
+ res.content().writeBytes(buf);
+
+ HttpUtil.setContentLength(res, res.content().readableBytes());
+
+ ctx.channel().writeAndFlush(res);
+ }
+
+ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
+ throws Exception {
+
+ sendHttpResponse(ctx, new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.INTERNAL_SERVER_ERROR), "Operation not defined");
+ ctx.fireExceptionCaught(cause);
+ }
+
+}
diff --git a/libraries/src/main/java/com/baeldung/netty/HttpMessageHandler.java b/libraries/src/main/java/com/baeldung/netty/HttpMessageHandler.java
new file mode 100644
index 0000000000..58a81432b6
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/netty/HttpMessageHandler.java
@@ -0,0 +1,40 @@
+package com.baeldung.netty;
+
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.SimpleChannelInboundHandler;
+import io.netty.handler.codec.http.FullHttpRequest;
+import io.netty.handler.codec.http.HttpHeaders;
+import io.netty.handler.codec.http.HttpMethod;
+
+public class HttpMessageHandler extends SimpleChannelInboundHandler {
+
+ protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest msg) throws Exception {
+
+ String uri = msg.uri();
+ HttpMethod httpMethod = msg.method();
+ HttpHeaders headers = msg.headers();
+
+ if (HttpMethod.GET == httpMethod) {
+
+ String[] uriComponents = uri.split("[?]");
+ String endpoint = uriComponents[0];
+ String[] queryParams = uriComponents[1].split("&");
+
+ if ("/calculate".equalsIgnoreCase(endpoint)) {
+
+ String[] firstQueryParam = queryParams[0].split("=");
+ String[] secondQueryParam = queryParams[1].split("=");
+
+ Integer a = Integer.valueOf(firstQueryParam[1]);
+ Integer b = Integer.valueOf(secondQueryParam[1]);
+ String operator = headers.get("operator");
+
+ Operation operation = new Operation(a, b, operator);
+ ctx.fireChannelRead(operation);
+ }
+ } else {
+ throw new UnsupportedOperationException("HTTP method not supported");
+ }
+
+ }
+}
diff --git a/libraries/src/main/java/com/baeldung/netty/Operation.java b/libraries/src/main/java/com/baeldung/netty/Operation.java
new file mode 100644
index 0000000000..136316ed7c
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/netty/Operation.java
@@ -0,0 +1,49 @@
+package com.baeldung.netty;
+
+import java.io.Serializable;
+
+public class Operation implements Serializable {
+
+ private Integer number1;
+ private Integer number2;
+ private String operator;
+
+ public Operation(Integer number1, Integer number2, String operator) {
+ this.number1 = number1;
+ this.number2 = number2;
+ this.operator = operator;
+ }
+
+ public Integer getNumber1() {
+ return number1;
+ }
+
+ public void setNumber1(Integer number1) {
+ this.number1 = number1;
+ }
+
+ public Integer getNumber2() {
+ return number2;
+ }
+
+ public void setNumber2(Integer number2) {
+ this.number2 = number2;
+ }
+
+ public String getOperator() {
+ return operator;
+ }
+
+ public void setOperator(String operator) {
+ this.operator = operator;
+ }
+
+ @Override
+ public String toString() {
+ return "Operation{" +
+ "number1=" + number1 +
+ ", number2=" + number2 +
+ ", operator='" + operator + '\'' +
+ '}';
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/asynchttpclient/AsyncHttpClientTestCase.java b/libraries/src/test/java/com/baeldung/asynchttpclient/AsyncHttpClientLiveTest.java
similarity index 99%
rename from libraries/src/test/java/com/baeldung/asynchttpclient/AsyncHttpClientTestCase.java
rename to libraries/src/test/java/com/baeldung/asynchttpclient/AsyncHttpClientLiveTest.java
index 7ff81c20c3..4d35dd79da 100644
--- a/libraries/src/test/java/com/baeldung/asynchttpclient/AsyncHttpClientTestCase.java
+++ b/libraries/src/test/java/com/baeldung/asynchttpclient/AsyncHttpClientLiveTest.java
@@ -28,7 +28,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
-public class AsyncHttpClientTestCase {
+public class AsyncHttpClientLiveTest {
private static AsyncHttpClient HTTP_CLIENT;
diff --git a/libraries/src/test/java/com/baeldung/atlassian/fugue/FugueTest.java b/libraries/src/test/java/com/baeldung/atlassian/fugue/FugueTest.java
index 3a1597d1fe..2ba1086226 100644
--- a/libraries/src/test/java/com/baeldung/atlassian/fugue/FugueTest.java
+++ b/libraries/src/test/java/com/baeldung/atlassian/fugue/FugueTest.java
@@ -2,7 +2,6 @@ package com.baeldung.atlassian.fugue;
import io.atlassian.fugue.*;
import org.junit.Assert;
-import org.junit.Before;
import org.junit.Test;
import java.util.*;
diff --git a/libraries/src/test/java/com/baeldung/awaitility/AsyncServiceLongRunningUnitTest.java b/libraries/src/test/java/com/baeldung/awaitility/AsyncServiceLongRunningManualTest.java
similarity index 98%
rename from libraries/src/test/java/com/baeldung/awaitility/AsyncServiceLongRunningUnitTest.java
rename to libraries/src/test/java/com/baeldung/awaitility/AsyncServiceLongRunningManualTest.java
index 87c0b13bcc..1dde152299 100644
--- a/libraries/src/test/java/com/baeldung/awaitility/AsyncServiceLongRunningUnitTest.java
+++ b/libraries/src/test/java/com/baeldung/awaitility/AsyncServiceLongRunningManualTest.java
@@ -16,7 +16,7 @@ import static org.awaitility.Awaitility.setDefaultTimeout;
import static org.awaitility.proxy.AwaitilityClassProxy.to;
import static org.hamcrest.Matchers.equalTo;
-public class AsyncServiceLongRunningUnitTest {
+public class AsyncServiceLongRunningManualTest {
private AsyncService asyncService;
@Before
diff --git a/libraries/src/test/java/com/baeldung/docx/Docx4jReadAndWriteTest.java b/libraries/src/test/java/com/baeldung/docx/Docx4jReadAndWriteIntegrationTest.java
similarity index 89%
rename from libraries/src/test/java/com/baeldung/docx/Docx4jReadAndWriteTest.java
rename to libraries/src/test/java/com/baeldung/docx/Docx4jReadAndWriteIntegrationTest.java
index 7c3f779931..b6e157beea 100644
--- a/libraries/src/test/java/com/baeldung/docx/Docx4jReadAndWriteTest.java
+++ b/libraries/src/test/java/com/baeldung/docx/Docx4jReadAndWriteIntegrationTest.java
@@ -4,7 +4,7 @@ import org.junit.Test;
import static org.junit.Assert.assertTrue;
-public class Docx4jReadAndWriteTest {
+public class Docx4jReadAndWriteIntegrationTest {
private static final String imagePath = "src/main/resources/image.jpg";
private static final String outputPath = "helloWorld.docx";
diff --git a/libraries/src/test/java/com/baeldung/hll/HLLLongRunningUnitTest.java b/libraries/src/test/java/com/baeldung/hll/HLLLongRunningManualTest.java
similarity index 98%
rename from libraries/src/test/java/com/baeldung/hll/HLLLongRunningUnitTest.java
rename to libraries/src/test/java/com/baeldung/hll/HLLLongRunningManualTest.java
index f762096811..2c8113771e 100644
--- a/libraries/src/test/java/com/baeldung/hll/HLLLongRunningUnitTest.java
+++ b/libraries/src/test/java/com/baeldung/hll/HLLLongRunningManualTest.java
@@ -10,7 +10,7 @@ import java.util.stream.LongStream;
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
-public class HLLLongRunningUnitTest {
+public class HLLLongRunningManualTest {
@Test
public void givenHLL_whenAddHugeAmountOfNumbers_thenShouldReturnEstimatedCardinality() {
diff --git a/libraries/src/test/java/com/baeldung/jcache/EventListenerTest.java b/libraries/src/test/java/com/baeldung/jcache/EventListenerIntegrationTest.java
similarity index 97%
rename from libraries/src/test/java/com/baeldung/jcache/EventListenerTest.java
rename to libraries/src/test/java/com/baeldung/jcache/EventListenerIntegrationTest.java
index e32e4ad3cc..fcbfbe6111 100644
--- a/libraries/src/test/java/com/baeldung/jcache/EventListenerTest.java
+++ b/libraries/src/test/java/com/baeldung/jcache/EventListenerIntegrationTest.java
@@ -14,7 +14,7 @@ import javax.cache.spi.CachingProvider;
import static org.junit.Assert.assertEquals;
-public class EventListenerTest {
+public class EventListenerIntegrationTest {
private static final String CACHE_NAME = "MyCache";
diff --git a/libraries/src/test/java/com/baeldung/netty/EmbeddedChannelUnitTest.java b/libraries/src/test/java/com/baeldung/netty/EmbeddedChannelUnitTest.java
new file mode 100644
index 0000000000..8a324ebc72
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/netty/EmbeddedChannelUnitTest.java
@@ -0,0 +1,107 @@
+package com.baeldung.netty;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.nio.charset.Charset;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import io.netty.channel.embedded.EmbeddedChannel;
+import io.netty.handler.codec.http.DefaultFullHttpRequest;
+import io.netty.handler.codec.http.FullHttpRequest;
+import io.netty.handler.codec.http.FullHttpResponse;
+import io.netty.handler.codec.http.HttpMethod;
+import io.netty.handler.codec.http.HttpResponseStatus;
+import io.netty.handler.codec.http.HttpVersion;
+
+public class EmbeddedChannelUnitTest {
+
+ @Test
+ public void givenTwoChannelHandlers_testPipeline() {
+
+ final FullHttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/calculate?a=10&b=5");
+ httpRequest.headers().add("Operator", "Add");
+
+ EmbeddedChannel channel = new EmbeddedChannel(
+ new HttpMessageHandler(), new CalculatorOperationHandler());
+
+ channel.pipeline()
+ .addFirst(new HttpMessageHandler())
+ .addLast(new CalculatorOperationHandler());
+
+
+ // send HTTP request to server and check that the message is on the inbound pipeline
+ assertTrue(channel.writeInbound(httpRequest));
+
+ long inboundChannelResponse = channel.readInbound();
+ assertEquals(15, inboundChannelResponse);
+
+ // we should have an outbound message in the form of a HTTP response
+ assertEquals(1, channel.outboundMessages().size());
+ // Object response = channel.readOutbound();
+
+ FullHttpResponse httpResponse = channel.readOutbound();
+ String httpResponseContent = httpResponse.content().toString(Charset.defaultCharset());
+ assertTrue("15".equalsIgnoreCase(httpResponseContent));
+ }
+
+ @Test
+ public void givenTwoChannelHandlers_testExceptionHandlingInHttpMessageHandler() {
+
+ EmbeddedChannel channel = new EmbeddedChannel(
+ new HttpMessageHandler(), new CalculatorOperationHandler());
+
+ final FullHttpRequest wrongHttpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, "/calculate?a=10&b=5");
+ wrongHttpRequest.headers().add("Operator", "Add");
+
+ try {
+ // send invalid HTTP request to server and expect and error
+ channel.pipeline().fireChannelRead(wrongHttpRequest);
+ channel.checkException();
+ // channel.writeInbound(wrongHttpRequest);
+ Assert.fail();
+
+ } catch (Exception ex) {
+
+ // the HttpMessageHandler does not handle the exception and throws it down the pipeline
+ assertTrue(ex instanceof UnsupportedOperationException);
+ assertTrue(ex.getMessage().equalsIgnoreCase("HTTP method not supported"));
+
+ FullHttpResponse errorHttpResponse = channel.readOutbound();
+ String errorHttpResponseContent = errorHttpResponse.content().toString(Charset.defaultCharset());
+ assertTrue("Operation not defined".equalsIgnoreCase(errorHttpResponseContent));
+ assertEquals(HttpResponseStatus.INTERNAL_SERVER_ERROR, errorHttpResponse.status());
+ }
+ }
+
+
+ @Test
+ public void givenTwoChannelHandlers_testExceptionHandlingInCalculatorOperationHandler() {
+ EmbeddedChannel channel = new EmbeddedChannel(
+ new HttpMessageHandler(), new CalculatorOperationHandler());
+
+ final FullHttpRequest wrongHttpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/calculate?a=10&b=5");
+ wrongHttpRequest.headers().add("Operator", "Invalid_operation");
+
+ try {
+ // send invalid HTTP request to server and expect and error
+ channel.writeInbound(wrongHttpRequest);
+ Assert.fail();
+
+ } catch (Exception ex) {
+
+ // the HttpMessageHandler does not handle the exception and throws it down the pipeline
+ assertTrue(ex instanceof IllegalArgumentException);
+ assertTrue(ex.getMessage().equalsIgnoreCase("Operation not defined"));
+
+ // the outbound message is a HTTP response with the status code 500
+ FullHttpResponse errorHttpResponse = channel.readOutbound();
+ String errorHttpResponseContent = errorHttpResponse.content().toString(Charset.defaultCharset());
+ assertTrue("Operation not defined".equalsIgnoreCase(errorHttpResponseContent));
+ assertEquals(HttpResponseStatus.INTERNAL_SERVER_ERROR, errorHttpResponse.status());
+ }
+ }
+
+}
diff --git a/libraries/src/test/java/com/baeldung/stm/AccountTest.java b/libraries/src/test/java/com/baeldung/stm/AccountUnitTest.java
similarity index 99%
rename from libraries/src/test/java/com/baeldung/stm/AccountTest.java
rename to libraries/src/test/java/com/baeldung/stm/AccountUnitTest.java
index eb8693b096..aa872ab622 100644
--- a/libraries/src/test/java/com/baeldung/stm/AccountTest.java
+++ b/libraries/src/test/java/com/baeldung/stm/AccountUnitTest.java
@@ -11,7 +11,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
import static org.assertj.core.api.Java6Assertions.assertThat;
import static org.junit.Assert.assertTrue;
-public class AccountTest {
+public class AccountUnitTest {
@Test
public void givenAccount_whenDecrement_thenShouldReturnProperValue() {
diff --git a/patterns/facade/pom.xml b/patterns/facade/pom.xml
new file mode 100644
index 0000000000..ee46a2a80d
--- /dev/null
+++ b/patterns/facade/pom.xml
@@ -0,0 +1,37 @@
+
+
+ 4.0.0
+ com.baeldung.pattern.facade
+ pattern.facade
+ 1.0
+ jar
+
+ com.baeldung.patterns
+ patterns-parent
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.7.0
+
+
+
+
+ UTF-8
+ 1.8
+ 1.8
+
+
\ No newline at end of file
diff --git a/patterns/facade/src/main/java/com/baeldung/pattern/facade/CarEngineFacade.java b/patterns/facade/src/main/java/com/baeldung/pattern/facade/CarEngineFacade.java
new file mode 100644
index 0000000000..91f9b79738
--- /dev/null
+++ b/patterns/facade/src/main/java/com/baeldung/pattern/facade/CarEngineFacade.java
@@ -0,0 +1,32 @@
+package com.baeldung.pattern.facade;
+
+import com.baeldung.pattern.facade.carsystem.*;
+
+public class CarEngineFacade {
+ private static final Integer DEFAULT_COOLING_TEMP = 90;
+ private static final Integer MAX_ALLOWED_TEMP = 50;
+ private FuelInjector fuelInjector = new FuelInjector();
+ private AirFlowController airFlowController = new AirFlowController();
+ private Starter starter = new Starter();
+ private CoolingController coolingController = new CoolingController();
+ private CatalyticConverter catalyticConverter = new CatalyticConverter();
+
+ public void startEngine(){
+ fuelInjector.on();
+ airFlowController.takeAir();
+ fuelInjector.on();
+ fuelInjector.inject();
+ starter.start();
+ coolingController.setTemperatureUpperLimit(DEFAULT_COOLING_TEMP);
+ coolingController.run();
+ catalyticConverter.on();
+ }
+
+ public void stopEngine(){
+ fuelInjector.off();
+ catalyticConverter.off();
+ coolingController.cool(MAX_ALLOWED_TEMP);
+ coolingController.stop();
+ airFlowController.off();
+ }
+}
diff --git a/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/AirFlowController.java b/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/AirFlowController.java
new file mode 100644
index 0000000000..5ee846ea31
--- /dev/null
+++ b/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/AirFlowController.java
@@ -0,0 +1,19 @@
+package com.baeldung.pattern.facade.carsystem;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class AirFlowController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(AirFlowController.class);
+ private AirFlowMeter airFlowMeter = new AirFlowMeter();
+
+ public void takeAir() {
+ airFlowMeter.getMeasurements();
+ LOGGER.info("Air provided!");
+ }
+
+ public void off() {
+ LOGGER.info("Air controller switched off.");
+ }
+}
diff --git a/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/AirFlowMeter.java b/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/AirFlowMeter.java
new file mode 100644
index 0000000000..b47f9cfc4a
--- /dev/null
+++ b/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/AirFlowMeter.java
@@ -0,0 +1,13 @@
+package com.baeldung.pattern.facade.carsystem;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class AirFlowMeter {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(AirFlowMeter.class);
+
+ public void getMeasurements() {
+ LOGGER.info("Getting air measurements...");
+ }
+}
diff --git a/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/CatalyticConverter.java b/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/CatalyticConverter.java
new file mode 100644
index 0000000000..7d637cd444
--- /dev/null
+++ b/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/CatalyticConverter.java
@@ -0,0 +1,17 @@
+package com.baeldung.pattern.facade.carsystem;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CatalyticConverter {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CatalyticConverter.class);
+
+ public void on() {
+ LOGGER.info("Catalytic Converter switched on!");
+ }
+
+ public void off() {
+ LOGGER.info("Catalytic Converter switched off!");
+ }
+}
diff --git a/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/CoolingController.java b/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/CoolingController.java
new file mode 100644
index 0000000000..ae556e685c
--- /dev/null
+++ b/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/CoolingController.java
@@ -0,0 +1,34 @@
+package com.baeldung.pattern.facade.carsystem;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CoolingController {
+ private static final Logger LOGGER = LoggerFactory.getLogger(CoolingController.class);
+ private static final Integer DEFAULT_RADIATOR_SPEED = 10;
+
+ private Integer temperatureUpperLimit;
+ private Radiator radiator = new Radiator();
+ private TemperatureSensor temperatureSensor = new TemperatureSensor();
+
+ public void setTemperatureUpperLimit(Integer temperatureUpperLimit) {
+ LOGGER.info("Setting temperature upper limit to {}", temperatureUpperLimit);
+ this.temperatureUpperLimit = temperatureUpperLimit;
+ }
+
+ public void run() {
+ LOGGER.info("Cooling Controller ready!");
+ radiator.setSpeed(DEFAULT_RADIATOR_SPEED);
+ }
+
+ public void cool(Integer maxAllowedTemp) {
+ LOGGER.info("Scheduled cooling with maximum allowed temperature {}", maxAllowedTemp);
+ temperatureSensor.getTemperature();
+ radiator.on();
+ }
+
+ public void stop() {
+ LOGGER.info("Stopping Cooling Controller...");
+ radiator.off();
+ }
+}
diff --git a/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/FuelInjector.java b/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/FuelInjector.java
new file mode 100644
index 0000000000..c7905745e4
--- /dev/null
+++ b/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/FuelInjector.java
@@ -0,0 +1,23 @@
+package com.baeldung.pattern.facade.carsystem;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class FuelInjector {
+ private static final Logger LOGGER = LoggerFactory.getLogger(FuelInjector.class);
+
+ private FuelPump fuelPump = new FuelPump();
+
+ public void on(){
+ LOGGER.info("Fuel injector ready to inject fuel.");
+ }
+
+ public void inject() {
+ fuelPump.pump();
+ LOGGER.info("Fuel injected.");
+ }
+
+ public void off() {
+ LOGGER.info("Stopping Fuel injector...");
+ }
+}
diff --git a/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/FuelPump.java b/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/FuelPump.java
new file mode 100644
index 0000000000..900358f8ff
--- /dev/null
+++ b/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/FuelPump.java
@@ -0,0 +1,13 @@
+package com.baeldung.pattern.facade.carsystem;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class FuelPump {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(FuelPump.class);
+
+ public void pump() {
+ LOGGER.info("Fuel Pump is pumping fuel...");
+ }
+}
diff --git a/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/Radiator.java b/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/Radiator.java
new file mode 100644
index 0000000000..6ca6cef9d9
--- /dev/null
+++ b/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/Radiator.java
@@ -0,0 +1,21 @@
+package com.baeldung.pattern.facade.carsystem;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Radiator {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(Radiator.class);
+
+ public void on(){
+ LOGGER.info("Radiator switched on!");
+ }
+
+ public void off(){
+ LOGGER.info("Radiator switched off!");
+ }
+
+ public void setSpeed(Integer speed){
+ LOGGER.info("Setting radiator speed to {}",speed);
+ }
+}
diff --git a/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/Starter.java b/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/Starter.java
new file mode 100644
index 0000000000..b1f45a0be8
--- /dev/null
+++ b/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/Starter.java
@@ -0,0 +1,13 @@
+package com.baeldung.pattern.facade.carsystem;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Starter {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(Starter.class);
+
+ public void start() {
+ LOGGER.info("Starting...");
+ }
+}
diff --git a/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/TemperatureSensor.java b/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/TemperatureSensor.java
new file mode 100644
index 0000000000..d6a94858b4
--- /dev/null
+++ b/patterns/facade/src/main/java/com/baeldung/pattern/facade/carsystem/TemperatureSensor.java
@@ -0,0 +1,13 @@
+package com.baeldung.pattern.facade.carsystem;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TemperatureSensor {
+ private static final Logger LOGGER = LoggerFactory.getLogger(TemperatureSensor.class);
+
+ public void getTemperature(){
+ LOGGER.info("Getting temperature from the sensor...");
+ }
+
+}
diff --git a/patterns/facade/src/test/java/com/baeldung/pattern/facade/CarEngineFacadeTest.java b/patterns/facade/src/test/java/com/baeldung/pattern/facade/CarEngineFacadeTest.java
new file mode 100644
index 0000000000..79c159319d
--- /dev/null
+++ b/patterns/facade/src/test/java/com/baeldung/pattern/facade/CarEngineFacadeTest.java
@@ -0,0 +1,85 @@
+package com.baeldung.pattern.facade;
+
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.AppenderBase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+public class CarEngineFacadeTest {
+
+
+ private InMemoryCustomTestAppender appender;
+
+
+ @Before
+ public void setUp() {
+ appender = new InMemoryCustomTestAppender();
+ }
+
+ @After
+ public void tearDown() {
+ appender.stop();
+ }
+
+
+ @Test
+ public void whenStartEngine_thenAllNecessaryActionsPerformed() {
+ CarEngineFacade carEngineFacade = new CarEngineFacade();
+ carEngineFacade.startEngine();
+ assertTrue(appender.logContains("Fuel injector ready to inject fuel."));
+ assertTrue(appender.logContains("Getting air measurements..."));
+ assertTrue(appender.logContains("Air provided!"));
+ assertTrue(appender.logContains("Fuel injector ready to inject fuel."));
+ assertTrue(appender.logContains("Fuel Pump is pumping fuel..."));
+ assertTrue(appender.logContains("Fuel injected."));
+ assertTrue(appender.logContains("Starting..."));
+ assertTrue(appender.logContains("Setting temperature upper limit to 90"));
+ assertTrue(appender.logContains("Cooling Controller ready!"));
+ assertTrue(appender.logContains("Setting radiator speed to 10"));
+ assertTrue(appender.logContains("Catalytic Converter switched on!"));
+ }
+
+
+ @Test
+ public void whenStopEngine_thenAllNecessaryActionsPerformed() {
+ CarEngineFacade carEngineFacade = new CarEngineFacade();
+ carEngineFacade.stopEngine();
+ assertTrue(appender.logContains("Stopping Fuel injector..."));
+ assertTrue(appender.logContains("Catalytic Converter switched off!"));
+ assertTrue(appender.logContains("Scheduled cooling with maximum allowed temperature 50"));
+ assertTrue(appender.logContains("Getting temperature from the sensor..."));
+ assertTrue(appender.logContains("Radiator switched on!"));
+ assertTrue(appender.logContains("Stopping Cooling Controller..."));
+ assertTrue(appender.logContains("Radiator switched off!"));
+ assertTrue(appender.logContains("Air controller switched off."));
+ }
+
+ private class InMemoryCustomTestAppender extends AppenderBase {
+
+ private List logs = new ArrayList<>();
+
+ public InMemoryCustomTestAppender() {
+ ((Logger) LoggerFactory.getLogger("root")).addAppender(this);
+ start();
+ }
+
+ @Override
+ protected void append(ILoggingEvent eventObject) {
+ logs.add(eventObject);
+ }
+
+ public boolean logContains(String message) {
+ return logs.stream().anyMatch(event -> event.getFormattedMessage().equals(message));
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 51b5592ecf..205d4d2e97 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,8 +22,9 @@
1.7.21
1.1.7
- 2.19.1
+ 2.21.0
3.7.0
+ 1.6.0
@@ -100,6 +101,7 @@
javax-servlets
javaxval
jaxb
+ javafx
jgroups
jee-7
@@ -112,7 +114,9 @@
testing-modules/junit-5
jws
+
libraries-data
linkrest
logging-modules/log-mdc
@@ -350,14 +354,16 @@
+
org.codehaus.mojo
exec-maven-plugin
- 1.6.0
+ ${exec-maven-plugin.version}
maven
+
org.apache.maven.plugins
maven-surefire-plugin
@@ -372,9 +378,9 @@
**/JdbcTest.java
**/*LiveTest.java
-
+
org.apache.maven.plugins
maven-compiler-plugin
@@ -384,7 +390,9 @@
1.8
+
+
com.vackosar.gitflowincrementalbuilder
@@ -392,5 +400,7 @@
3.4
+
+
diff --git a/reactor-core/src/test/java/com/baeldung/reactor/core/CombiningPublishersTest.java b/reactor-core/src/test/java/com/baeldung/reactor/core/CombiningPublishersTest.java
index 41769b1b35..5a0dcef5ba 100644
--- a/reactor-core/src/test/java/com/baeldung/reactor/core/CombiningPublishersTest.java
+++ b/reactor-core/src/test/java/com/baeldung/reactor/core/CombiningPublishersTest.java
@@ -32,7 +32,7 @@ public class CombiningPublishersTest {
}
- @Test
+ /*@Test
public void givenFluxes_whenMergeWithDelayedElementsIsInvoked_thenMergeWithDelayedElements() {
Flux fluxOfIntegers = Flux.merge(
evenNumbers.delayElements(Duration.ofMillis(2000L)),
@@ -46,7 +46,7 @@ public class CombiningPublishersTest {
.expectNext(4)
.expectComplete()
.verify();
- }
+ }*/
@Test
public void givenFluxes_whenConcatIsInvoked_thenConcat() {
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/UserController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/UserController.java
new file mode 100644
index 0000000000..f51a674fe8
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/UserController.java
@@ -0,0 +1,15 @@
+package com.baeldung.reactive.controller;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RestController;
+import reactor.core.publisher.Mono;
+
+@RestController
+public class UserController {
+
+ @GetMapping(path = "/users/{name}")
+ public Mono getName(@PathVariable String name) {
+ return Mono.just(name);
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/filter/ExampleHandlerFilterFunction.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/filter/ExampleHandlerFilterFunction.java
new file mode 100644
index 0000000000..e55f5ce2fe
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/filter/ExampleHandlerFilterFunction.java
@@ -0,0 +1,22 @@
+package com.baeldung.reactive.filter;
+
+import org.springframework.web.reactive.function.server.HandlerFilterFunction;
+import org.springframework.web.reactive.function.server.HandlerFunction;
+import org.springframework.web.reactive.function.server.ServerRequest;
+import org.springframework.web.reactive.function.server.ServerResponse;
+import reactor.core.publisher.Mono;
+
+import static org.springframework.http.HttpStatus.FORBIDDEN;
+
+public class ExampleHandlerFilterFunction implements HandlerFilterFunction {
+
+ @Override
+ public Mono filter(ServerRequest serverRequest, HandlerFunction handlerFunction) {
+ if (serverRequest.pathVariable("name").equalsIgnoreCase("test")) {
+ return ServerResponse.status(FORBIDDEN).build();
+ }
+ return handlerFunction.handle(serverRequest);
+ }
+
+}
+
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/filter/ExampleWebFilter.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/filter/ExampleWebFilter.java
new file mode 100644
index 0000000000..99bc9f7fc3
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/filter/ExampleWebFilter.java
@@ -0,0 +1,17 @@
+package com.baeldung.reactive.filter;
+
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+import org.springframework.web.server.WebFilter;
+import org.springframework.web.server.WebFilterChain;
+import reactor.core.publisher.Mono;
+
+@Component
+public class ExampleWebFilter implements WebFilter {
+
+ @Override
+ public Mono filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {
+ serverWebExchange.getResponse().getHeaders().add("web-filter", "web-filter-test");
+ return webFilterChain.filter(serverWebExchange);
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/handler/PlayerHandler.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/handler/PlayerHandler.java
new file mode 100644
index 0000000000..51b4e166d1
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/handler/PlayerHandler.java
@@ -0,0 +1,17 @@
+package com.baeldung.reactive.handler;
+
+import org.springframework.stereotype.Component;
+import org.springframework.web.reactive.function.server.ServerRequest;
+import org.springframework.web.reactive.function.server.ServerResponse;
+import reactor.core.publisher.Mono;
+
+import static org.springframework.web.reactive.function.server.ServerResponse.ok;
+
+@Component
+public class PlayerHandler {
+
+ public Mono getName(ServerRequest request) {
+ Mono name = Mono.just(request.pathVariable("name"));
+ return ok().body(name, String.class);
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/router/PlayerRouter.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/router/PlayerRouter.java
new file mode 100644
index 0000000000..be721964ca
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/router/PlayerRouter.java
@@ -0,0 +1,22 @@
+package com.baeldung.reactive.router;
+
+import com.baeldung.reactive.filter.ExampleHandlerFilterFunction;
+import com.baeldung.reactive.handler.PlayerHandler;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+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 static org.springframework.web.reactive.function.server.RequestPredicates.GET;
+
+@Configuration
+public class PlayerRouter {
+
+ @Bean
+ public RouterFunction route(PlayerHandler playerHandler) {
+ return RouterFunctions
+ .route(GET("/players/{name}"), playerHandler::getName)
+ .filter(new ExampleHandlerFilterFunction()::filter);
+ }
+}
diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/controller/UserControllerTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/controller/UserControllerTest.java
new file mode 100644
index 0000000000..131a3d812b
--- /dev/null
+++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/controller/UserControllerTest.java
@@ -0,0 +1,38 @@
+package com.baeldung.reactive.controller;
+
+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 org.springframework.test.web.reactive.server.EntityExchangeResult;
+import org.springframework.test.web.reactive.server.WebTestClient;
+
+import static org.junit.Assert.assertEquals;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class UserControllerTest {
+
+ @Autowired
+ private WebTestClient webTestClient;
+
+ @Test
+ public void whenUserNameIsBaeldung_thenWebFilterIsApplied() {
+ EntityExchangeResult result = webTestClient.get().uri("/users/baeldung")
+ .exchange()
+ .expectStatus().isOk()
+ .expectBody(String.class)
+ .returnResult();
+
+ assertEquals(result.getResponseBody(), "baeldung");
+ assertEquals(result.getResponseHeaders().getFirst("web-filter"), "web-filter-test");
+ }
+
+ @Test
+ public void whenUserNameIsTest_thenHandlerFilterFunctionIsNotApplied() {
+ webTestClient.get().uri("/users/test")
+ .exchange()
+ .expectStatus().isOk();
+ }
+}
\ No newline at end of file
diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/handler/PlayerHandlerTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/handler/PlayerHandlerTest.java
new file mode 100644
index 0000000000..de9b326874
--- /dev/null
+++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/handler/PlayerHandlerTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.reactive.handler;
+
+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 org.springframework.test.web.reactive.server.EntityExchangeResult;
+import org.springframework.test.web.reactive.server.WebTestClient;
+
+import static org.junit.Assert.assertEquals;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class PlayerHandlerTest {
+
+ @Autowired
+ private WebTestClient webTestClient;
+
+ @Test
+ public void whenPlayerNameIsBaeldung_thenWebFilterIsApplied() {
+ EntityExchangeResult result = webTestClient.get().uri("/players/baeldung")
+ .exchange()
+ .expectStatus().isOk()
+ .expectBody(String.class)
+ .returnResult();
+
+ assertEquals(result.getResponseBody(), "baeldung");
+ assertEquals(result.getResponseHeaders().getFirst("web-filter"), "web-filter-test");
+ }
+
+ @Test
+ public void whenPlayerNameIsTest_thenHandlerFilterFunctionIsApplied() {
+ webTestClient.get().uri("/players/test")
+ .exchange()
+ .expectStatus().isForbidden();
+ }
+
+}
\ No newline at end of file
diff --git a/spring-5/src/main/java/com/baeldung/jdbc/autogenkey/repository/MessageRepositoryJDBCTemplate.java b/spring-5/src/main/java/com/baeldung/jdbc/autogenkey/repository/MessageRepositoryJDBCTemplate.java
new file mode 100644
index 0000000000..cf0dbe4681
--- /dev/null
+++ b/spring-5/src/main/java/com/baeldung/jdbc/autogenkey/repository/MessageRepositoryJDBCTemplate.java
@@ -0,0 +1,38 @@
+package com.baeldung.jdbc.autogenkey.repository;
+
+import java.sql.PreparedStatement;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.support.GeneratedKeyHolder;
+import org.springframework.jdbc.support.KeyHolder;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class MessageRepositoryJDBCTemplate {
+
+ @Autowired
+ JdbcTemplate jdbcTemplate;
+
+ final String INSERT_MESSAGE_SQL = "insert into sys_message (message) values(?) ";
+
+ public long insert(final String message) {
+
+ KeyHolder keyHolder = new GeneratedKeyHolder();
+
+ jdbcTemplate.update(connection -> {
+ PreparedStatement ps = connection.prepareStatement(INSERT_MESSAGE_SQL);
+ ps.setString(1, message);
+ return ps;
+ }, keyHolder);
+
+ return (long) keyHolder.getKey();
+ }
+
+ final String SELECT_BY_ID = "select message from sys_message where id = ?";
+
+ public String getMessageById(long id) {
+ return this.jdbcTemplate.queryForObject(SELECT_BY_ID, String.class, new Object[] { id });
+ }
+
+}
diff --git a/spring-5/src/main/java/com/baeldung/jdbc/autogenkey/repository/MessageRepositorySimpleJDBCInsert.java b/spring-5/src/main/java/com/baeldung/jdbc/autogenkey/repository/MessageRepositorySimpleJDBCInsert.java
new file mode 100644
index 0000000000..022ea29ed6
--- /dev/null
+++ b/spring-5/src/main/java/com/baeldung/jdbc/autogenkey/repository/MessageRepositorySimpleJDBCInsert.java
@@ -0,0 +1,29 @@
+package com.baeldung.jdbc.autogenkey.repository;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.sql.DataSource;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class MessageRepositorySimpleJDBCInsert {
+
+ SimpleJdbcInsert messageInsert;
+
+ @Autowired
+ public MessageRepositorySimpleJDBCInsert(DataSource dataSource) {
+ messageInsert = new SimpleJdbcInsert(dataSource).withTableName("sys_message").usingGeneratedKeyColumns("id");
+ }
+
+ public long insert(String message) {
+ Map parameters = new HashMap(1);
+ parameters.put("message", message);
+ Number newId = messageInsert.executeAndReturnKey(parameters);
+ return (long) newId;
+ }
+
+}
diff --git a/spring-5/src/main/resources/autogenkey-db.properties b/spring-5/src/main/resources/autogenkey-db.properties
new file mode 100644
index 0000000000..3e1a088dc1
--- /dev/null
+++ b/spring-5/src/main/resources/autogenkey-db.properties
@@ -0,0 +1,9 @@
+spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE
+spring.datasource.username=sa
+spring.datasource.password=
+spring.datasource.driverClassName=org.h2.Driver
+spring.jpa.hibernate.ddl-auto=create
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
+
+spring.datasource.initialize=true
+spring.datasource.schema=classpath:autogenkey-schema.sql
diff --git a/spring-5/src/main/resources/autogenkey-schema.sql b/spring-5/src/main/resources/autogenkey-schema.sql
new file mode 100644
index 0000000000..925b27143c
--- /dev/null
+++ b/spring-5/src/main/resources/autogenkey-schema.sql
@@ -0,0 +1,5 @@
+CREATE TABLE IF NOT EXISTS sys_message (
+ id bigint(20) NOT NULL AUTO_INCREMENT,
+ message varchar(100) NOT NULL,
+ PRIMARY KEY (id)
+);
\ No newline at end of file
diff --git a/spring-5/src/test/java/com/baeldung/jdbc/autogenkey/GetAutoGenKeyByJDBC.java b/spring-5/src/test/java/com/baeldung/jdbc/autogenkey/GetAutoGenKeyByJDBC.java
new file mode 100644
index 0000000000..c52e18ef7f
--- /dev/null
+++ b/spring-5/src/test/java/com/baeldung/jdbc/autogenkey/GetAutoGenKeyByJDBC.java
@@ -0,0 +1,53 @@
+package com.baeldung.jdbc.autogenkey;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import com.baeldung.jdbc.autogenkey.repository.MessageRepositoryJDBCTemplate;
+import com.baeldung.jdbc.autogenkey.repository.MessageRepositorySimpleJDBCInsert;
+
+@RunWith(SpringRunner.class)
+public class GetAutoGenKeyByJDBC {
+
+ @Configuration
+ @EnableAutoConfiguration
+ @PropertySource("classpath:autogenkey-db.properties")
+ @ComponentScan(basePackages = { "com.baeldung.jdbc.autogenkey.repository" })
+ public static class SpringConfig {
+
+ }
+
+ @Autowired
+ MessageRepositorySimpleJDBCInsert messageRepositorySimpleJDBCInsert;
+
+ @Autowired
+ MessageRepositoryJDBCTemplate messageRepositoryJDBCTemplate;
+
+ final String MESSAGE_CONTENT = "Test";
+
+ @Test
+ public void insertJDBC_whenLoadMessageByKey_thenGetTheSameMessage() {
+ long key = messageRepositoryJDBCTemplate.insert(MESSAGE_CONTENT);
+ String loadedMessage = messageRepositoryJDBCTemplate.getMessageById(key);
+
+ assertEquals(MESSAGE_CONTENT, loadedMessage);
+
+ }
+
+ @Test
+ public void insertSimpleInsert_whenLoadMessageKey_thenGetTheSameMessage() {
+ long key = messageRepositorySimpleJDBCInsert.insert(MESSAGE_CONTENT);
+ String loadedMessage = messageRepositoryJDBCTemplate.getMessageById(key);
+
+ assertEquals(MESSAGE_CONTENT, loadedMessage);
+ }
+
+}
diff --git a/spring-5/src/test/resources/logback-test.xml b/spring-5/src/test/resources/logback-test.xml
new file mode 100644
index 0000000000..84f8e4706a
--- /dev/null
+++ b/spring-5/src/test/resources/logback-test.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-boot-gradle/build.gradle b/spring-boot-gradle/build.gradle
new file mode 100644
index 0000000000..e602c485a9
--- /dev/null
+++ b/spring-boot-gradle/build.gradle
@@ -0,0 +1,44 @@
+buildscript {
+ ext {
+ springBootVersion = '2.0.0.RELEASE'
+ }
+ repositories {
+ mavenCentral()
+ }
+ dependencies {
+ classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
+ }
+}
+
+apply plugin: 'java'
+apply plugin: 'eclipse'
+apply plugin: 'org.springframework.boot'
+apply plugin: 'io.spring.dependency-management'
+
+group = 'org.baeldung'
+version = '0.0.1-SNAPSHOT'
+sourceCompatibility = 1.8
+
+repositories {
+ mavenCentral()
+}
+
+
+dependencies {
+ compile('org.springframework.boot:spring-boot-starter')
+ testCompile('org.springframework.boot:spring-boot-starter-test')
+}
+
+springBoot {
+ mainClassName = 'org.baeldung.DemoApplication'
+}
+
+bootJar {
+// This is overridden by the mainClassName in springBoot{} and added here for reference purposes.
+ mainClassName = 'org.baeldung.DemoApplication'
+
+// This block serves the same purpose as the above thus commented out. Added here for reference purposes
+// manifest {
+// attributes 'Start-Class': 'org.baeldung.DemoApplication'
+// }
+}
diff --git a/spring-boot-gradle/gradle/wrapper/gradle-wrapper.jar b/spring-boot-gradle/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000..1ce6e58f1c
Binary files /dev/null and b/spring-boot-gradle/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/spring-boot-gradle/gradle/wrapper/gradle-wrapper.properties b/spring-boot-gradle/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..44d9d03d80
--- /dev/null
+++ b/spring-boot-gradle/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Tue Feb 06 12:27:20 CET 2018
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.5.1-bin.zip
diff --git a/spring-boot-gradle/gradlew b/spring-boot-gradle/gradlew
new file mode 100755
index 0000000000..4453ccea33
--- /dev/null
+++ b/spring-boot-gradle/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save ( ) {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/spring-boot-gradle/gradlew.bat b/spring-boot-gradle/gradlew.bat
new file mode 100644
index 0000000000..e95643d6a2
--- /dev/null
+++ b/spring-boot-gradle/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/spring-boot-gradle/settings.gradle b/spring-boot-gradle/settings.gradle
new file mode 100644
index 0000000000..0a383dd840
--- /dev/null
+++ b/spring-boot-gradle/settings.gradle
@@ -0,0 +1 @@
+rootProject.name = 'demo'
diff --git a/spring-boot-gradle/src/main/java/org/baeldung/DemoApplication.java b/spring-boot-gradle/src/main/java/org/baeldung/DemoApplication.java
new file mode 100644
index 0000000000..f8df823f25
--- /dev/null
+++ b/spring-boot-gradle/src/main/java/org/baeldung/DemoApplication.java
@@ -0,0 +1,12 @@
+package org.baeldung;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DemoApplication.class, args);
+ }
+}
diff --git a/spring-boot-gradle/src/main/resources/application.properties b/spring-boot-gradle/src/main/resources/application.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-boot-gradle/src/test/java/org/baeldung/DemoApplicationTests.java b/spring-boot-gradle/src/test/java/org/baeldung/DemoApplicationTests.java
new file mode 100644
index 0000000000..b24bfb2cb6
--- /dev/null
+++ b/spring-boot-gradle/src/test/java/org/baeldung/DemoApplicationTests.java
@@ -0,0 +1,16 @@
+package org.baeldung;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class DemoApplicationTests {
+
+ @Test
+ public void contextLoads() {
+ }
+
+}
diff --git a/spring-data-elasticsearch/pom.xml b/spring-data-elasticsearch/pom.xml
index 688506450f..c919705c3c 100644
--- a/spring-data-elasticsearch/pom.xml
+++ b/spring-data-elasticsearch/pom.xml
@@ -87,40 +87,4 @@
${fastjson.version}
-
-
-
-
- integration
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- integration-test
-
- test
-
-
-
- **/*LiveTest.java
-
-
- **/*IntegrationTest.java
-
-
-
-
-
-
- json
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesTest.java b/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesIntegrationTest.java
similarity index 99%
rename from spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesTest.java
rename to spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesIntegrationTest.java
index aa20913637..304cf2e62d 100644
--- a/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesTest.java
+++ b/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesIntegrationTest.java
@@ -28,7 +28,7 @@ import static org.junit.Assert.assertTrue;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
-public class GeoQueriesTest {
+public class GeoQueriesIntegrationTest {
private static final String WONDERS_OF_WORLD = "wonders-of-world";
private static final String WONDERS = "Wonders";
diff --git a/spring-mvc-forms-jsp/README.md b/spring-mvc-forms-jsp/README.md
index 86abd7e4c1..826be378b1 100644
--- a/spring-mvc-forms-jsp/README.md
+++ b/spring-mvc-forms-jsp/README.md
@@ -4,3 +4,4 @@
- [MaxUploadSizeExceededException in Spring](http://www.baeldung.com/spring-maxuploadsizeexceeded)
- [Getting Started with Forms in Spring MVC](http://www.baeldung.com/spring-mvc-form-tutorial)
- [Form Validation with AngularJS and Spring MVC](http://www.baeldung.com/validation-angularjs-spring-mvc)
+- [Guide to JSTL](http://www.baeldung.com/guide-to-jstl)
diff --git a/spring-mvc-forms-jsp/pom.xml b/spring-mvc-forms-jsp/pom.xml
index bb666cff4f..88b18b16c4 100644
--- a/spring-mvc-forms-jsp/pom.xml
+++ b/spring-mvc-forms-jsp/pom.xml
@@ -48,6 +48,12 @@
${jstl.version}
+
+ mysql
+ mysql-connector-java
+ 6.0.6
+
+
org.hibernate
hibernate-validator
@@ -66,6 +72,7 @@
${jackson.version}
+
@@ -97,6 +104,14 @@
+
+
+ 1
+ jstl
+ https://mvnrepository.com/artifact/javax.servlet/jstl
+
+
+
4.3.7.RELEASE
2.6
@@ -104,9 +119,11 @@
2.3.1
3.1.0
5.4.0.Final
- enter-location-of-server
+ server default deploy directory
1.3.2
- 2.8.7
+ 2.8.7
+ 5.2.5.Final
+ 5.1.40
diff --git a/spring-mvc-xml/src/main/java/com/baeldung/jstl/bundles/CustomMessage_en.java b/spring-mvc-forms-jsp/src/main/java/com/baeldung/jstl/bundles/CustomMessage_en.java
similarity index 100%
rename from spring-mvc-xml/src/main/java/com/baeldung/jstl/bundles/CustomMessage_en.java
rename to spring-mvc-forms-jsp/src/main/java/com/baeldung/jstl/bundles/CustomMessage_en.java
diff --git a/spring-mvc-xml/src/main/java/com/baeldung/jstl/bundles/CustomMessage_fr_FR.java b/spring-mvc-forms-jsp/src/main/java/com/baeldung/jstl/bundles/CustomMessage_fr_FR.java
similarity index 100%
rename from spring-mvc-xml/src/main/java/com/baeldung/jstl/bundles/CustomMessage_fr_FR.java
rename to spring-mvc-forms-jsp/src/main/java/com/baeldung/jstl/bundles/CustomMessage_fr_FR.java
diff --git a/spring-mvc-xml/src/main/java/com/baeldung/jstl/controllers/JSTLController.java b/spring-mvc-forms-jsp/src/main/java/com/baeldung/jstl/controllers/JSTLController.java
similarity index 98%
rename from spring-mvc-xml/src/main/java/com/baeldung/jstl/controllers/JSTLController.java
rename to spring-mvc-forms-jsp/src/main/java/com/baeldung/jstl/controllers/JSTLController.java
index c69e8a1b2a..eb0ef820b4 100644
--- a/spring-mvc-xml/src/main/java/com/baeldung/jstl/controllers/JSTLController.java
+++ b/spring-mvc-forms-jsp/src/main/java/com/baeldung/jstl/controllers/JSTLController.java
@@ -91,6 +91,7 @@ public class JSTLController {
@RequestMapping(value = "/xml_tags", method = RequestMethod.GET)
public ModelAndView xmlTags(final Model model) {
+ System.out.println("dddddddddddddddddffffffffffffff");
ModelAndView mv = new ModelAndView("xml_tags");
return mv;
}
diff --git a/spring-mvc-xml/src/main/java/com/baeldung/jstl/dbaccess/SQLConnection.java b/spring-mvc-forms-jsp/src/main/java/com/baeldung/jstl/dbaccess/SQLConnection.java
similarity index 100%
rename from spring-mvc-xml/src/main/java/com/baeldung/jstl/dbaccess/SQLConnection.java
rename to spring-mvc-forms-jsp/src/main/java/com/baeldung/jstl/dbaccess/SQLConnection.java
diff --git a/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java b/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java
index 7292d95b21..93fab9caf8 100644
--- a/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java
+++ b/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java
@@ -3,16 +3,18 @@ package com.baeldung.springmvcforms.configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
+import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
-@ComponentScan(basePackages = "com.baeldung.springmvcforms")
+@ComponentScan(basePackages = {"com.baeldung.springmvcforms", "com.baeldung.jstl"})
class ApplicationConfiguration extends WebMvcConfigurerAdapter {
@Override
@@ -20,14 +22,23 @@ class ApplicationConfiguration extends WebMvcConfigurerAdapter {
configurer.enable();
}
+ @Bean
+ public ResourceBundleMessageSource resourceBundleMessageSource() {
+ ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
+ messageSource.setBasename("messages");
+ return messageSource;
+ }
+
+ // switch orders to server views from html over views directory
+
@Bean
public InternalResourceViewResolver jspViewResolver() {
InternalResourceViewResolver bean = new InternalResourceViewResolver();
bean.setPrefix("/WEB-INF/views/");
bean.setSuffix(".jsp");
+ bean.setOrder(1);
return bean;
}
-
@Bean
public InternalResourceViewResolver htmlViewResolver() {
diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/items.xsl b/spring-mvc-forms-jsp/src/main/webapp/WEB-INF/items.xsl
similarity index 100%
rename from spring-mvc-xml/src/main/webapp/WEB-INF/items.xsl
rename to spring-mvc-forms-jsp/src/main/webapp/WEB-INF/items.xsl
diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/core_tags.jsp b/spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/core_tags.jsp
similarity index 100%
rename from spring-mvc-xml/src/main/webapp/WEB-INF/view/core_tags.jsp
rename to spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/core_tags.jsp
diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/core_tags_redirect.jsp b/spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/core_tags_redirect.jsp
similarity index 100%
rename from spring-mvc-xml/src/main/webapp/WEB-INF/view/core_tags_redirect.jsp
rename to spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/core_tags_redirect.jsp
diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/formatting_tags.jsp b/spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/formatting_tags.jsp
similarity index 100%
rename from spring-mvc-xml/src/main/webapp/WEB-INF/view/formatting_tags.jsp
rename to spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/formatting_tags.jsp
diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/function_tags.jsp b/spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/function_tags.jsp
similarity index 100%
rename from spring-mvc-xml/src/main/webapp/WEB-INF/view/function_tags.jsp
rename to spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/function_tags.jsp
diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/sql_tags.jsp b/spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/sql_tags.jsp
similarity index 100%
rename from spring-mvc-xml/src/main/webapp/WEB-INF/view/sql_tags.jsp
rename to spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/sql_tags.jsp
diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/xml_tags.jsp b/spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/xml_tags.jsp
similarity index 100%
rename from spring-mvc-xml/src/main/webapp/WEB-INF/view/xml_tags.jsp
rename to spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/xml_tags.jsp
diff --git a/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/SessionAttrsApplicationTest.java b/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/SessionAttrsApplicationIntegrationTest.java
similarity index 85%
rename from spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/SessionAttrsApplicationTest.java
rename to spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/SessionAttrsApplicationIntegrationTest.java
index 2fc27841da..05e9cdd21e 100644
--- a/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/SessionAttrsApplicationTest.java
+++ b/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/SessionAttrsApplicationIntegrationTest.java
@@ -7,7 +7,7 @@ import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
-public class SessionAttrsApplicationTest {
+public class SessionAttrsApplicationIntegrationTest {
@Test
public void contextLoads() {
diff --git a/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TodoControllerWithScopedProxyTest.java b/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TodoControllerWithScopedProxyIntegrationTest.java
similarity index 97%
rename from spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TodoControllerWithScopedProxyTest.java
rename to spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TodoControllerWithScopedProxyIntegrationTest.java
index 49be948a2a..a8a6ce469d 100644
--- a/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TodoControllerWithScopedProxyTest.java
+++ b/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TodoControllerWithScopedProxyIntegrationTest.java
@@ -25,7 +25,7 @@ import org.springframework.web.context.WebApplicationContext;
@SpringBootTest
@AutoConfigureMockMvc
@Import(TestConfig.class)
-public class TodoControllerWithScopedProxyTest {
+public class TodoControllerWithScopedProxyIntegrationTest {
@Autowired
private MockMvc mockMvc;
diff --git a/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TodoControllerWithSessionAttributesTest.java b/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TodoControllerWithSessionAttributesIntegrationTest.java
similarity index 97%
rename from spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TodoControllerWithSessionAttributesTest.java
rename to spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TodoControllerWithSessionAttributesIntegrationTest.java
index e41de880d3..b1caac5756 100644
--- a/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TodoControllerWithSessionAttributesTest.java
+++ b/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TodoControllerWithSessionAttributesIntegrationTest.java
@@ -24,7 +24,7 @@ import org.springframework.web.servlet.FlashMap;
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
-public class TodoControllerWithSessionAttributesTest {
+public class TodoControllerWithSessionAttributesIntegrationTest {
@Autowired
private MockMvc mockMvc;
diff --git a/spring-mvc-xml/README.md b/spring-mvc-xml/README.md
index b84614dd71..7a5e8c75e9 100644
--- a/spring-mvc-xml/README.md
+++ b/spring-mvc-xml/README.md
@@ -15,4 +15,3 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Geolocation by IP in Java](http://www.baeldung.com/geolocation-by-ip-with-maxmind)
- [Guide to JavaServer Pages (JSP)](http://www.baeldung.com/jsp)
- [Exploring SpringMVC’s Form Tag Library](http://www.baeldung.com/spring-mvc-form-tags)
-- [Guide to JSTL](http://www.baeldung.com/guide-to-jstl)
diff --git a/spring-mvc-xml/pom.xml b/spring-mvc-xml/pom.xml
index 47ecdc438d..581b94e0c8 100644
--- a/spring-mvc-xml/pom.xml
+++ b/spring-mvc-xml/pom.xml
@@ -64,12 +64,6 @@
${hibernate-validator.version}
-
- mysql
- mysql-connector-java
- 6.0.6
-
-
diff --git a/spring-mvc-xml/src/main/resources/webMvcConfig.xml b/spring-mvc-xml/src/main/resources/webMvcConfig.xml
index ebb0a14113..37aebe1d1d 100644
--- a/spring-mvc-xml/src/main/resources/webMvcConfig.xml
+++ b/spring-mvc-xml/src/main/resources/webMvcConfig.xml
@@ -23,7 +23,7 @@
-
+
diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/mvc-servlet.xml b/spring-mvc-xml/src/main/webapp/WEB-INF/mvc-servlet.xml
index f664472652..5c8fa611ed 100644
--- a/spring-mvc-xml/src/main/webapp/WEB-INF/mvc-servlet.xml
+++ b/spring-mvc-xml/src/main/webapp/WEB-INF/mvc-servlet.xml
@@ -7,7 +7,7 @@
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
-
+
diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/TeacherController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/TeacherController.java
new file mode 100644
index 0000000000..844d746084
--- /dev/null
+++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/TeacherController.java
@@ -0,0 +1,19 @@
+package com.baeldung.thymeleaf.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import com.baeldung.thymeleaf.utils.TeacherUtils;
+
+@Controller
+public class TeacherController {
+
+ @RequestMapping(value = "/listTeachers", method = RequestMethod.GET)
+ public String getInfo(Model model) {
+ model.addAttribute("teachers", TeacherUtils.buildTeachers());
+
+ return "listTeachers.html";
+ }
+}
diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/model/Teacher.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/model/Teacher.java
new file mode 100644
index 0000000000..ad43590818
--- /dev/null
+++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/model/Teacher.java
@@ -0,0 +1,78 @@
+package com.baeldung.thymeleaf.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+public class Teacher implements Serializable {
+
+ private static final long serialVersionUID = 946941572942270450L;
+
+ @NotNull(message = "Teacher ID is required.")
+ @Min(value = 1000, message = "Teacher ID must be at least 4 digits.")
+ private Integer id;
+
+ @NotNull(message = "Teacher name is required.")
+ private String name;
+
+ @NotNull(message = "Teacher gender is required.")
+ private String gender;
+
+ private boolean isActive;
+
+ private List courses = new ArrayList();
+
+ private String additionalSkills;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getGender() {
+ return gender;
+ }
+
+ public void setGender(String gender) {
+ this.gender = gender;
+ }
+
+ public boolean isActive() {
+ return isActive;
+ }
+
+ public void setActive(boolean isActive) {
+ this.isActive = isActive;
+ }
+
+ public List getCourses() {
+ return courses;
+ }
+
+ public void setCourses(List courses) {
+ this.courses = courses;
+ }
+
+ public String getAdditionalSkills() {
+ return additionalSkills;
+ }
+
+ public void setAdditionalSkills(String additionalSkills) {
+ this.additionalSkills = additionalSkills;
+ }
+
+}
diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/utils/TeacherUtils.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/utils/TeacherUtils.java
new file mode 100644
index 0000000000..1bb279cc92
--- /dev/null
+++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/utils/TeacherUtils.java
@@ -0,0 +1,47 @@
+package com.baeldung.thymeleaf.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.baeldung.thymeleaf.model.Teacher;
+
+public class TeacherUtils {
+
+ private static List teachers = new ArrayList();
+
+ public static List buildTeachers() {
+ if (teachers.isEmpty()) {
+ Teacher teacher1 = new Teacher();
+ teacher1.setId(2001);
+ teacher1.setName("Jane Doe");
+ teacher1.setGender("F");
+ teacher1.setActive(true);
+ teacher1.getCourses().add("Mathematics");
+ teacher1.getCourses().add("Physics");
+
+ teachers.add(teacher1);
+
+ Teacher teacher2 = new Teacher();
+ teacher2.setId(2002);
+ teacher2.setName("Lazy Dude");
+ teacher2.setGender("M");
+ teacher2.setActive(false);
+ teacher2.setAdditionalSkills("emergency responder");
+
+ teachers.add(teacher2);
+
+ Teacher teacher3 = new Teacher();
+ teacher3.setId(2002);
+ teacher3.setName("Micheal Jordan");
+ teacher3.setGender("M");
+ teacher3.setActive(true);
+ teacher3.getCourses().add("Sports");
+
+ teachers.add(teacher3);
+
+ }
+
+ return teachers;
+ }
+
+}
diff --git a/spring-thymeleaf/src/main/resources/messages_en.properties b/spring-thymeleaf/src/main/resources/messages_en.properties
index d29fd24088..373c20f1d1 100644
--- a/spring-thymeleaf/src/main/resources/messages_en.properties
+++ b/spring-thymeleaf/src/main/resources/messages_en.properties
@@ -1,9 +1,12 @@
-msg.id=ID
-msg.name=Name
-msg.gender=Gender
-msg.percent=Percentage
-welcome.message=Welcome Student !!!
-msg.AddStudent=Add Student
-msg.ListStudents=List Students
-msg.Home=Home
-
+msg.id=ID
+msg.name=Name
+msg.gender=Gender
+msg.percent=Percentage
+welcome.message=Welcome Student !!!
+msg.AddStudent=Add Student
+msg.ListStudents=List Students
+msg.Home=Home
+msg.ListTeachers=List Teachers
+msg.courses=Courses
+msg.skills=Skills
+msg.active=Active
\ No newline at end of file
diff --git a/spring-thymeleaf/src/main/webapp/WEB-INF/views/home.html b/spring-thymeleaf/src/main/webapp/WEB-INF/views/home.html
index aa4047641c..3d4f8b530f 100644
--- a/spring-thymeleaf/src/main/webapp/WEB-INF/views/home.html
+++ b/spring-thymeleaf/src/main/webapp/WEB-INF/views/home.html
@@ -18,6 +18,9 @@
|
+
+ |
+