diff --git a/.gitignore b/.gitignore
index 67f33c2a0b..08f570ad06 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,3 +42,4 @@ spring-call-getters-using-reflection/.mvn/wrapper/maven-wrapper.properties
spring-check-if-a-property-is-null/.mvn/wrapper/maven-wrapper.properties
*.springBeans
+
diff --git a/algorithms/src/main/java/com/baeldung/algorithms/string/search/StringSearchAlgorithms.java b/algorithms/src/main/java/com/baeldung/algorithms/string/search/StringSearchAlgorithms.java
new file mode 100755
index 0000000000..45ac53e039
--- /dev/null
+++ b/algorithms/src/main/java/com/baeldung/algorithms/string/search/StringSearchAlgorithms.java
@@ -0,0 +1,194 @@
+package com.baeldung.algorithms.string.search;
+
+import java.math.BigInteger;
+import java.util.Random;
+
+public class StringSearchAlgorithms {
+ public static long getBiggerPrime(int m) {
+ BigInteger prime = BigInteger.probablePrime(getNumberOfBits(m) + 1, new Random());
+ return prime.longValue();
+ }
+
+ public static long getLowerPrime(long number) {
+ BigInteger prime = BigInteger.probablePrime(getNumberOfBits(number) - 1, new Random());
+ return prime.longValue();
+ }
+
+ private static int getNumberOfBits(final int number) {
+ return Integer.SIZE - Integer.numberOfLeadingZeros(number);
+ }
+
+ private static int getNumberOfBits(final long number) {
+ return Long.SIZE - Long.numberOfLeadingZeros(number);
+ }
+
+ public static int simpleTextSearch(char[] pattern, char[] text) {
+ int patternSize = pattern.length;
+ int textSize = text.length;
+
+ int i = 0;
+
+ while ((i + patternSize) <= textSize) {
+ int j = 0;
+ while (text[i + j] == pattern[j]) {
+ j += 1;
+ if (j >= patternSize)
+ return i;
+ }
+ i += 1;
+ }
+
+ return -1;
+ }
+
+ public static int RabinKarpMethod(char[] pattern, char[] text) {
+ int patternSize = pattern.length; // m
+ int textSize = text.length; // n
+
+ long prime = getBiggerPrime(patternSize);
+
+ long r = 1;
+ for (int i = 0; i < patternSize - 1; i++) {
+ r *= 2;
+ r = r % prime;
+ }
+
+ long[] t = new long[textSize];
+ t[0] = 0;
+
+ long pfinger = 0;
+
+ for (int j = 0; j < patternSize; j++) {
+ t[0] = (2 * t[0] + text[j]) % prime;
+ pfinger = (2 * pfinger + pattern[j]) % prime;
+ }
+
+ int i = 0;
+ boolean passed = false;
+
+ int diff = textSize - patternSize;
+ for (i = 0; i <= diff; i++) {
+ if (t[i] == pfinger) {
+ passed = true;
+ for (int k = 0; k < patternSize; k++) {
+ if (text[i + k] != pattern[k]) {
+ passed = false;
+ break;
+ }
+ }
+
+ if (passed) {
+ return i;
+ }
+ }
+
+ if (i < diff) {
+ long value = 2 * (t[i] - r * text[i]) + text[i + patternSize];
+ t[i + 1] = ((value % prime) + prime) % prime;
+ }
+ }
+ return -1;
+
+ }
+
+ public static int KnuthMorrisPrattSearch(char[] pattern, char[] text) {
+ int patternSize = pattern.length; // m
+ int textSize = text.length; // n
+
+ int i = 0, j = 0;
+
+ int[] shift = KnuthMorrisPrattShift(pattern);
+
+ while ((i + patternSize) <= textSize) {
+ while (text[i + j] == pattern[j]) {
+ j += 1;
+ if (j >= patternSize)
+ return i;
+ }
+
+ if (j > 0) {
+ i += shift[j - 1];
+ j = Math.max(j - shift[j - 1], 0);
+ } else {
+ i++;
+ j = 0;
+ }
+ }
+ return -1;
+ }
+
+ public static int[] KnuthMorrisPrattShift(char[] pattern) {
+ int patternSize = pattern.length;
+
+ int[] shift = new int[patternSize];
+ shift[0] = 1;
+
+ int i = 1, j = 0;
+
+ while ((i + j) < patternSize) {
+ if (pattern[i + j] == pattern[j]) {
+ shift[i + j] = i;
+ j++;
+ } else {
+ if (j == 0)
+ shift[i] = i + 1;
+
+ if (j > 0) {
+ i = i + shift[j - 1];
+ j = Math.max(j - shift[j - 1], 0);
+ } else {
+ i = i + 1;
+ j = 0;
+ }
+ }
+ }
+ return shift;
+ }
+
+ public static int BoyerMooreHorspoolSimpleSearch(char[] pattern, char[] text) {
+ int patternSize = pattern.length;
+ int textSize = text.length;
+
+ int i = 0, j = 0;
+
+ while ((i + patternSize) <= textSize) {
+ j = patternSize - 1;
+ while (text[i + j] == pattern[j]) {
+ j--;
+ if (j < 0)
+ return i;
+ }
+ i++;
+ }
+ return -1;
+ }
+
+ public static int BoyerMooreHorspoolSearch(char[] pattern, char[] text) {
+
+ int shift[] = new int[256];
+
+ for (int k = 0; k < 256; k++) {
+ shift[k] = pattern.length;
+ }
+
+ for (int k = 0; k < pattern.length - 1; k++) {
+ shift[pattern[k]] = pattern.length - 1 - k;
+ }
+
+ int i = 0, j = 0;
+
+ while ((i + pattern.length) <= text.length) {
+ j = pattern.length - 1;
+
+ while (text[i + j] == pattern[j]) {
+ j -= 1;
+ if (j < 0)
+ return i;
+ }
+
+ i = i + shift[text[i + pattern.length - 1]];
+
+ }
+ return -1;
+ }
+}
diff --git a/algorithms/src/test/java/algorithms/StringSearchAlgorithmsTest.java b/algorithms/src/test/java/algorithms/StringSearchAlgorithmsTest.java
new file mode 100755
index 0000000000..e260cd7e5b
--- /dev/null
+++ b/algorithms/src/test/java/algorithms/StringSearchAlgorithmsTest.java
@@ -0,0 +1,25 @@
+package algorithms;
+
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.baeldung.algorithms.string.search.StringSearchAlgorithms;
+
+public class StringSearchAlgorithmsTest {
+
+
+ @Test
+ public void testStringSearchAlgorithms(){
+ String text = "This is some nice text.";
+ String pattern = "some";
+
+ int realPosition = text.indexOf(pattern);
+ Assert.assertTrue(realPosition == StringSearchAlgorithms.simpleTextSearch(pattern.toCharArray(), text.toCharArray()));
+ Assert.assertTrue(realPosition == StringSearchAlgorithms.RabinKarpMethod(pattern.toCharArray(), text.toCharArray()));
+ Assert.assertTrue(realPosition == StringSearchAlgorithms.KnuthMorrisPrattSearch(pattern.toCharArray(), text.toCharArray()));
+ Assert.assertTrue(realPosition == StringSearchAlgorithms.BoyerMooreHorspoolSimpleSearch(pattern.toCharArray(), text.toCharArray()));
+ Assert.assertTrue(realPosition == StringSearchAlgorithms.BoyerMooreHorspoolSearch(pattern.toCharArray(), text.toCharArray()));
+ }
+
+}
diff --git a/core-java-8/.gitignore b/core-java-8/.gitignore
new file mode 100644
index 0000000000..3de4cc647e
--- /dev/null
+++ b/core-java-8/.gitignore
@@ -0,0 +1,26 @@
+*.class
+
+0.*
+
+#folders#
+/target
+/neoDb*
+/data
+/src/main/webapp/WEB-INF/classes
+*/META-INF/*
+.resourceCache
+
+# Packaged files #
+*.jar
+*.war
+*.ear
+
+# Files generated by integration tests
+*.txt
+backup-pom.xml
+/bin/
+/temp
+
+#IntelliJ specific
+.idea/
+*.iml
\ No newline at end of file
diff --git a/core-java-8/README.md b/core-java-8/README.md
new file mode 100644
index 0000000000..4610b3c86d
--- /dev/null
+++ b/core-java-8/README.md
@@ -0,0 +1,32 @@
+=========
+
+## Core Java 8 Cookbooks and Examples
+
+### Relevant Articles:
+- [Java 8 Collectors](http://www.baeldung.com/java-8-collectors)
+- [Guide to Java 8’s Functional Interfaces](http://www.baeldung.com/java-8-functional-interfaces)
+- [Java 8 – Powerful Comparison with Lambdas](http://www.baeldung.com/java-8-sort-lambda)
+- [Java 8 New Features](http://www.baeldung.com/java-8-new-features)
+- [Lambda Expressions and Functional Interfaces: Tips and Best Practices](http://www.baeldung.com/java-8-lambda-expressions-tips)
+- [The Double Colon Operator in Java 8](http://www.baeldung.com/java-8-double-colon-operator)
+- [Java 8 Streams Advanced](http://www.baeldung.com/java-8-streams)
+- [Introduction to Java 8 Streams](http://www.baeldung.com/java-8-streams-introduction)
+- [Guide to Java 8 groupingBy Collector](http://www.baeldung.com/java-groupingby-collector)
+- [Strategy Design Pattern in Java 8](http://www.baeldung.com/java-strategy-pattern)
+- [Java 8 and Infinite Streams](http://www.baeldung.com/java-inifinite-streams)
+- [String Operations with Java Streams](http://www.baeldung.com/java-stream-operations-on-strings)
+- [Exceptions in Java 8 Lambda Expressions](http://www.baeldung.com/java-lambda-exceptions)
+- [Java 8 Stream findFirst() vs. findAny()](http://www.baeldung.com/java-stream-findfirst-vs-findany)
+- [Guide to Java 8 Comparator.comparing()](http://www.baeldung.com/java-8-comparator-comparing)
+- [How to Get the Last Element of a Stream in Java?](http://www.baeldung.com/java-stream-last-element)
+- [Introduction to the Java 8 Date/Time API](http://www.baeldung.com/java-8-date-time-intro)
+- [Migrating to the New Java 8 Date Time API](http://www.baeldung.com/migrating-to-java-8-date-time-api)
+- [Guide To Java 8 Optional](http://www.baeldung.com/java-optional)
+- [Guide to the Java 8 forEach](http://www.baeldung.com/foreach-java)
+- [Get the Current Date, Time and Timestamp in Java 8](http://www.baeldung.com/current-date-time-and-timestamp-in-java-8)
+- [TemporalAdjuster in Java](http://www.baeldung.com/java-temporal-adjuster)
+- [Finding Max/Min of a List or Collection](http://www.baeldung.com/java-collection-min-max)
+- [Java Base64 Encoding and Decoding](http://www.baeldung.com/java-base64-encode-and-decode)
+- [The Difference Between map() and flatMap()](http://www.baeldung.com/java-difference-map-and-flatmap)
+
+- [Merging Streams in Java](http://www.baeldung.com/java-merge-streams)
\ No newline at end of file
diff --git a/core-java-8/pom.xml b/core-java-8/pom.xml
new file mode 100644
index 0000000000..f5506f095e
--- /dev/null
+++ b/core-java-8/pom.xml
@@ -0,0 +1,258 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-8
+ 0.1.0-SNAPSHOT
+ jar
+
+ core-java-8
+
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+ org.apache.commons
+ commons-math3
+ ${commons-math3.version}
+
+
+
+ log4j
+ log4j
+ 1.2.17
+
+
+
+ commons-codec
+ commons-codec
+ ${commons-codec.version}
+
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+ com.jayway.awaitility
+ awaitility
+ ${avaitility.version}
+ test
+
+
+
+
+
+ core-java-8
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-dependencies
+ prepare-package
+
+ copy-dependencies
+
+
+ ${project.build.directory}/libs
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+
+ true
+ libs/
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+
+ package
+
+ single
+
+
+ ${project.basedir}
+
+
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+ jar-with-dependencies
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+
+
+
+ shade
+
+
+ true
+
+
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
+
+ com.jolira
+ onejar-maven-plugin
+
+
+
+ org.baeldung.executable.ExecutableMavenJar
+ true
+ ${project.build.finalName}-onejar.${project.packaging}
+
+
+ one-jar
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+ spring-boot
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
+
+
+
+
+ integration
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ **/*ManualTest.java
+
+
+ **/*IntegrationTest.java
+
+
+
+
+
+
+ json
+
+
+
+
+
+
+
+
+
+
+
+ 21.0
+ 3.5
+ 3.6.1
+ 2.5
+ 4.1
+ 4.01
+ 1.10
+ 1.16.12
+
+
+ 3.6.1
+ 1.7.0
+
+
+
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/Adder.java b/core-java-8/src/main/java/com/baeldung/Adder.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/Adder.java
rename to core-java-8/src/main/java/com/baeldung/Adder.java
diff --git a/core-java/src/main/java/com/baeldung/AdderImpl.java b/core-java-8/src/main/java/com/baeldung/AdderImpl.java
similarity index 99%
rename from core-java/src/main/java/com/baeldung/AdderImpl.java
rename to core-java-8/src/main/java/com/baeldung/AdderImpl.java
index f67cdc26b3..7852934d55 100644
--- a/core-java/src/main/java/com/baeldung/AdderImpl.java
+++ b/core-java-8/src/main/java/com/baeldung/AdderImpl.java
@@ -1,5 +1,6 @@
package com.baeldung;
+
import java.util.function.Consumer;
import java.util.function.Function;
diff --git a/core-java/src/main/java/com/baeldung/Bar.java b/core-java-8/src/main/java/com/baeldung/Bar.java
similarity index 99%
rename from core-java/src/main/java/com/baeldung/Bar.java
rename to core-java-8/src/main/java/com/baeldung/Bar.java
index f9b6f2773e..6219bddf74 100644
--- a/core-java/src/main/java/com/baeldung/Bar.java
+++ b/core-java-8/src/main/java/com/baeldung/Bar.java
@@ -1,5 +1,6 @@
package com.baeldung;
+
@FunctionalInterface
public interface Bar {
diff --git a/core-java/src/main/java/com/baeldung/Baz.java b/core-java-8/src/main/java/com/baeldung/Baz.java
similarity index 99%
rename from core-java/src/main/java/com/baeldung/Baz.java
rename to core-java-8/src/main/java/com/baeldung/Baz.java
index 6d03f74198..23180551ac 100644
--- a/core-java/src/main/java/com/baeldung/Baz.java
+++ b/core-java-8/src/main/java/com/baeldung/Baz.java
@@ -1,5 +1,6 @@
package com.baeldung;
+
@FunctionalInterface
public interface Baz {
diff --git a/core-java/src/main/java/com/baeldung/Foo.java b/core-java-8/src/main/java/com/baeldung/Foo.java
similarity index 99%
rename from core-java/src/main/java/com/baeldung/Foo.java
rename to core-java-8/src/main/java/com/baeldung/Foo.java
index 90ebdfeed3..c8223727a1 100644
--- a/core-java/src/main/java/com/baeldung/Foo.java
+++ b/core-java-8/src/main/java/com/baeldung/Foo.java
@@ -1,5 +1,6 @@
package com.baeldung;
+
@FunctionalInterface
public interface Foo {
diff --git a/core-java/src/main/java/com/baeldung/FooExtended.java b/core-java-8/src/main/java/com/baeldung/FooExtended.java
similarity index 99%
rename from core-java/src/main/java/com/baeldung/FooExtended.java
rename to core-java-8/src/main/java/com/baeldung/FooExtended.java
index c8ed0c35dd..8c9b21e397 100644
--- a/core-java/src/main/java/com/baeldung/FooExtended.java
+++ b/core-java-8/src/main/java/com/baeldung/FooExtended.java
@@ -1,5 +1,6 @@
package com.baeldung;
+
@FunctionalInterface
public interface FooExtended extends Baz, Bar {
diff --git a/core-java/src/main/java/com/baeldung/UseFoo.java b/core-java-8/src/main/java/com/baeldung/UseFoo.java
similarity index 99%
rename from core-java/src/main/java/com/baeldung/UseFoo.java
rename to core-java-8/src/main/java/com/baeldung/UseFoo.java
index a91404ebaf..950d02062d 100644
--- a/core-java/src/main/java/com/baeldung/UseFoo.java
+++ b/core-java-8/src/main/java/com/baeldung/UseFoo.java
@@ -1,5 +1,6 @@
package com.baeldung;
+
import java.util.function.Function;
public class UseFoo {
diff --git a/core-java/src/main/java/com/baeldung/datetime/README.md b/core-java-8/src/main/java/com/baeldung/datetime/README.md
similarity index 100%
rename from core-java/src/main/java/com/baeldung/datetime/README.md
rename to core-java-8/src/main/java/com/baeldung/datetime/README.md
diff --git a/core-java/src/main/java/com/baeldung/datetime/UseDuration.java b/core-java-8/src/main/java/com/baeldung/datetime/UseDuration.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/datetime/UseDuration.java
rename to core-java-8/src/main/java/com/baeldung/datetime/UseDuration.java
diff --git a/core-java/src/main/java/com/baeldung/datetime/UseLocalDate.java b/core-java-8/src/main/java/com/baeldung/datetime/UseLocalDate.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/datetime/UseLocalDate.java
rename to core-java-8/src/main/java/com/baeldung/datetime/UseLocalDate.java
diff --git a/core-java-8/src/main/java/com/baeldung/datetime/UseLocalDateTime.java b/core-java-8/src/main/java/com/baeldung/datetime/UseLocalDateTime.java
new file mode 100644
index 0000000000..7f39ac2f91
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/datetime/UseLocalDateTime.java
@@ -0,0 +1,11 @@
+package com.baeldung.datetime;
+
+import java.time.LocalDateTime;
+
+public class UseLocalDateTime {
+
+ public LocalDateTime getLocalDateTimeUsingParseMethod(String representation) {
+ return LocalDateTime.parse(representation);
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/datetime/UseLocalTime.java b/core-java-8/src/main/java/com/baeldung/datetime/UseLocalTime.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/datetime/UseLocalTime.java
rename to core-java-8/src/main/java/com/baeldung/datetime/UseLocalTime.java
diff --git a/core-java/src/main/java/com/baeldung/datetime/UsePeriod.java b/core-java-8/src/main/java/com/baeldung/datetime/UsePeriod.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/datetime/UsePeriod.java
rename to core-java-8/src/main/java/com/baeldung/datetime/UsePeriod.java
diff --git a/core-java/src/main/java/com/baeldung/datetime/UseToInstant.java b/core-java-8/src/main/java/com/baeldung/datetime/UseToInstant.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/datetime/UseToInstant.java
rename to core-java-8/src/main/java/com/baeldung/datetime/UseToInstant.java
diff --git a/core-java/src/main/java/com/baeldung/datetime/UseZonedDateTime.java b/core-java-8/src/main/java/com/baeldung/datetime/UseZonedDateTime.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/datetime/UseZonedDateTime.java
rename to core-java-8/src/main/java/com/baeldung/datetime/UseZonedDateTime.java
diff --git a/core-java/src/main/java/com/baeldung/doublecolon/Computer.java b/core-java-8/src/main/java/com/baeldung/doublecolon/Computer.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/doublecolon/Computer.java
rename to core-java-8/src/main/java/com/baeldung/doublecolon/Computer.java
diff --git a/core-java/src/main/java/com/baeldung/doublecolon/ComputerUtils.java b/core-java-8/src/main/java/com/baeldung/doublecolon/ComputerUtils.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/doublecolon/ComputerUtils.java
rename to core-java-8/src/main/java/com/baeldung/doublecolon/ComputerUtils.java
diff --git a/core-java/src/main/java/com/baeldung/doublecolon/MacbookPro.java b/core-java-8/src/main/java/com/baeldung/doublecolon/MacbookPro.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/doublecolon/MacbookPro.java
rename to core-java-8/src/main/java/com/baeldung/doublecolon/MacbookPro.java
diff --git a/core-java/src/main/java/com/baeldung/doublecolon/function/ComputerPredicate.java b/core-java-8/src/main/java/com/baeldung/doublecolon/function/ComputerPredicate.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/doublecolon/function/ComputerPredicate.java
rename to core-java-8/src/main/java/com/baeldung/doublecolon/function/ComputerPredicate.java
diff --git a/core-java/src/main/java/com/baeldung/doublecolon/function/TriFunction.java b/core-java-8/src/main/java/com/baeldung/doublecolon/function/TriFunction.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/doublecolon/function/TriFunction.java
rename to core-java-8/src/main/java/com/baeldung/doublecolon/function/TriFunction.java
diff --git a/core-java/src/main/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappers.java b/core-java-8/src/main/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappers.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappers.java
rename to core-java-8/src/main/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappers.java
diff --git a/core-java/src/main/java/com/baeldung/java8/lambda/exceptions/ThrowingConsumer.java b/core-java-8/src/main/java/com/baeldung/java8/lambda/exceptions/ThrowingConsumer.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java8/lambda/exceptions/ThrowingConsumer.java
rename to core-java-8/src/main/java/com/baeldung/java8/lambda/exceptions/ThrowingConsumer.java
diff --git a/core-java/src/main/java/com/baeldung/java_8_features/Address.java b/core-java-8/src/main/java/com/baeldung/java_8_features/Address.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java_8_features/Address.java
rename to core-java-8/src/main/java/com/baeldung/java_8_features/Address.java
diff --git a/core-java/src/main/java/com/baeldung/java_8_features/CustomException.java b/core-java-8/src/main/java/com/baeldung/java_8_features/CustomException.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java_8_features/CustomException.java
rename to core-java-8/src/main/java/com/baeldung/java_8_features/CustomException.java
diff --git a/core-java/src/main/java/com/baeldung/java_8_features/Detail.java b/core-java-8/src/main/java/com/baeldung/java_8_features/Detail.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java_8_features/Detail.java
rename to core-java-8/src/main/java/com/baeldung/java_8_features/Detail.java
diff --git a/core-java/src/main/java/com/baeldung/java_8_features/OptionalAddress.java b/core-java-8/src/main/java/com/baeldung/java_8_features/OptionalAddress.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java_8_features/OptionalAddress.java
rename to core-java-8/src/main/java/com/baeldung/java_8_features/OptionalAddress.java
diff --git a/core-java/src/main/java/com/baeldung/java_8_features/OptionalUser.java b/core-java-8/src/main/java/com/baeldung/java_8_features/OptionalUser.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java_8_features/OptionalUser.java
rename to core-java-8/src/main/java/com/baeldung/java_8_features/OptionalUser.java
diff --git a/core-java/src/main/java/com/baeldung/java_8_features/Person.java b/core-java-8/src/main/java/com/baeldung/java_8_features/Person.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java_8_features/Person.java
rename to core-java-8/src/main/java/com/baeldung/java_8_features/Person.java
diff --git a/core-java/src/main/java/com/baeldung/java_8_features/User.java b/core-java-8/src/main/java/com/baeldung/java_8_features/User.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java_8_features/User.java
rename to core-java-8/src/main/java/com/baeldung/java_8_features/User.java
diff --git a/core-java/src/main/java/com/baeldung/java_8_features/Vehicle.java b/core-java-8/src/main/java/com/baeldung/java_8_features/Vehicle.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java_8_features/Vehicle.java
rename to core-java-8/src/main/java/com/baeldung/java_8_features/Vehicle.java
diff --git a/core-java/src/main/java/com/baeldung/java_8_features/VehicleImpl.java b/core-java-8/src/main/java/com/baeldung/java_8_features/VehicleImpl.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java_8_features/VehicleImpl.java
rename to core-java-8/src/main/java/com/baeldung/java_8_features/VehicleImpl.java
diff --git a/core-java/src/main/java/com/baeldung/java_8_features/groupingby/BlogPost.java b/core-java-8/src/main/java/com/baeldung/java_8_features/groupingby/BlogPost.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java_8_features/groupingby/BlogPost.java
rename to core-java-8/src/main/java/com/baeldung/java_8_features/groupingby/BlogPost.java
diff --git a/core-java/src/main/java/com/baeldung/java_8_features/groupingby/BlogPostType.java b/core-java-8/src/main/java/com/baeldung/java_8_features/groupingby/BlogPostType.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/java_8_features/groupingby/BlogPostType.java
rename to core-java-8/src/main/java/com/baeldung/java_8_features/groupingby/BlogPostType.java
diff --git a/core-java/src/main/java/com/baeldung/optional/Modem.java b/core-java-8/src/main/java/com/baeldung/optional/Modem.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/optional/Modem.java
rename to core-java-8/src/main/java/com/baeldung/optional/Modem.java
diff --git a/core-java/src/main/java/com/baeldung/optional/Person.java b/core-java-8/src/main/java/com/baeldung/optional/Person.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/optional/Person.java
rename to core-java-8/src/main/java/com/baeldung/optional/Person.java
diff --git a/core-java/src/main/java/com/baeldung/strategy/ChristmasDiscounter.java b/core-java-8/src/main/java/com/baeldung/strategy/ChristmasDiscounter.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/strategy/ChristmasDiscounter.java
rename to core-java-8/src/main/java/com/baeldung/strategy/ChristmasDiscounter.java
diff --git a/core-java/src/main/java/com/baeldung/strategy/Discounter.java b/core-java-8/src/main/java/com/baeldung/strategy/Discounter.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/strategy/Discounter.java
rename to core-java-8/src/main/java/com/baeldung/strategy/Discounter.java
diff --git a/core-java/src/main/java/com/baeldung/strategy/EasterDiscounter.java b/core-java-8/src/main/java/com/baeldung/strategy/EasterDiscounter.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/strategy/EasterDiscounter.java
rename to core-java-8/src/main/java/com/baeldung/strategy/EasterDiscounter.java
diff --git a/core-java/src/main/java/com/baeldung/stream/InfiniteStreams.java b/core-java-8/src/main/java/com/baeldung/stream/InfiniteStreams.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/stream/InfiniteStreams.java
rename to core-java-8/src/main/java/com/baeldung/stream/InfiniteStreams.java
diff --git a/core-java/src/main/java/com/baeldung/stream/StreamApi.java b/core-java-8/src/main/java/com/baeldung/stream/StreamApi.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/stream/StreamApi.java
rename to core-java-8/src/main/java/com/baeldung/stream/StreamApi.java
diff --git a/core-java/src/main/java/com/baeldung/streamApi/Product.java b/core-java-8/src/main/java/com/baeldung/streamApi/Product.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/streamApi/Product.java
rename to core-java-8/src/main/java/com/baeldung/streamApi/Product.java
diff --git a/core-java/src/main/java/com/baeldung/string/JoinerSplitter.java b/core-java-8/src/main/java/com/baeldung/string/JoinerSplitter.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/string/JoinerSplitter.java
rename to core-java-8/src/main/java/com/baeldung/string/JoinerSplitter.java
diff --git a/core-java/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java b/core-java-8/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java
rename to core-java-8/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java
diff --git a/core-java/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java b/core-java-8/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/dateapi/ConversionExample.java b/core-java-8/src/test/java/com/baeldung/dateapi/ConversionExample.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/dateapi/ConversionExample.java
rename to core-java-8/src/test/java/com/baeldung/dateapi/ConversionExample.java
diff --git a/core-java/src/test/java/com/baeldung/dateapi/JavaDurationUnitTest.java b/core-java-8/src/test/java/com/baeldung/dateapi/JavaDurationUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/dateapi/JavaDurationUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/dateapi/JavaDurationUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/dateapi/JavaPeriodUnitTest.java b/core-java-8/src/test/java/com/baeldung/dateapi/JavaPeriodUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/dateapi/JavaPeriodUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/dateapi/JavaPeriodUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/dateapi/JavaUtilTimeUnitTest.java b/core-java-8/src/test/java/com/baeldung/dateapi/JavaUtilTimeUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/dateapi/JavaUtilTimeUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/dateapi/JavaUtilTimeUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java b/core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java b/core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java b/core-java-8/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/datetime/UsePeriodUnitTest.java b/core-java-8/src/test/java/com/baeldung/datetime/UsePeriodUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/datetime/UsePeriodUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/datetime/UsePeriodUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java b/core-java-8/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java b/core-java-8/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/functionalinterface/FunctionalInterfaceUnitTest.java b/core-java-8/src/test/java/com/baeldung/functionalinterface/FunctionalInterfaceUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/functionalinterface/FunctionalInterfaceUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/functionalinterface/FunctionalInterfaceUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/functionalinterface/ShortToByteFunction.java b/core-java-8/src/test/java/com/baeldung/functionalinterface/ShortToByteFunction.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/functionalinterface/ShortToByteFunction.java
rename to core-java-8/src/test/java/com/baeldung/functionalinterface/ShortToByteFunction.java
diff --git a/core-java/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/java8/Java8DefaultStaticIntefaceMethodsUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8DefaultStaticIntefaceMethodsUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/Java8DefaultStaticIntefaceMethodsUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/java8/Java8DefaultStaticIntefaceMethodsUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/java8/Java8ForEachUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8ForEachUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/Java8ForEachUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/java8/Java8ForEachUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/java8/Java8FunctionalInteracesLambdasUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8FunctionalInteracesLambdasUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/Java8FunctionalInteracesLambdasUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/java8/Java8FunctionalInteracesLambdasUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/java8/Java8MethodReferenceUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8MethodReferenceUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/Java8MethodReferenceUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/java8/Java8MethodReferenceUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/java8/Java8OptionalUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8OptionalUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/Java8OptionalUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/java8/Java8OptionalUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/java8/Java8SortUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8SortUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/Java8SortUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/java8/Java8SortUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/java8/Java8StreamsUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8StreamsUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/Java8StreamsUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/java8/Java8StreamsUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java
similarity index 93%
rename from core-java/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java
index 28fea0fd31..32879aed0c 100644
--- a/core-java/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java
+++ b/core-java-8/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java
@@ -1,20 +1,19 @@
package com.baeldung.java8;
-import org.junit.Assert;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Date;
import java.util.Scanner;
+import org.junit.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
public class JavaTryWithResourcesLongRunningUnitTest {
private static final Logger LOG = LoggerFactory.getLogger(JavaTryWithResourcesLongRunningUnitTest.class);
-
private static final String TEST_STRING_HELLO_WORLD = "Hello World";
private Date resource1Date, resource2Date;
@@ -28,7 +27,8 @@ public class JavaTryWithResourcesLongRunningUnitTest {
pw.print(TEST_STRING_HELLO_WORLD);
}
- Assert.assertEquals(sw.getBuffer().toString(), TEST_STRING_HELLO_WORLD);
+ Assert.assertEquals(sw.getBuffer()
+ .toString(), TEST_STRING_HELLO_WORLD);
}
/* Example for using multiple resources */
@@ -42,7 +42,8 @@ public class JavaTryWithResourcesLongRunningUnitTest {
}
}
- Assert.assertEquals(sw.getBuffer().toString(), TEST_STRING_HELLO_WORLD);
+ Assert.assertEquals(sw.getBuffer()
+ .toString(), TEST_STRING_HELLO_WORLD);
}
/* Example to show order in which the resources are closed */
@@ -88,4 +89,4 @@ public class JavaTryWithResourcesLongRunningUnitTest {
}
}
-}
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/java8/base64/ApacheCommonsEncodeDecodeUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/base64/ApacheCommonsEncodeDecodeUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/base64/ApacheCommonsEncodeDecodeUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/java8/base64/ApacheCommonsEncodeDecodeUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/java8/base64/Java8EncodeDecodeUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/base64/Java8EncodeDecodeUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/base64/Java8EncodeDecodeUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/java8/base64/Java8EncodeDecodeUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/java8/comparator/Employee.java b/core-java-8/src/test/java/com/baeldung/java8/comparator/Employee.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/comparator/Employee.java
rename to core-java-8/src/test/java/com/baeldung/java8/comparator/Employee.java
diff --git a/core-java/src/test/java/com/baeldung/java8/comparator/Java8ComparatorUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/comparator/Java8ComparatorUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/comparator/Java8ComparatorUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/java8/comparator/Java8ComparatorUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/java8/entity/Human.java b/core-java-8/src/test/java/com/baeldung/java8/entity/Human.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/entity/Human.java
rename to core-java-8/src/test/java/com/baeldung/java8/entity/Human.java
diff --git a/core-java/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/java8/optional/OptionalUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/optional/OptionalUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/optional/OptionalUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/java8/optional/OptionalUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java b/core-java-8/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/stream/InfiniteStreamUnitTest.java b/core-java-8/src/test/java/com/baeldung/stream/InfiniteStreamUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/stream/InfiniteStreamUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/stream/InfiniteStreamUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/stream/StreamAddUnitTest.java b/core-java-8/src/test/java/com/baeldung/stream/StreamAddUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/stream/StreamAddUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/stream/StreamAddUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/stream/StreamApiTest.java b/core-java-8/src/test/java/com/baeldung/stream/StreamApiTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/stream/StreamApiTest.java
rename to core-java-8/src/test/java/com/baeldung/stream/StreamApiTest.java
diff --git a/core-java/src/test/java/com/baeldung/stream/StreamToImmutableTest.java b/core-java-8/src/test/java/com/baeldung/stream/StreamToImmutableTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/stream/StreamToImmutableTest.java
rename to core-java-8/src/test/java/com/baeldung/stream/StreamToImmutableTest.java
diff --git a/core-java/src/test/java/com/baeldung/stream/mycollectors/MyImmutableListCollector.java b/core-java-8/src/test/java/com/baeldung/stream/mycollectors/MyImmutableListCollector.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/stream/mycollectors/MyImmutableListCollector.java
rename to core-java-8/src/test/java/com/baeldung/stream/mycollectors/MyImmutableListCollector.java
diff --git a/core-java/src/test/java/com/baeldung/string/JoinerSplitterUnitTest.java b/core-java-8/src/test/java/com/baeldung/string/JoinerSplitterUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/string/JoinerSplitterUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/string/JoinerSplitterUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java b/core-java-8/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java
rename to core-java-8/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java
diff --git a/core-java/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java b/core-java-8/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java
rename to core-java-8/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersTest.java
diff --git a/core-java/src/test/java/com/baeldung/util/CurrentDateTimeUnitTest.java b/core-java-8/src/test/java/com/baeldung/util/CurrentDateTimeUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/util/CurrentDateTimeUnitTest.java
rename to core-java-8/src/test/java/com/baeldung/util/CurrentDateTimeUnitTest.java
diff --git a/core-java-8/src/test/resources/.gitignore b/core-java-8/src/test/resources/.gitignore
new file mode 100644
index 0000000000..83c05e60c8
--- /dev/null
+++ b/core-java-8/src/test/resources/.gitignore
@@ -0,0 +1,13 @@
+*.class
+
+#folders#
+/target
+/neoDb*
+/data
+/src/main/webapp/WEB-INF/classes
+*/META-INF/*
+
+# Packaged files #
+*.jar
+*.war
+*.ear
\ No newline at end of file
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/callable/FactorialTask.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/callable/FactorialTask.java
new file mode 100644
index 0000000000..8663609d2d
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/callable/FactorialTask.java
@@ -0,0 +1,30 @@
+package com.baeldung.concurrent.callable;
+
+
+import java.util.concurrent.Callable;
+
+public class FactorialTask implements Callable {
+ int number;
+
+ public FactorialTask(int number) {
+ this.number = number;
+ }
+
+ public Integer call() throws InvalidParamaterException {
+ int fact=1;
+ if(number < 0)
+ throw new InvalidParamaterException("Number must be positive");
+
+ for(int count=number;count>1;count--){
+ fact=fact * count;
+ }
+
+ return fact;
+ }
+
+ private class InvalidParamaterException extends Exception {
+ public InvalidParamaterException(String message) {
+ super(message);
+ }
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/runnable/EventLoggingTask.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/runnable/EventLoggingTask.java
new file mode 100644
index 0000000000..d65f79202e
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/runnable/EventLoggingTask.java
@@ -0,0 +1,17 @@
+package com.baeldung.concurrent.runnable;
+
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class EventLoggingTask implements Runnable{
+ private Logger logger = LoggerFactory.getLogger(EventLoggingTask.class);
+
+ @Override
+ public void run() {
+
+ String messge="Message read from the event queue";
+ logger.info("Message read from event queue is "+messge);
+
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/runnable/TaskRunner.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/runnable/TaskRunner.java
new file mode 100644
index 0000000000..8fd98e77b8
--- /dev/null
+++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/runnable/TaskRunner.java
@@ -0,0 +1,25 @@
+package com.baeldung.concurrent.runnable;
+
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+public class TaskRunner {
+
+ private static ExecutorService executorService;
+
+ public static void main(String[] args) {
+ executeTask();
+ }
+
+ private static void executeTask() {
+ executorService= Executors.newSingleThreadExecutor();
+
+ EventLoggingTask task = new EventLoggingTask();
+
+ Future future = executorService.submit(task);
+
+ executorService.shutdown();
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadpool/TreeNode.java b/core-java-concurrency/src/main/java/com/baeldung/threadpool/TreeNode.java
index 65dfed01a2..a3283cf930 100644
--- a/core-java-concurrency/src/main/java/com/baeldung/threadpool/TreeNode.java
+++ b/core-java-concurrency/src/main/java/com/baeldung/threadpool/TreeNode.java
@@ -22,4 +22,4 @@ public class TreeNode {
public Set getChildren() {
return children;
}
-}
+}
\ No newline at end of file
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/callable/FactorialTaskManualTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/callable/FactorialTaskManualTest.java
new file mode 100644
index 0000000000..c55e04af94
--- /dev/null
+++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/callable/FactorialTaskManualTest.java
@@ -0,0 +1,48 @@
+package com.baeldung.concurrent.callable;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+import static junit.framework.Assert.assertEquals;
+
+public class FactorialTaskManualTest {
+
+ private ExecutorService executorService;
+
+ @Before
+ public void setup(){
+ executorService = Executors.newSingleThreadExecutor();
+ }
+
+ @Test
+ public void whenTaskSubmitted_ThenFutureResultObtained() throws ExecutionException, InterruptedException {
+ FactorialTask task = new FactorialTask(5);
+ Future future= executorService.submit(task);
+ assertEquals(120,future.get().intValue());
+ }
+
+ @Test(expected = ExecutionException.class)
+ public void whenException_ThenCallableThrowsIt() throws ExecutionException, InterruptedException {
+ FactorialTask task = new FactorialTask(-5);
+ Future future= executorService.submit(task);
+ Integer result=future.get().intValue();
+ }
+
+ @Test
+ public void whenException_ThenCallableDoesntThrowsItIfGetIsNotCalled(){
+ FactorialTask task = new FactorialTask(-5);
+ Future future= executorService.submit(task);
+ assertEquals(false,future.isDone());
+ }
+
+ @After
+ public void cleanup(){
+ executorService.shutdown();
+ }
+}
diff --git a/core-java/README.md b/core-java/README.md
index ef63ac81e9..57457e90fe 100644
--- a/core-java/README.md
+++ b/core-java/README.md
@@ -22,19 +22,11 @@
- [Guide to the Java ArrayList](http://www.baeldung.com/java-arraylist)
- [Guide to Java Reflection](http://www.baeldung.com/java-reflection)
- [A Guide to Java Sockets](http://www.baeldung.com/a-guide-to-java-sockets)
-- [Java 8 Collectors](http://www.baeldung.com/java-8-collectors)
-- [Guide to Java 8’s Functional Interfaces](http://www.baeldung.com/java-8-functional-interfaces)
- [Convert char to String in Java](http://www.baeldung.com/java-convert-char-to-string)
- [Random List Element](http://www.baeldung.com/java-random-list-element)
- [Convert String to int or Integer in Java](http://www.baeldung.com/java-convert-string-to-int-or-integer)
-- [Java 8 – Powerful Comparison with Lambdas](http://www.baeldung.com/java-8-sort-lambda)
- [Java – Directory Size](http://www.baeldung.com/java-folder-size)
- [Java – Try with Resources](http://www.baeldung.com/java-try-with-resources)
-- [Java 8 New Features](http://www.baeldung.com/java-8-new-features)
-- [Lambda Expressions and Functional Interfaces: Tips and Best Practices](http://www.baeldung.com/java-8-lambda-expressions-tips)
-- [The Double Colon Operator in Java 8](http://www.baeldung.com/java-8-double-colon-operator)
-- [Java 8 Streams Advanced](http://www.baeldung.com/java-8-streams)
-- [Introduction to Java 8 Streams](http://www.baeldung.com/java-8-streams-introduction)
- [Guide to the Fork/Join Framework in Java](http://www.baeldung.com/java-fork-join)
- [How to Print Screen in Java](http://www.baeldung.com/print-screen-in-java)
- [How to Convert String to different data types in Java](http://www.baeldung.com/java-string-conversions)
@@ -55,30 +47,20 @@
- [The Traveling Salesman Problem in Java](http://www.baeldung.com/java-simulated-annealing-for-traveling-salesman)
- [How to Create an Executable JAR with Maven](http://www.baeldung.com/executable-jar-with-maven)
- [How to Design a Genetic Algorithm in Java](http://www.baeldung.com/java-genetic-algorithm)
-- [Guide to Java 8 groupingBy Collector](http://www.baeldung.com/java-groupingby-collector)
- [Guide to WeakHashMap in Java](http://www.baeldung.com/java-weakhashmap)
-- [Strategy Design Pattern in Java 8](http://www.baeldung.com/java-strategy-pattern)
-- [Java 8 and Infinite Streams](http://www.baeldung.com/java-inifinite-streams)
-- [String Operations with Java Streams](http://www.baeldung.com/java-stream-operations-on-strings)
- [Spring Security – Cache Control Headers](http://www.baeldung.com/spring-security-cache-control-headers)
- [Basic Introduction to JMX](http://www.baeldung.com/java-management-extensions)
- [AWS Lambda With Java](http://www.baeldung.com/java-aws-lambda)
- [Introduction to Nashorn](http://www.baeldung.com/java-nashorn)
-- [Exceptions in Java 8 Lambda Expressions](http://www.baeldung.com/java-lambda-exceptions)
- [Guide to the Guava BiMap](http://www.baeldung.com/guava-bimap)
- [Iterable to Stream in Java](http://www.baeldung.com/java-iterable-to-stream)
-- [Java 8 Stream findFirst() vs. findAny()](http://www.baeldung.com/java-stream-findfirst-vs-findany)
- [Chained Exceptions in Java](http://www.baeldung.com/java-chained-exceptions)
- [The Java HashMap Under the Hood](http://www.baeldung.com/java-hashmap)
- [A Guide to LinkedHashMap in Java](http://www.baeldung.com/java-linked-hashmap)
- [A Guide to TreeMap in Java](http://www.baeldung.com/java-treemap)
- [A Quick JUnit vs TestNG Comparison](http://www.baeldung.com/junit-vs-testng)
-- [Finding Max/Min of a List or Collection](http://www.baeldung.com/java-collection-min-max)
-- [Guide to java.util.concurrent.Locks](http://www.baeldung.com/java-concurrent-locks)
- [Java Primitive Conversions](http://www.baeldung.com/java-primitive-conversions)
- [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency)
-- [Guide to Java 8 Comparator.comparing()](http://www.baeldung.com/java-8-comparator-comparing)
-- [Avoiding ConcurrentModificationException when iterating and removing](http://www.baeldung.com/avoiding-concurrentmodificationexception-when-iterating-and-removing)
- [Removing all nulls from a List in Java](http://www.baeldung.com/java-remove-nulls-from-list)
- [Removing all duplicates from a List in Java](http://www.baeldung.com/java-remove-duplicates-from-list)
- [Using Math.pow in Java](http://www.baeldung.com/java-math-pow)
@@ -96,7 +78,6 @@
- [Iterating Over Enum Values in Java](http://www.baeldung.com/java-enum-iteration)
- [Kotlin Java Interoperability](http://www.baeldung.com/kotlin-java-interoperability)
- [Using Java MappedByteBuffer](http://www.baeldung.com/java-mapped-byte-buffer)
-- [The Difference Between map() and flatMap()](http://www.baeldung.com/java-difference-map-and-flatmap)
- [How to Round a Number to N Decimal Places in Java](http://www.baeldung.com/java-round-decimal-number)
- [Changing Annotation Parameters At Runtime](http://www.baeldung.com/java-reflection-change-annotation-params)
- [How to Find all Getters Returning Null](http://www.baeldung.com/java-getters-returning-null)
@@ -117,8 +98,5 @@
- [How to Remove the Last Character of a String?](http://www.baeldung.com/java-remove-last-character-of-string)
- [ClassNotFoundException vs NoClassDefFoundError](http://www.baeldung.com/java-classnotfoundexception-and-noclassdeffounderror)
- [Guide to UUID in Java](http://www.baeldung.com/java-uuid)
-- [How to Get the Last Element of a Stream in Java?](http://www.baeldung.com/java-stream-last-element)
- [Guide to Escaping Characters in Java RegExps](http://www.baeldung.com/java-regexp-escape-char)
- [Period and Duration in Java](http://www.baeldung.com/java-period-duration)
-- [Introduction to the Java 8 Date/Time API](http://www.baeldung.com/java-8-date-time-intro)
-- [Migrating to the New Java 8 Date Time API](http://www.baeldung.com/migrating-to-java-8-date-time-api)
diff --git a/core-java/pom.xml b/core-java/pom.xml
index 586486027a..633656857e 100644
--- a/core-java/pom.xml
+++ b/core-java/pom.xml
@@ -187,14 +187,14 @@
${fscontext.version}
- joda-time
- joda-time
- ${joda-time.version}
+ com.codepoetics
+ protonpack
+ ${protonpack.version}
- com.darwinsys
- hirondelle-date4j
- ${hirondelle-date4j.version}
+ one.util
+ streamex
+ ${streamex.version}
@@ -418,8 +418,8 @@
1.8.7
1.16.12
4.6-b01
- 2.9.9
- 1.5.1
+ 1.13
+ 0.6.5
1.3
@@ -428,7 +428,6 @@
3.6.1
1.7.0
-
3.6.0
2.19.1
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/AdapterPatternDriver.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/AdapterPatternDriver.java
index 0d69d0e7ec..9d4fcf3574 100644
--- a/core-java/src/main/java/com/baeldung/designpatterns/adapter/AdapterPatternDriver.java
+++ b/core-java/src/main/java/com/baeldung/designpatterns/adapter/AdapterPatternDriver.java
@@ -5,9 +5,16 @@ import static com.baeldung.designpatterns.util.LogerUtil.LOG;
public class AdapterPatternDriver {
public static void main(String args[]) {
- LuxuryCarsSpeedAdapter luxuryCars = new LuxuryCarsSpeedAdapterImpl();
- LOG.info("Bugatti Veyron Super Sport's top speed is " + luxuryCars.bugattiVeyronInKMPH() + " Kmph.");
- LOG.info("McLaren F1 top speed is " + luxuryCars.mcLarenInKMPH() + " Kmph.");
- LOG.info("Aston Martin One-77 top speed is " + luxuryCars.astonMartinInKMPH() + " Kmph.");
+ LuxuryCars bugattiVeyron = new BugattiVeyron();
+ LuxuryCarsAdapter bugattiVeyronAdapter = new LuxuryCarsAdapterImpl(bugattiVeyron);
+ LOG.info("Bugatti Veyron Super Sport's top speed is " + bugattiVeyronAdapter.speedInKMPH() + " Kmph.");
+
+ LuxuryCars mcLaren = new McLaren();
+ LuxuryCarsAdapter mcLarenAdapter = new LuxuryCarsAdapterImpl(mcLaren);
+ LOG.info("McLaren F1 top speed is " + mcLarenAdapter.speedInKMPH() + " Kmph.");
+
+ LuxuryCars astonMartin = new AstonMartin();
+ LuxuryCarsAdapter astonMartinAdapter = new LuxuryCarsAdapterImpl(astonMartin);
+ LOG.info("McLaren F1 top speed is " + astonMartinAdapter.speedInKMPH() + " Kmph.");
}
}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/AstonMartin.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/AstonMartin.java
new file mode 100644
index 0000000000..b1fba0dae3
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/adapter/AstonMartin.java
@@ -0,0 +1,8 @@
+package com.baeldung.designpatterns.adapter;
+
+public class AstonMartin implements LuxuryCars {
+ @Override
+ public double speedInMPH() {
+ return 220;
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/BugattiVeyron.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/BugattiVeyron.java
new file mode 100644
index 0000000000..1b0b834448
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/adapter/BugattiVeyron.java
@@ -0,0 +1,8 @@
+package com.baeldung.designpatterns.adapter;
+
+public class BugattiVeyron implements LuxuryCars {
+ @Override
+ public double speedInMPH() {
+ return 268;
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCars.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCars.java
new file mode 100644
index 0000000000..9926f5f8bc
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCars.java
@@ -0,0 +1,5 @@
+package com.baeldung.designpatterns.adapter;
+
+public interface LuxuryCars {
+ public double speedInMPH();
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsAdapter.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsAdapter.java
new file mode 100644
index 0000000000..f945e1b389
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsAdapter.java
@@ -0,0 +1,5 @@
+package com.baeldung.designpatterns.adapter;
+
+public interface LuxuryCarsAdapter {
+ public double speedInKMPH();
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsAdapterImpl.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsAdapterImpl.java
new file mode 100644
index 0000000000..f2bf553292
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsAdapterImpl.java
@@ -0,0 +1,19 @@
+package com.baeldung.designpatterns.adapter;
+
+public class LuxuryCarsAdapterImpl implements LuxuryCarsAdapter {
+ private LuxuryCars luxuryCars;
+
+ public LuxuryCarsAdapterImpl(LuxuryCars luxuryCars) {
+ this.luxuryCars = luxuryCars;
+ }
+
+ @Override
+ public double speedInKMPH() {
+ double mph = luxuryCars.speedInMPH();
+ return convertMPHtoKMPH(mph);
+ }
+
+ private double convertMPHtoKMPH(double mph) {
+ return mph * 1.60934;
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsSpeed.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsSpeed.java
deleted file mode 100644
index 0b97b8228c..0000000000
--- a/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsSpeed.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.baeldung.designpatterns.adapter;
-
-public class LuxuryCarsSpeed {
- public double bugattiVeyronInMPH() {
- return 268;
- }
-
- public double mcLarenInMPH() {
- return 241;
- }
-
- public double astonMartinInMPH() {
- return 220;
- }
-}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsSpeedAdapter.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsSpeedAdapter.java
deleted file mode 100644
index d9255f0910..0000000000
--- a/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsSpeedAdapter.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.baeldung.designpatterns.adapter;
-
-public interface LuxuryCarsSpeedAdapter {
- public double bugattiVeyronInKMPH();
-
- public double mcLarenInKMPH();
-
- public double astonMartinInKMPH();
-}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsSpeedAdapterImpl.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsSpeedAdapterImpl.java
deleted file mode 100644
index 2767b78e38..0000000000
--- a/core-java/src/main/java/com/baeldung/designpatterns/adapter/LuxuryCarsSpeedAdapterImpl.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.baeldung.designpatterns.adapter;
-
-public class LuxuryCarsSpeedAdapterImpl extends LuxuryCarsSpeed implements LuxuryCarsSpeedAdapter {
-
- @Override
- public double bugattiVeyronInKMPH() {
- double mph = super.bugattiVeyronInMPH();
- return convertMPHtoKMPH(mph);
- }
-
- @Override
- public double mcLarenInKMPH() {
- double mph = super.mcLarenInMPH();
- return convertMPHtoKMPH(mph);
- }
-
- @Override
- public double astonMartinInKMPH() {
- double mph = super.astonMartinInMPH();
- return convertMPHtoKMPH(mph);
- }
-
- private double convertMPHtoKMPH(double mph) {
- return mph * 1.60934;
- }
-}
diff --git a/core-java/src/main/java/com/baeldung/designpatterns/adapter/McLaren.java b/core-java/src/main/java/com/baeldung/designpatterns/adapter/McLaren.java
new file mode 100644
index 0000000000..e2ba2b830d
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/designpatterns/adapter/McLaren.java
@@ -0,0 +1,8 @@
+package com.baeldung.designpatterns.adapter;
+
+public class McLaren implements LuxuryCars {
+ @Override
+ public double speedInMPH() {
+ return 241;
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/stream/StreamIndices.java b/core-java/src/main/java/com/baeldung/stream/StreamIndices.java
new file mode 100644
index 0000000000..b101bc2740
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/stream/StreamIndices.java
@@ -0,0 +1,37 @@
+package com.baeldung.stream;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import com.codepoetics.protonpack.Indexed;
+import com.codepoetics.protonpack.StreamUtils;
+
+public class StreamIndices {
+
+ public static List getEvenIndexedStrings(String[] names) {
+ List evenIndexedNames = IntStream.range(0, names.length)
+ .filter(i -> i % 2 == 0).mapToObj(i -> names[i])
+ .collect(Collectors.toList());
+ return evenIndexedNames;
+ }
+
+ public static List> getEvenIndexedStrings(List names) {
+ List> list = StreamUtils.zipWithIndex(names.stream())
+ .filter(i -> i.getIndex() % 2 == 0).collect(Collectors.toList());
+ return list;
+ }
+
+ public static List> getOddIndexedStrings(List names) {
+ List> list = StreamUtils.zipWithIndex(names.stream())
+ .filter(i -> i.getIndex() % 2 == 1).collect(Collectors.toList());
+ return list;
+ }
+
+ public static List getOddIndexedStrings(String[] names) {
+ List oddIndexedNames = IntStream.range(0, names.length)
+ .filter(i -> i % 2 == 1).mapToObj(i -> names[i])
+ .collect(Collectors.toList());
+ return oddIndexedNames;
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/designpatterns/AdapterPatternIntegrationTest.java b/core-java/src/test/java/com/baeldung/designpatterns/AdapterPatternIntegrationTest.java
index fb483a8a68..e56e271743 100644
--- a/core-java/src/test/java/com/baeldung/designpatterns/AdapterPatternIntegrationTest.java
+++ b/core-java/src/test/java/com/baeldung/designpatterns/AdapterPatternIntegrationTest.java
@@ -1,20 +1,20 @@
package com.baeldung.designpatterns;
-
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
import org.junit.Test;
-import com.baeldung.designpatterns.adapter.LuxuryCarsSpeedAdapter;
-import com.baeldung.designpatterns.adapter.LuxuryCarsSpeedAdapterImpl;
+import com.baeldung.designpatterns.adapter.AstonMartin;
+import com.baeldung.designpatterns.adapter.BugattiVeyron;
+import com.baeldung.designpatterns.adapter.LuxuryCarsAdapterImpl;
+import com.baeldung.designpatterns.adapter.McLaren;
public class AdapterPatternIntegrationTest {
@Test
public void givenLuxuryCarsAdapter_WhenConvertingMPHToKMPH_thenSuccessfullyConverted() {
- LuxuryCarsSpeedAdapter luxuryCars = new LuxuryCarsSpeedAdapterImpl();
- assertEquals(luxuryCars.bugattiVeyronInKMPH(), 431.30312, 0.00001);
- assertEquals(luxuryCars.mcLarenInKMPH(), 387.85094, 0.00001);
- assertEquals(luxuryCars.astonMartinInKMPH(), 354.0548, 0.00001);
+ assertEquals(new LuxuryCarsAdapterImpl(new BugattiVeyron()).speedInKMPH(), 431.30312, 0.00001);
+ assertEquals(new LuxuryCarsAdapterImpl(new McLaren()).speedInKMPH(), 387.85094, 0.00001);
+ assertEquals(new LuxuryCarsAdapterImpl(new AstonMartin()).speedInKMPH(), 354.0548, 0.00001);
}
}
diff --git a/core-java/src/test/java/com/baeldung/java8/optional/README.md b/core-java/src/test/java/com/baeldung/java8/optional/README.md
deleted file mode 100644
index 129131ae45..0000000000
--- a/core-java/src/test/java/com/baeldung/java8/optional/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-### Relevant Articles:
-- [Guide To Java 8 Optional](http://www.baeldung.com/java-optional)
diff --git a/core-java/src/test/java/com/baeldung/stream/StreamIndicesTest.java b/core-java/src/test/java/com/baeldung/stream/StreamIndicesTest.java
new file mode 100644
index 0000000000..ca60544788
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/stream/StreamIndicesTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.stream;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.codepoetics.protonpack.Indexed;
+
+public class StreamIndicesTest {
+
+ @Test
+ public void givenArray_whenGetIndexedStrings_thenReturnListOfEvenIndexedStrings() {
+ String[] names = { "Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim" };
+ List expectedResult = Arrays.asList("Afrim", "Besim", "Durim");
+ List actualResult = StreamIndices.getEvenIndexedStrings(names);
+
+ assertEquals(expectedResult, actualResult);
+ }
+
+ @Test
+ public void givenArray_whenGetIndexedStrings_thenReturnListOfOddStrings() {
+ String[] names = { "Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim" };
+ List expectedResult = Arrays.asList("Bashkim", "Lulzim", "Shpetim");
+ List actualResult = StreamIndices.getOddIndexedStrings(names);
+
+ assertEquals(expectedResult, actualResult);
+ }
+
+ @Test
+ public void givenList_whenGetIndexedStrings_thenReturnListOfEvenIndexedStrings() {
+ List names = Arrays.asList("Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim");
+ List> expectedResult = Arrays.asList(Indexed.index(0, "Afrim"), Indexed.index(2, "Besim"), Indexed.index(4, "Durim"));
+ List> actualResult = StreamIndices.getEvenIndexedStrings(names);
+
+ assertEquals(expectedResult, actualResult);
+ }
+
+ @Test
+ public void givenList_whenGetIndexedStrings_thenReturnListOfOddIndexedStrings() {
+ List names = Arrays.asList("Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim");
+ List> expectedResult = Arrays.asList(Indexed.index(1, "Bashkim"), Indexed.index(3, "Lulzim"), Indexed.index(5, "Shpetim"));
+ List> actualResult = StreamIndices.getOddIndexedStrings(names);
+
+ assertEquals(expectedResult, actualResult);
+ }
+
+}
\ No newline at end of file
diff --git a/ejb/ejbclient/src/main/java/com/baeldung/ejbclient/application/TextApplication.java b/ejb/ejb-client/src/main/java/com/baeldung/ejb/wildfly/TextApplication.java
similarity index 92%
rename from ejb/ejbclient/src/main/java/com/baeldung/ejbclient/application/TextApplication.java
rename to ejb/ejb-client/src/main/java/com/baeldung/ejb/wildfly/TextApplication.java
index b65c21100d..3b63761c73 100644
--- a/ejb/ejbclient/src/main/java/com/baeldung/ejbclient/application/TextApplication.java
+++ b/ejb/ejb-client/src/main/java/com/baeldung/ejb/wildfly/TextApplication.java
@@ -1,7 +1,5 @@
-package com.baeldung.ejbclient.application;
+package com.baeldung.ejb.wildfly;
-import com.baeldung.ejbmodule.TextProcessorBean;
-import com.baeldung.ejbmodule.TextProcessorRemote;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
diff --git a/ejb/ejbclient/src/test/java/com/baeldung/ejbclient/application/TextApplicationTest.java b/ejb/ejb-client/src/test/java/com/baeldung/ejb/wildfly/TextApplicationTest.java
similarity index 94%
rename from ejb/ejbclient/src/test/java/com/baeldung/ejbclient/application/TextApplicationTest.java
rename to ejb/ejb-client/src/test/java/com/baeldung/ejb/wildfly/TextApplicationTest.java
index 947c72d0b0..c0446eaea6 100644
--- a/ejb/ejbclient/src/test/java/com/baeldung/ejbclient/application/TextApplicationTest.java
+++ b/ejb/ejb-client/src/test/java/com/baeldung/ejb/wildfly/TextApplicationTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.ejbclient.application;
+package com.baeldung.ejb.wildfly;
import org.junit.AfterClass;
import org.junit.BeforeClass;
diff --git a/ejb/ejbmodule/src/main/java/com/baeldung/ejbmodule/TextProcessorBean.java b/ejb/ejb-remote/src/main/java/com/baeldung/ejb/wildfly/TextProcessorBean.java
similarity index 85%
rename from ejb/ejbmodule/src/main/java/com/baeldung/ejbmodule/TextProcessorBean.java
rename to ejb/ejb-remote/src/main/java/com/baeldung/ejb/wildfly/TextProcessorBean.java
index dc0db5fc53..4f0c013b0f 100644
--- a/ejb/ejbmodule/src/main/java/com/baeldung/ejbmodule/TextProcessorBean.java
+++ b/ejb/ejb-remote/src/main/java/com/baeldung/ejb/wildfly/TextProcessorBean.java
@@ -1,4 +1,4 @@
-package com.baeldung.ejbmodule;
+package com.baeldung.ejb.wildfly;
import javax.ejb.Stateless;
diff --git a/ejb/ejbmodule/src/main/java/com/baeldung/ejbmodule/TextProcessorRemote.java b/ejb/ejb-remote/src/main/java/com/baeldung/ejb/wildfly/TextProcessorRemote.java
similarity index 76%
rename from ejb/ejbmodule/src/main/java/com/baeldung/ejbmodule/TextProcessorRemote.java
rename to ejb/ejb-remote/src/main/java/com/baeldung/ejb/wildfly/TextProcessorRemote.java
index 680d8f4e10..b51af8528d 100644
--- a/ejb/ejbmodule/src/main/java/com/baeldung/ejbmodule/TextProcessorRemote.java
+++ b/ejb/ejb-remote/src/main/java/com/baeldung/ejb/wildfly/TextProcessorRemote.java
@@ -1,4 +1,4 @@
-package com.baeldung.ejbmodule;
+package com.baeldung.ejb.wildfly;
import javax.ejb.Remote;
diff --git a/ejb/ejbclient/src/main/resources/jboss-ejb-client.properties b/ejb/ejbclient/src/main/resources/jboss-ejb-client.properties
deleted file mode 100644
index 67533b7825..0000000000
--- a/ejb/ejbclient/src/main/resources/jboss-ejb-client.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-endpoint.name=client-endpoint
-remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
-remote.connections=default
-remote.connection.default.host=127.0.0.1
-remote.connection.default.port=8080
-remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
-remote.connection.default.username=myusername
-remote.connection.default.password=mypassword
\ No newline at end of file
diff --git a/ejb/ejbmodule/src/test/java/com/baeldung/ejbmodule/TextProcessorBeanTest.java b/ejb/ejbmodule/src/test/java/com/baeldung/ejbmodule/TextProcessorBeanTest.java
deleted file mode 100644
index d8693420d4..0000000000
--- a/ejb/ejbmodule/src/test/java/com/baeldung/ejbmodule/TextProcessorBeanTest.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.baeldung.ejbmodule;
-
-import org.junit.Test;
-import static org.junit.Assert.assertEquals;
-
-public class TextProcessorBeanTest {
- @Test
- public void givenInputString_whenComparedToStringParsedByBean_thenSuccessful() {
- TextProcessorBean textProcessor = new TextProcessorBean();
- assertEquals("TEST", textProcessor.processText("test"));
- }
-}
\ No newline at end of file
diff --git a/ejb/pom.xml b/ejb/pom.xml
index b8aa32fab1..78e40a7b7c 100755
--- a/ejb/pom.xml
+++ b/ejb/pom.xml
@@ -81,6 +81,5 @@
ejb-remote
ejb-client
ejb-session-beans
- ejb-session-beans-client
\ No newline at end of file
diff --git a/graphql/graphql-java/payload-examples/createUser.json b/graphql/graphql-java/payload-examples/createUser.json
new file mode 100644
index 0000000000..3ade405b16
--- /dev/null
+++ b/graphql/graphql-java/payload-examples/createUser.json
@@ -0,0 +1,8 @@
+{
+ "query": "mutation($name: String! $email: String! $age: String! ){ createUser ( name: $name email: $email age: $age) { id name email age } }",
+ "parameters": {
+ "name": "John",
+ "email": "john@email.com",
+ "age": 34
+ }
+}
\ No newline at end of file
diff --git a/graphql/graphql-java/payload-examples/deleteUser.json b/graphql/graphql-java/payload-examples/deleteUser.json
new file mode 100644
index 0000000000..204496f19b
--- /dev/null
+++ b/graphql/graphql-java/payload-examples/deleteUser.json
@@ -0,0 +1,6 @@
+{
+ "query": "mutation($name: String! ){ deleteUser ( id: $id) { id name email age} }",
+ "parameters": {
+ "id": 2
+ }
+}
\ No newline at end of file
diff --git a/graphql/graphql-java/payload-examples/listUsers.json b/graphql/graphql-java/payload-examples/listUsers.json
new file mode 100644
index 0000000000..dde887bb07
--- /dev/null
+++ b/graphql/graphql-java/payload-examples/listUsers.json
@@ -0,0 +1,4 @@
+{
+ "query": "{ listUsers{ id name email age}}",
+ "parameters": {}
+}
\ No newline at end of file
diff --git a/graphql/graphql-java/payload-examples/retrieveUser.json b/graphql/graphql-java/payload-examples/retrieveUser.json
new file mode 100644
index 0000000000..27b5f422eb
--- /dev/null
+++ b/graphql/graphql-java/payload-examples/retrieveUser.json
@@ -0,0 +1,6 @@
+{
+ "query": "query($id: String!){ retrieveUser ( id: $id) { id name email} }",
+ "parameters": {
+ "id": 1
+ }
+}
\ No newline at end of file
diff --git a/graphql/graphql-java/payload-examples/searchName.json b/graphql/graphql-java/payload-examples/searchName.json
new file mode 100644
index 0000000000..df8f080b86
--- /dev/null
+++ b/graphql/graphql-java/payload-examples/searchName.json
@@ -0,0 +1,6 @@
+{
+ "query": "query($id: String!){ searchName ( id: $id) { id name email} }",
+ "parameters": {
+ "id": 2
+ }
+}
\ No newline at end of file
diff --git a/graphql/graphql-java/payload-examples/updateUser.json b/graphql/graphql-java/payload-examples/updateUser.json
new file mode 100644
index 0000000000..aa68151111
--- /dev/null
+++ b/graphql/graphql-java/payload-examples/updateUser.json
@@ -0,0 +1,9 @@
+{
+ "query": "mutation($id: String! $name: String! $email: String! $age: String! ){ updateUser ( id: $id name: $name email: $email age: $age) { id name email age} }",
+ "parameters": {
+ "id": 1,
+ "name":"John updated",
+ "email": "johnupdate@email.com",
+ "age": 50
+ }
+}
\ No newline at end of file
diff --git a/graphql/graphql-java/pom.xml b/graphql/graphql-java/pom.xml
new file mode 100644
index 0000000000..c031ddc694
--- /dev/null
+++ b/graphql/graphql-java/pom.xml
@@ -0,0 +1,29 @@
+
+ 4.0.0
+
+ com.baeldung.graphql
+ graphql-java
+ 1.0
+
+ graphql-java
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ com.graphql-java
+ graphql-java-annotations
+ 3.0.3
+
+
+ io.ratpack
+ ratpack-core
+ 1.4.6
+
+
+
\ No newline at end of file
diff --git a/graphql/graphql-java/src/main/java/com/baeldung/graphql/Application.java b/graphql/graphql-java/src/main/java/com/baeldung/graphql/Application.java
new file mode 100644
index 0000000000..6e9b2a5c80
--- /dev/null
+++ b/graphql/graphql-java/src/main/java/com/baeldung/graphql/Application.java
@@ -0,0 +1,17 @@
+package com.baeldung.graphql;
+
+import ratpack.server.RatpackServer;
+
+import com.baeldung.graphql.handler.UserHandler;
+
+public class Application {
+ public static void main(String[] args) throws Exception {
+ new Application();
+ }
+
+ private Application() throws Exception {
+ final RatpackServer server = RatpackServer.of(s -> s.handlers(chain -> chain.post("users", new UserHandler())));
+ server.start();
+ }
+
+}
diff --git a/graphql/graphql-java/src/main/java/com/baeldung/graphql/entity/User.java b/graphql/graphql-java/src/main/java/com/baeldung/graphql/entity/User.java
new file mode 100644
index 0000000000..a4a776cfff
--- /dev/null
+++ b/graphql/graphql-java/src/main/java/com/baeldung/graphql/entity/User.java
@@ -0,0 +1,78 @@
+package com.baeldung.graphql.entity;
+
+import java.util.List;
+
+import com.baeldung.graphql.handler.UserHandler;
+import com.baeldung.graphql.utils.SchemaUtils;
+
+import graphql.annotations.GraphQLField;
+import graphql.annotations.GraphQLName;
+
+@GraphQLName(SchemaUtils.USER)
+public class User {
+
+ @GraphQLField
+ private Long id;
+ @GraphQLField
+ private String name;
+ @GraphQLField
+ private String email;
+ @GraphQLField
+ private Integer age;
+
+ public User(String name, String email, Integer age) {
+ this.id = genId();
+ this.name = name;
+ this.email = email;
+ this.age = age;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Integer getAge() {
+ return age;
+ }
+
+ public void setAge(Integer age) {
+ this.age = age;
+ }
+
+ public static Long genId() {
+ Long id = 1L;
+ try {
+ List users = new UserHandler().getUsers();
+ for (User user : users)
+ id = (user.getId() > id ? user.getId() : id) + 1;
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return id;
+ }
+
+ public String toString() {
+ return "[id=" + id + ", name=" + name + ", email="+email+ ", age="+ age +"]";
+ }
+}
\ No newline at end of file
diff --git a/graphql/graphql-java/src/main/java/com/baeldung/graphql/handler/UserHandler.java b/graphql/graphql-java/src/main/java/com/baeldung/graphql/handler/UserHandler.java
new file mode 100644
index 0000000000..a6d474a70d
--- /dev/null
+++ b/graphql/graphql-java/src/main/java/com/baeldung/graphql/handler/UserHandler.java
@@ -0,0 +1,56 @@
+package com.baeldung.graphql.handler;
+
+import graphql.ExecutionResult;
+import graphql.GraphQL;
+import graphql.schema.DataFetchingEnvironment;
+import ratpack.handling.Context;
+import ratpack.handling.Handler;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import com.baeldung.graphql.entity.User;
+import com.baeldung.graphql.schema.UserSchema;
+import com.baeldung.graphql.utils.SchemaUtils;
+
+import static ratpack.jackson.Jackson.json;
+
+public class UserHandler implements Handler {
+ private static final Logger LOGGER = Logger.getLogger(UserHandler.class.getSimpleName());
+ private GraphQL graphql;
+ private static List users = new ArrayList<>();
+
+ public UserHandler() throws Exception {
+ graphql = new GraphQL(new UserSchema().getSchema());
+ }
+
+ @Override
+ public void handle(Context context) throws Exception {
+ context.parse(Map.class)
+ .then(payload -> {
+ Map parameters = (Map) payload.get("parameters");
+ ExecutionResult executionResult = graphql.execute(payload.get(SchemaUtils.QUERY)
+ .toString(), null, this, parameters);
+ Map result = new LinkedHashMap<>();
+ if (executionResult.getErrors()
+ .isEmpty()) {
+ result.put(SchemaUtils.DATA, executionResult.getData());
+ } else {
+ result.put(SchemaUtils.ERRORS, executionResult.getErrors());
+ LOGGER.warning("Errors: " + executionResult.getErrors());
+ }
+ context.render(json(result));
+ });
+ }
+
+ public static List getUsers() {
+ return users;
+ }
+
+ public static List getUsers(DataFetchingEnvironment env) {
+ return ((UserHandler) env.getSource()).getUsers();
+ }
+}
diff --git a/graphql/graphql-java/src/main/java/com/baeldung/graphql/mutation/UserMutation.java b/graphql/graphql-java/src/main/java/com/baeldung/graphql/mutation/UserMutation.java
new file mode 100644
index 0000000000..3c6f53a382
--- /dev/null
+++ b/graphql/graphql-java/src/main/java/com/baeldung/graphql/mutation/UserMutation.java
@@ -0,0 +1,57 @@
+package com.baeldung.graphql.mutation;
+
+import graphql.annotations.GraphQLField;
+import graphql.annotations.GraphQLName;
+import graphql.schema.DataFetchingEnvironment;
+
+import javax.validation.constraints.NotNull;
+
+import com.baeldung.graphql.entity.User;
+import com.baeldung.graphql.utils.SchemaUtils;
+
+import java.util.List;
+import java.util.Optional;
+
+import static com.baeldung.graphql.handler.UserHandler.getUsers;
+
+@GraphQLName(SchemaUtils.MUTATION)
+public class UserMutation {
+ @GraphQLField
+ public static User createUser(final DataFetchingEnvironment env, @NotNull @GraphQLName(SchemaUtils.NAME) final String name, @NotNull @GraphQLName(SchemaUtils.EMAIL) final String email, @NotNull @GraphQLName(SchemaUtils.AGE) final String age) {
+ List users = getUsers(env);
+ final User user = new User(name, email, Integer.valueOf(age));
+ users.add(user);
+ return user;
+ }
+
+ @GraphQLField
+ public static User updateUser(final DataFetchingEnvironment env, @NotNull @GraphQLName(SchemaUtils.ID) final String id, @NotNull @GraphQLName(SchemaUtils.NAME) final String name, @NotNull @GraphQLName(SchemaUtils.EMAIL) final String email,
+ @NotNull @GraphQLName(SchemaUtils.AGE) final String age) {
+ final Optional user = getUsers(env).stream()
+ .filter(c -> c.getId() == Long.parseLong(id))
+ .findFirst();
+ if (!user.isPresent()) {
+ return null;
+ }
+ user.get()
+ .setName(name);
+ user.get()
+ .setEmail(email);
+ user.get()
+ .setAge(Integer.valueOf(age));
+ return user.get();
+ }
+
+ @GraphQLField
+ public static User deleteUser(final DataFetchingEnvironment env, @NotNull @GraphQLName(SchemaUtils.ID) final String id) {
+ final List users = getUsers(env);
+ final Optional user = users.stream()
+ .filter(c -> c.getId() == Long.parseLong(id))
+ .findFirst();
+ if (!user.isPresent()) {
+ return null;
+ }
+ users.removeIf(c -> c.getId() == Long.parseLong(id));
+ return user.get();
+ }
+}
diff --git a/graphql/graphql-java/src/main/java/com/baeldung/graphql/query/UserQuery.java b/graphql/graphql-java/src/main/java/com/baeldung/graphql/query/UserQuery.java
new file mode 100644
index 0000000000..6f1521c5cf
--- /dev/null
+++ b/graphql/graphql-java/src/main/java/com/baeldung/graphql/query/UserQuery.java
@@ -0,0 +1,42 @@
+package com.baeldung.graphql.query;
+
+import graphql.annotations.GraphQLField;
+import graphql.annotations.GraphQLName;
+import graphql.schema.DataFetchingEnvironment;
+
+import javax.validation.constraints.NotNull;
+
+import com.baeldung.graphql.entity.User;
+import com.baeldung.graphql.utils.SchemaUtils;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import static com.baeldung.graphql.handler.UserHandler.getUsers;
+
+@GraphQLName(SchemaUtils.QUERY)
+public class UserQuery {
+
+ @GraphQLField
+ public static User retrieveUser(final DataFetchingEnvironment env, @NotNull @GraphQLName(SchemaUtils.ID) final String id) {
+ final Optional any = getUsers(env).stream()
+ .filter(c -> c.getId() == Long.parseLong(id))
+ .findFirst();
+ return any.orElse(null);
+ }
+
+ @GraphQLField
+ public static List searchName(final DataFetchingEnvironment env, @NotNull @GraphQLName(SchemaUtils.NAME) final String name) {
+ return getUsers(env).stream()
+ .filter(c -> c.getName()
+ .contains(name))
+ .collect(Collectors.toList());
+ }
+
+ @GraphQLField
+ public static List listUsers(final DataFetchingEnvironment env) {
+ return getUsers(env);
+ }
+
+}
\ No newline at end of file
diff --git a/graphql/graphql-java/src/main/java/com/baeldung/graphql/schema/UserSchema.java b/graphql/graphql-java/src/main/java/com/baeldung/graphql/schema/UserSchema.java
new file mode 100644
index 0000000000..ebb3569aac
--- /dev/null
+++ b/graphql/graphql-java/src/main/java/com/baeldung/graphql/schema/UserSchema.java
@@ -0,0 +1,24 @@
+package com.baeldung.graphql.schema;
+
+import graphql.annotations.GraphQLAnnotations;
+import graphql.schema.GraphQLSchema;
+
+import static graphql.schema.GraphQLSchema.newSchema;
+
+import com.baeldung.graphql.mutation.UserMutation;
+import com.baeldung.graphql.query.UserQuery;
+
+public class UserSchema {
+
+ private final GraphQLSchema schema;
+
+ public UserSchema() throws IllegalAccessException, NoSuchMethodException, InstantiationException {
+ schema = newSchema().query(GraphQLAnnotations.object(UserQuery.class))
+ .mutation(GraphQLAnnotations.object(UserMutation.class))
+ .build();
+ }
+
+ public GraphQLSchema getSchema() {
+ return schema;
+ }
+}
diff --git a/graphql/graphql-java/src/main/java/com/baeldung/graphql/utils/SchemaUtils.java b/graphql/graphql-java/src/main/java/com/baeldung/graphql/utils/SchemaUtils.java
new file mode 100644
index 0000000000..680d7e3ea9
--- /dev/null
+++ b/graphql/graphql-java/src/main/java/com/baeldung/graphql/utils/SchemaUtils.java
@@ -0,0 +1,14 @@
+package com.baeldung.graphql.utils;
+
+public class SchemaUtils {
+ public static final String USER = "user";
+ public static final String ID = "id";
+ public static final String NAME = "name";
+ public static final String EMAIL = "email";
+ public static final String AGE = "age";
+
+ public static final String MUTATION = "mutation";
+ public static final String QUERY = "query";
+ public static final String ERRORS = "errors";
+ public static final String DATA = "data";
+}
diff --git a/guest/core-java-9/pom.xml b/guest/core-java-9/pom.xml
new file mode 100644
index 0000000000..d588df4abc
--- /dev/null
+++ b/guest/core-java-9/pom.xml
@@ -0,0 +1,27 @@
+
+ 4.0.0
+ com.stackify
+ core-java-9
+ 0.0.1-SNAPSHOT
+
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
+
+
+ maven-compiler-plugin
+ 3.6.2
+
+ 1.9
+ 1.9
+
+
+
+
+
\ No newline at end of file
diff --git a/guest/core-java-9/src/main/java/com/stackify/optional/User.java b/guest/core-java-9/src/main/java/com/stackify/optional/User.java
new file mode 100644
index 0000000000..903e75f6f6
--- /dev/null
+++ b/guest/core-java-9/src/main/java/com/stackify/optional/User.java
@@ -0,0 +1,28 @@
+package com.stackify.optional;
+
+public class User {
+ private String email;
+ private String password;
+
+ public User(String email, String password) {
+ super();
+ this.email = email;
+ this.password = password;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+}
diff --git a/guest/core-java-9/src/test/java/com/stackify/optional/OptionalTest.java b/guest/core-java-9/src/test/java/com/stackify/optional/OptionalTest.java
new file mode 100644
index 0000000000..4c3503b811
--- /dev/null
+++ b/guest/core-java-9/src/test/java/com/stackify/optional/OptionalTest.java
@@ -0,0 +1,41 @@
+package com.stackify.optional;
+
+import org.junit.Test;
+import java.util.Optional;
+import java.util.List;
+
+import static org.junit.Assert.*;
+import java.util.stream.Collectors;
+
+public class OptionalTest {
+
+ private User user;
+
+ @Test
+ public void whenEmptyOptional_thenGetValueFromOr() {
+ User result = Optional.ofNullable(user)
+ .or( () -> Optional.of(new User("default","1234"))).get();
+
+ assertEquals(result.getEmail(), "default");
+ }
+
+ @Test
+ public void whenIfPresentOrElse_thenOk() {
+ Optional.ofNullable(user)
+ .ifPresentOrElse( u -> System.out.println("User is:" + u.getEmail()), () -> System.out.println("User not found"));
+ }
+
+ @Test
+ public void whenGetStream_thenOk() {
+ User user = new User("john@gmail.com", "1234");
+ List emails = Optional.ofNullable(user)
+ .stream()
+ .filter(u -> u.getEmail() != null && u.getEmail().contains("@"))
+ .map( u -> u.getEmail())
+ .collect(Collectors.toList());
+
+ assertTrue(emails.size() == 1);
+ assertEquals(emails.get(0), user.getEmail());
+ }
+
+}
diff --git a/guest/core-java/pom.xml b/guest/core-java/pom.xml
new file mode 100644
index 0000000000..548d5c663b
--- /dev/null
+++ b/guest/core-java/pom.xml
@@ -0,0 +1,36 @@
+
+ 4.0.0
+ com.stackify
+ core-java
+ 0.0.1-SNAPSHOT
+
+
+
+ junit
+ junit
+ 4.12
+
+
+ org.apache.logging.log4j
+ log4j-core
+ ${log4j2.version}
+
+
+
+
+
+
+ maven-compiler-plugin
+ 3.5
+
+ 1.8
+ 1.8
+
+
+
+
+
+ 2.8.2
+
+
\ No newline at end of file
diff --git a/guest/core-java/src/main/java/com/stackify/optional/Address.java b/guest/core-java/src/main/java/com/stackify/optional/Address.java
new file mode 100644
index 0000000000..f54c999920
--- /dev/null
+++ b/guest/core-java/src/main/java/com/stackify/optional/Address.java
@@ -0,0 +1,40 @@
+package com.stackify.optional;
+
+public class Address {
+ private String addressLine;
+ private String city;
+ private Country country;
+
+ public Address(String addressLine, String city, Country country) {
+ super();
+ this.addressLine = addressLine;
+ this.city = city;
+ this.country = country;
+ }
+
+ public String getAddressLine() {
+ return addressLine;
+ }
+
+ public void setAddressLine(String addressLine) {
+ this.addressLine = addressLine;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public Country getCountry() {
+ return country;
+ }
+
+ public void setCountry(Country country) {
+ this.country = country;
+ }
+
+
+}
diff --git a/guest/core-java/src/main/java/com/stackify/optional/Country.java b/guest/core-java/src/main/java/com/stackify/optional/Country.java
new file mode 100644
index 0000000000..bf97ef7b6d
--- /dev/null
+++ b/guest/core-java/src/main/java/com/stackify/optional/Country.java
@@ -0,0 +1,29 @@
+package com.stackify.optional;
+
+public class Country {
+ private String name;
+ private String isocode;
+
+ public Country(String name, String isocode) {
+ super();
+ this.name = name;
+ this.isocode = isocode;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getIsocode() {
+ return isocode;
+ }
+
+ public void setIsocode(String isocode) {
+ this.isocode = isocode;
+ }
+
+}
diff --git a/guest/core-java/src/main/java/com/stackify/optional/User.java b/guest/core-java/src/main/java/com/stackify/optional/User.java
new file mode 100644
index 0000000000..910f2605dd
--- /dev/null
+++ b/guest/core-java/src/main/java/com/stackify/optional/User.java
@@ -0,0 +1,51 @@
+package com.stackify.optional;
+
+import java.util.Optional;
+
+public class User {
+ private String email;
+ private String password;
+
+ private Address address;
+
+ private String position;
+
+ public User(String email, String password) {
+ super();
+ this.email = email;
+ this.password = password;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public Address getAddress() {
+ return address;
+ }
+
+ public void setAddress(Address address) {
+ this.address = address;
+ }
+
+ public Optional getPosition() {
+ return Optional.ofNullable(position);
+ }
+
+ public void setPosition(String position) {
+ this.position = position;
+ }
+
+}
diff --git a/guest/core-java/src/main/java/com/stackify/optional/chaining/Address.java b/guest/core-java/src/main/java/com/stackify/optional/chaining/Address.java
new file mode 100644
index 0000000000..1e10c67c39
--- /dev/null
+++ b/guest/core-java/src/main/java/com/stackify/optional/chaining/Address.java
@@ -0,0 +1,38 @@
+package com.stackify.optional.chaining;
+
+import java.util.Optional;
+
+public class Address {
+ private String addressLine;
+ private String city;
+ private Country country;
+
+ public Address(String addressLine, String city) {
+ this.addressLine = addressLine;
+ this.city = city;
+ }
+
+ public String getAddressLine() {
+ return addressLine;
+ }
+
+ public void setAddressLine(String addressLine) {
+ this.addressLine = addressLine;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public Optional getCountry() {
+ return Optional.ofNullable(country);
+ }
+
+ public void setCountry(Country country) {
+ this.country = country;
+ }
+}
diff --git a/guest/core-java/src/main/java/com/stackify/optional/chaining/Country.java b/guest/core-java/src/main/java/com/stackify/optional/chaining/Country.java
new file mode 100644
index 0000000000..89e85a9b43
--- /dev/null
+++ b/guest/core-java/src/main/java/com/stackify/optional/chaining/Country.java
@@ -0,0 +1,28 @@
+package com.stackify.optional.chaining;
+
+public class Country {
+ private String name;
+ private String isocode;
+
+ public Country(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getIsocode() {
+ return isocode;
+ }
+
+ public void setIsocode(String isocode) {
+ this.isocode = isocode;
+ }
+
+
+}
\ No newline at end of file
diff --git a/guest/core-java/src/main/java/com/stackify/optional/chaining/User.java b/guest/core-java/src/main/java/com/stackify/optional/chaining/User.java
new file mode 100644
index 0000000000..07eb398abe
--- /dev/null
+++ b/guest/core-java/src/main/java/com/stackify/optional/chaining/User.java
@@ -0,0 +1,50 @@
+package com.stackify.optional.chaining;
+
+import java.util.Optional;
+
+public class User {
+ private String email;
+ private String password;
+
+ private Address address;
+
+ private String position;
+
+ public User(String email, String password) {
+ this.email = email;
+ this.password = password;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public Optional getAddress() {
+ return Optional.ofNullable(address);
+ }
+
+ public void setAddress(Address address) {
+ this.address = address;
+ }
+
+ public Optional getPosition() {
+ return Optional.ofNullable(position);
+ }
+
+ public void setPosition(String position) {
+ this.position = position;
+ }
+
+}
diff --git a/guest/core-java/src/main/resources/log4j2.xml b/guest/core-java/src/main/resources/log4j2.xml
new file mode 100644
index 0000000000..a67aae6aa6
--- /dev/null
+++ b/guest/core-java/src/main/resources/log4j2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/guest/core-java/src/test/java/com/stackify/optional/OptionalTest.java b/guest/core-java/src/test/java/com/stackify/optional/OptionalTest.java
new file mode 100644
index 0000000000..c6e6ddb15d
--- /dev/null
+++ b/guest/core-java/src/test/java/com/stackify/optional/OptionalTest.java
@@ -0,0 +1,166 @@
+package com.stackify.optional;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.junit.Test;
+
+public class OptionalTest {
+
+ private User user;
+
+ private Logger logger = LogManager.getLogger(OptionalTest.class);
+
+ @Test(expected = NullPointerException.class)
+ public void testNull() {
+ String isocode = user.getAddress().getCountry().getIsocode().toUpperCase();
+ }
+
+ @Test
+ public void test() {
+
+ if (user != null) {
+ Address address = user.getAddress();
+ if (address != null) {
+ Country country = address.getCountry();
+ if (country != null) {
+ String isocode = country.getIsocode();
+ if (isocode != null) {
+ isocode = isocode.toUpperCase();
+ }
+ }
+ }
+ }
+
+ }
+
+ @Test(expected = NoSuchElementException.class)
+ public void whenCreateEmptyOptional_thenNull() {
+ Optional emptyOpt = Optional.empty();
+ emptyOpt.get();
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void whenCreateOfEmptyOptional_thenNullPointerException() {
+ Optional opt = Optional.of(user);
+ }
+
+ @Test
+ public void whenCreateOfNullableOptional_thenOk() {
+ String name = "John";
+ Optional opt = Optional.ofNullable(name);
+ assertEquals("John", opt.get());
+ }
+
+ @Test
+ public void whenCheckIsPresent_thenOk() {
+ user = new User("john@gmail.com", "1234");
+ Optional opt = Optional.ofNullable(user);
+ assertTrue(opt.isPresent());
+
+ assertEquals(user.getEmail(), opt.get().getEmail());
+ }
+
+ @Test
+ public void whenCheckIfPresent_thenOk() {
+ user = new User("john@gmail.com", "1234");
+ Optional opt = Optional.ofNullable(user);
+ assertTrue(opt.isPresent());
+
+ opt.ifPresent(u -> assertEquals(user.getEmail(), u.getEmail()));
+ }
+
+ @Test
+ public void whenEmptyValue_thenReturnDefault() {
+ User user = null;
+ User user2 = new User("anna@gmail.com", "1234");
+ User result = Optional.ofNullable(user).orElse(user2);
+
+ assertEquals("anna@gmail.com", result.getEmail());
+ }
+
+ @Test
+ public void whenValueNotNull_thenIgnoreDefault() {
+ User user = new User("john@gmail.com", "1234");
+ User user2 = new User("anna@gmail.com", "1234");
+ User result = Optional.ofNullable(user).orElse(user2);
+
+ assertEquals("john@gmail.com", result.getEmail());
+ }
+
+ @Test
+ public void whenSetDefaultOrElseGet_thenOk() {
+ User user = null;
+ User user2 = new User("anna@gmail.com", "1234");
+ User result = Optional.ofNullable(user).orElseGet(() -> user2);
+
+ assertEquals("anna@gmail.com", result.getEmail());
+ }
+
+ @Test
+ public void givenPresentValue_whenCompare_thenOk() {
+ User user = new User("john@gmail.com", "1234");
+ logger.info("Using orElse");
+ User result = Optional.ofNullable(user).orElse(createNewUser());
+ logger.info("Using orElseGet");
+ User result2 = Optional.ofNullable(user).orElseGet(() -> createNewUser());
+ }
+
+ private User createNewUser() {
+ logger.info("Creating New User");
+ return new User("extra@gmail.com", "1234");
+ }
+
+ @Test
+ public void givenEmptyValue_whenCompare_thenOk() {
+ User user = null;
+ logger.info("Using orElse");
+ User result = Optional.ofNullable(user).orElse(createNewUser());
+ logger.info("Using orElseGet");
+ User result2 = Optional.ofNullable(user).orElseGet(() -> createNewUser());
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void whenThrowException_thenOk() {
+ User result = Optional.ofNullable(user).orElseThrow(() -> new IllegalArgumentException());
+ }
+
+ @Test
+ public void whenMap_thenOk() {
+ user = new User("anna@gmail.com", "1234");
+ String email = Optional.ofNullable(user).map(u -> u.getEmail()).orElse("default@gmail.com");
+ assertEquals(email, user.getEmail());
+
+ }
+
+ @Test
+ public void whenFlatMap_thenOk() {
+ user = new User("anna@gmail.com", "1234");
+ user.setPosition("Developer");
+ String position = Optional.ofNullable(user).flatMap(u -> u.getPosition()).orElse("default");
+ assertEquals(position, user.getPosition().get());
+
+ }
+
+ @Test
+ public void whenFilter_thenOk() {
+ user = new User("anna@gmail.com", "1234");
+ Optional result = Optional.ofNullable(user).filter(u -> u.getEmail() != null && u.getEmail().contains("@"));
+
+ assertTrue(result.isPresent());
+ }
+
+ @Test
+ public void whenStream_thenOk() {
+ List users = new ArrayList<>();
+ User user = users.stream().findFirst().orElse(new User("default", "1234"));
+ assertEquals(user.getEmail(), "default");
+ }
+
+}
diff --git a/guest/core-java/src/test/java/com/stackify/optional/chaining/OptionalChainingTest.java b/guest/core-java/src/test/java/com/stackify/optional/chaining/OptionalChainingTest.java
new file mode 100644
index 0000000000..660497c367
--- /dev/null
+++ b/guest/core-java/src/test/java/com/stackify/optional/chaining/OptionalChainingTest.java
@@ -0,0 +1,36 @@
+package com.stackify.optional.chaining;
+
+import static org.junit.Assert.*;
+
+import java.util.Optional;
+
+import org.junit.Test;
+
+public class OptionalChainingTest {
+
+ @Test
+ public void whenChaining_thenOk() {
+ User user = new User("anna@gmail.com", "1234");
+
+ String result = Optional.ofNullable(user)
+ .flatMap(u -> u.getAddress())
+ .flatMap(a -> a.getCountry())
+ .map(c -> c.getIsocode())
+ .orElse("default");
+
+ assertEquals(result, "default");
+ }
+
+ @Test
+ public void whenChainingWithMethodReferences_thenOk() {
+ User user = new User("anna@gmail.com", "1234");
+
+ String result = Optional.ofNullable(user)
+ .flatMap(User::getAddress)
+ .flatMap(Address::getCountry)
+ .map(Country::getIsocode)
+ .orElse("default");
+
+ assertEquals(result, "default");
+ }
+}
diff --git a/libraries/pom.xml b/libraries/pom.xml
index 6d1098246e..9bbc0c41d2 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -498,6 +498,22 @@
gt-swing
${geotools.version}
+
+ com.darwinsys
+ hirondelle-date4j
+ RELEASE
+ test
+
+
+ joda-time
+ joda-time
+ ${joda-time.version}
+
+
+ com.darwinsys
+ hirondelle-date4j
+ ${hirondelle-date4j.version}
+
@@ -522,7 +538,7 @@
0.7.0
3.2.4
- 3.5
+ 3.6
1.1
1.9.3
1.2
@@ -564,5 +580,7 @@
0.6.5
0.9.0
15.2
+ 2.9.9
+ 1.5.1
-
\ No newline at end of file
+
diff --git a/libraries/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java b/libraries/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java
new file mode 100644
index 0000000000..c64f7e7511
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java
@@ -0,0 +1,60 @@
+package com.baeldung.commons.lang3;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+public class BuilderMethods {
+
+ private final int intValue;
+ private final String strSample;
+
+ public BuilderMethods(final int newId, final String newName) {
+ this.intValue = newId;
+ this.strSample = newName;
+ }
+
+ public int getId() {
+ return this.intValue;
+ }
+
+ public String getName() {
+ return this.strSample;
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder().append(this.intValue)
+ .append(this.strSample)
+ .toHashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof BuilderMethods == false) {
+ return false;
+ }
+ if (this == obj) {
+ return true;
+ }
+ final BuilderMethods otherObject = (BuilderMethods) obj;
+
+ return new EqualsBuilder().append(this.intValue, otherObject.intValue)
+ .append(this.strSample, otherObject.strSample)
+ .isEquals();
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this).append("INTVALUE", this.intValue)
+ .append("STRINGVALUE", this.strSample)
+ .toString();
+ }
+
+ public static void main(final String[] arguments) {
+ final BuilderMethods simple1 = new BuilderMethods(1, "The First One");
+ System.out.println(simple1.getName());
+ System.out.println(simple1.hashCode());
+ System.out.println(simple1.toString());
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/Lang3UtilsTest.java b/libraries/src/test/java/com/baeldung/commons/lang3/Lang3UtilsTest.java
new file mode 100644
index 0000000000..2e74ad3c24
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/commons/lang3/Lang3UtilsTest.java
@@ -0,0 +1,118 @@
+package com.baeldung.commons.lang3;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.lang.reflect.Field;
+import java.util.Locale;
+import java.util.concurrent.Future;
+
+import org.apache.commons.lang3.ArchUtils;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.SystemUtils;
+import org.apache.commons.lang3.arch.Processor;
+import org.apache.commons.lang3.concurrent.ConcurrentRuntimeException;
+import org.apache.commons.lang3.concurrent.ConcurrentUtils;
+import org.apache.commons.lang3.event.EventUtils;
+import org.apache.commons.lang3.reflect.FieldUtils;
+import org.apache.commons.lang3.time.FastDateFormat;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class Lang3UtilsTest {
+
+ @Test
+ public void test_to_Boolean_fromString() {
+ assertFalse(BooleanUtils.toBoolean("off"));
+ assertTrue(BooleanUtils.toBoolean("true"));
+ assertTrue(BooleanUtils.toBoolean("tRue"));
+ assertFalse(BooleanUtils.toBoolean("no"));
+ assertFalse(BooleanUtils.isTrue(Boolean.FALSE));
+ assertFalse(BooleanUtils.isTrue(null));
+ }
+
+ @Test
+ public void testGetUserHome() {
+ final File dir = SystemUtils.getUserHome();
+ Assert.assertNotNull(dir);
+ Assert.assertTrue(dir.exists());
+ }
+
+ @Test
+ public void testGetJavaHome() {
+ final File dir = SystemUtils.getJavaHome();
+ Assert.assertNotNull(dir);
+ Assert.assertTrue(dir.exists());
+ }
+
+ @Test
+ public void testProcessorArchType() {
+ Processor processor = ArchUtils.getProcessor("x86");
+ assertTrue(processor.is32Bit());
+ assertFalse(processor.is64Bit());
+ }
+
+ @Test
+ public void testProcessorArchType64Bit() {
+ Processor processor = ArchUtils.getProcessor("x86_64");
+ assertFalse(processor.is32Bit());
+ assertTrue(processor.is64Bit());
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testConcurrentRuntimeExceptionCauseError() {
+ new ConcurrentRuntimeException("An error", new Error());
+ }
+
+ @Test
+ public void testConstantFuture_Integer() throws Exception {
+ Future test = ConcurrentUtils.constantFuture(5);
+ assertTrue(test.isDone());
+ assertSame(5, test.get());
+ assertFalse(test.isCancelled());
+ }
+
+ @Test
+ public void testFieldUtilsGetAllFields() {
+ final Field[] fieldsNumber = Number.class.getDeclaredFields();
+ assertArrayEquals(fieldsNumber, FieldUtils.getAllFields(Number.class));
+ }
+
+ @Test
+ public void test_getInstance_String_Locale() {
+ final FastDateFormat format1 = FastDateFormat.getInstance("MM/DD/yyyy", Locale.US);
+ final FastDateFormat format3 = FastDateFormat.getInstance("MM/DD/yyyy", Locale.GERMANY);
+
+ assertNotSame(format1, format3);
+ }
+
+ @Test
+ public void testAddEventListenerThrowsException() {
+ final ExceptionEventSource src = new ExceptionEventSource();
+ try {
+ EventUtils.addEventListener(src, PropertyChangeListener.class, new PropertyChangeListener() {
+ @Override
+ public void propertyChange(final PropertyChangeEvent e) {
+ // Do nothing!
+ }
+ });
+ fail("Add method should have thrown an exception, so method should fail.");
+ } catch (final RuntimeException e) {
+
+ }
+ }
+
+ public static class ExceptionEventSource {
+ public void addPropertyChangeListener(final PropertyChangeListener listener) {
+ throw new RuntimeException();
+ }
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/DateDiffUnitTest.java b/libraries/src/test/java/com/baeldung/date/DateDiffUnitTest.java
similarity index 98%
rename from core-java/src/test/java/com/baeldung/DateDiffUnitTest.java
rename to libraries/src/test/java/com/baeldung/date/DateDiffUnitTest.java
index 324a0d4587..6046781619 100644
--- a/core-java/src/test/java/com/baeldung/DateDiffUnitTest.java
+++ b/libraries/src/test/java/com/baeldung/date/DateDiffUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung;
+package com.baeldung.date;
import org.junit.Test;
diff --git a/libraries/src/test/java/com/baeldung/java/io/JavaDirectoryDeleteUnitTest.java b/libraries/src/test/java/com/baeldung/java/io/JavaDirectoryDeleteUnitTest.java
new file mode 100644
index 0000000000..0820a2b2bd
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/java/io/JavaDirectoryDeleteUnitTest.java
@@ -0,0 +1,145 @@
+package com.baeldung.java.io;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+
+import org.apache.commons.io.FileUtils;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.springframework.util.FileSystemUtils;
+
+public class JavaDirectoryDeleteUnitTest {
+ private static Path TEMP_DIRECTORY;
+ private static final String DIRECTORY_NAME = "toBeDeleted";
+
+ public static final List ALL_LINES = Arrays.asList(new String[] { "This is line 1", "This is line 2", "This is line 3", "This is line 4", "This is line 5", "This is line 6" });
+
+ @BeforeClass
+ public static void initializeTempDirectory() throws IOException {
+ TEMP_DIRECTORY = Files.createTempDirectory("tmpForJUnit");
+ }
+
+ @AfterClass
+ public static void cleanTempDirectory() throws IOException {
+ FileUtils.deleteDirectory(TEMP_DIRECTORY.toFile());
+ }
+
+ @Before
+ public void setupDirectory() throws IOException {
+ Path tempPathForEachTest = Files.createDirectory(TEMP_DIRECTORY.resolve(DIRECTORY_NAME));
+
+ // Create a directory structure
+ Files.write(tempPathForEachTest.resolve("file1.txt"), ALL_LINES.subList(0, 2));
+ Files.write(tempPathForEachTest.resolve("file2.txt"), ALL_LINES.subList(2, 4));
+
+ Files.createDirectories(tempPathForEachTest.resolve("Empty"));
+
+ Path aSubDir = Files.createDirectories(tempPathForEachTest.resolve("notEmpty"));
+ Files.write(aSubDir.resolve("file3.txt"), ALL_LINES.subList(3, 5));
+ Files.write(aSubDir.resolve("file4.txt"), ALL_LINES.subList(0, 3));
+
+ aSubDir = Files.createDirectories(aSubDir.resolve("anotherSubDirectory"));
+ Files.write(aSubDir.resolve("file5.txt"), ALL_LINES.subList(4, 5));
+ Files.write(aSubDir.resolve("file6.txt"), ALL_LINES.subList(0, 2));
+ }
+
+ @After
+ public void checkAndCleanupIfRequired() throws IOException {
+ Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
+ if (Files.exists(pathToBeDeleted)) {
+ FileUtils.deleteDirectory(pathToBeDeleted.toFile());
+ }
+ }
+
+ boolean deleteDirectory(File directoryToBeDeleted) {
+ File[] allContents = directoryToBeDeleted.listFiles();
+
+ if (allContents != null) {
+ for (File file : allContents) {
+ if (file.isDirectory()) {
+ deleteDirectory(file);
+ } else {
+ file.delete();
+ }
+ }
+ }
+
+ return directoryToBeDeleted.delete();
+ }
+
+ @Test
+ public void givenDirectory_whenDeletedWithRecursion_thenIsGone() throws IOException {
+ Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
+
+ boolean result = deleteDirectory(pathToBeDeleted.toFile());
+
+ assertTrue("Could not delete directory", result);
+ assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
+ }
+
+ @Test
+ public void givenDirectory_whenDeletedWithCommonsIOFileUtils_thenIsGone() throws IOException {
+ Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
+
+ FileUtils.deleteDirectory(pathToBeDeleted.toFile());
+
+ assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
+ }
+
+ @Test
+ public void givenDirectory_whenDeletedWithSpringFileSystemUtils_thenIsGone() throws IOException {
+ Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
+
+ boolean result = FileSystemUtils.deleteRecursively(pathToBeDeleted.toFile());
+
+ assertTrue("Could not delete directory", result);
+ assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
+ }
+
+ @Test
+ public void givenDirectory_whenDeletedWithFilesWalk_thenIsGone() throws IOException {
+ Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
+
+ Files.walk(pathToBeDeleted)
+ .sorted(Comparator.reverseOrder())
+ .map(Path::toFile)
+ .forEach(File::delete);
+
+ assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
+ }
+
+ @Test
+ public void givenDirectory_whenDeletedWithNIO2WalkFileTree_thenIsGone() throws IOException {
+ Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME);
+
+ Files.walkFileTree(pathToBeDeleted, new SimpleFileVisitor() {
+ @Override
+ public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+ Files.delete(dir);
+ return FileVisitResult.CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+ Files.delete(file);
+ return FileVisitResult.CONTINUE;
+ }
+ });
+
+ assertFalse("Directory still exists", Files.exists(pathToBeDeleted));
+ }
+}
diff --git a/pom.xml b/pom.xml
index da38d65df3..3ebd8f5b5d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -43,6 +43,7 @@
cdi
core-java
+ core-java-8
core-java-concurrency
couchbase-sdk
@@ -240,6 +241,7 @@
spring-boot-property-exp
mockserver
undertow
+ vertx-and-rxjava
diff --git a/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/mvc/ApplicationWebConfig.kt b/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/mvc/ApplicationWebConfig.kt
index ec1c4e9511..23aadf282a 100644
--- a/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/mvc/ApplicationWebConfig.kt
+++ b/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/mvc/ApplicationWebConfig.kt
@@ -12,13 +12,9 @@ import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver
import org.thymeleaf.spring4.view.ThymeleafViewResolver
import org.thymeleaf.templatemode.TemplateMode
-
-
-
-
@EnableWebMvc
@Configuration
-open class ApplicationWebConfig: WebMvcConfigurerAdapter(), ApplicationContextAware {
+open class ApplicationWebConfig : WebMvcConfigurerAdapter(), ApplicationContextAware {
private var applicationContext: ApplicationContext? = null
@@ -34,27 +30,23 @@ open class ApplicationWebConfig: WebMvcConfigurerAdapter(), ApplicationContextAw
@Bean
open fun templateResolver(): SpringResourceTemplateResolver {
- val templateResolver = SpringResourceTemplateResolver()
- templateResolver.prefix = "/WEB-INF/view/"
- templateResolver.suffix = ".html"
- templateResolver.templateMode = TemplateMode.HTML
- templateResolver.setApplicationContext(this.applicationContext);
- return templateResolver
+ return SpringResourceTemplateResolver()
+ .apply { prefix = "/WEB-INF/view/" }
+ .apply { suffix = ".html"}
+ .apply { templateMode = TemplateMode.HTML }
+ .apply { setApplicationContext(applicationContext) }
}
@Bean
open fun templateEngine(): SpringTemplateEngine {
- val templateEngine = SpringTemplateEngine()
- templateEngine.setTemplateResolver(templateResolver())
- return templateEngine
+ return SpringTemplateEngine()
+ .apply { setTemplateResolver(templateResolver()) }
}
@Bean
open fun viewResolver(): ThymeleafViewResolver {
- val viewResolver = ThymeleafViewResolver()
- viewResolver.templateEngine = templateEngine()
- viewResolver.order = 1
- return viewResolver
+ return ThymeleafViewResolver()
+ .apply { templateEngine = templateEngine() }
+ .apply { order = 1 }
}
-
}
\ No newline at end of file
diff --git a/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/mvc/ApplicationWebInitializer.kt b/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/mvc/ApplicationWebInitializer.kt
index a4d1614271..4c1a35823c 100644
--- a/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/mvc/ApplicationWebInitializer.kt
+++ b/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/mvc/ApplicationWebInitializer.kt
@@ -1,9 +1,8 @@
package com.baeldung.kotlin.mvc
-import com.baeldung.kotlin.mvc.ApplicationWebConfig
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer
-class ApplicationWebInitializer: AbstractAnnotationConfigDispatcherServletInitializer() {
+class ApplicationWebInitializer : AbstractAnnotationConfigDispatcherServletInitializer() {
override fun getRootConfigClasses(): Array>? {
return null
diff --git a/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiApplication.java b/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiApplication.java
index c0ad5eb690..a222224c59 100644
--- a/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiApplication.java
+++ b/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiApplication.java
@@ -2,12 +2,10 @@ package org.baeldung.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.web.context.request.RequestContextListener;
-@EnableOAuth2Sso
@SpringBootApplication
public class UiApplication extends SpringBootServletInitializer {
diff --git a/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiSecurityConfig.java b/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiSecurityConfig.java
index 5dbe9ada34..f9119e20f5 100644
--- a/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiSecurityConfig.java
+++ b/spring-security-sso/spring-security-sso-ui-2/src/main/java/org/baeldung/config/UiSecurityConfig.java
@@ -1,9 +1,11 @@
package org.baeldung.config;
+import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+@EnableOAuth2Sso
@Configuration
public class UiSecurityConfig extends WebSecurityConfigurerAdapter {
diff --git a/vertx-and-rxjava/pom.xml b/vertx-and-rxjava/pom.xml
new file mode 100644
index 0000000000..9c2c9bfd48
--- /dev/null
+++ b/vertx-and-rxjava/pom.xml
@@ -0,0 +1,70 @@
+
+
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+ 4.0.0
+ vertx-and-rxjava
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+
+
+ io.vertx
+ vertx-rx-java2
+ 3.5.0.Beta1
+
+
+ io.vertx
+ vertx-core
+ 3.5.0.Beta1
+
+
+ io.vertx
+ vertx-unit
+ 3.5.0.Beta1
+ test
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.slf4j
+ slf4j-api
+ 1.7.25
+
+
+ ch.qos.logback
+ logback-classic
+ 1.2.3
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
+
\ No newline at end of file
diff --git a/vertx-and-rxjava/pom.xml.orig b/vertx-and-rxjava/pom.xml.orig
new file mode 100644
index 0000000000..47510e60f7
--- /dev/null
+++ b/vertx-and-rxjava/pom.xml.orig
@@ -0,0 +1,71 @@
+
+
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+ 4.0.0
+ com.baeldung
+ vertx-and-rxjava
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+
+
+ io.vertx
+ vertx-rx-java2
+ 3.5.0.Beta1
+
+
+ io.vertx
+ vertx-core
+ 3.5.0.Beta1
+
+
+ io.vertx
+ vertx-unit
+ 3.5.0.Beta1
+ test
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.slf4j
+ slf4j-api
+ 1.7.25
+
+
+ ch.qos.logback
+ logback-classic
+ 1.2.3
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
+
\ No newline at end of file
diff --git a/vertx-and-rxjava/src/test/java/com/baeldung/weather/CityAndDayLength.java b/vertx-and-rxjava/src/test/java/com/baeldung/weather/CityAndDayLength.java
new file mode 100644
index 0000000000..f725c8255e
--- /dev/null
+++ b/vertx-and-rxjava/src/test/java/com/baeldung/weather/CityAndDayLength.java
@@ -0,0 +1,19 @@
+package com.baeldung.weather;
+
+import java.text.MessageFormat;
+
+class CityAndDayLength {
+
+ private final String city;
+ private final double dayLengthInHours;
+
+ CityAndDayLength(String city, long dayLengthInSeconds) {
+ this.city = city;
+ this.dayLengthInHours = dayLengthInSeconds / (60.0 * 60.0);
+ }
+
+ @Override
+ public String toString() {
+ return MessageFormat.format("In {0} there are {1,number,#0.0} hours of light.", city, dayLengthInHours);
+ }
+}
diff --git a/vertx-and-rxjava/src/test/java/com/baeldung/weather/MetaWeatherClient.java b/vertx-and-rxjava/src/test/java/com/baeldung/weather/MetaWeatherClient.java
new file mode 100644
index 0000000000..0dc1f8ac95
--- /dev/null
+++ b/vertx-and-rxjava/src/test/java/com/baeldung/weather/MetaWeatherClient.java
@@ -0,0 +1,45 @@
+package com.baeldung.weather;
+
+import io.reactivex.Flowable;
+import io.vertx.core.http.RequestOptions;
+import io.vertx.reactivex.core.http.HttpClient;
+import io.vertx.reactivex.core.http.HttpClientRequest;
+import io.vertx.reactivex.core.http.HttpClientResponse;
+
+import static java.lang.String.format;
+
+class MetaWeatherClient {
+
+ private static RequestOptions metawether = new RequestOptions()
+ .setHost("www.metaweather.com")
+ .setPort(443)
+ .setSsl(true);
+
+ /**
+ * @return A flowable backed by vertx that automatically sends an HTTP request at soon as the first subscription is received.
+ */
+ private static Flowable autoPerformingReq(HttpClient httpClient, String uri) {
+ HttpClientRequest req = httpClient.get(new RequestOptions(metawether).setURI(uri));
+ return req.toFlowable()
+ .doOnSubscribe(subscription -> req.end());
+ }
+
+ static Flowable searchByCityName(HttpClient httpClient, String cityName) {
+ HttpClientRequest req = httpClient.get(
+ new RequestOptions()
+ .setHost("www.metaweather.com")
+ .setPort(443)
+ .setSsl(true)
+ .setURI(format("/api/location/search/?query=%s", cityName)));
+ return req
+ .toFlowable()
+ .doOnSubscribe(subscription -> req.end());
+ }
+
+ static Flowable getDataByPlaceId(HttpClient httpClient, long placeId) {
+ return autoPerformingReq(
+ httpClient,
+ format("/api/location/%s/", placeId));
+ }
+
+}
diff --git a/vertx-and-rxjava/src/test/java/com/baeldung/weather/VertxWithRxJavaTest.java b/vertx-and-rxjava/src/test/java/com/baeldung/weather/VertxWithRxJavaTest.java
new file mode 100644
index 0000000000..ee5a24c13f
--- /dev/null
+++ b/vertx-and-rxjava/src/test/java/com/baeldung/weather/VertxWithRxJavaTest.java
@@ -0,0 +1,92 @@
+package com.baeldung.weather;
+
+import io.reactivex.Flowable;
+import io.reactivex.functions.Function;
+import io.vertx.core.json.JsonObject;
+import io.vertx.reactivex.core.Vertx;
+import io.vertx.reactivex.core.buffer.Buffer;
+import io.vertx.reactivex.core.file.FileSystem;
+import io.vertx.reactivex.core.http.HttpClient;
+import io.vertx.reactivex.core.http.HttpClientResponse;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.reactivestreams.Publisher;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.time.ZonedDateTime;
+
+import static com.baeldung.weather.MetaWeatherClient.getDataByPlaceId;
+import static com.baeldung.weather.MetaWeatherClient.searchByCityName;
+
+public class VertxWithRxJavaTest {
+
+ private Vertx vertx;
+ private HttpClient httpClient;
+ private FileSystem fileSystem;
+ private static Logger log = LoggerFactory.getLogger(VertxWithRxJavaTest.class);
+
+ @Before
+ public void setUp() {
+ vertx = io.vertx.reactivex.core.Vertx.vertx();
+ httpClient = vertx.createHttpClient();
+ fileSystem = vertx.fileSystem();
+ }
+
+ @After
+ public void tearDown() {
+ vertx.close();
+ }
+
+ @Test
+ public void shouldDisplayLightLenghts() throws InterruptedException {
+
+ // read the file that contains one city name per line
+ fileSystem
+ .rxReadFile("cities.txt").toFlowable()
+ .doOnNext(buffer -> log.info("File buffer ---\n{}\n---", buffer))
+ .flatMap(buffer -> Flowable.fromArray(buffer.toString().split("\\r?\\n")))
+ .doOnNext(city -> log.info("City from file: '{}'", city))
+ .filter(city -> !city.startsWith("#"))
+ .doOnNext(city -> log.info("City that survived filtering: '{}'", city))
+ .flatMap(city -> searchByCityName(httpClient, city))
+ .flatMap(HttpClientResponse::toFlowable)
+ .doOnNext(buffer -> log.info("JSON of city detail: '{}'", buffer))
+ .map(extractingWoeid())
+ .flatMap(cityId -> getDataByPlaceId(httpClient, cityId))
+ .flatMap(toBufferFlowable())
+ .doOnNext(buffer -> log.info("JSON of place detail: '{}'", buffer))
+ .map(Buffer::toJsonObject)
+ .map(toCityAndDayLength())
+ .subscribe(System.out::println, Throwable::printStackTrace);
+
+ Thread.sleep(20000); // enough to give time to complete the execution
+ }
+
+ private static Function> toBufferFlowable() {
+ return response -> response
+ .toObservable()
+ .reduce(
+ Buffer.buffer(),
+ Buffer::appendBuffer).toFlowable();
+ }
+
+ private static Function extractingWoeid() {
+ return cityBuffer -> cityBuffer
+ .toJsonArray()
+ .getJsonObject(0)
+ .getLong("woeid");
+ }
+
+ private static Function toCityAndDayLength() {
+ return json -> {
+ ZonedDateTime sunRise = ZonedDateTime.parse(json.getString("sun_rise"));
+ ZonedDateTime sunSet = ZonedDateTime.parse(json.getString("sun_set"));
+ String cityName = json.getString("title");
+ return new CityAndDayLength(
+ cityName, sunSet.toEpochSecond() - sunRise.toEpochSecond());
+ };
+ }
+
+}
diff --git a/vertx-and-rxjava/src/test/resources/cities.txt b/vertx-and-rxjava/src/test/resources/cities.txt
new file mode 100644
index 0000000000..dbe6e96758
--- /dev/null
+++ b/vertx-and-rxjava/src/test/resources/cities.txt
@@ -0,0 +1,6 @@
+Milan
+Chicago
+Cairo
+Santiago
+Moscow
+Auckland
\ No newline at end of file
diff --git a/vertx-and-rxjava/src/test/resources/logback-test.xml b/vertx-and-rxjava/src/test/resources/logback-test.xml
new file mode 100644
index 0000000000..71e05a4e24
--- /dev/null
+++ b/vertx-and-rxjava/src/test/resources/logback-test.xml
@@ -0,0 +1,12 @@
+
+
+
+ [%thread{32}] %-5level %msg - %logger%n
+
+
+
+
+
+
+
+
\ No newline at end of file